summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/ports/SkFontHost_FreeType_common.h')
-rw-r--r--gfx/skia/skia/src/ports/SkFontHost_FreeType_common.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.h b/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.h
new file mode 100644
index 0000000000..ec9ba8b8aa
--- /dev/null
+++ b/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.h
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2006-2012 The Android Open Source Project
+ * Copyright 2012 Mozilla Foundation
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SKFONTHOST_FREETYPE_COMMON_H_
+#define SKFONTHOST_FREETYPE_COMMON_H_
+
+#include "include/core/SkSpan.h"
+#include "include/core/SkTypeface.h"
+#include "include/core/SkTypes.h"
+#include "include/private/base/SkMutex.h"
+#include "include/private/base/SkTArray.h"
+#include "src/core/SkGlyph.h"
+#include "src/core/SkScalerContext.h"
+#include "src/core/SkSharedMutex.h"
+#include "src/utils/SkCharToGlyphCache.h"
+
+struct SkAdvancedTypefaceMetrics;
+class SkFontDescriptor;
+class SkFontData;
+
+// These are forward declared to avoid pimpl but also hide the FreeType implementation.
+typedef struct FT_LibraryRec_* FT_Library;
+typedef struct FT_FaceRec_* FT_Face;
+typedef struct FT_StreamRec_* FT_Stream;
+typedef signed long FT_Pos;
+typedef struct FT_BBox_ FT_BBox;
+
+
+#ifdef SK_DEBUG
+const char* SkTraceFtrGetError(int);
+#define SK_TRACEFTR(ERR, MSG, ...) \
+ SkDebugf("%s:%d:1: error: 0x%x '%s' " MSG "\n", __FILE__, __LINE__, ERR, \
+ SkTraceFtrGetError((int)(ERR)), __VA_ARGS__)
+#else
+#define SK_TRACEFTR(ERR, ...) do { sk_ignore_unused_variable(ERR); } while (false)
+#endif
+
+
+class SkScalerContext_FreeType_Base : public SkScalerContext {
+protected:
+ // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden
+ // This value was chosen by eyeballing the result in Firefox and trying to match it.
+ static const FT_Pos kBitmapEmboldenStrength = 1 << 6;
+
+ SkScalerContext_FreeType_Base(sk_sp<SkTypeface> typeface, const SkScalerContextEffects& effects,
+ const SkDescriptor *desc)
+ : INHERITED(std::move(typeface), effects, desc)
+ {}
+
+ bool drawCOLRv0Glyph(FT_Face, const SkGlyph&, uint32_t loadGlyphFlags,
+ SkSpan<SkColor> palette, SkCanvas*);
+ bool drawCOLRv1Glyph(FT_Face, const SkGlyph&, uint32_t loadGlyphFlags,
+ SkSpan<SkColor> palette, SkCanvas*);
+ bool drawSVGGlyph(FT_Face, const SkGlyph&, uint32_t loadGlyphFlags,
+ SkSpan<SkColor> palette, SkCanvas*);
+ void generateGlyphImage(FT_Face, const SkGlyph&, const SkMatrix& bitmapTransform);
+ bool generateGlyphPath(FT_Face, SkPath*);
+ bool generateFacePath(FT_Face, SkGlyphID, uint32_t loadGlyphFlags, SkPath*);
+
+ /** Computes a bounding box for a COLRv1 glyph.
+ *
+ * This method may change the configured size and transforms on FT_Face. Make sure to
+ * configure size, matrix and load glyphs as needed after using this function to restore the
+ * state of FT_Face.
+ */
+ static bool computeColrV1GlyphBoundingBox(FT_Face, SkGlyphID, SkRect* bounds);
+
+ struct ScalerContextBits {
+ static const constexpr uint32_t COLRv0 = 1;
+ static const constexpr uint32_t COLRv1 = 2;
+ static const constexpr uint32_t SVG = 3;
+ };
+private:
+ using INHERITED = SkScalerContext;
+};
+
+class SkTypeface_FreeType : public SkTypeface {
+public:
+ /** For SkFontMgrs to make use of our ability to extract
+ * name and style from a stream, using FreeType's API.
+ */
+ class Scanner : ::SkNoncopyable {
+ public:
+ Scanner();
+ ~Scanner();
+ struct AxisDefinition {
+ SkFourByteTag fTag;
+ SkFixed fMinimum;
+ SkFixed fDefault;
+ SkFixed fMaximum;
+ };
+ using AxisDefinitions = SkSTArray<4, AxisDefinition, true>;
+ bool recognizedFont(SkStreamAsset* stream, int* numFonts) const;
+ bool scanFont(SkStreamAsset* stream, int ttcIndex,
+ SkString* name, SkFontStyle* style, bool* isFixedPitch,
+ AxisDefinitions* axes) const;
+ static void computeAxisValues(
+ AxisDefinitions axisDefinitions,
+ const SkFontArguments::VariationPosition position,
+ SkFixed* axisValues,
+ const SkString& name,
+ const SkFontArguments::VariationPosition::Coordinate* currentPosition = nullptr);
+ static bool GetAxes(FT_Face face, AxisDefinitions* axes);
+ private:
+ FT_Face openFace(SkStreamAsset* stream, int ttcIndex, FT_Stream ftStream) const;
+ FT_Library fLibrary;
+ mutable SkMutex fLibraryMutex;
+ };
+
+ /** Fetch units/EM from "head" table if needed (ie for bitmap fonts) */
+ static int GetUnitsPerEm(FT_Face face);
+
+ /** Return the font data, or nullptr on failure. */
+ std::unique_ptr<SkFontData> makeFontData() const;
+ class FaceRec;
+ FaceRec* getFaceRec() const;
+
+ static constexpr SkTypeface::FactoryId FactoryId = SkSetFourByteTag('f','r','e','e');
+ static sk_sp<SkTypeface> MakeFromStream(std::unique_ptr<SkStreamAsset>, const SkFontArguments&);
+
+protected:
+ SkTypeface_FreeType(const SkFontStyle& style, bool isFixedPitch);
+ ~SkTypeface_FreeType() override;
+
+ std::unique_ptr<SkFontData> cloneFontData(const SkFontArguments&) const;
+ std::unique_ptr<SkScalerContext> onCreateScalerContext(const SkScalerContextEffects&,
+ const SkDescriptor*) const override;
+ void onFilterRec(SkScalerContextRec*) const override;
+ void getGlyphToUnicodeMap(SkUnichar*) const override;
+ std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override;
+ void getPostScriptGlyphNames(SkString* dstArray) const override;
+ bool onGetPostScriptName(SkString*) const override;
+ int onGetUPEM() const override;
+ bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count,
+ int32_t adjustments[]) const override;
+ void onCharsToGlyphs(const SkUnichar uni[], int count, SkGlyphID glyphs[]) const override;
+ int onCountGlyphs() const override;
+
+ LocalizedStrings* onCreateFamilyNameIterator() const override;
+
+ bool onGlyphMaskNeedsCurrentColor() const override;
+ int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
+ int coordinateCount) const override;
+ int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],
+ int parameterCount) const override;
+ int onGetTableTags(SkFontTableTag tags[]) const override;
+ size_t onGetTableData(SkFontTableTag, size_t offset,
+ size_t length, void* data) const override;
+ sk_sp<SkData> onCopyTableData(SkFontTableTag) const override;
+
+ virtual std::unique_ptr<SkFontData> onMakeFontData() const = 0;
+ /** Utility to fill out the SkFontDescriptor palette information from the SkFontData. */
+ static void FontDataPaletteToDescriptorPalette(const SkFontData&, SkFontDescriptor*);
+
+private:
+ mutable SkOnce fFTFaceOnce;
+ mutable std::unique_ptr<FaceRec> fFaceRec;
+
+ mutable SkSharedMutex fC2GCacheMutex;
+ mutable SkCharToGlyphCache fC2GCache;
+
+ mutable SkOnce fGlyphMasksMayNeedCurrentColorOnce;
+ mutable bool fGlyphMasksMayNeedCurrentColor;
+
+ using INHERITED = SkTypeface;
+};
+
+class SkTypeface_FreeTypeStream : public SkTypeface_FreeType {
+public:
+ SkTypeface_FreeTypeStream(std::unique_ptr<SkFontData> fontData, const SkString familyName,
+ const SkFontStyle& style, bool isFixedPitch);
+ ~SkTypeface_FreeTypeStream() override;
+
+protected:
+ void onGetFamilyName(SkString* familyName) const override;
+ void onGetFontDescriptor(SkFontDescriptor*, bool* serialize) const override;
+ std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
+ std::unique_ptr<SkFontData> onMakeFontData() const override;
+ sk_sp<SkTypeface> onMakeClone(const SkFontArguments&) const override;
+
+private:
+ const SkString fFamilyName;
+ const std::unique_ptr<const SkFontData> fData;
+};
+
+#endif // SKFONTHOST_FREETYPE_COMMON_H_