1cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita/* 2cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita * Copyright 2013 Google Inc. 3cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita * 4cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita * Use of this source code is governed by a BSD-style license that can be 5cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita * found in the LICENSE file. 6cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita */ 7cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 8cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 10cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 11cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita#include "SkImage.h" 12cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita#include "SkImageSource.h" 13cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 14cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita// This GM exercises the SkImageSource ImageFilter class. 15cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 16549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillipsstatic void fill_rect_filtered(SkCanvas* canvas, 17549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips const SkRect& clipRect, 18549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> filter) { 19549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkPaint paint; 20549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips paint.setImageFilter(std::move(filter)); 21549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->save(); 22549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->clipRect(clipRect); 23549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->drawPaint(paint); 24549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips canvas->restore(); 25549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips} 26549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips 27cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalitaclass ImageSourceGM : public skiagm::GM { 28cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalitapublic: 29cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita ImageSourceGM() { } 30cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 31cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalitaprotected: 32cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita SkString onShortName() override { 33cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita return SkString("imagesource"); 34cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita } 35cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 36cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita SkISize onISize() override { return SkISize::Make(500, 150); } 37cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 38cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita void onOnceBeforeDraw() override { 39cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita SkBitmap bm = sk_tool_utils::create_string_bitmap(100, 100, 0xFFFFFFFF, 20, 70, 96, "e"); 409ce9d6772df650ceb0511f275e1a83dffa78ff72reed fImage = SkImage::MakeFromBitmap(bm); 41cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita } 42cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 43cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita void onDraw(SkCanvas* canvas) override { 44cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita canvas->clear(SK_ColorBLACK); 45cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 46549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips const SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30); 47549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips const SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60); 48549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips const SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100); 49549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips const SkRect bounds = SkRect::MakeIWH(fImage->width(), fImage->height()); 50549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips 51549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips { 52cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita // Draw an unscaled bitmap. 53549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> imageSource(SkImageSource::Make(fImage)); 54549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips fill_rect_filtered(canvas, clipRect, std::move(imageSource)); 55cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita canvas->translate(SkIntToScalar(100), 0); 56549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips } 57549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips { 58cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita // Draw an unscaled subset of the source bitmap (srcRect -> srcRect). 59549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> imageSourceSrcRect( 60549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkImageSource::Make(fImage, srcRect, srcRect, kHigh_SkFilterQuality)); 61549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRect)); 62cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita canvas->translate(SkIntToScalar(100), 0); 63549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips } 64549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips { 65cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect). 66549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> imageSourceSrcRectDstRect( 67549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkImageSource::Make(fImage, srcRect, dstRect, kHigh_SkFilterQuality)); 68549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRectDstRect)); 69cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita canvas->translate(SkIntToScalar(100), 0); 70549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips } 71549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips { 72cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect). 73549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips sk_sp<SkImageFilter> imageSourceDstRectOnly( 74549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips SkImageSource::Make(fImage, bounds, dstRect, kHigh_SkFilterQuality)); 75549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips fill_rect_filtered(canvas, clipRect, std::move(imageSourceDstRectOnly)); 76cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita canvas->translate(SkIntToScalar(100), 0); 77cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita } 78cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita } 79cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 80cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalitaprivate: 819ce9d6772df650ceb0511f275e1a83dffa78ff72reed sk_sp<SkImage> fImage; 82cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita typedef GM INHERITED; 83cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita}; 84cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 85cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita/////////////////////////////////////////////////////////////////////////////// 86cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalita 87cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalitaDEF_GM( return new ImageSourceGM; ) 88