1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkAnnotation.h" 9cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkData.h" 13cb93a386Sopenharmony_ci#include "include/core/SkDocument.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 16cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 17cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 18cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 19cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 20cb93a386Sopenharmony_ci#include "include/docs/SkPDFDocument.h" 21cb93a386Sopenharmony_ci#include "tests/Test.h" 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci#include <string.h> 24cb93a386Sopenharmony_ci#include <memory> 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci/** Returns true if data (may contain null characters) contains needle (null 27cb93a386Sopenharmony_ci * terminated). */ 28cb93a386Sopenharmony_cistatic bool ContainsString(const char* data, size_t dataSize, const char* needle) { 29cb93a386Sopenharmony_ci size_t nSize = strlen(needle); 30cb93a386Sopenharmony_ci for (size_t i = 0; i < dataSize - nSize; i++) { 31cb93a386Sopenharmony_ci if (strncmp(&data[i], needle, nSize) == 0) { 32cb93a386Sopenharmony_ci return true; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci return false; 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ciDEF_TEST(Annotation_NoDraw, reporter) { 39cb93a386Sopenharmony_ci SkBitmap bm; 40cb93a386Sopenharmony_ci bm.allocN32Pixels(10, 10); 41cb93a386Sopenharmony_ci bm.eraseColor(SK_ColorTRANSPARENT); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci SkCanvas canvas(bm); 44cb93a386Sopenharmony_ci SkRect r = SkRect::MakeWH(SkIntToScalar(10), SkIntToScalar(10)); 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci sk_sp<SkData> data(SkData::MakeWithCString("http://www.gooogle.com")); 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 0 == *bm.getAddr32(0, 0)); 49cb93a386Sopenharmony_ci SkAnnotateRectWithURL(&canvas, r, data.get()); 50cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 0 == *bm.getAddr32(0, 0)); 51cb93a386Sopenharmony_ci} 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ciDEF_TEST(Annotation_PdfLink, reporter) { 54cb93a386Sopenharmony_ci REQUIRE_PDF_DOCUMENT(Annotation_PdfLink, reporter); 55cb93a386Sopenharmony_ci SkDynamicMemoryWStream outStream; 56cb93a386Sopenharmony_ci auto doc = SkPDF::MakeDocument(&outStream); 57cb93a386Sopenharmony_ci SkCanvas* canvas = doc->beginPage(612.0f, 792.0f); 58cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, canvas); 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci SkRect r = SkRect::MakeXYWH(SkIntToScalar(72), SkIntToScalar(72), 61cb93a386Sopenharmony_ci SkIntToScalar(288), SkIntToScalar(72)); 62cb93a386Sopenharmony_ci sk_sp<SkData> data(SkData::MakeWithCString("http://www.gooogle.com")); 63cb93a386Sopenharmony_ci SkAnnotateRectWithURL(canvas, r, data.get()); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci doc->close(); 66cb93a386Sopenharmony_ci sk_sp<SkData> out = outStream.detachAsData(); 67cb93a386Sopenharmony_ci const char* rawOutput = (const char*)out->data(); 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, ContainsString(rawOutput, out->size(), "/Annots ")); 70cb93a386Sopenharmony_ci} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciDEF_TEST(Annotation_PdfDefineNamedDestination, reporter) { 73cb93a386Sopenharmony_ci REQUIRE_PDF_DOCUMENT(Annotation_PdfNamedDestination, reporter); 74cb93a386Sopenharmony_ci SkDynamicMemoryWStream outStream; 75cb93a386Sopenharmony_ci auto doc = SkPDF::MakeDocument(&outStream); 76cb93a386Sopenharmony_ci SkCanvas* canvas = doc->beginPage(612.0f, 792.0f); 77cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, canvas); 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci SkPoint p = SkPoint::Make(SkIntToScalar(72), SkIntToScalar(72)); 80cb93a386Sopenharmony_ci sk_sp<SkData> data(SkData::MakeWithCString("example")); 81cb93a386Sopenharmony_ci SkAnnotateNamedDestination(canvas, p, data.get()); 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci doc->close(); 84cb93a386Sopenharmony_ci sk_sp<SkData> out = outStream.detachAsData(); 85cb93a386Sopenharmony_ci const char* rawOutput = (const char*)out->data(); 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 88cb93a386Sopenharmony_ci ContainsString(rawOutput, out->size(), "/example ")); 89cb93a386Sopenharmony_ci} 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci#if defined(SK_XML) 92cb93a386Sopenharmony_ci #include "include/svg/SkSVGCanvas.h" 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci DEF_TEST(Annotation_SvgLink, reporter) { 95cb93a386Sopenharmony_ci SkDynamicMemoryWStream outStream; 96cb93a386Sopenharmony_ci SkRect bounds = SkRect::MakeIWH(400, 400); 97cb93a386Sopenharmony_ci std::unique_ptr<SkCanvas> canvas = SkSVGCanvas::Make(bounds, &outStream); 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci SkRect r = SkRect::MakeXYWH(SkIntToScalar(72), SkIntToScalar(72), SkIntToScalar(288), 100cb93a386Sopenharmony_ci SkIntToScalar(72)); 101cb93a386Sopenharmony_ci sk_sp<SkData> data(SkData::MakeWithCString("http://www.gooogle.com")); 102cb93a386Sopenharmony_ci SkAnnotateRectWithURL(canvas.get(), r, data.get()); 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci sk_sp<SkData> out = outStream.detachAsData(); 105cb93a386Sopenharmony_ci const char* rawOutput = (const char*)out->data(); 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 108cb93a386Sopenharmony_ci ContainsString(rawOutput, out->size(), "a xlink:href=\"http://www.gooogle.com\"")); 109cb93a386Sopenharmony_ci } 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci DEF_TEST(Annotation_SvgLinkNamedDestination, reporter) { 112cb93a386Sopenharmony_ci SkDynamicMemoryWStream outStream; 113cb93a386Sopenharmony_ci SkRect bounds = SkRect::MakeIWH(400, 400); 114cb93a386Sopenharmony_ci std::unique_ptr<SkCanvas> canvas = SkSVGCanvas::Make(bounds, &outStream); 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci SkRect r = SkRect::MakeXYWH(SkIntToScalar(72), SkIntToScalar(72), SkIntToScalar(288), 117cb93a386Sopenharmony_ci SkIntToScalar(72)); 118cb93a386Sopenharmony_ci sk_sp<SkData> data(SkData::MakeWithCString("http://www.gooogle.com/#NamedDestination")); 119cb93a386Sopenharmony_ci SkAnnotateLinkToDestination(canvas.get(), r, data.get()); 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci sk_sp<SkData> out = outStream.detachAsData(); 122cb93a386Sopenharmony_ci const char* rawOutput = (const char*)out->data(); 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 125cb93a386Sopenharmony_ci ContainsString(rawOutput, out->size(), 126cb93a386Sopenharmony_ci "a xlink:href=\"http://www.gooogle.com/#NamedDestination\"")); 127cb93a386Sopenharmony_ci } 128cb93a386Sopenharmony_ci#endif 129