[unseasoned-pdf] Implement Blink-based Linux font mapping.
Talk directly to FontService, instead of proxying the request through PPAPI. Bug: 1139079 Change-Id: I42627fc7ebdab74884cfd593ca1208cdbe78c754 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2853614 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: K. Moon <kmoon@chromium.org> Reviewed-by: Dominik Röttsches <drott@chromium.org> Cr-Commit-Position: refs/heads/master@{#894358}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
e78cfb404f
commit
bd7ca12e08
pdf
@@ -209,7 +209,10 @@ if (enable_pdf) {
|
|||||||
"pdfium/pdfium_font_linux.h",
|
"pdfium/pdfium_font_linux.h",
|
||||||
]
|
]
|
||||||
|
|
||||||
deps += [ ":font_table_linux" ]
|
deps += [
|
||||||
|
":font_table_linux",
|
||||||
|
"//components/services/font/public/cpp",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
include_rules = [
|
include_rules = [
|
||||||
|
"+components/services/font/public/cpp",
|
||||||
"+third_party/pdfium/public",
|
"+third_party/pdfium/public",
|
||||||
"+ui/gfx/codec",
|
"+ui/gfx/codec",
|
||||||
"+v8/include/cppgc/platform.h",
|
"+v8/include/cppgc/platform.h",
|
||||||
|
@@ -4,15 +4,19 @@
|
|||||||
|
|
||||||
#include "pdf/pdfium/pdfium_font_linux.h"
|
#include "pdf/pdfium/pdfium_font_linux.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "base/files/file.h"
|
||||||
#include "base/i18n/encoding_detection.h"
|
#include "base/i18n/encoding_detection.h"
|
||||||
#include "base/i18n/icu_string_conversions.h"
|
#include "base/i18n/icu_string_conversions.h"
|
||||||
#include "base/notreached.h"
|
#include "base/no_destructor.h"
|
||||||
#include "base/numerics/ranges.h"
|
#include "base/numerics/ranges.h"
|
||||||
|
#include "base/sequence_checker.h"
|
||||||
#include "base/stl_util.h"
|
#include "base/stl_util.h"
|
||||||
#include "base/strings/string_util.h"
|
#include "base/strings/string_util.h"
|
||||||
|
#include "components/services/font/public/cpp/font_loader.h"
|
||||||
|
#include "pdf/font_table_linux.h"
|
||||||
#include "pdf/pdfium/pdfium_engine.h"
|
#include "pdf/pdfium/pdfium_engine.h"
|
||||||
#include "pdf/ppapi_migration/pdfium_font_linux.h"
|
#include "pdf/ppapi_migration/pdfium_font_linux.h"
|
||||||
#include "third_party/blink/public/platform/web_font_description.h"
|
#include "third_party/blink/public/platform/web_font_description.h"
|
||||||
@@ -22,6 +26,85 @@ namespace chrome_pdf {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
// Maps font description and charset to `FontId` as requested by PDFium, with
|
||||||
|
// `FontId` as an opaque type that PDFium works with. Based on the `FontId`,
|
||||||
|
// PDFium can read from the font files using GetFontData(). Properly frees the
|
||||||
|
// underlying resource type when PDFium is done with the mapped font.
|
||||||
|
class BlinkFontMapper {
|
||||||
|
public:
|
||||||
|
// Defined as the type most convenient for use with PDFium's
|
||||||
|
// `FPDF_SYSFONTINFO` functions.
|
||||||
|
using FontId = void*;
|
||||||
|
|
||||||
|
BlinkFontMapper() = default;
|
||||||
|
~BlinkFontMapper() = delete;
|
||||||
|
|
||||||
|
// Returns a handle to the font mapped based on `desc` and `charset`, for use
|
||||||
|
// as the `font_id` in GetFontData() and DeleteFont() below. Returns nullptr
|
||||||
|
// on failure.
|
||||||
|
// TODO(thestig): Document how this handles TTC files.
|
||||||
|
FontId MapFont(const blink::WebFontDescription& desc, int charset) {
|
||||||
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||||
|
|
||||||
|
auto font_file = std::make_unique<base::File>();
|
||||||
|
// In RendererBlinkPlatform, SkFontConfigInterface::SetGlobal() only ever
|
||||||
|
// sets the global to a FontLoader. Thus it is safe to assume the returned
|
||||||
|
// result is just that.
|
||||||
|
auto* font_loader = reinterpret_cast<font_service::FontLoader*>(
|
||||||
|
SkFontConfigInterface::RefGlobal().get());
|
||||||
|
font_loader->MatchFontWithFallback(
|
||||||
|
desc.family.Utf8(),
|
||||||
|
desc.weight >= blink::WebFontDescription::kWeightBold, desc.italic,
|
||||||
|
charset, blink::WebFontDescription::kGenericFamilyStandard,
|
||||||
|
font_file.get());
|
||||||
|
if (!font_file->IsValid())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
// Release to PDFium. PDFium will free `font_file` in DeleteFont() below.
|
||||||
|
return font_file.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Releases the font file that `font_id` points to.
|
||||||
|
void DeleteFont(FontId font_id) {
|
||||||
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||||
|
|
||||||
|
delete FileFromFontId(font_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads data from the `font_id` handle for `table` into a `buffer` of
|
||||||
|
// `buf_size`. Returns the amount of data read on success, or 0 on failure.
|
||||||
|
// If `buffer` is null, then just return the required size for the buffer.
|
||||||
|
// See content::GetFontTable() for information on the `table_tag` parameter.
|
||||||
|
unsigned long GetFontData(FontId font_id,
|
||||||
|
unsigned int table_tag,
|
||||||
|
unsigned char* buffer,
|
||||||
|
unsigned long buf_size) const {
|
||||||
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||||
|
|
||||||
|
// TODO(thestig): cache?
|
||||||
|
base::PlatformFile platform_file =
|
||||||
|
FileFromFontId(font_id)->GetPlatformFile();
|
||||||
|
size_t size = buf_size;
|
||||||
|
if (!pdf::GetFontTable(platform_file, table_tag, /*offset=*/0, buffer,
|
||||||
|
&size)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static base::File* FileFromFontId(FontId font_id) {
|
||||||
|
return reinterpret_cast<base::File*>(font_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
SEQUENCE_CHECKER(sequence_checker_);
|
||||||
|
};
|
||||||
|
|
||||||
|
BlinkFontMapper& GetBlinkFontMapper() {
|
||||||
|
static base::NoDestructor<BlinkFontMapper> mapper;
|
||||||
|
return *mapper;
|
||||||
|
}
|
||||||
|
|
||||||
bool UsePepperMapping() {
|
bool UsePepperMapping() {
|
||||||
return PDFiumEngine::GetFontMappingMode() != FontMappingMode::kBlink;
|
return PDFiumEngine::GetFontMappingMode() != FontMappingMode::kBlink;
|
||||||
}
|
}
|
||||||
@@ -153,8 +236,7 @@ void* MapFont(FPDF_SYSFONTINFO*,
|
|||||||
if (UsePepperMapping())
|
if (UsePepperMapping())
|
||||||
return MapPepperFont(desc, charset);
|
return MapPepperFont(desc, charset);
|
||||||
|
|
||||||
NOTIMPLEMENTED();
|
return GetBlinkFontMapper().MapFont(desc, charset);
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long GetFontData(FPDF_SYSFONTINFO*,
|
unsigned long GetFontData(FPDF_SYSFONTINFO*,
|
||||||
@@ -165,8 +247,7 @@ unsigned long GetFontData(FPDF_SYSFONTINFO*,
|
|||||||
if (UsePepperMapping())
|
if (UsePepperMapping())
|
||||||
return GetPepperFontData(font_id, table, buffer, buf_size);
|
return GetPepperFontData(font_id, table, buffer, buf_size);
|
||||||
|
|
||||||
NOTIMPLEMENTED();
|
return GetBlinkFontMapper().GetFontData(font_id, table, buffer, buf_size);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteFont(FPDF_SYSFONTINFO*, void* font_id) {
|
void DeleteFont(FPDF_SYSFONTINFO*, void* font_id) {
|
||||||
@@ -175,7 +256,7 @@ void DeleteFont(FPDF_SYSFONTINFO*, void* font_id) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTIMPLEMENTED();
|
GetBlinkFontMapper().DeleteFont(font_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
FPDF_SYSFONTINFO g_font_info = {1, 0, EnumFonts, MapFont, 0,
|
FPDF_SYSFONTINFO g_font_info = {1, 0, EnumFonts, MapFont, 0,
|
||||||
|
Reference in New Issue
Block a user