blob: fddb2f4e00393993d403953d6a143d107dfbbf3e [file] [log] [blame]
reeda40be092016-01-14 09:11:51 -08001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
12#include "include/core/SkColorPriv.h"
13#include "include/core/SkImageInfo.h"
14#include "include/core/SkPaint.h"
15#include "include/core/SkPixmap.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkRefCnt.h"
18#include "include/core/SkScalar.h"
Kevin Lubick87a2e792023-03-23 15:06:36 -040019#include "include/core/SkShader.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040020#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
Kevin Lubick87a2e792023-03-23 15:06:36 -040022#include "include/core/SkTileMode.h"
Mike Reed13711eb2020-07-14 17:16:32 -040023#include "src/core/SkMipmap.h"
Mike Reed6affa2c2020-11-30 13:09:24 -050024#include "src/core/SkMipmapBuilder.h"
Kevin Lubick8b741882023-10-06 11:41:38 -040025#include "tools/DecodeUtils.h"
Mike Reed607a3822021-01-24 19:49:21 -050026#include "tools/Resources.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050027#include "tools/ToolUtils.h"
reeda40be092016-01-14 09:11:51 -080028
Ben Wagner7fde8e12019-05-01 17:28:53 -040029#include <math.h>
reeda40be092016-01-14 09:11:51 -080030
Mike Reedf8a6b5b2020-07-10 08:36:42 -040031class ShowMipLevels3 : public skiagm::GM {
32 sk_sp<SkImage> fImg;
33
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000034 SkString getName() const override { return SkString("showmiplevels_explicit"); }
Mike Reedf8a6b5b2020-07-10 08:36:42 -040035
Leandro Lovisolo8f023882023-08-15 21:13:52 +000036 SkISize getISize() override { return {1130, 970}; }
Mike Reedf8a6b5b2020-07-10 08:36:42 -040037
38 void onOnceBeforeDraw() override {
Kevin Lubick8b741882023-10-06 11:41:38 -040039 fImg = ToolUtils::GetResourceAsImage("images/ship.png");
Mike Reed2fe15692020-07-14 11:29:38 -040040 fImg = fImg->makeRasterImage(); // makeWithMips only works on raster for now
41
42 const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
43
44 SkMipmapBuilder builder(fImg->imageInfo());
45 for (int i = 0; i < builder.countLevels(); ++i) {
Kevin Lubick5c93acf2023-05-09 12:11:43 -040046 auto surf = SkSurfaces::WrapPixels(builder.level(i));
Herb Derbyc37b3862022-06-21 09:49:17 -040047 surf->getCanvas()->drawColor(colors[i % std::size(colors)]);
Mike Reed2fe15692020-07-14 11:29:38 -040048 }
Kevin Lubick10270ac2023-03-30 14:13:26 -040049 fImg = builder.attachTo(fImg);
Mike Reedf8a6b5b2020-07-10 08:36:42 -040050 }
51
Mike Reedfd6f7092020-07-16 16:29:16 -040052 DrawResult onDraw(SkCanvas* canvas, SkString*) override {
Mike Reedf8a6b5b2020-07-10 08:36:42 -040053 canvas->drawColor(0xFFDDDDDD);
54
Mike Reedf8a6b5b2020-07-10 08:36:42 -040055 canvas->translate(10, 10);
Mike Reedfd6f7092020-07-16 16:29:16 -040056 for (auto mm : {SkMipmapMode::kNone, SkMipmapMode::kNearest, SkMipmapMode::kLinear}) {
Mike Reeda03f8bf2020-11-20 18:45:36 -050057 for (auto fm : {SkFilterMode::kNearest, SkFilterMode::kLinear}) {
58 canvas->translate(0, draw_downscaling(canvas, {fm, mm}));
Mike Reedf8a6b5b2020-07-10 08:36:42 -040059 }
Mike Reedf8a6b5b2020-07-10 08:36:42 -040060 }
Mike Reed2fe15692020-07-14 11:29:38 -040061 return DrawResult::kOk;
Mike Reedf8a6b5b2020-07-10 08:36:42 -040062 }
63
64private:
Mike Reeda03f8bf2020-11-20 18:45:36 -050065 SkScalar draw_downscaling(SkCanvas* canvas, SkSamplingOptions sampling) {
Mike Reed2fe15692020-07-14 11:29:38 -040066 SkAutoCanvasRestore acr(canvas, true);
67
68 SkPaint paint;
69 SkRect r = {0, 0, 150, 150};
70 for (float scale = 1; scale >= 0.1f; scale *= 0.7f) {
71 SkMatrix matrix = SkMatrix::Scale(scale, scale);
72 paint.setShader(fImg->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
Mike Reeda03f8bf2020-11-20 18:45:36 -050073 sampling, &matrix));
Mike Reed2fe15692020-07-14 11:29:38 -040074 canvas->drawRect(r, paint);
75 canvas->translate(r.width() + 10, 0);
76 }
77 return r.height() + 10;
78 }
79
John Stiles7571f9e2020-09-02 22:42:33 -040080 using INHERITED = skiagm::GM;
Mike Reedf8a6b5b2020-07-10 08:36:42 -040081};
82DEF_GM( return new ShowMipLevels3; )