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

Unified Diff: experimental/PdfViewer/SkPdfRenderer.cpp

Issue 20810002: pdfviewer: (draft, not to be checked in, just for backup online) gs implementation (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « experimental/PdfViewer/SkPdfBasics.cpp ('k') | experimental/PdfViewer/pdfparser/native/SkPdfObject.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: experimental/PdfViewer/SkPdfRenderer.cpp
===================================================================
--- experimental/PdfViewer/SkPdfRenderer.cpp (revision 10357)
+++ experimental/PdfViewer/SkPdfRenderer.cpp (working copy)
@@ -598,7 +598,7 @@
SkBitmap sMask = getSmaskFromObject(pdfContext, skpdfimage);
canvas->save();
- canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
+ canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
#if 1
SkScalar z = SkIntToScalar(0);
@@ -608,7 +608,7 @@
SkPoint to[4] = {SkPoint::Make(z, one), SkPoint::Make(one, one), SkPoint::Make(one, z), SkPoint::Make(z, z)};
SkMatrix flip;
SkAssertResult(flip.setPolyToPoly(from, to, 4));
- SkMatrix solveImageFlip = pdfContext->fGraphicsState.fMatrix;
+ SkMatrix solveImageFlip = pdfContext->fGraphicsState.fCTM;
solveImageFlip.preConcat(flip);
canvas->setMatrix(solveImageFlip);
#endif
@@ -648,18 +648,18 @@
pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPdfDoc);
}
- SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Current matrix");
+ SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix");
if (skobj->has_Matrix()) {
- pdfContext->fGraphicsState.fMatrix.preConcat(skobj->Matrix(pdfContext->fPdfDoc));
- pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fMatrix;
- pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrix;
+ pdfContext->fGraphicsState.fCTM.preConcat(skobj->Matrix(pdfContext->fPdfDoc));
+ pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM;
+ pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM;
// TODO(edisonn) reset matrixTm and matricTlm also?
}
- SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Total matrix");
+ SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix");
- canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
+ canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
if (skobj->has_BBox()) {
canvas->clipRect(skobj->BBox(pdfContext->fPdfDoc), SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
@@ -700,15 +700,15 @@
pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), SkDoubleToScalar(textSize));
- pdfContext->fGraphicsState.fMatrix = pdfContext->fGraphicsState.fMatrixTm;
- pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrix;
+ pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm;
+ pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM;
- SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Total matrix");
+ SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Total matrix");
- canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
+ canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
SkRect rm = bBox;
- pdfContext->fGraphicsState.fMatrix.mapRect(&rm);
+ pdfContext->fGraphicsState.fCTM.mapRect(&rm);
SkTraceRect(rm, "bbox mapped");
@@ -810,7 +810,7 @@
// tx ty
SkMatrix matrix = SkMatrixFromPdfMatrix(array);
- pdfContext->fGraphicsState.fMatrix.preConcat(matrix);
+ pdfContext->fGraphicsState.fCTM.preConcat(matrix);
#ifdef PDF_TRACE
printf("cm ");
@@ -818,7 +818,7 @@
printf("%f ", array[i]);
}
printf("\n");
- SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "cm");
+ SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm");
#endif
return kOK_PdfResult;
@@ -889,7 +889,7 @@
array[5] = f;
SkMatrix matrix = SkMatrixFromPdfMatrix(array);
- matrix.postConcat(pdfContext->fGraphicsState.fMatrix);
+ matrix.postConcat(pdfContext->fGraphicsState.fCTM);
// TODO(edisonn): Text positioning.
pdfContext->fGraphicsState.fMatrixTm = matrix;
@@ -1044,7 +1044,7 @@
path.close();
}
- canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
+ canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
SkPaint paint;
@@ -1131,7 +1131,7 @@
}
static PdfResult PdfOp_n(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
- canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
+ canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
if (pdfContext->fGraphicsState.fHasClipPathToApply) {
#ifndef PDF_DEBUG_NO_CLIPING
canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kIntersect_Op, true);
@@ -1148,8 +1148,8 @@
static PdfResult PdfOp_BT(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
pdfContext->fGraphicsState.fTextBlock = true;
- pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fMatrix;
- pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrix;
+ pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fCTM;
+ pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fCTM;
return kPartial_PdfResult;
}
@@ -1162,15 +1162,7 @@
return kPartial_PdfResult;
}
-//font size Tf Set the text font, Tf
-//, to font and the text font size, Tfs, to size. font is the name of a
-//font resource in the Fontsubdictionary of the current resource dictionary; size is
-//a number representing a scale factor. There is no initial value for either font or
-//size; they must be specified explicitly using Tf before any text is shown.
-static PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
- pdfContext->fGraphicsState.fCurFontSize = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjectStack.pop();
- SkPdfObject* fontName = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop();
-
+PdfResult skpdfGraphicsStateApplyFontCore(PdfContext* pdfContext, const SkPdfObject* fontName, double fontSize) {
#ifdef PDF_TRACE
printf("font name: %s\n", fontName->nameValue2().c_str());
#endif
@@ -1190,9 +1182,21 @@
pdfContext->fGraphicsState.fSkFont = skfont;
}
}
+ pdfContext->fGraphicsState.fCurFontSize = fontSize;
return kIgnoreError_PdfResult;
}
+//font size Tf Set the text font, Tf
+//, to font and the text font size, Tfs, to size. font is the name of a
+//font resource in the Fontsubdictionary of the current resource dictionary; size is
+//a number representing a scale factor. There is no initial value for either font or
+//size; they must be specified explicitly using Tf before any text is shown.
+static PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
+ double fontSize = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjectStack.pop();
+ SkPdfObject* fontName = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop();
+ return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize);
+}
+
static PdfResult PdfOp_Tj(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
if (!pdfContext->fGraphicsState.fTextBlock) {
// TODO(edisonn): try to recover and draw it any way?
@@ -1519,6 +1523,89 @@
return kNYI_PdfResult;
}
+
+// TODO(edisonn): security review here, make sure all parameters are valid, and safe.
+void skpdfGraphicsStateApply_ca(PdfContext* pdfContext, double ca) {
+ pdfContext->fGraphicsState.fNonStroking.fOpacity = ca;
+}
+
+void skpdfGraphicsStateApply_CA(PdfContext* pdfContext, double CA) {
+ pdfContext->fGraphicsState.fStroking.fOpacity = CA;
+}
+
+void skpdfGraphicsStateApplyLW(PdfContext* pdfContext, double lineWidth) {
+ pdfContext->fGraphicsState.fLineWidth = lineWidth;
+}
+
+void skpdfGraphicsStateApplyLC(PdfContext* pdfContext, int64_t lineCap) {
+ pdfContext->fGraphicsState.fLineCap = (int)lineCap;
+}
+
+void skpdfGraphicsStateApplyLJ(PdfContext* pdfContext, int64_t lineJoin) {
+ pdfContext->fGraphicsState.fLineJoin = (int)lineJoin;
+}
+
+void skpdfGraphicsStateApplyML(PdfContext* pdfContext, double miterLimit) {
+ pdfContext->fGraphicsState.fMiterLimit = miterLimit;
+}
+
+void skpdfGraphicsStateApplyD(PdfContext* pdfContext, SkPdfArray* dash) {
+ // TODO(edisonn): verify input
+ if (!dash || dash->isArray() || dash->size() != 2 || !dash->objAtAIndex(0)->isArray() || !dash->objAtAIndex(1)->isNumber()) {
+ // TODO(edisonn): report error/warning
+ return;
+ }
+
+ SkPdfArray* intervals = (SkPdfArray*)dash->objAtAIndex(0);
+ int cnt = intervals->size();
+ if (cnt >= 256) {
+ // TODO(edisonn): report error/warning, unsuported;
+ // TODO(edisonn): alloc memory
+ return;
+ }
+ for (int i = 0; i < cnt; i++) {
+ if (!intervals->objAtAIndex(i)->isNumber()) {
+ // TODO(edisonn): report error/warning
+ return;
+ }
+ }
+
+ pdfContext->fGraphicsState.fDashPhase = dash->objAtAIndex(1)->scalarValue();
+ pdfContext->fGraphicsState.fDashArrayLength = cnt;
+ for (int i = 0 ; i < cnt; i++) {
+ pdfContext->fGraphicsState.fDashArray[i] = intervals->objAtAIndex(i)->scalarValue();
+ }
+}
+
+void skpdfGraphicsStateApplyFont(PdfContext* pdfContext, SkPdfArray* fontAndSize) {
+ if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !fontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber()) {
+ // TODO(edisonn): report error/warning
+ return;
+ }
+ skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fontAndSize->objAtAIndex(1)->numberValue());
+}
+
+void skpdfGraphicsStateApplyBM_name(PdfContext* pdfContext, const std::string& blendMode) {
+ // TODO(edisonn): verify input
+}
+
+void skpdfGraphicsStateApplyBM_array(PdfContext* pdfContext, SkPdfArray* blendModes) {
+ // TODO(edisonn): verify input
+}
+
+void skpdfGraphicsStateApplySMask_name(PdfContext* pdfContext, const std::string& sMask) {
+ // TODO(edisonn): verify input
+}
+
+void skpdfGraphicsStateApplySMask_dict(PdfContext* pdfContext, SkPdfDictionary* sMask) {
+ // TODO(edisonn): verify input
+}
+
+void skpdfGraphicsStateApplyAIS(PdfContext* pdfContext, bool alphaSource) {
+ pdfContext->fGraphicsState.fAlphaSource = alphaSource;
+}
+
+
//dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictName is
//the name of a graphics state parameter dictionary in the ExtGState subdictionary of the current resource dictionary (see the next section).
static PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
@@ -1550,18 +1637,62 @@
return kIgnoreError_PdfResult;
}
- if (gs->has_CA()) {
- pdfContext->fGraphicsState.fStroking.fOpacity = gs->CA(pdfContext->fPdfDoc);
+ if (gs->has_LW()) {
+ skpdfGraphicsStateApplyLW(pdfContext, gs->LW(pdfContext->fPdfDoc));
}
+ if (gs->has_LC()) {
+ skpdfGraphicsStateApplyLC(pdfContext, gs->LC(pdfContext->fPdfDoc));
+ }
+
+ if (gs->has_LJ()) {
+ skpdfGraphicsStateApplyLJ(pdfContext, gs->LJ(pdfContext->fPdfDoc));
+ }
+
+ if (gs->has_ML()) {
+ skpdfGraphicsStateApplyML(pdfContext, gs->ML(pdfContext->fPdfDoc));
+ }
+
+ if (gs->has_D()) {
+ skpdfGraphicsStateApplyD(pdfContext, gs->D(pdfContext->fPdfDoc));
+ }
+
+ if (gs->has_Font()) {
+ skpdfGraphicsStateApplyFont(pdfContext, gs->Font(pdfContext->fPdfDoc));
+ }
+
+ if (gs->has_BM()) {
+ if (gs->isBMAName(pdfContext->fPdfDoc)) {
+ skpdfGraphicsStateApplyBM_name(pdfContext, gs->getBMAsName(pdfContext->fPdfDoc));
+ } else if (gs->isBMAArray(pdfContext->fPdfDoc)) {
+ skpdfGraphicsStateApplyBM_array(pdfContext, gs->getBMAsArray(pdfContext->fPdfDoc));
+ } else {
+ // TODO(edisonn): report/warn
+ }
+ }
+
+ if (gs->has_SMask()) {
+ if (gs->isSMaskAName(pdfContext->fPdfDoc)) {
+ skpdfGraphicsStateApplySMask_name(pdfContext, gs->getSMaskAsName(pdfContext->fPdfDoc));
+ } else if (gs->isSMaskADictionary(pdfContext->fPdfDoc)) {
+ skpdfGraphicsStateApplySMask_dict(pdfContext, gs->getSMaskAsDictionary(pdfContext->fPdfDoc));
+ } else {
+ // TODO(edisonn): report/warn
+ }
+ }
+
if (gs->has_ca()) {
- pdfContext->fGraphicsState.fNonStroking.fOpacity = gs->ca(pdfContext->fPdfDoc);
+ skpdfGraphicsStateApply_ca(pdfContext, gs->ca(pdfContext->fPdfDoc));
}
- if (gs->has_LW()) {
- pdfContext->fGraphicsState.fLineWidth = gs->LW(pdfContext->fPdfDoc);
+ if (gs->has_CA()) {
+ skpdfGraphicsStateApply_CA(pdfContext, gs->CA(pdfContext->fPdfDoc));
}
+ if (gs->has_AIS()) {
+ skpdfGraphicsStateApplyAIS(pdfContext, gs->AIS(pdfContext->fPdfDoc));
+ }
+
return kNYI_PdfResult;
}
@@ -1993,9 +2124,9 @@
SkTraceMatrix(pdfContext.fOriginalMatrix, "Original matrix");
- pdfContext.fGraphicsState.fMatrix = pdfContext.fOriginalMatrix;
- pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fMatrix;
- pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fMatrix;
+ pdfContext.fGraphicsState.fCTM = pdfContext.fOriginalMatrix;
+ pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fCTM;
+ pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fCTM;
#ifndef PDF_DEBUG_NO_PAGE_CLIPING
canvas->clipRect(dst, SkRegion::kIntersect_Op, true);
« no previous file with comments | « experimental/PdfViewer/SkPdfBasics.cpp ('k') | experimental/PdfViewer/pdfparser/native/SkPdfObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698