[Libreoffice-commits] core.git: Branch 'feature/glyphid-cleanup' - 12 commits - drawinglayer/source editeng/source include/vcl sdext/source vcl/headless vcl/inc vcl/quartz vcl/source vcl/unx vcl/win
Khaled Hosny
khaledhosny at eglug.org
Thu Dec 8 07:08:38 UTC 2016
Rebased ref, commits from common ancestor:
commit 3faa1780b46dcb3522f16f45caee23efa08ba2c0
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 07:17:00 2016 +0200
Drop ComplexDisabled flags that does nothing
There is no such thing as simple text layout in this brave new world.
Change-Id: I641b7efa5ec8fdd9839c291e7f2fdb736361ef1e
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index 900cada..b47d09f 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -262,7 +262,7 @@ namespace drawinglayer
if(rTextCandidate.getFontAttribute().getRTL())
{
- ComplexTextLayoutFlags nRTLLayoutMode(nOldLayoutMode & ~ComplexTextLayoutFlags(ComplexTextLayoutFlags::ComplexDisabled|ComplexTextLayoutFlags::BiDiStrong));
+ ComplexTextLayoutFlags nRTLLayoutMode(nOldLayoutMode & ~ComplexTextLayoutFlags(ComplexTextLayoutFlags::BiDiStrong));
nRTLLayoutMode |= ComplexTextLayoutFlags::BiDiRtl|ComplexTextLayoutFlags::TextOriginLeft;
mpOutputDevice->SetLayoutMode(nRTLLayoutMode);
}
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 2331fe1..463582b 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -679,8 +679,6 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
}
}
- // SW disables ComplexTextLayoutFlags::ComplexDisabled, so maybe I have to enable it...
-
// Saving both layout mode and language (since I'm potentially changing both)
GetRefDevice()->Push( PushFlags::TEXTLAYOUTMODE|PushFlags::TEXTLANGUAGE );
@@ -4255,14 +4253,14 @@ void ImpEditEngine::ImplInitLayoutMode( OutputDevice* pOutDev, sal_Int32 nPara,
if ( !bCTL && !bR2L)
{
- // No CTL/Bidi checking necessary
- nLayoutMode |= ( ComplexTextLayoutFlags::ComplexDisabled | ComplexTextLayoutFlags::BiDiStrong );
+ // No Bidi checking necessary
+ nLayoutMode |= ComplexTextLayoutFlags::BiDiStrong;
}
else
{
- // CTL/Bidi checking necessary
+ // Bidi checking necessary
// Don't use BIDI_STRONG, VCL must do some checks.
- nLayoutMode &= ~ComplexTextLayoutFlags( ComplexTextLayoutFlags::ComplexDisabled | ComplexTextLayoutFlags::BiDiStrong );
+ nLayoutMode &= ~ComplexTextLayoutFlags( ComplexTextLayoutFlags::BiDiStrong );
if ( bR2L )
nLayoutMode |= ComplexTextLayoutFlags::BiDiRtl|ComplexTextLayoutFlags::TextOriginLeft;
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index a77e881..3e50f60 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -955,7 +955,7 @@ void Outliner::PaintBullet( sal_Int32 nPara, const Point& rStartPos,
// VCL will take care of brackets and so on...
ComplexTextLayoutFlags nLayoutMode = pOutDev->GetLayoutMode();
- nLayoutMode &= ~ComplexTextLayoutFlags(ComplexTextLayoutFlags::BiDiRtl|ComplexTextLayoutFlags::ComplexDisabled|ComplexTextLayoutFlags::BiDiStrong);
+ nLayoutMode &= ~ComplexTextLayoutFlags(ComplexTextLayoutFlags::BiDiRtl|ComplexTextLayoutFlags::BiDiStrong);
if ( bRightToLeftPara )
nLayoutMode |= ComplexTextLayoutFlags::BiDiRtl | ComplexTextLayoutFlags::TextOriginLeft | ComplexTextLayoutFlags::BiDiStrong;
pOutDev->SetLayoutMode( nLayoutMode );
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 15bdb8f..7cdda54 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -137,7 +137,6 @@ enum class SalLayoutFlags
KerningPairs = 0x0010,
KerningAsian = 0x0020,
Vertical = 0x0040,
- ComplexDisabled = 0x0100,
EnableLigatures = 0x0200,
SubstituteDigits = 0x0400,
KashidaJustification = 0x0800,
@@ -145,7 +144,7 @@ enum class SalLayoutFlags
};
namespace o3tl
{
- template<> struct typed_flags<SalLayoutFlags> : is_typed_flags<SalLayoutFlags, 0x2f77> {};
+ template<> struct typed_flags<SalLayoutFlags> : is_typed_flags<SalLayoutFlags, 0x2e77> {};
}
typedef std::vector< Rectangle > MetricVector;
diff --git a/include/vcl/outdevstate.hxx b/include/vcl/outdevstate.hxx
index 4a509a1..c1f42f6 100644
--- a/include/vcl/outdevstate.hxx
+++ b/include/vcl/outdevstate.hxx
@@ -67,11 +67,10 @@ enum class ComplexTextLayoutFlags
BiDiStrong = 0x0002,
TextOriginLeft = 0x0004,
TextOriginRight = 0x0008,
- ComplexDisabled = 0x0100,
LigaturesEnabled = 0x0200
};
namespace o3tl {
- template<> struct typed_flags<ComplexTextLayoutFlags> : is_typed_flags<ComplexTextLayoutFlags, 0x030f> {};
+ template<> struct typed_flags<ComplexTextLayoutFlags> : is_typed_flags<ComplexTextLayoutFlags, 0x020f> {};
}
class OutDevState
diff --git a/vcl/source/edit/texteng.cxx b/vcl/source/edit/texteng.cxx
index 4ba1f23..afaa2bf 100644
--- a/vcl/source/edit/texteng.cxx
+++ b/vcl/source/edit/texteng.cxx
@@ -2938,7 +2938,7 @@ void TextEngine::ImpInitLayoutMode( OutputDevice* pOutDev )
{
ComplexTextLayoutFlags nLayoutMode = pOutDev->GetLayoutMode();
- nLayoutMode &= ~ComplexTextLayoutFlags(ComplexTextLayoutFlags::BiDiRtl | ComplexTextLayoutFlags::ComplexDisabled | ComplexTextLayoutFlags::BiDiStrong );
+ nLayoutMode &= ~ComplexTextLayoutFlags(ComplexTextLayoutFlags::BiDiRtl | ComplexTextLayoutFlags::BiDiStrong );
pOutDev->SetLayoutMode( nLayoutMode );
}
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index a8833b2..da551d7 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -9416,7 +9416,7 @@ void PDFWriterImpl::drawStrikeoutChar( const Point& rPos, long nWidth, FontStrik
// strikeout string is left aligned non-CTL text
ComplexTextLayoutFlags nOrigTLM = m_pReferenceDevice->GetLayoutMode();
- m_pReferenceDevice->SetLayoutMode( ComplexTextLayoutFlags::BiDiStrong|ComplexTextLayoutFlags::ComplexDisabled );
+ m_pReferenceDevice->SetLayoutMode(ComplexTextLayoutFlags::BiDiStrong);
push( PushFlags::CLIPREGION );
FontMetric aRefDevFontMetric = m_pReferenceDevice->GetFontMetric();
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 90c0108..7f8ff11 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -71,7 +71,6 @@ std::ostream &operator <<(std::ostream& s, ImplLayoutArgs &rArgs)
TEST(KerningPairs);
TEST(KerningAsian);
TEST(Vertical);
- TEST(ComplexDisabled);
TEST(EnableLigatures);
TEST(SubstituteDigits);
TEST(KashidaJustification);
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index c94b21d..73fc0a0 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -1209,50 +1209,6 @@ ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( OUString& rStr,
if( mnTextLayoutMode & ComplexTextLayoutFlags::LigaturesEnabled )
nLayoutFlags |= SalLayoutFlags::EnableLigatures;
- else if( mnTextLayoutMode & ComplexTextLayoutFlags::ComplexDisabled )
- nLayoutFlags |= SalLayoutFlags::ComplexDisabled;
- else
- {
- // disable CTL for non-CTL text
- const sal_Unicode* pStr = rStr.getStr() + nMinIndex;
- const sal_Unicode* pEnd = rStr.getStr() + nEndIndex;
- bool bIsCJKIdeograph = false;
- for( ; pStr < pEnd; ++pStr )
- {
- if (pStr + 1 < pEnd && rtl::isHighSurrogate(pStr[0]) && rtl::isLowSurrogate(pStr[1]))
- {
- sal_uInt32 nCode = rtl::combineSurrogates( pStr[0] , pStr[1] );
- if ( !bIsCJKIdeograph && nCode >= 0xE0100 && nCode < 0xE01F0 ) // Variation Selector Supplements
- break;
-
- if ( nCode >= 0x20000 && nCode <= 0x2CEB0 )// CJK Unified Ideographs Extension B-E
- bIsCJKIdeograph = true;
- ++pStr;
- continue;
- }
-
- if ( ((*pStr >= 0xF900) && (*pStr < 0xFB00)) // CJK Compatibility Ideographs
- || ((*pStr >= 0x3400) && (*pStr < 0xA000)) // CJK Unified Ideographs and Extension A
- )
- {
- bIsCJKIdeograph = true;
- continue;
- }
-
- if( ((*pStr >= 0x0300) && (*pStr < 0x0370)) // diacritical marks
- || ((*pStr >= 0x0590) && (*pStr < 0x10A0)) // many CTL scripts
- || ((*pStr >= 0x1100) && (*pStr < 0x1200)) // hangul jamo
- || ((*pStr >= 0x1700) && (*pStr < 0x1900)) // many CTL scripts
- || ((*pStr >= 0xFB1D) && (*pStr < 0xFE00)) // middle east presentation
- || ((*pStr >= 0xFE70) && (*pStr < 0xFEFF)) // arabic presentation B
- || (!bIsCJKIdeograph && (*pStr >= 0xFE00) && (*pStr < 0xFE10)) // variation selectors in BMP
- )
- break;
- bIsCJKIdeograph = false;
- }
- if( pStr >= pEnd )
- nLayoutFlags |= SalLayoutFlags::ComplexDisabled;
- }
if( meTextLanguage ) //TODO: (mnTextLayoutMode & ComplexTextLayoutFlags::SubstituteDigits)
{
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index 597e546..9cc84d0 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -630,7 +630,7 @@ void OutputDevice::ImplDrawStrikeoutChar( long nBaseX, long nBaseY,
// strikeout text has to be left aligned
ComplexTextLayoutFlags nOrigTLM = mnTextLayoutMode;
- mnTextLayoutMode = ComplexTextLayoutFlags::BiDiStrong | ComplexTextLayoutFlags::ComplexDisabled;
+ mnTextLayoutMode = ComplexTextLayoutFlags::BiDiStrong;
pLayout = ImplLayout( aStrikeoutText, 0, aStrikeoutText.getLength() );
mnTextLayoutMode = nOrigTLM;
commit ad6f75e7ad81a42c365d75aceac07a54cece82d0
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 07:04:27 2016 +0200
Drop a hack for Type 1, the future is here
The original issue for reference:
https://bz.apache.org/ooo/show_bug.cgi?id=36691
Change-Id: I3b68c2c9f7cb94445875ef5a005e73dcfe65fa3a
diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx
index 2ab31c8..c326a3a 100644
--- a/include/vcl/svapp.hxx
+++ b/include/vcl/svapp.hxx
@@ -83,7 +83,6 @@ namespace awt {
} } }
// helper needed by SalLayout implementations as well as svx/source/dialog/svxbmpnumbalueset.cxx
-VCL_DLLPUBLIC sal_UCS4 GetMirroredChar( sal_UCS4 );
VCL_DLLPUBLIC sal_UCS4 GetLocalizedChar( sal_UCS4, LanguageType );
enum class SystemWindowFlags {
diff --git a/sdext/source/pdfimport/tree/pdfiprocessor.cxx b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
index dbc9436..6cb2c22 100644
--- a/sdext/source/pdfimport/tree/pdfiprocessor.cxx
+++ b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
@@ -736,7 +736,7 @@ OUString PDFIProcessor::mirrorString( const OUString& i_rString )
const sal_uInt32 nCodePoint = i_rString.iterateCodePoints( &i );
// and append it mirrored
- aMirror.appendUtf32( GetMirroredChar(nCodePoint) );
+ aMirror.appendUtf32(u_charMirror(nCodePoint);
}
return aMirror.makeStringAndClear();
}
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 1f5b83d..a8833b2 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -8621,18 +8621,6 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
}
else
aUnicodes.push_back(rText[pGlyphs[i]->mnCharPos]);
- // #i36691# hack that is needed because currently the pGlyphs[]
- // argument is ignored for embeddable fonts and so the layout
- // engine's glyph work is ignored (i.e. char mirroring)
- // TODO: a real solution would be to map the layout engine's
- // glyphid (i.e. FreeType's synthetic glyphid for a Type1 font)
- // back to unicode and then to embeddable font's encoding
- if( (getReferenceDevice()->GetLayoutMode() & ComplexTextLayoutFlags::BiDiRtl) != ComplexTextLayoutFlags::Default )
- {
- size_t nI = aUnicodes.size()-1;
- for( int n = 0; n < nChars; n++, nI-- )
- aUnicodes[nI] = static_cast<sal_Ucs>(GetMirroredChar(aUnicodes[nI]));
- }
}
else
aUnicodes.push_back( 0 );
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 877d7e5..90c0108 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -133,12 +133,6 @@ std::ostream &operator <<(std::ostream& s, ImplLayoutArgs &rArgs)
return s;
}
-sal_UCS4 GetMirroredChar( sal_UCS4 nChar )
-{
- nChar = u_charMirror( nChar );
- return nChar;
-}
-
sal_UCS4 GetLocalizedChar( sal_UCS4 nChar, LanguageType eLang )
{
// currently only conversion from ASCII digits is interesting
commit 526a6948d3fb794324db3fb046091a464266eced
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 07:00:02 2016 +0200
Drop SalLayout::IsSpacingGlyph()
Replace it with a check from ICU that actually makes sense.
Change-Id: Ie8789444a967420d58f5575f42bc45677bfa96a1
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index ee41051..447cc39 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -182,8 +182,6 @@ public:
virtual bool GetOutline( SalGraphics&, basegfx::B2DPolyPolygonVector& ) const;
virtual bool GetBoundRect( SalGraphics&, Rectangle& ) const;
- static bool IsSpacingGlyph( sal_GlyphId );
-
// reference counting
void Release() const;
@@ -321,13 +319,15 @@ public:
IS_RTL_GLYPH = 0x002,
IS_DIACRITIC = 0x004,
IS_VERTICAL = 0x008,
- ALLOW_KASHIDA = 0X010
+ IS_SPACING = 0x010,
+ ALLOW_KASHIDA = 0x020
};
bool IsClusterStart() const { return ((mnFlags & IS_IN_CLUSTER) == 0); }
bool IsRTLGlyph() const { return ((mnFlags & IS_RTL_GLYPH) != 0); }
bool IsDiacritic() const { return ((mnFlags & IS_DIACRITIC) != 0); }
bool IsVertical() const { return ((mnFlags & IS_VERTICAL) != 0); }
+ bool IsSpacing() const { return ((mnFlags & IS_SPACING) != 0); }
bool AllowKashida() const { return ((mnFlags & ALLOW_KASHIDA) != 0); }
};
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 27394c7..2c059ef 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -600,10 +600,13 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
if (u_getIntPropertyValue(aChar, UCHAR_GENERAL_CATEGORY) == U_NON_SPACING_MARK)
nGlyphFlags |= GlyphItem::IS_DIACRITIC;
+ if (u_isUWhiteSpace(aChar))
+ nGlyphFlags |= GlyphItem::IS_SPACING;
+
if ((aSubRun.maScript == HB_SCRIPT_ARABIC ||
aSubRun.maScript == HB_SCRIPT_SYRIAC) &&
HB_DIRECTION_IS_BACKWARD(aSubRun.maDirection) &&
- !u_isUWhiteSpace(aChar))
+ (nGlyphFlags & GlyphItem::IS_SPACING) == 0)
{
nGlyphFlags |= GlyphItem::ALLOW_KASHIDA;
rArgs.mnFlags |= SalLayoutFlags::KashidaJustification;
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 34bc0d5..1f5b83d 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -8706,7 +8706,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
int nStart = 0;
while (rLayout.GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
- if (!SalLayout::IsSpacingGlyph(pGlyph->maGlyphId))
+ if (!pGlyph->IsSpacing())
{
if( !nWidth )
aStartPt = aPos;
@@ -8803,7 +8803,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
int nStart = 0;
while (rLayout.GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
- if (!SalLayout::IsSpacingGlyph(pGlyph->maGlyphId))
+ if (pGlyph->IsSpacing())
{
Point aAdjOffset = aOffset;
aAdjOffset.X() += (pGlyph->mnNewWidth - nEmphWidth) / 2;
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 1567d60..877d7e5 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -722,16 +722,6 @@ bool SalLayout::GetBoundRect( SalGraphics& rSalGraphics, Rectangle& rRect ) cons
return bRet;
}
-// FIXME: This function is just broken, it assumes any glyph at index 3 in the
-// font is space, which though common is not a hard requirement and not the
-// only glyph for space characters. Fix the call sites and fix them.
-bool SalLayout::IsSpacingGlyph( sal_GlyphId nGlyph )
-{
- bool bRet = false;
- bRet = (nGlyph == 3);
- return bRet;
-}
-
GenericSalLayout::GenericSalLayout()
{}
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index 3820d42..fe54a3d 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -1303,7 +1303,7 @@ void OutputDevice::ImplDrawEmphasisMarks( SalLayout& rSalLayout )
if (!mpGraphics->GetGlyphBoundRect(*pGlyph, aRectangle ) )
continue;
- if (!SalLayout::IsSpacingGlyph(pGlyph->maGlyphId))
+ if (!pGlyph->IsSpacing())
{
Point aAdjPoint = aOffset;
aAdjPoint.X() += aRectangle.Left() + (aRectangle.GetWidth() - nEmphasisWidth) / 2;
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index de16c79..597e546 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -757,7 +757,7 @@ void OutputDevice::ImplDrawTextLines( SalLayout& rSalLayout, FontStrikeout eStri
while (!rSalLayout.GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
// calculate the boundaries of each word
- if (!SalLayout::IsSpacingGlyph(pGlyph->maGlyphId))
+ if (!pGlyph->IsSpacing())
{
if( !nWidth )
{
commit 5a49a9fe95a9fcfe880533188a4cc01939366cfa
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 06:37:42 2016 +0200
Remove noop SalLayout::UseCommonLayout()
Change-Id: Ifc143f33bc4e087726ada1e3b1b5182bf830b0cb
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index b74e57e..ee41051 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -196,8 +196,6 @@ public:
virtual std::shared_ptr<vcl::TextLayoutCache>
CreateTextLayoutCache(OUString const&) const;
- static bool UseCommonLayout();
-
protected:
// used by layout engines
SalLayout();
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 6593f70..1567d60 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -732,11 +732,6 @@ bool SalLayout::IsSpacingGlyph( sal_GlyphId nGlyph )
return bRet;
}
-bool SalLayout::UseCommonLayout()
-{
- return true;
-}
-
GenericSalLayout::GenericSalLayout()
{}
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index fdf9837..65c909f 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1062,10 +1062,9 @@ int CALLBACK SalEnumFontsProcExW( const LOGFONTW* lpelfe,
if (nFontType & RASTER_FONTTYPE)
return 1;
- // Ignore font formats not supported by CommonSalLayout.
- if (SalLayout::UseCommonLayout())
- if ((pMetric->ntmTm.ntmFlags & NTM_TYPE1) || (pMetric->ntmTm.ntmFlags & NTM_MULTIPLEMASTER))
- return 1;
+ // Ignore font formats we don’t support.
+ if ((pMetric->ntmTm.ntmFlags & NTM_TYPE1) || (pMetric->ntmTm.ntmFlags & NTM_MULTIPLEMASTER))
+ return 1;
WinFontFace* pData = ImplLogMetricToDevFontDataW( pLogFont, &(pMetric->ntmTm), nFontType );
pData->SetFontId( sal_IntPtr( pInfo->mnFontCount++ ) );
commit 07b690689a6b23e7d303ea031e7b810e0a676f6e
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 06:21:23 2016 +0200
GF_VERT is only used once, move it
Change-Id: I15289eecfbfb29ee549470a7f752e0c7fd9f811e
diff --git a/vcl/inc/salglyphid.hxx b/vcl/inc/salglyphid.hxx
index 6d5480e..8047d50 100644
--- a/vcl/inc/salglyphid.hxx
+++ b/vcl/inc/salglyphid.hxx
@@ -22,14 +22,6 @@
typedef sal_uInt32 sal_GlyphId;
// Glyph Flags
-#ifdef _WIN32
-// caution !!!
-#define GF_VERT 0x02000000
-// GF_VERT is only for windows implementation
-// (win/gdi/salgdi3.cxx, win/gdi/winlayout.cxx)
-// don't use this elsewhere !!!
-#endif
-
#define GF_FONTMASK 0xF0000000
#define GF_FONTSHIFT 28
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index a405f0d..ef62ff3 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -296,7 +296,7 @@ bool ExTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
bGlyphs = true;
WORD glyphWStr[] = { pGlyph->maGlyphId };
if (pGlyph->IsVertical())
- glyphWStr[0] |= GF_VERT;
+ glyphWStr[0] |= 0x02000000; // A (undocumented?) GDI flag for vertical glyphs
ExtTextOutW(hDC, pPos->X(), pPos->Y(), ETO_GLYPH_INDEX, nullptr, LPCWSTR(&glyphWStr), 1, nullptr);
}
commit 45f111798a887f1e56ba7f1b279c2726de1f6353
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 05:57:40 2016 +0200
sal_GlyphId is a simple glyph id now
No more cleverness.
Change-Id: I760c602802961b37728c6987c4ade14fb02ca034
diff --git a/vcl/inc/salglyphid.hxx b/vcl/inc/salglyphid.hxx
index 72cf4fc..6d5480e 100644
--- a/vcl/inc/salglyphid.hxx
+++ b/vcl/inc/salglyphid.hxx
@@ -19,13 +19,9 @@
#ifndef INCLUDED_VCL_INC_SALGLYPHID_HXX
#define INCLUDED_VCL_INC_SALGLYPHID_HXX
-// TODO: sal_GlyphId should become a class...
typedef sal_uInt32 sal_GlyphId;
// Glyph Flags
-#define GF_FLAGMASK 0xFF800000
-#define GF_IDXMASK ~GF_FLAGMASK
-
#ifdef _WIN32
// caution !!!
#define GF_VERT 0x02000000
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 52062eb..f5ea6db 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -154,7 +154,7 @@ SAL_WNODEPRECATED_DECLARATIONS_POP
bool CoreTextStyle::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect ) const
{
- CGGlyph nCGGlyph = rGlyph.maGlyphId & GF_IDXMASK;
+ CGGlyph nCGGlyph = rGlyph.maGlyphId;
CTFontRef aCTFontRef = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName ));
SAL_WNODEPRECATED_DECLARATIONS_PUSH //TODO: 10.11 kCTFontDefaultOrientation
@@ -229,7 +229,7 @@ bool CoreTextStyle::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPol
{
rResult.clear();
- CGGlyph nCGGlyph = rGlyph.maGlyphId & GF_IDXMASK;
+ CGGlyph nCGGlyph = rGlyph.maGlyphId;
CTFontRef pCTFont = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName ));
CGPathRef xPath = CTFontCreatePathForGlyph( pCTFont, nCGGlyph, nullptr );
if (!xPath)
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 0df8955..e38f5d2 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -442,7 +442,7 @@ void AquaSalGraphics::DrawTextLayout(const CommonSalLayout& rLayout)
}
}
- aGlyphIds.push_back(pGlyph->maGlyphId & GF_IDXMASK);
+ aGlyphIds.push_back(pGlyph->maGlyphId);
aGlyphPos.push_back(aGCPos);
aGlyphOrientation.push_back(bUprightGlyph);
}
diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx
index 57a930a..2222e06 100644
--- a/vcl/quartz/salgdicommon.cxx
+++ b/vcl/quartz/salgdicommon.cxx
@@ -274,7 +274,7 @@ bool AquaSalGraphics::CreateFontSubset( const OUString& rToFile,
{
aTempEncs[i] = pEncoding[i];
- sal_GlyphId aGlyphId(pGlyphIds[i] & GF_IDXMASK);
+ sal_GlyphId aGlyphId(pGlyphIds[i]);
aShortIDs[i] = static_cast<sal_uInt16>( aGlyphId );
if( !aGlyphId && nNotDef < 0 )
{
diff --git a/vcl/source/gdi/pdffontcache.cxx b/vcl/source/gdi/pdffontcache.cxx
index 8140db7..67a8614 100644
--- a/vcl/source/gdi/pdffontcache.cxx
+++ b/vcl/source/gdi/pdffontcache.cxx
@@ -58,10 +58,8 @@ sal_Int32 PDFFontCache::getGlyphWidth( const PhysicalFontFace* pFont, sal_GlyphI
}
if( ! rFontData.m_nWidths.empty() )
{
- sal_GlyphId nIndex = nGlyph;
- nIndex &= GF_IDXMASK;
- if( nIndex < rFontData.m_nWidths.size() )
- nWidth = rFontData.m_nWidths[ nIndex ];
+ if (nGlyph < rFontData.m_nWidths.size())
+ nWidth = rFontData.m_nWidths[nGlyph];
}
return nWidth;
}
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 4770644..34bc0d5 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -8144,7 +8144,7 @@ void PDFWriterImpl::registerGlyphs( int nGlyphs,
sal_Ucs* pCurUnicode = pUnicodes;
for( int i = 0; i < nGlyphs; pCurUnicode += pUnicodesPerGlyph[i] , i++ )
{
- const int nFontGlyphId = pGlyphs[i]->maGlyphId & GF_IDXMASK;
+ const int nFontGlyphId = pGlyphs[i]->maGlyphId;
const PhysicalFontFace* pCurrentFont = pFallbackFonts[i] ? pFallbackFonts[i] : pDevFont;
FontSubset& rSubset = m_aSubsets[ pCurrentFont ];
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 3029bc7..6593f70 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -728,7 +728,7 @@ bool SalLayout::GetBoundRect( SalGraphics& rSalGraphics, Rectangle& rRect ) cons
bool SalLayout::IsSpacingGlyph( sal_GlyphId nGlyph )
{
bool bRet = false;
- bRet = ((nGlyph & GF_IDXMASK) == 3);
+ bRet = (nGlyph == 3);
return bRet;
}
@@ -978,7 +978,6 @@ int GenericSalLayout::GetNextGlyphs(int nLen, const GlyphItem** pGlyphs,
// find more glyphs which can be merged into one drawing instruction
int nCount = 0;
long nYPos = pGlyphIter->maLinearPos.Y();
- long nOldFlags = pGlyphIter->maGlyphId;
for(;;)
{
// update return data with glyph info
@@ -1008,12 +1007,6 @@ int GenericSalLayout::GetNextGlyphs(int nLen, const GlyphItem** pGlyphs,
int n = pGlyphIter->mnCharPos;
if( (n < mnMinCharPos) || (mnEndCharPos <= n) )
break;
-
- // stop when glyph flags change
- if( (nOldFlags ^ pGlyphIter->maGlyphId) & GF_FLAGMASK )
- break;
-
- nOldFlags = pGlyphIter->maGlyphId; // &GF_FLAGMASK not needed for test above
}
aRelativePos.X() /= mnUnitsPerPixel;
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 2d66822..c94b21d 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -2394,7 +2394,7 @@ SystemTextLayoutData OutputDevice::GetSysTextLayoutData(const Point& rStartPt, c
while (pLayout->GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
SystemGlyphData aSystemGlyph;
- aSystemGlyph.index = static_cast<unsigned long> (pGlyph->maGlyphId & GF_IDXMASK);
+ aSystemGlyph.index = static_cast<unsigned long> (pGlyph->maGlyphId);
aSystemGlyph.x = aPos.X();
aSystemGlyph.y = aPos.Y();
int nLevel = pGlyph->mnFallbackLevel;
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index ec025b8..b3f6165 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -178,7 +178,7 @@ void CairoTextRender::DrawTextLayout(const CommonSalLayout& rLayout)
while (rLayout.GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
cairo_glyph_t aGlyph;
- aGlyph.index = pGlyph->maGlyphId & GF_IDXMASK;
+ aGlyph.index = pGlyph->maGlyphId;
aGlyph.x = aPos.X();
aGlyph.y = aPos.Y();
cairo_glyphs.push_back(aGlyph);
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 039ffad..cc5683c 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -685,7 +685,7 @@ void FreetypeFont::InitGlyphData(const GlyphItem& rGlyph, GlyphData& rGD ) const
{
FT_Activate_Size( maSizeFT );
- FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId & GF_IDXMASK, mnLoadFlags);
+ FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId, mnLoadFlags);
if( rc != FT_Err_Ok )
{
@@ -998,7 +998,7 @@ bool FreetypeFont::GetGlyphOutline(const GlyphItem& rGlyph,
nLoadFlags |= FT_LOAD_TARGET_LIGHT;
#endif
- FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId & GF_IDXMASK, nLoadFlags);
+ FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId, nLoadFlags);
if( rc != FT_Err_Ok )
return false;
diff --git a/vcl/unx/generic/glyphs/glyphcache.cxx b/vcl/unx/generic/glyphs/glyphcache.cxx
index b41f7c0..103fc54 100644
--- a/vcl/unx/generic/glyphs/glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/glyphcache.cxx
@@ -307,7 +307,7 @@ long FreetypeFont::Release() const
const GlyphMetric& FreetypeFont::GetGlyphMetric(const GlyphItem& rGlyph)
{
// usually the GlyphData is cached
- GlyphList::iterator it = maGlyphList.find(rGlyph.maGlyphId & GF_IDXMASK);
+ GlyphList::iterator it = maGlyphList.find(rGlyph.maGlyphId);
if( it != maGlyphList.end() ) {
GlyphData& rGlyphData = it->second;
GlyphCache::GetInstance().UsingGlyph( *this, rGlyphData );
@@ -315,7 +315,7 @@ const GlyphMetric& FreetypeFont::GetGlyphMetric(const GlyphItem& rGlyph)
}
// sometimes not => we need to create and initialize it ourselves
- GlyphData& rGlyphData = maGlyphList[rGlyph.maGlyphId & GF_IDXMASK];
+ GlyphData& rGlyphData = maGlyphList[rGlyph.maGlyphId];
mnBytesUsed += sizeof( GlyphData );
InitGlyphData(rGlyph, rGlyphData);
GlyphCache::GetInstance().AddedGlyph( *this, rGlyphData );
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 30f22e6..fdf9837 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1369,7 +1369,7 @@ bool WinSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect
GLYPHMETRICS aGM;
aGM.gmptGlyphOrigin.x = aGM.gmptGlyphOrigin.y = 0;
aGM.gmBlackBoxX = aGM.gmBlackBoxY = 0;
- DWORD nSize = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId & GF_IDXMASK, nGGOFlags, &aGM, 0, nullptr, &aMat);
+ DWORD nSize = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId, nGGOFlags, &aGM, 0, nullptr, &aMat);
if( nSize == GDI_ERROR )
return false;
@@ -1398,14 +1398,14 @@ bool WinSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph,
nGGOFlags |= GGO_GLYPH_INDEX;
GLYPHMETRICS aGlyphMetrics;
- const DWORD nSize1 = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId & GF_IDXMASK, nGGOFlags, &aGlyphMetrics, 0, nullptr, &aMat);
+ const DWORD nSize1 = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId, nGGOFlags, &aGlyphMetrics, 0, nullptr, &aMat);
if( !nSize1 ) // blank glyphs are ok
return true;
else if( nSize1 == GDI_ERROR )
return false;
BYTE* pData = new BYTE[ nSize1 ];
- const DWORD nSize2 = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId & GF_IDXMASK, nGGOFlags,
+ const DWORD nSize2 = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId, nGGOFlags,
&aGlyphMetrics, nSize1, pData, &aMat );
if( nSize1 != nSize2 )
@@ -1662,23 +1662,13 @@ bool WinSalGraphics::CreateFontSubset( const OUString& rToFile,
{
pWinFontData->UpdateFromHDC( getHDC() );
FontCharMapRef xFontCharMap = pWinFontData->GetFontCharMap();
-
- sal_GlyphId aRealGlyphIds[ 256 ];
- for( int i = 0; i < nGlyphCount; ++i )
- {
- // TODO: remap notdef glyph if needed
- // TODO: use GDI's GetGlyphIndices instead? Does it handle GSUB properly?
- sal_GlyphId aGlyphId = pGlyphIds[i] & GF_IDXMASK;
- aRealGlyphIds[i] = aGlyphId;
- }
-
xFontCharMap = nullptr;
// provide a font subset from the CFF-table
FILE* pOutFile = fopen( aToFile.getStr(), "wb" );
rInfo.LoadFont( FontSubsetInfo::CFF_FONT, aRawCffData.get(), aRawCffData.size() );
bool bRC = rInfo.CreateFontSubset( FontSubsetInfo::TYPE1_PFB, pOutFile, nullptr,
- aRealGlyphIds, pEncoding, nGlyphCount, pGlyphWidths );
+ pGlyphIds, pEncoding, nGlyphCount, pGlyphWidths );
fclose( pOutFile );
return bRC;
}
@@ -1718,9 +1708,8 @@ bool WinSalGraphics::CreateFontSubset( const OUString& rToFile,
for( i = 0; i < nGlyphCount; ++i )
{
aTempEncs[i] = pEncoding[i];
- sal_GlyphId aGlyphId = pGlyphIds[i] & GF_IDXMASK;
- aShortIDs[i] = static_cast<sal_uInt16>( aGlyphId );
- if( !aGlyphId )
+ aShortIDs[i] = static_cast<sal_uInt16>(pGlyphIds[i]);
+ if (!aShortIDs[i])
if( nNotDef < 0 )
nNotDef = i; // first NotDef glyph found
}
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index c246f55..a405f0d 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -294,7 +294,7 @@ bool ExTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
while (rLayout.GetNextGlyphs(1, &pGlyph, *pPos, *pGetNextGlypInfo))
{
bGlyphs = true;
- WORD glyphWStr[] = { pGlyph->maGlyphId & GF_IDXMASK };
+ WORD glyphWStr[] = { pGlyph->maGlyphId };
if (pGlyph->IsVertical())
glyphWStr[0] |= GF_VERT;
ExtTextOutW(hDC, pPos->X(), pPos->Y(), ETO_GLYPH_INDEX, nullptr, LPCWSTR(&glyphWStr), 1, nullptr);
@@ -391,7 +391,7 @@ bool D2DWriteTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
mpFontFace,
mlfEmHeight,
1,
- { static_cast<UINT16>(pGlyph->maGlyphId & GF_IDXMASK) },
+ { static_cast<UINT16>(pGlyph->maGlyphId) },
{ static_cast<FLOAT>(pGlyph->mnNewWidth) },
{ { 0.0f, 0.0f } },
false,
@@ -542,7 +542,7 @@ bool D2DWriteTextOutRenderer::GetDWriteInkBox(SalLayout const &rLayout, Rectangl
while (rLayout.GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
positions.push_back(aPos);
- indices.push_back(pGlyph->maGlyphId & GF_IDXMASK);
+ indices.push_back(pGlyph->maGlyphId);
vertical.push_back(pGlyph->IsVertical());
}
commit a85a6990661e7ab4e0b559731404a50edb14c629
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 05:38:08 2016 +0200
Don’t encode font fallback level in the glyph id
Change-Id: I747d969c3c1dc42b1a3b5d12d06fed3af9a64675
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 15e2b6e..b74e57e 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -281,6 +281,8 @@ struct GlyphItem
sal_GlyphId maGlyphId;
Point maLinearPos; // absolute position of non rotated string
+ int mnFallbackLevel;
+
public:
GlyphItem()
: mnFlags(0)
@@ -289,6 +291,7 @@ public:
, mnNewWidth(0)
, mnXOffset(0)
, maGlyphId(0)
+ , mnFallbackLevel(0)
{ }
GlyphItem( int nCharPos, sal_GlyphId aGlyphId, const Point& rLinearPos,
@@ -300,6 +303,7 @@ public:
, mnXOffset(0)
, maGlyphId(aGlyphId)
, maLinearPos(rLinearPos)
+ , mnFallbackLevel(0)
{ }
GlyphItem( int nCharPos, sal_GlyphId aGlyphId, const Point& rLinearPos,
@@ -311,6 +315,7 @@ public:
, mnXOffset(nXOffset)
, maGlyphId(aGlyphId)
, maLinearPos(rLinearPos)
+ , mnFallbackLevel(0)
{ }
enum {
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index c8f9c75..0df8955 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -384,7 +384,7 @@ bool AquaSalGraphics::AddTempDevFont( PhysicalFontCollection*,
bool AquaSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon& rPolyPoly)
{
- const int nFallbackLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
+ const int nFallbackLevel = rGlyph.mnFallbackLevel;
if (nFallbackLevel < MAX_FALLBACK && mpTextStyle[nFallbackLevel])
{
const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphOutline(rGlyph, rPolyPoly);
@@ -395,7 +395,7 @@ bool AquaSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyP
bool AquaSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect )
{
- const int nFallbackLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
+ const int nFallbackLevel = rGlyph.mnFallbackLevel;
if (nFallbackLevel < MAX_FALLBACK && mpTextStyle[nFallbackLevel])
{
const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphBoundRect(rGlyph, rRect);
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 6f3b082..3029bc7 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -1615,8 +1615,8 @@ int MultiSalLayout::GetNextGlyphs(int nLen, const GlyphItem** pGlyphs,
nStart |= nFontTag;
for( int i = 0; i < nRetVal; ++i )
{
- // FIXME: This is ugly!
- const_cast<GlyphItem*>(pGlyphs[i])->maGlyphId |= nFontTag;
+ // FIXME: This cast is ugly!
+ const_cast<GlyphItem*>(pGlyphs[i])->mnFallbackLevel = nLevel;
if( pFallbackFonts )
{
pFallbackFonts[ i ] = mpFallbackFonts[ nLevel ];
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 93deefe..2d66822 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -2397,7 +2397,7 @@ SystemTextLayoutData OutputDevice::GetSysTextLayoutData(const Point& rStartPt, c
aSystemGlyph.index = static_cast<unsigned long> (pGlyph->maGlyphId & GF_IDXMASK);
aSystemGlyph.x = aPos.X();
aSystemGlyph.y = aPos.Y();
- int nLevel = (pGlyph->maGlyphId & GF_FONTMASK) >> GF_FONTSHIFT;
+ int nLevel = pGlyph->mnFallbackLevel;
aSystemGlyph.fallbacklevel = nLevel < MAX_FALLBACK ? nLevel : 0;
aSysLayoutData.rGlyphData.push_back(aSystemGlyph);
}
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index a188ad3..ec025b8 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -427,7 +427,7 @@ void CairoTextRender::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nF
bool CairoTextRender::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect)
{
- const int nLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
+ const int nLevel = rGlyph.mnFallbackLevel;
if( nLevel >= MAX_FALLBACK )
return false;
@@ -457,7 +457,7 @@ bool CairoTextRender::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRec
bool CairoTextRender::GetGlyphOutline(const GlyphItem& rGlyph,
basegfx::B2DPolyPolygon& rPolyPoly )
{
- const int nLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
+ const int nLevel = rGlyph.mnFallbackLevel;
if( nLevel >= MAX_FALLBACK )
return false;
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index 2c6d106..c2ffe9b 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -760,7 +760,7 @@ void GenPspGraphics::GetFontMetric(ImplFontMetricDataRef& rxFontMetric, int nFal
bool GenPspGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect)
{
- const int nLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
+ const int nLevel = rGlyph.mnFallbackLevel;
if( nLevel >= MAX_FALLBACK )
return false;
@@ -776,7 +776,7 @@ bool GenPspGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect
bool GenPspGraphics::GetGlyphOutline(const GlyphItem& rGlyph,
basegfx::B2DPolyPolygon& rB2DPolyPoly )
{
- const int nLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
+ const int nLevel = rGlyph.mnFallbackLevel;
if( nLevel >= MAX_FALLBACK )
return false;
commit 22e04f1a3401d6b40809b927f7eddb6c9f06004a
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 04:46:32 2016 +0200
Minor
Change-Id: I5e3480b647ec3851e9125188d9cd04227050dc6d
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 10e625b..15e2b6e 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -283,29 +283,35 @@ struct GlyphItem
public:
GlyphItem()
- : mnFlags(0)
- , mnCharPos(0)
- , mnOrigWidth(0)
- , mnNewWidth(0)
- , mnXOffset(0)
- , maGlyphId(0)
- {}
+ : mnFlags(0)
+ , mnCharPos(0)
+ , mnOrigWidth(0)
+ , mnNewWidth(0)
+ , mnXOffset(0)
+ , maGlyphId(0)
+ { }
GlyphItem( int nCharPos, sal_GlyphId aGlyphId, const Point& rLinearPos,
long nFlags, int nOrigWidth )
- : mnFlags(nFlags), mnCharPos(nCharPos),
- mnOrigWidth(nOrigWidth), mnNewWidth(nOrigWidth),
- mnXOffset(0),
- maGlyphId(aGlyphId), maLinearPos(rLinearPos)
- {}
+ : mnFlags(nFlags)
+ , mnCharPos(nCharPos)
+ , mnOrigWidth(nOrigWidth)
+ , mnNewWidth(nOrigWidth)
+ , mnXOffset(0)
+ , maGlyphId(aGlyphId)
+ , maLinearPos(rLinearPos)
+ { }
GlyphItem( int nCharPos, sal_GlyphId aGlyphId, const Point& rLinearPos,
long nFlags, int nOrigWidth, int nXOffset )
- : mnFlags(nFlags), mnCharPos(nCharPos),
- mnOrigWidth(nOrigWidth), mnNewWidth(nOrigWidth),
- mnXOffset(nXOffset),
- maGlyphId(aGlyphId), maLinearPos(rLinearPos)
- {}
+ : mnFlags(nFlags)
+ , mnCharPos(nCharPos)
+ , mnOrigWidth(nOrigWidth)
+ , mnNewWidth(nOrigWidth)
+ , mnXOffset(nXOffset)
+ , maGlyphId(aGlyphId)
+ , maLinearPos(rLinearPos)
+ { }
enum {
IS_IN_CLUSTER = 0x001,
commit 1ac7abf618442315ec9b76e16549471443c2aad5
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 04:39:16 2016 +0200
Don’t encode the vertical flag in the glyph id
Change-Id: I00485dd4d42004e4eaa163a9e6ad0a43cf98a30a
diff --git a/vcl/inc/salglyphid.hxx b/vcl/inc/salglyphid.hxx
index dbfd95e..72cf4fc 100644
--- a/vcl/inc/salglyphid.hxx
+++ b/vcl/inc/salglyphid.hxx
@@ -23,10 +23,8 @@
typedef sal_uInt32 sal_GlyphId;
// Glyph Flags
-#define GF_NONE 0x00000000
#define GF_FLAGMASK 0xFF800000
#define GF_IDXMASK ~GF_FLAGMASK
-#define GF_ROTL 0x01000000
#ifdef _WIN32
// caution !!!
@@ -36,8 +34,6 @@ typedef sal_uInt32 sal_GlyphId;
// don't use this elsewhere !!!
#endif
-#define GF_ROTR 0x03000000
-#define GF_ROTMASK 0x03000000
#define GF_FONTMASK 0xF0000000
#define GF_FONTSHIFT 28
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 21a1e0b..10e625b 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -311,12 +311,14 @@ public:
IS_IN_CLUSTER = 0x001,
IS_RTL_GLYPH = 0x002,
IS_DIACRITIC = 0x004,
+ IS_VERTICAL = 0x008,
ALLOW_KASHIDA = 0X010
};
bool IsClusterStart() const { return ((mnFlags & IS_IN_CLUSTER) == 0); }
bool IsRTLGlyph() const { return ((mnFlags & IS_RTL_GLYPH) != 0); }
bool IsDiacritic() const { return ((mnFlags & IS_DIACRITIC) != 0); }
+ bool IsVertical() const { return ((mnFlags & IS_VERTICAL) != 0); }
bool AllowKashida() const { return ((mnFlags & ALLOW_KASHIDA) != 0); }
};
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index bf9cf3c..36155d7 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -179,7 +179,7 @@ private:
void GarbageCollect( long );
void ReleaseFromGarbageCollect();
- void ApplyGlyphTransform( int nGlyphFlags, FT_GlyphRec_* ) const;
+ void ApplyGlyphTransform(bool bVertical, FT_Glyph) const;
typedef std::unordered_map<int,GlyphData> GlyphList;
mutable GlyphList maGlyphList;
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 300ee4d..52062eb 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -162,8 +162,8 @@ bool CoreTextStyle::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect
SAL_WNODEPRECATED_DECLARATIONS_POP
CGRect aCGRect = CTFontGetBoundingRectsForGlyphs(aCTFontRef, aFontOrientation, &nCGGlyph, nullptr, 1);
- // Apply font rotation to non-upright glyphs.
- if (mfFontRotation && !(rGlyph.maGlyphId & GF_ROTMASK))
+ // Apply font rotation to non-vertical glyphs.
+ if (mfFontRotation && !rGlyph.IsVertical())
aCGRect = CGRectApplyAffineTransform(aCGRect, CGAffineTransformMakeRotation(mfFontRotation));
rRect.Left() = lrint( aCGRect.origin.x );
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index c593b88..c8f9c75 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -429,7 +429,7 @@ void AquaSalGraphics::DrawTextLayout(const CommonSalLayout& rLayout)
if (rStyle.mfFontRotation)
{
- if ((pGlyph->maGlyphId & GF_ROTMASK) == GF_ROTL)
+ if (pGlyph->IsVertical())
{
bUprightGlyph = true;
// Adjust the position of upright (vertical) glyphs.
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index eda090f..27394c7 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -618,7 +618,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
// See http://unicode.org/reports/tr50/#vo
if (vcl::GetVerticalOrientation(aChar) != VerticalOrientation::TransformedRotated
|| IsVerticalAlternate(pHbGlyphInfos[i].codepoint))
- nGlyphIndex |= GF_ROTL;
+ nGlyphFlags |= GlyphItem::IS_VERTICAL;
nAdvance = -pHbPositions[i].y_advance;
nXOffset = pHbPositions[i].y_offset;
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index d5d454a..4770644 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -8183,10 +8183,9 @@ void PDFWriterImpl::registerGlyphs( int nGlyphs,
}
if (!getReferenceDevice()->AcquireGraphics())
return;
- const bool bVertical = ((pGlyphs[i]->maGlyphId & GF_ROTMASK) != 0);
pGlyphWidths[i] = m_aFontCache.getGlyphWidth( pCurrentFont,
nFontGlyphId,
- bVertical,
+ pGlyphs[i]->IsVertical(),
pGraphics );
}
}
@@ -8293,7 +8292,7 @@ void PDFWriterImpl::drawVerticalGlyphs(
double fSkewA = 0.0;
Point aDeltaPos;
- if( ( rGlyphs[i].m_nGlyphId & GF_ROTMASK ) == GF_ROTL )
+ if (rGlyphs[i].m_bVertical)
{
fDeltaAngle = M_PI/2.0;
aDeltaPos.X() = m_pReferenceDevice->GetFontMetric().GetAscent();
@@ -8303,16 +8302,6 @@ void PDFWriterImpl::drawVerticalGlyphs(
fSkewA = -fSkewB;
fSkewB = 0.0;
}
- else if( ( rGlyphs[i].m_nGlyphId & GF_ROTMASK ) == GF_ROTR )
- {
- fDeltaAngle = -M_PI/2.0;
- aDeltaPos.X() = (int)((double)m_pReferenceDevice->GetFontMetric().GetDescent()*fXScale);
- aDeltaPos.Y() = -m_pReferenceDevice->GetFontMetric().GetAscent();
- fYScale = fXScale;
- fTempXScale = 1.0;
- fSkewA = fSkewB;
- fSkewB = 0.0;
- }
aDeltaPos += (m_pReferenceDevice->PixelToLogic( Point( (int)((double)nXOffset/fXScale), 0 ) ) - m_pReferenceDevice->PixelToLogic( Point() ) );
if( i < rGlyphs.size()-1 )
// #i120627# the text on the Y axis is reversed when export ppt file to PDF format
@@ -8661,7 +8650,8 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
pGlyphWidths[i],
pGlyphs[i]->maGlyphId,
pMappedFontObjects[i],
- pMappedGlyphs[i] ) );
+ pMappedGlyphs[i],
+ pGlyphs[i]->IsVertical() ) );
if( bVertical )
aGNGlyphPos.Y() += pGlyphs[i]->mnNewWidth/rLayout.GetUnitsPerPixel();
else
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index 1219089..d0b1188 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -552,14 +552,17 @@ public:
sal_Int32 m_nGlyphId;
sal_Int32 m_nMappedFontId;
sal_uInt8 m_nMappedGlyphId;
+ bool m_bVertical;
PDFGlyph( const Point& rPos,
sal_Int32 nNativeWidth,
sal_Int32 nGlyphId,
sal_Int32 nFontId,
- sal_uInt8 nMappedGlyphId )
+ sal_uInt8 nMappedGlyphId,
+ bool bVertical )
: m_aPos( rPos ), m_nNativeWidth( nNativeWidth ), m_nGlyphId( nGlyphId ),
- m_nMappedFontId( nFontId ), m_nMappedGlyphId( nMappedGlyphId )
+ m_nMappedFontId( nFontId ), m_nMappedGlyphId( nMappedGlyphId ),
+ m_bVertical(bVertical)
{}
};
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index 3d7ca15..a188ad3 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -183,15 +183,10 @@ void CairoTextRender::DrawTextLayout(const CommonSalLayout& rLayout)
aGlyph.y = aPos.Y();
cairo_glyphs.push_back(aGlyph);
- switch (pGlyph->maGlyphId & GF_ROTMASK)
- {
- case GF_ROTL: // left
- glyph_extrarotation.push_back(1);
- break;
- default:
- glyph_extrarotation.push_back(0);
- break;
- }
+ if (pGlyph->IsVertical())
+ glyph_extrarotation.push_back(1);
+ else
+ glyph_extrarotation.push_back(0);
}
if (cairo_glyphs.empty())
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 2e62abe..039ffad 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -627,10 +627,10 @@ void FreetypeFont::GetFontMetric(ImplFontMetricDataRef& rxTo) const
}
-void FreetypeFont::ApplyGlyphTransform( int nGlyphFlags, FT_Glyph pGlyphFT ) const
+void FreetypeFont::ApplyGlyphTransform(bool bVertical, FT_Glyph pGlyphFT ) const
{
// shortcut most common case
- if (!GetFontSelData().mnOrientation && !nGlyphFlags)
+ if (!GetFontSelData().mnOrientation && !bVertical)
return;
const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics;
@@ -639,17 +639,19 @@ void FreetypeFont::ApplyGlyphTransform( int nGlyphFlags, FT_Glyph pGlyphFT ) con
bool bStretched = false;
- switch( nGlyphFlags & GF_ROTMASK )
+ if (!bVertical)
{
- default: // straight
+ // straight
aVector.x = 0;
aVector.y = 0;
aMatrix.xx = +mnCos;
aMatrix.yy = +mnCos;
aMatrix.xy = -mnSin;
aMatrix.yx = +mnSin;
- break;
- case GF_ROTL: // left
+ }
+ else
+ {
+ // left
bStretched = (mfStretch != 1.0);
aVector.x = (FT_Pos)(+rMetrics.descender * mfStretch);
aVector.y = -rMetrics.ascender;
@@ -657,17 +659,6 @@ void FreetypeFont::ApplyGlyphTransform( int nGlyphFlags, FT_Glyph pGlyphFT ) con
aMatrix.yy = (FT_Pos)(-mnSin * mfStretch);
aMatrix.xy = (FT_Pos)(-mnCos * mfStretch);
aMatrix.yx = (FT_Pos)(+mnCos / mfStretch);
- break;
- case GF_ROTR: // right
- bStretched = (mfStretch != 1.0);
- aVector.x = -maFaceFT->glyph->metrics.horiAdvance;
- aVector.x += (FT_Pos)(rMetrics.descender * mnSin/65536.0);
- aVector.y = (FT_Pos)(-rMetrics.descender * mfStretch * mnCos/65536.0);
- aMatrix.xx = (FT_Pos)(+mnSin / mfStretch);
- aMatrix.yy = (FT_Pos)(+mnSin * mfStretch);
- aMatrix.xy = (FT_Pos)(+mnCos * mfStretch);
- aMatrix.yx = (FT_Pos)(-mnCos / mfStretch);
- break;
}
if( pGlyphFT->format != FT_GLYPH_FORMAT_BITMAP )
@@ -694,8 +685,6 @@ void FreetypeFont::InitGlyphData(const GlyphItem& rGlyph, GlyphData& rGD ) const
{
FT_Activate_Size( maSizeFT );
- int nGlyphFlags = rGlyph.maGlyphId & GF_FLAGMASK;;
-
FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId & GF_IDXMASK, mnLoadFlags);
if( rc != FT_Err_Ok )
@@ -712,7 +701,7 @@ void FreetypeFont::InitGlyphData(const GlyphItem& rGlyph, GlyphData& rGD ) const
FT_Glyph pGlyphFT;
FT_Get_Glyph( maFaceFT->glyph, &pGlyphFT );
- ApplyGlyphTransform( nGlyphFlags, pGlyphFT );
+ ApplyGlyphTransform(rGlyph.IsVertical(), pGlyphFT);
FT_BBox aBbox;
FT_Glyph_Get_CBox( pGlyphFT, FT_GLYPH_BBOX_PIXELS, &aBbox );
@@ -1002,8 +991,6 @@ bool FreetypeFont::GetGlyphOutline(const GlyphItem& rGlyph,
rB2DPolyPoly.clear();
- int nGlyphFlags = rGlyph.maGlyphId & GF_FLAGMASK;;
-
FT_Int nLoadFlags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_TRANSFORM;
#ifdef FT_LOAD_TARGET_LIGHT
@@ -1049,7 +1036,7 @@ bool FreetypeFont::GetGlyphOutline(const GlyphItem& rGlyph,
tools::PolyPolygon aToolPolyPolygon;
PolyArgs aPolyArg( aToolPolyPolygon, nMaxPoints );
- /*int nAngle =*/ ApplyGlyphTransform( nGlyphFlags, pGlyphFT );
+ ApplyGlyphTransform(rGlyph.IsVertical(), pGlyphFT);
FT_Outline_Funcs aFuncs;
aFuncs.move_to = &FT_move_to;
diff --git a/vcl/unx/generic/print/text_gfx.cxx b/vcl/unx/generic/print/text_gfx.cxx
index 2f04c72..36f1776 100644
--- a/vcl/unx/generic/print/text_gfx.cxx
+++ b/vcl/unx/generic/print/text_gfx.cxx
@@ -102,7 +102,7 @@ void PrinterGfx::DrawGlyph(const Point& rPoint,
aPoint = Point( 0, 0 );
}
- if (mbTextVertical && (rGlyph.maGlyphId & GF_ROTMASK) != GF_NONE)
+ if (mbTextVertical && rGlyph.IsVertical())
{
sal_Int32 nTextHeight = maVirtualStatus.mnTextHeight;
sal_Int32 nTextWidth = maVirtualStatus.mnTextWidth ? maVirtualStatus.mnTextWidth : maVirtualStatus.mnTextHeight;
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 573d3ed..c246f55 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -295,7 +295,7 @@ bool ExTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
{
bGlyphs = true;
WORD glyphWStr[] = { pGlyph->maGlyphId & GF_IDXMASK };
- if ((pGlyph->maGlyphId & GF_ROTMASK) == GF_ROTL)
+ if (pGlyph->IsVertical())
glyphWStr[0] |= GF_VERT;
ExtTextOutW(hDC, pPos->X(), pPos->Y(), ETO_GLYPH_INDEX, nullptr, LPCWSTR(&glyphWStr), 1, nullptr);
}
@@ -398,7 +398,7 @@ bool D2DWriteTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
0
};
- if (bVertical && (pGlyph->maGlyphId & GF_ROTMASK) != GF_ROTL)
+ if (bVertical && !pGlyph->IsVertical())
{
D2D1MakeRotateMatrix(90.0f, baseline, &aRotTrans);
mpRT->SetTransform(aOrigTrans * aRotTrans);
@@ -543,7 +543,7 @@ bool D2DWriteTextOutRenderer::GetDWriteInkBox(SalLayout const &rLayout, Rectangl
{
positions.push_back(aPos);
indices.push_back(pGlyph->maGlyphId & GF_IDXMASK);
- vertical.push_back((pGlyph->maGlyphId & GF_ROTMASK) == GF_ROTL);
+ vertical.push_back(pGlyph->IsVertical());
}
auto aBoxes = GetGlyphInkBoxes(indices.data(), indices.data() + indices.size());
commit e876704d1759b28246169a05dc22217fe18bd5c3
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 04:13:26 2016 +0200
Use GlyphItem in more places
Also simplify code to what is actually being used.
Change-Id: Ic640ea7f3e426e3f5f4f9fef30d774fe5ac111ff
diff --git a/vcl/inc/unx/printergfx.hxx b/vcl/inc/unx/printergfx.hxx
index 871469e8..cb9a6c8 100644
--- a/vcl/inc/unx/printergfx.hxx
+++ b/vcl/inc/unx/printergfx.hxx
@@ -249,21 +249,16 @@ public:
void PSLineTo(const Point& rPoint );
void PSPointOp (const Point& rPoint, const sal_Char* pOperator);
void PSHexString (const unsigned char* pString, sal_Int16 nLen);
- void PSDeltaArray (const sal_Int32 *pArray, sal_Int16 nEntries);
- void PSShowText (const unsigned char* pString,
- sal_Int16 nGlyphs, sal_Int16 nBytes,
- const sal_Int32* pDeltaArray = nullptr);
+ void PSShowGlyph (const unsigned char nGlyphId);
void PSComment (const sal_Char* pComment );
void OnEndJob ();
void writeResources( osl::File* pFile, std::list< OString >& rSuppliedFonts );
PrintFontManager& GetFontMgr () { return mrFontMgr; }
- void drawGlyphs( const Point& rPoint,
- sal_GlyphId* pGlyphIds,
- sal_Unicode* pUnicodes,
- sal_Int16 nLen,
- sal_Int32* pDeltaArray );
+ void drawGlyph(const Point& rPoint,
+ sal_GlyphId aGlyphId,
+ sal_Int32 nDelta);
public:
PrinterGfx();
~PrinterGfx();
@@ -343,12 +338,9 @@ public:
void SetTextColor (PrinterColor& rTextColor)
{ maTextColor = rTextColor; }
- // for CTL
- void DrawGlyphs( const Point& rPoint,
- sal_GlyphId* pGlyphIds,
- sal_Unicode* pUnicodes,
- sal_Int16 nLen,
- sal_Int32* pDeltaArray );
+ void DrawGlyph(const Point& rPoint,
+ const GlyphItem& rGlyph,
+ sal_Int32 nDelta);
};
diff --git a/vcl/unx/generic/print/common_gfx.cxx b/vcl/unx/generic/print/common_gfx.cxx
index 793bd3c..d8b199b 100644
--- a/vcl/unx/generic/print/common_gfx.cxx
+++ b/vcl/unx/generic/print/common_gfx.cxx
@@ -1012,39 +1012,8 @@ PrinterGfx::PSHexString (const unsigned char* pString, sal_Int16 nLen)
WritePS (mpPageBody, pHexString, nChar);
}
-/* psshowtext helper routines: draw an array for xshow ps operator */
void
-PrinterGfx::PSDeltaArray (const sal_Int32 *pArray, sal_Int16 nEntries)
-{
- sal_Char pPSArray [128];
- sal_Int32 nChar = 0;
-
- nChar = psp::appendStr ("[", pPSArray + nChar);
- nChar += psp::getValueOf (pArray[0], pPSArray + nChar);
-
- for (int i = 1; i < nEntries; i++)
- {
- if (nChar >= (nMaxTextColumn - 1))
- {
- nChar += psp::appendStr ("\n", pPSArray + nChar);
- WritePS (mpPageBody, pPSArray, nChar);
- nChar = 0;
- }
-
- nChar += psp::appendStr (" ", pPSArray + nChar);
- nChar += psp::getValueOf (pArray[i] - pArray[i-1], pPSArray + nChar);
- }
-
- nChar += psp::appendStr (" 0]\n", pPSArray + nChar);
- WritePS (mpPageBody, pPSArray, nChar);
-}
-
-/* the DrawText equivalent, pDeltaArray may be NULL. For Type1 fonts or single byte
- * fonts in general nBytes and nGlyphs is the same. For printer resident Composite
- * fonts it may be different (these fonts may be SJIS encoded for example) */
-void
-PrinterGfx::PSShowText (const unsigned char* pStr, sal_Int16 nGlyphs, sal_Int16 nBytes,
- const sal_Int32* pDeltaArray)
+PrinterGfx::PSShowGlyph (const unsigned char nGlyphId)
{
PSSetColor (maTextColor);
PSSetColor ();
@@ -1066,31 +1035,17 @@ PrinterGfx::PSShowText (const unsigned char* pStr, sal_Int16 nGlyphs, sal_Int16
nLW = nLW < maVirtualStatus.mnTextHeight ? nLW : maVirtualStatus.mnTextHeight;
psp::getValueOfDouble( pBuffer, (double)nLW / 30.0 );
}
+
// dispatch to the drawing method
- if (pDeltaArray == nullptr)
- {
- PSHexString (pStr, nBytes);
+ PSHexString (&nGlyphId, 1);
- if( maVirtualStatus.mbArtBold )
- {
- WritePS( mpPageBody, pBuffer );
- WritePS( mpPageBody, " bshow\n" );
- }
- else
- WritePS (mpPageBody, "show\n");
- }
- else
+ if( maVirtualStatus.mbArtBold )
{
- PSHexString (pStr, nBytes);
- PSDeltaArray (pDeltaArray, nGlyphs - 1);
- if( maVirtualStatus.mbArtBold )
- {
- WritePS( mpPageBody, pBuffer );
- WritePS( mpPageBody, " bxshow\n" );
- }
- else
- WritePS (mpPageBody, "xshow\n");
+ WritePS( mpPageBody, pBuffer );
+ WritePS( mpPageBody, " bshow\n" );
}
+ else
+ WritePS (mpPageBody, "show\n");
// restore the user coordinate system
if (mnTextAngle != 0)
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index ee0ecb2..2c6d106 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -596,9 +596,8 @@ void GenPspGraphics::DrawTextLayout(const CommonSalLayout& rLayout)
int nStart = 0;
while (rLayout.GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
- sal_GlyphId aGlyphId = pGlyph->maGlyphId & (GF_IDXMASK | GF_ROTMASK);
sal_Int32 aIdx = pGlyph->mnNewWidth / rLayout.GetUnitsPerPixel();
- m_pPrinterGfx->DrawGlyphs(aPos, &aGlyphId, { 0 }, 1, &aIdx);
+ m_pPrinterGfx->DrawGlyph(aPos, *pGlyph, aIdx);
}
}
diff --git a/vcl/unx/generic/print/glyphset.cxx b/vcl/unx/generic/print/glyphset.cxx
index 7d8ee2e..3641fe1 100644
--- a/vcl/unx/generic/print/glyphset.cxx
+++ b/vcl/unx/generic/print/glyphset.cxx
@@ -62,13 +62,12 @@ GlyphSet::~GlyphSet ()
bool
GlyphSet::GetGlyphID (
sal_GlyphId nGlyph,
- sal_Unicode nUnicode,
unsigned char* nOutGlyphID,
sal_Int32* nOutGlyphSetID
)
{
return LookupGlyphID (nGlyph, nOutGlyphID, nOutGlyphSetID)
- || AddGlyphID (nGlyph, nUnicode, nOutGlyphID, nOutGlyphSetID);
+ || AddGlyphID (nGlyph, nOutGlyphID, nOutGlyphSetID);
}
bool
@@ -102,17 +101,6 @@ GlyphSet::LookupGlyphID (
return false;
}
-unsigned char
-GlyphSet::GetSymbolMapping (sal_Unicode nUnicodeChar)
-{
- if (0x0000 < nUnicodeChar && nUnicodeChar < 0x0100)
- return (unsigned char)nUnicodeChar;
- if (0xf000 < nUnicodeChar && nUnicodeChar < 0xf100)
- return (unsigned char)nUnicodeChar;
-
- return 0;
-}
-
void
GlyphSet::AddNotdef (glyph_map_t &rGlyphMap)
{
@@ -123,17 +111,10 @@ GlyphSet::AddNotdef (glyph_map_t &rGlyphMap)
bool
GlyphSet::AddGlyphID (
sal_GlyphId nGlyph,
- sal_Unicode nUnicode,
unsigned char* nOutGlyphID,
sal_Int32* nOutGlyphSetID
)
{
- unsigned char nMappedChar = 0;
-
- // XXX important: avoid to reencode type1 symbol fonts
- if (mnBaseEncoding == RTL_TEXTENCODING_SYMBOL)
- nMappedChar = GetSymbolMapping (nUnicode);
-
// create an empty glyphmap that is reserved for unencoded symbol glyphs,
// and a second map that takes any other
if (maGlyphList.empty())
@@ -144,35 +125,20 @@ GlyphSet::AddGlyphID (
maGlyphList.push_back (aMapp);
}
// if the last map is full, create a new one
- if ((!nMappedChar) && (maGlyphList.back().size() == 255))
+ if (maGlyphList.back().size() == 255)
{
glyph_map_t aMap;
maGlyphList.push_back (aMap);
}
- // insert a new glyph in the font subset
- if (nMappedChar)
- {
- // always put symbol glyphs into the first map, map them on itself
- glyph_map_t& aGlyphSet = maGlyphList.front();
- AddNotdef (aGlyphSet);
+ glyph_map_t& aGlyphSet = maGlyphList.back();
+ AddNotdef (aGlyphSet);
- aGlyphSet [nGlyph] = nMappedChar;
- *nOutGlyphSetID = 1;
- *nOutGlyphID = nMappedChar;
- }
- else
- {
- // other glyphs are just appended to the list
- glyph_map_t& aGlyphSet = maGlyphList.back();
- AddNotdef (aGlyphSet);
+ int nSize = aGlyphSet.size();
- int nSize = aGlyphSet.size();
-
- aGlyphSet [nGlyph] = nSize;
- *nOutGlyphSetID = maGlyphList.size();
- *nOutGlyphID = aGlyphSet [nGlyph];
- }
+ aGlyphSet [nGlyph] = nSize;
+ *nOutGlyphSetID = maGlyphList.size();
+ *nOutGlyphID = aGlyphSet [nGlyph];
return true;
}
@@ -211,76 +177,26 @@ GlyphSet::GetReencodedFontName (rtl_TextEncoding nEnc, const OString &rFontName)
}
}
-void GlyphSet::DrawGlyphs(
- PrinterGfx& rGfx,
- const Point& rPoint,
- const sal_GlyphId* pGlyphIds,
- const sal_Unicode* pUnicodes,
- sal_Int16 nLen,
- const sal_Int32* pDeltaArray)
+void GlyphSet::DrawGlyph(PrinterGfx& rGfx,
+ const Point& rPoint,
+ const sal_GlyphId nGlyphId,
+ const sal_Int32 nDelta)
{
- unsigned char *pGlyphID = static_cast<unsigned char*>(alloca (nLen * sizeof(unsigned char)));
- sal_Int32 *pGlyphSetID = static_cast<sal_Int32*>(alloca (nLen * sizeof(sal_Int32)));
- std::set< sal_Int32 > aGlyphSet;
-
- // convert unicode to font glyph id and font subset
- for (int nChar = 0; nChar < nLen; nChar++)
- {
- GetGlyphID (pGlyphIds[nChar], pUnicodes[nChar], pGlyphID + nChar, pGlyphSetID + nChar);
- aGlyphSet.insert (pGlyphSetID[nChar]);
- }
-
- // loop over all glyph sets to detect substrings that can be shown together
- // without changing the postscript font
- sal_Int32 *pDeltaSubset = static_cast<sal_Int32*>(alloca (nLen * sizeof(sal_Int32)));
- unsigned char *pGlyphSubset = static_cast<unsigned char*>(alloca (nLen * sizeof(unsigned char)));
-
- std::set< sal_Int32 >::iterator aSet;
- for (aSet = aGlyphSet.begin(); aSet != aGlyphSet.end(); ++aSet)
- {
- Point aPoint = rPoint;
- sal_Int32 nOffset = 0;
- sal_Int32 nGlyphs = 0;
- sal_Int32 nChar;
-
- // get offset to first glyph
- for (nChar = 0; (nChar < nLen) && (pGlyphSetID[nChar] != *aSet); nChar++)
- {
- nOffset = pDeltaArray [nChar];
- }
+ unsigned char nGlyphID;
+ sal_Int32 nGlyphSetID;
- // loop over all chars to extract those that share the current glyph set
- for (nChar = 0; nChar < nLen; nChar++)
- {
- if (pGlyphSetID[nChar] == *aSet)
- {
- pGlyphSubset [nGlyphs] = pGlyphID [nChar];
- // the offset to the next glyph is determined by the glyph in
- // front of the next glyph with the same glyphset id
- // most often, this will be the current glyph
- while ((nChar + 1) < nLen)
- {
- if (pGlyphSetID[nChar + 1] == *aSet)
- break;
- else
- nChar += 1;
- }
- pDeltaSubset [nGlyphs] = pDeltaArray[nChar] - nOffset;
-
- nGlyphs += 1;
- }
- }
+ // convert to font glyph id and font subset
+ GetGlyphID (nGlyphId, &nGlyphID, &nGlyphSetID);
- // show the text using the PrinterGfx text api
- aPoint.Move (nOffset, 0);
+ // show the text using the PrinterGfx text api
+ Point aPoint = rPoint;
+ aPoint.Move (nDelta, 0);
- OString aGlyphSetName;
- aGlyphSetName = GetGlyphSetName(*aSet);
+ OString aGlyphSetName = GetGlyphSetName(nGlyphSetID);
- rGfx.PSSetFont (aGlyphSetName, RTL_TEXTENCODING_DONTKNOW);
- rGfx.PSMoveTo (aPoint);
- rGfx.PSShowText (pGlyphSubset, nGlyphs, nGlyphs, nGlyphs > 1 ? pDeltaSubset : nullptr);
- }
+ rGfx.PSSetFont (aGlyphSetName, RTL_TEXTENCODING_DONTKNOW);
+ rGfx.PSMoveTo (rPoint);
+ rGfx.PSShowGlyph(nGlyphID);
}
struct EncEntry
diff --git a/vcl/unx/generic/print/glyphset.hxx b/vcl/unx/generic/print/glyphset.hxx
index fccaacc..01ae348 100644
--- a/vcl/unx/generic/print/glyphset.hxx
+++ b/vcl/unx/generic/print/glyphset.hxx
@@ -52,15 +52,14 @@ private:
OString GetGlyphSetName (sal_Int32 nGlyphSetID);
- bool GetGlyphID (sal_GlyphId nGlyphId, sal_Unicode nUnicode,
+ bool GetGlyphID (sal_GlyphId nGlyphId,
unsigned char* nOutGlyphID, sal_Int32* nOutGlyphSetID);
bool LookupGlyphID (sal_GlyphId nGlyphId,
unsigned char* nOutGlyphID, sal_Int32* nOutGlyphSetID);
- bool AddGlyphID (sal_GlyphId nGlyphId, sal_Unicode nUnicode,
+ bool AddGlyphID (sal_GlyphId nGlyphId,
unsigned char* nOutGlyphID,
sal_Int32* nOutGlyphSetID);
static void AddNotdef (glyph_map_t &rGlyphMap);
- static unsigned char GetSymbolMapping (sal_Unicode nUnicodeChar);
public:
@@ -76,12 +75,10 @@ public:
const OString &rFontName);
bool IsVertical () { return mbVertical;}
- void DrawGlyphs (PrinterGfx& rGfx,
- const Point& rPoint,
- const sal_GlyphId* pGlyphIds,
- const sal_Unicode* pUnicodes,
- sal_Int16 nLen,
- const sal_Int32* pDeltaArray);
+ void DrawGlyph (PrinterGfx& rGfx,
+ const Point& rPoint,
+ const sal_GlyphId nGlyphId,
+ const sal_Int32 nDelta);
void PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, std::list< OString >& rSuppliedFonts );
};
diff --git a/vcl/unx/generic/print/text_gfx.cxx b/vcl/unx/generic/print/text_gfx.cxx
index bff561a..2f04c72 100644
--- a/vcl/unx/generic/print/text_gfx.cxx
+++ b/vcl/unx/generic/print/text_gfx.cxx
@@ -59,13 +59,9 @@ void PrinterGfx::SetFont(
mbTextVertical = bVertical;
}
-void PrinterGfx::drawGlyphs(
- const Point& rPoint,
- sal_GlyphId* pGlyphIds,
- sal_Unicode* pUnicodes,
- sal_Int16 nLen,
- sal_Int32* pDeltaArray
- )
+void PrinterGfx::drawGlyph(const Point& rPoint,
+ sal_GlyphId aGlyphId,
+ sal_Int32 nDelta)
{
// draw the string
@@ -75,7 +71,7 @@ void PrinterGfx::drawGlyphs(
if ( ((*aIter).GetFontID() == mnFontID)
&& ((*aIter).IsVertical() == mbTextVertical))
{
- (*aIter).DrawGlyphs (*this, rPoint, pGlyphIds, pUnicodes, nLen, pDeltaArray);
+ (*aIter).DrawGlyph (*this, rPoint, aGlyphId, nDelta);
break;
}
@@ -83,21 +79,14 @@ void PrinterGfx::drawGlyphs(
if (aIter == maPS3Font.end())
{
maPS3Font.push_back (GlyphSet(mnFontID, mbTextVertical));
- maPS3Font.back().DrawGlyphs (*this, rPoint, pGlyphIds, pUnicodes, nLen, pDeltaArray);
+ maPS3Font.back().DrawGlyph (*this, rPoint, aGlyphId, nDelta);
}
}
-void PrinterGfx::DrawGlyphs(
- const Point& rPoint,
- sal_GlyphId* pGlyphIds,
- sal_Unicode* pUnicodes,
- sal_Int16 nLen,
- sal_Int32* pDeltaArray
- )
+void PrinterGfx::DrawGlyph(const Point& rPoint,
+ const GlyphItem& rGlyph,
+ sal_Int32 nDelta)
{
- if( nLen <= 0 )
- return;
-
// move and rotate the user coordinate system
// avoid the gsave/grestore for the simple cases since it allows
// reuse of the current font if it hasn't changed
@@ -113,17 +102,8 @@ void PrinterGfx::DrawGlyphs(
aPoint = Point( 0, 0 );
}
- if( mbTextVertical )
+ if (mbTextVertical && (rGlyph.maGlyphId & GF_ROTMASK) != GF_NONE)
{
- // vertical glyphs can have an additional rotation ... sigh.
- // so break up text in chunks of normal glyphs and print out
- // specially rotated glyphs extra
- sal_GlyphId* pTempGlyphIds = static_cast<sal_GlyphId*>(alloca(sizeof(sal_Int32)*nLen));
- sal_Int32* pTempDelta = static_cast<sal_Int32*>(alloca(sizeof(sal_Int32)*nLen));
- sal_Unicode* pTempUnicodes = static_cast<sal_Unicode*>(alloca(sizeof(sal_Unicode)*nLen));
- sal_Int16 nTempLen = 0;
- sal_Int32 nTempFirstDelta = 0;
- Point aRotPoint;
sal_Int32 nTextHeight = maVirtualStatus.mnTextHeight;
sal_Int32 nTextWidth = maVirtualStatus.mnTextWidth ? maVirtualStatus.mnTextWidth : maVirtualStatus.mnTextHeight;
sal_Int32 nAscend = mrFontMgr.getFontAscend( mnFontID );
@@ -132,77 +112,26 @@ void PrinterGfx::DrawGlyphs(
nDescend = nDescend * nTextHeight / 1000;
nAscend = nAscend * nTextHeight / 1000;
- for( sal_Int16 i = 0; i < nLen; i++ )
- {
- const sal_GlyphId nRot = pGlyphIds[i] & GF_ROTMASK;
- if( nRot == GF_NONE )
- {
- pTempUnicodes[nTempLen] = pUnicodes[i];
- pTempGlyphIds[nTempLen] = pGlyphIds[i];
- if( nTempLen > 0 )
- pTempDelta[nTempLen-1] = pDeltaArray[i-1]-nTempFirstDelta;
- else
- {
- // the first element in pDeltaArray shows
- // the offset of the second character
- // so if the first glyph is normal
- // then we do not need to move the delta indices
- // else we have to move them down by one and
- // recalculate aPoint and all deltas
- if( i != 0 )
- nTempFirstDelta = pDeltaArray[ i-1 ];
- }
- nTempLen++;
- }
- else
- {
- sal_Int32 nOffset = i > 0 ? pDeltaArray[i-1] : 0;
- sal_Int32 nRotAngle = 0;
- switch( nRot )
- {
- case GF_ROTR:
- nRotAngle = 2700;
- aRotPoint = Point( -nAscend*nTextWidth/nTextHeight, -nDescend*nTextWidth/nTextHeight - nOffset );
- break;
- case GF_ROTL:
- nRotAngle = 900;
- aRotPoint = Point( -nDescend*nTextWidth/nTextHeight, nOffset + nAscend*nTextWidth/nTextHeight );
- break;
- }
- sal_GlyphId nRotGlyphId = pGlyphIds[i];
- sal_Unicode nRotUnicode = pUnicodes[i];
- sal_Int32 nRotDelta = 0;
-
- // transform matrix to new individual direction
- PSGSave ();
- GraphicsStatus aSaveStatus = maVirtualStatus;
- if( nRot != 2 ) // switch font aspect
- {
- maVirtualStatus.mnTextWidth = nTextHeight;
- maVirtualStatus.mnTextHeight = nTextWidth;
- }
- if( aPoint.X() || aPoint.Y() )
- PSTranslate( aPoint );
- PSRotate (nRotAngle);
- // draw the rotated glyph
- drawGlyphs( aRotPoint, &nRotGlyphId, &nRotUnicode, 1, &nRotDelta );
-
- // restore previous state
- maVirtualStatus = aSaveStatus;
- PSGRestore();
- }
- }
-
- pGlyphIds = pTempGlyphIds;
- pUnicodes = pTempUnicodes;
- pDeltaArray = pTempDelta;
- nLen = nTempLen;
+ Point aRotPoint = Point( -nDescend*nTextWidth/nTextHeight, nAscend*nTextWidth/nTextHeight );
- aPoint.X() += nTempFirstDelta;
+ // transform matrix to new individual direction
+ PSGSave ();
+ GraphicsStatus aSaveStatus = maVirtualStatus;
+ // switch font aspect
+ maVirtualStatus.mnTextWidth = nTextHeight;
+ maVirtualStatus.mnTextHeight = nTextWidth;
+ if( aPoint.X() || aPoint.Y() )
+ PSTranslate( aPoint );
+ PSRotate (900);
+ // draw the rotated glyph
+ drawGlyph(aRotPoint, rGlyph.maGlyphId, 0);
+
+ // restore previous state
+ maVirtualStatus = aSaveStatus;
+ PSGRestore();
}
-
- if( nLen > 0 )
- drawGlyphs( aPoint, pGlyphIds, pUnicodes, nLen, pDeltaArray );
+ else
+ drawGlyph(aPoint, rGlyph.maGlyphId, nDelta);
// restore the user coordinate system
if (nCurrentTextAngle != 0)
commit ca3e3d31054aa8e66b2b8dd18ac71b1668d758e7
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Thu Dec 8 03:01:14 2016 +0200
Use GlyphItem in more places
Change-Id: Ic0dd8c0311161271817eb9a3f454d00a319e43a8
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
index 63a10f5..bdb97a9 100644
--- a/vcl/headless/svptext.cxx
+++ b/vcl/headless/svptext.cxx
@@ -91,14 +91,14 @@ void SvpSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
m_aTextRenderImpl.GetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
}
-bool SvpSalGraphics::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect )
+bool SvpSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect)
{
- return m_aTextRenderImpl.GetGlyphBoundRect(aGlyphId, rRect);
+ return m_aTextRenderImpl.GetGlyphBoundRect(rGlyph, rRect);
}
-bool SvpSalGraphics::GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolygon& rPolyPoly )
+bool SvpSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon& rPolyPoly)
{
- return m_aTextRenderImpl.GetGlyphOutline(aGlyphId, rPolyPoly);
+ return m_aTextRenderImpl.GetGlyphOutline(rGlyph, rPolyPoly);
}
SalLayout* SvpSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLevel )
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index a8f3362..8083474 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -159,8 +159,8 @@ public:
bool bVertical,
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) override;
- virtual bool GetGlyphBoundRect( sal_GlyphId nIndex, Rectangle& ) override;
- virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) override;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) override;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) override;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override;
virtual void DrawTextLayout( const CommonSalLayout& ) override;
virtual bool supportsOperation( OutDevSupportType ) const override;
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 6ea5bf3..086266d 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -89,8 +89,8 @@ public:
~CoreTextStyle( void );
void GetFontMetric( ImplFontMetricDataRef& ) const;
- bool GetGlyphBoundRect( sal_GlyphId, Rectangle& ) const;
- bool GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) const;
+ bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) const;
+ bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) const;
hb_font_t* GetHbFont() const { return mpHbFont; }
void SetHbFont(hb_font_t* pHbFont) const { mpHbFont = pHbFont; }
@@ -375,8 +375,8 @@ public:
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) override;
- virtual bool GetGlyphBoundRect( sal_GlyphId, Rectangle& ) override;
- virtual bool GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) override;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) override;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) override;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override;
virtual void DrawTextLayout( const CommonSalLayout& ) override;
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index ef228fa..9ca2433 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -191,8 +191,8 @@ public:
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) = 0;
- virtual bool GetGlyphBoundRect( sal_GlyphId, Rectangle& ) = 0;
- virtual bool GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) = 0;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) = 0;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) = 0;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) = 0;
virtual void DrawTextLayout( const CommonSalLayout& ) = 0;
diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx
index 9417345..1b04725 100644
--- a/vcl/inc/textrender.hxx
+++ b/vcl/inc/textrender.hxx
@@ -59,8 +59,8 @@ public:
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) = 0;
- virtual bool GetGlyphBoundRect( sal_GlyphId nIndex, Rectangle& ) = 0;
- virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) = 0;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) = 0;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) = 0;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) = 0;
virtual void DrawTextLayout(const CommonSalLayout&) = 0;
#if ENABLE_CAIRO_CANVAS
diff --git a/vcl/inc/unx/cairotextrender.hxx b/vcl/inc/unx/cairotextrender.hxx
index 5fab64a..1cdf405 100644
--- a/vcl/inc/unx/cairotextrender.hxx
+++ b/vcl/inc/unx/cairotextrender.hxx
@@ -75,8 +75,8 @@ public:
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) override;
- virtual bool GetGlyphBoundRect( sal_GlyphId nIndex, Rectangle& ) override;
- virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) override;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) override;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) override;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override;
virtual void DrawTextLayout(const CommonSalLayout&) override;
#if ENABLE_CAIRO_CANVAS
diff --git a/vcl/inc/unx/genpspgraphics.h b/vcl/inc/unx/genpspgraphics.h
index 1dcb7ab..721efd5 100644
--- a/vcl/inc/unx/genpspgraphics.h
+++ b/vcl/inc/unx/genpspgraphics.h
@@ -115,8 +115,8 @@ public:
bool bVertical,
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) override;
- virtual bool GetGlyphBoundRect( sal_GlyphId, Rectangle& ) override;
- virtual bool GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) override;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) override;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) override;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override;
virtual void DrawTextLayout( const CommonSalLayout& ) override;
virtual bool supportsOperation( OutDevSupportType ) const override;
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index 65afd4b..bf9cf3c 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -157,9 +157,9 @@ public:
const FontCharMapRef GetFontCharMap() const;
bool GetFontCapabilities(vcl::FontCapabilities &) const;
- const GlyphMetric& GetGlyphMetric(sal_GlyphId aGlyphId);
+ const GlyphMetric& GetGlyphMetric(const GlyphItem& rGlyph);
- bool GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolygon& ) const;
+ bool GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon&) const;
bool GetAntialiasAdvice() const;
hb_font_t* GetHbFont() { return mpHbFont; }
void SetHbFont( hb_font_t* pHbFont ) { mpHbFont = pHbFont; }
@@ -175,7 +175,7 @@ private:
long Release() const;
sal_uLong GetByteCount() const { return mnBytesUsed; }
- void InitGlyphData( sal_GlyphId, GlyphData& ) const;
+ void InitGlyphData(const GlyphItem&, GlyphData&) const;
void GarbageCollect( long );
void ReleaseFromGarbageCollect();
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index b3de804..5eb9172 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -140,8 +140,8 @@ public:
std::vector< sal_Int32 >& rWidths,
Ucs2UIntMap& rUnicodeEnc ) override;
- virtual bool GetGlyphBoundRect( sal_GlyphId nIndex, Rectangle& ) override;
- virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) override;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) override;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) override;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override;
virtual void DrawTextLayout( const CommonSalLayout& ) override;
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 198c61c..8a493d7 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -377,8 +377,8 @@ public:
Ucs2UIntMap& rUnicodeEnc ) override;
int GetMinKashidaWidth();
- virtual bool GetGlyphBoundRect( sal_GlyphId, Rectangle& ) override;
- virtual bool GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) override;
+ virtual bool GetGlyphBoundRect(const GlyphItem&, Rectangle&) override;
+ virtual bool GetGlyphOutline(const GlyphItem&, basegfx::B2DPolyPolygon&) override;
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override;
virtual void DrawTextLayout( const CommonSalLayout& ) override;
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 7677a04..300ee4d 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -152,9 +152,9 @@ SAL_WNODEPRECATED_DECLARATIONS_POP
}
}
-bool CoreTextStyle::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect ) const
+bool CoreTextStyle::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect ) const
{
- CGGlyph nCGGlyph = aGlyphId & GF_IDXMASK;
+ CGGlyph nCGGlyph = rGlyph.maGlyphId & GF_IDXMASK;
CTFontRef aCTFontRef = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName ));
SAL_WNODEPRECATED_DECLARATIONS_PUSH //TODO: 10.11 kCTFontDefaultOrientation
@@ -163,7 +163,7 @@ bool CoreTextStyle::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect )
CGRect aCGRect = CTFontGetBoundingRectsForGlyphs(aCTFontRef, aFontOrientation, &nCGGlyph, nullptr, 1);
// Apply font rotation to non-upright glyphs.
- if (mfFontRotation && !(aGlyphId & GF_ROTMASK))
+ if (mfFontRotation && !(rGlyph.maGlyphId & GF_ROTMASK))
aCGRect = CGRectApplyAffineTransform(aCGRect, CGAffineTransformMakeRotation(mfFontRotation));
rRect.Left() = lrint( aCGRect.origin.x );
@@ -225,11 +225,11 @@ static void MyCGPathApplierFunc( void* pData, const CGPathElement* pElement )
}
}
-bool CoreTextStyle::GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolygon& rResult ) const
+bool CoreTextStyle::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon& rResult) const
{
rResult.clear();
- CGGlyph nCGGlyph = aGlyphId & GF_IDXMASK;
+ CGGlyph nCGGlyph = rGlyph.maGlyphId & GF_IDXMASK;
CTFontRef pCTFont = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName ));
CGPathRef xPath = CTFontCreatePathForGlyph( pCTFont, nCGGlyph, nullptr );
if (!xPath)
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 4b3a63a..c593b88 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -382,23 +382,23 @@ bool AquaSalGraphics::AddTempDevFont( PhysicalFontCollection*,
return ::AddTempDevFont(rFontFileURL);
}
-bool AquaSalGraphics::GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolygon& rPolyPoly )
+bool AquaSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon& rPolyPoly)
{
- const int nFallbackLevel = aGlyphId >> GF_FONTSHIFT;
+ const int nFallbackLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
if (nFallbackLevel < MAX_FALLBACK && mpTextStyle[nFallbackLevel])
{
- const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphOutline(aGlyphId, rPolyPoly);
+ const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphOutline(rGlyph, rPolyPoly);
return bRC;
}
return false;
}
-bool AquaSalGraphics::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect )
+bool AquaSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect )
{
- const int nFallbackLevel = aGlyphId >> GF_FONTSHIFT;
+ const int nFallbackLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
if (nFallbackLevel < MAX_FALLBACK && mpTextStyle[nFallbackLevel])
{
- const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphBoundRect(aGlyphId, rRect);
+ const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphBoundRect(rGlyph, rRect);
return bRC;
}
return false;
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 25c1600..6f3b082 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -675,7 +675,7 @@ bool SalLayout::GetOutline( SalGraphics& rSalGraphics,
while (GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
// get outline of individual glyph, ignoring "empty" glyphs
- bool bSuccess = rSalGraphics.GetGlyphOutline(pGlyph->maGlyphId, aGlyphOutline);
+ bool bSuccess = rSalGraphics.GetGlyphOutline(*pGlyph, aGlyphOutline);
bAllOk &= bSuccess;
bOneOk |= bSuccess;
// only add non-empty outlines
@@ -707,7 +707,7 @@ bool SalLayout::GetBoundRect( SalGraphics& rSalGraphics, Rectangle& rRect ) cons
while (GetNextGlyphs(1, &pGlyph, aPos, nStart))
{
// get bounding rectangle of individual glyph
- if (rSalGraphics.GetGlyphBoundRect(pGlyph->maGlyphId, aRectangle))
+ if (rSalGraphics.GetGlyphBoundRect(*pGlyph, aRectangle))
{
// merge rectangle
aRectangle += aPos;
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index 71d3f21..3820d42 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -1300,7 +1300,7 @@ void OutputDevice::ImplDrawEmphasisMarks( SalLayout& rSalLayout )
int nStart = 0;
while (rSalLayout.GetNextGlyphs(1, &pGlyph, aOutPoint, nStart))
{
- if (!mpGraphics->GetGlyphBoundRect(pGlyph->maGlyphId, aRectangle ) )
+ if (!mpGraphics->GetGlyphBoundRect(*pGlyph, aRectangle ) )
continue;
if (!SalLayout::IsSpacingGlyph(pGlyph->maGlyphId))
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index 501d399..3d7ca15 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -430,9 +430,9 @@ void CairoTextRender::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nF
mpFreetypeFont[nFallbackLevel]->GetFontMetric(rxFontMetric);
}
-bool CairoTextRender::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect )
+bool CairoTextRender::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect)
{
- const int nLevel = aGlyphId >> GF_FONTSHIFT;
+ const int nLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
if( nLevel >= MAX_FALLBACK )
return false;
@@ -440,8 +440,7 @@ bool CairoTextRender::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect
if( !pSF )
return false;
- aGlyphId &= GF_IDXMASK;
- const GlyphMetric& rGM = pSF->GetGlyphMetric(aGlyphId);
+ const GlyphMetric& rGM = pSF->GetGlyphMetric(rGlyph);
Rectangle aRect( rGM.GetOffset(), rGM.GetSize() );
if ( pSF->mnCos != 0x10000 && pSF->mnSin != 0 )
@@ -460,10 +459,10 @@ bool CairoTextRender::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect
return true;
}
-bool CairoTextRender::GetGlyphOutline( sal_GlyphId aGlyphId,
+bool CairoTextRender::GetGlyphOutline(const GlyphItem& rGlyph,
basegfx::B2DPolyPolygon& rPolyPoly )
{
- const int nLevel = aGlyphId >> GF_FONTSHIFT;
+ const int nLevel = rGlyph.maGlyphId >> GF_FONTSHIFT;
if( nLevel >= MAX_FALLBACK )
return false;
@@ -471,8 +470,7 @@ bool CairoTextRender::GetGlyphOutline( sal_GlyphId aGlyphId,
if( !pSF )
return false;
- aGlyphId &= GF_IDXMASK;
- if( pSF->GetGlyphOutline( aGlyphId, rPolyPoly ) )
+ if( pSF->GetGlyphOutline(rGlyph, rPolyPoly))
return true;
return false;
diff --git a/vcl/unx/generic/gdi/font.cxx b/vcl/unx/generic/gdi/font.cxx
index 8379c0c..37a3846 100644
--- a/vcl/unx/generic/gdi/font.cxx
+++ b/vcl/unx/generic/gdi/font.cxx
@@ -106,15 +106,15 @@ X11SalGraphics::GetFontMetric( ImplFontMetricDataRef &rxFontMetric, int nFallbac
mxTextRenderImpl->GetFontMetric(rxFontMetric, nFallbackLevel);
}
-bool X11SalGraphics::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect )
+bool X11SalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, Rectangle& rRect)
{
- return mxTextRenderImpl->GetGlyphBoundRect(aGlyphId, rRect);
+ return mxTextRenderImpl->GetGlyphBoundRect(rGlyph, rRect);
}
-bool X11SalGraphics::GetGlyphOutline( sal_GlyphId aGlyphId,
+bool X11SalGraphics::GetGlyphOutline(const GlyphItem& rGlyph,
basegfx::B2DPolyPolygon& rPolyPoly )
{
- return mxTextRenderImpl->GetGlyphOutline(aGlyphId, rPolyPoly);
+ return mxTextRenderImpl->GetGlyphOutline(rGlyph, rPolyPoly);
}
SalLayout* X11SalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLevel )
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 36b262f..2e62abe 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -627,12 +627,6 @@ void FreetypeFont::GetFontMetric(ImplFontMetricDataRef& rxTo) const
}
-static inline void SplitGlyphFlags(sal_GlyphId& rGlyphId, int& nGlyphFlags)
-{
- nGlyphFlags = rGlyphId & GF_FLAGMASK;
- rGlyphId &= GF_IDXMASK;
-}
-
void FreetypeFont::ApplyGlyphTransform( int nGlyphFlags, FT_Glyph pGlyphFT ) const
{
// shortcut most common case
@@ -696,14 +690,13 @@ void FreetypeFont::ApplyGlyphTransform( int nGlyphFlags, FT_Glyph pGlyphFT ) con
}
}
-void FreetypeFont::InitGlyphData( sal_GlyphId aGlyphId, GlyphData& rGD ) const
+void FreetypeFont::InitGlyphData(const GlyphItem& rGlyph, GlyphData& rGD ) const
{
FT_Activate_Size( maSizeFT );
- int nGlyphFlags;
- SplitGlyphFlags(aGlyphId, nGlyphFlags );
+ int nGlyphFlags = rGlyph.maGlyphId & GF_FLAGMASK;;
- FT_Error rc = FT_Load_Glyph(maFaceFT, aGlyphId, mnLoadFlags);
+ FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId & GF_IDXMASK, mnLoadFlags);
if( rc != FT_Err_Ok )
{
@@ -1001,7 +994,7 @@ static int FT_cubic_to( const FT_Vector* p1, const FT_Vector* p2, const FT_Vecto
} // extern "C"
-bool FreetypeFont::GetGlyphOutline( sal_GlyphId aGlyphId,
+bool FreetypeFont::GetGlyphOutline(const GlyphItem& rGlyph,
basegfx::B2DPolyPolygon& rB2DPolyPoly ) const
{
if( maSizeFT )
@@ -1009,8 +1002,7 @@ bool FreetypeFont::GetGlyphOutline( sal_GlyphId aGlyphId,
rB2DPolyPoly.clear();
- int nGlyphFlags;
- SplitGlyphFlags(aGlyphId, nGlyphFlags);
+ int nGlyphFlags = rGlyph.maGlyphId & GF_FLAGMASK;;
FT_Int nLoadFlags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_TRANSFORM;
@@ -1019,7 +1011,7 @@ bool FreetypeFont::GetGlyphOutline( sal_GlyphId aGlyphId,
nLoadFlags |= FT_LOAD_TARGET_LIGHT;
#endif
- FT_Error rc = FT_Load_Glyph( maFaceFT, aGlyphId, nLoadFlags );
+ FT_Error rc = FT_Load_Glyph(maFaceFT, rGlyph.maGlyphId & GF_IDXMASK, nLoadFlags);
if( rc != FT_Err_Ok )
return false;
diff --git a/vcl/unx/generic/glyphs/glyphcache.cxx b/vcl/unx/generic/glyphs/glyphcache.cxx
index 3cece78..b41f7c0 100644
--- a/vcl/unx/generic/glyphs/glyphcache.cxx
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list