| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkPDFDevice.h" | 8 #include "SkPDFDevice.h" |
| 9 | 9 |
| 10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
| (...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 //////////////////////////////////////////////////////////////////////////////// | 698 //////////////////////////////////////////////////////////////////////////////// |
| 699 | 699 |
| 700 SkPDFDevice::SkPDFDevice(SkISize pageSize, | 700 SkPDFDevice::SkPDFDevice(SkISize pageSize, |
| 701 SkScalar rasterDpi, | 701 SkScalar rasterDpi, |
| 702 SkPDFCanon* canon, | 702 SkPDFCanon* canon, |
| 703 bool flip) | 703 bool flip) |
| 704 : fPageSize(pageSize) | 704 : fPageSize(pageSize) |
| 705 , fContentSize(pageSize) | 705 , fContentSize(pageSize) |
| 706 , fExistingClipRegion(SkIRect::MakeSize(pageSize)) | 706 , fExistingClipRegion(SkIRect::MakeSize(pageSize)) |
| 707 , fAnnotations(NULL) | 707 , fAnnotations(NULL) |
| 708 , fResourceDict(NULL) | |
| 709 , fLastContentEntry(NULL) | 708 , fLastContentEntry(NULL) |
| 710 , fLastMarginContentEntry(NULL) | 709 , fLastMarginContentEntry(NULL) |
| 711 , fDrawingArea(kContent_DrawingArea) | 710 , fDrawingArea(kContent_DrawingArea) |
| 712 , fClipStack(NULL) | 711 , fClipStack(NULL) |
| 713 , fFontGlyphUsage(SkNEW(SkPDFGlyphSetMap)) | 712 , fFontGlyphUsage(SkNEW(SkPDFGlyphSetMap)) |
| 714 , fRasterDpi(rasterDpi) | 713 , fRasterDpi(rasterDpi) |
| 715 , fCanon(canon) { | 714 , fCanon(canon) { |
| 716 SkASSERT(pageSize.width() > 0); | 715 SkASSERT(pageSize.width() > 0); |
| 717 SkASSERT(pageSize.height() > 0); | 716 SkASSERT(pageSize.height() > 0); |
| 718 fLegacyBitmap.setInfo( | 717 fLegacyBitmap.setInfo( |
| 719 SkImageInfo::MakeUnknown(pageSize.width(), pageSize.height())); | 718 SkImageInfo::MakeUnknown(pageSize.width(), pageSize.height())); |
| 720 if (flip) { | 719 if (flip) { |
| 721 // Skia generally uses the top left as the origin but PDF | 720 // Skia generally uses the top left as the origin but PDF |
| 722 // natively has the origin at the bottom left. This matrix | 721 // natively has the origin at the bottom left. This matrix |
| 723 // corrects for that. But that only needs to be done once, we | 722 // corrects for that. But that only needs to be done once, we |
| 724 // don't do it when layering. | 723 // don't do it when layering. |
| 725 fInitialTransform.setTranslate(0, SkIntToScalar(pageSize.fHeight)); | 724 fInitialTransform.setTranslate(0, SkIntToScalar(pageSize.fHeight)); |
| 726 fInitialTransform.preScale(SK_Scalar1, -SK_Scalar1); | 725 fInitialTransform.preScale(SK_Scalar1, -SK_Scalar1); |
| 727 } else { | 726 } else { |
| 728 fInitialTransform.setIdentity(); | 727 fInitialTransform.setIdentity(); |
| 729 } | 728 } |
| 730 } | 729 } |
| 731 | 730 |
| 732 SkPDFDevice::~SkPDFDevice() { | 731 SkPDFDevice::~SkPDFDevice() { |
| 733 this->cleanUp(true); | 732 this->cleanUp(true); |
| 734 } | 733 } |
| 735 | 734 |
| 736 void SkPDFDevice::init() { | 735 void SkPDFDevice::init() { |
| 737 fAnnotations = NULL; | 736 fAnnotations = NULL; |
| 738 fResourceDict = NULL; | |
| 739 fContentEntries.free(); | 737 fContentEntries.free(); |
| 740 fLastContentEntry = NULL; | 738 fLastContentEntry = NULL; |
| 741 fMarginContentEntries.free(); | 739 fMarginContentEntries.free(); |
| 742 fLastMarginContentEntry = NULL; | 740 fLastMarginContentEntry = NULL; |
| 743 fDrawingArea = kContent_DrawingArea; | 741 fDrawingArea = kContent_DrawingArea; |
| 744 if (fFontGlyphUsage.get() == NULL) { | 742 if (fFontGlyphUsage.get() == NULL) { |
| 745 fFontGlyphUsage.reset(SkNEW(SkPDFGlyphSetMap)); | 743 fFontGlyphUsage.reset(SkNEW(SkPDFGlyphSetMap)); |
| 746 } | 744 } |
| 747 } | 745 } |
| 748 | 746 |
| 749 void SkPDFDevice::cleanUp(bool clearFontUsage) { | 747 void SkPDFDevice::cleanUp(bool clearFontUsage) { |
| 750 fGraphicStateResources.unrefAll(); | 748 fGraphicStateResources.unrefAll(); |
| 751 fXObjectResources.unrefAll(); | 749 fXObjectResources.unrefAll(); |
| 752 fFontResources.unrefAll(); | 750 fFontResources.unrefAll(); |
| 753 fShaderResources.unrefAll(); | 751 fShaderResources.unrefAll(); |
| 754 SkSafeUnref(fAnnotations); | 752 SkSafeUnref(fAnnotations); |
| 755 SkSafeUnref(fResourceDict); | |
| 756 fNamedDestinations.deleteAll(); | 753 fNamedDestinations.deleteAll(); |
| 757 | 754 |
| 758 if (clearFontUsage) { | 755 if (clearFontUsage) { |
| 759 fFontGlyphUsage->reset(); | 756 fFontGlyphUsage->reset(); |
| 760 } | 757 } |
| 761 } | 758 } |
| 762 | 759 |
| 763 void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) { | 760 void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) { |
| 764 SkPaint newPaint = paint; | 761 SkPaint newPaint = paint; |
| 765 newPaint.setStyle(SkPaint::kFill_Style); | 762 newPaint.setStyle(SkPaint::kFill_Style); |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 fLastMarginContentEntry = contentEntry; | 1239 fLastMarginContentEntry = contentEntry; |
| 1243 } | 1240 } |
| 1244 } | 1241 } |
| 1245 | 1242 |
| 1246 void SkPDFDevice::setDrawingArea(DrawingArea drawingArea) { | 1243 void SkPDFDevice::setDrawingArea(DrawingArea drawingArea) { |
| 1247 // A ScopedContentEntry only exists during the course of a draw call, so | 1244 // A ScopedContentEntry only exists during the course of a draw call, so |
| 1248 // this can't be called while a ScopedContentEntry exists. | 1245 // this can't be called while a ScopedContentEntry exists. |
| 1249 fDrawingArea = drawingArea; | 1246 fDrawingArea = drawingArea; |
| 1250 } | 1247 } |
| 1251 | 1248 |
| 1252 SkPDFResourceDict* SkPDFDevice::getResourceDict() { | 1249 SkPDFResourceDict* SkPDFDevice::createResourceDict() const { |
| 1253 if (NULL == fResourceDict) { | 1250 SkAutoTUnref<SkPDFResourceDict> resourceDict(SkNEW(SkPDFResourceDict)); |
| 1254 fResourceDict = SkNEW(SkPDFResourceDict); | 1251 if (fGraphicStateResources.count()) { |
| 1255 | 1252 for (int i = 0; i < fGraphicStateResources.count(); i++) { |
| 1256 if (fGraphicStateResources.count()) { | 1253 resourceDict->insertResourceAsReference( |
| 1257 for (int i = 0; i < fGraphicStateResources.count(); i++) { | 1254 SkPDFResourceDict::kExtGState_ResourceType, |
| 1258 fResourceDict->insertResourceAsReference( | 1255 i, fGraphicStateResources[i]); |
| 1259 SkPDFResourceDict::kExtGState_ResourceType, | |
| 1260 i, fGraphicStateResources[i]); | |
| 1261 } | |
| 1262 } | |
| 1263 | |
| 1264 if (fXObjectResources.count()) { | |
| 1265 for (int i = 0; i < fXObjectResources.count(); i++) { | |
| 1266 fResourceDict->insertResourceAsReference( | |
| 1267 SkPDFResourceDict::kXObject_ResourceType, | |
| 1268 i, fXObjectResources[i]); | |
| 1269 } | |
| 1270 } | |
| 1271 | |
| 1272 if (fFontResources.count()) { | |
| 1273 for (int i = 0; i < fFontResources.count(); i++) { | |
| 1274 fResourceDict->insertResourceAsReference( | |
| 1275 SkPDFResourceDict::kFont_ResourceType, | |
| 1276 i, fFontResources[i]); | |
| 1277 } | |
| 1278 } | |
| 1279 | |
| 1280 if (fShaderResources.count()) { | |
| 1281 SkAutoTUnref<SkPDFDict> patterns(new SkPDFDict()); | |
| 1282 for (int i = 0; i < fShaderResources.count(); i++) { | |
| 1283 fResourceDict->insertResourceAsReference( | |
| 1284 SkPDFResourceDict::kPattern_ResourceType, | |
| 1285 i, fShaderResources[i]); | |
| 1286 } | |
| 1287 } | 1256 } |
| 1288 } | 1257 } |
| 1289 return fResourceDict; | 1258 |
| 1259 if (fXObjectResources.count()) { |
| 1260 for (int i = 0; i < fXObjectResources.count(); i++) { |
| 1261 resourceDict->insertResourceAsReference( |
| 1262 SkPDFResourceDict::kXObject_ResourceType, |
| 1263 i, fXObjectResources[i]); |
| 1264 } |
| 1265 } |
| 1266 |
| 1267 if (fFontResources.count()) { |
| 1268 for (int i = 0; i < fFontResources.count(); i++) { |
| 1269 resourceDict->insertResourceAsReference( |
| 1270 SkPDFResourceDict::kFont_ResourceType, |
| 1271 i, fFontResources[i]); |
| 1272 } |
| 1273 } |
| 1274 |
| 1275 if (fShaderResources.count()) { |
| 1276 SkAutoTUnref<SkPDFDict> patterns(new SkPDFDict()); |
| 1277 for (int i = 0; i < fShaderResources.count(); i++) { |
| 1278 resourceDict->insertResourceAsReference( |
| 1279 SkPDFResourceDict::kPattern_ResourceType, |
| 1280 i, fShaderResources[i]); |
| 1281 } |
| 1282 } |
| 1283 return resourceDict.detach(); |
| 1290 } | 1284 } |
| 1291 | 1285 |
| 1292 const SkTDArray<SkPDFFont*>& SkPDFDevice::getFontResources() const { | 1286 const SkTDArray<SkPDFFont*>& SkPDFDevice::getFontResources() const { |
| 1293 return fFontResources; | 1287 return fFontResources; |
| 1294 } | 1288 } |
| 1295 | 1289 |
| 1296 SkPDFArray* SkPDFDevice::copyMediaBox() const { | 1290 SkPDFArray* SkPDFDevice::copyMediaBox() const { |
| 1297 // should this be a singleton? | 1291 // should this be a singleton? |
| 1298 SkAutoTUnref<SkPDFInt> zero(SkNEW_ARGS(SkPDFInt, (0))); | 1292 SkAutoTUnref<SkPDFInt> zero(SkNEW_ARGS(SkPDFInt, (0))); |
| 1299 | 1293 |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1532 void SkPDFDevice::defineNamedDestination(SkData* nameData, const SkPoint& point, | 1526 void SkPDFDevice::defineNamedDestination(SkData* nameData, const SkPoint& point, |
| 1533 const SkMatrix& matrix) { | 1527 const SkMatrix& matrix) { |
| 1534 SkMatrix transform = matrix; | 1528 SkMatrix transform = matrix; |
| 1535 transform.postConcat(fInitialTransform); | 1529 transform.postConcat(fInitialTransform); |
| 1536 SkPoint translatedPoint; | 1530 SkPoint translatedPoint; |
| 1537 transform.mapXY(point.x(), point.y(), &translatedPoint); | 1531 transform.mapXY(point.x(), point.y(), &translatedPoint); |
| 1538 fNamedDestinations.push( | 1532 fNamedDestinations.push( |
| 1539 SkNEW_ARGS(NamedDestination, (nameData, translatedPoint))); | 1533 SkNEW_ARGS(NamedDestination, (nameData, translatedPoint))); |
| 1540 } | 1534 } |
| 1541 | 1535 |
| 1542 void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) { | 1536 void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) const { |
| 1543 int nDest = fNamedDestinations.count(); | 1537 int nDest = fNamedDestinations.count(); |
| 1544 for (int i = 0; i < nDest; i++) { | 1538 for (int i = 0; i < nDest; i++) { |
| 1545 NamedDestination* dest = fNamedDestinations[i]; | 1539 NamedDestination* dest = fNamedDestinations[i]; |
| 1546 SkAutoTUnref<SkPDFArray> pdfDest(SkNEW(SkPDFArray)); | 1540 SkAutoTUnref<SkPDFArray> pdfDest(SkNEW(SkPDFArray)); |
| 1547 pdfDest->reserve(5); | 1541 pdfDest->reserve(5); |
| 1548 pdfDest->append(SkNEW_ARGS(SkPDFObjRef, (page)))->unref(); | 1542 pdfDest->append(SkNEW_ARGS(SkPDFObjRef, (page)))->unref(); |
| 1549 pdfDest->appendName("XYZ"); | 1543 pdfDest->appendName("XYZ"); |
| 1550 pdfDest->appendScalar(dest->point.x()); | 1544 pdfDest->appendScalar(dest->point.x()); |
| 1551 pdfDest->appendScalar(dest->point.y()); | 1545 pdfDest->appendScalar(dest->point.y()); |
| 1552 pdfDest->appendInt(0); // Leave zoom unchanged | 1546 pdfDest->appendInt(0); // Leave zoom unchanged |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2139 return; | 2133 return; |
| 2140 } | 2134 } |
| 2141 SkAutoTUnref<SkPDFObject> image(SkPDFBitmap::Create(fCanon, subsetBitmap)); | 2135 SkAutoTUnref<SkPDFObject> image(SkPDFBitmap::Create(fCanon, subsetBitmap)); |
| 2142 if (!image) { | 2136 if (!image) { |
| 2143 return; | 2137 return; |
| 2144 } | 2138 } |
| 2145 | 2139 |
| 2146 SkPDFUtils::DrawFormXObject(this->addXObjectResource(image.get()), | 2140 SkPDFUtils::DrawFormXObject(this->addXObjectResource(image.get()), |
| 2147 &content.entry()->fContent); | 2141 &content.entry()->fContent); |
| 2148 } | 2142 } |
| OLD | NEW |