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"
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;
24 already_AddRefed
<T
> NativeFontResourceFreeType::CreateInternal(
25 uint8_t* aFontData
, uint32_t aDataLength
, FT_Library aFTLibrary
) {
26 if (!aFontData
|| !aDataLength
) {
29 UniquePtr
<uint8_t[]> fontData(new (fallible
) uint8_t[aDataLength
]);
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
,
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
));
56 already_AddRefed
<SharedFTFace
> NativeFontResourceFreeType::CloneFace(
58 RefPtr
<SharedFTFace
> face
= Factory::NewSharedFTFaceFromData(
59 mFTLibrary
, mFontData
.get(), mDataLength
, aFaceIndex
, this);
61 (FT_Select_Charmap(face
->GetFace(), FT_ENCODING_UNICODE
) != FT_Err_Ok
&&
62 FT_Select_Charmap(face
->GetFace(), FT_ENCODING_MS_SYMBOL
) !=
70 NativeFontResourceFontconfig::NativeFontResourceFontconfig(
71 UniquePtr
<uint8_t[]>&& aFontData
, uint32_t aDataLength
,
72 FT_Library aFTLibrary
)
73 : NativeFontResourceFreeType(std::move(aFontData
), aDataLength
,
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
));
85 already_AddRefed
<NativeFontResourceFontconfig
>
86 NativeFontResourceFontconfig::Create(uint8_t* aFontData
, uint32_t aDataLength
,
87 FT_Library aFTLibrary
) {
88 return CreateInternal
<NativeFontResourceFontconfig
>(aFontData
, aDataLength
,
93 } // namespace mozilla::gfx