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