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