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