40 std::shared_ptr<SalBitmap> xImpBmp(
ImplGetSVData()->mpDefInst->CreateSalBitmap());
41 if (xImpBmp->Create(*
mxSalBmp) && xImpBmp->Erase(rFillColor))
54 pWriteAcc->Erase(rFillColor);
68 if (pAcc->HasPalette())
78 pAcc->SetPalette(aBmpPal);
87 Scanline pScanline = pAcc->GetScanline(nY);
90 BitmapColor aBmpColor = pAcc->GetPixelFromData(pScanline, nX);
92 pAcc->SetPixelOnData(pScanline, nX, aBmpColor);
109template <
int bitCount>
112 constexpr int byteCount = bitCount / 8;
114 Scanline pos2 = scanline2 + (nWidth - 1) * byteCount;
118 memcpy(tmp, pos1, byteCount);
119 memcpy(pos1, pos2, byteCount);
120 memcpy(pos2, tmp, byteCount);
145 switch (pAcc->GetBitCount())
150 mirrorScanlines<32>(pAcc->GetScanline(nY),
151 pAcc->GetScanline(nY) + 4 * nSecondHalf, nWidth_2);
155 mirrorScanlines<24>(pAcc->GetScanline(nY),
156 pAcc->GetScanline(nY) + 3 * nSecondHalf, nWidth_2);
160 mirrorScanlines<8>(pAcc->GetScanline(nY),
161 pAcc->GetScanline(nY) + nSecondHalf, nWidth_2);
166 Scanline pScanline = pAcc->GetScanline(nY);
167 for (
tools::Long nX = 0, nOther = nWidth1; nX < nWidth_2; nX++, nOther--)
169 const BitmapColor aTemp(pAcc->GetPixelFromData(pScanline, nX));
171 pAcc->SetPixelOnData(pScanline, nX,
172 pAcc->GetPixelFromData(pScanline, nOther));
173 pAcc->SetPixelOnData(pScanline, nOther, aTemp);
182 else if (bVert && !bHorz)
188 const tools::Long nScanSize = pAcc->GetScanlineSize();
189 std::unique_ptr<sal_uInt8[]> pBuffer(
new sal_uInt8[nScanSize]);
194 for (
tools::Long nY = 0, nOther = nHeight1; nY < nHeight_2; nY++, nOther--)
196 memcpy(pBuffer.get(), pAcc->GetScanline(nY), nScanSize);
197 memcpy(pAcc->GetScanline(nY), pAcc->GetScanline(nOther), nScanSize);
198 memcpy(pAcc->GetScanline(nOther), pBuffer.
get(), nScanSize);
205 else if (bHorz && bVert)
218 switch (pAcc->GetBitCount())
221 for (
tools::Long nY = 0, nOtherY = nHeight - 1; nY < nHeight_2; nY++, nOtherY--)
222 mirrorScanlines<32>(pAcc->GetScanline(nY), pAcc->GetScanline(nOtherY),
225 mirrorScanlines<32>(pAcc->GetScanline(nHeight_2),
226 pAcc->GetScanline(nHeight_2) + 4 * nSecondHalf,
230 for (
tools::Long nY = 0, nOtherY = nHeight - 1; nY < nHeight_2; nY++, nOtherY--)
231 mirrorScanlines<24>(pAcc->GetScanline(nY), pAcc->GetScanline(nOtherY),
234 mirrorScanlines<24>(pAcc->GetScanline(nHeight_2),
235 pAcc->GetScanline(nHeight_2) + 3 * nSecondHalf,
239 for (
tools::Long nY = 0, nOtherY = nHeight - 1; nY < nHeight_2; nY++, nOtherY--)
240 mirrorScanlines<8>(pAcc->GetScanline(nY), pAcc->GetScanline(nOtherY),
243 mirrorScanlines<8>(pAcc->GetScanline(nHeight_2),
244 pAcc->GetScanline(nHeight_2) + nSecondHalf, nWidth_2);
247 for (
tools::Long nY = 0, nOtherY = nHeight - 1; nY < nHeight_2; nY++, nOtherY--)
249 Scanline pScanline = pAcc->GetScanline(nY);
250 Scanline pScanlineOther = pAcc->GetScanline(nOtherY);
251 for (
tools::Long nX = 0, nOtherX = nWidth1; nX < nWidth; nX++, nOtherX--)
253 const BitmapColor aTemp(pAcc->GetPixelFromData(pScanline, nX));
255 pAcc->SetPixelOnData(pScanline, nX,
256 pAcc->GetPixelFromData(pScanlineOther, nOtherX));
257 pAcc->SetPixelOnData(pScanlineOther, nOtherX, aTemp);
264 Scanline pScanline = pAcc->GetScanline(nHeight_2);
265 for (
tools::Long nX = 0, nOtherX = nWidth1; nX < nWidth_2; nX++, nOtherX--)
267 const BitmapColor aTemp(pAcc->GetPixelFromData(pScanline, nX));
268 pAcc->SetPixelOnData(pScanline, nX,
269 pAcc->GetPixelFromData(pScanline, nOtherX));
270 pAcc->SetPixelOnData(pScanline, nOtherX, aTemp);
287 nAngle10 %= 3600_deg10;
288 nAngle10 = (nAngle10 < 0_deg10) ? (
Degree10(3599) + nAngle10) : nAngle10;
292 if (nAngle10 == 1800_deg10)
303 if (nAngle10 == 900_deg10 || nAngle10 == 2700_deg10)
318 if (nAngle10 == 900_deg10)
320 for (
tools::Long nY = 0, nOtherX = nWidth1; nY < nNewHeight; nY++, nOtherX--)
322 Scanline pScanline = pWriteAcc->GetScanline(nY);
323 for (
tools::Long nX = 0, nOtherY = 0; nX < nNewWidth; nX++)
325 pWriteAcc->SetPixelOnData(pScanline, nX,
326 pReadAcc->
GetPixel(nOtherY++, nOtherX));
330 else if (nAngle10 == 2700_deg10)
332 for (
tools::Long nY = 0, nOtherX = 0; nY < nNewHeight; nY++, nOtherX++)
334 Scanline pScanline = pWriteAcc->GetScanline(nY);
335 for (
tools::Long nX = 0, nOtherY = nHeight1; nX < nNewWidth; nX++)
337 pWriteAcc->SetPixelOnData(pScanline, nX,
338 pReadAcc->
GetPixel(nOtherY--, nOtherX));
346 aRotatedBmp = aNewBmp;
353 aPoly.
Rotate(aTmpPoint, nAngle10);
362 const BitmapColor aFillColor(pWriteAcc->GetBestMatchingColor(rFillColor));
363 const double fCosAngle = cos(
toRadians(nAngle10));
364 const double fSinAngle = sin(
toRadians(nAngle10));
365 const double fXMin = aNewBound.
Left();
366 const double fYMin = aNewBound.
Top();
367 const sal_Int32 nWidth = aSizePix.
Width();
368 const sal_Int32 nHeight = aSizePix.
Height();
369 const sal_Int32 nNewWidth = aNewSizePix.
Width();
370 const sal_Int32 nNewHeight = aNewSizePix.
Height();
373 std::unique_ptr<sal_Int32[]> pCosSinX(
new sal_Int32[nNewWidth * 2]);
374 std::unique_ptr<sal_Int32[]> pCosSinY(
new sal_Int32[nNewHeight * 2]);
376 for (sal_Int32 nIdx = 0, nX = 0; nX < nNewWidth; nX++)
378 const double fTmp = (fXMin + nX) * 64;
380 pCosSinX[nIdx++] = std::round(fCosAngle * fTmp);
381 pCosSinX[nIdx++] = std::round(fSinAngle * fTmp);
384 for (sal_Int32 nIdx = 0, nY = 0; nY < nNewHeight; nY++)
386 const double fTmp = (fYMin + nY) * 64;
388 pCosSinY[nIdx++] = std::round(fCosAngle * fTmp);
389 pCosSinY[nIdx++] = std::round(fSinAngle * fTmp);
392 for (sal_Int32 nCosSinYIdx = 0, nY = 0; nY < nNewHeight; nY++)
394 sal_Int32 nCosY = pCosSinY[nCosSinYIdx++];
395 sal_Int32 nSinY = pCosSinY[nCosSinYIdx++];
396 Scanline pScanline = pWriteAcc->GetScanline(nY);
398 for (sal_Int32 nCosSinXIdx = 0, nX = 0; nX < nNewWidth; nX++)
400 sal_Int32 nRotX = (pCosSinX[nCosSinXIdx++] - nSinY) >> 6;
401 sal_Int32 nRotY = (pCosSinX[nCosSinXIdx++] + nCosY) >> 6;
403 if ((nRotX > -1) && (nRotX < nWidth) && (nRotY > -1) && (nRotY < nHeight))
405 pWriteAcc->SetPixelOnData(pScanline, nX,
410 pWriteAcc->SetPixelOnData(pScanline, nX, aFillColor);
418 aRotatedBmp = aNewBmp;
471 Scanline pDst = pWriteAcc->GetScanline(nY);
473 const tools::Long nScanlineSize = pWriteAcc->GetScanlineSize();
475 pDst[nX] = ~pSrc[nX];
486 Scanline pDst = pWriteAcc->GetScanline(nY);
489 if (cTest == pSrc[nX])
501 Scanline pScanline = pWriteAcc->GetScanline(nY);
506 pWriteAcc->SetPixelOnData(pScanline, nX, aWhite);
508 pWriteAcc->SetPixelOnData(pScanline, nX, aBlack);
549 const tools::Long nMinR = MinMax<tools::Long>(rTransColor.
GetRed() - nTol, 0, 255);
550 const tools::Long nMaxR = MinMax<tools::Long>(rTransColor.
GetRed() + nTol, 0, 255);
560 Scanline pScanline = pWriteAcc->GetScanline(nY);
569 if (nMinR <= nR && nMaxR >= nR && nMinG <= nG && nMaxG >= nG && nMinB <= nB
572 pWriteAcc->SetPixelOnData(pScanline, nX, aWhite);
576 pWriteAcc->SetPixelOnData(pScanline, nX, aBlack);
585 Scanline pScanline = pWriteAcc->GetScanline(nY);
594 if (nMinR <= nR && nMaxR >= nR && nMinG <= nG && nMaxG >= nG && nMinB <= nB
597 pWriteAcc->SetPixelOnData(pScanline, nX, aWhite);
601 pWriteAcc->SetPixelOnData(pScanline, nX, aBlack);
634 std::vector<tools::Long> aLine;
638 for (; nY <= nBottom; nY++)
640 std::vector<tools::Long> aNewLine;
644 for (; nX <= nRight;)
646 while ((nX <= nRight) && (aMatch != pReadAcc->
GetPixelFromData(pScanlineRead, nX)))
651 aNewLine.push_back(nX);
653 while ((nX <= nRight) && (aMatch == pReadAcc->
GetPixelFromData(pScanlineRead, nX)))
658 aNewLine.push_back(nX - 1);
662 if (aNewLine != aLine)
673 for (
size_t a(0);
a < aLine.size();)
677 aRegion.
Union(aSubRect);
696 for (
size_t a(0);
a < aLine.size();)
700 aRegion.
Union(aSubRect);
714 if (!pMaskAcc || !pAcc)
722 if (pAcc->HasPalette())
724 const sal_uInt16 nActColors = pAcc->GetPaletteEntryCount();
725 const sal_uInt16 nMaxColors = 1 << pAcc->GetBitCount();
728 aReplace = pAcc->GetBestMatchingColor(rReplaceColor);
735 if (nActColors < nMaxColors)
737 pAcc->SetPaletteEntryCount(nActColors + 1);
738 pAcc->SetPaletteColor(nActColors, rReplaceColor);
743 std::unique_ptr<bool[]> pFlags(
new bool[nMaxColors]);
746 std::fill(pFlags.get(), pFlags.get() + nMaxColors,
false);
750 Scanline pScanline = pAcc->GetScanline(nY);
752 pFlags[pAcc->GetIndexFromData(pScanline, nX)] =
true;
755 for (sal_uInt16
i = 0;
i < nMaxColors;
i++)
760 pAcc->SetPaletteColor(
i, rReplaceColor);
768 aReplace = rReplaceColor;
772 Scanline pScanline = pAcc->GetScanline(nY);
777 pAcc->SetPixelOnData(pScanline, nX, aReplace);
791 if (!pAcc || !pAlphaAcc || !pNewAcc)
800 Scanline pScanline = pNewAcc->GetScanline(nY);
801 Scanline pScanlineAlpha = pAlphaAcc->GetScanline(nY);
805 aCol.
Merge(rMergeColor, 255 - pAlphaAcc->GetIndexFromData(pScanlineAlpha, nX));
806 pNewAcc->SetPixelOnData(pScanline, nX, aCol);
830 std::shared_ptr<SalBitmap> xImpBmp(
ImplGetSVData()->mpDefInst->CreateSalBitmap());
831 if (xImpBmp->Create(*
mxSalBmp) && xImpBmp->Replace(rSearchColor, rReplaceColor, nTol))
845 const tools::Long nMinR = MinMax<tools::Long>(rSearchColor.
GetRed() - nTol, 0, 255);
846 const tools::Long nMaxR = MinMax<tools::Long>(rSearchColor.
GetRed() + nTol, 0, 255);
852 if (pAcc->HasPalette())
854 for (sal_uInt16
i = 0, nPalCount = pAcc->GetPaletteEntryCount();
i < nPalCount;
i++)
862 pAcc->SetPaletteColor(
i, rReplaceColor);
869 const BitmapColor aReplace(pAcc->GetBestMatchingColor(rReplaceColor));
871 for (
tools::Long nY = 0, nHeight = pAcc->Height(); nY < nHeight; nY++)
873 Scanline pScanline = pAcc->GetScanline(nY);
874 for (
tools::Long nX = 0, nWidth = pAcc->Width(); nX < nWidth; nX++)
876 aCol = pAcc->GetPixelFromData(pScanline, nX);
882 pAcc->SetPixelOnData(pScanline, nX, aReplace);
903 std::vector<sal_uInt8> aMinR(nColorCount);
904 std::vector<sal_uInt8> aMaxR(nColorCount);
905 std::vector<sal_uInt8> aMinG(nColorCount);
906 std::vector<sal_uInt8> aMaxG(nColorCount);
907 std::vector<sal_uInt8> aMinB(nColorCount);
908 std::vector<sal_uInt8> aMaxB(nColorCount);
912 for (
size_t i = 0;
i < nColorCount; ++
i)
914 const Color& rCol = pSearchColors[
i];
917 aMinR[
i] = std::clamp(rCol.
GetRed() - nTol, 0, 255);
918 aMaxR[
i] = std::clamp(rCol.
GetRed() + nTol, 0, 255);
919 aMinG[
i] = std::clamp(rCol.
GetGreen() - nTol, 0, 255);
920 aMaxG[
i] = std::clamp(rCol.
GetGreen() + nTol, 0, 255);
921 aMinB[
i] = std::clamp(rCol.
GetBlue() - nTol, 0, 255);
922 aMaxB[
i] = std::clamp(rCol.
GetBlue() + nTol, 0, 255);
927 for (
size_t i = 0;
i < nColorCount; ++
i)
929 const Color& rCol = pSearchColors[
i];
940 if (pAcc->HasPalette())
942 for (sal_uInt16 nEntry = 0, nPalCount = pAcc->GetPaletteEntryCount();
943 nEntry < nPalCount; nEntry++)
945 const BitmapColor& rCol = pAcc->GetPaletteColor(nEntry);
947 for (
size_t i = 0;
i < nColorCount; ++
i)
953 pAcc->SetPaletteColor(nEntry, pReplaceColors[
i]);
961 std::vector<BitmapColor> aReplaces(nColorCount);
963 for (
size_t i = 0;
i < nColorCount; ++
i)
964 aReplaces[
i] = pAcc->GetBestMatchingColor(pReplaceColors[
i]);
966 for (
tools::Long nY = 0, nHeight = pAcc->Height(); nY < nHeight; nY++)
968 Scanline pScanline = pAcc->GetScanline(nY);
969 for (
tools::Long nX = 0, nWidth = pAcc->Width(); nX < nWidth; nX++)
971 BitmapColor aCol = pAcc->GetPixelFromData(pScanline, nX);
973 for (
size_t i = 0;
i < nColorCount; ++
i)
979 pAcc->SetPixelOnData(pScanline, nX, aReplaces[
i]);
999 if (!pMaskAcc || !pAcc)
1006 const BitmapColor aBlack(pAcc->GetBestMatchingColor(aColBlack));
1011 Scanline pScanline = pAcc->GetScanline(nY);
1016 || pAcc->GetPixelFromData(pScanline, nX) != aBlack)
1018 pAcc->SetPixelOnData(pScanline, nX, aWhite);
1022 pAcc->SetPixelOnData(pScanline, nX, aBlack);
1043 if (!pAlphaAcc || !pAcc)
1046 const tools::Long nWidth = std::min(pAlphaAcc->Width(), pAcc->Width());
1047 const tools::Long nHeight = std::min(pAlphaAcc->Height(), pAcc->Height());
1051 Scanline pScanline = pAcc->GetScanline(nY);
1052 Scanline pScanlineAlpha = pAlphaAcc->GetScanline(nY);
1055 BitmapColor aBmpColor = pAcc->GetPixelFromData(pScanline, nX);
1056 aBmpColor.
Merge(rBackgroundColor,
1057 255 - pAlphaAcc->GetIndexFromData(pScanlineAlpha, nX));
1058 pAcc->SetPixelOnData(pScanline, nX, aBmpColor);
sal_uInt8 GetIndex() const
tools::Long Height() const
tools::Long Width() const
const BitmapPalette & GetPalette() const
BitmapColor GetBestMatchingColor(const BitmapColor &rBitmapColor) const
ScanlineFormat GetScanlineFormat() const
const BitmapColor & GetPaletteColor(sal_uInt16 nColor) const
sal_uInt32 GetScanlineSize() const
sal_uInt16 GetEntryCount() const
BitmapColor GetPixel(tools::Long nY, tools::Long nX) const
BitmapColor GetColor(tools::Long nY, tools::Long nX) const
BitmapColor GetPixelFromData(const sal_uInt8 *pData, tools::Long nX) const
sal_uInt8 GetIndexFromData(const sal_uInt8 *pData, tools::Long nX) const
Scanline GetScanline(tools::Long nY) const
bool CombineOr(const Bitmap &rMask)
Perform boolean OR operation with another bitmap.
bool Blend(const AlphaMask &rAlpha, const Color &rBackgroundColor)
Alpha-blend the given bitmap against a specified uniform background color.
bool Rotate(Degree10 nAngle10, const Color &rFillColor)
Rotate bitmap by the specified angle.
SAL_DLLPRIVATE void ImplSetSalBitmap(const std::shared_ptr< SalBitmap > &xImpBmp)
Bitmap CreateMask(const Color &rTransColor) const
Create on-off mask from bitmap.
bool Convert(BmpConversion eConversion)
Convert bitmap format.
static const BitmapPalette & GetGreyPalette(int nEntries)
SAL_DLLPRIVATE void ReassignWithSize(const Bitmap &rBitmap)
ReassignWithSize and recalculate bitmap.
Size GetSizePixel() const
bool Invert()
Perform the Invert operation on every pixel.
vcl::Region CreateRegion(const Color &rColor, const tools::Rectangle &rRect) const
Create region of similar colors in a given rectangle.
bool Erase(const Color &rFillColor)
Fill the entire bitmap with the given color.
bool Replace(const Bitmap &rMask, const Color &rReplaceColor)
Replace all pixel where the given mask is on with the specified color.
vcl::PixelFormat getPixelFormat() const
std::shared_ptr< SalBitmap > mxSalBmp
bool Mirror(BmpMirrorFlags nMirrorFlags)
Mirror the bitmap.
sal_uInt8 GetBlue() const
void Merge(const Color &rMergeColor, sal_uInt8 cTransparency)
sal_uInt8 GetGreen() const
constexpr tools::Long Height() const
constexpr tools::Long Width() const
void Union(const tools::Rectangle &rRegion)
This template handles BitmapAccess the RAII way.
constexpr ::Color COL_WHITE(0xFF, 0xFF, 0xFF)
constexpr ::Color COL_BLACK(0x00, 0x00, 0x00)
constexpr bool isPalettePixelFormat(PixelFormat ePixelFormat)
Is it a pixel format that forces creation of a palette.
HashMap_OWString_Interface aMap
ImplSVData * ImplGetSVData()