Validate Kashida positions with font fallback
MultiSalLayout did not implement IsKashidaPosValid() which meant that whenever there is a font fallback no Kashida validation was performed. Change-Id: I30e498c356c49b0c06dd6b45187105f6bd758a24
This commit is contained in:
parent
6984fd5a75
commit
d9ea614a1e
@ -243,6 +243,7 @@ public:
|
|||||||
int&, DeviceCoordinate* pGlyphAdvAry = nullptr, int* pCharPosAry = nullptr,
|
int&, DeviceCoordinate* pGlyphAdvAry = nullptr, int* pCharPosAry = nullptr,
|
||||||
const PhysicalFontFace** pFallbackFonts = nullptr ) const override;
|
const PhysicalFontFace** pFallbackFonts = nullptr ) const override;
|
||||||
virtual bool GetOutline( SalGraphics&, basegfx::B2DPolyPolygonVector& ) const override;
|
virtual bool GetOutline( SalGraphics&, basegfx::B2DPolyPolygonVector& ) const override;
|
||||||
|
virtual bool IsKashidaPosValid(int nCharPos) const override;
|
||||||
|
|
||||||
// used only by OutputDevice::ImplLayout, TODO: make friend
|
// used only by OutputDevice::ImplLayout, TODO: make friend
|
||||||
explicit MultiSalLayout( SalLayout& rBaseLayout );
|
explicit MultiSalLayout( SalLayout& rBaseLayout );
|
||||||
|
@ -751,6 +751,11 @@ bool CommonSalLayout::IsKashidaPosValid(int nCharPos) const
|
|||||||
{
|
{
|
||||||
if (pIter->mnCharPos == nCharPos)
|
if (pIter->mnCharPos == nCharPos)
|
||||||
{
|
{
|
||||||
|
// If the character was not supported by this layout, return false
|
||||||
|
// so that fallback layouts would be checked for it.
|
||||||
|
if (pIter->maGlyphId == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
// Search backwards for previous glyph belonging to a different
|
// Search backwards for previous glyph belonging to a different
|
||||||
// character. We are looking backwards because we are dealing with
|
// character. We are looking backwards because we are dealing with
|
||||||
// RTL glyphs, which will be in visual order.
|
// RTL glyphs, which will be in visual order.
|
||||||
|
@ -2027,6 +2027,29 @@ bool MultiSalLayout::GetOutline( SalGraphics& rGraphics,
|
|||||||
return bRet;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MultiSalLayout::IsKashidaPosValid(int nCharPos) const
|
||||||
|
{
|
||||||
|
// Check the base layout
|
||||||
|
bool bValid = mpLayouts[0]->IsKashidaPosValid(nCharPos);
|
||||||
|
|
||||||
|
// If base layout returned false, it might be because the character was not
|
||||||
|
// supported there, so we check fallback layouts.
|
||||||
|
if (!bValid)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < mnLevel; ++i)
|
||||||
|
{
|
||||||
|
// - 1 because there is no fallback run for the base layout, IIUC.
|
||||||
|
if (maFallbackRuns[i - 1].PosIsInAnyRun(nCharPos))
|
||||||
|
{
|
||||||
|
bValid = mpLayouts[i]->IsKashidaPosValid(nCharPos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bValid;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<vcl::TextLayoutCache> SalLayout::CreateTextLayoutCache(
|
std::shared_ptr<vcl::TextLayoutCache> SalLayout::CreateTextLayoutCache(
|
||||||
OUString const&) const
|
OUString const&) const
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user