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