diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2023-10-03 10:45:39 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2023-10-03 10:59:15 +0200 |
commit | 6dd514f633211b3cd6a6096b687c4e51a331ee4b (patch) | |
tree | b4e47f67c229af6708052d4a9d839bc43b21b0e0 /vcl | |
parent | d95f58a1ebf2ff7fb163cd423df16b4a6167a8fa (diff) |
Try to use doubles in a saner way
This avoids convertion to integers too early, so makes the calculations
more consistent (no more "use a truncated double later in a calculation
involving doubles").
Also it moves variables into proper scopes.
Change-Id: Idc11c30c2c6892db092a04a127eb31266b4b70e7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157510
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/bitmap/BitmapEmbossGreyFilter.cxx | 62 |
1 files changed, 28 insertions, 34 deletions
diff --git a/vcl/source/bitmap/BitmapEmbossGreyFilter.cxx b/vcl/source/bitmap/BitmapEmbossGreyFilter.cxx index c1e96c11709a..06406152d6d6 100644 --- a/vcl/source/bitmap/BitmapEmbossGreyFilter.cxx +++ b/vcl/source/bitmap/BitmapEmbossGreyFilter.cxx @@ -39,25 +39,21 @@ BitmapEx BitmapEmbossGreyFilter::execute(BitmapEx const& rBitmapEx) const BitmapColor aGrey(sal_uInt8(0)); const sal_Int32 nWidth = pWriteAcc->Width(); const sal_Int32 nHeight = pWriteAcc->Height(); - sal_Int32 nGrey11, nGrey12, nGrey13; - sal_Int32 nGrey21, nGrey22, nGrey23; - sal_Int32 nGrey31, nGrey32, nGrey33; - double fAzim = basegfx::deg2rad<100>(mnAzimuthAngle100); - double fElev = basegfx::deg2rad<100>(mnElevationAngle100); - std::unique_ptr<sal_Int32[]> pHMap(new sal_Int32[nWidth + 2]); - std::unique_ptr<sal_Int32[]> pVMap(new sal_Int32[nHeight + 2]); - sal_Int32 nX, nY, nNx, nNy, nDotL; - const sal_Int32 nLx = FRound(cos(fAzim) * cos(fElev) * 255.0); - const sal_Int32 nLy = FRound(sin(fAzim) * cos(fElev) * 255.0); - const sal_Int32 nLz = FRound(sin(fElev) * 255.0); - const auto nZ2 = (6 * 255) / 4; - const sal_Int32 nNzLz = ((6 * 255) / 4) * nLz; - const sal_uInt8 cLz = static_cast<sal_uInt8>(std::clamp(nLz, sal_Int32(0), sal_Int32(255))); + const double fAzim = basegfx::deg2rad<100>(mnAzimuthAngle100); + const double fElev = basegfx::deg2rad<100>(mnElevationAngle100); + std::vector<sal_Int32> pHMap(nWidth + 2); + std::vector<sal_Int32> pVMap(nHeight + 2); + const double nLx = cos(fAzim) * cos(fElev) * 255.0; + const double nLy = sin(fAzim) * cos(fElev) * 255.0; + const double nLz = sin(fElev) * 255.0; + const double nNz = 6 * 255.0 / 4; + const double nNzLz = nNz * nLz; + const sal_uInt8 cLz = FRound(std::clamp(nLz, 0.0, 255.0)); // fill mapping tables pHMap[0] = 0; - for (nX = 1; nX <= nWidth; nX++) + for (sal_Int32 nX = 1; nX <= nWidth; nX++) { pHMap[nX] = nX - 1; } @@ -66,43 +62,43 @@ BitmapEx BitmapEmbossGreyFilter::execute(BitmapEx const& rBitmapEx) const pVMap[0] = 0; - for (nY = 1; nY <= nHeight; nY++) + for (sal_Int32 nY = 1; nY <= nHeight; nY++) { pVMap[nY] = nY - 1; } pVMap[nHeight + 1] = nHeight - 1; - for (nY = 0; nY < nHeight; nY++) + for (sal_Int32 nY = 0; nY < nHeight; nY++) { - nGrey11 = pReadAcc->GetPixel(pVMap[nY], pHMap[0]).GetIndex(); - nGrey12 = pReadAcc->GetPixel(pVMap[nY], pHMap[1]).GetIndex(); - nGrey13 = pReadAcc->GetPixel(pVMap[nY], pHMap[2]).GetIndex(); - nGrey21 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[0]).GetIndex(); - nGrey22 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[1]).GetIndex(); - nGrey23 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[2]).GetIndex(); - nGrey31 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[0]).GetIndex(); - nGrey32 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[1]).GetIndex(); - nGrey33 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[2]).GetIndex(); + sal_Int32 nGrey11 = pReadAcc->GetPixel(pVMap[nY], pHMap[0]).GetIndex(); + sal_Int32 nGrey12 = pReadAcc->GetPixel(pVMap[nY], pHMap[1]).GetIndex(); + sal_Int32 nGrey13 = pReadAcc->GetPixel(pVMap[nY], pHMap[2]).GetIndex(); + sal_Int32 nGrey21 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[0]).GetIndex(); + sal_Int32 nGrey22 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[1]).GetIndex(); + sal_Int32 nGrey23 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[2]).GetIndex(); + sal_Int32 nGrey31 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[0]).GetIndex(); + sal_Int32 nGrey32 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[1]).GetIndex(); + sal_Int32 nGrey33 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[2]).GetIndex(); Scanline pScanline = pWriteAcc->GetScanline(nY); - for (nX = 0; nX < nWidth; nX++) + for (sal_Int32 nX = 0; nX < nWidth; nX++) { - nNx = nGrey11 + nGrey21 + nGrey31 - nGrey13 - nGrey23 - nGrey33; - nNy = nGrey31 + nGrey32 + nGrey33 - nGrey11 - nGrey12 - nGrey13; + const sal_Int32 nNx = nGrey11 + nGrey21 + nGrey31 - nGrey13 - nGrey23 - nGrey33; + const sal_Int32 nNy = nGrey31 + nGrey32 + nGrey33 - nGrey11 - nGrey12 - nGrey13; if (!nNx && !nNy) { aGrey.SetIndex(cLz); } - else if ((nDotL = nNx * nLx + nNy * nLy + nNzLz) < 0) + else if (double nDotL = nNx * nLx + nNy * nLy + nNzLz; nDotL < 0) { aGrey.SetIndex(0); } else { - const double fGrey = nDotL / std::hypot(nNx, nNy, nZ2); - aGrey.SetIndex(static_cast<sal_uInt8>(std::clamp(fGrey, 0.0, 255.0))); + const double fGrey = nDotL / std::hypot(nNx, nNy, nNz); + aGrey.SetIndex(FRound(std::clamp(fGrey, 0.0, 255.0))); } pWriteAcc->SetPixelOnData(pScanline, nX, aGrey); @@ -124,8 +120,6 @@ BitmapEx BitmapEmbossGreyFilter::execute(BitmapEx const& rBitmapEx) const } } - pHMap.reset(); - pVMap.reset(); pWriteAcc.reset(); pReadAcc.reset(); |