1 /* 2 * Copyright 2013 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 "gm.h" 9 10 #include "Resources.h" 11 #include "SkGradientShader.h" 12 #include "SkTypeface.h" 13 #include "SkImageDecoder.h" 14 #include "SkStream.h" 15 #include "SkPaint.h" 16 17 static void setTypeface(SkPaint* paint, const char name[], SkTypeface::Style style) { 18 SkSafeUnref(paint->setTypeface(SkTypeface::CreateFromName(name, style))); 19 } 20 21 class DownsampleBitmapGM : public skiagm::GM { 22 public: 23 SkBitmap fBM; 24 SkString fName; 25 bool fBitmapMade; 26 SkPaint::FilterLevel fFilterLevel; 27 28 DownsampleBitmapGM(SkPaint::FilterLevel filterLevel) 29 : fFilterLevel(filterLevel) 30 { 31 this->setBGColor(0xFFDDDDDD); 32 fBitmapMade = false; 33 } 34 35 const char* filterLevelToString() { 36 static const char *filterLevelNames[] = { 37 "none", "low", "medium", "high" 38 }; 39 return filterLevelNames[fFilterLevel]; 40 } 41 42 protected: 43 virtual uint32_t onGetFlags() const SK_OVERRIDE { 44 if (SkPaint::kHigh_FilterLevel != fFilterLevel) { 45 return kSkipTiled_Flag; 46 } 47 return 0; 48 } 49 50 virtual SkString onShortName() SK_OVERRIDE { 51 return fName; 52 } 53 54 virtual SkISize onISize() SK_OVERRIDE { 55 make_bitmap_wrapper(); 56 return SkISize::Make(4 * fBM.width(), fBM.height()); 57 } 58 59 void make_bitmap_wrapper() { 60 if (!fBitmapMade) { 61 fBitmapMade = true; 62 make_bitmap(); 63 } 64 } 65 66 virtual void make_bitmap() = 0; 67 68 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 69 make_bitmap_wrapper(); 70 71 int curX = 0; 72 int curWidth; 73 float curScale = 1; 74 do { 75 76 SkMatrix matrix; 77 matrix.setScale( curScale, curScale ); 78 79 SkPaint paint; 80 paint.setFilterLevel(fFilterLevel); 81 82 canvas->save(); 83 canvas->translate( (SkScalar) curX, 0.f ); 84 canvas->drawBitmapMatrix( fBM, matrix, &paint ); 85 canvas->restore(); 86 87 curWidth = (int) (fBM.width() * curScale + 2); 88 curX += curWidth; 89 curScale *= 0.75f; 90 } while (curWidth >= 2 && curX < 4*fBM.width()); 91 } 92 93 private: 94 typedef skiagm::GM INHERITED; 95 }; 96 97 class DownsampleBitmapTextGM: public DownsampleBitmapGM { 98 public: 99 DownsampleBitmapTextGM(float textSize, SkPaint::FilterLevel filterLevel) 100 : INHERITED(filterLevel), fTextSize(textSize) 101 { 102 fName.printf("downsamplebitmap_text_%s_%.2fpt", this->filterLevelToString(), fTextSize); 103 } 104 105 protected: 106 float fTextSize; 107 108 virtual void make_bitmap() SK_OVERRIDE { 109 fBM.allocN32Pixels(int(fTextSize * 8), int(fTextSize * 6)); 110 SkCanvas canvas(fBM); 111 canvas.drawColor(SK_ColorWHITE); 112 113 SkPaint paint; 114 paint.setAntiAlias(true); 115 paint.setSubpixelText(true); 116 paint.setTextSize(fTextSize); 117 118 setTypeface(&paint, "Times", SkTypeface::kNormal); 119 canvas.drawText("Hamburgefons", 12, fTextSize/2, 1.2f*fTextSize, paint); 120 setTypeface(&paint, "Times", SkTypeface::kBold); 121 canvas.drawText("Hamburgefons", 12, fTextSize/2, 2.4f*fTextSize, paint); 122 setTypeface(&paint, "Times", SkTypeface::kItalic); 123 canvas.drawText("Hamburgefons", 12, fTextSize/2, 3.6f*fTextSize, paint); 124 setTypeface(&paint, "Times", SkTypeface::kBoldItalic); 125 canvas.drawText("Hamburgefons", 12, fTextSize/2, 4.8f*fTextSize, paint); 126 } 127 private: 128 typedef DownsampleBitmapGM INHERITED; 129 }; 130 131 class DownsampleBitmapCheckerboardGM: public DownsampleBitmapGM { 132 public: 133 DownsampleBitmapCheckerboardGM(int size, int numChecks, SkPaint::FilterLevel filterLevel) 134 : INHERITED(filterLevel), fSize(size), fNumChecks(numChecks) 135 { 136 fName.printf("downsamplebitmap_checkerboard_%s_%d_%d", this->filterLevelToString(), fSize, fNumChecks); 137 } 138 139 protected: 140 int fSize; 141 int fNumChecks; 142 143 virtual void make_bitmap() SK_OVERRIDE { 144 fBM.allocN32Pixels(fSize, fSize); 145 for (int y = 0; y < fSize; ++y) { 146 for (int x = 0; x < fSize; ++x) { 147 SkPMColor* s = fBM.getAddr32(x, y); 148 int cx = (x * fNumChecks) / fSize; 149 int cy = (y * fNumChecks) / fSize; 150 if ((cx+cy)%2) { 151 *s = 0xFFFFFFFF; 152 } else { 153 *s = 0xFF000000; 154 } 155 } 156 } 157 } 158 private: 159 typedef DownsampleBitmapGM INHERITED; 160 }; 161 162 class DownsampleBitmapImageGM: public DownsampleBitmapGM { 163 public: 164 DownsampleBitmapImageGM(const char filename[], SkPaint::FilterLevel filterLevel) 165 : INHERITED(filterLevel), fFilename(filename) 166 { 167 fName.printf("downsamplebitmap_image_%s_%s", this->filterLevelToString(), filename); 168 } 169 170 protected: 171 SkString fFilename; 172 int fSize; 173 174 virtual void make_bitmap() SK_OVERRIDE { 175 SkString resourcePath = GetResourcePath(); 176 resourcePath.append("/"); 177 resourcePath.append(fFilename); 178 179 SkImageDecoder* codec = NULL; 180 SkFILEStream stream(resourcePath.c_str()); 181 if (stream.isValid()) { 182 codec = SkImageDecoder::Factory(&stream); 183 } 184 if (codec) { 185 stream.rewind(); 186 codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode); 187 SkDELETE(codec); 188 } else { 189 fBM.allocN32Pixels(1, 1); 190 *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad 191 } 192 fSize = fBM.height(); 193 } 194 private: 195 typedef DownsampleBitmapGM INHERITED; 196 }; 197 198 ////////////////////////////////////////////////////////////////////////////// 199 200 DEF_GM( return new DownsampleBitmapTextGM(72, SkPaint::kHigh_FilterLevel); ) 201 DEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, SkPaint::kHigh_FilterLevel); ) 202 DEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", SkPaint::kHigh_FilterLevel); ) 203 204 DEF_GM( return new DownsampleBitmapTextGM(72, SkPaint::kMedium_FilterLevel); ) 205 DEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, SkPaint::kMedium_FilterLevel); ) 206 DEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", SkPaint::kMedium_FilterLevel); ) 207 208 DEF_GM( return new DownsampleBitmapTextGM(72, SkPaint::kLow_FilterLevel); ) 209 DEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, SkPaint::kLow_FilterLevel); ) 210 DEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", SkPaint::kLow_FilterLevel); ) 211 212 DEF_GM( return new DownsampleBitmapTextGM(72, SkPaint::kNone_FilterLevel); ) 213 DEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, SkPaint::kNone_FilterLevel); ) 214 DEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", SkPaint::kNone_FilterLevel); ) 215