Bug 1686855 [wpt PR 27197] - PlzDedicatedWorker: WPT for clients.matchAll() with...
[gecko.git] / gfx / 2d / NativeFontResourceFreeType.cpp
blobd16e3a8156e1d337ad24845ac8c6b07b0278f0c5
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "NativeFontResourceFreeType.h"
8 #include "UnscaledFontFreeType.h"
9 #include "Logging.h"
11 namespace mozilla::gfx {
13 NativeFontResourceFreeType::NativeFontResourceFreeType(
14 UniquePtr<uint8_t[]>&& aFontData, uint32_t aDataLength,
15 FT_Library aFTLibrary)
16 : NativeFontResource(aDataLength),
17 mFontData(std::move(aFontData)),
18 mDataLength(aDataLength),
19 mFTLibrary(aFTLibrary) {}
21 NativeFontResourceFreeType::~NativeFontResourceFreeType() = default;
23 template <class T>
24 already_AddRefed<T> NativeFontResourceFreeType::CreateInternal(
25 uint8_t* aFontData, uint32_t aDataLength, FT_Library aFTLibrary) {
26 if (!aFontData || !aDataLength) {
27 return nullptr;
29 UniquePtr<uint8_t[]> fontData(new (fallible) uint8_t[aDataLength]);
30 if (!fontData) {
31 return nullptr;
33 memcpy(fontData.get(), aFontData, aDataLength);
35 RefPtr<T> resource = new T(std::move(fontData), aDataLength, aFTLibrary);
36 return resource.forget();
39 #ifdef MOZ_WIDGET_ANDROID
40 already_AddRefed<NativeFontResourceFreeType> NativeFontResourceFreeType::Create(
41 uint8_t* aFontData, uint32_t aDataLength, FT_Library aFTLibrary) {
42 return CreateInternal<NativeFontResourceFreeType>(aFontData, aDataLength,
43 aFTLibrary);
46 already_AddRefed<UnscaledFont> NativeFontResourceFreeType::CreateUnscaledFont(
47 uint32_t aIndex, const uint8_t* aInstanceData,
48 uint32_t aInstanceDataLength) {
49 if (RefPtr<SharedFTFace> face = CloneFace()) {
50 return MakeAndAddRef<UnscaledFontFreeType>(std::move(face));
52 return nullptr;
54 #endif
56 already_AddRefed<SharedFTFace> NativeFontResourceFreeType::CloneFace(
57 int aFaceIndex) {
58 RefPtr<SharedFTFace> face = Factory::NewSharedFTFaceFromData(
59 mFTLibrary, mFontData.get(), mDataLength, aFaceIndex, this);
60 if (!face ||
61 (FT_Select_Charmap(face->GetFace(), FT_ENCODING_UNICODE) != FT_Err_Ok &&
62 FT_Select_Charmap(face->GetFace(), FT_ENCODING_MS_SYMBOL) !=
63 FT_Err_Ok)) {
64 return nullptr;
66 return face.forget();
69 #ifdef MOZ_WIDGET_GTK
70 NativeFontResourceFontconfig::NativeFontResourceFontconfig(
71 UniquePtr<uint8_t[]>&& aFontData, uint32_t aDataLength,
72 FT_Library aFTLibrary)
73 : NativeFontResourceFreeType(std::move(aFontData), aDataLength,
74 aFTLibrary) {}
76 already_AddRefed<UnscaledFont> NativeFontResourceFontconfig::CreateUnscaledFont(
77 uint32_t aIndex, const uint8_t* aInstanceData,
78 uint32_t aInstanceDataLength) {
79 if (RefPtr<SharedFTFace> face = CloneFace()) {
80 return MakeAndAddRef<UnscaledFontFontconfig>(std::move(face));
82 return nullptr;
85 already_AddRefed<NativeFontResourceFontconfig>
86 NativeFontResourceFontconfig::Create(uint8_t* aFontData, uint32_t aDataLength,
87 FT_Library aFTLibrary) {
88 return CreateInternal<NativeFontResourceFontconfig>(aFontData, aDataLength,
89 aFTLibrary);
91 #endif
93 } // namespace mozilla::gfx