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