Kaydet (Commit) ed8134d7 authored tarafından Caolán McNamara's avatar Caolán McNamara

add vertical layout as a distinguishing font layout attribute

üst 2bb1ba5c
...@@ -166,7 +166,7 @@ public: ...@@ -166,7 +166,7 @@ public:
{ return meAntiAlias == ANTIALIAS_FALSE; } { return meAntiAlias == ANTIALIAS_FALSE; }
bool DontUseHinting() const bool DontUseHinting() const
{ return (meHinting == HINTING_FALSE) || (GetHintStyle() == HINT_NONE); } { 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; } { return NULL; }
}; };
......
...@@ -72,11 +72,13 @@ public: ...@@ -72,11 +72,13 @@ public:
const void *mpFace; const void *mpFace;
const void *mpOptions; const void *mpOptions;
bool mbEmbolden; bool mbEmbolden;
bool mbVerticalMetrics;
bool operator ==(const CacheId& rOther) const bool operator ==(const CacheId& rOther) const
{ {
return mpFace == rOther.mpFace && return mpFace == rOther.mpFace &&
mpOptions == rOther.mpOptions && mpOptions == rOther.mpOptions &&
mbEmbolden == rOther.mbEmbolden; mbEmbolden == rOther.mbEmbolden &&
mbVerticalMetrics == rOther.mbVerticalMetrics;
} }
}; };
private: private:
......
...@@ -870,13 +870,17 @@ public: ...@@ -870,13 +870,17 @@ public:
{ {
FcPatternDestroy(mpPattern); FcPatternDestroy(mpPattern);
} }
virtual void *GetPattern(void * face, bool bEmbolden) const virtual void *GetPattern(void * face, bool bEmbolden, bool bVerticalLayout) const
{ {
FcValue value; FcValue value;
value.type = FcTypeFTFace; value.type = FcTypeFTFace;
value.u.f = face; value.u.f = face;
FcPatternDel(mpPattern, FC_FT_FACE);
FcPatternAdd (mpPattern, FC_FT_FACE, value, FcTrue); FcPatternAdd (mpPattern, FC_FT_FACE, value, FcTrue);
FcPatternDel(mpPattern, FC_EMBOLDEN);
FcPatternAddBool(mpPattern, FC_EMBOLDEN, bEmbolden ? FcTrue : FcFalse); FcPatternAddBool(mpPattern, FC_EMBOLDEN, bEmbolden ? FcTrue : FcFalse);
FcPatternDel(mpPattern, FC_VERTICAL_LAYOUT);
FcPatternAddBool(mpPattern, FC_VERTICAL_LAYOUT, bVerticalLayout ? FcTrue : FcFalse);
return mpPattern; return mpPattern;
} }
FcPattern* mpPattern; FcPattern* mpPattern;
......
...@@ -371,26 +371,11 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout ) ...@@ -371,26 +371,11 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout )
ServerFont& rFont = rLayout.GetServerFont(); ServerFont& rFont = rLayout.GetServerFont();
cairo_font_face_t* font_face = NULL;
void* pFace = rFont.GetFtFace(); void* pFace = rFont.GetFtFace();
CairoFontsCache::CacheId aId; CairoFontsCache::CacheId aId;
aId.mpFace = pFace; aId.mpFace = pFace;
aId.mpOptions = rFont.GetFontOptions().get(); aId.mpOptions = rFont.GetFontOptions().get();
aId.mbEmbolden = rFont.NeedsArtificialBold(); 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; cairo_matrix_t m;
const ImplFontSelectData& rFSD = rFont.GetFontSelData(); const ImplFontSelectData& rFSD = rFont.GetFontSelData();
...@@ -409,6 +394,20 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout ) ...@@ -409,6 +394,20 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout )
size_t nStartIndex = std::distance(aStart, aI); size_t nStartIndex = std::distance(aStart, aI);
size_t nLen = std::distance(aI, aNext); 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_set_font_size(cr, nHeight);
cairo_matrix_init_identity(&m); cairo_matrix_init_identity(&m);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment