25#include <com/sun/star/graphic/SvgTools.hpp>
26#include <com/sun/star/graphic/Primitive2DTools.hpp>
30#include <com/sun/star/rendering/XIntegerReadOnlyBitmap.hpp>
36#if ENABLE_CAIRO_CANVAS
67 SAL_WARN_IF(!bSuccess,
"vcl",
"vcl::bitmap::loadFromName : could not load image " << rFileName <<
" via icon theme " << aIconTheme);
75 const uno::Reference<graphic::XSvgParser> xSvgParser = graphic::SvgTools::create(xContext);
78 std::vector<sal_Int8>
aBuffer(nSize + 1);
82 uno::Sequence<sal_Int8>
aData(
aBuffer.data(), nSize + 1);
85 const Primitive2DSequence aPrimitiveSequence = xSvgParser->getDecomposition(aInputStream, sPath);
87 if (!aPrimitiveSequence.hasElements())
90 uno::Sequence<beans::PropertyValue> aViewParameters;
92 geometry::RealRectangle2D aRealRect;
94 for (css::uno::Reference<css::graphic::XPrimitive2D>
const & xReference : aPrimitiveSequence)
98 aRealRect = xReference->
getRange(aViewParameters);
103 aRealRect.X1 = aRange.
getMinX();
104 aRealRect.Y1 = aRange.
getMinY();
105 aRealRect.X2 = aRange.
getMaxX();
106 aRealRect.Y2 = aRange.
getMaxY();
108 double nDPI = 96 * fScalingFactor;
110 const css::uno::Reference<css::graphic::XPrimitive2DRenderer> xPrimitive2DRenderer = css::graphic::Primitive2DTools::create(xContext);
111 const css::uno::Reference<css::rendering::XBitmap> xBitmap(
112 xPrimitive2DRenderer->rasterize(aPrimitiveSequence, aViewParameters, nDPI, nDPI, aRealRect, 256*256));
116 const css::uno::Reference<css::rendering::XIntegerReadOnlyBitmap> xIntBmp(xBitmap, uno::UNO_QUERY_THROW);
134 bool bReversColors,
bool bReverseAlpha)
136 assert(nStride >= (nWidth *
nBitCount / 8));
157 aBmp =
Bitmap(
Size(nWidth, nHeight), ePixelFormat);
160 assert(pWrite.
get());
163 std::optional<AlphaMask> pAlphaMask;
167 pAlphaMask.emplace(
Size(nWidth, nHeight) );
175 Scanline pScanline = pWrite->GetScanline(
y);
178 int bitIndex = (
y * nStride +
x) % 8;
180 pWrite->SetPixelOnData(pScanline,
x,
BitmapColor((*
p >> bitIndex) & 1));
189 Scanline pScanline = pWrite->GetScanline(
y);
195 else if ( bReversColors )
199 pWrite->SetPixelOnData(pScanline,
x,
col);
205 Scanline pMaskScanLine = xMaskAcc->GetScanline(
y);
229 auto nBitCount = rawBitmap.GetBitCount();
241 Bitmap aBmp(rawBitmap.maSize, ePixelFormat);
244 assert(pWrite.
get());
247 std::optional<AlphaMask> pAlphaMask;
251 pAlphaMask.emplace( rawBitmap.maSize );
255 auto nHeight = rawBitmap.maSize.getHeight();
256 auto nWidth = rawBitmap.maSize.getWidth();
260 sal_uInt8 const *
p = rawBitmap.mpData.get() + (
y * nStride);
261 Scanline pScanline = pWrite->GetScanline(
y);
265 pWrite->SetPixelOnData(pScanline,
x,
col);
270 p = rawBitmap.mpData.get() + (
y * nStride) + 3;
271 Scanline pMaskScanLine = xMaskAcc->GetScanline(
y);
274 xMaskAcc->SetPixelOnData(pMaskScanLine,
x,
BitmapColor(255 - *
p));
285#if ENABLE_CAIRO_CANVAS
291 cairo_surface_t *pPixels = cairo_surface_create_similar_image(pSurface,
292 CAIRO_FORMAT_ARGB32, aSize.
Width(), aSize.
Height());
293 cairo_t *pCairo = cairo_create( pPixels );
294 if( !pPixels || !pCairo || cairo_status(pCairo) != CAIRO_STATUS_SUCCESS )
300 cairo_set_source_surface( pCairo, pSurface, 0, 0 );
301 cairo_set_operator( pCairo, CAIRO_OPERATOR_SOURCE );
302 cairo_paint( pCairo );
317 cairo_surface_flush(pPixels);
318 unsigned char *pSrc = cairo_image_surface_get_data( pPixels );
319 unsigned int nStride = cairo_image_surface_get_stride( pPixels );
320#if !ENABLE_WASM_STRIP_PREMULTIPLY
325 sal_uInt32 *pPix =
reinterpret_cast<sal_uInt32 *
>(pSrc + nStride *
y);
328#if defined OSL_BIGENDIAN
339 if( nAlpha != 0 && nAlpha != 255 )
342#if ENABLE_WASM_STRIP_PREMULTIPLY
347 nR = unpremultiply_table[nAlpha][nR];
348 nG = unpremultiply_table[nAlpha][nG];
349 nB = unpremultiply_table[nAlpha][nB];
352 pRGBWrite->SetPixel( y, x,
BitmapColor( nR, nG, nB ) );
353 pMaskWrite->SetPixelIndex( y, x, 255 - nAlpha );
361 ::BitmapEx *pBitmapEx = new ::BitmapEx( aRGB, aMask );
363 cairo_destroy( pCairo );
364 cairo_surface_destroy( pPixels );
370 const ::basegfx::B2DHomMatrix& rTransform,
391 if( pReadAccess.
get() ==
nullptr ||
392 (pAlphaReadAccess.
get() ==
nullptr && rBitmap.
IsAlpha()) )
396 "transformBitmap(): could not access source bitmap" );
416 const Size aDestBmpSize( ::basegfx::fround( rDestRect.
getWidth() ),
417 ::basegfx::fround( rDestRect.
getHeight() ) );
435 if( pWriteAccess.
get() !=
nullptr &&
436 pAlphaWriteAccess.
get() !=
nullptr &&
437 rTransform.isInvertible() )
452 Scanline pScan = pWriteAccess->GetScanline(
y );
453 Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(
y );
458 aPoint *= aTransform;
460 const int nSrcX( ::basegfx::fround( aPoint.
getX() ) );
461 const int nSrcY( ::basegfx::fround( aPoint.
getY() ) );
462 if( nSrcX < 0 || nSrcX >= aBmpSize.
Width() ||
463 nSrcY < 0 || nSrcY >= aBmpSize.
Height() )
465 pAlphaWriteAccess->SetPixelOnData( pScanAlpha,
x,
BitmapColor(255) );
470 pAlphaWriteAccess->SetPixelOnData( pScanAlpha,
x,
BitmapColor(aAlphaMap[ cAlphaIdx ]) );
471 pWriteAccess->SetPixelOnData( pScan,
x, pReadAccess->
GetPixel( nSrcY, nSrcX ) );
477 Scanline pScan = pWriteAccess->GetScanline(
y );
478 Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(
y );
482 aPoint *= aTransform;
484 const int nSrcX( ::basegfx::fround( aPoint.
getX() ) );
485 const int nSrcY( ::basegfx::fround( aPoint.
getY() ) );
486 if( nSrcX < 0 || nSrcX >= aBmpSize.
Width() ||
487 nSrcY < 0 || nSrcY >= aBmpSize.
Height() )
489 pAlphaWriteAccess->SetPixelOnData( pScanAlpha,
x,
BitmapColor(255) );
493 pAlphaWriteAccess->SetPixelOnData( pScanAlpha,
x,
BitmapColor(0) );
494 pWriteAccess->SetPixelOnData( pScan,
x, pReadAccess->
GetPixel( nSrcY,
505 "transformBitmap(): could not access bitmap" );
526 assert(pOld &&
"Got no access to old alpha mask (!)");
528 const double fFactor(1.0 / 255.0);
530 if(bFixedTransparence)
532 const double fOpNew(1.0 - fTransparence);
536 Scanline pScanline = pOld->GetScanline(
y );
539 const double fOpOld(1.0 - (pOld->GetIndexFromData(pScanline,
x) * fFactor));
550 assert(pNew &&
"Got no access to new alpha mask (!)");
552 assert(pOld->Width() == pNew->Width() && pOld->Height() == pNew->Height() &&
553 "Alpha masks have different sizes (!)");
557 Scanline pScanline = pOld->GetScanline(
y );
560 const double fOpOld(1.0 - (pOld->GetIndexFromData(pScanline,
x) * fFactor));
561 const double fOpNew(1.0 - (pNew->GetIndexFromData(pScanline,
x) * fFactor));
579 MapMode aMapMode( MapUnit::Map100thMM );
581 const Size aOutputSizePixel( pVDev->LogicToPixel( rSize, aMapMode ) );
583 if ( aOutputSizePixel.
Width() && aOutputSizePixel.
Height() )
588 pVDev->SetMapMode( aMapMode );
589 pVDev->SetOutputSizePixel( aSizePixel );
592 pVDev->DrawPolyPolygon( aClip );
595 pVDev->EnableMapMode(
false );
596 const Bitmap aVDevMask(pVDev->GetBitmap(
Point(), aSizePixel));
610 const tools::Long nWidth(std::min(pR->Width(), pW->Width()));
611 const tools::Long nHeight(std::min(pR->Height(), pW->Height()));
615 Scanline pScanlineR = pR->GetScanline( nY );
616 Scanline pScanlineW = pW->GetScanline( nY );
619 const sal_uInt8 nIndR(pR->GetIndexFromData(pScanlineR, nX));
620 const sal_uInt8 nIndW(pW->GetIndexFromData(pScanlineW, nX));
625 const sal_uInt8 nCombined(0x00ff - (((0x00ff - nIndR) * (0x00ff - nIndW)) >> 8));
627 pW->SetPixelOnData(pScanlineW, nX,
BitmapColor(nCombined));
651 return css::uno::Sequence< sal_Int8 >(
static_cast<sal_Int8 const *
>(aMem.
GetData()), aMem.
Tell() );
654 return css::uno::Sequence< sal_Int8 >();
659 bool bIsAlpha =
false;
670 for( nX = 0; nX < nWidth; nX++ )
675 nAlpha = data[ nOff ] = 255 - rColor.
GetIndex();
682 SAL_INFO(
"canvas.cairo",
"fallback to GetColor for alpha - slow, format: " <<
static_cast<int>(pAlphaReadAcc->
GetScanlineFormat()) );
683 for( nX = 0; nX < nWidth; nX++ )
710 bool bIsAlpha =
false;
715 data =
static_cast<unsigned char*
>(malloc( nWidth*nHeight*4 ));
719 unsigned int nAlpha = 255;
721#if !ENABLE_WASM_STRIP_PREMULTIPLY
724 for( nY = 0; nY < nHeight; nY++ )
733 if(
readAlpha( pAlphaReadAcc, nY, nWidth, data, nOff ) )
736 for( nX = 0; nX < nWidth; nX++ )
740 nAlpha = data[ nOff++ ];
742 nAlpha = data[ nOff++ ] = 255;
745 nAlpha = data[ nOff + 3 ];
747 nAlpha = data[ nOff + 3 ] = 255;
752#if ENABLE_WASM_STRIP_PREMULTIPLY
757 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetRed()];
758 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetGreen()];
759 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetBlue()];
762#if ENABLE_WASM_STRIP_PREMULTIPLY
767 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetBlue()];
768 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetGreen()];
769 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetRed()];
778 if(
readAlpha( pAlphaReadAcc, nY, nWidth, data, nOff ) )
781 for( nX = 0; nX < nWidth; nX++ )
785 nAlpha = data[ nOff ];
787 nAlpha = data[ nOff ] = 255;
788#if ENABLE_WASM_STRIP_PREMULTIPLY
793 data[ nOff + 3 ] = premultiply_table[nAlpha][*pReadScan++];
794 data[ nOff + 2 ] = premultiply_table[nAlpha][*pReadScan++];
795 data[ nOff + 1 ] = premultiply_table[nAlpha][*pReadScan++];
800 nAlpha = data[ nOff + 3 ];
802 nAlpha = data[ nOff + 3 ] = 255;
803#if ENABLE_WASM_STRIP_PREMULTIPLY
808 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
809 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
810 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
819 if(
readAlpha( pAlphaReadAcc, nY, nWidth, data, nOff ) )
822 for( nX = 0; nX < nWidth; nX++ )
826 nAlpha = data[ nOff++ ];
828 nAlpha = data[ nOff++ ] = 255;
829#if ENABLE_WASM_STRIP_PREMULTIPLY
834 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
835 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
836 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
840 nAlpha = data[ nOff + 3 ];
842 nAlpha = data[ nOff + 3 ] = 255;
843#if ENABLE_WASM_STRIP_PREMULTIPLY
848 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 2 ]];
849 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 1 ]];
850 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 0 ]];
860 if(
readAlpha( pAlphaReadAcc, nY, nWidth, data, nOff ) )
863 for( nX = 0; nX < nWidth; nX++ )
867 nAlpha = data[ nOff++ ];
869 nAlpha = data[ nOff++ ] = 255;
870#if ENABLE_WASM_STRIP_PREMULTIPLY
875 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 2 ]];
876 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 1 ]];
877 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 0 ]];
882 nAlpha = data[ nOff + 3 ];
884 nAlpha = data[ nOff + 3 ] = 255;
885#if ENABLE_WASM_STRIP_PREMULTIPLY
890 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
891 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
892 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
902 if(
readAlpha( pAlphaReadAcc, nY, nWidth, data, nOff ) )
905 for( nX = 0; nX < nWidth; nX++ )
909 nAlpha = data[ nOff ++ ];
911 nAlpha = data[ nOff ++ ] = 255;
912#if ENABLE_WASM_STRIP_PREMULTIPLY
917 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
918 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
919 data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++];
924 nAlpha = data[ nOff + 3 ];
926 nAlpha = data[ nOff + 3 ] = 255;
927#if ENABLE_WASM_STRIP_PREMULTIPLY
932 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 2 ]];
933 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 1 ]];
934 data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 0 ]];
942 SAL_INFO(
"canvas.cairo",
"fallback to GetColor - slow, format: " <<
static_cast<int>(pBitmapReadAcc->
GetScanlineFormat()) );
945 if(
readAlpha( pAlphaReadAcc, nY, nWidth, data, nOff ) )
948 for( nX = 0; nX < nWidth; nX++ )
950 aColor = pBitmapReadAcc->
GetColor( nY, nX );
956 nAlpha = data[ nOff++ ];
958 nAlpha = data[ nOff++ ] = 255;
959#if ENABLE_WASM_STRIP_PREMULTIPLY
964 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetRed()];
965 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetGreen()];
966 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetBlue()];
970 nAlpha = data[ nOff + 3 ];
972 nAlpha = data[ nOff + 3 ] = 255;
973#if ENABLE_WASM_STRIP_PREMULTIPLY
978 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetBlue()];
979 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetGreen()];
980 data[ nOff++ ] = premultiply_table[nAlpha][aColor.
GetRed()];
992 bHasAlpha = bIsAlpha;
1006 assert( pReadAccess );
1012 uno::Sequence< sal_Int8 > aRes( 4*aBmpSize.
Width()*aBmpSize.
Height() );
1020 if( pAlphaReadAccess.
get() !=
nullptr )
1024 x<aBmpSize.
Width() &&
x<rect.X2;
1030 pRes[ nCurrPos++ ] = pAlphaReadAccess->
GetIndexFromData( pScanlineReadAlpha,
x );
1036 x<aBmpSize.
Width() &&
x<rect.X2;
1059 for(sal_uInt16
a(0);
a < 8;
a++)
1061 for(sal_uInt16 b(0); b < 8; b++)
1063 if(pArray[(
a * 8) + b])
1065 pContent->SetPixelIndex(
a, b, 1);
1069 pContent->SetPixelIndex(
a, b, 0);
1095 bool foundSecondColor =
false;;
1099 if(!foundSecondColor)
1104 foundSecondColor =
true;
1108 std::swap( o_rFront, o_rBack );
1124#if ENABLE_WASM_STRIP_PREMULTIPLY
1127 return (a == 0) ? 0 : (c * 255 +
a / 2) / a;
1132 return (c * a + 127) / 255;
1142 return (
a == 0) ? 0 : (c * 255 +
a / 2) /
a;
1152 return (c *
a + 127) / 255;
1156 int a, std::integer_sequence<int, Is...>)
1162 std::integer_sequence<int, Is...>)
1170 std::make_integer_sequence<int, 256>{});
1171 return unpremultiply_table;
1175 int a, std::integer_sequence<int, Is...>)
1181 std::integer_sequence<int, Is...>)
1189 std::make_integer_sequence<int, 256>{});
1190 return premultiply_table;
1211 Scanline aResultScan = pResultBitmapAccess->GetScanline(nY);
1212 Scanline aResultScanAlpha = pResultAlphaAccess->GetScanline(nY);
1222 pResultBitmapAccess->SetPixelOnData(aResultScan, nX, aResultColor);
1223 pResultAlphaAccess->SetPixelOnData(aResultScanAlpha, nX, aResultColorAlpha);
1230 rResult =
BitmapEx(aResultBitmap, aResultAlpha);
1248 aBmp.
Crop( aSrcRect );
1257 Size aDstSizeTwip(std::abs(rDstSizeTwip.
Width()), std::abs(rDstSizeTwip.
Height()));
1260 const double fBmpPixelX = aBmpSize.
Width();
1261 const double fBmpPixelY = aBmpSize.
Height();
1262 const double fMaxPixelX
1265 const double fMaxPixelY
1270 if (((fBmpPixelX > (fMaxPixelX + 4)) ||
1271 (fBmpPixelY > (fMaxPixelY + 4))) &&
1272 (fBmpPixelY > 0.0) && (fMaxPixelY > 0.0))
1276 const double fBmpWH = fBmpPixelX / fBmpPixelY;
1277 const double fMaxWH = fMaxPixelX / fMaxPixelY;
1279 if (fBmpWH < fMaxWH)
1284 else if (fBmpWH > 0.0)
1291 aBmp.
Scale(aNewBmpSize);
vcl::ScopedBitmapAccess< BitmapWriteAccess, AlphaMask, &AlphaMask::AcquireAlphaWriteAccess > AlphaScopedWriteAccess
struct _cairo_surface cairo_surface_t
const StyleSettings & GetStyleSettings() const
Bitmap const & GetBitmap() const
void ReleaseAccess(BitmapReadAccess *pAccess)
static const AllSettings & GetSettings()
Gets the application's settings.
sal_uInt8 GetIndex() const
const AlphaMask & GetAlphaMask() const
Bitmap GetBitmap(Color aTransparentReplaceColor) const
const Size & GetSizePixel() const
tools::Long Height() const
tools::Long Width() const
const BitmapPalette & GetPalette() const
ScanlineFormat GetScanlineFormat() const
const BitmapColor & GetPaletteColor(sal_uInt16 nColor) const
sal_uInt8 GetPixelIndex(tools::Long nY, tools::Long nX) 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 Crop(const tools::Rectangle &rRectPixel)
Crop the bitmap.
Size GetSizePixel() const
static void ReleaseAccess(BitmapInfoAccess *pAccess)
bool Scale(const Size &rNewSize, BmpScaleFlag nScaleFlag=BmpScaleFlag::Default)
Scale the bitmap.
BitmapReadAccess * AcquireReadAccess()
vcl::PixelFormat getPixelFormat() const
sal_uInt8 GetLuminance() const
sal_uInt8 GetBlue() const
sal_uInt8 GetAlpha() const
sal_uInt8 GetGreen() const
static VCL_DLLPUBLIC ImageTree & get()
VCL_DLLPUBLIC bool loadImage(OUString const &name, OUString const &style, BitmapEx &bitmap, bool localized, const ImageLoadFlags eFlags=ImageLoadFlags::NONE)
void SetOrigin(const Point &rOrigin)
void SetScaleY(const Fraction &rScaleY)
void SetScaleX(const Fraction &rScaleX)
constexpr tools::Long Height() const
void setWidth(tools::Long nWidth)
void setHeight(tools::Long nHeight)
constexpr tools::Long Width() const
OUString DetermineIconTheme() const
Determine which icon theme should be used.
std::size_t ReadBytes(void *pData, std::size_t nSize)
sal_uInt64 remainingSize()
B2DVector getRange() const
void expand(const Tuple2D< TYPE > &rTuple)
This template handles BitmapAccess the RAII way.
Intended to be used to feed into CreateFromData to create a BitmapEx.
constexpr ::Color COL_WHITE(0xFF, 0xFF, 0xFF)
constexpr ::Color COL_BLACK(0x00, 0x00, 0x00)
#define ENSURE_OR_THROW(c, m)
tools::Long FRound(double fVal)
#define SAL_WARN_IF(condition, area, stream)
#define SAL_INFO(area, stream)
std::unique_ptr< sal_Int32[]> pData
RttiCompleteObjectLocator col
constexpr OUStringLiteral aData
B2IRange fround(const B2DRange &rRange)
Reference< XComponentContext > getProcessComponentContext()
rtl::Reference< BasePrimitive2D > Primitive2DReference
css::uno::Sequence< css::uno::Reference< css::graphic::XPrimitive2D > > Primitive2DSequence
void CanvasCairoExtractBitmapData(BitmapEx const &aBmpEx, Bitmap &aBitmap, unsigned char *&data, bool &bHasAlpha, tools::Long &rnWidth, tools::Long &rnHeight)
bool isHistorical8x8(const BitmapEx &rBitmapEx, Color &o_rBack, Color &o_rFront)
BitmapEx loadFromName(const OUString &rFileName, const ImageLoadFlags eFlags)
lookup_table const & get_unpremultiply_table()
static constexpr lookup_table make_unpremultiply_table_(std::integer_sequence< int, Is... >)
Bitmap GetDownsampledBitmap(Size const &rDstSizeTwip, Point const &rSrcPt, Size const &rSrcSz, Bitmap const &rBmp, tools::Long nMaxBmpDPIX, tools::Long nMaxBmpDPIY)
Retrieve downsampled and cropped bitmap.
static constexpr std::array< sal_uInt8, 256 > make_premultiply_table_row_(int a, std::integer_sequence< int, Is... >)
BitmapEx CanvasTransformBitmap(const BitmapEx &rBitmap, const ::basegfx::B2DHomMatrix &rTransform, ::basegfx::B2DRectangle const &rDestRect, ::basegfx::B2DHomMatrix const &rLocalTransform)
void DrawAlphaBitmapAndAlphaGradient(BitmapEx &rBitmapEx, bool bFixedTransparence, float fTransparence, AlphaMask &rNewMask)
void loadFromSvg(SvStream &rStream, const OUString &sPath, BitmapEx &rBitmapEx, double fScalingFactor)
static constexpr std::array< sal_uInt8, 256 > make_unpremultiply_table_row_(int a, std::integer_sequence< int, Is... >)
void DrawAndClipBitmap(const Point &rPos, const Size &rSize, const BitmapEx &rBitmap, BitmapEx &aBmpEx, basegfx::B2DPolyPolygon const &rClipPath)
static constexpr sal_uInt8 premultiplyImpl(sal_uInt8 c, sal_uInt8 a)
sal_uInt8 unpremultiply(sal_uInt8 c, sal_uInt8 a)
BitmapEx createHistorical8x8FromArray(std::array< sal_uInt8, 64 > const &pArray, Color aColorPix, Color aColorBack)
static bool readAlpha(BitmapReadAccess const *pAlphaReadAcc, tools::Long nY, const tools::Long nWidth, unsigned char *data, tools::Long nOff)
sal_uInt8 premultiply(sal_uInt8 c, sal_uInt8 a)
css::uno::Sequence< sal_Int8 > GetMaskDIB(BitmapEx const &aBmpEx)
uno::Sequence< sal_Int8 > CanvasExtractBitmapData(BitmapEx const &rBitmapEx, const geometry::IntegerRectangle2D &rect)
lookup_table const & get_premultiply_table()
BitmapEx CreateFromData(sal_uInt8 const *pData, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int32 nStride, sal_Int8 nBitCount, bool bReversColors, bool bReverseAlpha)
Copy block of image data into the bitmap.
std::array< std::array< sal_uInt8, 256 >, 256 > lookup_table
bool convertBitmap32To24Plus8(BitmapEx const &rInput, BitmapEx &rResult)
static constexpr lookup_table make_premultiply_table_(std::integer_sequence< int, Is... >)
static constexpr sal_uInt8 unpremultiplyImpl(sal_uInt8 c, sal_uInt8 a)
PixelFormat
Pixel format of the bitmap in bits per pixel.
std::unique_ptr< char[]> aBuffer