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