| /* |
| * Copyright 2013 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "gm.h" |
| #include "SkColor.h" |
| #include "SkImageSource.h" |
| #include "SkRefCnt.h" |
| #include "SkSurface.h" |
| |
| namespace skiagm { |
| |
| class ResizeGM : public GM { |
| public: |
| ResizeGM() { |
| this->setBGColor(0x00000000); |
| } |
| |
| protected: |
| SkString onShortName() override { |
| return SkString("resizeimagefilter"); |
| } |
| |
| void draw(SkCanvas* canvas, |
| const SkRect& rect, |
| const SkSize& deviceSize, |
| SkFilterQuality filterQuality, |
| sk_sp<SkImageFilter> input) { |
| SkRect dstRect; |
| canvas->getTotalMatrix().mapRect(&dstRect, rect); |
| canvas->save(); |
| SkScalar deviceScaleX = deviceSize.width() / dstRect.width(); |
| SkScalar deviceScaleY = deviceSize.height() / dstRect.height(); |
| canvas->translate(rect.x(), rect.y()); |
| canvas->scale(deviceScaleX, deviceScaleY); |
| canvas->translate(-rect.x(), -rect.y()); |
| SkMatrix matrix; |
| matrix.setScale(SkScalarInvert(deviceScaleX), SkScalarInvert(deviceScaleY)); |
| sk_sp<SkImageFilter> filter(SkImageFilter::MakeMatrixFilter(matrix, |
| filterQuality, |
| std::move(input))); |
| SkPaint filteredPaint; |
| filteredPaint.setImageFilter(std::move(filter)); |
| canvas->saveLayer(&rect, &filteredPaint); |
| SkPaint paint; |
| paint.setColor(0xFF00FF00); |
| SkRect ovalRect = rect; |
| ovalRect.inset(SkIntToScalar(4), SkIntToScalar(4)); |
| canvas->drawOval(ovalRect, paint); |
| canvas->restore(); // for saveLayer |
| canvas->restore(); |
| } |
| |
| SkISize onISize() override { |
| return SkISize::Make(520, 100); |
| } |
| |
| void onDraw(SkCanvas* canvas) override { |
| canvas->clear(SK_ColorBLACK); |
| |
| SkRect srcRect = SkRect::MakeWH(96, 96); |
| |
| SkSize deviceSize = SkSize::Make(16, 16); |
| this->draw(canvas, |
| srcRect, |
| deviceSize, |
| kNone_SkFilterQuality, |
| nullptr); |
| |
| canvas->translate(srcRect.width() + SkIntToScalar(10), 0); |
| this->draw(canvas, |
| srcRect, |
| deviceSize, |
| kLow_SkFilterQuality, |
| nullptr); |
| |
| canvas->translate(srcRect.width() + SkIntToScalar(10), 0); |
| this->draw(canvas, |
| srcRect, |
| deviceSize, |
| kMedium_SkFilterQuality, |
| nullptr); |
| |
| canvas->translate(srcRect.width() + SkIntToScalar(10), 0); |
| this->draw(canvas, |
| srcRect, |
| deviceSize, |
| kHigh_SkFilterQuality, |
| nullptr); |
| |
| sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(16, 16)); |
| SkCanvas* surfaceCanvas = surface->getCanvas(); |
| surfaceCanvas->clear(0x000000); |
| { |
| SkPaint paint; |
| paint.setColor(0xFF00FF00); |
| SkRect ovalRect = SkRect::MakeWH(16, 16); |
| ovalRect.inset(SkIntToScalar(2)/3, SkIntToScalar(2)/3); |
| surfaceCanvas->drawOval(ovalRect, paint); |
| } |
| sk_sp<SkImage> image(surface->makeImageSnapshot()); |
| SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20); |
| SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120); |
| sk_sp<SkImageFilter> source( |
| SkImageSource::Make(std::move(image), inRect, outRect, kHigh_SkFilterQuality)); |
| canvas->translate(srcRect.width() + SkIntToScalar(10), 0); |
| this->draw(canvas, |
| srcRect, |
| deviceSize, |
| kHigh_SkFilterQuality, |
| std::move(source)); |
| } |
| |
| private: |
| typedef GM INHERITED; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| DEF_GM(return new ResizeGM; ) |
| |
| } |