void OutputDevice::createEmphasisMarks(
FontEmphasisMark nEmphasisMark, tools::Long nEmphasisHeight, const SalLayout& rSalLayout, const std::function<void(const basegfx::B2DPoint&, const basegfx::B2DPolyPolygon&, bool, const tools::Rectangle&, const tools::Rectangle&)>& rCallback) const
{ // tooling method to create geometry data for EmphasisMarks. It does the same // as OutputDevice::ImplDrawEmphasisMarks, but feeds the data into the // callback for further usage
vcl::font::EmphasisMark aEmphasisMark(nEmphasisMark, nEmphasisHeight, GetDPIY());
Point aOffset(0, 0);
Point aOffsetVert(0, 0);
if (nEmphasisMark & FontEmphasisMark::PosBelow)
{
aOffset.AdjustY(mpFontInstance->mxFontMetric->GetDescent() + aEmphasisMark.GetYOffset());
aOffsetVert = aOffset;
} else
{
aOffset.AdjustY(-(mpFontInstance->mxFontMetric->GetAscent() + aEmphasisMark.GetYOffset())); // Todo: use ideographic em-box or ideographic character face information.
aOffsetVert.AdjustY(-(mpFontInstance->mxFontMetric->GetAscent()
+ mpFontInstance->mxFontMetric->GetDescent()
+ aEmphasisMark.GetYOffset()));
}
basegfx::B2DPoint aOutPoint;
basegfx::B2DRectangle aRectangle; const GlyphItem* pGlyph; const LogicalFontInstance* pGlyphFont; int nStart = 0; while (rSalLayout.GetNextGlyph(&pGlyph, aOutPoint, nStart, &pGlyphFont))
{ if (!pGlyph->GetGlyphBoundRect(pGlyphFont, aRectangle)) continue;
if (!pGlyph->IsSpacing())
{
Point aAdjPoint; if (pGlyph->IsVertical())
{
aAdjPoint = aOffsetVert;
aAdjPoint.AdjustX((-pGlyph->origWidth() + aEmphasisMark.GetWidth()) / 2);
} else
{
aAdjPoint = aOffset;
aAdjPoint.AdjustX(aRectangle.getMinX()
+ (aRectangle.getWidth() - aEmphasisMark.GetWidth()) / 2);
}
if (mpFontInstance->mnOrientation)
{
Point aOriginPt(0, 0);
aOriginPt.RotateAround(aAdjPoint, mpFontInstance->mnOrientation);
}
aOutPoint.adjustX(aAdjPoint.X() - nEmphasisWidth2);
aOutPoint.adjustY(aAdjPoint.Y() - nEmphasisHeight2);
// use callback to propagate the data to where it was requested from
rCallback(aOutPoint, aShape, aEmphasisMark.IsShapePolyLine(), aEmphasisMark.GetRect1(),
aEmphasisMark.GetRect2());
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.