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 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 if (!skobj || !skobj->hasStream()) { | 718 if (!skobj || !skobj->hasStream()) { |
719 return kIgnoreError_PdfResult; | 719 return kIgnoreError_PdfResult; |
720 } | 720 } |
721 | 721 |
722 if (!skobj->has_BBox()) { | 722 if (!skobj->has_BBox()) { |
723 return kIgnoreError_PdfResult; | 723 return kIgnoreError_PdfResult; |
724 } | 724 } |
725 | 725 |
726 PdfOp_q(pdfContext, canvas, NULL); | 726 PdfOp_q(pdfContext, canvas, NULL); |
727 | 727 |
728 canvas->save(); | |
729 | |
730 | 728 |
731 if (skobj->Resources(pdfContext->fPdfDoc)) { | 729 if (skobj->Resources(pdfContext->fPdfDoc)) { |
732 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd
fDoc); | 730 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd
fDoc); |
733 } | 731 } |
734 | 732 |
735 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); | 733 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); |
736 | 734 |
737 if (skobj->has_Matrix()) { | 735 if (skobj->has_Matrix()) { |
738 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf
Doc)); | 736 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf
Doc)); |
739 SkMatrix matrix = pdfContext->fGraphicsState.fCTM; | 737 SkMatrix matrix = pdfContext->fGraphicsState.fCTM; |
(...skipping 30 matching lines...) Expand all Loading... |
770 delete tokenizer; | 768 delete tokenizer; |
771 } | 769 } |
772 | 770 |
773 // TODO(edisonn): should we restore the variable stack at the same state? | 771 // TODO(edisonn): should we restore the variable stack at the same state? |
774 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 772 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
775 | 773 |
776 if (skobj->has_Group()) { | 774 if (skobj->has_Group()) { |
777 canvas->restore(); | 775 canvas->restore(); |
778 } | 776 } |
779 | 777 |
780 canvas->restore(); | |
781 PdfOp_Q(pdfContext, canvas, NULL); | 778 PdfOp_Q(pdfContext, canvas, NULL); |
782 return kPartial_PdfResult; | 779 return kPartial_PdfResult; |
783 } | 780 } |
784 | 781 |
785 | 782 |
786 // TODO(edisonn): Extract a class like ObjWithStream | 783 // TODO(edisonn): Extract a class like ObjWithStream |
787 static PdfResult doXObject_Pattern(PdfContext* pdfContext, SkCanvas* canvas, SkP
dfType1PatternDictionary* skobj) { | 784 static PdfResult doXObject_Pattern(PdfContext* pdfContext, SkCanvas* canvas, SkP
dfType1PatternDictionary* skobj) { |
788 if (!skobj || !skobj->hasStream()) { | 785 if (!skobj || !skobj->hasStream()) { |
789 return kIgnoreError_PdfResult; | 786 return kIgnoreError_PdfResult; |
790 } | 787 } |
791 | 788 |
792 if (!skobj->has_BBox()) { | 789 if (!skobj->has_BBox()) { |
793 return kIgnoreError_PdfResult; | 790 return kIgnoreError_PdfResult; |
794 } | 791 } |
795 | 792 |
796 PdfOp_q(pdfContext, canvas, NULL); | 793 PdfOp_q(pdfContext, canvas, NULL); |
797 | 794 |
798 canvas->save(); | |
799 | |
800 | 795 |
801 if (skobj->Resources(pdfContext->fPdfDoc)) { | 796 if (skobj->Resources(pdfContext->fPdfDoc)) { |
802 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd
fDoc); | 797 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd
fDoc); |
803 } | 798 } |
804 | 799 |
805 SkTraceMatrix(pdfContext->fGraphicsState.fContentStreamMatrix, "Current Cont
ent stream matrix"); | 800 SkTraceMatrix(pdfContext->fGraphicsState.fContentStreamMatrix, "Current Cont
ent stream matrix"); |
806 | 801 |
807 if (skobj->has_Matrix()) { | 802 if (skobj->has_Matrix()) { |
808 pdfContext->fGraphicsState.fContentStreamMatrix.preConcat(skobj->Matrix(
pdfContext->fPdfDoc)); | 803 pdfContext->fGraphicsState.fContentStreamMatrix.preConcat(skobj->Matrix(
pdfContext->fPdfDoc)); |
809 } | 804 } |
(...skipping 15 matching lines...) Expand all Loading... |
825 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA
llocator); | 820 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA
llocator); |
826 if (tokenizer != NULL) { | 821 if (tokenizer != NULL) { |
827 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); | 822 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); |
828 looper.loop(); | 823 looper.loop(); |
829 delete tokenizer; | 824 delete tokenizer; |
830 } | 825 } |
831 | 826 |
832 // TODO(edisonn): should we restore the variable stack at the same state? | 827 // TODO(edisonn): should we restore the variable stack at the same state? |
833 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 828 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
834 | 829 |
835 canvas->restore(); | |
836 PdfOp_Q(pdfContext, canvas, NULL); | 830 PdfOp_Q(pdfContext, canvas, NULL); |
837 return kPartial_PdfResult; | 831 return kPartial_PdfResult; |
838 } | 832 } |
839 | 833 |
840 | 834 |
841 //static PdfResult doXObject_PS(PdfContext* pdfContext, SkCanvas* canvas, const
SkPdfObject* obj) { | 835 //static PdfResult doXObject_PS(PdfContext* pdfContext, SkCanvas* canvas, const
SkPdfObject* obj) { |
842 // return kNYI_PdfResult; | 836 // return kNYI_PdfResult; |
843 //} | 837 //} |
844 | 838 |
845 PdfResult doType3Char(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObjec
t* skobj, SkRect bBox, SkMatrix matrix, double textSize) { | 839 PdfResult doType3Char(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObjec
t* skobj, SkRect bBox, SkMatrix matrix, double textSize) { |
846 if (!skobj || !skobj->hasStream()) { | 840 if (!skobj || !skobj->hasStream()) { |
847 return kIgnoreError_PdfResult; | 841 return kIgnoreError_PdfResult; |
848 } | 842 } |
849 | 843 |
850 PdfOp_q(pdfContext, canvas, NULL); | 844 PdfOp_q(pdfContext, canvas, NULL); |
851 canvas->save(); | |
852 | 845 |
853 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); | 846 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); |
854 pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), Sk
DoubleToScalar(textSize)); | 847 pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), Sk
DoubleToScalar(textSize)); |
855 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrixTm
; | 848 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrixTm
; |
856 | 849 |
857 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm; | 850 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm; |
858 pdfContext->fGraphicsState.fCTM.preScale(SkDoubleToScalar(1), SkDoubleToScal
ar(-1)); | 851 pdfContext->fGraphicsState.fCTM.preScale(SkDoubleToScalar(1), SkDoubleToScal
ar(-1)); |
859 | 852 |
860 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix"); | 853 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix"); |
861 | 854 |
(...skipping 14 matching lines...) Expand all Loading... |
876 SkPdfNativeTokenizer* tokenizer = | 869 SkPdfNativeTokenizer* tokenizer = |
877 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA
llocator); | 870 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA
llocator); |
878 if (tokenizer != NULL) { | 871 if (tokenizer != NULL) { |
879 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); | 872 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); |
880 looper.loop(); | 873 looper.loop(); |
881 delete tokenizer; | 874 delete tokenizer; |
882 } | 875 } |
883 | 876 |
884 // TODO(edisonn): should we restore the variable stack at the same state? | 877 // TODO(edisonn): should we restore the variable stack at the same state? |
885 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 878 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
886 canvas->restore(); | |
887 PdfOp_Q(pdfContext, canvas, NULL); | 879 PdfOp_Q(pdfContext, canvas, NULL); |
888 | 880 |
889 return kPartial_PdfResult; | 881 return kPartial_PdfResult; |
890 } | 882 } |
891 | 883 |
892 | 884 |
893 // TODO(edisonn): make sure the pointer is unique | 885 // TODO(edisonn): make sure the pointer is unique |
894 std::set<const SkPdfObject*> gInRendering; | 886 std::set<const SkPdfObject*> gInRendering; |
895 | 887 |
896 class CheckRecursiveRendering { | 888 class CheckRecursiveRendering { |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 | 1269 |
1278 canvas->drawPath(path, paint); | 1270 canvas->drawPath(path, paint); |
1279 } else { | 1271 } else { |
1280 if (fill) { | 1272 if (fill) { |
1281 if (strncmp((char*)pdfContext->fGraphicsState.fNonStroking.fColorSpa
ce.fBuffer, "Pattern", strlen("Pattern")) == 0 && | 1273 if (strncmp((char*)pdfContext->fGraphicsState.fNonStroking.fColorSpa
ce.fBuffer, "Pattern", strlen("Pattern")) == 0 && |
1282 pdfContext->fGraphicsState.fNonStroking.fPattern != NULL) { | 1274 pdfContext->fGraphicsState.fNonStroking.fPattern != NULL) { |
1283 | 1275 |
1284 // TODO(edisonn): we can use a shader here, like imageshader to
draw fast. ultimately, | 1276 // TODO(edisonn): we can use a shader here, like imageshader to
draw fast. ultimately, |
1285 // if this is not possible, and we are in rasper mode, and the c
ells don't intersect, we could even have multiple cpus. | 1277 // if this is not possible, and we are in rasper mode, and the c
ells don't intersect, we could even have multiple cpus. |
1286 | 1278 |
1287 canvas->save(); | |
1288 PdfOp_q(pdfContext, canvas, NULL); | 1279 PdfOp_q(pdfContext, canvas, NULL); |
1289 | 1280 |
1290 if (evenOdd) { | 1281 if (evenOdd) { |
1291 path.setFillType(SkPath::kEvenOdd_FillType); | 1282 path.setFillType(SkPath::kEvenOdd_FillType); |
1292 } | 1283 } |
1293 canvas->clipPath(path); | 1284 canvas->clipPath(path); |
1294 | 1285 |
1295 if (pdfContext->fPdfDoc->mapper()->mapType1PatternDictionary(pdf
Context->fGraphicsState.fNonStroking.fPattern) != kNone_SkPdfObjectType) { | 1286 if (pdfContext->fPdfDoc->mapper()->mapType1PatternDictionary(pdf
Context->fGraphicsState.fNonStroking.fPattern) != kNone_SkPdfObjectType) { |
1296 SkPdfType1PatternDictionary* pattern = (SkPdfType1PatternDic
tionary*)pdfContext->fGraphicsState.fNonStroking.fPattern; | 1287 SkPdfType1PatternDictionary* pattern = (SkPdfType1PatternDic
tionary*)pdfContext->fGraphicsState.fNonStroking.fPattern; |
1297 | 1288 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 y += SkIntToScalar(yStep); | 1324 y += SkIntToScalar(yStep); |
1334 } | 1325 } |
1335 pdfContext->fGraphicsState.fContentStreamMatrix.preTrans
late(SkIntToScalar(0), SkIntToScalar(totaly)); | 1326 pdfContext->fGraphicsState.fContentStreamMatrix.preTrans
late(SkIntToScalar(0), SkIntToScalar(totaly)); |
1336 } | 1327 } |
1337 } | 1328 } |
1338 | 1329 |
1339 // apply matrix | 1330 // apply matrix |
1340 // get xstep, y step, bbox ... for cliping, and bos of the path | 1331 // get xstep, y step, bbox ... for cliping, and bos of the path |
1341 | 1332 |
1342 PdfOp_Q(pdfContext, canvas, NULL); | 1333 PdfOp_Q(pdfContext, canvas, NULL); |
1343 canvas->restore(); | |
1344 } else { | 1334 } else { |
1345 paint.setStyle(SkPaint::kFill_Style); | 1335 paint.setStyle(SkPaint::kFill_Style); |
1346 if (evenOdd) { | 1336 if (evenOdd) { |
1347 path.setFillType(SkPath::kEvenOdd_FillType); | 1337 path.setFillType(SkPath::kEvenOdd_FillType); |
1348 } | 1338 } |
1349 | 1339 |
1350 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); | 1340 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); |
1351 | 1341 |
1352 canvas->drawPath(path, paint); | 1342 canvas->drawPath(path, paint); |
1353 } | 1343 } |
(...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2663 | 2653 |
2664 rect = SkRect::MakeWH(width, height); | 2654 rect = SkRect::MakeWH(width, height); |
2665 | 2655 |
2666 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); | 2656 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); |
2667 | 2657 |
2668 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); | 2658 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); |
2669 SkCanvas canvas(device); | 2659 SkCanvas canvas(device); |
2670 | 2660 |
2671 return renderer.renderPage(page, &canvas, rect); | 2661 return renderer.renderPage(page, &canvas, rect); |
2672 } | 2662 } |
OLD | NEW |