| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "gm/gm.h" | |
| #include "include/core/SkBitmap.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkMatrix.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/core/SkSize.h" | |
| #include "include/core/SkString.h" | |
| #include "include/core/SkTypes.h" | |
| #include "tools/DecodeUtils.h" | |
| #include "tools/Resources.h" | |
| #include "tools/ToolUtils.h" | |
| #include <array> | |
| namespace { | |
| static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) { | |
| SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()), | |
| SkIntToScalar(bm.height())); | |
| mat.mapRect(&bounds); | |
| return SkSize::Make(bounds.width(), bounds.height()); | |
| } | |
| static void draw_cell(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx, | |
| const SkSamplingOptions& sampling) { | |
| SkAutoCanvasRestore acr(canvas, true); | |
| canvas->translate(dx, 0); | |
| canvas->concat(mat); | |
| canvas->drawImage(bm.asImage(), 0, 0, sampling); | |
| } | |
| static void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) { | |
| draw_cell(canvas, bm, mat, 0 * dx, SkSamplingOptions()); | |
| draw_cell(canvas, bm, mat, 1 * dx, SkSamplingOptions(SkFilterMode::kLinear)); | |
| draw_cell(canvas, bm, mat, 2 * dx, SkSamplingOptions(SkFilterMode::kLinear, | |
| SkMipmapMode::kLinear)); | |
| draw_cell(canvas, bm, mat, 3 * dx, SkSamplingOptions(SkCubicResampler::Mitchell())); | |
| } | |
| class FilterIndiaBoxGM : public skiagm::GM { | |
| SkBitmap fBM; | |
| std::array<SkMatrix, 2> fMatrix; | |
| void onOnceBeforeDraw() override { | |
| constexpr char kResource[] = "images/box.gif"; | |
| if (!ToolUtils::GetResourceAsBitmap(kResource, &fBM)) { | |
| fBM.allocN32Pixels(1, 1); | |
| fBM.eraseARGB(255, 255, 0 , 0); // red == bad | |
| } | |
| fBM.setImmutable(); | |
| SkScalar cx = fBM.width() / 2.f; | |
| SkScalar cy = fBM.height() / 2.f; | |
| float vertScale = 30.0f/55.0f; | |
| float horizScale = 150.0f/200.0f; | |
| fMatrix[0].setScale(horizScale, vertScale); | |
| fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale); | |
| } | |
| SkString getName() const override { return SkString("filterindiabox"); } | |
| SkISize getISize() override { return {680, 130}; } | |
| void onDraw(SkCanvas* canvas) override { | |
| canvas->translate(10, 10); | |
| for (size_t i = 0; i < std::size(fMatrix); ++i) { | |
| SkSize size = computeSize(fBM, fMatrix[i]); | |
| size.fWidth += 20; | |
| size.fHeight += 20; | |
| draw_row(canvas, fBM, fMatrix[i], size.fWidth); | |
| canvas->translate(0, size.fHeight); | |
| } | |
| } | |
| }; | |
| } // namespace | |
| DEF_GM( return new FilterIndiaBoxGM(); ) |