1b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
2b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com/*
3b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com * Copyright 2011 Google Inc.
4b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com *
5b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com * Use of this source code is governed by a BSD-style license that can be
6b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com * found in the LICENSE file.
7b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com */
8b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com#include "SkAnnotation.h"
9b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com#include "SkCanvas.h"
108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkData.h"
11238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org#include "SkPDFDevice.h"
12238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org#include "SkPDFDocument.h"
138f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
14b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
15b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com/** Returns true if data (may contain null characters) contains needle (null
16b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com *  terminated). */
17b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.comstatic bool ContainsString(const char* data, size_t dataSize, const char* needle) {
18b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    size_t nSize = strlen(needle);
19b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    for (size_t i = 0; i < dataSize - nSize; i++) {
20b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        if (strncmp(&data[i], needle, nSize) == 0) {
21b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com            return true;
22b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        }
23b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    }
24b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    return false;
25b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com}
26b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
27e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Annotation_NoDraw, reporter) {
28b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    SkBitmap bm;
29fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    bm.allocN32Pixels(10, 10);
30dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm.eraseColor(SK_ColorTRANSPARENT);
31b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
32b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    SkCanvas canvas(bm);
33b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    SkRect r = SkRect::MakeWH(SkIntToScalar(10), SkIntToScalar(10));
34b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
35b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    SkAutoDataUnref data(SkData::NewWithCString("http://www.gooogle.com"));
36b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
37b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    REPORTER_ASSERT(reporter, 0 == *bm.getAddr32(0, 0));
38b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    SkAnnotateRectWithURL(&canvas, r, data.get());
39b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com    REPORTER_ASSERT(reporter, 0 == *bm.getAddr32(0, 0));
40b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com}
41b0a34d80c5c7b06db8083a547f8e499781a9c169reed@google.com
42238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.orgstruct testCase {
43238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkPDFDocument::Flags flags;
44238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    bool expectAnnotations;
45238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org};
46238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org
47e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Annotation_PdfLink, reporter) {
48238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkISize size = SkISize::Make(612, 792);
49238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkMatrix initialTransform;
50238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    initialTransform.reset();
51238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkPDFDevice device(size, size, initialTransform);
52238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkCanvas canvas(&device);
53238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org
54238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkRect r = SkRect::MakeXYWH(SkIntToScalar(72), SkIntToScalar(72),
55238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org                                SkIntToScalar(288), SkIntToScalar(72));
56238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkAutoDataUnref data(SkData::NewWithCString("http://www.gooogle.com"));
57238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    SkAnnotateRectWithURL(&canvas, r, data.get());
58238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org
59238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    testCase tests[] = {{(SkPDFDocument::Flags)0, true},
60238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org                        {SkPDFDocument::kNoLinks_Flags, false}};
61238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    for (size_t testNum = 0; testNum < SK_ARRAY_COUNT(tests); testNum++) {
62238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org        SkPDFDocument doc(tests[testNum].flags);
63238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org        doc.appendPage(&device);
64238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org        SkDynamicMemoryWStream outStream;
65238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org        doc.emitPDF(&outStream);
66238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org        SkAutoDataUnref out(outStream.copyToData());
67238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org        const char* rawOutput = (const char*)out->data();
68238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org
69b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        REPORTER_ASSERT(reporter,
70b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com            ContainsString(rawOutput, out->size(), "/Annots ")
71b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com            == tests[testNum].expectAnnotations);
72238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org    }
73238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org}
74238be8c7e5de5a83517440a3db7f7965b47fb010vandebo@chromium.org
75e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Annotation_NamedDestination, reporter) {
76b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkISize size = SkISize::Make(612, 792);
77b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkMatrix initialTransform;
78b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    initialTransform.reset();
79b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkPDFDevice device(size, size, initialTransform);
80b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkCanvas canvas(&device);
81b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
82b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkPoint p = SkPoint::Make(SkIntToScalar(72), SkIntToScalar(72));
83b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkAutoDataUnref data(SkData::NewWithCString("example"));
84b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkAnnotateNamedDestination(&canvas, p, data.get());
85b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
86b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkPDFDocument doc;
87b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    doc.appendPage(&device);
88b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkDynamicMemoryWStream outStream;
89b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    doc.emitPDF(&outStream);
90b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    SkAutoDataUnref out(outStream.copyToData());
91b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    const char* rawOutput = (const char*)out->data();
92b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com
93b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com    REPORTER_ASSERT(reporter,
94b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com        ContainsString(rawOutput, out->size(), "/example "));
95b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com}
96