blob: 2ac215800da17d73b419be52e765563bd3f566a0 [file] [edit]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fxge/cfx_standardfont.h"
#include <algorithm>
#include <array>
#include <iterator>
#include "core/fxcrt/containers/contains.h"
#include "core/fxcrt/fx_extension.h"
#include "core/fxge/fontdata/chromefontdata/chromefontdata.h"
namespace {
static_assert(CFX_StandardFont::kLast + 1 ==
CFX_StandardFont::kNumStandardFonts,
"StandardFont enum count mismatch");
constexpr std::array<pdfium::span<const uint8_t>,
CFX_StandardFont::kNumStandardFonts>
kFoxitFonts = {{
kFoxitFixedFontData,
kFoxitFixedBoldFontData,
kFoxitFixedBoldItalicFontData,
kFoxitFixedItalicFontData,
kFoxitSansFontData,
kFoxitSansBoldFontData,
kFoxitSansBoldItalicFontData,
kFoxitSansItalicFontData,
kFoxitSerifFontData,
kFoxitSerifBoldFontData,
kFoxitSerifBoldItalicFontData,
kFoxitSerifItalicFontData,
kFoxitSymbolFontData,
kFoxitDingbatsFontData,
}};
constexpr pdfium::span<const uint8_t> kGenericSansFont = kFoxitSansMMFontData;
constexpr pdfium::span<const uint8_t> kGenericSerifFont = kFoxitSerifMMFontData;
constexpr std::array<const char*, CFX_StandardFont::kNumStandardFonts>
kBase14FontNames = {{
"Courier",
"Courier-Bold",
"Courier-BoldOblique",
"Courier-Oblique",
"Helvetica",
"Helvetica-Bold",
"Helvetica-BoldOblique",
"Helvetica-Oblique",
"Times-Roman",
"Times-Bold",
"Times-BoldItalic",
"Times-Italic",
"Symbol",
"ZapfDingbats",
}};
struct AltFontName {
const char* name_; // Raw, POD struct.
CFX_StandardFont::Index index_;
};
constexpr AltFontName kAltFontNames[] = {
{"Arial", CFX_StandardFont::kHelvetica},
{"Arial,Bold", CFX_StandardFont::kHelveticaBold},
{"Arial,BoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"Arial,Italic", CFX_StandardFont::kHelveticaOblique},
{"Arial-Bold", CFX_StandardFont::kHelveticaBold},
{"Arial-BoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"Arial-BoldItalicMT", CFX_StandardFont::kHelveticaBoldOblique},
{"Arial-BoldMT", CFX_StandardFont::kHelveticaBold},
{"Arial-Italic", CFX_StandardFont::kHelveticaOblique},
{"Arial-ItalicMT", CFX_StandardFont::kHelveticaOblique},
{"ArialBold", CFX_StandardFont::kHelveticaBold},
{"ArialBoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"ArialItalic", CFX_StandardFont::kHelveticaOblique},
{"ArialMT", CFX_StandardFont::kHelvetica},
{"ArialMT,Bold", CFX_StandardFont::kHelveticaBold},
{"ArialMT,BoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"ArialMT,Italic", CFX_StandardFont::kHelveticaOblique},
{"ArialRoundedMTBold", CFX_StandardFont::kHelveticaBold},
{"Courier", CFX_StandardFont::kCourier},
{"Courier,Bold", CFX_StandardFont::kCourierBold},
{"Courier,BoldItalic", CFX_StandardFont::kCourierBoldOblique},
{"Courier,Italic", CFX_StandardFont::kCourierOblique},
{"Courier-Bold", CFX_StandardFont::kCourierBold},
{"Courier-BoldOblique", CFX_StandardFont::kCourierBoldOblique},
{"Courier-Oblique", CFX_StandardFont::kCourierOblique},
{"CourierBold", CFX_StandardFont::kCourierBold},
{"CourierBoldItalic", CFX_StandardFont::kCourierBoldOblique},
{"CourierItalic", CFX_StandardFont::kCourierOblique},
{"CourierNew", CFX_StandardFont::kCourier},
{"CourierNew,Bold", CFX_StandardFont::kCourierBold},
{"CourierNew,BoldItalic", CFX_StandardFont::kCourierBoldOblique},
{"CourierNew,Italic", CFX_StandardFont::kCourierOblique},
{"CourierNew-Bold", CFX_StandardFont::kCourierBold},
{"CourierNew-BoldItalic", CFX_StandardFont::kCourierBoldOblique},
{"CourierNew-Italic", CFX_StandardFont::kCourierOblique},
{"CourierNewBold", CFX_StandardFont::kCourierBold},
{"CourierNewBoldItalic", CFX_StandardFont::kCourierBoldOblique},
{"CourierNewItalic", CFX_StandardFont::kCourierOblique},
{"CourierNewPS-BoldItalicMT", CFX_StandardFont::kCourierBoldOblique},
{"CourierNewPS-BoldMT", CFX_StandardFont::kCourierBold},
{"CourierNewPS-ItalicMT", CFX_StandardFont::kCourierOblique},
{"CourierNewPSMT", CFX_StandardFont::kCourier},
{"CourierStd", CFX_StandardFont::kCourier},
{"CourierStd-Bold", CFX_StandardFont::kCourierBold},
{"CourierStd-BoldOblique", CFX_StandardFont::kCourierBoldOblique},
{"CourierStd-Oblique", CFX_StandardFont::kCourierOblique},
{"Helvetica", CFX_StandardFont::kHelvetica},
{"Helvetica,Bold", CFX_StandardFont::kHelveticaBold},
{"Helvetica,BoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"Helvetica,Italic", CFX_StandardFont::kHelveticaOblique},
{"Helvetica-Bold", CFX_StandardFont::kHelveticaBold},
{"Helvetica-BoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"Helvetica-BoldOblique", CFX_StandardFont::kHelveticaBoldOblique},
{"Helvetica-Italic", CFX_StandardFont::kHelveticaOblique},
{"Helvetica-Oblique", CFX_StandardFont::kHelveticaOblique},
{"HelveticaBold", CFX_StandardFont::kHelveticaBold},
{"HelveticaBoldItalic", CFX_StandardFont::kHelveticaBoldOblique},
{"HelveticaItalic", CFX_StandardFont::kHelveticaOblique},
{"Symbol", CFX_StandardFont::kSymbol},
{"SymbolMT", CFX_StandardFont::kSymbol},
{"Times-Bold", CFX_StandardFont::kTimesBold},
{"Times-BoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"Times-Italic", CFX_StandardFont::kTimesOblique},
{"Times-Roman", CFX_StandardFont::kTimes},
{"TimesBold", CFX_StandardFont::kTimesBold},
{"TimesBoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"TimesItalic", CFX_StandardFont::kTimesOblique},
{"TimesNewRoman", CFX_StandardFont::kTimes},
{"TimesNewRoman,Bold", CFX_StandardFont::kTimesBold},
{"TimesNewRoman,BoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"TimesNewRoman,Italic", CFX_StandardFont::kTimesOblique},
{"TimesNewRoman-Bold", CFX_StandardFont::kTimesBold},
{"TimesNewRoman-BoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"TimesNewRoman-Italic", CFX_StandardFont::kTimesOblique},
{"TimesNewRomanBold", CFX_StandardFont::kTimesBold},
{"TimesNewRomanBoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"TimesNewRomanItalic", CFX_StandardFont::kTimesOblique},
{"TimesNewRomanPS", CFX_StandardFont::kTimes},
{"TimesNewRomanPS-Bold", CFX_StandardFont::kTimesBold},
{"TimesNewRomanPS-BoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"TimesNewRomanPS-BoldItalicMT", CFX_StandardFont::kTimesBoldOblique},
{"TimesNewRomanPS-BoldMT", CFX_StandardFont::kTimesBold},
{"TimesNewRomanPS-Italic", CFX_StandardFont::kTimesOblique},
{"TimesNewRomanPS-ItalicMT", CFX_StandardFont::kTimesOblique},
{"TimesNewRomanPSMT", CFX_StandardFont::kTimes},
{"TimesNewRomanPSMT,Bold", CFX_StandardFont::kTimesBold},
{"TimesNewRomanPSMT,BoldItalic", CFX_StandardFont::kTimesBoldOblique},
{"TimesNewRomanPSMT,Italic", CFX_StandardFont::kTimesOblique},
{"ZapfDingbats", CFX_StandardFont::kDingbats},
};
} // namespace
// static
std::optional<CFX_StandardFont::Index> CFX_StandardFont::GetStandardFontIndex(
const ByteString& name) {
const auto* end = std::end(kAltFontNames);
const auto* found =
std::lower_bound(std::begin(kAltFontNames), end, name.c_str(),
[](const AltFontName& element, const char* name) {
return FXSYS_stricmp(element.name_, name) < 0;
});
if (found == end || FXSYS_stricmp(found->name_, name.c_str())) {
return std::nullopt;
}
return found->index_;
}
// static
ByteString CFX_StandardFont::GetCanonicalFontName(Index font) {
return kBase14FontNames[static_cast<size_t>(font)];
}
// static
bool CFX_StandardFont::IsStandardFontName(const ByteString& name) {
return pdfium::Contains(kBase14FontNames, name);
}
// static
bool CFX_StandardFont::IsSymbolicFont(Index font) {
return font == CFX_StandardFont::kSymbol ||
font == CFX_StandardFont::kDingbats;
}
// static
bool CFX_StandardFont::IsFixedFont(Index font) {
return font == CFX_StandardFont::kCourier ||
font == CFX_StandardFont::kCourierBold ||
font == CFX_StandardFont::kCourierBoldOblique ||
font == CFX_StandardFont::kCourierOblique;
}
// static
pdfium::span<const uint8_t> CFX_StandardFont::GetFontData(Index font) {
return kFoxitFonts[static_cast<size_t>(font)];
}
// static
pdfium::span<const uint8_t> CFX_StandardFont::GetGenericSansFontData() {
return kGenericSansFont;
}
// static
pdfium::span<const uint8_t> CFX_StandardFont::GetGenericSerifFontData() {
return kGenericSerifFont;
}