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

Side by Side Diff: experimental/PdfViewer/SkPdfRenderer.cpp

Issue 22460004: pdfviewer: /Pattern color space, uses the matrix of the last content stream, not the global matrix. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 4 months 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 | Annotate | Revision Log
« no previous file with comments | « experimental/PdfViewer/SkPdfBasics.h ('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 /* 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 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 } 229 }
230 #endif // PDF_TRACE_DIFF_IN_PNG 230 #endif // PDF_TRACE_DIFF_IN_PNG
231 231
232 232
233 233
234 // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrum entation. 234 // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrum entation.
235 static bool readToken(SkPdfNativeTokenizer* fTokenizer, PdfToken* token) { 235 static bool readToken(SkPdfNativeTokenizer* fTokenizer, PdfToken* token) {
236 bool ret = fTokenizer->readToken(token); 236 bool ret = fTokenizer->readToken(token);
237 237
238 gReadOp++; 238 gReadOp++;
239 239 gLastOpKeyword++;
240 #ifdef PDF_TRACE_DIFF_IN_PNG 240 #ifdef PDF_TRACE_DIFF_IN_PNG
241 // TODO(edisonn): compare with old bitmap, and save only new bits are availa ble, and save 241 // TODO(edisonn): compare with old bitmap, and save only new bits are availa ble, and save
242 // the numbar and name of last operation, so the file name will reflect op t hat changed. 242 // the numbar and name of last operation, so the file name will reflect op t hat changed.
243 if (hasVisualEffect(gLastKeyword)) { // TODO(edisonn): and has dirty bits. 243 if (gLastKeyword[0] && hasVisualEffect(gLastKeyword)) { // TODO(edisonn): a nd has dirty bits.
244 gDumpCanvas->flush(); 244 gDumpCanvas->flush();
245 245
246 SkBitmap bitmap; 246 SkBitmap bitmap;
247 setup_bitmap(&bitmap, gDumpBitmap->width(), gDumpBitmap->height()); 247 setup_bitmap(&bitmap, gDumpBitmap->width(), gDumpBitmap->height());
248 248
249 memcpy(bitmap.getPixels(), gDumpBitmap->getPixels(), gDumpBitmap->getSiz e()); 249 memcpy(bitmap.getPixels(), gDumpBitmap->getPixels(), gDumpBitmap->getSiz e());
250 250
251 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap))); 251 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap)));
252 SkCanvas canvas(device); 252 SkCanvas canvas(device);
253 253
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 canvas.flush(); 304 canvas.flush();
305 305
306 SkString out; 306 SkString out;
307 307
308 // TODO(edisonn): get the image, and overlay on top of it, the clip , gr afic state, teh stack, 308 // TODO(edisonn): get the image, and overlay on top of it, the clip , gr afic state, teh stack,
309 // ... and other properties, to be able to debug th code easily 309 // ... and other properties, to be able to debug th code easily
310 310
311 out.appendf("/usr/local/google/home/edisonn/log_view2/step-%i-%s.png", g LastOpKeyword, gLastKeyword); 311 out.appendf("/usr/local/google/home/edisonn/log_view2/step-%i-%s.png", g LastOpKeyword, gLastKeyword);
312 SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::kPNG_Typ e, 100); 312 SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::kPNG_Typ e, 100);
313 } 313 }
314
315 if (ret && token->fType == kKeyword_TokenType && token->fKeyword && token->f KeywordLength > 0 && token->fKeywordLength < 100) {
316 strncpy(gLastKeyword, token->fKeyword, token->fKeywordLength);
317 gLastKeyword[token->fKeywordLength] = '\0';
318 } else {
319 gLastKeyword[0] = '\0';
320 }
321
314 #endif 322 #endif
315 323
316 return ret; 324 return ret;
317 } 325 }
318 326
319 327
320 328
321 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper* *); 329 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper* *);
322 330
323 SkTDict<PdfOperatorRenderer> gPdfOps(100); 331 SkTDict<PdfOperatorRenderer> gPdfOps(100);
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 if (skpdfimage == NULL) { 643 if (skpdfimage == NULL) {
636 return kIgnoreError_PdfResult; 644 return kIgnoreError_PdfResult;
637 } 645 }
638 646
639 SkBitmap* image = getImageFromObject(pdfContext, skpdfimage, false); 647 SkBitmap* image = getImageFromObject(pdfContext, skpdfimage, false);
640 SkBitmap* sMask = getSmaskFromObject(pdfContext, skpdfimage); 648 SkBitmap* sMask = getSmaskFromObject(pdfContext, skpdfimage);
641 649
642 canvas->save(); 650 canvas->save();
643 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 651 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
644 652
645 #if 1
646 SkScalar z = SkIntToScalar(0); 653 SkScalar z = SkIntToScalar(0);
647 SkScalar one = SkIntToScalar(1); 654 SkScalar one = SkIntToScalar(1);
648 655
649 SkPoint from[4] = {SkPoint::Make(z, z), SkPoint::Make(one, z), SkPoint::Make (one, one), SkPoint::Make(z, one)}; 656 SkPoint from[4] = {SkPoint::Make(z, z), SkPoint::Make(one, z), SkPoint::Make (one, one), SkPoint::Make(z, one)};
650 SkPoint to[4] = {SkPoint::Make(z, one), SkPoint::Make(one, one), SkPoint::Ma ke(one, z), SkPoint::Make(z, z)}; 657 SkPoint to[4] = {SkPoint::Make(z, one), SkPoint::Make(one, one), SkPoint::Ma ke(one, z), SkPoint::Make(z, z)};
651 SkMatrix flip; 658 SkMatrix flip;
652 SkAssertResult(flip.setPolyToPoly(from, to, 4)); 659 SkAssertResult(flip.setPolyToPoly(from, to, 4));
653 SkMatrix solveImageFlip = pdfContext->fGraphicsState.fCTM; 660 SkMatrix solveImageFlip = pdfContext->fGraphicsState.fCTM;
654 solveImageFlip.preConcat(flip); 661 solveImageFlip.preConcat(flip);
655 canvas->setMatrix(solveImageFlip); 662 canvas->setMatrix(solveImageFlip);
656 #endif 663
664 #ifdef PDF_TRACE
665 SkPoint final[4] = {SkPoint::Make(z, z), SkPoint::Make(one, z), SkPoint::Mak e(one, one), SkPoint::Make(z, one)};
666 solveImageFlip.mapPoints(final, 4);
667 printf("IMAGE rect = ");
668 for (int i = 0; i < 4; i++) {
669 printf("(%f %f) ", SkScalarToDouble(final[i].x()), SkScalarToDouble(fina l[i].y()));
670 }
671 printf("\n");
672 #endif // PDF_TRACE
657 673
658 SkRect dst = SkRect::MakeXYWH(SkDoubleToScalar(0.0), SkDoubleToScalar(0.0), SkDoubleToScalar(1.0), SkDoubleToScalar(1.0)); 674 SkRect dst = SkRect::MakeXYWH(SkDoubleToScalar(0.0), SkDoubleToScalar(0.0), SkDoubleToScalar(1.0), SkDoubleToScalar(1.0));
659 675
660 // TODO(edisonn): soft mask type? alpha/luminosity. 676 // TODO(edisonn): soft mask type? alpha/luminosity.
661 SkPaint paint; 677 SkPaint paint;
662 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); 678 pdfContext->fGraphicsState.applyGraphicsState(&paint, false);
663 679
664 if (!sMask || sMask->empty()) { 680 if (!sMask || sMask->empty()) {
665 canvas->drawBitmapRect(*image, dst, &paint); 681 canvas->drawBitmapRect(*image, dst, &paint);
666 } else { 682 } else {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); 755 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix");
740 756
741 if (skobj->has_Matrix()) { 757 if (skobj->has_Matrix()) {
742 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf Doc)); 758 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf Doc));
743 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM; 759 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM;
744 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM; 760 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM;
745 // TODO(edisonn) reset matrixTm and matricTlm also? 761 // TODO(edisonn) reset matrixTm and matricTlm also?
746 } 762 }
747 763
748 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix"); 764 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix");
765 pdfContext->fGraphicsState.fContentStreamMatrix = pdfContext->fGraphicsState .fCTM;
749 766
750 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 767 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
751 768
752 SkRect bbox = skobj->BBox(pdfContext->fPdfDoc); 769 SkRect bbox = skobj->BBox(pdfContext->fPdfDoc);
753 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings. 770 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
754 771
755 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke nize it as we go. 772 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke nize it as we go.
756 // For this PdfContentsTokenizer needs to be extended. 773 // For this PdfContentsTokenizer needs to be extended.
757 774
758 // This is a group? 775 // This is a group?
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 813
797 PdfOp_q(pdfContext, canvas, NULL); 814 PdfOp_q(pdfContext, canvas, NULL);
798 815
799 canvas->save(); 816 canvas->save();
800 817
801 818
802 if (skobj->Resources(pdfContext->fPdfDoc)) { 819 if (skobj->Resources(pdfContext->fPdfDoc)) {
803 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc); 820 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc);
804 } 821 }
805 822
806 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); 823 SkTraceMatrix(pdfContext->fGraphicsState.fContentStreamMatrix, "Current Cont ent stream matrix");
807 824
808 if (skobj->has_Matrix()) { 825 if (skobj->has_Matrix()) {
809 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf Doc)); 826 pdfContext->fGraphicsState.fContentStreamMatrix.preConcat(skobj->Matrix( pdfContext->fPdfDoc));
810 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM;
811 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM;
812 // TODO(edisonn) reset matrixTm and matricTlm also?
813 } 827 }
814 828
815 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix"); 829 SkTraceMatrix(pdfContext->fGraphicsState.fContentStreamMatrix, "Total Conten t stream matrix");
816 830
817 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 831 canvas->setMatrix(pdfContext->fGraphicsState.fContentStreamMatrix);
832 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fContentStreamM atrix;
818 833
819 SkRect bbox = skobj->BBox(pdfContext->fPdfDoc); 834 SkRect bbox = skobj->BBox(pdfContext->fPdfDoc);
820 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings. 835 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
821 836
822 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke nize it as we go. 837 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke nize it as we go.
823 // For this PdfContentsTokenizer needs to be extended. 838 // For this PdfContentsTokenizer needs to be extended.
824 839
825 SkPdfStream* stream = (SkPdfStream*)skobj; 840 SkPdfStream* stream = (SkPdfStream*)skobj;
826 841
827 SkPdfNativeTokenizer* tokenizer = 842 SkPdfNativeTokenizer* tokenizer =
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 y = bounds.top(); 1331 y = bounds.top();
1317 int totalx = 0; 1332 int totalx = 0;
1318 int totaly = 0; 1333 int totaly = 0;
1319 while (y < bounds.bottom()) { 1334 while (y < bounds.bottom()) {
1320 x = bounds.left(); 1335 x = bounds.left();
1321 totalx = 0; 1336 totalx = 0;
1322 1337
1323 while (x < bounds.right()) { 1338 while (x < bounds.right()) {
1324 doXObject(pdfContext, canvas, pattern); 1339 doXObject(pdfContext, canvas, pattern);
1325 1340
1326 pdfContext->fGraphicsState.fCTM.preTranslate(SkI ntToScalar(xStep), SkIntToScalar(0)); 1341 pdfContext->fGraphicsState.fContentStreamMatrix. preTranslate(SkIntToScalar(xStep), SkIntToScalar(0));
1327 totalx += xStep; 1342 totalx += xStep;
1328 x += SkIntToScalar(xStep); 1343 x += SkIntToScalar(xStep);
1329 } 1344 }
1330 pdfContext->fGraphicsState.fCTM.preTranslate(SkIntTo Scalar(-totalx), SkIntToScalar(0)); 1345 pdfContext->fGraphicsState.fContentStreamMatrix.preT ranslate(SkIntToScalar(-totalx), SkIntToScalar(0));
1331 1346
1332 pdfContext->fGraphicsState.fCTM.preTranslate(SkIntTo Scalar(0), SkIntToScalar(-yStep)); 1347 pdfContext->fGraphicsState.fContentStreamMatrix.preT ranslate(SkIntToScalar(0), SkIntToScalar(-yStep));
1333 totaly += yStep; 1348 totaly += yStep;
1334 y += SkIntToScalar(yStep); 1349 y += SkIntToScalar(yStep);
1335 } 1350 }
1336 pdfContext->fGraphicsState.fCTM.preTranslate(SkIntToScal ar(0), SkIntToScalar(totaly)); 1351 pdfContext->fGraphicsState.fContentStreamMatrix.preTrans late(SkIntToScalar(0), SkIntToScalar(totaly));
1337 } 1352 }
1338 } 1353 }
1339 1354
1340 // apply matrix 1355 // apply matrix
1341 // get xstep, y step, bbox ... for cliping, and bos of the path 1356 // get xstep, y step, bbox ... for cliping, and bos of the path
1342 1357
1343 PdfOp_Q(pdfContext, canvas, NULL); 1358 PdfOp_Q(pdfContext, canvas, NULL);
1344 canvas->restore(); 1359 canvas->restore();
1345 } else { 1360 } else {
1346 paint.setStyle(SkPaint::kFill_Style); 1361 paint.setStyle(SkPaint::kFill_Style);
(...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after
2527 2542
2528 //SkPoint pdfSpace[2] = {SkPoint::Make(z, z), SkPoint::Make(z, h)}; 2543 //SkPoint pdfSpace[2] = {SkPoint::Make(z, z), SkPoint::Make(z, h)};
2529 //SkPoint skiaSpace[2] = {SkPoint::Make(z, h), SkPoint::Make(z, z)}; 2544 //SkPoint skiaSpace[2] = {SkPoint::Make(z, h), SkPoint::Make(z, z)};
2530 2545
2531 //SkPoint pdfSpace[3] = {SkPoint::Make(z, z), SkPoint::Make(z, h), SkPoint:: Make(w, h)}; 2546 //SkPoint pdfSpace[3] = {SkPoint::Make(z, z), SkPoint::Make(z, h), SkPoint:: Make(w, h)};
2532 //SkPoint skiaSpace[3] = {SkPoint::Make(z, h), SkPoint::Make(z, z), SkPoint: :Make(w, 0)}; 2547 //SkPoint skiaSpace[3] = {SkPoint::Make(z, h), SkPoint::Make(z, z), SkPoint: :Make(w, 0)};
2533 2548
2534 SkAssertResult(pdfContext.fOriginalMatrix.setPolyToPoly(pdfSpace, skiaSpace, 4)); 2549 SkAssertResult(pdfContext.fOriginalMatrix.setPolyToPoly(pdfSpace, skiaSpace, 4));
2535 SkTraceMatrix(pdfContext.fOriginalMatrix, "Original matrix"); 2550 SkTraceMatrix(pdfContext.fOriginalMatrix, "Original matrix");
2536 2551
2537
2538 pdfContext.fGraphicsState.fCTM = pdfContext.fOriginalMatrix; 2552 pdfContext.fGraphicsState.fCTM = pdfContext.fOriginalMatrix;
2553 pdfContext.fGraphicsState.fContentStreamMatrix = pdfContext.fOriginalMatrix;
2539 pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fCTM; 2554 pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fCTM;
2540 pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fCTM; 2555 pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fCTM;
2541 2556
2542 #ifndef PDF_DEBUG_NO_PAGE_CLIPING 2557 #ifndef PDF_DEBUG_NO_PAGE_CLIPING
2543 canvas->clipRect(dst, SkRegion::kIntersect_Op, true); 2558 canvas->clipRect(dst, SkRegion::kIntersect_Op, true);
2544 #endif 2559 #endif
2545 2560
2546 canvas->setMatrix(pdfContext.fOriginalMatrix); 2561 canvas->setMatrix(pdfContext.fOriginalMatrix);
2547 2562
2548 doPage(&pdfContext, canvas, fPdfDoc->page(page)); 2563 doPage(&pdfContext, canvas, fPdfDoc->page(page));
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2621 2636
2622 rect = SkRect::MakeWH(width, height); 2637 rect = SkRect::MakeWH(width, height);
2623 2638
2624 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght)); 2639 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght));
2625 2640
2626 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); 2641 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output)));
2627 SkCanvas canvas(device); 2642 SkCanvas canvas(device);
2628 2643
2629 return renderer.renderPage(page, &canvas, rect); 2644 return renderer.renderPage(page, &canvas, rect);
2630 } 2645 }
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfBasics.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698