diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-07-10 15:14:26 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-07-10 19:28:59 +0000 |
commit | 92e2276a8be492fd2be8e44a5d62e8a5879644d8 (patch) | |
tree | 0945f5edda0fbfb461ca1cae89a20adb583242e4 /core/fxge/cfx_fontmgr.cpp | |
parent | 1437643bfaca635d52f4cb9ec41e3075cf893f79 (diff) | |
download | pdfium-92e2276a8be492fd2be8e44a5d62e8a5879644d8.tar.xz |
Move core/fxge/ge to core/fxge.
This brings the cpp and h files together and removes the
redundant ge/ path.
Change-Id: I36594b8ae719d362768ba4c2e4ce173e287363eb
Reviewed-on: https://pdfium-review.googlesource.com/7452
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'core/fxge/cfx_fontmgr.cpp')
-rw-r--r-- | core/fxge/cfx_fontmgr.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/core/fxge/cfx_fontmgr.cpp b/core/fxge/cfx_fontmgr.cpp new file mode 100644 index 0000000000..c8beb515f0 --- /dev/null +++ b/core/fxge/cfx_fontmgr.cpp @@ -0,0 +1,259 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// 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 + +#include "core/fxge/cfx_fontmgr.h" + +#include <memory> +#include <utility> + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/cttfontdesc.h" +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/ifx_systemfontinfo.h" +#include "third_party/base/ptr_util.h" + +namespace { + +struct BuiltinFont { + const uint8_t* m_pFontData; + uint32_t m_dwSize; +}; + +const BuiltinFont g_FoxitFonts[14] = { + {g_FoxitFixedFontData, 17597}, + {g_FoxitFixedBoldFontData, 18055}, + {g_FoxitFixedBoldItalicFontData, 19151}, + {g_FoxitFixedItalicFontData, 18746}, + {g_FoxitSansFontData, 15025}, + {g_FoxitSansBoldFontData, 16344}, + {g_FoxitSansBoldItalicFontData, 16418}, + {g_FoxitSansItalicFontData, 16339}, + {g_FoxitSerifFontData, 19469}, + {g_FoxitSerifBoldFontData, 19395}, + {g_FoxitSerifBoldItalicFontData, 20733}, + {g_FoxitSerifItalicFontData, 21227}, + {g_FoxitSymbolFontData, 16729}, + {g_FoxitDingbatsFontData, 29513}, +}; + +const BuiltinFont g_MMFonts[2] = { + {g_FoxitSerifMMFontData, 113417}, + {g_FoxitSansMMFontData, 66919}, +}; + +CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, + int weight, + bool bItalic) { + CFX_ByteString key(face_name); + key += ','; + key += CFX_ByteString::FormatInteger(weight); + key += bItalic ? 'I' : 'N'; + return key; +} + +CFX_ByteString KeyNameFromSize(int ttc_size, uint32_t checksum) { + CFX_ByteString key; + key.Format("%d:%d", ttc_size, checksum); + return key; +} + +int GetTTCIndex(const uint8_t* pFontData, + uint32_t ttc_size, + uint32_t font_offset) { + int face_index = 0; + const uint8_t* p = pFontData + 8; + uint32_t nfont = GET_TT_LONG(p); + uint32_t index; + for (index = 0; index < nfont; index++) { + p = pFontData + 12 + index * 4; + if (GET_TT_LONG(p) == font_offset) + break; + } + if (index >= nfont) + face_index = 0; + else + face_index = index; + return face_index; +} + +} // namespace + +CFX_FontMgr::CFX_FontMgr() + : m_FTLibrary(nullptr), m_FTLibrarySupportsHinting(false) { + m_pBuiltinMapper = pdfium::MakeUnique<CFX_FontMapper>(this); +} + +CFX_FontMgr::~CFX_FontMgr() { + // |m_FaceMap| and |m_pBuiltinMapper| reference |m_FTLibrary|, so they must + // be destroyed first. + m_FaceMap.clear(); + m_pBuiltinMapper.reset(); + FXFT_Done_FreeType(m_FTLibrary); +} + +void CFX_FontMgr::InitFTLibrary() { + if (m_FTLibrary) + return; + FXFT_Init_FreeType(&m_FTLibrary); + m_FTLibrarySupportsHinting = + FXFT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != + FT_Err_Unimplemented_Feature; +} + +void CFX_FontMgr::SetSystemFontInfo( + std::unique_ptr<IFX_SystemFontInfo> pFontInfo) { + m_pBuiltinMapper->SetSystemFontInfo(std::move(pFontInfo)); +} + +FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int CharsetCP, + CFX_SubstFont* pSubstFont) { + InitFTLibrary(); + return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, + italic_angle, CharsetCP, pSubstFont); +} + +FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, + int weight, + bool bItalic, + uint8_t*& pFontData) { + auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); + if (it == m_FaceMap.end()) + return nullptr; + + CTTFontDesc* pFontDesc = it->second.get(); + pFontData = pFontDesc->m_pFontData; + pFontDesc->m_RefCount++; + return pFontDesc->m_SingleFace; +} + +FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, + int weight, + bool bItalic, + uint8_t* pData, + uint32_t size, + int face_index) { + auto pFontDesc = pdfium::MakeUnique<CTTFontDesc>(); + pFontDesc->m_Type = 1; + pFontDesc->m_SingleFace = nullptr; + pFontDesc->m_pFontData = pData; + pFontDesc->m_RefCount = 1; + + InitFTLibrary(); + FXFT_Library library = m_FTLibrary; + int ret = FXFT_New_Memory_Face(library, pData, size, face_index, + &pFontDesc->m_SingleFace); + if (ret) + return nullptr; + + ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace, 64, 64); + if (ret) + return nullptr; + + CTTFontDesc* pResult = pFontDesc.get(); + m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = std::move(pFontDesc); + return pResult->m_SingleFace; +} + +FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, + uint32_t checksum, + int font_offset, + uint8_t*& pFontData) { + auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum)); + if (it == m_FaceMap.end()) + return nullptr; + + CTTFontDesc* pFontDesc = it->second.get(); + pFontData = pFontDesc->m_pFontData; + pFontDesc->m_RefCount++; + int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); + if (!pFontDesc->m_TTCFaces[face_index]) { + pFontDesc->m_TTCFaces[face_index] = + GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); + } + return pFontDesc->m_TTCFaces[face_index]; +} + +FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, + uint32_t checksum, + uint8_t* pData, + uint32_t size, + int font_offset) { + auto pFontDesc = pdfium::MakeUnique<CTTFontDesc>(); + pFontDesc->m_Type = 2; + pFontDesc->m_pFontData = pData; + for (int i = 0; i < 16; i++) + pFontDesc->m_TTCFaces[i] = nullptr; + pFontDesc->m_RefCount++; + CTTFontDesc* pResult = pFontDesc.get(); + m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = std::move(pFontDesc); + int face_index = GetTTCIndex(pResult->m_pFontData, ttc_size, font_offset); + pResult->m_TTCFaces[face_index] = + GetFixedFace(pResult->m_pFontData, ttc_size, face_index); + return pResult->m_TTCFaces[face_index]; +} + +FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData, + uint32_t size, + int face_index) { + InitFTLibrary(); + FXFT_Library library = m_FTLibrary; + FXFT_Face face = nullptr; + if (FXFT_New_Memory_Face(library, pData, size, face_index, &face)) + return nullptr; + return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; +} + +FXFT_Face CFX_FontMgr::GetFileFace(const char* filename, int face_index) { + InitFTLibrary(); + FXFT_Library library = m_FTLibrary; + FXFT_Face face = nullptr; + if (FXFT_New_Face(library, filename, face_index, &face)) + return nullptr; + return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; +} + +void CFX_FontMgr::ReleaseFace(FXFT_Face face) { + if (!face) + return; + bool bNeedFaceDone = true; + auto it = m_FaceMap.begin(); + while (it != m_FaceMap.end()) { + auto temp = it++; + int nRet = temp->second->ReleaseFace(face); + if (nRet == -1) + continue; + bNeedFaceDone = false; + if (nRet == 0) + m_FaceMap.erase(temp); + break; + } + if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) + FXFT_Done_Face(face); +} + +bool CFX_FontMgr::GetBuiltinFont(size_t index, + const uint8_t** pFontData, + uint32_t* size) { + if (index < FX_ArraySize(g_FoxitFonts)) { + *pFontData = g_FoxitFonts[index].m_pFontData; + *size = g_FoxitFonts[index].m_dwSize; + return true; + } + index -= FX_ArraySize(g_FoxitFonts); + if (index < FX_ArraySize(g_MMFonts)) { + *pFontData = g_MMFonts[index].m_pFontData; + *size = g_MMFonts[index].m_dwSize; + return true; + } + return false; +} |