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

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

Issue 22407005: pdfviewer: fix font rotation issues (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
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 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 } 383 }
384 384
385 // if (fCurFont && fCurFont->GetFontScale() != 0) { 385 // if (fCurFont && fCurFont->GetFontScale() != 0) {
386 // paint.setTextScaleX(SkFloatToScalar(fCurFont->GetFontScale() / 100.0)) ; 386 // paint.setTextScaleX(SkFloatToScalar(fCurFont->GetFontScale() / 100.0)) ;
387 // } 387 // }
388 388
389 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); 389 pdfContext->fGraphicsState.applyGraphicsState(&paint, false);
390 390
391 canvas->save(); 391 canvas->save();
392 392
393 #if 1
394 SkMatrix matrix = pdfContext->fGraphicsState.fMatrixTm;
395
396 SkPoint point1;
397 pdfContext->fGraphicsState.fMatrixTm.mapXY(SkIntToScalar(0), SkIntToScalar(0 ), &point1);
398
399 SkMatrix mirror;
400 mirror.setTranslate(0, -point1.y());
401 // TODO(edisonn): fix rotated text, and skewed too
402 mirror.postScale(SK_Scalar1, -SK_Scalar1);
403 // TODO(edisonn): post rotate, skew
404 mirror.postTranslate(0, point1.y());
405
406 matrix.postConcat(mirror);
407
408 canvas->setMatrix(matrix);
409
410 SkTraceMatrix(matrix, "mirrored");
411 #endif
412
413 skfont->drawText(decoded, &paint, pdfContext, canvas); 393 skfont->drawText(decoded, &paint, pdfContext, canvas);
414 canvas->restore(); 394 canvas->restore();
415 395
416 return kOK_PdfResult; 396 return kOK_PdfResult;
417 } 397 }
418 398
419 // TODO(edisonn): create header files with declarations! 399 // TODO(edisonn): create header files with declarations!
420 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per); 400 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per);
421 PdfResult PdfOp_Q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per); 401 PdfResult PdfOp_Q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per);
422 PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo oper); 402 PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo oper);
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 729
750 730
751 if (skobj->Resources(pdfContext->fPdfDoc)) { 731 if (skobj->Resources(pdfContext->fPdfDoc)) {
752 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc); 732 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc);
753 } 733 }
754 734
755 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); 735 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix");
756 736
757 if (skobj->has_Matrix()) { 737 if (skobj->has_Matrix()) {
758 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf Doc)); 738 pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdf Doc));
759 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM; 739 SkMatrix matrix = pdfContext->fGraphicsState.fCTM;
760 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM; 740 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1));
741 pdfContext->fGraphicsState.fMatrixTm = matrix;
742 pdfContext->fGraphicsState.fMatrixTlm = matrix;
761 // TODO(edisonn) reset matrixTm and matricTlm also? 743 // TODO(edisonn) reset matrixTm and matricTlm also?
762 } 744 }
763 745
764 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix"); 746 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix");
765 pdfContext->fGraphicsState.fContentStreamMatrix = pdfContext->fGraphicsState .fCTM; 747 pdfContext->fGraphicsState.fContentStreamMatrix = pdfContext->fGraphicsState .fCTM;
766 748
767 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 749 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
768 750
769 SkRect bbox = skobj->BBox(pdfContext->fPdfDoc); 751 SkRect bbox = skobj->BBox(pdfContext->fPdfDoc);
770 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings. 752 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 PdfResult doType3Char(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObjec t* skobj, SkRect bBox, SkMatrix matrix, double textSize) { 845 PdfResult doType3Char(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObjec t* skobj, SkRect bBox, SkMatrix matrix, double textSize) {
864 if (!skobj || !skobj->hasStream()) { 846 if (!skobj || !skobj->hasStream()) {
865 return kIgnoreError_PdfResult; 847 return kIgnoreError_PdfResult;
866 } 848 }
867 849
868 PdfOp_q(pdfContext, canvas, NULL); 850 PdfOp_q(pdfContext, canvas, NULL);
869 canvas->save(); 851 canvas->save();
870 852
871 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); 853 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
872 pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), Sk DoubleToScalar(textSize)); 854 pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), Sk DoubleToScalar(textSize));
855 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrixTm ;
873 856
874 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm; 857 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm;
875 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM; 858 pdfContext->fGraphicsState.fCTM.preScale(SkDoubleToScalar(1), SkDoubleToScal ar(-1));
876 859
877 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix"); 860 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix");
878 861
879 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 862 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
880 863
881 SkRect rm = bBox; 864 SkRect rm = bBox;
882 pdfContext->fGraphicsState.fCTM.mapRect(&rm); 865 pdfContext->fGraphicsState.fCTM.mapRect(&rm);
883 866
884 SkTraceRect(rm, "bbox mapped"); 867 SkTraceRect(rm, "bbox mapped");
885 868
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 1050
1068 static PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1051 static PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) {
1069 #ifdef PDF_TRACE 1052 #ifdef PDF_TRACE
1070 printf("stack size = %i\n", (int)pdfContext->fObjectStack.size()); 1053 printf("stack size = %i\n", (int)pdfContext->fObjectStack.size());
1071 #endif 1054 #endif
1072 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1055 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
1073 SkPdfObject* obj = pdfContext->fObjectStack.top(); 1056 SkPdfObject* obj = pdfContext->fObjectStack.top();
1074 obj = obj; 1057 obj = obj;
1075 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1058 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
1076 1059
1077 double array[6] = {1, 0, 0, 1, tx, ty}; 1060 double array[6] = {1, 0, 0, 1, tx, -ty};
1078 SkMatrix matrix = SkMatrixFromPdfMatrix(array); 1061 SkMatrix matrix = SkMatrixFromPdfMatrix(array);
1079 1062
1080 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); 1063 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
1081 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); 1064 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix);
1082 1065
1083 return kPartial_PdfResult; 1066 return kPartial_PdfResult;
1084 } 1067 }
1085 1068
1086 static PdfResult PdfOp_TD(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1069 static PdfResult PdfOp_TD(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) {
1087 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1070 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
(...skipping 30 matching lines...) Expand all
1118 double array[6]; 1101 double array[6];
1119 array[0] = a; 1102 array[0] = a;
1120 array[1] = b; 1103 array[1] = b;
1121 array[2] = c; 1104 array[2] = c;
1122 array[3] = d; 1105 array[3] = d;
1123 array[4] = e; 1106 array[4] = e;
1124 array[5] = f; 1107 array[5] = f;
1125 1108
1126 SkMatrix matrix = SkMatrixFromPdfMatrix(array); 1109 SkMatrix matrix = SkMatrixFromPdfMatrix(array);
1127 matrix.postConcat(pdfContext->fGraphicsState.fCTM); 1110 matrix.postConcat(pdfContext->fGraphicsState.fCTM);
1111 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1));
1128 1112
1129 // TODO(edisonn): Text positioning. 1113 // TODO(edisonn): Text positioning.
1130 pdfContext->fGraphicsState.fMatrixTm = matrix; 1114 pdfContext->fGraphicsState.fMatrixTm = matrix;
1131 pdfContext->fGraphicsState.fMatrixTlm = matrix;; 1115 pdfContext->fGraphicsState.fMatrixTlm = matrix;;
1132 1116
1133 return kPartial_PdfResult; 1117 return kPartial_PdfResult;
1134 } 1118 }
1135 1119
1136 //— T* Move to the start of the next line. This operator has the same effect as the code 1120 //— T* Move to the start of the next line. This operator has the same effect as the code
1137 //0 Tl Td 1121 //0 Tl Td
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 //pdfContext->fGraphicsState.fClipPath.reset(); 1436 //pdfContext->fGraphicsState.fClipPath.reset();
1453 pdfContext->fGraphicsState.fHasClipPathToApply = false; 1437 pdfContext->fGraphicsState.fHasClipPathToApply = false;
1454 1438
1455 pdfContext->fGraphicsState.fPathClosed = true; 1439 pdfContext->fGraphicsState.fPathClosed = true;
1456 1440
1457 return kOK_PdfResult; 1441 return kOK_PdfResult;
1458 } 1442 }
1459 1443
1460 static PdfResult PdfOp_BT(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1444 static PdfResult PdfOp_BT(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) {
1461 pdfContext->fGraphicsState.fTextBlock = true; 1445 pdfContext->fGraphicsState.fTextBlock = true;
1462 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM; 1446 SkMatrix matrix = pdfContext->fGraphicsState.fCTM;
1463 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM; 1447 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1));
1448 pdfContext->fGraphicsState.fMatrixTm = matrix;
1449 pdfContext->fGraphicsState.fMatrixTlm = matrix;
1464 1450
1465 return kPartial_PdfResult; 1451 return kPartial_PdfResult;
1466 } 1452 }
1467 1453
1468 static PdfResult PdfOp_ET(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1454 static PdfResult PdfOp_ET(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) {
1469 if (!pdfContext->fGraphicsState.fTextBlock) { 1455 if (!pdfContext->fGraphicsState.fTextBlock) {
1470 return kIgnoreError_PdfResult; 1456 return kIgnoreError_PdfResult;
1471 } 1457 }
1472 // TODO(edisonn): anything else to be done once we are done with draw text? Like restore stack? 1458 // TODO(edisonn): anything else to be done once we are done with draw text? Like restore stack?
1473 return kOK_PdfResult; 1459 return kOK_PdfResult;
(...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after
2636 2622
2637 rect = SkRect::MakeWH(width, height); 2623 rect = SkRect::MakeWH(width, height);
2638 2624
2639 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght)); 2625 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght));
2640 2626
2641 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); 2627 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output)));
2642 SkCanvas canvas(device); 2628 SkCanvas canvas(device);
2643 2629
2644 return renderer.renderPage(page, &canvas, rect); 2630 return renderer.renderPage(page, &canvas, rect);
2645 } 2631 }
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfFont.h ('k') | experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698