1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/* 3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc. 4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file. 7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 8096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "gm.h" 9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkAnnotation.h" 11096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkData.h" 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergernamespace skiagm { 14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/** Draws two rectangles. In output formats that support internal links (PDF), 16096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * clicking the one labeled "Link to A" should take you to the one labeled 17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * "Target A". Note that you'll need to zoom your PDF viewer in a fair bit in 18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * order for the scrolling to not be blocked by the edge of the document. 19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass InternalLinksGM : public GM { 21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic: 22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger InternalLinksGM() { 23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger this->setBGColor(0xFFDDDDDD); 24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprotected: 27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual SkString onShortName() { 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return SkString("internal_links"); 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual SkISize onISize() { 32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return make_isize(700, 500); 33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkAutoTUnref<SkData> name(SkData::NewWithCString("target-a")); 37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->save(); 39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger drawLabeledRect(canvas, "Link to A", 0, 0); 41096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkRect rect = SkRect::MakeXYWH(0, 0, SkIntToScalar(50), SkIntToScalar(20)); 42096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkAnnotateLinkToDestination(canvas, rect, name.get()); 43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->restore(); 44096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 45096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->save(); 46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->translate(SkIntToScalar(200), SkIntToScalar(200)); 47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkPoint point = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(50)); 48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger drawLabeledRect(canvas, "Target A", point.x(), point.y()); 49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkAnnotateNamedDestination(canvas, point, name.get()); 50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->restore(); 51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate: 54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** Draw an arbitrary rectangle at a given location and label it with some 55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * text. */ 56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger void drawLabeledRect(SkCanvas* canvas, const char* text, SkScalar x, SkScalar y) { 57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkPaint paint; 58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger paint.setColor(SK_ColorBLUE); 59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkRect rect = SkRect::MakeXYWH(x, y, 60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkIntToScalar(50), SkIntToScalar(20)); 61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->drawRect(rect, paint); 62096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 63096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger paint.setAntiAlias(true); 64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger paint.setTextSize(SkIntToScalar(25)); 65096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger paint.setColor(SK_ColorBLACK); 66096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger canvas->drawText(text, strlen(text), x, y, paint); 67096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger typedef GM INHERITED; 70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}; 71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 72096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger////////////////////////////////////////////////////////////////////////////// 73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 74096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic GM* MyFactory(void*) { return SkNEW(InternalLinksGM); } 75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic GMRegistry reg(MyFactory); 76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 78