Index: gm/downsamplebitmap.cpp |
diff --git a/gm/downsamplebitmap.cpp b/gm/downsamplebitmap.cpp |
index ce10b47a84d6acd7d31aefcdbeb720a1f1a2ea91..50b15494b6f04771ffdf10bee90d1b07070c8e2a 100644 |
--- a/gm/downsamplebitmap.cpp |
+++ b/gm/downsamplebitmap.cpp |
@@ -14,6 +14,22 @@ |
#include "SkStream.h" |
#include "SkPaint.h" |
+static void make_checker(SkBitmap* bm, int size, int numChecks) { |
+ bm->allocN32Pixels(size, size); |
+ for (int y = 0; y < size; ++y) { |
+ for (int x = 0; x < size; ++x) { |
+ SkPMColor* s = bm->getAddr32(x, y); |
+ int cx = (x * numChecks) / size; |
+ int cy = (y * numChecks) / size; |
+ if ((cx+cy)%2) { |
+ *s = 0xFFFFFFFF; |
+ } else { |
+ *s = 0xFF000000; |
+ } |
+ } |
+ } |
+} |
+ |
static void setTypeface(SkPaint* paint, const char name[], SkTypeface::Style style) { |
sk_tool_utils::set_portable_typeface(paint, name, style); |
} |
@@ -139,19 +155,7 @@ class DownsampleBitmapCheckerboardGM: public DownsampleBitmapGM { |
int fNumChecks; |
void make_bitmap() SK_OVERRIDE { |
- fBM.allocN32Pixels(fSize, fSize); |
- for (int y = 0; y < fSize; ++y) { |
- for (int x = 0; x < fSize; ++x) { |
- SkPMColor* s = fBM.getAddr32(x, y); |
- int cx = (x * fNumChecks) / fSize; |
- int cy = (y * fNumChecks) / fSize; |
- if ((cx+cy)%2) { |
- *s = 0xFFFFFFFF; |
- } else { |
- *s = 0xFF000000; |
- } |
- } |
- } |
+ make_checker(&fBM, fSize, fNumChecks); |
} |
private: |
typedef DownsampleBitmapGM INHERITED; |
@@ -190,6 +194,59 @@ class DownsampleBitmapImageGM: public DownsampleBitmapGM { |
typedef DownsampleBitmapGM INHERITED; |
}; |
+#include "SkMipMap.h" |
+class ShowMipLevels : public skiagm::GM { |
+public: |
+ SkBitmap fBM; |
+ |
+ ShowMipLevels() { |
+ this->setBGColor(0xFFDDDDDD); |
+ make_checker(&fBM, 512, 256); |
+ } |
+ |
+protected: |
+#if 0 |
+ uint32_t onGetFlags() const SK_OVERRIDE { |
+ return kSkipTiled_Flag; |
+ } |
+#endif |
+ |
+ SkString onShortName() SK_OVERRIDE { |
+ return SkString("showmiplevels"); |
+ } |
+ |
+ SkISize onISize() SK_OVERRIDE { |
+ return SkISize::Make(fBM.width() + 4, 4 * fBM.height()); |
+ } |
+ |
+ void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
+ SkScalar x = 4; |
+ SkScalar y = 4; |
+ canvas->drawBitmap(fBM, x, y, NULL); |
+ y += fBM.height() + 4; |
+ |
+ SkMipMap* mm = SkMipMap::Build(fBM, NULL); |
+ |
+ SkMipMap::Level level; |
+ SkScalar scale = 0.5f; |
+ while (mm->extractLevel(scale, &level)) { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(level.fWidth, level.fHeight); |
+ SkBitmap bm; |
+ bm.installPixels(info, level.fPixels, level.fRowBytes); |
+ canvas->drawBitmap(bm, x, y, NULL); |
+ y += bm.height() + 4; |
+ scale /= 2; |
+ if (info.width() == 1 || info.height() == 1) { |
+ break; |
+ } |
+ } |
+ } |
+ |
+private: |
+ typedef skiagm::GM INHERITED; |
+}; |
+ |
+ |
////////////////////////////////////////////////////////////////////////////// |
DEF_GM( return new DownsampleBitmapTextGM(72, SkPaint::kHigh_FilterLevel); ) |
@@ -215,3 +272,5 @@ DEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, SkPaint::kNone_Filter |
DEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", SkPaint::kNone_FilterLevel); ) |
DEF_GM( return new DownsampleBitmapImageGM("mandrill_132x132_12x12.astc", |
SkPaint::kNone_FilterLevel); ) |
+ |
+DEF_GM( return new ShowMipLevels; ) |