170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org/*
270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * Copyright 2011 Google Inc.
370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org *
470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * found in the LICENSE file.
670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org */
770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "gm.h"
970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "SkSurface.h"
1070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "SkCanvas.h"
110d276f71d2cf30f4a282cd4f470084c6b42c6af2piotaixr#include "SkDecodingImageGenerator.h"
12d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org#include "SkStream.h"
13d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org#include "SkData.h"
14d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org
1597b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#if SK_SUPPORT_GPU
1697b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#include "GrContext.h"
1797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#endif
1897af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
19d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.orgstatic void drawJpeg(SkCanvas* canvas, const SkISize& size) {
20ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    // TODO: Make this draw a file that is checked in, so it can
21ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    // be exercised on machines other than mike's. Will require a
22ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com    // rebaseline.
2348925e3b3179a19b5cebed8ead237633107f160freed    SkAutoDataUnref data(SkData::NewFromFileName("/Users/mike/Downloads/skia.google.jpeg"));
2448925e3b3179a19b5cebed8ead237633107f160freed    if (NULL == data.get()) {
2548925e3b3179a19b5cebed8ead237633107f160freed        return;
2648925e3b3179a19b5cebed8ead237633107f160freed    }
270d276f71d2cf30f4a282cd4f470084c6b42c6af2piotaixr    SkImage* image = SkImage::NewFromGenerator(
280d276f71d2cf30f4a282cd4f470084c6b42c6af2piotaixr                SkDecodingImageGenerator::Create(data, SkDecodingImageGenerator::Options()));
29d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org    if (image) {
30d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org        SkAutoCanvasRestore acr(canvas, true);
31d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org        canvas->scale(size.width() * 1.0f / image->width(),
32d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org                      size.height() * 1.0f / image->height());
33b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr        canvas->drawImage(image, 0, 0, NULL);
34d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org        image->unref();
35d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org    }
36d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org}
3770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
3870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic void drawContents(SkSurface* surface, SkColor fillC) {
3904ba448579b976369075c675d847ef0f779d40f4skia.committer@gmail.com    SkSize size = SkSize::Make(SkIntToScalar(surface->width()),
4094acc70312d8fe6605dea99f27f62b180bf22284robertphillips@google.com                               SkIntToScalar(surface->height()));
41d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org    SkCanvas* canvas = surface->getCanvas();
4270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
4370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    SkScalar stroke = size.fWidth / 10;
4470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    SkScalar radius = (size.fWidth - stroke) / 2;
4570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
4670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    SkPaint paint;
47ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
4870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    paint.setAntiAlias(true);
4970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    paint.setColor(fillC);
5070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
51ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    paint.setStyle(SkPaint::kStroke_Style);
5370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    paint.setStrokeWidth(stroke);
5470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    paint.setColor(SK_ColorBLACK);
5570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
5670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org}
5770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
58dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.orgstatic void test_surface(SkCanvas* canvas, SkSurface* surf, bool usePaint) {
5970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    drawContents(surf, SK_ColorRED);
605ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org    SkImage* imgR = surf->newImageSnapshot();
6170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
6297af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    if (true) {
635ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org        SkImage* imgR2 = surf->newImageSnapshot();
6497af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com        SkASSERT(imgR == imgR2);
6597af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com        imgR2->unref();
6697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    }
6797af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
6870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    drawContents(surf, SK_ColorGREEN);
695ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org    SkImage* imgG = surf->newImageSnapshot();
7070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
7197af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    // since we've drawn after we snapped imgR, imgG will be a different obj
7297af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    SkASSERT(imgR != imgG);
7397af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
7470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    drawContents(surf, SK_ColorBLUE);
7570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
76d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org    SkPaint paint;
77d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org//    paint.setFilterBitmap(true);
78d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org//    paint.setAlpha(0x80);
79d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org
80b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr    canvas->drawImage(imgR, 0, 0, usePaint ? &paint : NULL);
81b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr    canvas->drawImage(imgG, 0, 80, usePaint ? &paint : NULL);
82dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    surf->draw(canvas, 0, 160, usePaint ? &paint : NULL);
83dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org
84dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    SkRect src1, src2, src3;
85dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    src1.iset(0, 0, surf->width(), surf->height());
867f1af501f206da48a7ff791af53432c9c1c89d08skia.committer@gmail.com    src2.iset(-surf->width() / 2, -surf->height() / 2,
87dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org             surf->width(), surf->height());
88dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    src3.iset(0, 0, surf->width() / 2, surf->height() / 2);
89dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org
90dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    SkRect dst1, dst2, dst3, dst4;
91dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    dst1.set(0, 240, 65, 305);
92dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    dst2.set(0, 320, 65, 385);
93dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    dst3.set(0, 400, 65, 465);
94dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    dst4.set(0, 480, 65, 545);
95dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org
96b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr    canvas->drawImageRect(imgR, &src1, dst1, usePaint ? &paint : NULL);
97b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr    canvas->drawImageRect(imgG, &src2, dst2, usePaint ? &paint : NULL);
98b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr    canvas->drawImageRect(imgR, &src3, dst3, usePaint ? &paint : NULL);
99b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr    canvas->drawImageRect(imgG, NULL, dst4, usePaint ? &paint : NULL);
10070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
10170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    imgG->unref();
10270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    imgR->unref();
10370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org}
10470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
10570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgclass ImageGM : public skiagm::GM {
10670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    void*   fBuffer;
10758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com    size_t  fBufferSize;
10870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    SkSize  fSize;
10970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    enum {
11070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org        W = 64,
11170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org        H = 64,
11270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org        RB = W * 4 + 8,
11370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    };
11470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgpublic:
11570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    ImageGM() {
11658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        fBufferSize = RB * H;
11758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        fBuffer = sk_malloc_throw(fBufferSize);
11870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org        fSize.set(SkIntToScalar(W), SkIntToScalar(H));
11970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    }
120ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
12170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    virtual ~ImageGM() {
12270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org        sk_free(fBuffer);
12370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    }
124ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
125ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
12670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgprotected:
12770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    virtual SkString onShortName() {
12897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        return SkString("image-surface");
12970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    }
130ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
13170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    virtual SkISize onISize() {
132dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        return SkISize::Make(960, 1200);
13370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    }
134ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
13570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
136d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org        drawJpeg(canvas, this->getISize());
137d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org
138d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org        canvas->scale(2, 2);
139d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org
14097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        static const char* kLabel1 = "Original Img";
14197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        static const char* kLabel2 = "Modified Img";
14297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        static const char* kLabel3 = "Cur Surface";
143dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        static const char* kLabel4 = "Full Crop";
144dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        static const char* kLabel5 = "Over-crop";
145dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        static const char* kLabel6 = "Upper-left";
146dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        static const char* kLabel7 = "No Crop";
14797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
148dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        static const char* kLabel8 = "Pre-Alloc Img";
149dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        static const char* kLabel9 = "New Alloc Img";
150cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org        static const char* kLabel10 = "Null Paint";
151cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org        static const char* kLabel11 = "GPU";
15297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
15397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        SkPaint textPaint;
154cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org        textPaint.setAntiAlias(true);
155992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&textPaint);
156cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org        textPaint.setTextSize(8);
15797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
15897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        canvas->drawText(kLabel1, strlen(kLabel1), 10,  60, textPaint);
15997b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        canvas->drawText(kLabel2, strlen(kLabel2), 10, 140, textPaint);
16097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        canvas->drawText(kLabel3, strlen(kLabel3), 10, 220, textPaint);
161dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel4, strlen(kLabel4), 10, 300, textPaint);
162dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel5, strlen(kLabel5), 10, 380, textPaint);
163dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel6, strlen(kLabel6), 10, 460, textPaint);
164dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel7, strlen(kLabel7), 10, 540, textPaint);
16597b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
166dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel8, strlen(kLabel8),  80, 10, textPaint);
167dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel9, strlen(kLabel9), 160, 10, textPaint);
168dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel10, strlen(kLabel10), 250, 10, textPaint);
169dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->drawText(kLabel11, strlen(kLabel11), 320, 10, textPaint);
17097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
17197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        canvas->translate(80, 20);
17297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
17358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        // since we draw into this directly, we need to start fresh
17458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com        sk_bzero(fBuffer, fBufferSize);
17558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com
17632678d9a453e2c9fd26e92be429cdd84250b4d85commit-bot@chromium.org        SkImageInfo info = SkImageInfo::MakeN32Premul(W, H);
177b947625800a26194fcf63d7b57dadb1a63677f6amike@reedtribe.org        SkAutoTUnref<SkSurface> surf0(SkSurface::NewRasterDirect(info, fBuffer, RB));
178b947625800a26194fcf63d7b57dadb1a63677f6amike@reedtribe.org        SkAutoTUnref<SkSurface> surf1(SkSurface::NewRaster(info));
17997b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#if SK_SUPPORT_GPU
180644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        GrContext* ctx = canvas->getGrContext();
18197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
1824a8126e7f81384526629b1e21bf89b632ea13cd9reed        SkAutoTUnref<SkSurface> surf4(SkSurface::NewRenderTarget(ctx, info));
18397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#endif
18470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
185dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        test_surface(canvas, surf0, true);
186dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        canvas->translate(80, 0);
187dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org        test_surface(canvas, surf1, true);
18897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#if SK_SUPPORT_GPU
18949f085dddff10473b6ebf832a974288300224e60bsalomon        if (ctx) {
19097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com            canvas->translate(80, 0);
191dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org            test_surface(canvas, surf4, true);
19297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com        }
19397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#endif
19470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    }
195ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
19697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    virtual uint32_t onGetFlags() const SK_OVERRIDE {
1979c72827f90759b37e11da6df6126bc484b5b5d91reed@google.com        return GM::kSkipPicture_Flag | GM::kSkipPipe_Flag;
19897af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com    }
19997af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
20070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgprivate:
20170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org    typedef skiagm::GM INHERITED;
20270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org};
203ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
20470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
20570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org
20670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic skiagm::GM* MyFactory(void*) { return new ImageGM; }
20770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic skiagm::GMRegistry reg(MyFactory);
208