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