HelloSkiaExample.cpp revision 7fa22f33290e3a1777c781eb059c97d5b674b27a
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 107fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org#include "BaseExample.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#include "SkUnitMappers.h" 177fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 187fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.orgclass HelloSkia : public BaseExample { 197fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org public: 207fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org HelloSkia(void* hWnd, int argc, char** argv) 217fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org : INHERITED(hWnd, argc, argv) 227fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org { 237fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org fBGColor = SK_ColorWHITE; 247fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org fRotationAngle = SkIntToScalar(0); 257fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 267fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org setupBackend(kGPU_DeviceType); 277fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Another option is software rendering: 287fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // setupBackend(kRaster_DeviceType); 297fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org } 307fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 317fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org protected: 327fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org virtual void draw(SkCanvas* canvas) SK_OVERRIDE { 337fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Clear background 347fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->drawColor(fBGColor); 357fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 367fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkPaint paint; 377fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setColor(SK_ColorRED); 387fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 397fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Draw a rectangle with blue paint 407fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkRect rect = { 417fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkIntToScalar(10), SkIntToScalar(10), 427fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkIntToScalar(128), SkIntToScalar(128) 437fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org }; 447fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->drawRect(rect, paint); 457fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 467fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Set up a linear gradient and draw a circle 477fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org { 487fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkPoint linearPoints[] = { 497fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org {SkIntToScalar(0), SkIntToScalar(0)}, 507fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org {SkIntToScalar(300), SkIntToScalar(300)} 517fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org }; 527fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK}; 537fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 547fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkUnitMapper* linearMapper = new SkDiscreteMapper(100); 557fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkAutoUnref lm_deleter(linearMapper); 567fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 577fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkShader* shader = SkGradientShader::CreateLinear( 587fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org linearPoints, linearColors, NULL, 2, 597fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkShader::kMirror_TileMode, linearMapper); 607fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkAutoUnref shader_deleter(shader); 617fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 627fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setShader(shader); 637fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setFlags(SkPaint::kAntiAlias_Flag); 647fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 657fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->drawCircle(SkIntToScalar(200), SkIntToScalar(200), 667fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkIntToScalar(64), paint); 677fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 687fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Detach shader 697fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setShader(NULL); 707fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org } 717fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 727fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 737fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Draw a message with a nice black paint. 747fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setFlags( 757fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkPaint::kAntiAlias_Flag | 767fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkPaint::kSubpixelText_Flag | // ... avoid waggly text when rotating. 777fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkPaint::kUnderlineText_Flag); 787fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setColor(SK_ColorBLACK); 797fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org paint.setTextSize(SkIntToScalar(20)); 807fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 817fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->save(); 827fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 837fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org static const char message[] = "Hello Skia!!!"; 847fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 857fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Translate and rotate 867fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->translate(SkIntToScalar(300), SkIntToScalar(300)); 877fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org fRotationAngle += SkDoubleToScalar(0.2); 887fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org if (fRotationAngle > SkDoubleToScalar(360.0)) { 897fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org fRotationAngle -= SkDoubleToScalar(360.0); 907fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org } 917fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->rotate(fRotationAngle); 927fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 937fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Draw the text: 947fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->drawText(message, strlen(message), SkIntToScalar(0), SkIntToScalar(0), paint); 957fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 967fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org canvas->restore(); 977fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 987fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org // Invalidate the window to force a redraw. Poor man's animation mechanism. 997fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org this->inval(NULL); 1007fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 1017fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org INHERITED::draw(canvas); 1027fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org } 1037fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 1047fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org private: 1057fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkScalar fRotationAngle; 1067fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org SkColor fBGColor; 1077fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org typedef BaseExample INHERITED; 1087fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org}; 1097fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 1107fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.orgSkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) { 1117fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org return new HelloSkia(hwnd, argc, argv); 1127fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org} 1137fa22f33290e3a1777c781eb059c97d5b674b27acommit-bot@chromium.org 114