// Copyright 2016 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_FXGE_CFX_GLYPHCACHE_H_ #define CORE_FXGE_CFX_GLYPHCACHE_H_ #include #include #include #include "core/fxcrt/bytestring.h" #include "core/fxcrt/observed_ptr.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxge/cfx_face.h" #if defined(_SKIA_SUPPORT_) #include "core/fxge/fx_font.h" #include "third_party/skia/include/core/SkTypeface.h" // nogncheck #endif class CFX_Font; class CFX_GlyphBitmap; class CFX_Matrix; class CFX_Path; struct CFX_TextRenderOptions; class CFX_GlyphCache final : public Retainable, public Observable { public: CONSTRUCT_VIA_MAKE_RETAIN; ~CFX_GlyphCache() override; const CFX_GlyphBitmap* LoadGlyphBitmap(const CFX_Font* pFont, uint32_t glyph_index, bool bFontStyle, const CFX_Matrix& matrix, int dest_width, int anti_alias, CFX_TextRenderOptions* text_options); const CFX_Path* LoadGlyphPath(const CFX_Font* pFont, uint32_t glyph_index, int dest_width); int GetGlyphWidth(const CFX_Font* font, uint32_t glyph_index, int dest_width, int weight); RetainPtr GetFace() { return m_Face; } FXFT_FaceRec* GetFaceRec() { return m_Face ? m_Face->GetRec() : nullptr; } #if defined(_SKIA_SUPPORT_) CFX_TypeFace* GetDeviceCache(const CFX_Font* pFont); #endif private: explicit CFX_GlyphCache(RetainPtr face); using SizeGlyphCache = std::map>; // using PathMapKey = std::tuple; // using WidthMapKey = std::tuple; std::unique_ptr RenderGlyph(const CFX_Font* pFont, uint32_t glyph_index, bool bFontStyle, const CFX_Matrix& matrix, int dest_width, int anti_alias); std::unique_ptr RenderGlyph_Nativetext( const CFX_Font* pFont, uint32_t glyph_index, const CFX_Matrix& matrix, int dest_width, int anti_alias); CFX_GlyphBitmap* LookUpGlyphBitmap(const CFX_Font* pFont, const CFX_Matrix& matrix, const ByteString& FaceGlyphsKey, uint32_t glyph_index, bool bFontStyle, int dest_width, int anti_alias); RetainPtr const m_Face; std::map m_SizeMap; std::map> m_PathMap; std::map m_WidthMap; #if defined(_SKIA_SUPPORT_) sk_sp m_pTypeface; #endif }; #endif // CORE_FXGE_CFX_GLYPHCACHE_H_