19c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com/* 29c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com * Copyright 2013 Google Inc. 39c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com * 49c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com * Use of this source code is governed by a BSD-style license that can be 59c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com * found in the LICENSE file. 69c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com */ 79c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 89c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com#include "gm.h" 99c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h" 11bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkGradientShader.h" 129c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com#include "SkTypeface.h" 139c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com#include "SkImageDecoder.h" 149c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com#include "SkStream.h" 15af42a03051e6a588cda01a988c31eb6493d7d299humper@google.com#include "SkPaint.h" 169c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 17c695e954174e4a789631ea4d6e171bd7118ebc67reedstatic void make_checker(SkBitmap* bm, int size, int numChecks) { 18c695e954174e4a789631ea4d6e171bd7118ebc67reed bm->allocN32Pixels(size, size); 19c695e954174e4a789631ea4d6e171bd7118ebc67reed for (int y = 0; y < size; ++y) { 20c695e954174e4a789631ea4d6e171bd7118ebc67reed for (int x = 0; x < size; ++x) { 21c695e954174e4a789631ea4d6e171bd7118ebc67reed SkPMColor* s = bm->getAddr32(x, y); 22c695e954174e4a789631ea4d6e171bd7118ebc67reed int cx = (x * numChecks) / size; 23c695e954174e4a789631ea4d6e171bd7118ebc67reed int cy = (y * numChecks) / size; 24c695e954174e4a789631ea4d6e171bd7118ebc67reed if ((cx+cy)%2) { 25c695e954174e4a789631ea4d6e171bd7118ebc67reed *s = 0xFFFFFFFF; 26c695e954174e4a789631ea4d6e171bd7118ebc67reed } else { 27c695e954174e4a789631ea4d6e171bd7118ebc67reed *s = 0xFF000000; 28c695e954174e4a789631ea4d6e171bd7118ebc67reed } 29c695e954174e4a789631ea4d6e171bd7118ebc67reed } 30c695e954174e4a789631ea4d6e171bd7118ebc67reed } 31c695e954174e4a789631ea4d6e171bd7118ebc67reed} 32c695e954174e4a789631ea4d6e171bd7118ebc67reed 339c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comstatic void setTypeface(SkPaint* paint, const char name[], SkTypeface::Style style) { 34992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(paint, name, style); 359c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com} 369c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 379c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comclass DownsampleBitmapGM : public skiagm::GM { 389c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.compublic: 399c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkBitmap fBM; 409c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkString fName; 419c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com bool fBitmapMade; 4293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed SkFilterQuality fFilterQuality; 439c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 4493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed DownsampleBitmapGM(SkFilterQuality filterQuality) 4593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed : fFilterQuality(filterQuality) 469c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com { 479c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com this->setBGColor(0xFFDDDDDD); 489c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com fBitmapMade = false; 499c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 509c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 5193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed const char* filterQualityToString() { 5293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed static const char *filterQualityNames[] = { 53e2cf805e9ae57f259307ab0834dd23dfe468c316humper@google.com "none", "low", "medium", "high" 54e2cf805e9ae57f259307ab0834dd23dfe468c316humper@google.com }; 5593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed return filterQualityNames[fFilterQuality]; 56af42a03051e6a588cda01a988c31eb6493d7d299humper@google.com } 579c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 589c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comprotected: 59a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 6036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 619c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com return fName; 629c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 639c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 6436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 659c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com make_bitmap_wrapper(); 666a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein return SkISize::Make(fBM.width(), 4 * fBM.height()); 679c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 689c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 699c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com void make_bitmap_wrapper() { 709c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com if (!fBitmapMade) { 719c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com fBitmapMade = true; 729c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com make_bitmap(); 739c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 749c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 759c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 769c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com virtual void make_bitmap() = 0; 779c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 7836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 799c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com make_bitmap_wrapper(); 809c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 816a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein int curY = 0; 826a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein int curHeight; 839c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com float curScale = 1; 849c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com do { 859c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 869c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkMatrix matrix; 879c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com matrix.setScale( curScale, curScale ); 889c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 899c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkPaint paint; 9093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed paint.setFilterQuality(fFilterQuality); 919c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 929c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas->save(); 936a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein canvas->translate(0, (SkScalar)curY); 94c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malita canvas->concat(matrix); 95c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malita canvas->drawBitmap(fBM, 0, 0, &paint); 969c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas->restore(); 979c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 986a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein curHeight = (int) (fBM.height() * curScale + 2); 996a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein curY += curHeight; 1009c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com curScale *= 0.75f; 1016a2f5fe8677f27d737da0e4e6dd1f814fbdbb6fcmtklein } while (curHeight >= 2 && curY < 4*fBM.height()); 1029c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1039c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1049c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comprivate: 1059c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com typedef skiagm::GM INHERITED; 1069c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com}; 1079c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1089c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comclass DownsampleBitmapTextGM: public DownsampleBitmapGM { 1099c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com public: 11093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed DownsampleBitmapTextGM(float textSize, SkFilterQuality filterQuality) 11193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed : INHERITED(filterQuality), fTextSize(textSize) 1129c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com { 11393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed fName.printf("downsamplebitmap_text_%s_%.2fpt", this->filterQualityToString(), fTextSize); 1149c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1159c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1169c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com protected: 1179c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com float fTextSize; 1189c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 11936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void make_bitmap() override { 120eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com fBM.allocN32Pixels(int(fTextSize * 8), int(fTextSize * 6)); 1219c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkCanvas canvas(fBM); 1229c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas.drawColor(SK_ColorWHITE); 1239c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1249c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkPaint paint; 1259c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com paint.setAntiAlias(true); 1269c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com paint.setSubpixelText(true); 1279c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com paint.setTextSize(fTextSize); 1289c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1299c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com setTypeface(&paint, "Times", SkTypeface::kNormal); 1309c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas.drawText("Hamburgefons", 12, fTextSize/2, 1.2f*fTextSize, paint); 1319c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com setTypeface(&paint, "Times", SkTypeface::kBold); 1329c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas.drawText("Hamburgefons", 12, fTextSize/2, 2.4f*fTextSize, paint); 1339c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com setTypeface(&paint, "Times", SkTypeface::kItalic); 1349c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas.drawText("Hamburgefons", 12, fTextSize/2, 3.6f*fTextSize, paint); 1359c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com setTypeface(&paint, "Times", SkTypeface::kBoldItalic); 1369c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com canvas.drawText("Hamburgefons", 12, fTextSize/2, 4.8f*fTextSize, paint); 1379c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1389c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com private: 1399c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com typedef DownsampleBitmapGM INHERITED; 1409c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com}; 1419c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1429c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comclass DownsampleBitmapCheckerboardGM: public DownsampleBitmapGM { 1439c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com public: 14493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed DownsampleBitmapCheckerboardGM(int size, int numChecks, SkFilterQuality filterQuality) 14593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed : INHERITED(filterQuality), fSize(size), fNumChecks(numChecks) 1469c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com { 14793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed fName.printf("downsamplebitmap_checkerboard_%s_%d_%d", this->filterQualityToString(), fSize, fNumChecks); 1489c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1499c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1509c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com protected: 1519c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com int fSize; 1529c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com int fNumChecks; 1539c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 15436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void make_bitmap() override { 155c695e954174e4a789631ea4d6e171bd7118ebc67reed make_checker(&fBM, fSize, fNumChecks); 1569c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1579c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com private: 1589c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com typedef DownsampleBitmapGM INHERITED; 1599c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com}; 1609c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1619c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.comclass DownsampleBitmapImageGM: public DownsampleBitmapGM { 1629c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com public: 16393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed DownsampleBitmapImageGM(const char filename[], SkFilterQuality filterQuality) 16493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed : INHERITED(filterQuality), fFilename(filename) 1659c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com { 16693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed fName.printf("downsamplebitmap_image_%s_%s", this->filterQualityToString(), filename); 1679c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1689c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 1699c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com protected: 1709c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkString fFilename; 1719c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com int fSize; 1729c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 17336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void make_bitmap() override { 174bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkImageDecoder* codec = NULL; 175c846f4a96bcde1ffeaf17afc1469db6f2cbd1ad3tfarina SkString resourcePath = GetResourcePath(fFilename.c_str()); 176bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkFILEStream stream(resourcePath.c_str()); 1779c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com if (stream.isValid()) { 1789c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com codec = SkImageDecoder::Factory(&stream); 1799c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1809c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com if (codec) { 1819c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com stream.rewind(); 182bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode); 1839c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com SkDELETE(codec); 1849c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } else { 185eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com fBM.allocN32Pixels(1, 1); 1869c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad 1879c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1889c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com fSize = fBM.height(); 1899c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com } 1909c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com private: 1919c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com typedef DownsampleBitmapGM INHERITED; 1929c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com}; 1939c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 194c695e954174e4a789631ea4d6e171bd7118ebc67reed#include "SkMipMap.h" 195a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary 196a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanarystatic void release_mipmap(void*, void* context) { 197a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary ((SkMipMap*)context)->unref(); 198a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary} 199a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary 200c695e954174e4a789631ea4d6e171bd7118ebc67reedclass ShowMipLevels : public skiagm::GM { 201c695e954174e4a789631ea4d6e171bd7118ebc67reedpublic: 202c695e954174e4a789631ea4d6e171bd7118ebc67reed SkBitmap fBM; 203c695e954174e4a789631ea4d6e171bd7118ebc67reed 204c695e954174e4a789631ea4d6e171bd7118ebc67reed ShowMipLevels() { 205c695e954174e4a789631ea4d6e171bd7118ebc67reed this->setBGColor(0xFFDDDDDD); 206c695e954174e4a789631ea4d6e171bd7118ebc67reed make_checker(&fBM, 512, 256); 207c695e954174e4a789631ea4d6e171bd7118ebc67reed } 208c695e954174e4a789631ea4d6e171bd7118ebc67reed 209c695e954174e4a789631ea4d6e171bd7118ebc67reedprotected: 210c695e954174e4a789631ea4d6e171bd7118ebc67reed 21136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 212c695e954174e4a789631ea4d6e171bd7118ebc67reed return SkString("showmiplevels"); 213c695e954174e4a789631ea4d6e171bd7118ebc67reed } 214c695e954174e4a789631ea4d6e171bd7118ebc67reed 21536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 216c695e954174e4a789631ea4d6e171bd7118ebc67reed return SkISize::Make(fBM.width() + 8, 2 * fBM.height() + 80); 217c695e954174e4a789631ea4d6e171bd7118ebc67reed } 218c695e954174e4a789631ea4d6e171bd7118ebc67reed 21936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 220c695e954174e4a789631ea4d6e171bd7118ebc67reed SkScalar x = 4; 221c695e954174e4a789631ea4d6e171bd7118ebc67reed SkScalar y = 4; 222c695e954174e4a789631ea4d6e171bd7118ebc67reed canvas->drawBitmap(fBM, x, y, NULL); 223c695e954174e4a789631ea4d6e171bd7118ebc67reed y += fBM.height() + 4; 224c695e954174e4a789631ea4d6e171bd7118ebc67reed 225c695e954174e4a789631ea4d6e171bd7118ebc67reed SkAutoTUnref<SkMipMap> mm(SkMipMap::Build(fBM, NULL)); 226c695e954174e4a789631ea4d6e171bd7118ebc67reed 227c695e954174e4a789631ea4d6e171bd7118ebc67reed SkMipMap::Level level; 228c695e954174e4a789631ea4d6e171bd7118ebc67reed SkScalar scale = 0.5f; 229c695e954174e4a789631ea4d6e171bd7118ebc67reed while (mm->extractLevel(scale, &level)) { 230c695e954174e4a789631ea4d6e171bd7118ebc67reed SkImageInfo info = SkImageInfo::MakeN32Premul(level.fWidth, level.fHeight); 231c695e954174e4a789631ea4d6e171bd7118ebc67reed SkBitmap bm; 232a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary bm.installPixels(info, level.fPixels, level.fRowBytes, NULL, 233a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary &release_mipmap, (void*)(SkRef(mm.get()))); 234a1cb378a8295806b20bff556bab3ebb3ed9e71bbhalcanary bm.setImmutable(); 235c695e954174e4a789631ea4d6e171bd7118ebc67reed canvas->drawBitmap(bm, x, y, NULL); 236c695e954174e4a789631ea4d6e171bd7118ebc67reed y += bm.height() + 4; 237c695e954174e4a789631ea4d6e171bd7118ebc67reed scale /= 2; 238c695e954174e4a789631ea4d6e171bd7118ebc67reed if (info.width() == 1 || info.height() == 1) { 239c695e954174e4a789631ea4d6e171bd7118ebc67reed break; 240c695e954174e4a789631ea4d6e171bd7118ebc67reed } 241c695e954174e4a789631ea4d6e171bd7118ebc67reed } 242c695e954174e4a789631ea4d6e171bd7118ebc67reed } 2431c4029296f518a84ef90095243ba210163a1e1f9mtklein 244c695e954174e4a789631ea4d6e171bd7118ebc67reedprivate: 245c695e954174e4a789631ea4d6e171bd7118ebc67reed typedef skiagm::GM INHERITED; 246c695e954174e4a789631ea4d6e171bd7118ebc67reed}; 247c695e954174e4a789631ea4d6e171bd7118ebc67reedDEF_GM( return new ShowMipLevels; ) 248c695e954174e4a789631ea4d6e171bd7118ebc67reed 2499c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com////////////////////////////////////////////////////////////////////////////// 2509c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com 25193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapTextGM(72, kHigh_SkFilterQuality); ) 25293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, kHigh_SkFilterQuality); ) 25393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", kHigh_SkFilterQuality); ) 254efd7d45fc0fc5f2b924c774c5d38ce546f35f3cabsalomonDEF_GM( return new DownsampleBitmapImageGM("mandrill_132x132_12x12.astc", 25593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed kHigh_SkFilterQuality); ) 256af42a03051e6a588cda01a988c31eb6493d7d299humper@google.com 25793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapTextGM(72, kMedium_SkFilterQuality); ) 25893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, kMedium_SkFilterQuality); ) 25993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", kMedium_SkFilterQuality); ) 260efd7d45fc0fc5f2b924c774c5d38ce546f35f3cabsalomonDEF_GM( return new DownsampleBitmapImageGM("mandrill_132x132_12x12.astc", 26193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed kMedium_SkFilterQuality); ) 262af42a03051e6a588cda01a988c31eb6493d7d299humper@google.com 26393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapTextGM(72, kLow_SkFilterQuality); ) 26493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, kLow_SkFilterQuality); ) 26593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", kLow_SkFilterQuality); ) 266efd7d45fc0fc5f2b924c774c5d38ce546f35f3cabsalomonDEF_GM( return new DownsampleBitmapImageGM("mandrill_132x132_12x12.astc", 26793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed kLow_SkFilterQuality); ) 268af42a03051e6a588cda01a988c31eb6493d7d299humper@google.com 26993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapTextGM(72, kNone_SkFilterQuality); ) 27093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapCheckerboardGM(512,256, kNone_SkFilterQuality); ) 27193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_GM( return new DownsampleBitmapImageGM("mandrill_512.png", kNone_SkFilterQuality); ) 272efd7d45fc0fc5f2b924c774c5d38ce546f35f3cabsalomonDEF_GM( return new DownsampleBitmapImageGM("mandrill_132x132_12x12.astc", 27393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed kNone_SkFilterQuality); ) 274