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