29#include <com/sun/star/rendering/XBitmap.hpp>
30#include <com/sun/star/rendering/XCanvas.hpp>
53#if OSL_DEBUG_LEVEL > 2
65 class TransparencyGroupAction :
public Action
86 TransparencyGroupAction( std::unique_ptr< GDIMetaFile >&& rGroupMtf,
87 std::optional< Gradient >&& rAlphaGradient,
88 const ::basegfx::B2DPoint& rDstPoint,
89 const ::basegfx::B2DVector& rDstSize,
91 const OutDevState& rState );
93 TransparencyGroupAction(
const TransparencyGroupAction&) =
delete;
94 const TransparencyGroupAction& operator=(
const TransparencyGroupAction&) =
delete;
96 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
97 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
98 const Subset& rSubset )
const override;
100 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
101 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
102 const Subset& rSubset )
const override;
104 virtual sal_Int32 getActionCount()
const override;
127 void implSetupTransform( rendering::RenderState& rRenderState,
128 const ::basegfx::B2DPoint& rDstPoint )
132 aLocalTransformation.
translate( rDstPoint.getX(),
134 ::canvas::tools::appendToRenderState( rRenderState,
135 aLocalTransformation );
138 TransparencyGroupAction::TransparencyGroupAction( std::unique_ptr< GDIMetaFile >&& rGroupMtf,
139 std::optional< Gradient >&& rAlphaGradient,
140 const ::basegfx::B2DPoint& rDstPoint,
141 const ::basegfx::B2DVector& rDstSize,
143 const OutDevState& rState ) :
146 maDstSize(rDstSize.getX(), rDstSize.getY()),
150 implSetupTransform(
maState, rDstPoint );
171 bool TransparencyGroupAction::renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
172 const Subset& rSubset )
const
174 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TransparencyGroupAction::renderSubset()" );
175 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TransparencyGroupAction: 0x" << std::hex <<
this );
180 ::canvas::tools::getRenderStateTransform( aTransform,
maState );
181 aTransform = rTransformation * aTransform;
184 ::canvas::tools::getViewStateTransform( aTotalTransform,
mpCanvas->getViewState() );
185 aTotalTransform = aTotalTransform * aTransform;
189 aTotalTransform.
set( 0, 2, 0.0 );
190 aTotalTransform.
set( 1, 2, 0.0 );
204 SAL_WARN(
"cppcanvas.emf",
"TransparencyGroupAction::renderSubset(): non-decomposable transformation" );
232 aVDev->SetOutputSizePixel( aBitmapSizePixel,
true,
true );
235 if( rSubset.mnSubsetBegin != 0 ||
236 rSubset.mnSubsetEnd != -1 )
242 int nCurrActionIndex;
245 for( nCurrActionIndex=0,
248 ++nCurrActionIndex, pCurrAct =
mpGroupMtf->NextAction() )
252 case MetaActionType::PUSH:
253 case MetaActionType::POP:
254 case MetaActionType::CLIPREGION:
255 case MetaActionType::ISECTRECTCLIPREGION:
256 case MetaActionType::ISECTREGIONCLIPREGION:
257 case MetaActionType::MOVECLIPREGION:
258 case MetaActionType::LINECOLOR:
259 case MetaActionType::FILLCOLOR:
260 case MetaActionType::TEXTCOLOR:
261 case MetaActionType::TEXTFILLCOLOR:
262 case MetaActionType::TEXTLINECOLOR:
263 case MetaActionType::TEXTALIGN:
264 case MetaActionType::FONT:
265 case MetaActionType::RASTEROP:
266 case MetaActionType::REFPOINT:
267 case MetaActionType::LAYOUTMODE:
272 case MetaActionType::GRADIENT:
273 case MetaActionType::HATCH:
274 case MetaActionType::EPS:
275 case MetaActionType::COMMENT:
276 case MetaActionType::POINT:
277 case MetaActionType::PIXEL:
278 case MetaActionType::LINE:
279 case MetaActionType::RECT:
280 case MetaActionType::ROUNDRECT:
281 case MetaActionType::ELLIPSE:
282 case MetaActionType::ARC:
283 case MetaActionType::PIE:
284 case MetaActionType::CHORD:
285 case MetaActionType::POLYLINE:
286 case MetaActionType::POLYGON:
287 case MetaActionType::POLYPOLYGON:
288 case MetaActionType::BMP:
289 case MetaActionType::BMPSCALE:
290 case MetaActionType::BMPSCALEPART:
291 case MetaActionType::BMPEX:
292 case MetaActionType::BMPEXSCALE:
293 case MetaActionType::BMPEXSCALEPART:
294 case MetaActionType::MASK:
295 case MetaActionType::MASKSCALE:
296 case MetaActionType::MASKSCALEPART:
297 case MetaActionType::GRADIENTEX:
298 case MetaActionType::WALLPAPER:
299 case MetaActionType::Transparent:
300 case MetaActionType::FLOATTRANSPARENT:
301 case MetaActionType::TEXT:
302 case MetaActionType::TEXTARRAY:
303 case MetaActionType::TEXTLINE:
304 case MetaActionType::TEXTRECT:
305 case MetaActionType::STRETCHTEXT:
309 if( rSubset.mnSubsetBegin <= nCurrActionIndex &&
310 rSubset.mnSubsetEnd > nCurrActionIndex )
317 SAL_WARN(
"cppcanvas.emf",
"Unknown meta action type encountered" );
322 aVDev->DrawTransparent( aMtf,
342 aBitmapSizePixel ) ) );
366 aTransform = aTransform * aScaleCorrection;
368 rendering::RenderState aLocalState(
maState );
369 ::canvas::tools::setRenderStateTransform(aLocalState, aTransform);
371 if(aLocalState.Clip.is())
377 aLocalState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
mpCanvas->getUNOCanvas()->getDevice(), aClip);
380#if OSL_DEBUG_LEVEL > 2
381 aLocalState.Clip.clear();
382 aLocalState.DeviceColor =
385 mpCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace() );
392 aLocalState.DeviceColor =
maState.DeviceColor;
409 bool TransparencyGroupAction::render( const ::basegfx::B2DHomMatrix& rTransformation )
const
413 aSubset.mnSubsetBegin = 0;
414 aSubset.mnSubsetEnd = -1;
416 return renderSubset( rTransformation, aSubset );
419 ::basegfx::B2DRange TransparencyGroupAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const
421 rendering::RenderState aLocalState(
maState );
422 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
432 ::basegfx::B2DRange TransparencyGroupAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
433 const Subset& rSubset )
const
442 if( rSubset.mnSubsetBegin != 0 ||
443 rSubset.mnSubsetEnd != 1 )
444 return ::basegfx::B2DRange();
446 return getBounds( rTransformation );
449 sal_Int32 TransparencyGroupAction::getActionCount()
const
457 std::optional< Gradient >&& rAlphaGradient,
458 const ::basegfx::B2DPoint& rDstPoint,
459 const ::basegfx::B2DVector& rDstSize,
463 return std::make_shared<TransparencyGroupAction>(std::move(rGroupMtf),
464 std::move(rAlphaGradient),
static OutputDevice * GetDefaultDevice()
bool decompose(B2DTuple &rScale, B2DTuple &rTranslate, double &rRotate, double &rShearX) const
void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue)
void translate(double fX, double fY)
void scale(double fX, double fY)
void transform(const basegfx::B2DHomMatrix &rMatrix)
#define DBG_TESTSOLARMUTEX()
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY)
std::shared_ptr< Action > createTransparencyGroupAction(std::unique_ptr< GDIMetaFile > &&rGroupMtf, std::optional< Gradient > &&rAlphaGradient, const ::basegfx::B2DPoint &rDstPoint, const ::basegfx::B2DVector &rDstSize, const CanvasSharedPtr &rCanvas, const OutDevState &rState)
Create new transparency group action.
std::shared_ptr< Canvas > CanvasSharedPtr
std::shared_ptr< Gdiplus::Bitmap > BitmapSharedPtr
rendering::RenderState maState
mutable::basegfx::B2DHomMatrix maLastTransformation
const ::basegfx::B2DSize maDstSize
std::unique_ptr< GDIMetaFile > mpGroupMtf
uno::Reference< rendering::XBitmap > mxBufferBitmap
std::optional< Gradient > mpAlphaGradient