| 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 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1292 &fXObjectResources, | 1292 &fXObjectResources, |
| 1293 &fonts); | 1293 &fonts); |
| 1294 } | 1294 } |
| 1295 | 1295 |
| 1296 const SkTDArray<SkPDFFont*>& SkPDFDevice::getFontResources() const { | 1296 const SkTDArray<SkPDFFont*>& SkPDFDevice::getFontResources() const { |
| 1297 return fFontResources; | 1297 return fFontResources; |
| 1298 } | 1298 } |
| 1299 | 1299 |
| 1300 SkPDFArray* SkPDFDevice::copyMediaBox() const { | 1300 SkPDFArray* SkPDFDevice::copyMediaBox() const { |
| 1301 // should this be a singleton? | 1301 // should this be a singleton? |
| 1302 SkAutoTUnref<SkPDFInt> zero(SkNEW_ARGS(SkPDFInt, (0))); | |
| 1303 | 1302 |
| 1304 SkPDFArray* mediaBox = SkNEW(SkPDFArray); | 1303 SkAutoTUnref<SkPDFArray> mediaBox(SkNEW(SkPDFArray)); |
| 1305 mediaBox->reserve(4); | 1304 mediaBox->reserve(4); |
| 1306 mediaBox->append(zero.get()); | 1305 mediaBox->appendInt(0); |
| 1307 mediaBox->append(zero.get()); | 1306 mediaBox->appendInt(0); |
| 1308 mediaBox->appendInt(fPageSize.fWidth); | 1307 mediaBox->appendInt(fPageSize.fWidth); |
| 1309 mediaBox->appendInt(fPageSize.fHeight); | 1308 mediaBox->appendInt(fPageSize.fHeight); |
| 1310 return mediaBox; | 1309 return mediaBox.detach(); |
| 1311 } | 1310 } |
| 1312 | 1311 |
| 1313 SkStreamAsset* SkPDFDevice::content() const { | 1312 SkStreamAsset* SkPDFDevice::content() const { |
| 1314 SkDynamicMemoryWStream buffer; | 1313 SkDynamicMemoryWStream buffer; |
| 1315 this->writeContent(&buffer); | 1314 this->writeContent(&buffer); |
| 1316 return buffer.detachAsStream(); | 1315 return buffer.detachAsStream(); |
| 1317 } | 1316 } |
| 1318 | 1317 |
| 1319 void SkPDFDevice::copyContentEntriesToData(ContentEntry* entry, | 1318 void SkPDFDevice::copyContentEntriesToData(ContentEntry* entry, |
| 1320 SkWStream* data) const { | 1319 SkWStream* data) const { |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1498 } | 1497 } |
| 1499 | 1498 |
| 1500 void SkPDFDevice::handleLinkToURL(SkData* urlData, const SkRect& r, | 1499 void SkPDFDevice::handleLinkToURL(SkData* urlData, const SkRect& r, |
| 1501 const SkMatrix& matrix) { | 1500 const SkMatrix& matrix) { |
| 1502 SkAutoTUnref<SkPDFDict> annotation(createLinkAnnotation(r, matrix)); | 1501 SkAutoTUnref<SkPDFDict> annotation(createLinkAnnotation(r, matrix)); |
| 1503 | 1502 |
| 1504 SkString url(static_cast<const char *>(urlData->data()), | 1503 SkString url(static_cast<const char *>(urlData->data()), |
| 1505 urlData->size() - 1); | 1504 urlData->size() - 1); |
| 1506 SkAutoTUnref<SkPDFDict> action(SkNEW_ARGS(SkPDFDict, ("Action"))); | 1505 SkAutoTUnref<SkPDFDict> action(SkNEW_ARGS(SkPDFDict, ("Action"))); |
| 1507 action->insertName("S", "URI"); | 1506 action->insertName("S", "URI"); |
| 1508 action->insert("URI", SkNEW_ARGS(SkPDFString, (url)))->unref(); | 1507 action->insertString("URI", url); |
| 1509 annotation->insert("A", action.get()); | 1508 annotation->insert("A", action.get()); |
| 1510 } | 1509 } |
| 1511 | 1510 |
| 1512 void SkPDFDevice::handleLinkToNamedDest(SkData* nameData, const SkRect& r, | 1511 void SkPDFDevice::handleLinkToNamedDest(SkData* nameData, const SkRect& r, |
| 1513 const SkMatrix& matrix) { | 1512 const SkMatrix& matrix) { |
| 1514 SkAutoTUnref<SkPDFDict> annotation(createLinkAnnotation(r, matrix)); | 1513 SkAutoTUnref<SkPDFDict> annotation(createLinkAnnotation(r, matrix)); |
| 1515 SkString name(static_cast<const char *>(nameData->data()), | 1514 SkString name(static_cast<const char *>(nameData->data()), |
| 1516 nameData->size() - 1); | 1515 nameData->size() - 1); |
| 1517 annotation->insert("Dest", SkNEW_ARGS(SkPDFName, (name)))->unref(); | 1516 annotation->insertName("Dest", name); |
| 1518 } | 1517 } |
| 1519 | 1518 |
| 1520 struct NamedDestination { | 1519 struct NamedDestination { |
| 1521 const SkData* nameData; | 1520 const SkData* nameData; |
| 1522 SkPoint point; | 1521 SkPoint point; |
| 1523 | 1522 |
| 1524 NamedDestination(const SkData* nameData, const SkPoint& point) | 1523 NamedDestination(const SkData* nameData, const SkPoint& point) |
| 1525 : nameData(nameData), point(point) { | 1524 : nameData(SkRef(nameData)), point(point) {} |
| 1526 nameData->ref(); | |
| 1527 } | |
| 1528 | 1525 |
| 1529 ~NamedDestination() { | 1526 ~NamedDestination() { |
| 1530 nameData->unref(); | 1527 nameData->unref(); |
| 1531 } | 1528 } |
| 1532 }; | 1529 }; |
| 1533 | 1530 |
| 1534 void SkPDFDevice::defineNamedDestination(SkData* nameData, const SkPoint& point, | 1531 void SkPDFDevice::defineNamedDestination(SkData* nameData, const SkPoint& point, |
| 1535 const SkMatrix& matrix) { | 1532 const SkMatrix& matrix) { |
| 1536 SkMatrix transform = matrix; | 1533 SkMatrix transform = matrix; |
| 1537 transform.postConcat(fInitialTransform); | 1534 transform.postConcat(fInitialTransform); |
| 1538 SkPoint translatedPoint; | 1535 SkPoint translatedPoint; |
| 1539 transform.mapXY(point.x(), point.y(), &translatedPoint); | 1536 transform.mapXY(point.x(), point.y(), &translatedPoint); |
| 1540 fNamedDestinations.push( | 1537 fNamedDestinations.push( |
| 1541 SkNEW_ARGS(NamedDestination, (nameData, translatedPoint))); | 1538 SkNEW_ARGS(NamedDestination, (nameData, translatedPoint))); |
| 1542 } | 1539 } |
| 1543 | 1540 |
| 1544 void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) const { | 1541 void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) const { |
| 1545 int nDest = fNamedDestinations.count(); | 1542 int nDest = fNamedDestinations.count(); |
| 1546 for (int i = 0; i < nDest; i++) { | 1543 for (int i = 0; i < nDest; i++) { |
| 1547 NamedDestination* dest = fNamedDestinations[i]; | 1544 NamedDestination* dest = fNamedDestinations[i]; |
| 1548 SkAutoTUnref<SkPDFArray> pdfDest(SkNEW(SkPDFArray)); | 1545 SkAutoTUnref<SkPDFArray> pdfDest(SkNEW(SkPDFArray)); |
| 1549 pdfDest->reserve(5); | 1546 pdfDest->reserve(5); |
| 1550 pdfDest->append(SkNEW_ARGS(SkPDFObjRef, (page)))->unref(); | 1547 pdfDest->appendObjRef(SkRef(page)); |
| 1551 pdfDest->appendName("XYZ"); | 1548 pdfDest->appendName("XYZ"); |
| 1552 pdfDest->appendScalar(dest->point.x()); | 1549 pdfDest->appendScalar(dest->point.x()); |
| 1553 pdfDest->appendScalar(dest->point.y()); | 1550 pdfDest->appendScalar(dest->point.y()); |
| 1554 pdfDest->appendInt(0); // Leave zoom unchanged | 1551 pdfDest->appendInt(0); // Leave zoom unchanged |
| 1555 dict->insert(static_cast<const char *>(dest->nameData->data()), | 1552 SkString name(static_cast<const char*>(dest->nameData->data())); |
| 1556 pdfDest); | 1553 dict->insertObject(name, pdfDest.detach()); |
| 1557 } | 1554 } |
| 1558 } | 1555 } |
| 1559 | 1556 |
| 1560 SkPDFFormXObject* SkPDFDevice::createFormXObjectFromDevice() { | 1557 SkPDFFormXObject* SkPDFDevice::createFormXObjectFromDevice() { |
| 1561 SkPDFFormXObject* xobject = SkNEW_ARGS(SkPDFFormXObject, (this)); | 1558 SkPDFFormXObject* xobject = SkNEW_ARGS(SkPDFFormXObject, (this)); |
| 1562 // We always draw the form xobjects that we create back into the device, so | 1559 // We always draw the form xobjects that we create back into the device, so |
| 1563 // we simply preserve the font usage instead of pulling it out and merging | 1560 // we simply preserve the font usage instead of pulling it out and merging |
| 1564 // it back in later. | 1561 // it back in later. |
| 1565 cleanUp(false); // Reset this device to have no content. | 1562 cleanUp(false); // Reset this device to have no content. |
| 1566 init(); | 1563 init(); |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 return; | 2137 return; |
| 2141 } | 2138 } |
| 2142 SkAutoTUnref<SkPDFObject> image(SkPDFBitmap::Create(fCanon, subsetBitmap)); | 2139 SkAutoTUnref<SkPDFObject> image(SkPDFBitmap::Create(fCanon, subsetBitmap)); |
| 2143 if (!image) { | 2140 if (!image) { |
| 2144 return; | 2141 return; |
| 2145 } | 2142 } |
| 2146 | 2143 |
| 2147 SkPDFUtils::DrawFormXObject(this->addXObjectResource(image.get()), | 2144 SkPDFUtils::DrawFormXObject(this->addXObjectResource(image.get()), |
| 2148 &content.entry()->fContent); | 2145 &content.entry()->fContent); |
| 2149 } | 2146 } |
| OLD | NEW |