1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlurImageFilter.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilter.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilterImageFilter.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDropShadowImageFilter.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_bounds(SkCanvas* canvas, const SkIRect& subset, const SkIRect& clip) { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIRect rects[] { subset, clip }; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[] { SK_ColorRED, SK_ColorBLUE }; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStyle(SkPaint::kStroke_Style); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 0; i < SK_ARRAY_COUNT(rects); ++i) { 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colors[i]); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(SkRect::Make(rects[i]), paint); 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// In this GM, we're going to feed the inner portion of a 100x100 checkboard 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// (i.e., strip off a 25-wide border) through the makeWithFilter method. 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// We'll then draw the appropriate subset of the result to the screen at the 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// given offset. 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ImageMakeWithFilterGM : public skiagm::GM { 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ImageMakeWithFilterGM () {} 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("imagemakewithfilter"); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { return SkISize::Make(440, 530); } 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot auto cf = SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkBlendMode::kSrc); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImageFilter> filters[] = { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorFilterImageFilter::Make(std::move(cf), nullptr), 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlurImageFilter::Make(2.0f, 2.0f, nullptr), 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDropShadowImageFilter::Make( 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE, 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr), 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIRect clipBounds[] { 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { -20, -20, 100, 100 }, 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 0, 0, 75, 75 }, 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 20, 20, 100, 100 }, 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { -20, -20, 50, 50 }, 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 20, 20, 50, 50 }, 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = SkImageInfo::MakeN32(100, 100, kPremul_SkAlphaType); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar MARGIN = SkIntToScalar(40); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar DX = info.width() + MARGIN; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar DY = info.height() + MARGIN; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(MARGIN, MARGIN); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSurface> surface = sk_tool_utils::makeSurface(canvas, info); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_tool_utils::draw_checkerboard(surface->getCanvas()); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImage> source = surface->makeImageSnapshot(); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (auto clipBound : clipBounds) { 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIRect subset = SkIRect::MakeXYWH(25, 25, 50, 50); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIRect outSubset; 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIPoint offset; 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImage> result = source->makeWithFilter(filters[i].get(), subset, clipBound, 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &outSubset, &offset); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(result); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(source->isTextureBacked() == result->isTextureBacked()); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result = result->makeSubset(outSubset); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawImage(result.get(), SkIntToScalar(offset.fX), SkIntToScalar(offset.fY)); 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot show_bounds(canvas, SkIRect::MakeXYWH(offset.x(), offset.y(), outSubset.width(), 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot outSubset.height()), clipBound); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(DX, 0); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, DY); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM( return new ImageMakeWithFilterGM; ) 102