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/. */
6
7 #include "NativeFontResourceFontconfig.h"
8 #include "ScaledFontFontconfig.h"
9 #include "UnscaledFontFreeType.h"
10 #include "Logging.h"
11
12 namespace mozilla {
13 namespace gfx {
14
NativeFontResourceFontconfig(UniquePtr<uint8_t[]> && aFontData,FT_Face aFace)15 NativeFontResourceFontconfig::NativeFontResourceFontconfig(
16 UniquePtr<uint8_t[]>&& aFontData, FT_Face aFace)
17 : mFontData(Move(aFontData)), mFace(aFace) {}
18
~NativeFontResourceFontconfig()19 NativeFontResourceFontconfig::~NativeFontResourceFontconfig() {
20 if (mFace) {
21 Factory::ReleaseFTFace(mFace);
22 mFace = nullptr;
23 }
24 }
25
26 already_AddRefed<NativeFontResourceFontconfig>
Create(uint8_t * aFontData,uint32_t aDataLength,FT_Library aFTLibrary)27 NativeFontResourceFontconfig::Create(uint8_t* aFontData, uint32_t aDataLength,
28 FT_Library aFTLibrary) {
29 if (!aFontData || !aDataLength) {
30 return nullptr;
31 }
32 UniquePtr<uint8_t[]> fontData(new (fallible) uint8_t[aDataLength]);
33 if (!fontData) {
34 return nullptr;
35 }
36 memcpy(fontData.get(), aFontData, aDataLength);
37
38 FT_Face face =
39 Factory::NewFTFaceFromData(aFTLibrary, fontData.get(), aDataLength, 0);
40 if (!face) {
41 return nullptr;
42 }
43 if (FT_Select_Charmap(face, FT_ENCODING_UNICODE) != FT_Err_Ok) {
44 Factory::ReleaseFTFace(face);
45 return nullptr;
46 }
47
48 RefPtr<NativeFontResourceFontconfig> resource =
49 new NativeFontResourceFontconfig(Move(fontData), face);
50 return resource.forget();
51 }
52
CreateUnscaledFont(uint32_t aIndex,const uint8_t * aInstanceData,uint32_t aInstanceDataLength)53 already_AddRefed<UnscaledFont> NativeFontResourceFontconfig::CreateUnscaledFont(
54 uint32_t aIndex, const uint8_t* aInstanceData,
55 uint32_t aInstanceDataLength) {
56 RefPtr<UnscaledFont> unscaledFont = new UnscaledFontFontconfig(mFace, this);
57 return unscaledFont.forget();
58 }
59
60 } // namespace gfx
61 } // namespace mozilla
62