1f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org/*
2f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org * Copyright 2012 Google Inc.
3f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org *
4f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org * found in the LICENSE file.
6f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org */
7f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
8f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#include "gm.h"
9f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#include "SkLightingImageFilter.h"
10f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
11f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#define WIDTH 330
124e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org#define HEIGHT 440
13f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
14f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgnamespace skiagm {
15f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
16f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgclass ImageLightingGM : public GM {
17f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgpublic:
18f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    ImageLightingGM() : fInitialized(false) {
19f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        this->setBGColor(0xFF000000);
20f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
21ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
22f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgprotected:
23a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
24a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
25a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
26a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
27f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    virtual SkString onShortName() {
28f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        return SkString("lighting");
29f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
30f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
31f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    void make_bitmap() {
32eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fBitmap.allocN32Pixels(100, 100);
33c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fBitmap);
34f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        canvas.clear(0x00000000);
35f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPaint paint;
36f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        paint.setAntiAlias(true);
37f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        paint.setColor(0xFFFFFFFF);
38f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        paint.setTextSize(SkIntToScalar(96));
39f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        const char* str = "e";
40f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        canvas.drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
41f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
42f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
43f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    virtual SkISize onISize() {
44c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        return SkISize::Make(WIDTH, HEIGHT);
45f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
46f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
47ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org    void drawClippedBitmap(SkCanvas* canvas, const SkPaint& paint, int x, int y) {
48ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        canvas->save();
49fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
50fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org        canvas->clipRect(SkRect::MakeWH(
51fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org          SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
52fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org        canvas->drawBitmap(fBitmap, 0, 0, &paint);
53ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        canvas->restore();
54ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org    }
55ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org
56f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
57f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        if (!fInitialized) {
58f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org            make_bitmap();
59f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org            fInitialized = true;
60f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        }
617b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        canvas->clear(0xFF101010);
627b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        SkPaint checkPaint;
637b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        checkPaint.setColor(0xFF202020);
647b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        for (int y = 0; y < HEIGHT; y += 16) {
657b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org          for (int x = 0; x < WIDTH; x += 16) {
667b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->save();
677b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
687b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), checkPaint);
697b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), checkPaint);
707b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->restore();
717b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org          }
727b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        }
73f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 pointLocation(0, 0, SkIntToScalar(10));
74f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
75f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));
76f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 distantDirection(SkScalarMul(SkScalarCos(azimuthRad), SkScalarCos(elevationRad)),
77f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org                                  SkScalarMul(SkScalarSin(azimuthRad), SkScalarCos(elevationRad)),
78f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org                                  SkScalarSin(elevationRad));
79f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToScalar(20));
80f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0);
81f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar spotExponent = SK_Scalar1;
82f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar cutoffAngle = SkIntToScalar(15);
83f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar kd = SkIntToScalar(2);
84f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar ks = SkIntToScalar(1);
85f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar shininess = SkIntToScalar(8);
86f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar surfaceScale = SkIntToScalar(1);
87f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkColor white(0xFFFFFFFF);
88f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPaint paint;
894e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
90b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 10, 60, 65));
914e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
924e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        int y = 0;
934e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        for (int i = 0; i < 2; i++) {
94b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org            const SkImageFilter::CropRect* cr = (i == 0) ? NULL : &cropRect;
954e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd, NULL, cr))->unref();
964e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 0, y);
97fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
984e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateDistantLitDiffuse(distantDirection, white, surfaceScale, kd, NULL, cr))->unref();
994e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 110, y);
100fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1014e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, kd, NULL, cr))->unref();
1024e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 220, y);
1034e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
1044e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            y += 110;
105fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1064e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreatePointLitSpecular(pointLocation, white, surfaceScale, ks, shininess, NULL, cr))->unref();
1074e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 0, y);
108fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1094e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateDistantLitSpecular(distantDirection, white, surfaceScale, ks, shininess, NULL, cr))->unref();
1104e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 110, y);
111fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1124e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, ks, shininess, NULL, cr))->unref();
1134e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 220, y);
114fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1154e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            y += 110;
1164e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        }
117f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
118ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
119f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgprivate:
120f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    typedef GM INHERITED;
121f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkBitmap fBitmap;
122f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    bool fInitialized;
123f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org};
124f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
125f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
126f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
127f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ImageLightingGM; }
128f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
129f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
130f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org}
131