180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gm.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSurface.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkData.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#if SK_SUPPORT_GPU
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrContext.h"
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergernamespace skiagm {
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruextern GrContext* GetGr();
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkData* fileToData(const char path[]) {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkFILEStream stream(path);
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!stream.isValid()) {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return SkData::NewEmpty();
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t size = stream.getLength();
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void* mem = sk_malloc_throw(size);
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    stream.read(mem, size);
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkData::NewFromMalloc(mem, size);
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void drawJpeg(SkCanvas* canvas, const SkISize& size) {
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // TODO: Make this draw a file that is checked in, so it can
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // be exercised on machines other than mike's. Will require a
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // rebaseline.
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoDataUnref data(fileToData("/Users/mike/Downloads/skia.google.jpeg"));
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkImage* image = SkImage::NewEncodedData(data);
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (image) {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkAutoCanvasRestore acr(canvas, true);
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->scale(size.width() * 1.0f / image->width(),
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                      size.height() * 1.0f / image->height());
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        image->draw(canvas, 0, 0, NULL);
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        image->unref();
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void drawContents(SkSurface* surface, SkColor fillC) {
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSize size = SkSize::Make(SkIntToScalar(surface->width()),
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                               SkIntToScalar(surface->height()));
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkCanvas* canvas = surface->getCanvas();
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar stroke = size.fWidth / 10;
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar radius = (size.fWidth - stroke) / 2;
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaint paint;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setAntiAlias(true);
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setColor(fillC);
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setStyle(SkPaint::kStroke_Style);
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setStrokeWidth(stroke);
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setColor(SK_ColorBLACK);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void test_surface(SkCanvas* canvas, SkSurface* surf, bool usePaint) {
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    drawContents(surf, SK_ColorRED);
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkImage* imgR = surf->newImageSnapshot();
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (true) {
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkImage* imgR2 = surf->newImageSnapshot();
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(imgR == imgR2);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        imgR2->unref();
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    drawContents(surf, SK_ColorGREEN);
797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkImage* imgG = surf->newImageSnapshot();
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // since we've drawn after we snapped imgR, imgG will be a different obj
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(imgR != imgG);
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    drawContents(surf, SK_ColorBLUE);
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaint paint;
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//    paint.setFilterBitmap(true);
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//    paint.setAlpha(0x80);
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    imgR->draw(canvas, 0, 0, usePaint ? &paint : NULL);
9158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    imgG->draw(canvas, 0, 80, usePaint ? &paint : NULL);
9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    surf->draw(canvas, 0, 160, usePaint ? &paint : NULL);
9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkRect src1, src2, src3;
9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    src1.iset(0, 0, surf->width(), surf->height());
9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    src2.iset(-surf->width() / 2, -surf->height() / 2,
9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger             surf->width(), surf->height());
9858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    src3.iset(0, 0, surf->width() / 2, surf->height() / 2);
9958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkRect dst1, dst2, dst3, dst4;
10158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    dst1.set(0, 240, 65, 305);
10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    dst2.set(0, 320, 65, 385);
10358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    dst3.set(0, 400, 65, 465);
10458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    dst4.set(0, 480, 65, 545);
10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
10658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    imgR->draw(canvas, &src1, dst1, usePaint ? &paint : NULL);
10758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    imgG->draw(canvas, &src2, dst2, usePaint ? &paint : NULL);
10858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    imgR->draw(canvas, &src3, dst3, usePaint ? &paint : NULL);
10958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    imgG->draw(canvas, NULL, dst4, usePaint ? &paint : NULL);
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    imgG->unref();
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    imgR->unref();
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass ImageGM : public skiagm::GM {
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void*   fBuffer;
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t  fBufferSize;
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSize  fSize;
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum {
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        W = 64,
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        H = 64,
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        RB = W * 4 + 8,
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ImageGM() {
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBufferSize = RB * H;
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBuffer = sk_malloc_throw(fBufferSize);
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fSize.set(SkIntToScalar(W), SkIntToScalar(H));
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~ImageGM() {
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        sk_free(fBuffer);
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkString onShortName() {
138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        return SkString("image-surface");
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkISize onISize() {
14258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return SkISize::Make(960, 1200);
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        drawJpeg(canvas, this->getISize());
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->scale(2, 2);
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        static const char* kLabel1 = "Original Img";
151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        static const char* kLabel2 = "Modified Img";
152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        static const char* kLabel3 = "Cur Surface";
15358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel4 = "Full Crop";
15458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel5 = "Over-crop";
15558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel6 = "Upper-left";
15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel7 = "No Crop";
157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
15858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel8 = "Pre-Alloc Img";
15958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel9 = "New Alloc Img";
16058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel10 = "SkPicture";
16158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel11 = "Null Paint";
16258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const char* kLabel12 = "GPU";
163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
164363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkPaint textPaint;
165363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        canvas->drawText(kLabel1, strlen(kLabel1), 10,  60, textPaint);
167363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        canvas->drawText(kLabel2, strlen(kLabel2), 10, 140, textPaint);
168363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        canvas->drawText(kLabel3, strlen(kLabel3), 10, 220, textPaint);
16958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel4, strlen(kLabel4), 10, 300, textPaint);
17058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel5, strlen(kLabel5), 10, 380, textPaint);
17158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel6, strlen(kLabel6), 10, 460, textPaint);
17258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel7, strlen(kLabel7), 10, 540, textPaint);
173363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
17458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel8, strlen(kLabel8),  80, 10, textPaint);
17558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel9, strlen(kLabel9), 160, 10, textPaint);
17658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel10, strlen(kLabel10), 250, 10, textPaint);
17758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel11, strlen(kLabel11), 320, 10, textPaint);
17858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->drawText(kLabel12, strlen(kLabel12), 410, 10, textPaint);
179363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
180363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        canvas->translate(80, 20);
181363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // since we draw into this directly, we need to start fresh
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        sk_bzero(fBuffer, fBufferSize);
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkImage::Info info;
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info.fWidth = W;
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info.fHeight = H;
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info.fColorType = SkImage::kPMColor_ColorType;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info.fAlphaType = SkImage::kPremul_AlphaType;
191363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkAutoTUnref<SkSurface> surf0(SkSurface::NewRasterDirect(info, fBuffer, RB));
192363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkAutoTUnref<SkSurface> surf1(SkSurface::NewRaster(info));
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkAutoTUnref<SkSurface> surf2(SkSurface::NewPicture(info.fWidth, info.fHeight));
19458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkAutoTUnref<SkSurface> surf3(SkSurface::NewPicture(info.fWidth, info.fHeight));
195363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#if SK_SUPPORT_GPU
196363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        GrContext* ctx = skiagm::GetGr();
197363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
19858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkAutoTUnref<SkSurface> surf4(SkSurface::NewRenderTarget(ctx, info, 0));
199363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        test_surface(canvas, surf0, true);
20258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas->translate(80, 0);
20358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        test_surface(canvas, surf1, true);
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->translate(80, 0);
20558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        test_surface(canvas, surf2, true);
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->translate(80, 0);
20758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        test_surface(canvas, surf3, false);
208363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#if SK_SUPPORT_GPU
209363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        if (NULL != ctx) {
210363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            canvas->translate(80, 0);
21158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            test_surface(canvas, surf4, true);
212363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
213363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual uint32_t onGetFlags() const SK_OVERRIDE {
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return GM::kSkipPicture_Flag | GM::kSkipPipe_Flag;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef skiagm::GM INHERITED;
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//////////////////////////////////////////////////////////////////////////////
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GM* MyFactory(void*) { return new ImageGM; }
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GMRegistry reg(MyFactory);
228