no bug - Import translations from android-l10n r=release a=l10n CLOSED TREE
[gecko.git] / gfx / 2d / NativeFontResourceFreeType.cpp
blobe00dfafe2156190e9206969c5d80df81c7e8207f
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"
10 namespace mozilla::gfx {
12 NativeFontResourceFreeType::NativeFontResourceFreeType(
13 UniquePtr<uint8_t[]>&& aFontData, uint32_t aDataLength,
14 FT_Library aFTLibrary)
15 : NativeFontResource(aDataLength),
16 mFontData(std::move(aFontData)),
17 mDataLength(aDataLength),
18 mFTLibrary(aFTLibrary) {}
20 NativeFontResourceFreeType::~NativeFontResourceFreeType() = default;
22 template <class T>
23 already_AddRefed<T> NativeFontResourceFreeType::CreateInternal(
24 uint8_t* aFontData, uint32_t aDataLength, FT_Library aFTLibrary) {
25 if (!aFontData || !aDataLength) {
26 return nullptr;
28 UniquePtr<uint8_t[]> fontData(new (fallible) uint8_t[aDataLength]);
29 if (!fontData) {
30 return nullptr;
32 memcpy(fontData.get(), aFontData, aDataLength);
34 RefPtr<T> resource = new T(std::move(fontData), aDataLength, aFTLibrary);
35 return resource.forget();
38 #ifdef MOZ_WIDGET_ANDROID
39 already_AddRefed<NativeFontResourceFreeType> NativeFontResourceFreeType::Create(
40 uint8_t* aFontData, uint32_t aDataLength, FT_Library aFTLibrary) {
41 return CreateInternal<NativeFontResourceFreeType>(aFontData, aDataLength,
42 aFTLibrary);
45 already_AddRefed<UnscaledFont> NativeFontResourceFreeType::CreateUnscaledFont(
46 uint32_t aIndex, const uint8_t* aInstanceData,
47 uint32_t aInstanceDataLength) {
48 if (RefPtr<SharedFTFace> face = CloneFace()) {
49 return MakeAndAddRef<UnscaledFontFreeType>(std::move(face));
51 return nullptr;
53 #endif
55 already_AddRefed<SharedFTFace> NativeFontResourceFreeType::CloneFace(
56 int aFaceIndex) {
57 RefPtr<SharedFTFace> face = Factory::NewSharedFTFaceFromData(
58 mFTLibrary, mFontData.get(), mDataLength, aFaceIndex, this);
59 if (!face ||
60 (FT_Select_Charmap(face->GetFace(), FT_ENCODING_UNICODE) != FT_Err_Ok &&
61 FT_Select_Charmap(face->GetFace(), FT_ENCODING_MS_SYMBOL) !=
62 FT_Err_Ok)) {
63 return nullptr;
65 return face.forget();
68 #ifdef MOZ_WIDGET_GTK
69 NativeFontResourceFontconfig::NativeFontResourceFontconfig(
70 UniquePtr<uint8_t[]>&& aFontData, uint32_t aDataLength,
71 FT_Library aFTLibrary)
72 : NativeFontResourceFreeType(std::move(aFontData), aDataLength,
73 aFTLibrary) {}
75 already_AddRefed<UnscaledFont> NativeFontResourceFontconfig::CreateUnscaledFont(
76 uint32_t aIndex, const uint8_t* aInstanceData,
77 uint32_t aInstanceDataLength) {
78 if (RefPtr<SharedFTFace> face = CloneFace()) {
79 return MakeAndAddRef<UnscaledFontFontconfig>(std::move(face));
81 return nullptr;
84 already_AddRefed<NativeFontResourceFontconfig>
85 NativeFontResourceFontconfig::Create(uint8_t* aFontData, uint32_t aDataLength,
86 FT_Library aFTLibrary) {
87 return CreateInternal<NativeFontResourceFontconfig>(aFontData, aDataLength,
88 aFTLibrary);
90 #endif
92 } // namespace mozilla::gfx