OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkDevice.h" | 9 #include "SkDevice.h" |
10 #include "SkForceLinking.h" | 10 #include "SkForceLinking.h" |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 // CON: multiple drawings (but on smaller areas), pay a price at loading pdf
to compute a pdf draw plan | 643 // CON: multiple drawings (but on smaller areas), pay a price at loading pdf
to compute a pdf draw plan |
644 // on average, a load with empty draw is 100ms on all the skps we have,
for complete sites | 644 // on average, a load with empty draw is 100ms on all the skps we have,
for complete sites |
645 // 3) support them natively in SkCanvas | 645 // 3) support them natively in SkCanvas |
646 // PRO: simple | 646 // PRO: simple |
647 // CON: we would still need to use a form of readPixels anyway, so perf migh
t be the same as 1) | 647 // CON: we would still need to use a form of readPixels anyway, so perf migh
t be the same as 1) |
648 // 4) compile a plan using pathops, and render once without any fancy rules with
backdrop | 648 // 4) compile a plan using pathops, and render once without any fancy rules with
backdrop |
649 // PRO: simple, fast | 649 // PRO: simple, fast |
650 // CON: pathops must be bug free first + time to compute new paths | 650 // CON: pathops must be bug free first + time to compute new paths |
651 // pay a price at loading pdf to compute a pdf draw plan | 651 // pay a price at loading pdf to compute a pdf draw plan |
652 // on average, a load with empty draw is 100ms on all the skps we have,
for complete sites | 652 // on average, a load with empty draw is 100ms on all the skps we have,
for complete sites |
| 653 // 5) for knockout, render the objects in reverse order, and add every object to
the clip, and any new draw will be cliped |
653 | 654 |
654 | 655 |
655 // TODO(edisonn): draw plan from point! - list of draw ops of a point, like a tr
ee! | 656 // TODO(edisonn): draw plan from point! - list of draw ops of a point, like a tr
ee! |
656 // TODO(edisonn): Minimal PDF to draw some points - remove everything that it is
not needed, save pdf uncompressed | 657 // TODO(edisonn): Minimal PDF to draw some points - remove everything that it is
not needed, save pdf uncompressed |
657 | 658 |
658 | 659 |
659 | 660 |
660 static void doGroup_before(PdfContext* pdfContext, SkCanvas* canvas, SkRect bbox
, SkPdfTransparencyGroupDictionary* tgroup, bool page) { | 661 static void doGroup_before(PdfContext* pdfContext, SkCanvas* canvas, SkRect bbox
, SkPdfTransparencyGroupDictionary* tgroup, bool page) { |
661 SkRect bboxOrig = bbox; | 662 SkRect bboxOrig = bbox; |
662 SkBitmap backdrop; | 663 SkBitmap backdrop; |
663 bool isolatedGroup = tgroup->I(pdfContext->fPdfDoc); | 664 bool isolatedGroup = tgroup->I(pdfContext->fPdfDoc); |
664 // bool knockoutGroup = tgroup->K(pdfContext->fPdfDoc); | 665 // bool knockoutGroup = tgroup->K(pdfContext->fPdfDoc); |
665 bool hasPixels = false; | |
666 if (!isolatedGroup) { | |
667 // TODO(edisonn): if the rect is not mapable, the operation could be exp
ensive, e.g. | |
668 // a diagonal long but small rect would require to save all the page | |
669 SkMatrix inverse; | |
670 if (pdfContext->fGraphicsState.fCTM.mapRect(&bbox) && | |
671 canvas->getTotalMatrix().invert(&inverse) && | |
672 inverse.mapRect(&bbox)) { | |
673 SkIRect area = SkIRect::MakeLTRB(SkScalarTruncToInt(bbox.left()), | |
674 SkScalarTruncToInt(bbox.top()), | |
675 SkScalarTruncToInt(bbox.right()) +
2, | |
676 SkScalarTruncToInt(bbox.bottom()) +
2); | |
677 SkBitmap dummy; | |
678 if (canvas->readPixels(area, &dummy)) { | |
679 hasPixels = true; | |
680 } | |
681 } | |
682 } | |
683 SkPaint paint; | 666 SkPaint paint; |
684 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); | 667 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); |
685 canvas->saveLayer(&bboxOrig, isolatedGroup ? &paint : NULL); | 668 canvas->saveLayer(&bboxOrig, isolatedGroup ? &paint : NULL); |
686 | |
687 if (hasPixels) { | |
688 canvas->drawBitmapRect(backdrop, bboxOrig, NULL); | |
689 } | |
690 } | 669 } |
691 | 670 |
| 671 // TODO(edisonn): non isolation implemented in skia |
692 //static void doGroup_after(PdfContext* pdfContext, SkCanvas* canvas, SkRect bbo
x, SkPdfTransparencyGroupDictionary* tgroup) { | 672 //static void doGroup_after(PdfContext* pdfContext, SkCanvas* canvas, SkRect bbo
x, SkPdfTransparencyGroupDictionary* tgroup) { |
| 673 // if not isolated |
| 674 // canvas->drawBitmapRect(backdrop, bboxOrig, NULL); |
693 //} | 675 //} |
694 | 676 |
695 static PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfT
ype1FormDictionary* skobj) { | 677 static PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfT
ype1FormDictionary* skobj) { |
696 if (!skobj || !skobj->hasStream()) { | 678 if (!skobj || !skobj->hasStream()) { |
697 return kIgnoreError_PdfResult; | 679 return kIgnoreError_PdfResult; |
698 } | 680 } |
699 | 681 |
700 if (!skobj->has_BBox()) { | 682 if (!skobj->has_BBox()) { |
701 return kIgnoreError_PdfResult; | 683 return kIgnoreError_PdfResult; |
702 } | 684 } |
703 | 685 |
704 PdfOp_q(pdfContext, canvas, NULL); | 686 PdfOp_q(pdfContext, canvas, NULL); |
705 | 687 |
706 | |
707 | |
708 canvas->save(); | 688 canvas->save(); |
709 | 689 |
710 | 690 |
711 if (skobj->Resources(pdfContext->fPdfDoc)) { | 691 if (skobj->Resources(pdfContext->fPdfDoc)) { |
712 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd
fDoc); | 692 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd
fDoc); |
713 } | 693 } |
714 | 694 |
715 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); | 695 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); |
716 | 696 |
717 if (skobj->has_Matrix()) { | 697 if (skobj->has_Matrix()) { |
(...skipping 1745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 | 2443 |
2464 rect = SkRect::MakeWH(width, height); | 2444 rect = SkRect::MakeWH(width, height); |
2465 | 2445 |
2466 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); | 2446 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); |
2467 | 2447 |
2468 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); | 2448 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); |
2469 SkCanvas canvas(device); | 2449 SkCanvas canvas(device); |
2470 | 2450 |
2471 return renderer.renderPage(page, &canvas, rect); | 2451 return renderer.renderPage(page, &canvas, rect); |
2472 } | 2452 } |
OLD | NEW |