1b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com/*
2b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com * Copyright 2012 Google Inc.
3b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com *
4b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com * Use of this source code is governed by a BSD-style license that can be
5b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com * found in the LICENSE file.
6b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com */
7b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
8b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com#include "SkAnnotation.h"
94979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com#include "SkData.h"
102880df2609eba09b555ca37be04b6ad89290c765Tom Hudson#include "SkPaint.h"
112880df2609eba09b555ca37be04b6ad89290c765Tom Hudson#include "SkPoint.h"
128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h"
138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h"
14b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
15950923b43761c10d9c8ffc1dfc0c878100d1e702commit-bot@chromium.orgSkAnnotation::SkAnnotation(const char key[], SkData* value) : fKey(key) {
162880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    if (nullptr == value) {
174979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com        value = SkData::NewEmpty();
18b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    } else {
194979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com        value->ref();
20b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    }
214979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com    fData = value;
22b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com}
23b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
24b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.comSkAnnotation::~SkAnnotation() {
254979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com    fData->unref();
26b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com}
27b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
284979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.comSkData* SkAnnotation::find(const char key[]) const {
292880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    return fKey.equals(key) ? fData : nullptr;
30238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org}
31238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org
328b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgSkAnnotation::SkAnnotation(SkReadBuffer& buffer) {
334979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com    buffer.readString(&fKey);
344979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com    fData = buffer.readByteArrayAsData();
35b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com}
36b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
378b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkAnnotation::writeToBuffer(SkWriteBuffer& buffer) const {
384979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com    buffer.writeString(fKey.c_str());
394979f32cd3fd29db5f23712f0aea3cf01a5c695dreed@google.com    buffer.writeDataAsByteArray(fData);
40b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com}
41b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
42b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.comconst char* SkAnnotationKeys::URL_Key() {
43b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    return "SkAnnotationKey_URL";
44b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com};
45b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
46b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comconst char* SkAnnotationKeys::Define_Named_Dest_Key() {
47b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    return "SkAnnotationKey_Define_Named_Dest";
48b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com};
49b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
50b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comconst char* SkAnnotationKeys::Link_Named_Dest_Key() {
51b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    return "SkAnnotationKey_Link_Named_Dest";
52b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com};
53b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
54b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com///////////////////////////////////////////////////////////////////////////////
55b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
56b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com#include "SkCanvas.h"
57b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
58b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comstatic void annotate_paint(SkPaint& paint, const char* key, SkData* value) {
59d957984c1efbd18f3b2bbeca78d282837c5a2ae1commit-bot@chromium.org    paint.setAnnotation(SkAnnotation::Create(key, value))->unref();
60b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com}
61812b6f59fafc213260a56a4a4264ebf23646f662epoger@google.com
62b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comvoid SkAnnotateRectWithURL(SkCanvas* canvas, const SkRect& rect, SkData* value) {
632880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    if (nullptr == value) {
64b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        return;
65b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    }
66b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkPaint paint;
67b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    annotate_paint(paint, SkAnnotationKeys::URL_Key(), value);
68b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    canvas->drawRect(rect, paint);
69b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com}
70b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
71b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comvoid SkAnnotateNamedDestination(SkCanvas* canvas, const SkPoint& point, SkData* name) {
722880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    if (nullptr == name) {
73b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        return;
74b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    }
75b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkPaint paint;
76b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    annotate_paint(paint, SkAnnotationKeys::Define_Named_Dest_Key(), name);
77b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    canvas->drawPoint(point.x(), point.y(), paint);
78b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com}
79b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
80b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comvoid SkAnnotateLinkToDestination(SkCanvas* canvas, const SkRect& rect, SkData* name) {
812880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    if (nullptr == name) {
82b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        return;
83b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    }
84b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkPaint paint;
85b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    annotate_paint(paint, SkAnnotationKeys::Link_Named_Dest_Key(), name);
86b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    canvas->drawRect(rect, paint);
87b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com}
88