imagefilters.cpp revision 7e4186accea094276c9f3c65c64e63ffc59aa644
17e4186accea094276c9f3c65c64e63ffc59aa644reed/* 27e4186accea094276c9f3c65c64e63ffc59aa644reed * Copyright 2015 Google Inc. 37e4186accea094276c9f3c65c64e63ffc59aa644reed * 47e4186accea094276c9f3c65c64e63ffc59aa644reed * Use of this source code is governed by a BSD-style license that can be 57e4186accea094276c9f3c65c64e63ffc59aa644reed * found in the LICENSE file. 67e4186accea094276c9f3c65c64e63ffc59aa644reed */ 77e4186accea094276c9f3c65c64e63ffc59aa644reed 87e4186accea094276c9f3c65c64e63ffc59aa644reed#include "gm.h" 97e4186accea094276c9f3c65c64e63ffc59aa644reed#include "SkImageFilter.h" 107e4186accea094276c9f3c65c64e63ffc59aa644reed#include "SkColorMatrixFilter.h" 117e4186accea094276c9f3c65c64e63ffc59aa644reed 127e4186accea094276c9f3c65c64e63ffc59aa644reed/** 137e4186accea094276c9f3c65c64e63ffc59aa644reed * Test drawing a primitive w/ an imagefilter (in this case, just matrix w/ identity) to see 147e4186accea094276c9f3c65c64e63ffc59aa644reed * that we apply the xfermode *after* the image has been created and filtered, and not during 157e4186accea094276c9f3c65c64e63ffc59aa644reed * the creation step (i.e. before it is filtered). 167e4186accea094276c9f3c65c64e63ffc59aa644reed * 177e4186accea094276c9f3c65c64e63ffc59aa644reed * see skbug.com/3741 187e4186accea094276c9f3c65c64e63ffc59aa644reed */ 197e4186accea094276c9f3c65c64e63ffc59aa644reedclass ImageFilterXfermodeTestGM : public skiagm::GM { 207e4186accea094276c9f3c65c64e63ffc59aa644reedprotected: 217e4186accea094276c9f3c65c64e63ffc59aa644reed SkString onShortName() override { 227e4186accea094276c9f3c65c64e63ffc59aa644reed return SkString("imagefilters_xfermodes"); 237e4186accea094276c9f3c65c64e63ffc59aa644reed } 247e4186accea094276c9f3c65c64e63ffc59aa644reed 257e4186accea094276c9f3c65c64e63ffc59aa644reed SkISize onISize() override { return SkISize::Make(480, 480); } 267e4186accea094276c9f3c65c64e63ffc59aa644reed 277e4186accea094276c9f3c65c64e63ffc59aa644reed void doDraw(SkCanvas* canvas, SkXfermode::Mode mode, SkImageFilter* imf) { 287e4186accea094276c9f3c65c64e63ffc59aa644reed SkPaint paint; 297e4186accea094276c9f3c65c64e63ffc59aa644reed paint.setAntiAlias(true); 307e4186accea094276c9f3c65c64e63ffc59aa644reed 317e4186accea094276c9f3c65c64e63ffc59aa644reed SkRect r0 = SkRect::MakeXYWH(10, 60, 200, 100); 327e4186accea094276c9f3c65c64e63ffc59aa644reed SkRect r1 = SkRect::MakeXYWH(60, 10, 100, 200); 337e4186accea094276c9f3c65c64e63ffc59aa644reed 347e4186accea094276c9f3c65c64e63ffc59aa644reed paint.setColor(SK_ColorRED); 357e4186accea094276c9f3c65c64e63ffc59aa644reed canvas->drawOval(r0, paint); 367e4186accea094276c9f3c65c64e63ffc59aa644reed 377e4186accea094276c9f3c65c64e63ffc59aa644reed paint.setColor(0x800000FF); 387e4186accea094276c9f3c65c64e63ffc59aa644reed paint.setImageFilter(imf); 397e4186accea094276c9f3c65c64e63ffc59aa644reed paint.setXfermodeMode(mode); 407e4186accea094276c9f3c65c64e63ffc59aa644reed canvas->drawOval(r1, paint); 417e4186accea094276c9f3c65c64e63ffc59aa644reed } 427e4186accea094276c9f3c65c64e63ffc59aa644reed 437e4186accea094276c9f3c65c64e63ffc59aa644reed void onDraw(SkCanvas* canvas) override { 447e4186accea094276c9f3c65c64e63ffc59aa644reed // just need an imagefilter to trigger the code-path (which creates a tmp layer) 457e4186accea094276c9f3c65c64e63ffc59aa644reed SkAutoTUnref<SkImageFilter> imf(SkImageFilter::CreateMatrixFilter(SkMatrix::I(), 467e4186accea094276c9f3c65c64e63ffc59aa644reed kNone_SkFilterQuality)); 477e4186accea094276c9f3c65c64e63ffc59aa644reed 487e4186accea094276c9f3c65c64e63ffc59aa644reed const SkXfermode::Mode modes[] = { 497e4186accea094276c9f3c65c64e63ffc59aa644reed SkXfermode::kSrcATop_Mode, SkXfermode::kDstIn_Mode 507e4186accea094276c9f3c65c64e63ffc59aa644reed }; 517e4186accea094276c9f3c65c64e63ffc59aa644reed 527e4186accea094276c9f3c65c64e63ffc59aa644reed for (size_t i = 0; i < SK_ARRAY_COUNT(modes); ++i) { 537e4186accea094276c9f3c65c64e63ffc59aa644reed canvas->save(); 547e4186accea094276c9f3c65c64e63ffc59aa644reed this->doDraw(canvas, modes[i], NULL); 557e4186accea094276c9f3c65c64e63ffc59aa644reed canvas->translate(250, 0); 567e4186accea094276c9f3c65c64e63ffc59aa644reed this->doDraw(canvas, modes[i], imf); 577e4186accea094276c9f3c65c64e63ffc59aa644reed canvas->restore(); 587e4186accea094276c9f3c65c64e63ffc59aa644reed 597e4186accea094276c9f3c65c64e63ffc59aa644reed canvas->translate(0, 250); 607e4186accea094276c9f3c65c64e63ffc59aa644reed } 617e4186accea094276c9f3c65c64e63ffc59aa644reed } 627e4186accea094276c9f3c65c64e63ffc59aa644reed 637e4186accea094276c9f3c65c64e63ffc59aa644reedprivate: 647e4186accea094276c9f3c65c64e63ffc59aa644reed typedef GM INHERITED; 657e4186accea094276c9f3c65c64e63ffc59aa644reed}; 667e4186accea094276c9f3c65c64e63ffc59aa644reedDEF_GM( return new ImageFilterXfermodeTestGM; ) 677e4186accea094276c9f3c65c64e63ffc59aa644reed 68