Home | History | Annotate | Download | only in fxge
      1 // Copyright 2016 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "core/fxge/cttfontdesc.h"
      8 
      9 #include "core/fxge/fx_freetype.h"
     10 #include "third_party/base/stl_util.h"
     11 
     12 CTTFontDesc::CTTFontDesc(uint8_t* pData, FXFT_Face face)
     13     : m_bIsTTC(false), m_SingleFace(face), m_pFontData(pData) {}
     14 
     15 CTTFontDesc::CTTFontDesc(uint8_t* pData, size_t index, FXFT_Face face)
     16     : m_bIsTTC(true), m_pFontData(pData) {
     17   for (size_t i = 0; i < FX_ArraySize(m_TTCFaces); i++)
     18     m_TTCFaces[i] = nullptr;
     19   SetTTCFace(index, face);
     20 }
     21 
     22 CTTFontDesc::~CTTFontDesc() {
     23   ASSERT(m_RefCount == 0);
     24   if (m_bIsTTC) {
     25     for (size_t i = 0; i < FX_ArraySize(m_TTCFaces); i++) {
     26       if (m_TTCFaces[i])
     27         FXFT_Done_Face(m_TTCFaces[i]);
     28     }
     29   } else {
     30     if (m_SingleFace)
     31       FXFT_Done_Face(m_SingleFace);
     32   }
     33   FX_Free(m_pFontData);
     34 }
     35 
     36 void CTTFontDesc::SetTTCFace(size_t index, FXFT_Face face) {
     37   ASSERT(m_bIsTTC);
     38   ASSERT(index < FX_ArraySize(m_TTCFaces));
     39   m_TTCFaces[index] = face;
     40 }
     41 
     42 void CTTFontDesc::AddRef() {
     43   ASSERT(m_RefCount > 0);
     44   ++m_RefCount;
     45 }
     46 
     47 CTTFontDesc::ReleaseStatus CTTFontDesc::ReleaseFace(FXFT_Face face) {
     48   if (m_bIsTTC) {
     49     if (!pdfium::ContainsValue(m_TTCFaces, face))
     50       return kNotAppropriate;
     51   } else {
     52     if (m_SingleFace != face)
     53       return kNotAppropriate;
     54   }
     55   ASSERT(m_RefCount > 0);
     56   return --m_RefCount == 0 ? kReleased : kNotReleased;
     57 }
     58 
     59 FXFT_Face CTTFontDesc::SingleFace() const {
     60   ASSERT(!m_bIsTTC);
     61   return m_SingleFace;
     62 }
     63 
     64 FXFT_Face CTTFontDesc::TTCFace(size_t index) const {
     65   ASSERT(m_bIsTTC);
     66   ASSERT(index < FX_ArraySize(m_TTCFaces));
     67   return m_TTCFaces[index];
     68 }
     69