1 /*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkAnnotation.h"
9 #include "SkData.h"
10 #include "SkFlattenableBuffers.h"
11 #include "SkPoint.h"
12 #include "SkStream.h"
13
SkAnnotation(const char key[],SkData * value)14 SkAnnotation::SkAnnotation(const char key[], SkData* value) : fKey(key) {
15 if (NULL == value) {
16 value = SkData::NewEmpty();
17 } else {
18 value->ref();
19 }
20 fData = value;
21 }
22
~SkAnnotation()23 SkAnnotation::~SkAnnotation() {
24 fData->unref();
25 }
26
find(const char key[]) const27 SkData* SkAnnotation::find(const char key[]) const {
28 return fKey.equals(key) ? fData : NULL;
29 }
30
SkAnnotation(SkFlattenableReadBuffer & buffer)31 SkAnnotation::SkAnnotation(SkFlattenableReadBuffer& buffer) {
32 buffer.readString(&fKey);
33 fData = buffer.readByteArrayAsData();
34 }
35
writeToBuffer(SkFlattenableWriteBuffer & buffer) const36 void SkAnnotation::writeToBuffer(SkFlattenableWriteBuffer& buffer) const {
37 buffer.writeString(fKey.c_str());
38 buffer.writeDataAsByteArray(fData);
39 }
40
URL_Key()41 const char* SkAnnotationKeys::URL_Key() {
42 return "SkAnnotationKey_URL";
43 };
44
Define_Named_Dest_Key()45 const char* SkAnnotationKeys::Define_Named_Dest_Key() {
46 return "SkAnnotationKey_Define_Named_Dest";
47 };
48
Link_Named_Dest_Key()49 const char* SkAnnotationKeys::Link_Named_Dest_Key() {
50 return "SkAnnotationKey_Link_Named_Dest";
51 };
52
53 ///////////////////////////////////////////////////////////////////////////////
54
55 #include "SkCanvas.h"
56
annotate_paint(SkPaint & paint,const char * key,SkData * value)57 static void annotate_paint(SkPaint& paint, const char* key, SkData* value) {
58 paint.setAnnotation(SkNEW_ARGS(SkAnnotation, (key, value)))->unref();
59 }
60
SkAnnotateRectWithURL(SkCanvas * canvas,const SkRect & rect,SkData * value)61 void SkAnnotateRectWithURL(SkCanvas* canvas, const SkRect& rect, SkData* value) {
62 if (NULL == value) {
63 return;
64 }
65 SkPaint paint;
66 annotate_paint(paint, SkAnnotationKeys::URL_Key(), value);
67 canvas->drawRect(rect, paint);
68 }
69
SkAnnotateNamedDestination(SkCanvas * canvas,const SkPoint & point,SkData * name)70 void SkAnnotateNamedDestination(SkCanvas* canvas, const SkPoint& point, SkData* name) {
71 if (NULL == name) {
72 return;
73 }
74 SkPaint paint;
75 annotate_paint(paint, SkAnnotationKeys::Define_Named_Dest_Key(), name);
76 canvas->drawPoint(point.x(), point.y(), paint);
77 }
78
SkAnnotateLinkToDestination(SkCanvas * canvas,const SkRect & rect,SkData * name)79 void SkAnnotateLinkToDestination(SkCanvas* canvas, const SkRect& rect, SkData* name) {
80 if (NULL == name) {
81 return;
82 }
83 SkPaint paint;
84 annotate_paint(paint, SkAnnotationKeys::Link_Named_Dest_Key(), name);
85 canvas->drawRect(rect, paint);
86 }
87