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

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

Issue 21125002: pdfviewer: more plumming for soft masks (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 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 661
662 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 662 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
663 663
664 if (skobj->has_BBox()) { 664 if (skobj->has_BBox()) {
665 canvas->clipRect(skobj->BBox(pdfContext->fPdfDoc), SkRegion::kIntersect_ Op, true); // TODO(edisonn): AA from settings. 665 canvas->clipRect(skobj->BBox(pdfContext->fPdfDoc), SkRegion::kIntersect_ Op, true); // TODO(edisonn): AA from settings.
666 } 666 }
667 667
668 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke nize it as we go. 668 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke nize it as we go.
669 // For this PdfContentsTokenizer needs to be extended. 669 // For this PdfContentsTokenizer needs to be extended.
670 670
671 // This is a group?
672 if (skobj->has_Group()) {
673 //TransparencyGroupDictionary* ...
674 }
675
671 SkPdfStream* stream = (SkPdfStream*)skobj; 676 SkPdfStream* stream = (SkPdfStream*)skobj;
672 677
673 SkPdfNativeTokenizer* tokenizer = 678 SkPdfNativeTokenizer* tokenizer =
674 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA llocator); 679 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA llocator);
675 if (tokenizer != NULL) { 680 if (tokenizer != NULL) {
676 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); 681 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas);
677 looper.loop(); 682 looper.loop();
678 delete tokenizer; 683 delete tokenizer;
679 } 684 }
680 685
(...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after
1575 } 1580 }
1576 1581
1577 void skpdfGraphicsStateApplyFont(PdfContext* pdfContext, SkPdfArray* fontAndSize ) { 1582 void skpdfGraphicsStateApplyFont(PdfContext* pdfContext, SkPdfArray* fontAndSize ) {
1578 if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !f ontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber() ) { 1583 if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !f ontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber() ) {
1579 // TODO(edisonn): report error/warning 1584 // TODO(edisonn): report error/warning
1580 return; 1585 return;
1581 } 1586 }
1582 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fon tAndSize->objAtAIndex(1)->numberValue()); 1587 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fon tAndSize->objAtAIndex(1)->numberValue());
1583 } 1588 }
1584 1589
1590 SkTDict<SkXfermode::Mode> gPdfBlendModes(20);
1591
1592 class InitBlendModes {
1593 public:
1594 InitBlendModes() {
1595 // TODO(edisonn): use the python code generator?
1596 // TABLE 7.2 Standard separable blend modes
1597 gPdfBlendModes.set("Normal", SkXfermode::kSrc_Mode);
1598 gPdfBlendModes.set("Multiply", SkXfermode::kMultiply_Mode);
1599 gPdfBlendModes.set("Screen", SkXfermode::kScreen_Mode);
1600 gPdfBlendModes.set("Overlay", SkXfermode::kOverlay_Mode);
1601 gPdfBlendModes.set("Darken", SkXfermode::kDarken_Mode);
1602 gPdfBlendModes.set("Lighten", SkXfermode::kLighten_Mode);
1603 gPdfBlendModes.set("ColorDodge", SkXfermode::kColorDodge_Mode);
1604 gPdfBlendModes.set("ColorBurn", SkXfermode::kColorBurn_Mode);
1605 gPdfBlendModes.set("HardLight", SkXfermode::kHardLight_Mode);
1606 gPdfBlendModes.set("SoftLight", SkXfermode::kSoftLight_Mode);
1607 gPdfBlendModes.set("Difference", SkXfermode::kDifference_Mode);
1608 gPdfBlendModes.set("Exclusion", SkXfermode::kExclusion_Mode);
1609
1610 // TABLE 7.3 Standard nonseparable blend modes
1611 gPdfBlendModes.set("Hue", SkXfermode::kHue_Mode);
1612 gPdfBlendModes.set("Saturation", SkXfermode::kSaturation_Mode);
1613 gPdfBlendModes.set("Color", SkXfermode::kColor_Mode);
1614 gPdfBlendModes.set("Luminosity", SkXfermode::kLuminosity_Mode);
1615 }
1616 };
1617
1618 InitBlendModes _gDummyInniter;
1619
1620 SkXfermode::Mode xferModeFromBlendMode(const char* blendMode, size_t len) {
1621 SkXfermode::Mode mode = (SkXfermode::Mode)(SkXfermode::kLastMode + 1);
1622 if (gPdfBlendModes.find(blendMode, len, &mode)) {
1623 return mode;
1624 }
1625
1626 return (SkXfermode::Mode)(SkXfermode::kLastMode + 1);
1627 }
1628
1585 void skpdfGraphicsStateApplyBM_name(PdfContext* pdfContext, const std::string& b lendMode) { 1629 void skpdfGraphicsStateApplyBM_name(PdfContext* pdfContext, const std::string& b lendMode) {
1586 // TODO(edisonn): verify input 1630 SkXfermode::Mode mode = xferModeFromBlendMode(blendMode.c_str(), blendMode.l ength());
1631 if (mode <= SkXfermode::kLastMode) {
1632 pdfContext->fGraphicsState.fBlendModesLength = 1;
1633 pdfContext->fGraphicsState.fBlendModes[0] = mode;
1634 } else {
1635 // TODO(edisonn): report unknown blend mode
1636 }
1587 } 1637 }
1588 1638
1589 void skpdfGraphicsStateApplyBM_array(PdfContext* pdfContext, SkPdfArray* blendMo des) { 1639 void skpdfGraphicsStateApplyBM_array(PdfContext* pdfContext, SkPdfArray* blendMo des) {
1590 // TODO(edisonn): verify input 1640 if (!blendModes || blendModes->isArray() || blendModes->size() == 0 || blend Modes->size() > 256) {
1591 } 1641 // TODO(edisonn): report error/warning
1642 return;
1643 }
1644 SkXfermode::Mode modes[256];
1645 int cnt = blendModes->size();
1646 for (int i = 0; i < cnt; i++) {
1647 SkPdfObject* name = blendModes->objAtAIndex(i);
1648 if (!name->isName()) {
1649 // TODO(edisonn): report error/warning
1650 return;
1651 }
1652 SkXfermode::Mode mode = xferModeFromBlendMode(name->c_str(), name->lenst r());
1653 if (mode > SkXfermode::kLastMode) {
1654 // TODO(edisonn): report error/warning
1655 return;
1656 }
1657 }
1592 1658
1593 void skpdfGraphicsStateApplySMask_name(PdfContext* pdfContext, const std::string & sMask) { 1659 pdfContext->fGraphicsState.fBlendModesLength = cnt;
1594 // TODO(edisonn): verify input 1660 for (int i = 0; i < cnt; i++) {
1661 pdfContext->fGraphicsState.fBlendModes[i] = modes[i];
1662 }
1595 } 1663 }
1596 1664
1597 void skpdfGraphicsStateApplySMask_dict(PdfContext* pdfContext, SkPdfDictionary* sMask) { 1665 void skpdfGraphicsStateApplySMask_dict(PdfContext* pdfContext, SkPdfDictionary* sMask) {
1598 // TODO(edisonn): verify input 1666 // TODO(edisonn): verify input
1667 if (pdfContext->fPdfDoc->mapper()->mapSoftMaskDictionary(sMask)) {
1668 //SkPdfSoftMaskDictionary* smd = (SkPdfSoftMaskDictionary*)sMask;
1669 // TODO(edisonn): load soft mask
1670 } else if (pdfContext->fPdfDoc->mapper()->mapSoftMaskImageDictionary(sMask)) {
1671 SkPdfSoftMaskImageDictionary* smid = (SkPdfSoftMaskImageDictionary*)sMas k;
1672 pdfContext->fGraphicsState.fSMask = getImageFromObject(pdfContext, smid, true);
1673 // TODO(edisonn): load image soft mask
1674 } else {
1675 // TODO (edisonn): report error/warning
1676 }
1677 }
1678
1679 void skpdfGraphicsStateApplySMask_name(PdfContext* pdfContext, const std::string & sMask) {
1680 //Next, get the ExtGState Dictionary from the Resource Dictionary:
1681 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources ->ExtGState(pdfContext->fPdfDoc);
1682
1683 if (extGStateDictionary == NULL) {
1684 #ifdef PDF_TRACE
1685 printf("ExtGState is NULL!\n");
1686 #endif
1687 // TODO (edisonn): report error/warning
1688 return;
1689 }
1690
1691 SkPdfObject* obj = pdfContext->fPdfDoc->resolveReference(extGStateDictionary ->get(sMask.c_str()));
1692 if (!obj || !obj->isDictionary()) {
1693 // TODO (edisonn): report error/warning
1694 return;
1695 }
1696 skpdfGraphicsStateApplySMask_dict(pdfContext, obj->asDictionary());
1599 } 1697 }
1600 1698
1601 void skpdfGraphicsStateApplyAIS(PdfContext* pdfContext, bool alphaSource) { 1699 void skpdfGraphicsStateApplyAIS(PdfContext* pdfContext, bool alphaSource) {
1602 pdfContext->fGraphicsState.fAlphaSource = alphaSource; 1700 pdfContext->fGraphicsState.fAlphaSource = alphaSource;
1603 } 1701 }
1604 1702
1605 1703
1606 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN ame is 1704 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN ame is
1607 //the name of a graphics state parameter dictionary in the ExtGState subdictiona ry of the current resource dictionary (see the next section). 1705 //the name of a graphics state parameter dictionary in the ExtGState subdictiona ry of the current resource dictionary (see the next section).
1608 static PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1706 static PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) {
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 2307
2210 rect = SkRect::MakeWH(width, height); 2308 rect = SkRect::MakeWH(width, height);
2211 2309
2212 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght)); 2310 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght));
2213 2311
2214 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); 2312 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output)));
2215 SkCanvas canvas(device); 2313 SkCanvas canvas(device);
2216 2314
2217 return renderer.renderPage(page, &canvas, rect); 2315 return renderer.renderPage(page, &canvas, rect);
2218 } 2316 }
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfFont.cpp ('k') | experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698