Turn off pdf_use_win32_gdi_override in pdfium.gni.
After https://crrev.com/942212, the experimental GDI functions in PDFium are no longer in use. So it is safe to turn this override off, though it cannot be removed quite yet. Turning the override off reveals more dead code, some of which no longer compiles. Remove them. Bug: 1188795 Change-Id: I3eb41357b3275e7ce6dab790971342c3572be9ef Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3287449 Reviewed-by: Alan Screen <awscreen@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org> Reviewed-by: Thomas Anderson <thomasanderson@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org> Cr-Commit-Position: refs/heads/main@{#964891}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
ac7c0b7f39
commit
eddff90e72
build_overrides
chrome
browser
printing
services
pdf
@ -18,5 +18,6 @@ pdf_use_skia_override = false
|
||||
# Disable use of Skia backend, paths only (experimental)
|
||||
pdf_use_skia_paths_override = false
|
||||
|
||||
# TODO(crbug.com/1188795) Remove when this is no longer required in PDFium.
|
||||
# Enable experimental win32 GDI APIs.
|
||||
pdf_use_win32_gdi_override = true
|
||||
pdf_use_win32_gdi_override = false
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include "chrome/services/printing/public/mojom/printing_service.mojom.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "content/public/browser/child_process_data.h"
|
||||
#include "mojo/public/cpp/bindings/pending_receiver.h"
|
||||
#include "mojo/public/cpp/bindings/pending_remote.h"
|
||||
#include "mojo/public/cpp/bindings/receiver.h"
|
||||
#include "mojo/public/cpp/bindings/remote.h"
|
||||
@ -42,55 +41,6 @@ namespace printing {
|
||||
|
||||
namespace {
|
||||
|
||||
class PdfToEmfConverterClientImpl : public mojom::PdfToEmfConverterClient {
|
||||
public:
|
||||
explicit PdfToEmfConverterClientImpl(
|
||||
mojo::PendingReceiver<mojom::PdfToEmfConverterClient> receiver)
|
||||
: receiver_(this, std::move(receiver)) {}
|
||||
|
||||
private:
|
||||
// mojom::PdfToEmfConverterClient implementation.
|
||||
void PreCacheFontCharacters(
|
||||
const std::vector<uint8_t>& logfont_data,
|
||||
const std::u16string& characters,
|
||||
PreCacheFontCharactersCallback callback) override {
|
||||
// TODO(scottmg): pdf/ppapi still require the renderer to be able to
|
||||
// precache GDI fonts (http://crbug.com/383227), even when using
|
||||
// DirectWrite. Eventually this shouldn't be added and should be moved to
|
||||
// FontCacheDispatcher too. http://crbug.com/356346.
|
||||
|
||||
// First, comments from FontCacheDispatcher::OnPreCacheFont do apply here
|
||||
// too. Except that for True Type fonts, GetTextMetrics will not load the
|
||||
// font in memory. The only way windows seem to load properly, it is to
|
||||
// create a similar device (like the one in which we print), then do an
|
||||
// ExtTextOut, as we do in the printing thread, which is sandboxed.
|
||||
const LOGFONT* logfont =
|
||||
reinterpret_cast<const LOGFONT*>(&logfont_data.at(0));
|
||||
|
||||
HDC hdc = CreateEnhMetaFile(nullptr, nullptr, nullptr, nullptr);
|
||||
HFONT font_handle = CreateFontIndirect(logfont);
|
||||
DCHECK(font_handle != nullptr);
|
||||
|
||||
HGDIOBJ old_font = SelectObject(hdc, font_handle);
|
||||
DCHECK(old_font != nullptr);
|
||||
|
||||
ExtTextOut(hdc, 0, 0, ETO_GLYPH_INDEX, 0, base::as_wcstr(characters),
|
||||
characters.length(), nullptr);
|
||||
|
||||
SelectObject(hdc, old_font);
|
||||
DeleteObject(font_handle);
|
||||
|
||||
HENHMETAFILE metafile = CloseEnhMetaFile(hdc);
|
||||
|
||||
if (metafile)
|
||||
DeleteEnhMetaFile(metafile);
|
||||
|
||||
std::move(callback).Run();
|
||||
}
|
||||
|
||||
mojo::Receiver<mojom::PdfToEmfConverterClient> receiver_;
|
||||
};
|
||||
|
||||
// Emf subclass that knows how to play back PostScript data embedded as EMF
|
||||
// comment records.
|
||||
class PostScriptMetaFile : public Emf {
|
||||
@ -201,9 +151,6 @@ class PdfConverterImpl : public PdfConverter {
|
||||
uint32_t pages_generated_ = 0;
|
||||
uint32_t page_count_ = 0;
|
||||
|
||||
std::unique_ptr<PdfToEmfConverterClientImpl>
|
||||
pdf_to_emf_converter_client_impl_;
|
||||
|
||||
mojo::Remote<mojom::PdfToEmfConverter> pdf_to_emf_converter_;
|
||||
|
||||
mojo::Remote<mojom::PdfToEmfConverterFactory> pdf_to_emf_converter_factory_;
|
||||
@ -287,15 +234,8 @@ void PdfConverterImpl::Initialize(scoped_refptr<base::RefCountedMemory> data) {
|
||||
&PdfConverterImpl::OnFailed, weak_ptr_factory_.GetWeakPtr(),
|
||||
std::string("Connection to PdfToEmfConverterFactory error.")));
|
||||
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverterClient>
|
||||
pdf_to_emf_converter_client_remote;
|
||||
pdf_to_emf_converter_client_impl_ =
|
||||
std::make_unique<PdfToEmfConverterClientImpl>(
|
||||
pdf_to_emf_converter_client_remote.InitWithNewPipeAndPassReceiver());
|
||||
|
||||
pdf_to_emf_converter_factory_->CreateConverter(
|
||||
std::move(memory.region), settings_,
|
||||
std::move(pdf_to_emf_converter_client_remote),
|
||||
base::BindOnce(&PdfConverterImpl::OnPageCount,
|
||||
weak_ptr_factory_.GetWeakPtr()));
|
||||
}
|
||||
|
@ -4,14 +4,10 @@
|
||||
|
||||
#include "chrome/services/printing/pdf_to_emf_converter.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
#include "base/bind.h"
|
||||
#include "base/containers/cxx20_erase.h"
|
||||
#include "base/containers/span.h"
|
||||
#include "base/lazy_instance.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "mojo/public/cpp/bindings/remote.h"
|
||||
#include "pdf/pdf.h"
|
||||
@ -21,60 +17,10 @@
|
||||
|
||||
namespace printing {
|
||||
|
||||
namespace {
|
||||
|
||||
base::LazyInstance<std::vector<mojo::Remote<mojom::PdfToEmfConverterClient>>>::
|
||||
Leaky g_converter_clients = LAZY_INSTANCE_INITIALIZER;
|
||||
|
||||
void PreCacheFontCharacters(const LOGFONT* logfont,
|
||||
const wchar_t* text,
|
||||
size_t text_length) {
|
||||
if (g_converter_clients.Get().empty()) {
|
||||
NOTREACHED()
|
||||
<< "PreCacheFontCharacters when no converter client is registered.";
|
||||
return;
|
||||
}
|
||||
|
||||
// We pass the LOGFONT as an array of bytes for simplicity (no typemaps
|
||||
// required).
|
||||
std::vector<uint8_t> logfont_mojo(sizeof(LOGFONT));
|
||||
memcpy(logfont_mojo.data(), logfont, sizeof(LOGFONT));
|
||||
|
||||
g_converter_clients.Get().front()->PreCacheFontCharacters(
|
||||
logfont_mojo, base::WideToUTF16({text, text_length}));
|
||||
}
|
||||
|
||||
void OnConvertedClientDisconnected() {
|
||||
// We have no direct way of tracking which
|
||||
// mojo::Remote<PdfToEmfConverterClient> got disconnected as it is a movable
|
||||
// type, short of using a wrapper. Just traverse the list of clients and
|
||||
// remove the ones that are not bound.
|
||||
base::EraseIf(g_converter_clients.Get(),
|
||||
[](const mojo::Remote<mojom::PdfToEmfConverterClient>& client) {
|
||||
return !client.is_bound();
|
||||
});
|
||||
}
|
||||
|
||||
void RegisterConverterClient(
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverterClient> client_remote) {
|
||||
if (!g_converter_clients.IsCreated()) {
|
||||
// First time this method is called.
|
||||
chrome_pdf::SetPDFEnsureTypefaceCharactersAccessible(
|
||||
PreCacheFontCharacters);
|
||||
}
|
||||
mojo::Remote<mojom::PdfToEmfConverterClient> client(std::move(client_remote));
|
||||
client.set_disconnect_handler(base::BindOnce(&OnConvertedClientDisconnected));
|
||||
g_converter_clients.Get().push_back(std::move(client));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
PdfToEmfConverter::PdfToEmfConverter(
|
||||
base::ReadOnlySharedMemoryRegion pdf_region,
|
||||
const PdfRenderSettings& pdf_render_settings,
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverterClient> client)
|
||||
const PdfRenderSettings& pdf_render_settings)
|
||||
: pdf_render_settings_(pdf_render_settings) {
|
||||
RegisterConverterClient(std::move(client));
|
||||
SetPrintMode();
|
||||
LoadPdf(std::move(pdf_region));
|
||||
}
|
||||
|
@ -15,8 +15,7 @@ namespace printing {
|
||||
class PdfToEmfConverter : public mojom::PdfToEmfConverter {
|
||||
public:
|
||||
PdfToEmfConverter(base::ReadOnlySharedMemoryRegion pdf_region,
|
||||
const PdfRenderSettings& render_settings,
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverterClient> client);
|
||||
const PdfRenderSettings& render_settings);
|
||||
|
||||
PdfToEmfConverter(const PdfToEmfConverter&) = delete;
|
||||
PdfToEmfConverter& operator=(const PdfToEmfConverter&) = delete;
|
||||
|
@ -19,10 +19,9 @@ PdfToEmfConverterFactory::~PdfToEmfConverterFactory() = default;
|
||||
void PdfToEmfConverterFactory::CreateConverter(
|
||||
base::ReadOnlySharedMemoryRegion pdf_region,
|
||||
const PdfRenderSettings& render_settings,
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverterClient> client,
|
||||
CreateConverterCallback callback) {
|
||||
auto converter = std::make_unique<PdfToEmfConverter>(
|
||||
std::move(pdf_region), render_settings, std::move(client));
|
||||
auto converter = std::make_unique<PdfToEmfConverter>(std::move(pdf_region),
|
||||
render_settings);
|
||||
uint32_t page_count = converter->total_page_count();
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverter> converter_remote;
|
||||
mojo::MakeSelfOwnedReceiver(
|
||||
|
@ -25,11 +25,9 @@ class PdfToEmfConverterFactory : public mojom::PdfToEmfConverterFactory {
|
||||
|
||||
private:
|
||||
// mojom::PdfToEmfConverterFactory implementation.
|
||||
void CreateConverter(
|
||||
base::ReadOnlySharedMemoryRegion pdf_region,
|
||||
const PdfRenderSettings& render_settings,
|
||||
mojo::PendingRemote<mojom::PdfToEmfConverterClient> client,
|
||||
CreateConverterCallback callback) override;
|
||||
void CreateConverter(base::ReadOnlySharedMemoryRegion pdf_region,
|
||||
const PdfRenderSettings& render_settings,
|
||||
CreateConverterCallback callback) override;
|
||||
};
|
||||
|
||||
} // namespace printing
|
||||
|
@ -16,12 +16,6 @@ import "mojo/public/mojom/base/string16.mojom";
|
||||
// - call PdfToEmfConverter.ConvertPage() for each page to generate the EMF
|
||||
// files.
|
||||
|
||||
interface PdfToEmfConverterClient {
|
||||
[Sync]
|
||||
PreCacheFontCharacters(array<uint8> logfont,
|
||||
mojo_base.mojom.String16 characters) => ();
|
||||
};
|
||||
|
||||
interface PdfToEmfConverter {
|
||||
ConvertPage(uint32 page_number) =>
|
||||
(mojo_base.mojom.ReadOnlySharedMemoryRegion? emf_region,
|
||||
@ -30,7 +24,6 @@ interface PdfToEmfConverter {
|
||||
|
||||
interface PdfToEmfConverterFactory {
|
||||
CreateConverter(mojo_base.mojom.ReadOnlySharedMemoryRegion pdf_region,
|
||||
PdfRenderSettings render_settings,
|
||||
pending_remote<PdfToEmfConverterClient> client)
|
||||
PdfRenderSettings render_settings)
|
||||
=> (pending_remote<PdfToEmfConverter> converter, uint32 page_count);
|
||||
};
|
||||
|
@ -71,11 +71,6 @@ bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
|
||||
dc);
|
||||
}
|
||||
|
||||
void SetPDFEnsureTypefaceCharactersAccessible(
|
||||
PDFEnsureTypefaceCharactersAccessible func) {
|
||||
PDFEngineExports::Get()->SetPDFEnsureTypefaceCharactersAccessible(func);
|
||||
}
|
||||
|
||||
void SetPDFUsePrintMode(int mode) {
|
||||
PDFEngineExports::Get()->SetPDFUsePrintMode(mode);
|
||||
}
|
||||
|
@ -16,12 +16,6 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
typedef void (*PDFEnsureTypefaceCharactersAccessible)(const LOGFONT* font,
|
||||
const wchar_t* text,
|
||||
size_t text_length);
|
||||
#endif
|
||||
|
||||
namespace gfx {
|
||||
class Rect;
|
||||
class Size;
|
||||
@ -95,9 +89,6 @@ bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
|
||||
bool autorotate,
|
||||
bool use_color);
|
||||
|
||||
void SetPDFEnsureTypefaceCharactersAccessible(
|
||||
PDFEnsureTypefaceCharactersAccessible func);
|
||||
|
||||
void SetPDFUsePrintMode(int mode);
|
||||
#endif // BUILDFLAG(IS_WIN)
|
||||
|
||||
|
@ -31,12 +31,6 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
typedef void (*PDFEnsureTypefaceCharactersAccessible)(const LOGFONT* font,
|
||||
const wchar_t* text,
|
||||
size_t text_length);
|
||||
#endif
|
||||
|
||||
class SkBitmap;
|
||||
|
||||
namespace base {
|
||||
@ -535,9 +529,6 @@ class PDFEngineExports {
|
||||
const RenderingSettings& settings,
|
||||
HDC dc) = 0;
|
||||
|
||||
virtual void SetPDFEnsureTypefaceCharactersAccessible(
|
||||
PDFEnsureTypefaceCharactersAccessible func) = 0;
|
||||
|
||||
virtual void SetPDFUsePrintMode(int mode) = 0;
|
||||
#endif // BUILDFLAG(IS_WIN)
|
||||
|
||||
|
@ -312,12 +312,6 @@ bool PDFiumEngineExports::RenderPDFPageToDC(
|
||||
return true;
|
||||
}
|
||||
|
||||
void PDFiumEngineExports::SetPDFEnsureTypefaceCharactersAccessible(
|
||||
PDFEnsureTypefaceCharactersAccessible func) {
|
||||
FPDF_SetTypefaceAccessibleFunc(
|
||||
reinterpret_cast<PDFiumEnsureTypefaceCharactersAccessible>(func));
|
||||
}
|
||||
|
||||
void PDFiumEngineExports::SetPDFUsePrintMode(int mode) {
|
||||
FPDF_SetPrintMode(mode);
|
||||
}
|
||||
|
@ -30,9 +30,6 @@ class PDFiumEngineExports : public PDFEngineExports {
|
||||
int page_number,
|
||||
const RenderingSettings& settings,
|
||||
HDC dc) override;
|
||||
void SetPDFEnsureTypefaceCharactersAccessible(
|
||||
PDFEnsureTypefaceCharactersAccessible func) override;
|
||||
|
||||
void SetPDFUsePrintMode(int mode) override;
|
||||
#endif // BUILDFLAG(IS_WIN)
|
||||
bool RenderPDFPageToBitmap(base::span<const uint8_t> pdf_buffer,
|
||||
|
Reference in New Issue
Block a user