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