Index: core/fxge/skia/fx_skia_device.cpp |
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp |
index c256468ef3e0514c6ae9da549c94546ddf6daab8..fd4f73972f9bf9d0652985e150b3e9df09c20eac 100644 |
--- a/core/fxge/skia/fx_skia_device.cpp |
+++ b/core/fxge/skia/fx_skia_device.cpp |
@@ -14,6 +14,7 @@ |
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" |
+#include "core/fxge/include/cfx_fontcache.h" |
#include "core/fxge/include/cfx_fxgedevice.h" |
#include "core/fxge/include/cfx_gemodule.h" |
#include "core/fxge/include/cfx_graphstatedata.h" |
@@ -485,6 +486,7 @@ |
// mark all cached state as uninitialized |
SkiaState() |
: m_pFont(nullptr), |
+ m_pCache(nullptr), |
m_fontSize(0), |
m_fillColor(0), |
m_strokeColor(0), |
@@ -578,6 +580,7 @@ |
bool DrawText(int nChars, |
const FXTEXT_CHARPOS* pCharPos, |
CFX_Font* pFont, |
+ CFX_FontCache* pCache, |
const CFX_Matrix* pMatrix, |
FX_FLOAT font_size, |
uint32_t color, |
@@ -588,12 +591,13 @@ |
FlushCommands(pDriver); |
if (m_drawPath) |
FlushPath(pDriver); |
- if (m_drawText && FontChanged(pFont, pMatrix, font_size, color)) |
+ if (m_drawText && FontChanged(pFont, pCache, pMatrix, font_size, color)) |
FlushText(pDriver); |
if (!m_drawText) { |
m_positions.setCount(0); |
m_glyphs.setCount(0); |
m_pFont = pFont; |
+ m_pCache = pCache; |
m_fontSize = font_size; |
m_fillColor = color; |
m_drawMatrix = *pMatrix; |
@@ -622,8 +626,8 @@ |
SkPaint skPaint; |
skPaint.setAntiAlias(true); |
skPaint.setColor(m_fillColor); |
- if (m_pFont->GetFace()) { // exclude placeholder test fonts |
- sk_sp<SkTypeface> typeface(SkSafeRef(m_pFont->GetDeviceCache())); |
+ if (m_pFont->GetFace() && m_pCache) { // exclude placeholder test fonts |
+ sk_sp<SkTypeface> typeface(SkSafeRef(m_pCache->GetDeviceCache(m_pFont))); |
skPaint.setTypeface(typeface); |
} |
skPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
@@ -779,11 +783,13 @@ |
} |
bool FontChanged(CFX_Font* pFont, |
+ CFX_FontCache* pCache, |
const CFX_Matrix* pMatrix, |
FX_FLOAT font_size, |
uint32_t color) { |
- return pFont != m_pFont || MatrixChanged(pMatrix, m_drawMatrix) || |
- font_size != m_fontSize || color != m_fillColor; |
+ return pFont != m_pFont || pCache != m_pCache || |
+ MatrixChanged(pMatrix, m_drawMatrix) || font_size != m_fontSize || |
+ color != m_fillColor; |
} |
bool MatrixChanged(const CFX_Matrix* pMatrix, const CFX_Matrix& refMatrix) { |
@@ -866,6 +872,7 @@ |
CFX_GraphStateData m_drawState; |
CFX_Matrix m_clipMatrix; |
CFX_Font* m_pFont; |
+ CFX_FontCache* m_pCache; |
FX_FLOAT m_fontSize; |
uint32_t m_fillColor; |
uint32_t m_strokeColor; |
@@ -998,14 +1005,18 @@ |
FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, |
const FXTEXT_CHARPOS* pCharPos, |
CFX_Font* pFont, |
+ CFX_FontCache* pCache, |
const CFX_Matrix* pObject2Device, |
FX_FLOAT font_size, |
uint32_t color) { |
- if (m_pCache->DrawText(nChars, pCharPos, pFont, pObject2Device, font_size, |
- color, this)) { |
+ if (!pCache) |
+ pCache = CFX_GEModule::Get()->GetFontCache(); |
+ if (m_pCache->DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, |
+ font_size, color, this)) { |
return TRUE; |
} |
- sk_sp<SkTypeface> typeface(SkSafeRef(pFont->GetDeviceCache())); |
+ sk_sp<SkTypeface> typeface( |
+ SkSafeRef(pCache ? pCache->GetDeviceCache(pFont) : nullptr)); |
SkPaint paint; |
paint.setAntiAlias(true); |
paint.setColor(color); |