11a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org/*
21a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * Copyright 2013 Google Inc.
31a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org *
41a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
51a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org * found in the LICENSE file.
61a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org */
71a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
81a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#include "gm.h"
91a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#include "SkOffsetImageFilter.h"
101a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#include "SkBitmapSource.h"
111a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
12e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org#define WIDTH 600
131a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#define HEIGHT 100
141a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org#define MARGIN 12
151a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
161a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgnamespace skiagm {
171a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
181a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgclass OffsetImageFilterGM : public GM {
191a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgpublic:
201a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    OffsetImageFilterGM() : fInitialized(false) {
211a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        this->setBGColor(0xFF000000);
221a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
231a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
241a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgprotected:
251a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    virtual SkString onShortName() {
261a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        return SkString("offsetimagefilter");
271a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
281a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
291a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    void make_bitmap() {
30eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com        fBitmap.allocN32Pixels(80, 80);
31c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fBitmap);
321a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        canvas.clear(0x00000000);
331a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        SkPaint paint;
341a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        paint.setAntiAlias(true);
35992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
361a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        paint.setColor(0xD000D000);
371a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        paint.setTextSize(SkIntToScalar(96));
381a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        const char* str = "e";
391a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
401a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
411a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
421a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    void make_checkerboard() {
43c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        fCheckerboard.allocN32Pixels(80, 80);
44c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fCheckerboard);
451a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        canvas.clear(0x00000000);
461a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        SkPaint darkPaint;
471a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        darkPaint.setColor(0xFF404040);
481a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        SkPaint lightPaint;
491a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        lightPaint.setColor(0xFFA0A0A0);
501a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        for (int y = 0; y < 80; y += 16) {
511a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org          for (int x = 0; x < 80; x += 16) {
521a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.save();
531a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
541a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
551a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
561a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
571a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
581a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            canvas.restore();
591a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org          }
601a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
611a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
621a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
631a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    virtual SkISize onISize() {
64f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(WIDTH, HEIGHT);
651a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
661a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
67e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org    void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint, SkScalar scale, const SkIRect& cropRect) {
681a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        canvas->save();
69e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        SkRect clipRect = SkRect::MakeWH(
70e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org            SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()));
71e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        canvas->clipRect(clipRect);
72e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        canvas->scale(scale, scale);
736776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org        canvas->drawBitmap(bitmap, 0, 0, &paint);
741a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        canvas->restore();
75e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        SkPaint strokePaint;
76e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        strokePaint.setStyle(SkPaint::kStroke_Style);
77e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        strokePaint.setColor(SK_ColorRED);
78e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org
79e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        // Draw a boundary rect around the intersection of the clip rect
80e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        // and crop rect.
81e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        SkMatrix scaleMatrix;
82e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        scaleMatrix.setScale(scale, scale);
83e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        SkRect cropRectFloat;
84e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        scaleMatrix.mapRect(&cropRectFloat, SkRect::Make(cropRect));
85e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        clipRect.intersect(cropRectFloat);
86e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        canvas->drawRect(clipRect, strokePaint);
871a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
881a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
891a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
901a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        if (!fInitialized) {
911a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            make_bitmap();
921a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            make_checkerboard();
931a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            fInitialized = true;
941a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
951a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        canvas->clear(0x00000000);
961a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        SkPaint paint;
971a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
987fa2a65c0cfc714364490cb715171461143024e0reed@google.com        for (int i = 0; i < 4; i++) {
991a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap;
1006776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org            SkIRect cropRect = SkIRect::MakeXYWH(i * 12,
1016776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org                                                 i * 8,
1021a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                 bitmap->width() - i * 8,
1031a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org                                                 bitmap->height() - i * 12);
104b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org            SkImageFilter::CropRect rect(SkRect::Make(cropRect));
105cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap));
1061a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            SkScalar dx = SkIntToScalar(i*5);
1071a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            SkScalar dy = SkIntToScalar(i*10);
108cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkAutoTUnref<SkImageFilter> filter(
109cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                SkOffsetImageFilter::Create(dx, dy, tileInput, &rect));
1101a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org            paint.setImageFilter(filter);
111e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org            drawClippedBitmap(canvas, *bitmap, paint, SK_Scalar1, cropRect);
112e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org            canvas->translate(SkIntToScalar(bitmap->width() + MARGIN), 0);
1131a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org        }
114e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org
115e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100);
116e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        SkImageFilter::CropRect rect(SkRect::Make(cropRect));
117cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> filter(
118cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkOffsetImageFilter::Create(SkIntToScalar(-5), SkIntToScalar(-10), NULL, &rect));
119e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        paint.setImageFilter(filter);
120e09244d463695cd9d2b089794ca18f59f1e4a621senorblanco@chromium.org        drawClippedBitmap(canvas, fBitmap, paint, SkIntToScalar(2), cropRect);
1211a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    }
1221a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgprivate:
1231a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    typedef GM INHERITED;
1241a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    SkBitmap fBitmap, fCheckerboard;
1251a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org    bool fInitialized;
1261a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org};
1271a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
1281a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
1291a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
1301a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgstatic GM* MyFactory(void*) { return new OffsetImageFilterGM; }
1311a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.orgstatic GMRegistry reg(MyFactory);
1321a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org
1331a4fb70c8a04db2d92ec821555f91218a989031dcommit-bot@chromium.org}
134