14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_fontmapper.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/ifx_systemfontinfo.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic CFX_ByteString GetStringFromTable(const uint8_t* string_ptr, 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t string_ptr_length, 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t offset, 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t length) { 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (string_ptr_length < static_cast<uint32_t>(offset + length)) { 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(string_ptr + offset, length); 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString GetNameFromTT(const uint8_t* name_table, 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t name_table_size, 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t name_id) { 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!name_table || name_table_size < 6) { 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t name_count = GET_TT_SHORT(name_table + 2); 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t string_offset = GET_TT_SHORT(name_table + 4); 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // We will ignore the possibility of overlap of structures and 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // string table as if it's all corrupt there's not a lot we can do. 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (name_table_size < string_offset) { 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* string_ptr = name_table + string_offset; 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t string_ptr_size = name_table_size - string_offset; 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_table += 6; 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_table_size -= 6; 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (name_table_size < name_count * 12) { 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < name_count; i++, name_table += 12) { 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (GET_TT_SHORT(name_table + 6) == name_id && 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GET_TT_SHORT(name_table) == 1 && GET_TT_SHORT(name_table + 2) == 0) { 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return GetStringFromTable(string_ptr, string_ptr_size, 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GET_TT_SHORT(name_table + 10), 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GET_TT_SHORT(name_table + 8)); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid* IFX_SystemFontInfo::MapFontByUnicode(uint32_t dwUnicode, 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int weight, 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bItalic, 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int pitch_family) { 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif // PDF_ENABLE_XFA 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint IFX_SystemFontInfo::GetFaceIndex(void* hFont) { 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannextern "C" { 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannunsigned long _FTStreamRead(FXFT_Stream stream, 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned long offset, 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned char* buffer, 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned long count); 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid _FTStreamClose(FXFT_Stream stream); 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if _FX_OS_ == _FX_ANDROID_ 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<IFX_SystemFontInfo> IFX_SystemFontInfo::CreateDefault( 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char** pUnused) { 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_FontFaceInfo::CFX_FontFaceInfo(CFX_ByteString filePath, 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString faceName, 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString fontTables, 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t fontOffset, 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t fileSize) 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_FilePath(filePath), 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FaceName(faceName), 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FontTables(fontTables), 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FontOffset(fontOffset), 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FileSize(fileSize), 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Styles(0), 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Charsets(0) {} 94