blob: 16efda2d2f3f545c8c1023ccdc0edcc113e031da [file] [log] [blame]
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +00001/*
2 * Copyright 2014 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
Hal Canary4484b8f2019-01-08 14:00:08 -05008#include "Sample.h"
9
msarettd15750c2016-03-18 15:48:49 -070010#include "DecodeFile.h"
tfarinabcbc1782014-06-18 14:32:48 -070011#include "Resources.h"
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000012#include "SkBlurMaskFilter.h"
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000013#include "SkCanvas.h"
tfarinabcbc1782014-06-18 14:32:48 -070014#include "SkColorPriv.h"
Hal Canary4484b8f2019-01-08 14:00:08 -050015#include "SkFont.h"
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000016#include "SkRandom.h"
17#include "SkStream.h"
18
19// Intended to exercise pixel snapping observed with scaled images (and
20// with non-scaled images, but for a different reason): Bug 1145
21
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040022class SubpixelTranslateView : public Sample {
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000023public:
24 SubpixelTranslateView(const char imageFilename[],
25 float horizontalVelocity,
26 float verticalVelocity)
Mike Reed0933bc92017-12-09 01:27:41 +000027 : fHorizontalVelocity(horizontalVelocity)
28 , fVerticalVelocity(verticalVelocity)
29 {
30 if (!DecodeDataToBitmap(GetResourceAsData(imageFilename), &fBM)) {
31 fBM.allocN32Pixels(1, 1);
32 *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad
33 }
34 fCurPos = SkPoint::Make(0,0);
35 fSize = 200;
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000036 }
37
38protected:
39 SkBitmap fBM;
reed@google.com687a26d2014-05-30 13:45:36 +000040 SkScalar fSize;
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000041 float fHorizontalVelocity, fVerticalVelocity;
42
43 SkPoint fCurPos;
44
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040045 bool onQuery(Sample::Event* evt) override {
46 if (Sample::TitleQ(*evt)) {
47 Sample::TitleR(evt, "SubpixelTranslate");
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000048 return true;
49 }
50 return this->INHERITED::onQuery(evt);
51 }
52
mtklein36352bf2015-03-25 18:17:31 -070053 void onDrawContent(SkCanvas* canvas) override {
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000054
reed93a12152015-03-16 10:08:34 -070055 static const SkFilterQuality gQualitys[] = {
56 kNone_SkFilterQuality,
57 kLow_SkFilterQuality,
58 kMedium_SkFilterQuality,
59 kHigh_SkFilterQuality
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000060 };
61
62 SkPaint paint;
Hal Canary4484b8f2019-01-08 14:00:08 -050063 SkFont font(nullptr, 48);
64 font.setSubpixel(true);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000065
66 paint.setAntiAlias(true);
reed93a12152015-03-16 10:08:34 -070067 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) {
68 paint.setFilterQuality(gQualitys[i]);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000069 SkRect r = SkRect::MakeXYWH( fCurPos.fX + i * (fSize + 10), fCurPos.fY, fSize, fSize );
70 canvas->drawBitmapRect( fBM, r, &paint );
71 }
72
Hal Canary4484b8f2019-01-08 14:00:08 -050073 canvas->drawString("AA Scaled", fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fSize + 10),
74 fCurPos.fY + fSize/2, font, paint);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000075
76 paint.setAntiAlias(false);
Hal Canary4484b8f2019-01-08 14:00:08 -050077 font.setEdging(SkFont::Edging::kAlias);
reed93a12152015-03-16 10:08:34 -070078 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) {
79 paint.setFilterQuality(gQualitys[i]);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000080 SkRect r = SkRect::MakeXYWH( fCurPos.fX + i * (fSize + 10), fCurPos.fY + fSize + 10, fSize, fSize );
81 canvas->drawBitmapRect( fBM, r, &paint );
82 }
Hal Canary4484b8f2019-01-08 14:00:08 -050083 canvas->drawString("Scaled", fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fSize + 10),
84 fCurPos.fY + fSize + 10 + fSize/2, font, paint);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000085
86 paint.setAntiAlias(true);
Hal Canary4484b8f2019-01-08 14:00:08 -050087 font.setEdging(SkFont::Edging::kAntiAlias);
reed93a12152015-03-16 10:08:34 -070088 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) {
89 paint.setFilterQuality(gQualitys[i]);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000090 canvas->drawBitmap( fBM, fCurPos.fX + i * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10), &paint );
91 }
92
Hal Canary4484b8f2019-01-08 14:00:08 -050093 canvas->drawString("AA No Scale",
94 fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fBM.width() + 10),
95 fCurPos.fY + 2*(fSize + 10) + fSize/2, font, paint);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +000096
97 paint.setAntiAlias(false);
Hal Canary4484b8f2019-01-08 14:00:08 -050098 font.setEdging(SkFont::Edging::kAlias);
reed93a12152015-03-16 10:08:34 -070099 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) {
100 paint.setFilterQuality(gQualitys[i]);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +0000101 canvas->drawBitmap( fBM, fCurPos.fX + i * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10) + fBM.height() + 10, &paint );
102 }
103
Hal Canary4484b8f2019-01-08 14:00:08 -0500104 canvas->drawString("No Scale", fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fBM.width() + 10),
105 fCurPos.fY + 2*(fSize + 10) + fBM.height() + 10 + fSize/2, font, paint);
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +0000106
107
108 fCurPos.fX += fHorizontalVelocity;
109 fCurPos.fY += fVerticalVelocity;
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +0000110 }
111
112private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400113 typedef Sample INHERITED;
commit-bot@chromium.org1803f4e2014-05-29 22:01:08 +0000114};
115
116//////////////////////////////////////////////////////////////////////////////
117
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400118DEF_SAMPLE( return new SubpixelTranslateView("images/mandrill_256.png", .05f, .05f); )