1 /* 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 8 #include "samplecode/Sample.h" 9 10 #include "include/core/SkCanvas.h" 11 #include "include/core/SkColorPriv.h" 12 #include "include/core/SkFont.h" 13 #include "include/core/SkStream.h" 14 #include "include/utils/SkRandom.h" 15 #include "samplecode/DecodeFile.h" 16 #include "tools/Resources.h" 17 18 // Intended to exercise pixel snapping observed with scaled images (and 19 // with non-scaled images, but for a different reason): Bug 1145 20 21 class SubpixelTranslateView : public Sample { 22 public: SubpixelTranslateView(const char imageFilename[],float horizontalVelocity,float verticalVelocity)23 SubpixelTranslateView(const char imageFilename[], 24 float horizontalVelocity, 25 float verticalVelocity) 26 : fHorizontalVelocity(horizontalVelocity) 27 , fVerticalVelocity(verticalVelocity) 28 { 29 if (!DecodeDataToBitmap(GetResourceAsData(imageFilename), &fBM)) { 30 fBM.allocN32Pixels(1, 1); 31 *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad 32 } 33 fCurPos = SkPoint::Make(0,0); 34 fSize = 200; 35 } 36 37 protected: 38 SkBitmap fBM; 39 SkScalar fSize; 40 float fHorizontalVelocity, fVerticalVelocity; 41 42 SkPoint fCurPos; 43 name()44 SkString name() override { return SkString("SubpixelTranslate"); } 45 onDrawContent(SkCanvas * canvas)46 void onDrawContent(SkCanvas* canvas) override { 47 48 static const SkFilterQuality gQualitys[] = { 49 kNone_SkFilterQuality, 50 kLow_SkFilterQuality, 51 kMedium_SkFilterQuality, 52 kHigh_SkFilterQuality 53 }; 54 55 SkPaint paint; 56 SkFont font(nullptr, 48); 57 font.setSubpixel(true); 58 59 paint.setAntiAlias(true); 60 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) { 61 paint.setFilterQuality(gQualitys[i]); 62 SkRect r = SkRect::MakeXYWH( fCurPos.fX + i * (fSize + 10), fCurPos.fY, fSize, fSize ); 63 canvas->drawBitmapRect( fBM, r, &paint ); 64 } 65 66 canvas->drawString("AA Scaled", fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fSize + 10), 67 fCurPos.fY + fSize/2, font, paint); 68 69 paint.setAntiAlias(false); 70 font.setEdging(SkFont::Edging::kAlias); 71 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) { 72 paint.setFilterQuality(gQualitys[i]); 73 SkRect r = SkRect::MakeXYWH( fCurPos.fX + i * (fSize + 10), fCurPos.fY + fSize + 10, fSize, fSize ); 74 canvas->drawBitmapRect( fBM, r, &paint ); 75 } 76 canvas->drawString("Scaled", fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fSize + 10), 77 fCurPos.fY + fSize + 10 + fSize/2, font, paint); 78 79 paint.setAntiAlias(true); 80 font.setEdging(SkFont::Edging::kAntiAlias); 81 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) { 82 paint.setFilterQuality(gQualitys[i]); 83 canvas->drawBitmap( fBM, fCurPos.fX + i * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10), &paint ); 84 } 85 86 canvas->drawString("AA No Scale", 87 fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fBM.width() + 10), 88 fCurPos.fY + 2*(fSize + 10) + fSize/2, font, paint); 89 90 paint.setAntiAlias(false); 91 font.setEdging(SkFont::Edging::kAlias); 92 for (size_t i = 0; i < SK_ARRAY_COUNT(gQualitys); ++i) { 93 paint.setFilterQuality(gQualitys[i]); 94 canvas->drawBitmap( fBM, fCurPos.fX + i * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10) + fBM.height() + 10, &paint ); 95 } 96 97 canvas->drawString("No Scale", fCurPos.fX + SK_ARRAY_COUNT(gQualitys) * (fBM.width() + 10), 98 fCurPos.fY + 2*(fSize + 10) + fBM.height() + 10 + fSize/2, font, paint); 99 100 101 fCurPos.fX += fHorizontalVelocity; 102 fCurPos.fY += fVerticalVelocity; 103 } 104 105 private: 106 typedef Sample INHERITED; 107 }; 108 109 ////////////////////////////////////////////////////////////////////////////// 110 111 DEF_SAMPLE( return new SubpixelTranslateView("images/mandrill_256.png", .05f, .05f); ) 112