diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-08-02 14:42:54 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-08-02 14:42:54 +0100 |
commit | ed8134d7167c8421fd88f018c6c68342734e8fa6 (patch) | |
tree | c89f1e8a14b1f6fa93f2198219eba2e50dc970b5 /vcl | |
parent | 2bb1ba5c3f802db299a80ede39c5e3f6e498cd65 (diff) |
add vertical layout as a distinguishing font layout attribute
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/impfont.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/unx/salgdi.h | 4 | ||||
-rw-r--r-- | vcl/unx/generic/fontmanager/fontconfig.cxx | 6 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/salgdi3.cxx | 29 |
4 files changed, 23 insertions, 18 deletions
diff --git a/vcl/inc/impfont.hxx b/vcl/inc/impfont.hxx index 40355af21518..9173771b3e4c 100644 --- a/vcl/inc/impfont.hxx +++ b/vcl/inc/impfont.hxx @@ -166,7 +166,7 @@ public: { return meAntiAlias == ANTIALIAS_FALSE; } bool DontUseHinting() const { return (meHinting == HINTING_FALSE) || (GetHintStyle() == HINT_NONE); } - virtual void *GetPattern(void * /*pFace*/, bool /*bEmbolden*/) const + virtual void *GetPattern(void * /*pFace*/, bool /*bEmbolden*/, bool /*bVerticalMetrics*/) const { return NULL; } }; diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h index 1b048043dde1..fba9240a405d 100644 --- a/vcl/inc/unx/salgdi.h +++ b/vcl/inc/unx/salgdi.h @@ -72,11 +72,13 @@ public: const void *mpFace; const void *mpOptions; bool mbEmbolden; + bool mbVerticalMetrics; bool operator ==(const CacheId& rOther) const { return mpFace == rOther.mpFace && mpOptions == rOther.mpOptions && - mbEmbolden == rOther.mbEmbolden; + mbEmbolden == rOther.mbEmbolden && + mbVerticalMetrics == rOther.mbVerticalMetrics; } }; private: diff --git a/vcl/unx/generic/fontmanager/fontconfig.cxx b/vcl/unx/generic/fontmanager/fontconfig.cxx index 38a5e93e56f3..6bf7edee2489 100644 --- a/vcl/unx/generic/fontmanager/fontconfig.cxx +++ b/vcl/unx/generic/fontmanager/fontconfig.cxx @@ -870,13 +870,17 @@ public: { FcPatternDestroy(mpPattern); } - virtual void *GetPattern(void * face, bool bEmbolden) const + virtual void *GetPattern(void * face, bool bEmbolden, bool bVerticalLayout) const { FcValue value; value.type = FcTypeFTFace; value.u.f = face; + FcPatternDel(mpPattern, FC_FT_FACE); FcPatternAdd (mpPattern, FC_FT_FACE, value, FcTrue); + FcPatternDel(mpPattern, FC_EMBOLDEN); FcPatternAddBool(mpPattern, FC_EMBOLDEN, bEmbolden ? FcTrue : FcFalse); + FcPatternDel(mpPattern, FC_VERTICAL_LAYOUT); + FcPatternAddBool(mpPattern, FC_VERTICAL_LAYOUT, bVerticalLayout ? FcTrue : FcFalse); return mpPattern; } FcPattern* mpPattern; diff --git a/vcl/unx/generic/gdi/salgdi3.cxx b/vcl/unx/generic/gdi/salgdi3.cxx index aa4e90ef3c62..49ab62fb2044 100644 --- a/vcl/unx/generic/gdi/salgdi3.cxx +++ b/vcl/unx/generic/gdi/salgdi3.cxx @@ -371,26 +371,11 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout ) ServerFont& rFont = rLayout.GetServerFont(); - cairo_font_face_t* font_face = NULL; - void* pFace = rFont.GetFtFace(); CairoFontsCache::CacheId aId; aId.mpFace = pFace; aId.mpOptions = rFont.GetFontOptions().get(); aId.mbEmbolden = rFont.NeedsArtificialBold(); - font_face = (cairo_font_face_t*)m_aCairoFontsCache.FindCachedFont(aId); - if (!font_face) - { - const ImplFontOptions *pOptions = rFont.GetFontOptions().get(); - void *pPattern = pOptions ? pOptions->GetPattern(pFace, aId.mbEmbolden) : NULL; - if (pPattern) - font_face = cairo_ft_font_face_create_for_pattern(reinterpret_cast<FcPattern*>(pPattern)); - if (!font_face) - font_face = cairo_ft_font_face_create_for_ft_face(reinterpret_cast<FT_Face>(pFace), rFont.GetLoadFlags()); - m_aCairoFontsCache.CacheFont(font_face, aId); - } - - cairo_set_font_face(cr, font_face); cairo_matrix_t m; const ImplFontSelectData& rFSD = rFont.GetFontSelData(); @@ -409,6 +394,20 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout ) size_t nStartIndex = std::distance(aStart, aI); size_t nLen = std::distance(aI, aNext); + aId.mbVerticalMetrics = nGlyphRotation != 0.0; + cairo_font_face_t* font_face = (cairo_font_face_t*)m_aCairoFontsCache.FindCachedFont(aId); + if (!font_face) + { + const ImplFontOptions *pOptions = rFont.GetFontOptions().get(); + void *pPattern = pOptions ? pOptions->GetPattern(pFace, aId.mbEmbolden, aId.mbVerticalMetrics) : NULL; + if (pPattern) + font_face = cairo_ft_font_face_create_for_pattern(reinterpret_cast<FcPattern*>(pPattern)); + if (!font_face) + font_face = cairo_ft_font_face_create_for_ft_face(reinterpret_cast<FT_Face>(pFace), rFont.GetLoadFlags()); + m_aCairoFontsCache.CacheFont(font_face, aId); + } + cairo_set_font_face(cr, font_face); + cairo_set_font_size(cr, nHeight); cairo_matrix_init_identity(&m); |