34#include <rtl/ustrbuf.hxx>
83 nSteps = std::min(nSteps, nDistSteps);
90 nSteps = std::min(nSteps, sal_uInt32(255));
91 nSteps = std::max(nSteps, sal_uInt32(1));
106 if (0 != rOrigin.X() || 0 != rOrigin.Y())
108 aMapping.
translate(rOrigin.X(), rOrigin.Y());
135 double fRotate, fShearX;
136 aLocalTransform.
decompose(aFontScaling, aTranslate, fRotate, fShearX);
138 bool bPrimitiveAccepted(
false);
142 if (std::abs(aFontScaling.
getY() * fShearX) < 1)
157 double fIgnoreRotate, fIgnoreShearX;
165 const bool bScaleFont(aFontSize.
getY() != std::round(aFontSize.
getY()));
197 if (pTCPP !=
nullptr)
243 eFontEmphasisMark = FontEmphasisMark::NONE;
246 eFontEmphasisMark = FontEmphasisMark::Dot;
249 eFontEmphasisMark = FontEmphasisMark::Circle;
252 eFontEmphasisMark = FontEmphasisMark::Disc;
255 eFontEmphasisMark = FontEmphasisMark::Accent;
259 if (eFontEmphasisMark != FontEmphasisMark::NONE)
262 "DrawingLayer: Bad EmphasisMark position!");
264 eFontEmphasisMark |= FontEmphasisMark::PosAbove;
266 eFontEmphasisMark |= FontEmphasisMark::PosBelow;
278 eFontRelief = FontRelief::NONE;
281 eFontRelief = FontRelief::Embossed;
284 eFontRelief = FontRelief::Engraved;
288 if (eFontRelief != FontRelief::NONE)
301 double fPixelVectorFactor(1.0);
306 fPixelVectorFactor = aPixelVector.
getLength();
310 for (
auto const& elem : rTextCandidate.
getDXArray())
330 OUString aText(rTextCandidate.
getText());
342 sal_Int32 nChars = 2;
344 nChars = nWidthToFill / nWidth;
346 OUStringBuffer aFilled(nChars);
348 aText = aFilled.makeStringAndClear();
352 if (!aDXArray.
empty())
354 sal_Int32 nDX = aDXArray[0];
356 for (sal_Int32
i = 1;
i < nLen; ++
i)
357 aDXArray.
set(
i, aDXArray[
i - 1] + nDX);
362 bool bChangeMapMode(
false);
370 double fCurrentRotate;
371 aCombinedTransform.
decompose(aCurrentScaling, aCurrentTranslate, fCurrentRotate,
381 SAL_WARN(
"drawinglayer",
"invalid X Scale");
388 SAL_WARN(
"drawinglayer",
"invalid Y Scale");
397 aStartPoint =
Point(aTextTranslate.
getX(), aTextTranslate.
getY());
416 if (!aDXArray.
empty())
422 SalLayoutFlags::NONE, pGlyphs);
437 bPrimitiveAccepted =
true;
441 if (!bPrimitiveAccepted)
504 mpOutputDevice->DrawTransformedBitmapEx(aLocalTransform, aBitmapEx);
512 if (!bPrimitiveAccepted)
547 double fRotate, fShearX;
548 aLocalTransform.
decompose(aScale, aTranslate, fRotate, fShearX);
566 if (nOWidth <= 0 || nOHeight <= 0)
581 const Size aNeededBitmapSizePixel(nBWidth, nBHeight);
583 const bool bPreScaled(nBWidth * nBHeight < (250 * 250));
593 aBitmapEx.
Convert(BmpConversion::N24Bit);
596 aBitmapEx.
Scale(aNeededBitmapSizePixel, BmpScaleFlag::Interpolate);
631 const sal_Int32 nDiff((nBLeft / nBWidth) + 1);
634 nBLeft -= nDiff * nBWidth;
637 if (nBLeft + nBWidth <= nOLeft)
639 const sal_Int32 nDiff(-nBLeft / nBWidth);
642 nBLeft += nDiff * nBWidth;
647 const sal_Int32 nDiff((nBTop / nBHeight) + 1);
650 nBTop -= nDiff * nBHeight;
653 if (nBTop + nBHeight <= nOTop)
655 const sal_Int32 nDiff(-nBTop / nBHeight);
658 nBTop += nDiff * nBHeight;
662 const Point aEmptyPoint(0, 0);
664 const ::tools::Rectangle aVisiblePixel(aEmptyPoint,
mpOutputDevice->GetOutputSizePixel());
674 for (sal_Int32 nYPos(nBTop); nYPos < nOTop + nOHeight; nYPos += nBHeight, nPosY++)
676 for (sal_Int32 nXPos((nPosY % 2) ? nBLeft - nBWidth + nOffsetX : nBLeft);
677 nXPos < nOLeft + nOWidth; nXPos += nBWidth)
679 const ::tools::Rectangle aOutRectPixel(
Point(nXPos, nYPos), aNeededBitmapSizePixel);
681 if (aOutRectPixel.Overlaps(aVisiblePixel))
690 aNeededBitmapSizePixel, aBitmapEx);
702 for (sal_Int32 nXPos(nBLeft); nXPos < nOLeft + nOWidth; nXPos += nBWidth, nPosX++)
704 for (sal_Int32 nYPos((nPosX % 2) ? nBTop - nBHeight + nOffsetY : nBTop);
705 nYPos < nOTop + nOHeight; nYPos += nBHeight)
707 const ::tools::Rectangle aOutRectPixel(
Point(nXPos, nYPos), aNeededBitmapSizePixel);
709 if (aOutRectPixel.Overlaps(aVisiblePixel))
718 aNeededBitmapSizePixel, aBitmapEx);
738 if (!rPolyPolygon.
count())
752 case GraphicType::GdiMetafile:
757 case GraphicType::Bitmap:
765 if (nBColorModifierStackCount)
772 rTopmostModifier.get());
805 aTileRange.
transform(aNewObjectTransform);
811 rPolyPolygon, aTileRange,
true,
false);
891 aBufferDevice.
paint();
981 aBufferDevice.
paint();
1021 process(rPagePreviewCandidate);
1032 const std::vector<basegfx::B2DPoint>& rPositions = rMarkArrayCandidate.
getPositions();
1033 const sal_uInt32
nCount(rPositions.size());
1042 if (!(aBitmapSize.
Width() && aBitmapSize.
Height()))
1059 for (
auto const&
pos : rPositions)
1062 - aDiscreteHalfSize);
1076 const std::vector<basegfx::B2DPoint>& rPositions = rPointArrayCandidate.
getPositions();
1079 const Color aVCLColor(aRGBColor);
1081 for (
auto const&
pos : rPositions)
1097 const double fLineWidth(rLineAttribute.
getWidth());
1104 const double fDiscreteLineWidth(aDiscreteUnit.
getLength());
1127 const sal_uInt32
nCount(aHairlinePolyPolygon.
count());
1152 const double fDistance(fDiscreteLineWidth - 1.0);
1153 const double fHalfDistance(fDistance * 0.5);
1159 aMat.
set(0, 2, -fHalfDistance);
1160 aMat.
set(1, 2, -fHalfDistance);
1164 aMat.
set(0, 2, fDistance);
1165 aMat.
set(1, 2, 0.0);
1169 aMat.
set(0, 2, 0.0);
1170 aMat.
set(1, 2, fDistance);
1174 aMat.
set(0, 2, -fDistance);
1175 aMat.
set(1, 2, 0.0);
1187 const double fDistance((fDiscreteLineWidth - 1.0) * 0.5);
1195 aMat.
set(0, 2, -fDistance);
1196 aMat.
set(1, 2, 0.0);
1200 aMat.
set(0, 2, fDistance);
1201 aMat.
set(1, 2, -fDistance);
1205 aMat.
set(0, 2, fDistance);
1206 aMat.
set(1, 2, fDistance);
1210 aMat.
set(0, 2, -fDistance);
1211 aMat.
set(1, 2, fDistance);
1246 aMat.
set(0, 2, 1.0);
1247 aMat.
set(1, 2, 0.0);
1252 aMat.
set(0, 2, 0.0);
1253 aMat.
set(1, 2, 1.0);
1258 aMat.
set(0, 2, -1.0);
1259 aMat.
set(1, 2, 0.0);
1299 process(rPolygonStrokeCandidate);
1321 const ::tools::Rectangle aRectangle(
static_cast<sal_Int32
>(floor(aRange.
getMinX())),
1322 static_cast<sal_Int32
>(floor(aRange.
getMinY())),
1323 static_cast<sal_Int32
>(ceil(aRange.
getMaxX())),
1324 static_cast<sal_Int32
>(ceil(aRange.
getMaxY())));
1326 if (aRectangle.IsEmpty())
1329 bool bWillReallyRender =
mpOutputDevice->IsDeviceOutputNecessary();
1331 const bool bEPSPaintedDirectly
1333 &&
mpOutputDevice->DrawEPS(aRectangle.TopLeft(), aRectangle.GetSize(),
1336 if (!bEPSPaintedDirectly)
1359 const double fDiscreteUnit(aDiscreteVector.
getLength() * (1.0 / M_SQRT2));
1362 const sal_uInt32 nSteps(calculateStepsForSvgGradient(aColorA, aColorB, fDelta, fDiscreteUnit));
1370 rCandidate.
getOffsetA() + (fDelta / nSteps) + fDiscreteUnit, 1.0)));
1373 double fUnitScale(0.0);
1374 const double fUnitStep(1.0 / nSteps);
1377 for (sal_uInt32
a(0);
a < nSteps;
a++, fUnitScale += fUnitStep)
1403 const double fDiscreteUnit(aDiscreteVector.
getLength() * (1.0 / M_SQRT2));
1406 const sal_uInt32 nSteps(
1407 calculateStepsForSvgGradient(aColorA, aColorB, fDeltaScale, fDiscreteUnit));
1413 double fUnitScale(0.0);
1414 const double fUnitStep(1.0 / nSteps);
1416 for (sal_uInt32
a(0);
a < nSteps;
a++, fUnitScale += fUnitStep)
1419 const double fEndScale(rCandidate.
getScaleB() - (fDeltaScale * fUnitScale));
1427 fEndScale, fEndScale, aTranslate.
getX(), aTranslate.
getY());
1446 if (!(nOriginalDrawMode
1447 & (DrawModeFlags::BlackLine | DrawModeFlags::GrayLine | DrawModeFlags::WhiteLine
1448 | DrawModeFlags::SettingsLine)))
1453 if (nOriginalDrawMode & DrawModeFlags::BlackLine)
1455 nAdaptedDrawMode |= DrawModeFlags::BlackFill;
1462 if (nOriginalDrawMode & DrawModeFlags::GrayLine)
1464 nAdaptedDrawMode |= DrawModeFlags::GrayFill;
1471 if (nOriginalDrawMode & DrawModeFlags::WhiteLine)
1473 nAdaptedDrawMode |= DrawModeFlags::WhiteFill;
1480 if (nOriginalDrawMode & DrawModeFlags::SettingsLine)
1482 nAdaptedDrawMode |= DrawModeFlags::SettingsFill;
1495 if (!(nOriginalDrawMode
1496 & (DrawModeFlags::BlackText | DrawModeFlags::GrayText | DrawModeFlags::WhiteText
1497 | DrawModeFlags::SettingsText)))
1502 if (nOriginalDrawMode & DrawModeFlags::BlackText)
1504 nAdaptedDrawMode |= DrawModeFlags::BlackFill;
1511 if (nOriginalDrawMode & DrawModeFlags::GrayText)
1513 nAdaptedDrawMode |= DrawModeFlags::GrayFill;
1520 if (nOriginalDrawMode & DrawModeFlags::WhiteText)
1522 nAdaptedDrawMode |= DrawModeFlags::WhiteFill;
1529 if (nOriginalDrawMode & DrawModeFlags::SettingsText)
1531 nAdaptedDrawMode |= DrawModeFlags::SettingsFill;
1546 , mpOutputDevice(&rOutDev)
1547 , maBColorModifierStack(
std::move(aInitStack))
1548 , mnPolygonStrokePrimitive2D(0)
bool Scale(const Size &rNewSize, BmpScaleFlag nScaleFlag=BmpScaleFlag::Default)
vcl::PixelFormat getPixelFormat() const
bool Convert(BmpConversion eConversion)
BitmapEx ModifyBitmapEx(const basegfx::BColorModifierStack &rBColorModifierStack) const
const Size & GetSizePixel() const
bool IsTransparent() const
GraphicType GetType() const
BitmapEx GetBitmapEx(const GraphicConversionParameters &rParameters=GraphicConversionParameters()) const
const std::shared_ptr< VectorGraphicData > & getVectorGraphicData() const
bool IsTransparent() const
void resize(size_t nSize)
void reserve(size_t nCapacity)
void set(size_t nIndex, sal_Int32 nValue)
void push_back(sal_Int32 nUnit)
const Fraction & GetScaleX() const
const Point & GetOrigin() const
const Fraction & GetScaleY() const
void SetDigitLanguage(LanguageType)
void DrawPolyPolygon(const tools::PolyPolygon &rPolyPoly)
static SalLayoutGlyphsCache * self()
const SalLayoutGlyphs * GetLayoutGlyphs(VclPtr< const OutputDevice > outputDevice, const OUString &text, const vcl::text::TextLayoutCache *layoutCache=nullptr)
constexpr tools::Long getHeight() const
constexpr tools::Long Height() const
constexpr tools::Long getWidth() const
constexpr tools::Long Width() const
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)
B2DPolygon const & getB2DPolygon(sal_uInt32 nIndex) const
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
void transform(const basegfx::B2DHomMatrix &rMatrix)
B2DRange getB2DRange() const
void transform(const basegfx::B2DHomMatrix &rMatrix)
BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix &rMatrix)
B2DVector getRange() const
B2DPoint getMinimum() const
const BColorModifierSharedPtr & getBColorModifier(sal_uInt32 nIndex) const
void push(const BColorModifierSharedPtr &rNew)
::basegfx::BColor getModifiedColor(const ::basegfx::BColor &rSource) const
const ::basegfx::BColor & getBColor() const
double getDistance(const BColor &rColor) const
double getOffsetY() const
const Graphic & getGraphic() const
double getOffsetX() const
const basegfx::B2DRange & getGraphicRange() const
double getMiterMinimumAngle() const
basegfx::B2DLineJoin getLineJoin() const
css::drawing::LineCap getLineCap() const
const basegfx::BColor & getColor() const
const ::std::vector< double > & getDotDashArray() const
double getFullDotDashLen() const
void paint(double fTrans=0.0)
VirtualDevice & getTransparence()
VirtualDevice & getContent()
const basegfx::B2DHomMatrix & getTransform() const
const BitmapEx & getBitmap() const
data read access
const GfxLink & getGfxLink() const
const basegfx::B2DHomMatrix & getEpsTransform() const
data read access
FillGraphicPrimitive2D class.
const attribute::FillGraphicAttribute & getFillGraphic() const
const basegfx::B2DHomMatrix & getTransformation() const
data read access
const Primitive2DContainer & getChildren() const
data read access
MarkerArrayPrimitive2D class.
const std::vector< basegfx::B2DPoint > & getPositions() const
data read access
const BitmapEx & getMarker() const
const basegfx::B2DPolyPolygon & getMask() const
data read access
ModifiedColorPrimitive2D class.
const basegfx::BColorModifierSharedPtr & getColorModifier() const
data read access
PagePreviewPrimitive2D class.
const css::uno::Reference< css::drawing::XDrawPage > & getXDrawPage() const
data read access
PointArrayPrimitive2D class.
const basegfx::BColor & getRGBColor() const
const std::vector< basegfx::B2DPoint > & getPositions() const
data read access
PolyPolygonGraphicPrimitive2D class.
const attribute::FillGraphicAttribute & getFillGraphic() const
const basegfx::B2DPolyPolygon & getB2DPolyPolygon() const
data read access
PolygonHairlinePrimitive2D class.
const basegfx::BColor & getBColor() const
const basegfx::B2DPolygon & getB2DPolygon() const
data read access
PolygonStrokePrimitive2D class.
const attribute::StrokeAttribute & getStrokeAttribute() const
const basegfx::B2DPolygon & getB2DPolygon() const
data read access
const attribute::LineAttribute & getLineAttribute() const
basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D &aViewInformation) const
const basegfx::BColor & getColorA() const
data read access
double getOffsetA() const
double getOffsetB() const
const basegfx::BColor & getColorB() const
basegfx::B2DVector getTranslateB() const
basegfx::B2DVector getTranslateA() const
const basegfx::BColor & getColorA() const
data read access
const basegfx::BColor & getColorB() const
bool isTranslateSet() const
TextDecoratedPortionPrimitive2D class.
TextLine getFontOverline() const
data read access
bool getEmphasisMarkBelow() const
TextEmphasisMark getTextEmphasisMark() const
const basegfx::BColor & getTextlineColor() const
TextRelief getTextRelief() const
TextStrikeout getTextStrikeout() const
TextLine getFontUnderline() const
const basegfx::BColor & getOverlineColor() const
bool getEmphasisMarkAbove() const
bool getWordLineMode() const
TextSimplePortionPrimitive2D class.
sal_Int32 getTextLength() const
tools::Long getWidthToFill() const
sal_Int32 getTextPosition() const
virtual sal_uInt32 getPrimitive2DID() const override
provide unique ID
const css::lang::Locale & getLocale() const
const ::std::vector< sal_Bool > & getKashidaArray() const
const basegfx::BColor & getFontColor() const
const OUString & getText() const
const ::std::vector< double > & getDXArray() const
const attribute::FontAttribute & getFontAttribute() const
const basegfx::B2DHomMatrix & getTextTransform() const
data read access
const Color & getTextFillColor() const
TransparencePrimitive2D class.
const Primitive2DContainer & getTransparence() const
data read access
UnifiedTransparencePrimitive2D class.
double getTransparence() const
data read access
void process(const primitive2d::BasePrimitive2D &rCandidate)
void updateViewInformation(const geometry::ViewInformation2D &rViewInformation2D)
const geometry::ViewInformation2D & getViewInformation2D() const
data read access
void RenderPointArrayPrimitive2D(const primitive2d::PointArrayPrimitive2D &rPointArrayCandidate)
void RenderPolygonStrokePrimitive2D(const primitive2d::PolygonStrokePrimitive2D &rPolygonStrokeCandidate)
sal_uInt32 mnPolygonStrokePrimitive2D
void RenderEpsPrimitive2D(const primitive2d::EpsPrimitive2D &rEpsPrimitive2D)
void RenderPolyPolygonGraphicPrimitive2D(const primitive2d::PolyPolygonGraphicPrimitive2D &rPolygonCandidate)
basegfx::BColorModifierStack maBColorModifierStack
void RenderPolygonHairlinePrimitive2D(const primitive2d::PolygonHairlinePrimitive2D &rPolygonCandidate, bool bPixelBased)
void RenderSvgLinearAtomPrimitive2D(const primitive2d::SvgLinearAtomPrimitive2D &rCandidate)
void adaptTextToFillDrawMode() const
void RenderFillGraphicPrimitive2D(const primitive2d::FillGraphicPrimitive2D &rFillBitmapCandidate)
void RenderUnifiedTransparencePrimitive2D(const primitive2d::UnifiedTransparencePrimitive2D &rTransCandidate)
VclPtr< OutputDevice > mpOutputDevice
virtual ~VclProcessor2D() override
void RenderTransformPrimitive2D(const primitive2d::TransformPrimitive2D &rTransformCandidate)
VclProcessor2D(const geometry::ViewInformation2D &rViewInformation, OutputDevice &rOutDev, basegfx::BColorModifierStack aInitStack=basegfx::BColorModifierStack())
void RenderPagePreviewPrimitive2D(const primitive2d::PagePreviewPrimitive2D &rPagePreviewCandidate)
void RenderMaskPrimitive2DPixel(const primitive2d::MaskPrimitive2D &rMaskCandidate)
basegfx::B2DHomMatrix maCurrentTransformation
void RenderModifiedColorPrimitive2D(const primitive2d::ModifiedColorPrimitive2D &rModifiedCandidate)
void RenderMarkerArrayPrimitive2D(const primitive2d::MarkerArrayPrimitive2D &rMarkerArrayCandidate)
void RenderSvgRadialAtomPrimitive2D(const primitive2d::SvgRadialAtomPrimitive2D &rCandidate)
void RenderTransparencePrimitive2D(const primitive2d::TransparencePrimitive2D &rTransCandidate)
void RenderTextSimpleOrDecoratedPortionPrimitive2D(const primitive2d::TextSimplePortionPrimitive2D &rTextCandidate)
void RenderBitmapPrimitive2D(const primitive2d::BitmapPrimitive2D &rBitmapCandidate)
void adaptLineToFillDrawMode() const
bool RenderFillGraphicPrimitive2DImpl(const primitive2d::FillGraphicPrimitive2D &rFillBitmapCandidate)
tools::Long GetFontHeight() const
void SetWordLineMode(bool bWordLine)
void SetTransparent(bool bTransparent)
void SetFillColor(const Color &)
void SetUnderline(FontLineStyle)
void SetOverline(FontLineStyle)
void SetShadow(bool bShadow)
void SetRelief(FontRelief)
void SetEmphasisMark(FontEmphasisMark)
void SetStrikeout(FontStrikeout)
constexpr ::Color COL_BLACK(0x00, 0x00, 0x00)
#define DBG_ASSERT(sCon, aError)
#define PRIMITIVE2D_ID_TEXTDECORATEDPORTIONPRIMITIVE2D
#define SAL_WARN(area, stream)
B2DHomMatrix createScaleTranslateB2DHomMatrix(double fScaleX, double fScaleY, double fTranslateX, double fTranslateY)
B2DPolygon createPolygonFromRect(const B2DRectangle &rRect, double fRadiusX, double fRadiusY)
void applyLineDashing(const B2DPolygon &rCandidate, const std::vector< double > &rDotDashArray, B2DPolyPolygon *pLineTarget, B2DPolyPolygon *pGapTarget, double fDotDashLength)
B2DPolygon const & createPolygonFromUnitCircle(sal_uInt32 nStartQuadrant=0)
B2DPolyPolygon clipPolyPolygonOnRange(const B2DPolyPolygon &rCandidate, const B2DRange &rRange, bool bInside, bool bStroke)
B2DPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolygon &rCandidate)
bool isRectangle(const B2DPolygon &rPoly)
B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY)
B2DHomMatrix createTranslateB2DHomMatrix(double fTranslateX, double fTranslateY)
B2DHomMatrix createRotateB2DHomMatrix(double fRadiant)
B2DPolygon const & createUnitPolygon()
B2DRange getRange(const B2DPolygon &rCandidate)
B2DTuple interpolate(const B2DTuple &rOld1, const B2DTuple &rOld2, double t)
std::shared_ptr< BColorModifier > BColorModifierSharedPtr
B2DTuple absolute(const B2DTuple &rTup)
B2IRange fround(const B2DRange &rRange)
OStringBuffer & padToLength(OStringBuffer &rBuffer, sal_Int32 nLength, char cFill='\0')
LanguageType getDigitLanguage()
Get digit language derived from SvtCTLOptions.
vcl::Font getVclFontFromFontAttribute(const attribute::FontAttribute &rFontAttribute, double fFontScaleX, double fFontScaleY, double fFontRotation, const css::lang::Locale &rLocale)
Create a VCL-Font based on the definitions in FontAttribute and the given FontScaling.
@ TEXT_FONT_EMPHASIS_MARK_DISC
@ TEXT_FONT_EMPHASIS_MARK_CIRCLE
@ TEXT_FONT_EMPHASIS_MARK_ACCENT
@ TEXT_FONT_EMPHASIS_MARK_NONE
@ TEXT_FONT_EMPHASIS_MARK_DOT
FontLineStyle mapTextLineToFontLineStyle(TextLine eLineStyle)
FontStrikeout mapTextStrikeoutToFontStrikeout(TextStrikeout eTextStrikeout)
constexpr bool isPalettePixelFormat(PixelFormat ePixelFormat)