span-ify SystemFontInfoIface::GetFontData()
Change-Id: Id19ce19aa5053c1881d625ff1589ce5fa1ee0a42
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/56633
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index 5199f76..a2ed1b9 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -72,7 +72,7 @@
if (size != GDI_ERROR) {
LPBYTE buffer = FX_Alloc(BYTE, size);
::GetFontData(hDC, 'eman', 0, buffer, size);
- result = GetNameFromTT(buffer, size, 6);
+ result = GetNameFromTT({buffer, size}, 6);
FX_Free(buffer);
}
return result;
diff --git a/core/fxge/android/cfpf_skiafont.cpp b/core/fxge/android/cfpf_skiafont.cpp
index eb299fb..1c4eece 100644
--- a/core/fxge/android/cfpf_skiafont.cpp
+++ b/core/fxge/android/cfpf_skiafont.cpp
@@ -151,13 +151,12 @@
}
uint32_t CFPF_SkiaFont::GetFontData(uint32_t dwTable,
- uint8_t* pBuffer,
- uint32_t dwSize) {
+ pdfium::span<uint8_t> pBuffer) {
if (!m_Face)
return 0;
- FT_ULong ulSize = pdfium::base::checked_cast<FT_ULong>(dwSize);
- if (FT_Load_Sfnt_Table(GetFaceRec(), dwTable, 0, pBuffer, &ulSize))
+ FT_ULong ulSize = pdfium::base::checked_cast<FT_ULong>(pBuffer.size());
+ if (FT_Load_Sfnt_Table(GetFaceRec(), dwTable, 0, pBuffer.data(), &ulSize))
return 0;
return pdfium::base::checked_cast<uint32_t>(ulSize);
}
diff --git a/core/fxge/android/cfpf_skiafont.h b/core/fxge/android/cfpf_skiafont.h
index 67204d3..702a38e 100644
--- a/core/fxge/android/cfpf_skiafont.h
+++ b/core/fxge/android/cfpf_skiafont.h
@@ -12,6 +12,7 @@
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/cfx_face.h"
#include "core/fxge/fx_freetype.h"
+#include "third_party/base/span.h"
class CFPF_SkiaFontMgr;
class CFPF_SkiaPathFont;
@@ -39,7 +40,7 @@
bool GetBBox(FX_RECT& rtBBox);
int32_t GetHeight() const;
int32_t GetItalicAngle() const;
- uint32_t GetFontData(uint32_t dwTable, uint8_t* pBuffer, uint32_t dwSize);
+ uint32_t GetFontData(uint32_t dwTable, pdfium::span<uint8_t> pBuffer);
FXFT_FaceRec* GetFaceRec() const { return m_Face->GetRec(); }
private:
diff --git a/core/fxge/android/cfx_androidfontinfo.cpp b/core/fxge/android/cfx_androidfontinfo.cpp
index 63170f9..b033eab 100644
--- a/core/fxge/android/cfx_androidfontinfo.cpp
+++ b/core/fxge/android/cfx_androidfontinfo.cpp
@@ -55,11 +55,10 @@
uint32_t CFX_AndroidFontInfo::GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) {
+ pdfium::span<uint8_t> buffer) {
if (!hFont)
return 0;
- return static_cast<CFPF_SkiaFont*>(hFont)->GetFontData(table, buffer, size);
+ return static_cast<CFPF_SkiaFont*>(hFont)->GetFontData(table, buffer);
}
bool CFX_AndroidFontInfo::GetFaceName(void* hFont, ByteString* name) {
diff --git a/core/fxge/android/cfx_androidfontinfo.h b/core/fxge/android/cfx_androidfontinfo.h
index 86b0d34..c8b6d24 100644
--- a/core/fxge/android/cfx_androidfontinfo.h
+++ b/core/fxge/android/cfx_androidfontinfo.h
@@ -11,6 +11,7 @@
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/cfx_fontmapper.h"
#include "core/fxge/systemfontinfo_iface.h"
+#include "third_party/base/span.h"
class CFPF_SkiaFontMgr;
@@ -31,8 +32,7 @@
void* GetFont(const char* face) override;
uint32_t GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) override;
+ pdfium::span<uint8_t> buffer) override;
bool GetFaceName(void* hFont, ByteString* name) override;
bool GetFontCharset(void* hFont, int* charset) override;
void DeleteFont(void* hFont) override;
diff --git a/core/fxge/cfx_folderfontinfo.cpp b/core/fxge/cfx_folderfontinfo.cpp
index 6483859..cc33723 100644
--- a/core/fxge/cfx_folderfontinfo.cpp
+++ b/core/fxge/cfx_folderfontinfo.cpp
@@ -227,11 +227,11 @@
if (names.IsEmpty())
return;
- ByteString facename = GetNameFromTT(names.raw_str(), names.GetLength(), 1);
+ ByteString facename = GetNameFromTT(names.AsRawSpan(), 1);
if (facename.IsEmpty())
return;
- ByteString style = GetNameFromTT(names.raw_str(), names.GetLength(), 2);
+ ByteString style = GetNameFromTT(names.AsRawSpan(), 2);
if (style != "Regular")
facename += " " + style;
@@ -343,8 +343,7 @@
uint32_t CFX_FolderFontInfo::GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) {
+ pdfium::span<uint8_t> buffer) {
if (!hFont)
return 0;
@@ -366,7 +365,7 @@
}
}
- if (!datasize || size < datasize)
+ if (!datasize || buffer.size() < datasize)
return datasize;
std::unique_ptr<FILE, FxFileCloser> pFile(
@@ -375,7 +374,7 @@
return 0;
if (fseek(pFile.get(), offset, SEEK_SET) < 0 ||
- fread(buffer, datasize, 1, pFile.get()) != 1) {
+ fread(buffer.data(), datasize, 1, pFile.get()) != 1) {
return 0;
}
return datasize;
diff --git a/core/fxge/cfx_folderfontinfo.h b/core/fxge/cfx_folderfontinfo.h
index 1f98301..e30f298 100644
--- a/core/fxge/cfx_folderfontinfo.h
+++ b/core/fxge/cfx_folderfontinfo.h
@@ -38,8 +38,7 @@
void* GetFont(const char* face) override;
uint32_t GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) override;
+ pdfium::span<uint8_t> buffer) override;
void DeleteFont(void* hFont) override;
bool GetFaceName(void* hFont, ByteString* name) override;
bool GetFontCharset(void* hFont, int* charset) override;
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index ef79e6f..6d0322a 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -271,8 +271,8 @@
uint32_t CFX_FontMapper::GetChecksumFromTT(void* hFont) {
uint32_t buffer[256];
- m_pFontInfo->GetFontData(hFont, kTableTTCF,
- reinterpret_cast<uint8_t*>(buffer), sizeof(buffer));
+ m_pFontInfo->GetFontData(
+ hFont, kTableTTCF, pdfium::as_writable_bytes(pdfium::make_span(buffer)));
uint32_t checksum = 0;
for (auto x : buffer)
@@ -282,16 +282,13 @@
}
ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) {
- uint32_t size = m_pFontInfo->GetFontData(hFont, kTableNAME, nullptr, 0);
+ uint32_t size = m_pFontInfo->GetFontData(hFont, kTableNAME, {});
if (!size)
return ByteString();
std::vector<uint8_t> buffer(size);
- uint8_t* buffer_ptr = buffer.data();
- uint32_t bytes_read =
- m_pFontInfo->GetFontData(hFont, kTableNAME, buffer_ptr, size);
- return bytes_read == size ? GetNameFromTT(buffer_ptr, bytes_read, 6)
- : ByteString();
+ uint32_t bytes_read = m_pFontInfo->GetFontData(hFont, kTableNAME, buffer);
+ return bytes_read == size ? GetNameFromTT(buffer, 6) : ByteString();
}
void CFX_FontMapper::AddInstalledFont(const ByteString& name, int charset) {
@@ -629,8 +626,8 @@
m_pFontInfo->GetFaceName(hFont, &SubstName);
if (Charset == FX_CHARSET_Default)
m_pFontInfo->GetFontCharset(hFont, &Charset);
- uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, kTableTTCF, nullptr, 0);
- uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0);
+ uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, kTableTTCF, {});
+ uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, {});
if (font_size == 0 && ttc_size == 0) {
m_pFontInfo->DeleteFont(hFont);
return nullptr;
@@ -689,7 +686,7 @@
if (!pFontDesc) {
std::unique_ptr<uint8_t, FxFreeDeleter> pFontData(
FX_Alloc(uint8_t, ttc_size));
- m_pFontInfo->GetFontData(hFont, kTableTTCF, pFontData.get(), ttc_size);
+ m_pFontInfo->GetFontData(hFont, kTableTTCF, {pFontData.get(), ttc_size});
pFontDesc = m_pFontMgr->AddCachedTTCFontDesc(
ttc_size, checksum, std::move(pFontData), ttc_size);
}
@@ -720,7 +717,7 @@
if (!pFontDesc) {
std::unique_ptr<uint8_t, FxFreeDeleter> pFontData(
FX_Alloc(uint8_t, font_size));
- m_pFontInfo->GetFontData(hFont, 0, pFontData.get(), font_size);
+ m_pFontInfo->GetFontData(hFont, 0, {pFontData.get(), font_size});
pFontDesc = m_pFontMgr->AddCachedFontDesc(SubstName, weight, bItalic,
std::move(pFontData), font_size);
}
diff --git a/core/fxge/fx_font.cpp b/core/fxge/fx_font.cpp
index 940f9ea..fc47a33c 100644
--- a/core/fxge/fx_font.cpp
+++ b/core/fxge/fx_font.cpp
@@ -13,14 +13,14 @@
namespace {
-ByteString GetStringFromTable(const uint8_t* string_ptr,
- uint32_t string_ptr_length,
+ByteString GetStringFromTable(pdfium::span<const uint8_t> string_span,
uint16_t offset,
uint16_t length) {
- if (string_ptr_length < static_cast<uint32_t>(offset + length)) {
+ if (string_span.size() < static_cast<uint32_t>(offset + length))
return ByteString();
- }
- return ByteString(string_ptr + offset, length);
+
+ string_span = string_span.subspan(offset, length);
+ return ByteString(string_span.data(), string_span.size());
}
} // namespace
@@ -69,34 +69,30 @@
return rect;
}
-ByteString GetNameFromTT(const uint8_t* name_table,
- uint32_t name_table_size,
+ByteString GetNameFromTT(pdfium::span<const uint8_t> name_table,
uint32_t name_id) {
- if (!name_table || name_table_size < 6) {
+ if (name_table.size() < 6)
return ByteString();
- }
- uint32_t name_count = GET_TT_SHORT(name_table + 2);
- uint32_t string_offset = GET_TT_SHORT(name_table + 4);
+
+ uint32_t name_count = GET_TT_SHORT(&name_table[2]);
+ uint32_t string_offset = GET_TT_SHORT(&name_table[4]);
// We will ignore the possibility of overlap of structures and
// string table as if it's all corrupt there's not a lot we can do.
- if (name_table_size < string_offset) {
+ if (name_table.size() < string_offset)
return ByteString();
- }
- const uint8_t* string_ptr = name_table + string_offset;
- uint32_t string_ptr_size = name_table_size - string_offset;
- name_table += 6;
- name_table_size -= 6;
- if (name_table_size < name_count * 12) {
+ pdfium::span<const uint8_t> string_span = name_table.subspan(string_offset);
+ name_table = name_table.subspan(6);
+ if (name_table.size() < name_count * 12)
return ByteString();
- }
- for (uint32_t i = 0; i < name_count; i++, name_table += 12) {
- if (GET_TT_SHORT(name_table + 6) == name_id &&
- GET_TT_SHORT(name_table) == 1 && GET_TT_SHORT(name_table + 2) == 0) {
- return GetStringFromTable(string_ptr, string_ptr_size,
- GET_TT_SHORT(name_table + 10),
- GET_TT_SHORT(name_table + 8));
+ for (uint32_t i = 0; i < name_count;
+ i++, name_table = name_table.subspan(12)) {
+ if (GET_TT_SHORT(&name_table[6]) == name_id &&
+ GET_TT_SHORT(&name_table[0]) == 1 &&
+ GET_TT_SHORT(&name_table[2]) == 0) {
+ return GetStringFromTable(string_span, GET_TT_SHORT(&name_table[10]),
+ GET_TT_SHORT(&name_table[8]));
}
}
return ByteString();
diff --git a/core/fxge/fx_font.h b/core/fxge/fx_font.h
index f9f33ac..78bed86 100644
--- a/core/fxge/fx_font.h
+++ b/core/fxge/fx_font.h
@@ -55,10 +55,7 @@
FX_RECT GetGlyphsBBox(const std::vector<TextGlyphPos>& glyphs, int anti_alias);
-ByteString GetNameFromTT(const uint8_t* name_table,
- uint32_t name_table_size,
- uint32_t name);
-
+ByteString GetNameFromTT(pdfium::span<const uint8_t> name_table, uint32_t name);
int GetTTCIndex(pdfium::span<const uint8_t> pFontData, uint32_t font_offset);
inline bool FontStyleIsBold(uint32_t style) {
diff --git a/core/fxge/systemfontinfo_iface.h b/core/fxge/systemfontinfo_iface.h
index bfd1538..520d737 100644
--- a/core/fxge/systemfontinfo_iface.h
+++ b/core/fxge/systemfontinfo_iface.h
@@ -10,6 +10,7 @@
#include <memory>
#include "core/fxge/cfx_fontmapper.h"
+#include "third_party/base/span.h"
const uint32_t kTableNAME = FXDWORD_GET_MSBFIRST("name");
const uint32_t kTableTTCF = FXDWORD_GET_MSBFIRST("ttcf");
@@ -38,8 +39,7 @@
virtual void* GetFont(const char* face) = 0;
virtual uint32_t GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) = 0;
+ pdfium::span<uint8_t> buffer) = 0;
virtual bool GetFaceName(void* hFont, ByteString* name) = 0;
virtual bool GetFontCharset(void* hFont, int* charset) = 0;
virtual int GetFaceIndex(void* hFont);
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index a73c903..7d57f40 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -27,6 +27,7 @@
#include "core/fxge/win32/cfx_windowsdib.h"
#include "core/fxge/win32/win32_int.h"
#include "third_party/base/ptr_util.h"
+#include "third_party/base/span.h"
#include "third_party/base/win/win_util.h"
#ifndef _SKIA_SUPPORT_
@@ -326,8 +327,7 @@
void* GetFont(const char* face) override { return nullptr; }
uint32_t GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) override;
+ pdfium::span<uint8_t> buffer) override;
bool GetFaceName(void* hFont, ByteString* name) override;
bool GetFontCharset(void* hFont, int* charset) override;
void DeleteFont(void* hFont) override;
@@ -363,10 +363,10 @@
bool CFX_Win32FontInfo::IsOpenTypeFromDiv(const LOGFONTA* plf) {
HFONT hFont = CreateFontIndirectA(plf);
bool ret = false;
- uint32_t font_size = GetFontData(hFont, 0, nullptr, 0);
+ uint32_t font_size = GetFontData(hFont, 0, {});
if (font_size != GDI_ERROR && font_size >= sizeof(uint32_t)) {
uint32_t lVersion = 0;
- GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(uint32_t));
+ GetFontData(hFont, 0, {(uint8_t*)(&lVersion), sizeof(uint32_t)});
lVersion = (((uint32_t)(uint8_t)(lVersion)) << 24) |
((uint32_t)((uint8_t)(lVersion >> 8))) << 16 |
((uint32_t)((uint8_t)(lVersion >> 16))) << 8 |
@@ -384,10 +384,10 @@
bool CFX_Win32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) {
HFONT hFont = CreateFontIndirectA(plf);
bool ret = false;
- uint32_t font_size = GetFontData(hFont, 0, nullptr, 0);
+ uint32_t font_size = GetFontData(hFont, 0, {});
if (font_size != GDI_ERROR && font_size >= sizeof(uint32_t)) {
uint32_t lVersion = 0;
- GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(uint32_t));
+ GetFontData(hFont, 0, {(uint8_t*)(&lVersion), sizeof(lVersion)});
lVersion = (((uint32_t)(uint8_t)(lVersion)) << 24) |
((uint32_t)((uint8_t)(lVersion >> 8))) << 16 |
((uint32_t)((uint8_t)(lVersion >> 16))) << 8 |
@@ -627,11 +627,10 @@
uint32_t CFX_Win32FontInfo::GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) {
+ pdfium::span<uint8_t> buffer) {
HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
table = FXDWORD_GET_MSBFIRST(reinterpret_cast<uint8_t*>(&table));
- size = ::GetFontData(m_hDC, table, 0, buffer, size);
+ uint32_t size = ::GetFontData(m_hDC, table, 0, buffer.data(), buffer.size());
::SelectObject(m_hDC, hOldFont);
if (size == GDI_ERROR) {
return 0;
diff --git a/fpdfsdk/fpdf_sysfontinfo.cpp b/fpdfsdk/fpdf_sysfontinfo.cpp
index 220cb6d..31fc64c 100644
--- a/fpdfsdk/fpdf_sysfontinfo.cpp
+++ b/fpdfsdk/fpdf_sysfontinfo.cpp
@@ -69,11 +69,11 @@
uint32_t GetFontData(void* hFont,
uint32_t table,
- uint8_t* buffer,
- uint32_t size) override {
+ pdfium::span<uint8_t> buffer) override {
if (!m_pInfo->GetFontData)
return 0;
- return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size);
+ return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer.data(),
+ buffer.size());
}
bool GetFaceName(void* hFont, ByteString* name) override {
@@ -163,7 +163,7 @@
unsigned char* buffer,
unsigned long buf_size) {
auto* pDefault = static_cast<FPDF_SYSFONTINFO_DEFAULT*>(pThis);
- return pDefault->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size);
+ return pDefault->m_pFontInfo->GetFontData(hFont, table, {buffer, buf_size});
}
static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis,
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
index 401db99..bdd5ddc 100644
--- a/xfa/fgas/font/cfgas_fontmgr.cpp
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -453,14 +453,14 @@
if (!hFont)
return nullptr;
- uint32_t dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0);
+ uint32_t dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, {});
if (dwFileSize == 0)
return nullptr;
std::unique_ptr<uint8_t, FxFreeDeleter> pBuffer(
FX_Alloc(uint8_t, dwFileSize + 1));
dwFileSize =
- pSystemFontInfo->GetFontData(hFont, 0, pBuffer.get(), dwFileSize);
+ pSystemFontInfo->GetFontData(hFont, 0, {pBuffer.get(), dwFileSize});
return pdfium::MakeRetain<CFX_MemoryStream>(std::move(pBuffer), dwFileSize);
}