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);
37992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
38f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        paint.setColor(0xFFFFFFFF);
39f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        paint.setTextSize(SkIntToScalar(96));
40f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        const char* str = "e";
41f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        canvas.drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
42f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
43f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
44f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    virtual SkISize onISize() {
45c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        return SkISize::Make(WIDTH, HEIGHT);
46f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
47f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
48ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org    void drawClippedBitmap(SkCanvas* canvas, const SkPaint& paint, int x, int y) {
49ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        canvas->save();
50fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
51fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org        canvas->clipRect(SkRect::MakeWH(
52fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org          SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
53fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org        canvas->drawBitmap(fBitmap, 0, 0, &paint);
54ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        canvas->restore();
55ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org    }
56ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org
57f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
58f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        if (!fInitialized) {
59f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org            make_bitmap();
60f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org            fInitialized = true;
61f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        }
627b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        canvas->clear(0xFF101010);
637b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        SkPaint checkPaint;
647b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        checkPaint.setColor(0xFF202020);
657b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        for (int y = 0; y < HEIGHT; y += 16) {
667b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org          for (int x = 0; x < WIDTH; x += 16) {
677b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->save();
687b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
697b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), checkPaint);
707b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), checkPaint);
717b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org            canvas->restore();
727b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org          }
737b734e08430f6b1d147dfa9f0c2c08d88aa7b714senorblanco@chromium.org        }
74f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 pointLocation(0, 0, SkIntToScalar(10));
75f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
76f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));
77f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 distantDirection(SkScalarMul(SkScalarCos(azimuthRad), SkScalarCos(elevationRad)),
78f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org                                  SkScalarMul(SkScalarSin(azimuthRad), SkScalarCos(elevationRad)),
79f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org                                  SkScalarSin(elevationRad));
80f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToScalar(20));
81f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0);
82f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar spotExponent = SK_Scalar1;
83f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar cutoffAngle = SkIntToScalar(15);
84f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar kd = SkIntToScalar(2);
85f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar ks = SkIntToScalar(1);
86f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar shininess = SkIntToScalar(8);
87f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkScalar surfaceScale = SkIntToScalar(1);
88f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkColor white(0xFFFFFFFF);
89f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        SkPaint paint;
904e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
91b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 10, 60, 65));
924e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
934e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        int y = 0;
944e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        for (int i = 0; i < 2; i++) {
95b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org            const SkImageFilter::CropRect* cr = (i == 0) ? NULL : &cropRect;
964e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd, NULL, cr))->unref();
974e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 0, y);
98fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
994e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateDistantLitDiffuse(distantDirection, white, surfaceScale, kd, NULL, cr))->unref();
1004e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 110, y);
101fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1024e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, kd, NULL, cr))->unref();
1034e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 220, y);
1044e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
1054e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            y += 110;
106fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1074e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreatePointLitSpecular(pointLocation, white, surfaceScale, ks, shininess, NULL, cr))->unref();
1084e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 0, y);
109fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1104e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateDistantLitSpecular(distantDirection, white, surfaceScale, ks, shininess, NULL, cr))->unref();
1114e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 110, y);
112fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1134e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, ks, shininess, NULL, cr))->unref();
1144e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            drawClippedBitmap(canvas, paint, 220, y);
115fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org
1164e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org            y += 110;
1174e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        }
118f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
119ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
120f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgprivate:
121f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    typedef GM INHERITED;
122f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkBitmap fBitmap;
123f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    bool fInitialized;
124f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org};
125f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
126f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
127f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
128f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ImageLightingGM; }
129f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
130f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
131f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org}
132