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