summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-08-02 14:42:54 +0100
committerCaolán McNamara <caolanm@redhat.com>2011-08-02 14:42:54 +0100
commited8134d7167c8421fd88f018c6c68342734e8fa6 (patch)
treec89f1e8a14b1f6fa93f2198219eba2e50dc970b5 /vcl
parent2bb1ba5c3f802db299a80ede39c5e3f6e498cd65 (diff)
add vertical layout as a distinguishing font layout attribute
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/impfont.hxx2
-rw-r--r--vcl/inc/unx/salgdi.h4
-rw-r--r--vcl/unx/generic/fontmanager/fontconfig.cxx6
-rw-r--r--vcl/unx/generic/gdi/salgdi3.cxx29
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);