tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

NativeFontResourceFreeType.cpp (3417B)


      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 "NativeFontResourceFreeType.h"
      8 #include "UnscaledFontFreeType.h"
      9 
     10 #include "mozilla/fallible.h"
     11 
     12 namespace mozilla::gfx {
     13 
     14 NativeFontResourceFreeType::NativeFontResourceFreeType(
     15    UniquePtr<uint8_t[]>&& aFontData, uint32_t aDataLength,
     16    FT_Library aFTLibrary)
     17    : NativeFontResource(aDataLength),
     18      mFontData(std::move(aFontData)),
     19      mDataLength(aDataLength),
     20      mFTLibrary(aFTLibrary) {}
     21 
     22 NativeFontResourceFreeType::~NativeFontResourceFreeType() = default;
     23 
     24 template <class T>
     25 already_AddRefed<T> NativeFontResourceFreeType::CreateInternal(
     26    const uint8_t* aFontData, uint32_t aDataLength, FT_Library aFTLibrary) {
     27  if (!aFontData || !aDataLength) {
     28    return nullptr;
     29  }
     30  UniquePtr<uint8_t[]> fontData(new (fallible) uint8_t[aDataLength]);
     31  if (!fontData) {
     32    return nullptr;
     33  }
     34  memcpy(fontData.get(), aFontData, aDataLength);
     35 
     36  RefPtr<T> resource = new T(std::move(fontData), aDataLength, aFTLibrary);
     37  return resource.forget();
     38 }
     39 
     40 #ifdef MOZ_WIDGET_ANDROID
     41 already_AddRefed<NativeFontResourceFreeType> NativeFontResourceFreeType::Create(
     42    const uint8_t* aFontData, uint32_t aDataLength, FT_Library aFTLibrary) {
     43  return CreateInternal<NativeFontResourceFreeType>(aFontData, aDataLength,
     44                                                    aFTLibrary);
     45 }
     46 
     47 already_AddRefed<UnscaledFont> NativeFontResourceFreeType::CreateUnscaledFont(
     48    uint32_t aIndex, const uint8_t* aInstanceData,
     49    uint32_t aInstanceDataLength) {
     50  if (RefPtr<SharedFTFace> face = CloneFace()) {
     51    return MakeAndAddRef<UnscaledFontFreeType>(std::move(face));
     52  }
     53  return nullptr;
     54 }
     55 #endif
     56 
     57 already_AddRefed<SharedFTFace> NativeFontResourceFreeType::CloneFace(
     58    int aFaceIndex) {
     59  RefPtr<SharedFTFace> face = Factory::NewSharedFTFaceFromData(
     60      mFTLibrary, mFontData.get(), mDataLength, aFaceIndex, this);
     61  if (!face ||
     62      (FT_Select_Charmap(face->GetFace(), FT_ENCODING_UNICODE) != FT_Err_Ok &&
     63       FT_Select_Charmap(face->GetFace(), FT_ENCODING_MS_SYMBOL) !=
     64           FT_Err_Ok)) {
     65    return nullptr;
     66  }
     67  return face.forget();
     68 }
     69 
     70 #ifdef MOZ_WIDGET_GTK
     71 NativeFontResourceFontconfig::NativeFontResourceFontconfig(
     72    UniquePtr<uint8_t[]>&& aFontData, uint32_t aDataLength,
     73    FT_Library aFTLibrary)
     74    : NativeFontResourceFreeType(std::move(aFontData), aDataLength,
     75                                 aFTLibrary) {}
     76 
     77 already_AddRefed<UnscaledFont> NativeFontResourceFontconfig::CreateUnscaledFont(
     78    uint32_t aIndex, const uint8_t* aInstanceData,
     79    uint32_t aInstanceDataLength) {
     80  if (RefPtr<SharedFTFace> face = CloneFace()) {
     81    return MakeAndAddRef<UnscaledFontFontconfig>(std::move(face));
     82  }
     83  return nullptr;
     84 }
     85 
     86 already_AddRefed<NativeFontResourceFontconfig>
     87 NativeFontResourceFontconfig::Create(const uint8_t* aFontData,
     88                                     uint32_t aDataLength,
     89                                     FT_Library aFTLibrary) {
     90  return CreateInternal<NativeFontResourceFontconfig>(aFontData, aDataLength,
     91                                                      aFTLibrary);
     92 }
     93 #endif
     94 
     95 }  // namespace mozilla::gfx