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 "SkReadBuffer.h"
11#include "SkWriteBuffer.h"
12#include "SkPoint.h"
13#include "SkStream.h"
14
15SkAnnotation::SkAnnotation(const char key[], SkData* value) : fKey(key) {
16    if (NULL == value) {
17        value = SkData::NewEmpty();
18    } else {
19        value->ref();
20    }
21    fData = value;
22}
23
24SkAnnotation::~SkAnnotation() {
25    fData->unref();
26}
27
28SkData* SkAnnotation::find(const char key[]) const {
29    return fKey.equals(key) ? fData : NULL;
30}
31
32SkAnnotation::SkAnnotation(SkReadBuffer& buffer) {
33    buffer.readString(&fKey);
34    fData = buffer.readByteArrayAsData();
35}
36
37void SkAnnotation::writeToBuffer(SkWriteBuffer& buffer) const {
38    buffer.writeString(fKey.c_str());
39    buffer.writeDataAsByteArray(fData);
40}
41
42const char* SkAnnotationKeys::URL_Key() {
43    return "SkAnnotationKey_URL";
44};
45
46const char* SkAnnotationKeys::Define_Named_Dest_Key() {
47    return "SkAnnotationKey_Define_Named_Dest";
48};
49
50const char* SkAnnotationKeys::Link_Named_Dest_Key() {
51    return "SkAnnotationKey_Link_Named_Dest";
52};
53
54///////////////////////////////////////////////////////////////////////////////
55
56#include "SkCanvas.h"
57
58static void annotate_paint(SkPaint& paint, const char* key, SkData* value) {
59    paint.setAnnotation(SkAnnotation::Create(key, value))->unref();
60}
61
62void SkAnnotateRectWithURL(SkCanvas* canvas, const SkRect& rect, SkData* value) {
63    if (NULL == value) {
64        return;
65    }
66    SkPaint paint;
67    annotate_paint(paint, SkAnnotationKeys::URL_Key(), value);
68    canvas->drawRect(rect, paint);
69}
70
71void SkAnnotateNamedDestination(SkCanvas* canvas, const SkPoint& point, SkData* name) {
72    if (NULL == name) {
73        return;
74    }
75    SkPaint paint;
76    annotate_paint(paint, SkAnnotationKeys::Define_Named_Dest_Key(), name);
77    canvas->drawPoint(point.x(), point.y(), paint);
78}
79
80void SkAnnotateLinkToDestination(SkCanvas* canvas, const SkRect& rect, SkData* name) {
81    if (NULL == name) {
82        return;
83    }
84    SkPaint paint;
85    annotate_paint(paint, SkAnnotationKeys::Link_Named_Dest_Key(), name);
86    canvas->drawRect(rect, paint);
87}
88