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