Index: pdf/pdfium/pdfium_engine.cc |
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc |
index 67be88d96af7b07691fb585c5c0288967d4579a9..23a6349bfe645fc180a16f7c0c958f66ccb26212 100644 |
--- a/pdf/pdfium/pdfium_engine.cc |
+++ b/pdf/pdfium/pdfium_engine.cc |
@@ -115,13 +115,6 @@ std::vector<uint32_t> GetPageNumbersFromPrintPageNumberRange( |
PP_Instance g_last_instance_id; |
-struct PDFFontSubstitution { |
- const char* pdf_name; |
- const char* face; |
- bool bold; |
- bool italic; |
-}; |
- |
PP_BrowserFont_Trusted_Weight WeightToBrowserFontTrustedWeight(int weight) { |
static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_100 == 0, |
"PP_BrowserFont_Trusted_Weight min"); |
@@ -147,7 +140,33 @@ void EnumFonts(struct _FPDF_SYSFONTINFO* sysfontinfo, void* mapper) { |
} |
} |
-const PDFFontSubstitution PDFFontSubstitutions[] = { |
+void* MapFont(struct _FPDF_SYSFONTINFO*, int weight, int italic, |
+ int charset, int pitch_family, const char* face, int* exact) { |
+ // Do not attempt to map fonts if pepper is not initialized (for privet local |
+ // printing). |
+ // TODO(noamsml): Real font substitution (http://crbug.com/391978) |
+ if (!pp::Module::Get()) |
+ return NULL; |
+ |
+ pp::BrowserFontDescription description; |
+ |
+ // Pretend the system does not have the Symbol font to force a fallback to |
+ // the built in Symbol font in CFX_FontMapper::FindSubstFont(). |
+ if (strcmp(face, "Symbol") == 0) |
+ return NULL; |
+ |
+ if (pitch_family & FXFONT_FF_FIXEDPITCH) { |
+ description.set_family(PP_BROWSERFONT_TRUSTED_FAMILY_MONOSPACE); |
+ } else if (pitch_family & FXFONT_FF_ROMAN) { |
+ description.set_family(PP_BROWSERFONT_TRUSTED_FAMILY_SERIF); |
+ } |
+ |
+ static const struct { |
+ const char* pdf_name; |
+ const char* face; |
+ bool bold; |
+ bool italic; |
+ } kPdfFontSubstitutions[] = { |
{"Courier", "Courier New", false, false}, |
{"Courier-Bold", "Courier New", true, false}, |
{"Courier-BoldOblique", "Courier New", true, true}, |
@@ -185,41 +204,20 @@ const PDFFontSubstitution PDFFontSubstitutions[] = { |
"MS Mincho", false, false}, |
}; |
-void* MapFont(struct _FPDF_SYSFONTINFO*, int weight, int italic, |
- int charset, int pitch_family, const char* face, int* exact) { |
- // Do not attempt to map fonts if pepper is not initialized (for privet local |
- // printing). |
- // TODO(noamsml): Real font substitution (http://crbug.com/391978) |
- if (!pp::Module::Get()) |
- return NULL; |
- |
- pp::BrowserFontDescription description; |
- |
- // Pretend the system does not have the Symbol font to force a fallback to |
- // the built in Symbol font in CFX_FontMapper::FindSubstFont(). |
- if (strcmp(face, "Symbol") == 0) |
- return NULL; |
- |
- if (pitch_family & FXFONT_FF_FIXEDPITCH) { |
- description.set_family(PP_BROWSERFONT_TRUSTED_FAMILY_MONOSPACE); |
- } else if (pitch_family & FXFONT_FF_ROMAN) { |
- description.set_family(PP_BROWSERFONT_TRUSTED_FAMILY_SERIF); |
- } |
- |
// Map from the standard PDF fonts to TrueType font names. |
size_t i; |
- for (i = 0; i < arraysize(PDFFontSubstitutions); ++i) { |
- if (strcmp(face, PDFFontSubstitutions[i].pdf_name) == 0) { |
- description.set_face(PDFFontSubstitutions[i].face); |
- if (PDFFontSubstitutions[i].bold) |
+ for (i = 0; i < arraysize(kPdfFontSubstitutions); ++i) { |
+ if (strcmp(face, kPdfFontSubstitutions[i].pdf_name) == 0) { |
+ description.set_face(kPdfFontSubstitutions[i].face); |
+ if (kPdfFontSubstitutions[i].bold) |
description.set_weight(PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD); |
- if (PDFFontSubstitutions[i].italic) |
+ if (kPdfFontSubstitutions[i].italic) |
description.set_italic(true); |
break; |
} |
} |
- if (i == arraysize(PDFFontSubstitutions)) { |
+ if (i == arraysize(kPdfFontSubstitutions)) { |
// Convert to UTF-8 before calling set_face(). |
std::string face_utf8; |
if (base::IsStringUTF8(face)) { |
@@ -297,7 +295,7 @@ void Unsupported_Handler(UNSUPPORT_INFO*, int type) { |
g_engine_for_unsupported->UnsupportedFeature(type); |
} |
-UNSUPPORT_INFO g_unsuppored_info = { |
+UNSUPPORT_INFO g_unsupported_info = { |
1, |
Unsupported_Handler |
}; |
@@ -328,16 +326,16 @@ void SetPageSizeAndContentRect(bool rotated, |
// Calculate the scale factor between |content_rect| and a page of size |
// |src_width| x |src_height|. |
// |
-// |scale_to_fit| is true, if we need to calculate the scale factor. |
// |content_rect| specifies the printable area of the destination page, with |
// origin at left-bottom. Values are in points. |
// |src_width| specifies the source page width in points. |
// |src_height| specifies the source page height in points. |
// |rotated| True if source page is rotated 90 degree or 270 degree. |
-double CalculateScaleFactor(bool scale_to_fit, |
- const pp::Rect& content_rect, |
- double src_width, double src_height, bool rotated) { |
- if (!scale_to_fit || src_width == 0 || src_height == 0) |
+double CalculateScaleFactor(const pp::Rect& content_rect, |
+ double src_width, |
+ double src_height, |
+ bool rotated) { |
+ if (src_width == 0 || src_height == 0) |
return 1.0; |
double actual_source_page_width = rotated ? src_height : src_width; |
@@ -371,43 +369,54 @@ void SetDefaultClipBox(bool rotated, ClipBox* clip_box) { |
clip_box->top = rotated ? kPaperWidth : kPaperHeight; |
} |
-// Compute source clip box boundaries based on the crop box / media box of |
-// source page and scale factor. |
-// |
-// |page| Handle to the source page. Returned by FPDF_LoadPage function. |
-// |scale_factor| specifies the scale factor that should be applied to source |
-// clip box boundaries. |
-// |rotated| True if source page is rotated 90 degree or 270 degree. |
-// |clip_box| out param to hold the computed source clip box values. |
-void CalculateClipBoxBoundary(FPDF_PAGE page, double scale_factor, bool rotated, |
- ClipBox* clip_box) { |
- ClipBox media_box; |
- if (!FPDFPage_GetMediaBox(page, &media_box.left, &media_box.bottom, |
- &media_box.right, &media_box.top)) { |
- SetDefaultClipBox(rotated, &media_box); |
+// Set the media box and/or crop box as needed. |
raymes
2015/10/27 05:59:07
nit: fill 80chars
Lei Zhang
2015/10/27 06:52:13
Done.
|
+// If both boxes are there, then nothing needs to be done. If one box is |
+// missing, then fill it with the value from the other box. If both boxes are |
+// missing, then they both get the default value from SetDefaultClipBox(), based |
+// on |rotated|. |
+void CalculateMediaBoxAndCropBox(bool rotated, |
+ bool has_media_box, |
+ bool has_crop_box, |
+ ClipBox* media_box, |
+ ClipBox* crop_box) { |
+ if (has_media_box) { |
+ if (!has_crop_box) |
+ *crop_box = *media_box; |
+ return; |
} |
- ClipBox crop_box; |
- if (!FPDFPage_GetCropBox(page, &crop_box.left, &crop_box.bottom, |
- &crop_box.right, &crop_box.top)) { |
- SetDefaultClipBox(rotated, &crop_box); |
- } |
+ if (!has_crop_box) |
+ SetDefaultClipBox(rotated, crop_box); |
+ *media_box = *crop_box; |
raymes
2015/10/27 05:59:07
This is a little confusing to me. Perhaps we just
Lei Zhang
2015/10/27 06:52:13
Done.
|
+} |
+ |
+// Compute source clip box boundaries based on the crop box / media box of |
+// source page. |
+// |
+// |media_box| The PDF's media box. |
+// |crop_box| The PDF's crop box. |
+ClipBox CalculateClipBoxBoundary(const ClipBox& media_box, |
+ const ClipBox& crop_box) { |
+ ClipBox clip_box; |
// Clip |media_box| to the size of |crop_box|, but ignore |crop_box| if it is |
// bigger than |media_box|. |
- clip_box->left = |
+ clip_box.left = |
(crop_box.left < media_box.left) ? media_box.left : crop_box.left; |
- clip_box->right = |
+ clip_box.right = |
(crop_box.right > media_box.right) ? media_box.right : crop_box.right; |
- clip_box->top = (crop_box.top > media_box.top) ? media_box.top : crop_box.top; |
- clip_box->bottom = |
+ clip_box.top = (crop_box.top > media_box.top) ? media_box.top : crop_box.top; |
+ clip_box.bottom = |
(crop_box.bottom < media_box.bottom) ? media_box.bottom : crop_box.bottom; |
+ return clip_box; |
+} |
- // Finally, scale |clip_box|. |
- clip_box->left *= scale_factor; |
- clip_box->right *= scale_factor; |
- clip_box->bottom *= scale_factor; |
- clip_box->top *= scale_factor; |
+// Scale |box| by |scale_factor|. |
+void ScaleClipBox(double scale_factor, ClipBox* box) { |
+ box->left *= scale_factor; |
+ box->right *= scale_factor; |
+ box->bottom *= scale_factor; |
+ box->top *= scale_factor; |
} |
// Calculate the clip box translation offset for a page that does need to be |
@@ -612,7 +621,7 @@ bool InitializeSDK() { |
FPDF_SetSystemFontInfo(&g_font_info); |
#endif |
- FSDK_SetUnSpObjProcessHandler(&g_unsuppored_info); |
+ FSDK_SetUnSpObjProcessHandler(&g_unsupported_info); |
return true; |
} |
@@ -3412,13 +3421,27 @@ void PDFiumEngine::TransformPDFPageForPrinting( |
const int actual_page_height = |
rotated ? page_size.width() : page_size.height(); |
- const double scale_factor = CalculateScaleFactor(fit_to_page, content_rect, |
- src_page_width, |
- src_page_height, rotated); |
+ const double scale_factor = fit_to_page ? |
+ CalculateScaleFactor( |
+ content_rect, src_page_width, src_page_height, rotated) : 1.0; |
// Calculate positions for the clip box. |
- ClipBox source_clip_box; |
- CalculateClipBoxBoundary(page, scale_factor, rotated, &source_clip_box); |
+ ClipBox media_box; |
+ ClipBox crop_box; |
+ bool has_media_box = !!FPDFPage_GetMediaBox(page, |
+ &media_box.left, |
+ &media_box.bottom, |
+ &media_box.right, |
+ &media_box.top); |
+ bool has_crop_box = !!FPDFPage_GetCropBox(page, |
+ &crop_box.left, |
+ &crop_box.bottom, |
+ &crop_box.right, |
+ &crop_box.top); |
+ CalculateMediaBoxAndCropBox( |
+ rotated, has_media_box, has_crop_box, &media_box, &crop_box); |
+ ClipBox source_clip_box = CalculateClipBoxBoundary(media_box, crop_box); |
+ ScaleClipBox(scale_factor, &source_clip_box); |
// Calculate the translation offset values. |
double offset_x = 0; |