| Index: src/pdf/SkPDFDevice.cpp
|
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
|
| index d102f0e977703f7ff714d9496c10d2844eacd12d..239b73823ba08e8c1917670deb1cc4a2655b9b6a 100644
|
| --- a/src/pdf/SkPDFDevice.cpp
|
| +++ b/src/pdf/SkPDFDevice.cpp
|
| @@ -7,7 +7,7 @@
|
|
|
| #include "SkPDFDevice.h"
|
|
|
| -#include "SkAnnotation.h"
|
| +#include "SkAnnotationKeys.h"
|
| #include "SkColor.h"
|
| #include "SkColorFilter.h"
|
| #include "SkClipStack.h"
|
| @@ -753,6 +753,17 @@ void SkPDFDevice::cleanUp(bool clearFontUsage) {
|
| }
|
| }
|
|
|
| +void SkPDFDevice::drawAnnotation(const SkDraw& d, const SkRect& rect, const char key[],
|
| + SkData* value) {
|
| + if (0 == rect.width() && 0 == rect.height()) {
|
| + handlePointAnnotation({ rect.x(), rect.y() }, *d.fMatrix, key, value);
|
| + } else {
|
| + SkPath path;
|
| + path.addRect(rect);
|
| + handlePathAnnotation(path, d, key, value);
|
| + }
|
| +}
|
| +
|
| void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) {
|
| SkPaint newPaint = paint;
|
| replace_srcmode_on_opaque_paint(&newPaint);
|
| @@ -792,12 +803,6 @@ void SkPDFDevice::drawPoints(const SkDraw& d,
|
| return;
|
| }
|
|
|
| - if (SkAnnotation* annotation = passedPaint.getAnnotation()) {
|
| - if (handlePointAnnotation(points, count, *d.fMatrix, annotation)) {
|
| - return;
|
| - }
|
| - }
|
| -
|
| // SkDraw::drawPoints converts to multiple calls to fDevice->drawPath.
|
| // We only use this when there's a path effect because of the overhead
|
| // of multiple calls to setUpContentEntry it causes.
|
| @@ -935,14 +940,6 @@ void SkPDFDevice::drawRect(const SkDraw& d,
|
| return;
|
| }
|
|
|
| - if (SkAnnotation* annotation = paint.getAnnotation()) {
|
| - SkPath path;
|
| - path.addRect(rect);
|
| - if (handlePathAnnotation(path, d, annotation)) {
|
| - return;
|
| - }
|
| - }
|
| -
|
| ScopedContentEntry content(this, d, paint);
|
| if (!content.entry()) {
|
| return;
|
| @@ -1021,12 +1018,6 @@ void SkPDFDevice::drawPath(const SkDraw& d,
|
| return;
|
| }
|
|
|
| - if (SkAnnotation* annotation = paint.getAnnotation()) {
|
| - if (handlePathAnnotation(*pathPtr, d, annotation)) {
|
| - return;
|
| - }
|
| - }
|
| -
|
| ScopedContentEntry content(this, d.fClipStack, *d.fClip, matrix, paint);
|
| if (!content.entry()) {
|
| return;
|
| @@ -1664,26 +1655,26 @@ bool SkPDFDevice::handleInversePath(const SkDraw& d, const SkPath& origPath,
|
| return true;
|
| }
|
|
|
| -bool SkPDFDevice::handlePointAnnotation(const SkPoint* points, size_t count,
|
| +void SkPDFDevice::handlePointAnnotation(const SkPoint& point,
|
| const SkMatrix& matrix,
|
| - SkAnnotation* annotationInfo) {
|
| - SkData* nameData = annotationInfo->find(
|
| - SkAnnotationKeys::Define_Named_Dest_Key());
|
| - if (nameData) {
|
| - for (size_t i = 0; i < count; i++) {
|
| - SkPoint transformedPoint;
|
| - matrix.mapXY(points[i].x(), points[i].y(), &transformedPoint);
|
| - fNamedDestinations.emplace_back(nameData, transformedPoint);
|
| - }
|
| - return true;
|
| + const char key[], SkData* value) {
|
| + if (!value) {
|
| + return;
|
| + }
|
| +
|
| + if (!strcmp(SkAnnotationKeys::Define_Named_Dest_Key(), key)) {
|
| + SkPoint transformedPoint;
|
| + matrix.mapXY(point.x(), point.y(), &transformedPoint);
|
| + fNamedDestinations.emplace_back(value, transformedPoint);
|
| }
|
| - return false;
|
| }
|
|
|
| -bool SkPDFDevice::handlePathAnnotation(const SkPath& path,
|
| +void SkPDFDevice::handlePathAnnotation(const SkPath& path,
|
| const SkDraw& d,
|
| - SkAnnotation* annotation) {
|
| - SkASSERT(annotation);
|
| + const char key[], SkData* value) {
|
| + if (!value) {
|
| + return;
|
| + }
|
|
|
| SkPath transformedPath = path;
|
| transformedPath.transform(*d.fMatrix);
|
| @@ -1692,24 +1683,15 @@ bool SkPDFDevice::handlePathAnnotation(const SkPath& path,
|
| false);
|
| SkRect transformedRect = SkRect::Make(clip.getBounds());
|
|
|
| - SkData* urlData = annotation->find(SkAnnotationKeys::URL_Key());
|
| - if (urlData) {
|
| + if (!strcmp(SkAnnotationKeys::URL_Key(), key)) {
|
| if (!transformedRect.isEmpty()) {
|
| - fLinkToURLs.emplace_back(transformedRect, urlData);
|
| + fLinkToURLs.emplace_back(transformedRect, value);
|
| }
|
| - return true;
|
| - }
|
| -
|
| - SkData* linkToDestination =
|
| - annotation->find(SkAnnotationKeys::Link_Named_Dest_Key());
|
| - if (linkToDestination) {
|
| + } else if (!strcmp(SkAnnotationKeys::Link_Named_Dest_Key(), key)) {
|
| if (!transformedRect.isEmpty()) {
|
| - fLinkToDestinations.emplace_back(transformedRect, linkToDestination);
|
| + fLinkToDestinations.emplace_back(transformedRect, value);
|
| }
|
| - return true;
|
| }
|
| -
|
| - return false;
|
| }
|
|
|
| void SkPDFDevice::appendAnnotations(SkPDFArray* array) const {
|
|
|