/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm/gm.h" #include "include/core/SkBitmap.h" #include "include/core/SkCanvas.h" #include "include/core/SkColor.h" #include "include/core/SkFilterQuality.h" #include "include/core/SkFont.h" #include "include/core/SkFontStyle.h" #include "include/core/SkImageInfo.h" #include "include/core/SkMatrix.h" #include "include/core/SkPaint.h" #include "include/core/SkPixmap.h" #include "include/core/SkScalar.h" #include "include/core/SkSize.h" #include "include/core/SkString.h" #include "include/core/SkTypeface.h" #include "include/core/SkTypes.h" #include "tools/Resources.h" #include "tools/ToolUtils.h" static const char* kFilterQualityNames[] = { "none", "low", "medium", "high" }; struct DownsampleBitmapGM : public skiagm::GM { SkBitmap (*fMakeBitmap)(SkImageInfo); SkString fName; SkFilterQuality fFilterQuality; DownsampleBitmapGM(SkBitmap (*fn)(SkImageInfo), const char* kind, SkFilterQuality fq) : fMakeBitmap(fn) , fName(SkStringPrintf("downsamplebitmap_%s_%s", kind, kFilterQualityNames[fq])) , fFilterQuality(fq) { this->setBGColor(0xFFDDDDDD); } SkString onShortName() override { return fName; } SkISize onISize() override { SkBitmap bm = fMakeBitmap(SkImageInfo::MakeN32Premul(1,1)/*whatever*/); return SkISize::Make(bm.width(), 4 * bm.height()); } void onDraw(SkCanvas* canvas) override { SkImageInfo info = canvas->imageInfo(); if (!info.colorType()) { info = info.makeColorType( kN32_SkColorType); } if (!info.alphaType()) { info = info.makeAlphaType(kPremul_SkAlphaType); } SkBitmap bm = fMakeBitmap(info); bm.setImmutable(); int curY = 0; int curHeight; float curScale = 1; do { SkMatrix matrix; matrix.setScale( curScale, curScale ); SkPaint paint; paint.setFilterQuality(fFilterQuality); canvas->save(); canvas->translate(0, (SkScalar)curY); canvas->concat(matrix); canvas->drawBitmap(bm, 0, 0, &paint); canvas->restore(); curHeight = (int) (bm.height() * curScale + 2); curY += curHeight; curScale *= 0.75f; } while (curHeight >= 2 && curY < 4*bm.height()); } }; static SkBitmap convert_bitmap_format(SkBitmap src, SkImageInfo info) { SkBitmap dst; dst.allocPixels(info.makeDimensions(src.dimensions())); SkPixmap pm; SkAssertResult(dst.peekPixels(&pm)); SkAssertResult(src.readPixels(pm)); return dst; } static SkBitmap make_text(SkImageInfo info) { const SkScalar textSize = 72; SkBitmap bm; bm.allocPixels(info.makeWH(int(textSize * 8), int(textSize * 6))); SkCanvas canvas(bm); canvas.drawColor(SK_ColorWHITE); SkPaint paint; SkFont font; font.setSubpixel(true); font.setSize(textSize); font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle())); canvas.drawString("Hamburgefons", textSize/2, 1.2f*textSize, font, paint); font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::Bold())); canvas.drawString("Hamburgefons", textSize/2, 2.4f*textSize, font, paint); font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::Italic())); canvas.drawString("Hamburgefons", textSize/2, 3.6f*textSize, font, paint); font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::BoldItalic())); canvas.drawString("Hamburgefons", textSize/2, 4.8f*textSize, font, paint); return bm; } DEF_GM( return new DownsampleBitmapGM(make_text, "text", kHigh_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_text, "text", kMedium_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_text, "text", kLow_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_text, "text", kNone_SkFilterQuality); ) static SkBitmap make_checkerboard(SkImageInfo info) { const auto size = 512; const auto numChecks = 256; SkBitmap bm; 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; } } } return convert_bitmap_format(bm, info); } DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kHigh_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kMedium_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kLow_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kNone_SkFilterQuality); ) static SkBitmap make_image(SkImageInfo info) { SkBitmap bm; if (!GetResourceAsBitmap("images/mandrill_512.png", &bm)) { bm.allocN32Pixels(1, 1); bm.eraseARGB(255, 255, 0 , 0); // red == bad } return convert_bitmap_format(bm, info); } DEF_GM( return new DownsampleBitmapGM(make_image, "image", kHigh_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_image, "image", kMedium_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_image, "image", kLow_SkFilterQuality); ) DEF_GM( return new DownsampleBitmapGM(make_image, "image", kNone_SkFilterQuality); )