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