Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "gm.h" | 8 #include "gm.h" |
| 9 #include "SkGradientShader.h" | 9 #include "SkGradientShader.h" |
| 10 | 10 |
| 11 #include "SkTypeface.h" | 11 #include "SkTypeface.h" |
| 12 #include "SkImageDecoder.h" | 12 #include "SkImageDecoder.h" |
| 13 | 13 |
| 14 #include "lena_bytes.h" | |
| 15 | |
| 14 static void setTypeface(SkPaint* paint, const char name[], SkTypeface::Style sty le) { | 16 static void setTypeface(SkPaint* paint, const char name[], SkTypeface::Style sty le) { |
| 15 SkSafeUnref(paint->setTypeface(SkTypeface::CreateFromName(name, style))); | 17 SkSafeUnref(paint->setTypeface(SkTypeface::CreateFromName(name, style))); |
| 16 } | 18 } |
| 17 | 19 |
| 18 static void load_bm(SkBitmap* bm) { | |
| 19 // SkImageDecoder::DecodeFile("/skia/trunk/books.jpg", bm); | |
| 20 | |
| 21 bm->setConfig(SkBitmap::kARGB_8888_Config, 160, 120); | |
| 22 bm->allocPixels(); | |
| 23 SkCanvas canvas(*bm); | |
| 24 canvas.drawColor(SK_ColorWHITE); | |
| 25 | |
| 26 SkPaint paint; | |
| 27 paint.setAntiAlias(true); | |
| 28 paint.setSubpixelText(true); | |
| 29 paint.setTextSize(17); | |
| 30 | |
| 31 setTypeface(&paint, "Times", SkTypeface::kNormal); | |
| 32 canvas.drawText("Hamburgefons", 12, 10, 25, paint); | |
| 33 setTypeface(&paint, "Times", SkTypeface::kBold); | |
| 34 canvas.drawText("Hamburgefons", 12, 10, 50, paint); | |
| 35 setTypeface(&paint, "Times", SkTypeface::kItalic); | |
| 36 canvas.drawText("Hamburgefons", 12, 10, 75, paint); | |
| 37 setTypeface(&paint, "Times", SkTypeface::kBoldItalic); | |
| 38 canvas.drawText("Hamburgefons", 12, 10, 100, paint); | |
| 39 } | |
| 40 | |
| 41 static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) { | 20 static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) { |
| 42 SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()), | 21 SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()), |
| 43 SkIntToScalar(bm.height())); | 22 SkIntToScalar(bm.height())); |
| 44 mat.mapRect(&bounds); | 23 mat.mapRect(&bounds); |
| 45 return SkSize::Make(bounds.width(), bounds.height()); | 24 return SkSize::Make(bounds.width(), bounds.height()); |
| 46 } | 25 } |
| 47 | 26 |
| 48 static void draw_col(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, | 27 static void draw_col(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, |
| 49 SkScalar dx) { | 28 SkScalar dx) { |
| 50 SkPaint paint; | 29 SkPaint paint; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 62 canvas->drawBitmapMatrix(bm, mat, &paint); | 41 canvas->drawBitmapMatrix(bm, mat, &paint); |
| 63 } | 42 } |
| 64 | 43 |
| 65 class FilterBitmapGM : public skiagm::GM { | 44 class FilterBitmapGM : public skiagm::GM { |
| 66 bool fOnce; | 45 bool fOnce; |
| 67 void init() { | 46 void init() { |
| 68 if (fOnce) { | 47 if (fOnce) { |
| 69 return; | 48 return; |
| 70 } | 49 } |
| 71 fOnce = true; | 50 fOnce = true; |
| 72 load_bm(&fBM); | 51 |
| 73 | 52 make_bitmap(); |
| 53 | |
| 74 SkScalar cx = SkScalarHalf(fBM.width()); | 54 SkScalar cx = SkScalarHalf(fBM.width()); |
| 75 SkScalar cy = SkScalarHalf(fBM.height()); | 55 SkScalar cy = SkScalarHalf(fBM.height()); |
| 76 SkScalar scale = 1.6f; | 56 SkScalar scale = get_scale(); |
| 57 | |
| 77 | 58 |
| 78 fMatrix[0].setScale(scale, scale); | 59 fMatrix[0].setScale(scale, scale); |
| 79 fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(scale, scale); | 60 fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(scale, scale); |
| 80 } | 61 } |
| 81 | 62 |
| 82 public: | 63 public: |
| 83 SkBitmap fBM; | 64 SkBitmap fBM; |
| 84 SkMatrix fMatrix[2]; | 65 SkMatrix fMatrix[2]; |
| 66 SkString fName; | |
| 67 | |
| 68 FilterBitmapGM(): | |
| 69 fOnce(false) { | |
| 70 this->setBGColor(0xFFDDDDDD); | |
| 71 } | |
| 85 | 72 |
| 86 FilterBitmapGM() : fOnce(false) { | 73 void setName( const char name[] ) { |
| 87 this->setBGColor(0xFFDDDDDD); | 74 fName = SkString(name); |
|
reed1
2013/05/29 19:26:04
alternative (slightly more efficient) : fName.set(
| |
| 88 } | 75 } |
| 89 | 76 |
| 90 protected: | 77 protected: |
| 91 virtual SkString onShortName() SK_OVERRIDE { | 78 virtual SkString onShortName() SK_OVERRIDE { |
| 92 return SkString("filterbitmap"); | 79 return fName; |
| 93 } | 80 } |
| 94 | 81 |
| 95 virtual SkISize onISize() SK_OVERRIDE { | 82 virtual SkISize onISize() SK_OVERRIDE { |
| 96 return SkISize::Make(920, 480); | 83 return SkISize::Make(920, 480); |
| 97 } | 84 } |
| 98 | 85 |
| 86 virtual void make_bitmap() = 0; | |
| 87 virtual SkScalar get_scale() = 0; | |
| 88 | |
| 99 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 89 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
| 100 this->init(); | 90 this->init(); |
| 101 | 91 |
| 102 canvas->translate(10, 10); | 92 canvas->translate(10, 10); |
| 103 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) { | 93 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) { |
| 104 SkSize size = computeSize(fBM, fMatrix[i]); | 94 SkSize size = computeSize(fBM, fMatrix[i]); |
| 105 size.fWidth += 20; | 95 size.fWidth += 20; |
| 106 size.fHeight += 20; | 96 size.fHeight += 20; |
| 107 | 97 |
| 108 draw_col(canvas, fBM, fMatrix[i], size.fWidth); | 98 draw_col(canvas, fBM, fMatrix[i], size.fWidth); |
| 109 canvas->translate(0, size.fHeight); | 99 canvas->translate(0, size.fHeight); |
| 110 } | 100 } |
| 111 } | 101 } |
| 112 | 102 |
| 113 private: | 103 private: |
| 114 typedef skiagm::GM INHERITED; | 104 typedef skiagm::GM INHERITED; |
| 115 }; | 105 }; |
| 116 | 106 |
| 107 class FilterBitmapTextGM: public FilterBitmapGM { | |
| 108 public: | |
| 109 FilterBitmapTextGM( float textSize ) | |
| 110 : fTextSize( textSize ) | |
| 111 { | |
| 112 char name[1024]; | |
| 113 sprintf( name, "filterbitmap_text_%.2fpt", fTextSize ); | |
| 114 setName( name ); | |
| 115 } | |
| 116 | |
| 117 protected: | |
| 118 float fTextSize; | |
| 119 | |
| 120 SkScalar get_scale() SK_OVERRIDE { | |
| 121 return 32.f/fTextSize; | |
| 122 } | |
| 123 | |
| 124 void make_bitmap() SK_OVERRIDE { | |
| 125 fBM.setConfig(SkBitmap::kARGB_8888_Config, fTextSize * 8, fTextSize * 6); | |
| 126 fBM.allocPixels(); | |
| 127 SkCanvas canvas(fBM); | |
| 128 canvas.drawColor(SK_ColorWHITE); | |
| 129 | |
| 130 SkPaint paint; | |
| 131 paint.setAntiAlias(true); | |
| 132 paint.setSubpixelText(true); | |
| 133 paint.setTextSize(fTextSize); | |
| 134 | |
| 135 setTypeface(&paint, "Times", SkTypeface::kNormal); | |
| 136 canvas.drawText("Hamburgefons", 12, fTextSize/2, 1.2*fTextSize, paint) ; | |
| 137 setTypeface(&paint, "Times", SkTypeface::kBold); | |
| 138 canvas.drawText("Hamburgefons", 12, fTextSize/2, 2.4*fTextSize, paint) ; | |
| 139 setTypeface(&paint, "Times", SkTypeface::kItalic); | |
| 140 canvas.drawText("Hamburgefons", 12, fTextSize/2, 3.6*fTextSize, paint) ; | |
| 141 setTypeface(&paint, "Times", SkTypeface::kBoldItalic); | |
| 142 canvas.drawText("Hamburgefons", 12, fTextSize/2, 4.8*fTextSize, paint) ; | |
| 143 } | |
| 144 private: | |
| 145 typedef FilterBitmapGM INHERITED; | |
| 146 }; | |
| 147 | |
| 148 class FilterBitmapCheckerboardGM: public FilterBitmapGM { | |
| 149 public: | |
| 150 FilterBitmapCheckerboardGM( int size, int num_checks ) | |
| 151 : fSize( size ), fNumChecks( num_checks ) | |
| 152 { | |
| 153 char name[1024]; | |
| 154 sprintf( name, "filterbitmap_checkerboard_%d_%d", fSize, fNumChecks ); | |
| 155 setName( name ); | |
| 156 } | |
| 157 | |
| 158 protected: | |
| 159 int fSize; | |
| 160 int fNumChecks; | |
| 161 | |
| 162 SkScalar get_scale() SK_OVERRIDE { | |
| 163 return 192.f/fSize; | |
| 164 } | |
| 165 | |
| 166 void make_bitmap() SK_OVERRIDE { | |
| 167 fBM.setConfig(SkBitmap::kARGB_8888_Config, fSize, fSize); | |
| 168 fBM.allocPixels(); | |
| 169 SkAutoLockPixels lock(fBM); | |
| 170 for (int y = 0; y < fSize; y ++) { | |
| 171 for (int x = 0; x < fSize; x ++) { | |
| 172 SkPMColor* s = fBM.getAddr32(x, y); | |
| 173 int cx = (x * fNumChecks) / fSize; | |
| 174 int cy = (y * fNumChecks) / fSize; | |
| 175 if ((cx+cy)%2) { | |
| 176 *s = 0xFFFFFFFF; | |
| 177 } else { | |
| 178 *s = 0xFF000000; | |
| 179 } | |
| 180 } | |
| 181 } | |
| 182 } | |
| 183 private: | |
| 184 typedef FilterBitmapGM INHERITED; | |
| 185 }; | |
| 186 | |
| 187 class FilterBitmapImageGM: public FilterBitmapGM { | |
| 188 public: | |
| 189 FilterBitmapImageGM( int size ) | |
| 190 : fSize( size ) | |
| 191 { | |
| 192 char name[1024]; | |
| 193 sprintf( name, "filterbitmap_image_%d", fSize ); | |
| 194 setName( name ); | |
| 195 } | |
| 196 | |
| 197 protected: | |
| 198 int fSize; | |
| 199 int fNumChecks; | |
| 200 | |
| 201 SkScalar get_scale() SK_OVERRIDE { | |
| 202 return 192.f/fSize; | |
| 203 } | |
| 204 | |
| 205 void make_bitmap() SK_OVERRIDE { | |
| 206 fBM.setConfig(SkBitmap::kARGB_8888_Config, fSize, fSize); | |
| 207 fBM.allocPixels(); | |
| 208 | |
| 209 unsigned char *lena; | |
| 210 switch( fSize ) { | |
| 211 case 16: | |
| 212 lena = lena_16; | |
| 213 break; | |
| 214 case 32: | |
| 215 lena = lena_32; | |
| 216 break; | |
| 217 case 64: | |
| 218 lena = lena_64; | |
| 219 break; | |
| 220 case 128: | |
| 221 lena = lena_128; | |
| 222 break; | |
| 223 default: | |
| 224 lena = NULL; | |
| 225 break; | |
| 226 } | |
| 227 SkAutoLockPixels lock(fBM); | |
| 228 for (int y = 0; y < fSize; y ++) { | |
| 229 for (int x = 0; x < fSize; x ++) { | |
| 230 SkPMColor* s = fBM.getAddr32(x, y); | |
| 231 unsigned char *src = lena + 4*(y*fSize + x); | |
| 232 *s = SkPreMultiplyARGB(src[3], src[0], src[1], src[2]); | |
| 233 } | |
| 234 } | |
| 235 } | |
| 236 private: | |
| 237 typedef FilterBitmapGM INHERITED; | |
| 238 }; | |
| 239 | |
| 117 ////////////////////////////////////////////////////////////////////////////// | 240 ////////////////////////////////////////////////////////////////////////////// |
| 118 | 241 |
| 119 DEF_GM( return new FilterBitmapGM; ) | 242 DEF_GM( return new FilterBitmapTextGM(3); ) |
| 243 DEF_GM( return new FilterBitmapTextGM(7); ) | |
| 244 DEF_GM( return new FilterBitmapTextGM(10); ) | |
| 245 DEF_GM( return new FilterBitmapCheckerboardGM(4,4); ) | |
| 246 DEF_GM( return new FilterBitmapCheckerboardGM(32,32); ) | |
| 247 DEF_GM( return new FilterBitmapCheckerboardGM(32,8); ) | |
| 248 DEF_GM( return new FilterBitmapCheckerboardGM(32,2); ) | |
| 249 DEF_GM( return new FilterBitmapCheckerboardGM(192,192); ) | |
| 250 DEF_GM( return new FilterBitmapImageGM(16); ) | |
| 251 DEF_GM( return new FilterBitmapImageGM(32); ) | |
| 252 DEF_GM( return new FilterBitmapImageGM(64); ) | |
| 253 DEF_GM( return new FilterBitmapImageGM(128); ) | |
| OLD | NEW |