diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /gfx/thebes/gfxFT2Utils.h | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'gfx/thebes/gfxFT2Utils.h')
-rw-r--r-- | gfx/thebes/gfxFT2Utils.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/gfx/thebes/gfxFT2Utils.h b/gfx/thebes/gfxFT2Utils.h new file mode 100644 index 0000000000..37e930c743 --- /dev/null +++ b/gfx/thebes/gfxFT2Utils.h @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef GFX_FT2UTILS_H +#define GFX_FT2UTILS_H + +#include "cairo-ft.h" +#include "gfxFT2FontBase.h" +#include "mozilla/Likely.h" + +// Rounding and truncation functions for a FreeType fixed point number +// (FT26Dot6) stored in a 32bit integer with high 26 bits for the integer +// part and low 6 bits for the fractional part. +#define FLOAT_FROM_26_6(x) ((x) / 64.0) +#define FLOAT_FROM_16_16(x) ((x) / 65536.0) +#define ROUND_26_6_TO_INT(x) ((x) >= 0 ? ((32 + (x)) >> 6) : -((32 - (x)) >> 6)) + +typedef struct FT_FaceRec_* FT_Face; + +/** + * BEWARE: Recursively locking with gfxFT2LockedFace is not supported. + * Do not instantiate gfxFT2LockedFace within the scope of another instance. + * Do not attempt to call into Cairo within the scope of gfxFT2LockedFace, + * as that may accidentally try to re-lock the face within Cairo itself + * and thus deadlock. + */ +class MOZ_STACK_CLASS gfxFT2LockedFace { + public: + explicit gfxFT2LockedFace(const gfxFT2FontBase* aFont) + : mGfxFont(aFont), mFace(aFont->LockFTFace()) {} + ~gfxFT2LockedFace() { + if (mFace) { + mGfxFont->UnlockFTFace(); + } + } + + FT_Face get() { return mFace; }; + + /** + * Get the glyph id for a Unicode character representable by a single + * glyph, or return zero if there is no such glyph. This does no caching, + * so you probably want gfxFcFont::GetGlyph. + */ + uint32_t GetGlyph(uint32_t aCharCode); + /** + * Returns 0 if there is no variation selector cmap subtable. + */ + uint32_t GetUVSGlyph(uint32_t aCharCode, uint32_t aVariantSelector); + + protected: + typedef FT_UInt (*CharVariantFunction)(FT_Face face, FT_ULong charcode, + FT_ULong variantSelector); + CharVariantFunction FindCharVariantFunction(); + + const gfxFT2FontBase* MOZ_NON_OWNING_REF mGfxFont; // owned by caller + FT_Face mFace; +}; + +// A couple of FreeType-based utilities shared by gfxFontconfigFontEntry +// and FT2FontEntry. + +typedef struct FT_MM_Var_ FT_MM_Var; + +class gfxFT2Utils { + public: + static void GetVariationAxes(const FT_MM_Var* aMMVar, + nsTArray<gfxFontVariationAxis>& aAxes); + + static void GetVariationInstances( + gfxFontEntry* aFontEntry, const FT_MM_Var* aMMVar, + nsTArray<gfxFontVariationInstance>& aInstances); +}; + +#endif /* GFX_FT2UTILS_H */ |