17fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org/*
27fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org * Copyright 2013 Google Inc.
37fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org *
47fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org *
57fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
67fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org * found in the LICENSE file.
77fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org *
87fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org */
97fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
1043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com#include "SkExample.h"
117fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
127fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org#include "SkApplication.h"
137fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org#include "SkDraw.h"
147fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org#include "SkGradientShader.h"
157fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org#include "SkGraphics.h"
167fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
1743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.comclass HelloSkia : public SkExample {
1843f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.compublic:
1943f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    HelloSkia(SkExampleWindow* window) : SkExample(window) {
2043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        fName = "HelloSkia";
2143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        fBGColor = SK_ColorWHITE;
2243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        fRotationAngle = SkIntToScalar(0);
237fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
2443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        fWindow->setupBackend(SkExampleWindow::kGPU_DeviceType);
2543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Another option is software rendering:
26ab9d30cb01d0c8401537dc115aba2842b0f4f27fcommit-bot@chromium.org        // fWindow->setupBackend(SkExampleWindow::kRaster_DeviceType);
2743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    }
287fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
2943f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.comprotected:
3043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    void draw(SkCanvas* canvas) {
3143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Clear background
3243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->drawColor(fBGColor);
337fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
3443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        SkPaint paint;
3543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        paint.setColor(SK_ColorRED);
367fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
3743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Draw a rectangle with blue paint
3843f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        SkRect rect = {
397fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org                SkIntToScalar(10), SkIntToScalar(10),
407fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org                SkIntToScalar(128), SkIntToScalar(128)
4143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        };
4243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->drawRect(rect, paint);
437fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
4443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Set up a linear gradient and draw a circle
4543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        {
4643f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            SkPoint linearPoints[] = {
477fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org                    {SkIntToScalar(0), SkIntToScalar(0)},
487fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org                    {SkIntToScalar(300), SkIntToScalar(300)}
4943f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            };
5043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK};
517fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
5243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            SkShader* shader = SkGradientShader::CreateLinear(
5343f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com                    linearPoints, linearColors, NULL, 2,
5483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                    SkShader::kMirror_TileMode);
5543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            SkAutoUnref shader_deleter(shader);
567fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
5743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            paint.setShader(shader);
5843f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            paint.setFlags(SkPaint::kAntiAlias_Flag);
597fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
6043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            canvas->drawCircle(SkIntToScalar(200), SkIntToScalar(200),
6143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com                    SkIntToScalar(64), paint);
627fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
6343f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            // Detach shader
6443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            paint.setShader(NULL);
6543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        }
667fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
6743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Draw a message with a nice black paint.
6843f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        paint.setFlags(
6943f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com                SkPaint::kAntiAlias_Flag |
7043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com                SkPaint::kSubpixelText_Flag |  // ... avoid waggly text when rotating.
7143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com                SkPaint::kUnderlineText_Flag);
7243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        paint.setColor(SK_ColorBLACK);
7343f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        paint.setTextSize(SkIntToScalar(20));
747fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
7543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->save();
767fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
7743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        static const char message[] = "Hello Skia!!!";
787fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
7943f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Translate and rotate
8043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->translate(SkIntToScalar(300), SkIntToScalar(300));
8143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        fRotationAngle += SkDoubleToScalar(0.2);
8243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        if (fRotationAngle > SkDoubleToScalar(360.0)) {
8343f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com            fRotationAngle -= SkDoubleToScalar(360.0);
8443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        }
8543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->rotate(fRotationAngle);
867fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
8743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Draw the text:
8843f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->drawText(message, strlen(message), SkIntToScalar(0), SkIntToScalar(0), paint);
897fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
9043f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        canvas->restore();
917fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
9243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        // Invalidate the window to force a redraw. Poor man's animation mechanism.
9343f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com        this->fWindow->inval(NULL);
9443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    }
957fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
9643f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.comprivate:
9743f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    SkScalar fRotationAngle;
9843f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    SkColor fBGColor;
997fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org};
1007fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org
10143f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.comstatic SkExample* MyFactory(SkExampleWindow* window) {
10243f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com    return new HelloSkia(window);
1037fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org}
10443f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com
10543f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.com// Register this class as a Skia Example.
10643f2b2c833d7c7db200dd02077f0d47d5d7f209asglez@google.comSkExample::Registry registry(MyFactory);
107