| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkPDFDevice.h" | 8 #include "SkPDFDevice.h" |
| 9 | 9 |
| 10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 currentEntry()->fTextFill = state.fTextFill; | 565 currentEntry()->fTextFill = state.fTextFill; |
| 566 } | 566 } |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 | 569 |
| 570 static bool not_supported_for_layers(const SkPaint& layerPaint) { | 570 static bool not_supported_for_layers(const SkPaint& layerPaint) { |
| 571 // PDF does not support image filters, so render them on CPU. | 571 // PDF does not support image filters, so render them on CPU. |
| 572 // Note that this rendering is done at "screen" resolution (100dpi), not | 572 // Note that this rendering is done at "screen" resolution (100dpi), not |
| 573 // printer resolution. | 573 // printer resolution. |
| 574 // TODO: It may be possible to express some filters natively using PDF | 574 // TODO: It may be possible to express some filters natively using PDF |
| 575 // to improve quality and file size (http://skbug.com/3043) | 575 // to improve quality and file size (https://bug.skia.org/3043) |
| 576 | 576 |
| 577 // TODO: should we return true if there is a colorfilter? | 577 // TODO: should we return true if there is a colorfilter? |
| 578 return layerPaint.getImageFilter() != nullptr; | 578 return layerPaint.getImageFilter() != nullptr; |
| 579 } | 579 } |
| 580 | 580 |
| 581 SkBaseDevice* SkPDFDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
* layerPaint) { | 581 SkBaseDevice* SkPDFDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
* layerPaint) { |
| 582 if (cinfo.fForImageFilter || | 582 if (cinfo.fForImageFilter || |
| 583 (layerPaint && not_supported_for_layers(*layerPaint))) { | 583 (layerPaint && not_supported_for_layers(*layerPaint))) { |
| 584 return nullptr; | 584 return nullptr; |
| 585 } | 585 } |
| (...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 break; | 1267 break; |
| 1268 default: | 1268 default: |
| 1269 SkFAIL("unknown text encoding"); | 1269 SkFAIL("unknown text encoding"); |
| 1270 } | 1270 } |
| 1271 } | 1271 } |
| 1272 | 1272 |
| 1273 | 1273 |
| 1274 void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, | 1274 void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
| 1275 SkScalar x, SkScalar y, const SkPaint& srcPaint) { | 1275 SkScalar x, SkScalar y, const SkPaint& srcPaint) { |
| 1276 if (!SkPDFFont::CanEmbedTypeface(srcPaint.getTypeface(), fCanon)) { | 1276 if (!SkPDFFont::CanEmbedTypeface(srcPaint.getTypeface(), fCanon)) { |
| 1277 // http://skbug.com/3866 | 1277 // https://bug.skia.org/3866 |
| 1278 SkPath path; | 1278 SkPath path; |
| 1279 srcPaint.getTextPath(text, len, x, y, &path); | 1279 srcPaint.getTextPath(text, len, x, y, &path); |
| 1280 this->drawPath(d, path, srcPaint, &SkMatrix::I(), true); | 1280 this->drawPath(d, path, srcPaint, &SkMatrix::I(), true); |
| 1281 // Draw text transparently to make it copyable/searchable/accessable. | 1281 // Draw text transparently to make it copyable/searchable/accessable. |
| 1282 draw_transparent_text(this, d, text, len, x, y, srcPaint); | 1282 draw_transparent_text(this, d, text, len, x, y, srcPaint); |
| 1283 return; | 1283 return; |
| 1284 } | 1284 } |
| 1285 SkPaint paint = srcPaint; | 1285 SkPaint paint = srcPaint; |
| 1286 replace_srcmode_on_opaque_paint(&paint); | 1286 replace_srcmode_on_opaque_paint(&paint); |
| 1287 | 1287 |
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2342 SkPath shape; | 2342 SkPath shape; |
| 2343 shape.addRect(SkRect::Make(subset)); | 2343 shape.addRect(SkRect::Make(subset)); |
| 2344 shape.transform(matrix); | 2344 shape.transform(matrix); |
| 2345 content.setShape(shape); | 2345 content.setShape(shape); |
| 2346 } | 2346 } |
| 2347 if (!content.needSource()) { | 2347 if (!content.needSource()) { |
| 2348 return; | 2348 return; |
| 2349 } | 2349 } |
| 2350 | 2350 |
| 2351 if (SkColorFilter* colorFilter = paint.getColorFilter()) { | 2351 if (SkColorFilter* colorFilter = paint.getColorFilter()) { |
| 2352 // TODO(http://skbug.com/4378): implement colorfilter on other | 2352 // TODO(https://bug.skia.org/4378): implement colorfilter on other |
| 2353 // draw calls. This code here works for all | 2353 // draw calls. This code here works for all |
| 2354 // drawBitmap*()/drawImage*() calls amd ImageFilters (which | 2354 // drawBitmap*()/drawImage*() calls amd ImageFilters (which |
| 2355 // rasterize a layer on this backend). Fortuanely, this seems | 2355 // rasterize a layer on this backend). Fortuanely, this seems |
| 2356 // to be how Chromium impements most color-filters. | 2356 // to be how Chromium impements most color-filters. |
| 2357 autoImageUnref.reset(color_filter(image, colorFilter)); | 2357 autoImageUnref.reset(color_filter(image, colorFilter)); |
| 2358 image = autoImageUnref; | 2358 image = autoImageUnref; |
| 2359 // TODO(halcanary): de-dupe this by caching filtered images. | 2359 // TODO(halcanary): de-dupe this by caching filtered images. |
| 2360 // (maybe in the resource cache?) | 2360 // (maybe in the resource cache?) |
| 2361 } | 2361 } |
| 2362 SkAutoTUnref<SkPDFObject> pdfimage(SkSafeRef(fCanon->findPDFBitmap(image))); | 2362 SkAutoTUnref<SkPDFObject> pdfimage(SkSafeRef(fCanon->findPDFBitmap(image))); |
| 2363 if (!pdfimage) { | 2363 if (!pdfimage) { |
| 2364 pdfimage.reset(SkPDFCreateBitmapObject(image)); | 2364 pdfimage.reset(SkPDFCreateBitmapObject(image)); |
| 2365 if (!pdfimage) { | 2365 if (!pdfimage) { |
| 2366 return; | 2366 return; |
| 2367 } | 2367 } |
| 2368 fCanon->addPDFBitmap(image->uniqueID(), pdfimage); | 2368 fCanon->addPDFBitmap(image->uniqueID(), pdfimage); |
| 2369 } | 2369 } |
| 2370 SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), | 2370 SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), |
| 2371 &content.entry()->fContent); | 2371 &content.entry()->fContent); |
| 2372 } | 2372 } |
| OLD | NEW |