7#include "core/fpdfapi/font/cpdf_font.h"
15#include "build/build_config.h"
16#include "constants/font_encodings.h"
17#include "core/fpdfapi/font/cpdf_cidfont.h"
18#include "core/fpdfapi/font/cpdf_fontencoding.h"
19#include "core/fpdfapi/font/cpdf_fontglobals.h"
20#include "core/fpdfapi/font/cpdf_tounicodemap.h"
21#include "core/fpdfapi/font/cpdf_truetypefont.h"
22#include "core/fpdfapi/font/cpdf_type1font.h"
23#include "core/fpdfapi/font/cpdf_type3font.h"
24#include "core/fpdfapi/parser/cpdf_array.h"
25#include "core/fpdfapi/parser/cpdf_dictionary.h"
26#include "core/fpdfapi/parser/cpdf_document.h"
27#include "core/fpdfapi/parser/cpdf_name.h"
28#include "core/fpdfapi/parser/cpdf_stream.h"
29#include "core/fpdfapi/parser/cpdf_stream_acc.h"
30#include "core/fxcrt/check.h"
31#include "core/fxcrt/fx_codepage.h"
32#include "core/fxcrt/fx_safe_types.h"
33#include "core/fxcrt/stl_util.h"
34#include "core/fxge/cfx_fontmapper.h"
35#include "core/fxge/cfx_substfont.h"
36#include "core/fxge/fx_font.h"
40constexpr std::array<
const char*, 5> kChineseFontNames = {{
57 if (!m_bWillBeDestroyed && m_pFontFile) {
58 m_pDocument->MaybePurgeFontFileStreamAcc(std::move(m_pFontFile));
111 return pString.GetLength();
114#if BUILDFLAG(IS_APPLE)
115int CPDF_Font::GlyphFromCharCodeExt(uint32_t charcode) {
116 return GlyphFromCharCode(charcode,
nullptr);
126 return pCIDFont ? pCIDFont->IsVertWriting() : m_Font.IsVertical();
130 *str
+= static_cast<
char>(charcode);
137 return m_pToUnicodeMap ? m_pToUnicodeMap->Lookup(charcode) : WideString();
144 return m_pToUnicodeMap ? m_pToUnicodeMap->ReverseLookup(unicode) : 0;
154 bool bExistItalicAngle =
false;
157 bExistItalicAngle =
true;
159 if (ItalicAngle < 0) {
163 bool bExistStemV =
false;
168 bool bExistAscent =
false;
173 bool bExistDescent =
false;
176 bExistDescent =
true;
178 bool bExistCapHeight =
false;
180 bExistCapHeight =
true;
181 if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent &&
195 RetainPtr<
const CPDF_Stream> pFontFile = pFontDesc->GetStreamFor(
"FontFile");
203 const uint64_t key = pFontFile->KeyForCache();
204 m_pFontFile = m_pDocument->GetFontFileStreamAcc(std::move(pFontFile));
208 if (!m_Font.LoadEmbedded(m_pFontFile->GetSpan(), IsVertWriting(), key))
209 m_pDocument->MaybePurgeFontFileStreamAcc(std::move(m_pFontFile));
215 RetainPtr<CFX_Face> face = m_Font.GetFace();
218 const FX_RECT raw_bbox = face->GetBBox();
219 const uint16_t upem = face->GetUnitsPerEm();
224 m_Ascent = NormalizeFontMetric(face->GetAscender(), upem);
225 m_Descent = NormalizeFontMetric(face->GetDescender(), upem);
228 for (
int i = 0; i < 256; i++) {
255 RetainPtr<
const CPDF_Stream> pStream = m_pFontDict->GetStreamFor(
"ToUnicode");
259 m_pToUnicodeMap = std::make_unique<CPDF_ToUnicodeMap>(std::move(pStream));
265 while (offset < pString.GetLength())
266 width += GetCharWidthF(GetNextChar(pString, &offset));
275 CFX_FontMapper::GetStandardFontName(&fontname);
276 if (!font_id.has_value())
285 pDict->SetNewFor<CPDF_Name>(
"Type",
"Font");
286 pDict->SetNewFor<CPDF_Name>(
"Subtype",
"Type1");
287 pDict->SetNewFor<CPDF_Name>(
"BaseFont", fontname);
288 pDict->SetNewFor<CPDF_Name>(
"Encoding",
291 pFontGlobals
->Set(pDoc
, font_id.value()
, pFont
);
299 ByteString type = pFontDict->GetByteStringFor(
"Subtype");
301 if (type
== "TrueType") {
302 ByteString tag = pFontDict->GetByteStringFor(
"BaseFont").First(4);
303 for (
const char* chinese_font_name : kChineseFontNames) {
304 if (tag == chinese_font_name) {
305 RetainPtr<
const CPDF_Dictionary> pFontDesc =
306 pFontDict->GetDictFor(
"FontDescriptor");
307 if (!pFontDesc || !pFontDesc->KeyExist(
"FontFile2"))
308 pFont = pdfium::MakeRetain<CPDF_CIDFont>(pDoc, std::move(pFontDict));
313 pFont =
pdfium::MakeRetain<CPDF_TrueTypeFont>(pDoc,
std::move(pFontDict));
314 }
else if (type
== "Type3") {
315 pFont =
pdfium::MakeRetain<CPDF_Type3Font>(pDoc,
std::move(pFontDict),
317 }
else if (type
== "Type0") {
318 pFont =
pdfium::MakeRetain<CPDF_CIDFont>(pDoc,
std::move(pFontDict));
320 pFont =
pdfium::MakeRetain<CPDF_Type1Font>(pDoc,
std::move(pFontDict));
329 if (pString.IsEmpty())
332 size_t& offset = *pOffset;
333 return offset < pString.GetLength() ? pString[offset++] : pString.Back();
354 const std::vector<ByteString>& charnames,
359 if (!charnames.empty() && !charnames[charcode].IsEmpty())
360 return charnames[charcode].c_str();
362 const char* name =
nullptr;
373 if (m_FontFallbacks.empty()) {
374 m_FontFallbacks.push_back(std::make_unique<CFX_Font>());
377 m_FontFallbacks[0]->LoadSubst(
"Arial", IsTrueTypeFont(), m_Flags,
379 m_ItalicAngle, FX_CodePage::kDefANSI,
386 if (!fxcrt::IndexInBounds(m_FontFallbacks, fallbackFont))
390 uint32_t unicode = !str.IsEmpty() ? str[0] : charcode;
391 int glyph = m_FontFallbacks[fallbackFont]->GetFace()->GetCharIndex(unicode);
399 if (position < 0 ||
static_cast<size_t>(position) >= m_FontFallbacks.size())
401 return m_FontFallbacks[position].get();
408 for (size_t i = 0; i < face->GetCharMapCount(); i++) {
409 if (face->GetCharMapPlatformIdByIndex(i) == platform_id &&
410 face->GetCharMapEncodingIdByIndex(i) == encoding_id) {
411 face->SetCharMapByIndex(i);
423 safeStemV = safeStemV * 4 + 140;
fxcrt::ByteString ByteString
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
bool KeyExist(const ByteString &key) const
int GetIntegerFor(const ByteString &key) const
RetainPtr< const CPDF_Stream > GetStreamFor(const ByteString &key) const
int GetIntegerFor(const ByteString &key, int default_int) const
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
void Set(CPDF_Document *pDoc, CFX_FontMapper::StandardFont index, RetainPtr< CPDF_Font > pFont)
static CPDF_FontGlobals * GetInstance()
virtual FX_RECT GetCharBBox(uint32_t charcode)=0
virtual bool IsTrueTypeFont() const
virtual const CPDF_CIDFont * AsCIDFont() const
std::optional< FX_Charset > GetSubstFontCharset() const
virtual void WillBeDestroyed()
int FallbackGlyphFromCharcode(int fallbackFont, uint32_t charcode)
void LoadFontDescriptor(const CPDF_Dictionary *pFontDesc)
virtual void AppendChar(ByteString *buf, uint32_t charcode) const
virtual CPDF_CIDFont * AsCIDFont()
virtual bool IsType1Font() const
virtual bool IsVertWriting() const
CPDF_Font(CPDF_Document *pDocument, RetainPtr< CPDF_Dictionary > pFontDict)
void LoadUnicodeMap() const
static RetainPtr< CPDF_Font > Create(CPDF_Document *pDoc, RetainPtr< CPDF_Dictionary > pFontDict, FormFactoryIface *pFactory)
virtual uint32_t CharCodeFromUnicode(wchar_t Unicode) const
virtual const CPDF_TrueTypeFont * AsTrueTypeFont() const
virtual const CPDF_Type1Font * AsType1Font() const
virtual bool IsCIDFont() const
virtual WideString UnicodeFromCharCode(uint32_t charcode) const
virtual const CPDF_Type3Font * AsType3Font() const
static RetainPtr< CPDF_Font > GetStockFont(CPDF_Document *pDoc, ByteStringView fontname)
static bool UseTTCharmap(const RetainPtr< CFX_Face > &face, int platform_id, int encoding_id)
virtual size_t CountChar(ByteStringView pString) const
int GetStringWidth(ByteStringView pString)
virtual CPDF_Type1Font * AsType1Font()
virtual bool HasFontWidths() const
virtual bool IsType3Font() const
virtual CPDF_Type3Font * AsType3Font()
virtual CPDF_TrueTypeFont * AsTrueTypeFont()
int GetFontWeight() const
virtual uint32_t GetNextChar(ByteStringView pString, size_t *pOffset) const
uint32_t FallbackFontFromCharcode(uint32_t charcode)
bool IsStandardFont() const
CFX_Font * GetFontFallback(int position)
bool IsBase14Font() const
ByteString & operator+=(char ch)
bool operator==(const char *ptr) const
const char * CharNameFromPredefinedCharSet(FontEncoding encoding, uint8_t charcode)
int NormalizeFontMetric(int64_t value, uint16_t upem)
#define FXFONT_USEEXTERNATTR
#define FXFONT_NONSYMBOLIC
pdfium::CheckedNumeric< int32_t > FX_SAFE_INT32
const char kWinAnsiEncoding[]
fxcrt::ByteStringView ByteStringView
FX_RECT & operator=(const FX_RECT &that)=default
fxcrt::WideString WideString