summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-11-23 14:54:50 +0000
committerTomaž Vajngerl <quikee@gmail.com>2016-11-24 12:31:50 +0000
commit65bc0588eb9e9212238768b3418711fbe881510f (patch)
tree57b347d1ba72aaf5fa58c8f921d6372d6038befe
parent6218637c2a9b64793bee5654b8f2948293d0ec03 (diff)
with wayland scaling cairo is meddling with our font
so I see mixed large scaled and small unscaled letters in the writer header/footer widget among other places so don't give it our FreeType font face (FC_FT_FACE), keep that for ourselves, but instead set the filename and face index and let it make a new one itself. Reviewed-on: https://gerrit.libreoffice.org/31127 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit 8c3e1465223bd8c824c4cecfd0e6fc387583e592) Change-Id: I2e5eceb7bf590ccfeb06123d0404120feacfff97 Reviewed-on: https://gerrit.libreoffice.org/31155 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r--vcl/inc/unx/cairotextrender.hxx6
-rw-r--r--vcl/inc/unx/fc_fontoptions.hxx3
-rw-r--r--vcl/inc/unx/freetype_glyphcache.hxx1
-rw-r--r--vcl/inc/unx/glyphcache.hxx3
-rw-r--r--vcl/unx/generic/fontmanager/fontconfig.cxx29
-rw-r--r--vcl/unx/generic/gdi/cairotextrender.cxx9
-rw-r--r--vcl/unx/generic/glyphs/freetype_glyphcache.cxx17
7 files changed, 39 insertions, 29 deletions
diff --git a/vcl/inc/unx/cairotextrender.hxx b/vcl/inc/unx/cairotextrender.hxx
index 612daaede16d..6427951ec23d 100644
--- a/vcl/inc/unx/cairotextrender.hxx
+++ b/vcl/inc/unx/cairotextrender.hxx
@@ -28,8 +28,10 @@
typedef struct FT_FaceRec_* FT_Face;
+class FontConfigFontOptions;
class ServerFont;
class GlyphCache;
+class FontConfigFontOptions;
typedef struct _cairo cairo_t;
class VCL_DLLPUBLIC CairoFontsCache
@@ -38,7 +40,7 @@ public:
struct CacheId
{
FT_Face maFace;
- const void *mpOptions;
+ const FontConfigFontOptions *mpOptions;
bool mbEmbolden;
bool mbVerticalMetrics;
bool operator ==(const CacheId& rOther) const
@@ -124,6 +126,8 @@ public:
#endif
};
+FontConfigFontOptions* GetFCFontOptions( const FontAttributes& rFontAttributes, int nSize);
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/unx/fc_fontoptions.hxx b/vcl/inc/unx/fc_fontoptions.hxx
index d085e260366b..5a2af5d4a543 100644
--- a/vcl/inc/unx/fc_fontoptions.hxx
+++ b/vcl/inc/unx/fc_fontoptions.hxx
@@ -51,7 +51,8 @@ public:
bool DontUseEmbeddedBitmaps() const { return meEmbeddedBitmap == EMBEDDEDBITMAP_FALSE; }
bool DontUseAntiAlias() const { return meAntiAlias == ANTIALIAS_FALSE; }
bool DontUseHinting() const { return (meHinting == HINTING_FALSE) || (GetHintStyle() == FontHintStyle::NONE); }
- void* GetPattern(void * /*pFace*/, bool /*bEmbolden*/) const;
+ void SyncPattern(const OString& rFileName, int nFontFace, bool bEmbolden);
+ FcPattern* GetPattern() const;
private:
FcPattern* mpPattern;
};
diff --git a/vcl/inc/unx/freetype_glyphcache.hxx b/vcl/inc/unx/freetype_glyphcache.hxx
index 3b8d315e5a5c..7acdbd6f7d7a 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -72,6 +72,7 @@ public:
void ReleaseFaceFT();
const OString& GetFontFileName() const { return mpFontFile->GetFileName(); }
+ int GetFontFaceIndex() const { return mnFaceNum; }
sal_IntPtr GetFontId() const { return mnFontId; }
bool IsSymbolFont() const { return maDevFontAttributes.IsSymbolFont(); }
const FontAttributes& GetFontAttributes() const { return maDevFontAttributes; }
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index 04723cbd75ed..f605e16641f3 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -151,6 +151,7 @@ public:
virtual ~ServerFont();
const OString& GetFontFileName() const;
+ int GetFontFaceIndex() const;
bool TestFont() const { return mbFaceOk;}
FT_Face GetFtFace() const;
int GetLoadFlags() const { return (mnLoadFlags & ~FT_LOAD_IGNORE_TRANSFORM); }
@@ -229,7 +230,7 @@ private:
FT_FaceRec_* maFaceFT;
FT_SizeRec_* maSizeFT;
- std::shared_ptr<FontConfigFontOptions> mxFontOptions;
+ mutable std::shared_ptr<FontConfigFontOptions> mxFontOptions;
bool mbFaceOk;
bool mbArtItalic;
diff --git a/vcl/unx/generic/fontmanager/fontconfig.cxx b/vcl/unx/generic/fontmanager/fontconfig.cxx
index 957afb14b381..79971d5d18ed 100644
--- a/vcl/unx/generic/fontmanager/fontconfig.cxx
+++ b/vcl/unx/generic/fontmanager/fontconfig.cxx
@@ -1143,21 +1143,20 @@ FontConfigFontOptions::~FontConfigFontOptions()
FcPatternDestroy(mpPattern);
}
- void *FontConfigFontOptions::GetPattern(void * face, bool bEmbolden) 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);
-#if 0
- FcPatternDel(mpPattern, FC_VERTICAL_LAYOUT);
- FcPatternAddBool(mpPattern, FC_VERTICAL_LAYOUT, bVerticalLayout ? FcTrue : FcFalse);
-#endif
- return mpPattern;
- }
+FcPattern *FontConfigFontOptions::GetPattern() const
+{
+ return mpPattern;
+}
+
+void FontConfigFontOptions::SyncPattern(const OString& rFileName, int nIndex, bool bEmbolden)
+{
+ FcPatternDel(mpPattern, FC_FILE);
+ FcPatternAddString(mpPattern, FC_FILE, reinterpret_cast<FcChar8 const *>(rFileName.getStr()));
+ FcPatternDel(mpPattern, FC_INDEX);
+ FcPatternAddInteger(mpPattern, FC_INDEX, nIndex);
+ FcPatternDel(mpPattern, FC_EMBOLDEN);
+ FcPatternAddBool(mpPattern, FC_EMBOLDEN, bEmbolden ? FcTrue : FcFalse);
+}
FontConfigFontOptions* PrintFontManager::getFontOptions(
const FastPrintFontInfo& rInfo, int nSize, void (*subcallback)(void*))
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index 513f5e58dc2e..c904fa003829 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -244,12 +244,9 @@ void CairoTextRender::DrawServerFontLayout( const ServerFontLayout& rLayout )
cairo_font_face_t* font_face = static_cast<cairo_font_face_t*>(CairoFontsCache::FindCachedFont(aId));
if (!font_face)
{
- const FontConfigFontOptions *pOptions = rFont.GetFontOptions().get();
- void *pPattern = pOptions ? pOptions->GetPattern(aFace, aId.mbEmbolden) : nullptr;
- if (pPattern)
- font_face = cairo_ft_font_face_create_for_pattern(static_cast<FcPattern*>(pPattern));
- if (!font_face)
- font_face = cairo_ft_font_face_create_for_ft_face(reinterpret_cast<FT_Face>(aFace), rFont.GetLoadFlags());
+ const FontConfigFontOptions *pOptions = aId.mpOptions;
+ FcPattern *pPattern = pOptions->GetPattern();
+ font_face = cairo_ft_font_face_create_for_pattern(pPattern);
CairoFontsCache::CacheFont(font_face, aId);
}
cairo_set_font_face(cr, font_face);
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index e12fcb8332c5..db656d318a23 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -20,6 +20,7 @@
#include <vcl/fontcharmap.hxx>
+#include <unx/cairotextrender.hxx>
#include "unx/freetype_glyphcache.hxx"
#include <vcl/svapp.hxx>
@@ -510,11 +511,7 @@ ServerFont::ServerFont( const FontSelectPattern& rFSD, FreetypeFontInfo* pFI )
ApplyGSUB( rFSD );
// TODO: query GASP table for load flags
- mnLoadFlags = FT_LOAD_DEFAULT;
-#if 1 // #i97326# cairo sometimes uses FT_Set_Transform() on our FT_FACE
- // we are not using FT_Set_Transform() yet, so just ignore it for now
- mnLoadFlags |= FT_LOAD_IGNORE_TRANSFORM;
-#endif
+ mnLoadFlags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_TRANSFORM;
mbArtItalic = (rFSD.GetItalic() != ITALIC_NONE && pFI->GetFontAttributes().GetItalic() == ITALIC_NONE);
mbArtBold = (rFSD.GetWeight() > WEIGHT_MEDIUM && pFI->GetFontAttributes().GetWeight() <= WEIGHT_MEDIUM);
@@ -592,6 +589,12 @@ void ServerFont::SetFontOptions(const std::shared_ptr<FontConfigFontOptions>& xF
const std::shared_ptr<FontConfigFontOptions>& ServerFont::GetFontOptions() const
{
+ if (!mxFontOptions)
+ {
+ SAL_WARN("vcl", "this doesn't happen in practice I believe");
+ mxFontOptions.reset(GetFCFontOptions(mpFontInfo->GetFontAttributes(), maFontSelData.mnHeight));
+ }
+ mxFontOptions->SyncPattern(GetFontFileName(), GetFontFaceIndex(), NeedsArtificialBold());
return mxFontOptions;
}
@@ -600,6 +603,10 @@ const OString& ServerFont::GetFontFileName() const
return mpFontInfo->GetFontFileName();
}
+int ServerFont::GetFontFaceIndex() const
+{
+ return mpFontInfo->GetFontFaceIndex();
+}
ServerFont::~ServerFont()
{