Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: pdf/pdfium/pdfium_engine.cc

Issue 2479313005: Add font substituted metrics for OS other than Linux (Closed)
Patch Set: Address comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pdf/out_of_process_instance.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "pdf/pdfium/pdfium_engine.h" 5 #include "pdf/pdfium/pdfium_engine.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 page_numbers.push_back(page_number); 124 page_numbers.push_back(page_number);
125 } 125 }
126 } 126 }
127 return page_numbers; 127 return page_numbers;
128 } 128 }
129 129
130 #if defined(OS_LINUX) 130 #if defined(OS_LINUX)
131 131
132 PP_Instance g_last_instance_id; 132 PP_Instance g_last_instance_id;
133 133
134 // TODO(npm): Move font stuff to another file to reduce the size of this one
134 PP_BrowserFont_Trusted_Weight WeightToBrowserFontTrustedWeight(int weight) { 135 PP_BrowserFont_Trusted_Weight WeightToBrowserFontTrustedWeight(int weight) {
135 static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_100 == 0, 136 static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_100 == 0,
136 "PP_BrowserFont_Trusted_Weight min"); 137 "PP_BrowserFont_Trusted_Weight min");
137 static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_900 == 8, 138 static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_900 == 8,
138 "PP_BrowserFont_Trusted_Weight max"); 139 "PP_BrowserFont_Trusted_Weight max");
139 const int kMinimumWeight = 100; 140 const int kMinimumWeight = 100;
140 const int kMaximumWeight = 900; 141 const int kMaximumWeight = 900;
141 int normalized_weight = 142 int normalized_weight =
142 std::min(std::max(weight, kMinimumWeight), kMaximumWeight); 143 std::min(std::max(weight, kMinimumWeight), kMaximumWeight);
143 normalized_weight = (normalized_weight / 100) - 1; 144 normalized_weight = (normalized_weight / 100) - 1;
144 return static_cast<PP_BrowserFont_Trusted_Weight>(normalized_weight); 145 return static_cast<PP_BrowserFont_Trusted_Weight>(normalized_weight);
145 } 146 }
146 147
147 // This list is for CPWL_FontMap::GetDefaultFontByCharset(). 148 // This list is for CPWL_FontMap::GetDefaultFontByCharset().
148 // We pretend to have these font natively and let the browser (or underlying 149 // We pretend to have these font natively and let the browser (or underlying
149 // fontconfig) to pick the proper font on the system. 150 // fontconfig) to pick the proper font on the system.
150 void EnumFonts(struct _FPDF_SYSFONTINFO* sysfontinfo, void* mapper) { 151 void EnumFonts(FPDF_SYSFONTINFO* sysfontinfo, void* mapper) {
151 FPDF_AddInstalledFont(mapper, "Arial", FXFONT_DEFAULT_CHARSET); 152 FPDF_AddInstalledFont(mapper, "Arial", FXFONT_DEFAULT_CHARSET);
152 153
153 const FPDF_CharsetFontMap* font_map = FPDF_GetDefaultTTFMap(); 154 const FPDF_CharsetFontMap* font_map = FPDF_GetDefaultTTFMap();
154 for (; font_map->charset != -1; ++font_map) { 155 for (; font_map->charset != -1; ++font_map) {
155 FPDF_AddInstalledFont(mapper, font_map->fontname, font_map->charset); 156 FPDF_AddInstalledFont(mapper, font_map->fontname, font_map->charset);
156 } 157 }
157 } 158 }
158 159
159 void* MapFont(struct _FPDF_SYSFONTINFO*, int weight, int italic, 160 void* MapFont(FPDF_SYSFONTINFO*,
160 int charset, int pitch_family, const char* face, int* exact) { 161 int weight,
162 int italic,
163 int charset,
164 int pitch_family,
165 const char* face,
166 int* exact) {
161 // Do not attempt to map fonts if pepper is not initialized (for privet local 167 // Do not attempt to map fonts if pepper is not initialized (for privet local
162 // printing). 168 // printing).
163 // TODO(noamsml): Real font substitution (http://crbug.com/391978) 169 // TODO(noamsml): Real font substitution (http://crbug.com/391978)
164 if (!pp::Module::Get()) 170 if (!pp::Module::Get())
165 return nullptr; 171 return nullptr;
166 172
167 pp::BrowserFontDescription description; 173 pp::BrowserFontDescription description;
168 174
169 // Pretend the system does not have the Symbol font to force a fallback to 175 // Pretend the system does not have the Symbol font to force a fallback to
170 // the built in Symbol font in CFX_FontMapper::FindSubstFont(). 176 // the built in Symbol font in CFX_FontMapper::FindSubstFont().
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 g_engine_for_fontmapper->FontSubstituted(); 273 g_engine_for_fontmapper->FontSubstituted();
268 274
269 PP_Resource font_resource = pp::PDF::GetFontFileWithFallback( 275 PP_Resource font_resource = pp::PDF::GetFontFileWithFallback(
270 pp::InstanceHandle(g_last_instance_id), 276 pp::InstanceHandle(g_last_instance_id),
271 &description.pp_font_description(), 277 &description.pp_font_description(),
272 static_cast<PP_PrivateFontCharset>(charset)); 278 static_cast<PP_PrivateFontCharset>(charset));
273 long res_id = font_resource; 279 long res_id = font_resource;
274 return reinterpret_cast<void*>(res_id); 280 return reinterpret_cast<void*>(res_id);
275 } 281 }
276 282
277 unsigned long GetFontData(struct _FPDF_SYSFONTINFO*, void* font_id, 283 unsigned long GetFontData(FPDF_SYSFONTINFO*,
278 unsigned int table, unsigned char* buffer, 284 void* font_id,
285 unsigned int table,
286 unsigned char* buffer,
279 unsigned long buf_size) { 287 unsigned long buf_size) {
280 if (!pp::PDF::IsAvailable()) { 288 if (!pp::PDF::IsAvailable()) {
281 NOTREACHED(); 289 NOTREACHED();
282 return 0; 290 return 0;
283 } 291 }
284 292
285 uint32_t size = buf_size; 293 uint32_t size = buf_size;
286 long res_id = reinterpret_cast<long>(font_id); 294 long res_id = reinterpret_cast<long>(font_id);
287 if (!pp::PDF::GetFontTableForPrivateFontFile(res_id, table, buffer, &size)) 295 if (!pp::PDF::GetFontTableForPrivateFontFile(res_id, table, buffer, &size))
288 return 0; 296 return 0;
289 return size; 297 return size;
290 } 298 }
291 299
292 void DeleteFont(struct _FPDF_SYSFONTINFO*, void* font_id) { 300 void DeleteFont(FPDF_SYSFONTINFO*, void* font_id) {
293 long res_id = reinterpret_cast<long>(font_id); 301 long res_id = reinterpret_cast<long>(font_id);
294 pp::Module::Get()->core()->ReleaseResource(res_id); 302 pp::Module::Get()->core()->ReleaseResource(res_id);
295 } 303 }
296 304
297 FPDF_SYSFONTINFO g_font_info = { 305 FPDF_SYSFONTINFO g_font_info = {
298 1, 306 1,
299 0, 307 0,
300 EnumFonts, 308 EnumFonts,
301 MapFont, 309 MapFont,
302 0, 310 0,
303 GetFontData, 311 GetFontData,
304 0, 312 0,
305 0, 313 0,
306 DeleteFont 314 DeleteFont
307 }; 315 };
316 #else
317 struct FPDF_SYSFONTINFO_WITHMETRICS : public FPDF_SYSFONTINFO {
318 explicit FPDF_SYSFONTINFO_WITHMETRICS(FPDF_SYSFONTINFO* default_sysfontinfo) {
319 version = default_sysfontinfo->version;
320 default_sysfontinfo_ = default_sysfontinfo;
321 }
322
323 ~FPDF_SYSFONTINFO_WITHMETRICS() { delete default_sysfontinfo_; }
Tom Sepez 2016/11/08 21:25:52 The public header says: Application should call F
npm 2016/11/08 21:56:26 The Release() method deletes the extra stuff in FP
324
325 FPDF_SYSFONTINFO* default_sysfontinfo_;
326 };
327
328 FPDF_SYSFONTINFO_WITHMETRICS* g_font_info = nullptr;
329
330 void* MapFontWithMetrics(FPDF_SYSFONTINFO* sysfontinfo,
331 int weight,
332 int italic,
333 int charset,
334 int pitch_family,
335 const char* face,
336 int* exact) {
337 auto* fontinfo_with_metrics =
338 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
339 void* mapped_font = fontinfo_with_metrics->default_sysfontinfo_->MapFont(
340 fontinfo_with_metrics->default_sysfontinfo_, weight, italic, charset,
341 pitch_family, face, exact);
342 if (mapped_font && g_engine_for_fontmapper)
343 g_engine_for_fontmapper->FontSubstituted();
344 return mapped_font;
345 }
346
347 void DeleteFont(FPDF_SYSFONTINFO* sysfontinfo, void* font_id) {
348 auto* fontinfo_with_metrics =
349 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
350 fontinfo_with_metrics->default_sysfontinfo_->DeleteFont(
351 fontinfo_with_metrics->default_sysfontinfo_, font_id);
352 }
353
354 void EnumFonts(FPDF_SYSFONTINFO* sysfontinfo, void* mapper) {
355 auto* fontinfo_with_metrics =
356 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
357 fontinfo_with_metrics->default_sysfontinfo_->EnumFonts(
358 fontinfo_with_metrics->default_sysfontinfo_, mapper);
359 }
360
361 unsigned long GetFaceName(FPDF_SYSFONTINFO* sysfontinfo,
362 void* hFont,
363 char* buffer,
364 unsigned long buffer_size) {
365 auto* fontinfo_with_metrics =
366 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
367 return fontinfo_with_metrics->default_sysfontinfo_->GetFaceName(
368 fontinfo_with_metrics->default_sysfontinfo_, hFont, buffer, buffer_size);
369 }
370
371 void* GetFont(FPDF_SYSFONTINFO* sysfontinfo, const char* face) {
372 auto* fontinfo_with_metrics =
373 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
374 return fontinfo_with_metrics->default_sysfontinfo_->GetFont(
375 fontinfo_with_metrics->default_sysfontinfo_, face);
376 }
377
378 int GetFontCharset(FPDF_SYSFONTINFO* sysfontinfo, void* hFont) {
379 auto* fontinfo_with_metrics =
380 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
381 return fontinfo_with_metrics->default_sysfontinfo_->GetFontCharset(
382 fontinfo_with_metrics->default_sysfontinfo_, hFont);
383 }
384
385 unsigned long GetFontData(FPDF_SYSFONTINFO* sysfontinfo,
386 void* hFont,
387 unsigned int table,
388 unsigned char* buffer,
389 unsigned long buf_size) {
390 auto* fontinfo_with_metrics =
391 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
392 return fontinfo_with_metrics->default_sysfontinfo_->GetFontData(
393 fontinfo_with_metrics->default_sysfontinfo_, hFont, table, buffer,
394 buf_size);
395 }
396
397 void Release(FPDF_SYSFONTINFO* sysfontinfo) {
398 auto* fontinfo_with_metrics =
399 static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo);
400 fontinfo_with_metrics->default_sysfontinfo_->Release(
401 fontinfo_with_metrics->default_sysfontinfo_);
402 }
308 #endif // defined(OS_LINUX) 403 #endif // defined(OS_LINUX)
309 404
310 PDFiumEngine* g_engine_for_unsupported = nullptr; 405 PDFiumEngine* g_engine_for_unsupported = nullptr;
311 406
312 void Unsupported_Handler(UNSUPPORT_INFO*, int type) { 407 void Unsupported_Handler(UNSUPPORT_INFO*, int type) {
313 if (!g_engine_for_unsupported) { 408 if (!g_engine_for_unsupported) {
314 NOTREACHED(); 409 NOTREACHED();
315 return; 410 return;
316 } 411 }
317 412
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 bool InitializeSDK() { 604 bool InitializeSDK() {
510 SetUpV8(); 605 SetUpV8();
511 606
512 FPDF_LIBRARY_CONFIG config; 607 FPDF_LIBRARY_CONFIG config;
513 config.version = 2; 608 config.version = 2;
514 config.m_pUserFontPaths = nullptr; 609 config.m_pUserFontPaths = nullptr;
515 config.m_pIsolate = v8::Isolate::GetCurrent(); 610 config.m_pIsolate = v8::Isolate::GetCurrent();
516 config.m_v8EmbedderSlot = gin::kEmbedderPDFium; 611 config.m_v8EmbedderSlot = gin::kEmbedderPDFium;
517 FPDF_InitLibraryWithConfig(&config); 612 FPDF_InitLibraryWithConfig(&config);
518 613
519 #if defined(OS_LINUX) 614 #if !defined(OS_LINUX)
615 g_font_info =
616 new FPDF_SYSFONTINFO_WITHMETRICS(FPDF_GetDefaultSystemFontInfo());
617 if (g_font_info->default_sysfontinfo_->Release)
618 g_font_info->Release = Release;
619 if (g_font_info->default_sysfontinfo_->EnumFonts)
620 g_font_info->EnumFonts = EnumFonts;
621 // Set new MapFont that calculates metrics
622 if (g_font_info->default_sysfontinfo_->MapFont)
623 g_font_info->MapFont = MapFontWithMetrics;
624 if (g_font_info->default_sysfontinfo_->GetFont)
625 g_font_info->GetFont = GetFont;
626 if (g_font_info->default_sysfontinfo_->GetFaceName)
627 g_font_info->GetFaceName = GetFaceName;
628 if (g_font_info->default_sysfontinfo_->GetFontCharset)
629 g_font_info->GetFontCharset = GetFontCharset;
630 // These are required according to documentation
631 g_font_info->GetFontData = GetFontData;
632 g_font_info->DeleteFont = DeleteFont;
633 FPDF_SetSystemFontInfo(g_font_info);
634 #else
520 // Font loading doesn't work in the renderer sandbox in Linux. 635 // Font loading doesn't work in the renderer sandbox in Linux.
521 FPDF_SetSystemFontInfo(&g_font_info); 636 FPDF_SetSystemFontInfo(&g_font_info);
522 #endif 637 #endif
523 638
524 FSDK_SetUnSpObjProcessHandler(&g_unsupported_info); 639 FSDK_SetUnSpObjProcessHandler(&g_unsupported_info);
525 640
526 return true; 641 return true;
527 } 642 }
528 643
529 void ShutdownSDK() { 644 void ShutdownSDK() {
645 #if !defined(OS_LINUX)
646 delete g_font_info;
647 #endif
530 FPDF_DestroyLibrary(); 648 FPDF_DestroyLibrary();
531 TearDownV8(); 649 TearDownV8();
532 } 650 }
533 651
534 PDFEngine* PDFEngine::Create(PDFEngine::Client* client) { 652 PDFEngine* PDFEngine::Create(PDFEngine::Client* client) {
535 return new PDFiumEngine(client); 653 return new PDFiumEngine(client);
536 } 654 }
537 655
538 PDFiumEngine::PDFiumEngine(PDFEngine::Client* client) 656 PDFiumEngine::PDFiumEngine(PDFEngine::Client* client)
539 : client_(client), 657 : client_(client),
(...skipping 3485 matching lines...) Expand 10 before | Expand all | Expand 10 after
4025 FPDF_DOCUMENT doc = 4143 FPDF_DOCUMENT doc =
4026 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); 4144 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr);
4027 if (!doc) 4145 if (!doc)
4028 return false; 4146 return false;
4029 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; 4147 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0;
4030 FPDF_CloseDocument(doc); 4148 FPDF_CloseDocument(doc);
4031 return success; 4149 return success;
4032 } 4150 }
4033 4151
4034 } // namespace chrome_pdf 4152 } // namespace chrome_pdf
OLDNEW
« no previous file with comments | « pdf/out_of_process_instance.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698