diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/fxge/cfx_facecache.h | 4 | ||||
-rw-r--r-- | core/fxge/fx_font.h | 4 | ||||
-rw-r--r-- | core/fxge/ge/cfx_facecache.cpp | 11 | ||||
-rw-r--r-- | core/fxge/ge/cfx_font.cpp | 2 | ||||
-rw-r--r-- | core/fxge/skia/fx_skia_device.cpp | 52 | ||||
-rw-r--r-- | core/fxge/skia/fx_skia_device.h | 7 |
6 files changed, 47 insertions, 33 deletions
diff --git a/core/fxge/cfx_facecache.h b/core/fxge/cfx_facecache.h index 96fc73b57d..60528ba6a5 100644 --- a/core/fxge/cfx_facecache.h +++ b/core/fxge/cfx_facecache.h @@ -27,7 +27,7 @@ class CFX_FaceCache { uint32_t glyph_index, int dest_width); -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ CFX_TypeFace* GetDeviceCache(const CFX_Font* pFont); #endif @@ -56,7 +56,7 @@ class CFX_FaceCache { FXFT_Face const m_Face; std::map<CFX_ByteString, std::unique_ptr<CFX_SizeGlyphCache>> m_SizeMap; std::map<uint32_t, std::unique_ptr<CFX_PathData>> m_PathMap; -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ CFX_TypeFace* m_pTypeface; #endif }; diff --git a/core/fxge/fx_font.h b/core/fxge/fx_font.h index a1acbfdcf4..c0d204199c 100644 --- a/core/fxge/fx_font.h +++ b/core/fxge/fx_font.h @@ -23,7 +23,7 @@ class CFX_GlyphBitmap; class CFX_PathData; class CFX_SizeGlyphCache; -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ class SkTypeface; using CFX_TypeFace = SkTypeface; @@ -129,7 +129,7 @@ class CFX_Font { int& text_flags) const; const CFX_PathData* LoadGlyphPath(uint32_t glyph_index, int dest_width) const; -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ CFX_TypeFace* GetDeviceCache() const; #endif diff --git a/core/fxge/ge/cfx_facecache.cpp b/core/fxge/ge/cfx_facecache.cpp index e7e6e0e42c..942814b75a 100644 --- a/core/fxge/ge/cfx_facecache.cpp +++ b/core/fxge/ge/cfx_facecache.cpp @@ -16,7 +16,7 @@ #include "core/fxge/ge/fx_text_int.h" #include "third_party/base/numerics/safe_math.h" -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ #include "third_party/skia/include/core/SkStream.h" #include "third_party/skia/include/core/SkTypeface.h" #endif @@ -76,7 +76,7 @@ void ContrastAdjust(uint8_t* pDataIn, CFX_FaceCache::CFX_FaceCache(FXFT_Face face) : m_Face(face) -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ , m_pTypeface(nullptr) #endif @@ -84,7 +84,7 @@ CFX_FaceCache::CFX_FaceCache(FXFT_Face face) } CFX_FaceCache::~CFX_FaceCache() { -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ SkSafeUnref(m_pTypeface); #endif } @@ -300,7 +300,8 @@ const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(const CFX_Font* pFont, } #endif CFX_ByteString FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen); -#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_ +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_ || \ + defined _SKIA_SUPPORT_PATHS_ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias); #else @@ -348,7 +349,7 @@ const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(const CFX_Font* pFont, #endif } -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ CFX_TypeFace* CFX_FaceCache::GetDeviceCache(const CFX_Font* pFont) { if (!m_pTypeface) { m_pTypeface = diff --git a/core/fxge/ge/cfx_font.cpp b/core/fxge/ge/cfx_font.cpp index 5604e53e40..b778031606 100644 --- a/core/fxge/ge/cfx_font.cpp +++ b/core/fxge/ge/cfx_font.cpp @@ -709,7 +709,7 @@ const CFX_PathData* CFX_Font::LoadGlyphPath(uint32_t glyph_index, return GetFaceCache()->LoadGlyphPath(this, glyph_index, dest_width); } -#ifdef _SKIA_SUPPORT_ +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ CFX_TypeFace* CFX_Font::GetDeviceCache() const { return GetFaceCache()->GetDeviceCache(this); } diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp index 6c9763765a..d525c470af 100644 --- a/core/fxge/skia/fx_skia_device.cpp +++ b/core/fxge/skia/fx_skia_device.cpp @@ -30,6 +30,7 @@ #include "third_party/skia/include/core/SkPaint.h" #include "third_party/skia/include/core/SkPath.h" #include "third_party/skia/include/core/SkStream.h" +#include "third_party/skia/include/core/SkTypeface.h" #include "third_party/skia/include/effects/SkDashPathEffect.h" #include "third_party/skia/include/pathops/SkPathOps.h" @@ -39,7 +40,6 @@ #include "third_party/skia/include/core/SkMaskFilter.h" #include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkShader.h" -#include "third_party/skia/include/core/SkTypeface.h" #include "third_party/skia/include/effects/SkGradientShader.h" #endif // _SKIA_SUPPORT_ @@ -266,7 +266,6 @@ SkMatrix ToSkMatrix(const CFX_Matrix& m) { return skMatrix; } -#ifdef _SKIA_SUPPORT_ // use when pdf's y-axis points up insead of down SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m, SkScalar flip) { SkMatrix skMatrix; @@ -274,7 +273,6 @@ SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m, SkScalar flip) { 0, 1); return skMatrix; } -#endif // _SKIA_SUPPORT_ SkBlendMode GetSkiaBlendMode(int blend_type) { switch (blend_type) { @@ -602,6 +600,7 @@ bool Upsample(const CFX_DIBSource* pSource, } // namespace +#ifdef _SKIA_SUPPORT_ // Encapsulate the state used for successive text and path draws so that // they can be combined. class SkiaState { @@ -619,13 +618,10 @@ class SkiaState { m_strokeColor(0), m_blendType(0), m_commandIndex(0), -#if _SKIA_SUPPORT_ m_drawText(false), -#endif // _SKIA_SUPPORT_ m_drawPath(false), m_fillPath(false), - m_debugDisable(true) { - } + m_debugDisable(false) {} bool DrawPath(const CFX_PathData* pPathData, const CFX_Matrix* pMatrix, @@ -639,10 +635,8 @@ class SkiaState { return false; if (m_commandIndex < m_commands.count()) FlushCommands(pDriver); -#if _SKIA_SUPPORT_ if (m_drawText) FlushText(pDriver); -#endif // _SKIA_SUPPORT_ if (m_drawPath && DrawChanged(pMatrix, pDrawState, fill_color, stroke_color, fill_mode, blend_type)) { FlushPath(pDriver); @@ -709,7 +703,6 @@ class SkiaState { m_drawPath = false; } -#ifdef _SKIA_SUPPORT_ bool DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, @@ -773,7 +766,6 @@ class SkiaState { skCanvas->restore(); m_drawText = false; } -#endif // _SKIA_SUPPORT_ bool SetClipFill(const CFX_PathData* pPathData, const CFX_Matrix* pMatrix, @@ -963,10 +955,8 @@ class SkiaState { void Flush(CFX_SkiaDeviceDriver* pDriver) { if (m_drawPath) FlushPath(pDriver); -#ifdef _SKIA_SUPPORT_ if (m_drawText) FlushText(pDriver); -#endif // _SKIA_SUPPORT_ } void Dump(const CFX_SkiaDeviceDriver* pDriver) const { @@ -1009,13 +999,12 @@ class SkiaState { uint32_t m_strokeColor; int m_blendType; int m_commandIndex; // active position in clip command stack -#ifdef _SKIA_SUPPORT_ bool m_drawText; -#endif // _SKIA_SUPPORT_ bool m_drawPath; bool m_fillPath; bool m_debugDisable; // turn off cache for debugging }; +#endif // _SKIA_SUPPORT_ // convert a stroking path to scanlines void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, @@ -1089,7 +1078,9 @@ CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, : m_pBitmap(pBitmap), m_pOriDevice(pOriDevice), m_pRecorder(nullptr), +#ifdef _SKIA_SUPPORT_ m_pCache(new SkiaState), +#endif #ifdef _SKIA_SUPPORT_PATHS_ m_pClipRgn(nullptr), m_FillFlags(0), @@ -1136,8 +1127,10 @@ CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { } void CFX_SkiaDeviceDriver::Flush() { +#ifdef _SKIA_SUPPORT_ m_pCache->Flush(this); m_pCache->FlushCommands(this); +#endif } bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, @@ -1151,6 +1144,7 @@ bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, color, this)) { return true; } +#endif sk_sp<SkTypeface> typeface(SkSafeRef(pFont->GetDeviceCache())); SkPaint paint; paint.setAntiAlias(true); @@ -1162,6 +1156,9 @@ bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, paint.setSubpixelText(true); m_pCanvas->save(); SkScalar flip = font_size < 0 ? -1 : 1; + SkScalar vFlip = flip; + if (pFont->IsVertical()) + vFlip *= -1; SkMatrix skMatrix = ToFlippedSkMatrix(*pObject2Device, flip); m_pCanvas->concat(skMatrix); SkTDArray<SkPoint> positions; @@ -1170,17 +1167,18 @@ bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, glyphs.setCount(nChars); for (int index = 0; index < nChars; ++index) { const FXTEXT_CHARPOS& cp = pCharPos[index]; - positions[index] = {cp.m_OriginX * flip, cp.m_OriginY * flip}; + positions[index] = {cp.m_OriginX * flip, cp.m_OriginY * vFlip}; glyphs[index] = (uint16_t)cp.m_GlyphIndex; } m_pCanvas->drawPosText(glyphs.begin(), nChars * 2, positions.begin(), paint); m_pCanvas->restore(); - return true; -#endif // _SKIA_SUPPORT_ #ifdef _SKIA_SUPPORT_PATHS_ - return false; + if (FXARGB_A(color) < 255) { + m_pBitmap->MarkForUnPreMultiply(true); + } #endif // _SKIA_SUPPORT_PATHS_ + return true; } int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const { @@ -1236,7 +1234,9 @@ int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const { } void CFX_SkiaDeviceDriver::SaveState() { +#ifdef _SKIA_SUPPORT_ if (!m_pCache->ClipSave(this)) +#endif m_pCanvas->save(); #ifdef _SKIA_SUPPORT_PATHS_ @@ -1248,11 +1248,17 @@ void CFX_SkiaDeviceDriver::SaveState() { } void CFX_SkiaDeviceDriver::RestoreState(bool bKeepSaved) { +#ifdef _SKIA_SUPPORT_ if (!m_pCache->ClipRestore(this)) +#endif m_pCanvas->restore(); - if (bKeepSaved && !m_pCache->ClipSave(this)) + if (bKeepSaved +#ifdef _SKIA_SUPPORT_ + && !m_pCache->ClipSave(this) +#endif + ) { m_pCanvas->save(); - + } #ifdef _SKIA_SUPPORT_PATHS_ m_pClipRgn.reset(); @@ -1398,10 +1404,12 @@ bool CFX_SkiaDeviceDriver::DrawPath( uint32_t stroke_color, // stroke color int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled int blend_type) { +#ifdef _SKIA_SUPPORT_ if (m_pCache->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, blend_type, this)) { return true; } +#endif SkIRect rect; rect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); @@ -1451,7 +1459,7 @@ bool CFX_SkiaDeviceDriver::DrawPath( m_pCanvas->drawPath(skPath, skPaint); } m_pCanvas->restore(); -#if defined _SKIA_SUPPORT_PATHS_ +#ifdef _SKIA_SUPPORT_PATHS_ if ((fill_mode & 3 && FXARGB_A(fill_color) < 255) || (pGraphState && stroke_alpha < 255)) { m_pBitmap->MarkForUnPreMultiply(true); diff --git a/core/fxge/skia/fx_skia_device.h b/core/fxge/skia/fx_skia_device.h index e14ea7c458..bbbbdaa2dd 100644 --- a/core/fxge/skia/fx_skia_device.h +++ b/core/fxge/skia/fx_skia_device.h @@ -15,10 +15,13 @@ class SkMatrix; class SkPaint; class SkPath; class SkPictureRecorder; -class SkiaState; struct FXTEXT_CHARPOS; struct SkIRect; +#ifdef _SKIA_SUPPORT_ +class SkiaState; +#endif + class CFX_SkiaDeviceDriver : public IFX_RenderDeviceDriver { public: CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, @@ -166,7 +169,9 @@ class CFX_SkiaDeviceDriver : public IFX_RenderDeviceDriver { CFX_DIBitmap* m_pOriDevice; SkCanvas* m_pCanvas; SkPictureRecorder* const m_pRecorder; +#ifdef _SKIA_SUPPORT_ std::unique_ptr<SkiaState> m_pCache; +#endif #ifdef _SKIA_SUPPORT_PATHS_ std::unique_ptr<CFX_ClipRgn> m_pClipRgn; std::vector<std::unique_ptr<CFX_ClipRgn>> m_StateStack; |