#include "src/pdf/SkPDFFont.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkData.h"
#include "include/core/SkDrawable.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontMetrics.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkFontTypes.h"
#include "include/core/SkImage.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "include/core/SkStream.h"
#include "include/core/SkString.h"
#include "include/core/SkSurfaceProps.h"
#include "include/private/base/SkDebug.h"
#include "include/private/base/SkTPin.h"
#include "include/private/base/SkTo.h"
#include "src/base/SkBitmaskEnum.h"
#include "src/base/SkUTF.h"
#include "src/core/SkDevice.h"
#include "src/core/SkGlyph.h"
#include "src/core/SkMask.h"
#include "src/core/SkScalerContext.h"
#include "src/core/SkStrike.h"
#include "src/core/SkStrikeSpec.h"
#include "src/core/SkTHash.h"
#include "src/pdf/SkPDFBitmap.h"
#include "src/pdf/SkPDFDevice.h"
#include "src/pdf/SkPDFDocumentPriv.h"
#include "src/pdf/SkPDFFormXObject.h"
#include "src/pdf/SkPDFMakeCIDGlyphWidthsArray.h"
#include "src/pdf/SkPDFMakeToUnicodeCmap.h"
#include "src/pdf/SkPDFSubsetFont.h"
#include "src/pdf/SkPDFType1Font.h"
#include "src/pdf/SkPDFUtils.h"
#include <limits.h>
#include <algorithm>
#include <cstddef>
#include <initializer_list>
#include <memory>
#include <utility>
void SkPDFFont::GetType1GlyphNames(const SkTypeface& face, SkString* dst) { … }
namespace {
static const int32_t kPdfSymbolic = …;
static const SkFontTableTag kCOLRTableTag = …;
inline SkScalar from_font_units(SkScalar scaled, uint16_t emSize) { … }
inline SkScalar scaleFromFontUnits(int16_t val, uint16_t emSize) { … }
void setGlyphWidthAndBoundingBox(SkScalar width, SkIRect box,
SkDynamicMemoryWStream* content) { … }
}
SkPDFFont::~SkPDFFont() = default;
SkPDFFont::SkPDFFont(SkPDFFont&&) = default;
SkPDFFont& SkPDFFont::operator=(SkPDFFont&&) = default;
static bool can_embed(const SkAdvancedTypefaceMetrics& metrics) { … }
static bool can_subset(const SkAdvancedTypefaceMetrics& metrics) { … }
const SkAdvancedTypefaceMetrics* SkPDFFont::GetMetrics(const SkTypeface* typeface,
SkPDFDocument* canon) { … }
const std::vector<SkUnichar>& SkPDFFont::GetUnicodeMap(const SkTypeface* typeface,
SkPDFDocument* canon) { … }
SkAdvancedTypefaceMetrics::FontType SkPDFFont::FontType(const SkTypeface& typeface,
const SkAdvancedTypefaceMetrics& metrics) { … }
static SkGlyphID first_nonzero_glyph_for_single_byte_encoding(SkGlyphID gid) { … }
SkPDFFont* SkPDFFont::GetFontResource(SkPDFDocument* doc,
const SkGlyph* glyph,
SkTypeface* face) { … }
SkPDFFont::SkPDFFont(sk_sp<SkTypeface> typeface,
SkGlyphID firstGlyphID,
SkGlyphID lastGlyphID,
SkAdvancedTypefaceMetrics::FontType fontType,
SkPDFIndirectReference indirectReference)
: … { … }
void SkPDFFont::PopulateCommonFontDescriptor(SkPDFDict* descriptor,
const SkAdvancedTypefaceMetrics& metrics,
uint16_t emSize,
int16_t defaultWidth) { … }
static void emit_subset_type0(const SkPDFFont& font, SkPDFDocument* doc) { … }
namespace {
struct SingleByteGlyphIdIterator { … };
}
struct ImageAndOffset { … };
static ImageAndOffset to_image(SkGlyphID gid, SkBulkGlyphMetricsAndImages* smallGlyphs) { … }
static SkPDFIndirectReference type3_descriptor(SkPDFDocument* doc,
const SkTypeface* typeface,
SkScalar xHeight) { … }
#ifdef SK_PDF_BITMAP_GLYPH_RASTER_SIZE
static constexpr float kBitmapFontSize = SK_PDF_BITMAP_GLYPH_RASTER_SIZE;
#else
static constexpr float kBitmapFontSize = …;
#endif
SkStrikeSpec make_small_strike(const SkTypeface& typeface) { … }
static void emit_subset_type3(const SkPDFFont& pdfFont, SkPDFDocument* doc) { … }
void SkPDFFont::emitSubset(SkPDFDocument* doc) const { … }
bool SkPDFFont::CanEmbedTypeface(SkTypeface* typeface, SkPDFDocument* doc) { … }