140eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org/*
240eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org * Copyright 2013 Google Inc.
340eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org *
440eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org * found in the LICENSE file.
640eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org */
740eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
840eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org#include "gm.h"
940eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org#include "SkAlphaThresholdFilter.h"
1040eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org#include "SkRandom.h"
111ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco#include "SkSurface.h"
1240eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
1340eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org#define WIDTH 500
1440eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org#define HEIGHT 500
1540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
161ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanconamespace {
171ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
181ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancovoid draw_rects(SkCanvas* canvas) {
191ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    SkPaint rectPaint;
201ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    rectPaint.setColor(0xFF0000FF);
211ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    canvas->drawRect(SkRect::MakeXYWH(0, 0, WIDTH / 2, HEIGHT / 2), rectPaint);
221ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    rectPaint.setColor(0xBFFF0000);
231ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    canvas->drawRect(SkRect::MakeXYWH(WIDTH / 2, 0, WIDTH / 2, HEIGHT / 2), rectPaint);
241ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    rectPaint.setColor(0x3F00FF00);
251ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    canvas->drawRect(SkRect::MakeXYWH(0, HEIGHT / 2, WIDTH / 2, HEIGHT / 2), rectPaint);
261ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    rectPaint.setColor(0x00000000);
271ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    canvas->drawRect(SkRect::MakeXYWH(WIDTH / 2, HEIGHT / 2, WIDTH / 2, HEIGHT / 2), rectPaint);
281ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco}
291ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
301ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancoSkPaint create_filter_paint() {
311ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    SkIRect rects[2];
321ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    rects[0] = SkIRect::MakeXYWH(0, 150, WIDTH, HEIGHT - 300);
331ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    rects[1] = SkIRect::MakeXYWH(150, 0, WIDTH - 300, HEIGHT);
341ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    SkRegion region;
351ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    region.setRects(rects, 2);
361ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
371ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    SkPaint paint;
381ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    paint.setImageFilter(SkAlphaThresholdFilter::Create(region, 0.2f, 0.7f))->unref();
391ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    return paint;
401ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco}
411ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
421ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco};
431ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
4440eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.orgnamespace skiagm {
4540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
4640eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.orgclass ImageAlphaThresholdGM : public GM {
4740eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.orgpublic:
4840eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org    ImageAlphaThresholdGM() {
4940eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        this->setBGColor(0xFFFFFFFF);
5040eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org    }
5140eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
5240eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.orgprotected:
5340eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
5436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
5540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        return SkString("imagealphathreshold");
5640eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org    }
5740eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
59f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(WIDTH, HEIGHT);
6040eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org    }
6140eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
6340eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        SkMatrix matrix;
6440eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        matrix.reset();
6540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        matrix.setTranslate(WIDTH * .1f, HEIGHT * .1f);
669109e188c77abfd2832767530d33fdec35290a84commit-bot@chromium.org        matrix.postScale(.8f, .8f);
6740eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
6840eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        canvas->concat(matrix);
6940eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
701ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        SkPaint paint = create_filter_paint();
7196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        canvas->saveLayer(nullptr, &paint);
721ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        draw_rects(canvas);
7340eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
7440eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org        canvas->restore();
7540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org    }
7640eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
7740eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.orgprivate:
7840eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org    typedef GM INHERITED;
7940eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org};
8040eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
811ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancoclass ImageAlphaThresholdSurfaceGM : public GM {
821ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancopublic:
831ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    ImageAlphaThresholdSurfaceGM() {
841ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        this->setBGColor(0xFFFFFFFF);
851ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    }
861ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
871ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancoprotected:
881ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    SkString onShortName() override {
891ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        return SkString("imagealphathreshold_surface");
901ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    }
911ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
921ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    SkISize onISize() override {
931ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        return SkISize::Make(WIDTH, HEIGHT);
941ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    }
951ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
961ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    void onDraw(SkCanvas* canvas) override {
971ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        SkImageInfo info = SkImageInfo::MakeN32(WIDTH, HEIGHT, kOpaque_SkAlphaType);
981ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        SkAutoTUnref<SkSurface> surface(canvas->newSurface(info));
991ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        if (nullptr == surface) {
1001ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco            surface.reset(SkSurface::NewRaster(info));
1011ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        }
1021ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        surface->getCanvas()->clear(SK_ColorWHITE);
1031ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        draw_rects(surface->getCanvas());
1041ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
1051ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
1061ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        SkPaint paint = create_filter_paint();
1071ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        canvas->clipRect(SkRect::MakeLTRB(100, 100, WIDTH - 100, HEIGHT - 100));
1081ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco        canvas->drawImage(image, 0, 0, &paint);
1091ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    }
1101ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
1111ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancoprivate:
1121ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco    typedef GM INHERITED;
1131ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco};
1141ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblanco
11540eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
11640eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
1171ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancoDEF_GM(return new ImageAlphaThresholdGM();)
1181ea67a31c527f4d5d77c59a3ea3a12e39308e8c5senorblancoDEF_GM(return new ImageAlphaThresholdSurfaceGM();)
11940eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org
12040eb3c100095c8573ddfdc553794b3182d7b18d1commit-bot@chromium.org}
121