| epoger@google.com | b58772f | 2013-03-08 09:09:10 +0000 | [diff] [blame] | 1 |  | 
 | 2 | /* | 
 | 3 |  * Copyright 2013 Google Inc. | 
 | 4 |  * | 
 | 5 |  * Use of this source code is governed by a BSD-style license that can be | 
 | 6 |  * found in the LICENSE file. | 
 | 7 |  */ | 
 | 8 | #include "gm.h" | 
 | 9 |  | 
 | 10 | #include "SkAnnotation.h" | 
 | 11 | #include "SkData.h" | 
 | 12 |  | 
 | 13 | namespace skiagm { | 
 | 14 |  | 
 | 15 | /** Draws two rectangles. In output formats that support internal links (PDF), | 
 | 16 |  *  clicking the one labeled "Link to A" should take you to the one labeled | 
 | 17 |  *  "Target A". Note that you'll need to zoom your PDF viewer in a fair bit in | 
 | 18 |  *  order for the scrolling to not be blocked by the edge of the document. | 
 | 19 |  */ | 
 | 20 | class InternalLinksGM : public GM { | 
 | 21 | public: | 
 | 22 |     InternalLinksGM() { | 
| caryclark | 65cdba6 | 2015-06-15 06:51:08 -0700 | [diff] [blame] | 23 |         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); | 
| epoger@google.com | b58772f | 2013-03-08 09:09:10 +0000 | [diff] [blame] | 24 |     } | 
 | 25 |  | 
 | 26 | protected: | 
 | 27 |     virtual SkString onShortName() { | 
 | 28 |         return SkString("internal_links"); | 
 | 29 |     } | 
 | 30 |  | 
 | 31 |     virtual SkISize onISize() { | 
| tfarina | f539318 | 2014-06-09 23:59:03 -0700 | [diff] [blame] | 32 |         return SkISize::Make(700, 500); | 
| epoger@google.com | b58772f | 2013-03-08 09:09:10 +0000 | [diff] [blame] | 33 |     } | 
 | 34 |  | 
 | 35 |     virtual void onDraw(SkCanvas* canvas) { | 
 | 36 |         SkAutoTUnref<SkData> name(SkData::NewWithCString("target-a")); | 
 | 37 |  | 
 | 38 |         canvas->save(); | 
 | 39 |         canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); | 
 | 40 |         drawLabeledRect(canvas, "Link to A", 0, 0); | 
 | 41 |         SkRect rect = SkRect::MakeXYWH(0, 0, SkIntToScalar(50), SkIntToScalar(20)); | 
 | 42 |         SkAnnotateLinkToDestination(canvas, rect, name.get()); | 
 | 43 |         canvas->restore(); | 
 | 44 |  | 
 | 45 |         canvas->save(); | 
 | 46 |         canvas->translate(SkIntToScalar(200), SkIntToScalar(200)); | 
 | 47 |         SkPoint point = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(50)); | 
 | 48 |         drawLabeledRect(canvas, "Target A", point.x(), point.y()); | 
 | 49 |         SkAnnotateNamedDestination(canvas, point, name.get()); | 
 | 50 |         canvas->restore(); | 
 | 51 |     } | 
 | 52 |  | 
| epoger@google.com | b58772f | 2013-03-08 09:09:10 +0000 | [diff] [blame] | 53 | private: | 
 | 54 |     /** Draw an arbitrary rectangle at a given location and label it with some | 
 | 55 |      *  text. */ | 
 | 56 |     void drawLabeledRect(SkCanvas* canvas, const char* text, SkScalar x, SkScalar y) { | 
 | 57 |         SkPaint paint; | 
 | 58 |         paint.setColor(SK_ColorBLUE); | 
 | 59 |         SkRect rect = SkRect::MakeXYWH(x, y, | 
 | 60 |                                        SkIntToScalar(50), SkIntToScalar(20)); | 
 | 61 |         canvas->drawRect(rect, paint); | 
 | 62 |  | 
 | 63 |         paint.setAntiAlias(true); | 
| caryclark | 1818acb | 2015-07-24 12:09:25 -0700 | [diff] [blame] | 64 |         sk_tool_utils::set_portable_typeface(&paint); | 
| epoger@google.com | b58772f | 2013-03-08 09:09:10 +0000 | [diff] [blame] | 65 |         paint.setTextSize(SkIntToScalar(25)); | 
 | 66 |         paint.setColor(SK_ColorBLACK); | 
 | 67 |         canvas->drawText(text, strlen(text), x, y, paint); | 
 | 68 |     } | 
 | 69 |  | 
 | 70 |     typedef GM INHERITED; | 
 | 71 | }; | 
 | 72 |  | 
 | 73 | ////////////////////////////////////////////////////////////////////////////// | 
 | 74 |  | 
 | 75 | static GM* MyFactory(void*) { return SkNEW(InternalLinksGM); } | 
 | 76 | static GMRegistry reg(MyFactory); | 
 | 77 |  | 
 | 78 | } |