1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker // This test only works with the GL backend. 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GL 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 28*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 29*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h" 30*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h" 31*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 32*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkImageGanesh.h" 33*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLBackendSurface.h" 34*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkAutoPixmapStorage.h" 35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h" 36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h" 37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLCaps.h" 38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLDefines.h" 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm> 41*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 42*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 45*c8dee2aaSAndroid Build Coastguard Worker class RectangleTexture : public GM { 46*c8dee2aaSAndroid Build Coastguard Worker public: RectangleTexture()47*c8dee2aaSAndroid Build Coastguard Worker RectangleTexture() { 48*c8dee2aaSAndroid Build Coastguard Worker this->setBGColor(0xFFFFFFFF); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker private: 52*c8dee2aaSAndroid Build Coastguard Worker enum class ImageType { 53*c8dee2aaSAndroid Build Coastguard Worker kGradientCircle, 54*c8dee2aaSAndroid Build Coastguard Worker k2x2 55*c8dee2aaSAndroid Build Coastguard Worker }; 56*c8dee2aaSAndroid Build Coastguard Worker getName() const57*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("rectangle_texture"); } 58*c8dee2aaSAndroid Build Coastguard Worker getISize()59*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1180, 710); } 60*c8dee2aaSAndroid Build Coastguard Worker makeImagePixels(int size,ImageType type)61*c8dee2aaSAndroid Build Coastguard Worker SkBitmap makeImagePixels(int size, ImageType type) { 62*c8dee2aaSAndroid Build Coastguard Worker auto ii = SkImageInfo::Make(size, size, kRGBA_8888_SkColorType, kOpaque_SkAlphaType); 63*c8dee2aaSAndroid Build Coastguard Worker switch (type) { 64*c8dee2aaSAndroid Build Coastguard Worker case ImageType::kGradientCircle: { 65*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bmp; 66*c8dee2aaSAndroid Build Coastguard Worker bmp.allocPixels(ii); 67*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 68*c8dee2aaSAndroid Build Coastguard Worker SkCanvas canvas(bmp); 69*c8dee2aaSAndroid Build Coastguard Worker SkPoint pts[] = {{0, 0}, {0, SkIntToScalar(size)}}; 70*c8dee2aaSAndroid Build Coastguard Worker SkColor colors0[] = {0xFF1060B0, 0xFF102030}; 71*c8dee2aaSAndroid Build Coastguard Worker paint.setShader( 72*c8dee2aaSAndroid Build Coastguard Worker SkGradientShader::MakeLinear(pts, colors0, nullptr, 2, SkTileMode::kClamp)); 73*c8dee2aaSAndroid Build Coastguard Worker canvas.drawPaint(paint); 74*c8dee2aaSAndroid Build Coastguard Worker SkColor colors1[] = {0xFFA07010, 0xFFA02080}; 75*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 76*c8dee2aaSAndroid Build Coastguard Worker paint.setShader( 77*c8dee2aaSAndroid Build Coastguard Worker SkGradientShader::MakeLinear(pts, colors1, nullptr, 2, SkTileMode::kClamp)); 78*c8dee2aaSAndroid Build Coastguard Worker canvas.drawCircle(size/2.f, size/2.f, 2.f*size/5, paint); 79*c8dee2aaSAndroid Build Coastguard Worker return bmp; 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker case ImageType::k2x2: { 82*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bmp; 83*c8dee2aaSAndroid Build Coastguard Worker bmp.allocPixels(ii); 84*c8dee2aaSAndroid Build Coastguard Worker *bmp.getAddr32(0, 0) = 0xFF0000FF; 85*c8dee2aaSAndroid Build Coastguard Worker *bmp.getAddr32(1, 0) = 0xFF00FF00; 86*c8dee2aaSAndroid Build Coastguard Worker *bmp.getAddr32(0, 1) = 0xFFFF0000; 87*c8dee2aaSAndroid Build Coastguard Worker *bmp.getAddr32(1, 1) = 0xFFFFFFFF; 88*c8dee2aaSAndroid Build Coastguard Worker return bmp; 89*c8dee2aaSAndroid Build Coastguard Worker } 90*c8dee2aaSAndroid Build Coastguard Worker } 91*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE; 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker createRectangleTextureImg(GrDirectContext * dContext,GrSurfaceOrigin origin,const SkBitmap content)94*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> createRectangleTextureImg(GrDirectContext* dContext, GrSurfaceOrigin origin, 95*c8dee2aaSAndroid Build Coastguard Worker const SkBitmap content) { 96*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(content.colorType() == kRGBA_8888_SkColorType); 97*c8dee2aaSAndroid Build Coastguard Worker auto format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_RECTANGLE); 98*c8dee2aaSAndroid Build Coastguard Worker auto bet = dContext->createBackendTexture(content.width(), 99*c8dee2aaSAndroid Build Coastguard Worker content.height(), 100*c8dee2aaSAndroid Build Coastguard Worker format, 101*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo, 102*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo, 103*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo, 104*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"CreateRectangleTextureImage"); 105*c8dee2aaSAndroid Build Coastguard Worker if (!bet.isValid()) { 106*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 107*c8dee2aaSAndroid Build Coastguard Worker } 108*c8dee2aaSAndroid Build Coastguard Worker if (!dContext->updateBackendTexture(bet, content.pixmap(), origin, nullptr, nullptr)) { 109*c8dee2aaSAndroid Build Coastguard Worker dContext->deleteBackendTexture(bet); 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker return SkImages::AdoptTextureFrom(dContext, bet, origin, kRGBA_8888_SkColorType); 112*c8dee2aaSAndroid Build Coastguard Worker } 113*c8dee2aaSAndroid Build Coastguard Worker onGpuSetup(SkCanvas * canvas,SkString * errorMsg,GraphiteTestContext *)114*c8dee2aaSAndroid Build Coastguard Worker DrawResult onGpuSetup(SkCanvas* canvas, SkString* errorMsg, GraphiteTestContext*) override { 115*c8dee2aaSAndroid Build Coastguard Worker auto context = GrAsDirectContext(canvas->recordingContext()); 116*c8dee2aaSAndroid Build Coastguard Worker if (!context || context->abandoned()) { 117*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kSkip; 118*c8dee2aaSAndroid Build Coastguard Worker } 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker if (context->backend() != GrBackendApi::kOpenGL_GrBackend || 121*c8dee2aaSAndroid Build Coastguard Worker !static_cast<const GrGLCaps*>(context->priv().caps())->rectangleTextureSupport()) { 122*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = "This GM requires an OpenGL context that supports texture rectangles."; 123*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kSkip; 124*c8dee2aaSAndroid Build Coastguard Worker } 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker auto gradCircle = this->makeImagePixels(50, ImageType::kGradientCircle); 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker fGradImgs[0] = this->createRectangleTextureImg(context, kTopLeft_GrSurfaceOrigin, 129*c8dee2aaSAndroid Build Coastguard Worker gradCircle); 130*c8dee2aaSAndroid Build Coastguard Worker fGradImgs[1] = this->createRectangleTextureImg(context, kBottomLeft_GrSurfaceOrigin, 131*c8dee2aaSAndroid Build Coastguard Worker gradCircle); 132*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(SkToBool(fGradImgs[0]) == SkToBool(fGradImgs[1])); 133*c8dee2aaSAndroid Build Coastguard Worker if (!fGradImgs[0]) { 134*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = "Could not create gradient rectangle texture images."; 135*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kFail; 136*c8dee2aaSAndroid Build Coastguard Worker } 137*c8dee2aaSAndroid Build Coastguard Worker 138*c8dee2aaSAndroid Build Coastguard Worker fSmallImg = this->createRectangleTextureImg(context, kTopLeft_GrSurfaceOrigin, 139*c8dee2aaSAndroid Build Coastguard Worker this->makeImagePixels(2, ImageType::k2x2)); 140*c8dee2aaSAndroid Build Coastguard Worker if (!fSmallImg) { 141*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = "Could not create 2x2 rectangle texture image."; 142*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kFail; 143*c8dee2aaSAndroid Build Coastguard Worker } 144*c8dee2aaSAndroid Build Coastguard Worker 145*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kOk; 146*c8dee2aaSAndroid Build Coastguard Worker } 147*c8dee2aaSAndroid Build Coastguard Worker onGpuTeardown()148*c8dee2aaSAndroid Build Coastguard Worker void onGpuTeardown() override { 149*c8dee2aaSAndroid Build Coastguard Worker fGradImgs[0] = fGradImgs[1] = nullptr; 150*c8dee2aaSAndroid Build Coastguard Worker fSmallImg = nullptr; 151*c8dee2aaSAndroid Build Coastguard Worker } 152*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas,SkString * errorMsg)153*c8dee2aaSAndroid Build Coastguard Worker DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override { 154*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGradImgs[0] && fGradImgs[1] && fSmallImg); 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkScalar kPad = 5.f; 157*c8dee2aaSAndroid Build Coastguard Worker 158*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions kSamplings[] = { 159*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkFilterMode::kNearest), 160*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkFilterMode::kLinear), 161*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear), 162*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkCubicResampler::Mitchell()), 163*c8dee2aaSAndroid Build Coastguard Worker }; 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker constexpr SkScalar kScales[] = {1.0f, 1.2f, 0.75f}; 166*c8dee2aaSAndroid Build Coastguard Worker 167*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kPad, kPad); 168*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < kNumGradImages; ++i) { 169*c8dee2aaSAndroid Build Coastguard Worker auto img = fGradImgs[i]; 170*c8dee2aaSAndroid Build Coastguard Worker int w = img->width(); 171*c8dee2aaSAndroid Build Coastguard Worker int h = img->height(); 172*c8dee2aaSAndroid Build Coastguard Worker for (auto scale : kScales) { 173*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 174*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(scale, scale); 175*c8dee2aaSAndroid Build Coastguard Worker for (auto s : kSamplings) { 176*c8dee2aaSAndroid Build Coastguard Worker // drawImage 177*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(img, 0, 0, s); 178*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(w + kPad, 0); 179*c8dee2aaSAndroid Build Coastguard Worker 180*c8dee2aaSAndroid Build Coastguard Worker // clamp/clamp shader 181*c8dee2aaSAndroid Build Coastguard Worker SkPaint clampPaint; 182*c8dee2aaSAndroid Build Coastguard Worker clampPaint.setShader(fGradImgs[i]->makeShader(s)); 183*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect::MakeWH(1.5f*w, 1.5f*h), clampPaint); 184*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(1.5f*w + kPad, 0); 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker // repeat/mirror shader 187*c8dee2aaSAndroid Build Coastguard Worker SkPaint repeatPaint; 188*c8dee2aaSAndroid Build Coastguard Worker repeatPaint.setShader(fGradImgs[i]->makeShader(SkTileMode::kRepeat, 189*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kMirror, 190*c8dee2aaSAndroid Build Coastguard Worker s)); 191*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect::MakeWH(1.5f*w, 1.5f*h), repeatPaint); 192*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(1.5f*w + kPad, 0); 193*c8dee2aaSAndroid Build Coastguard Worker 194*c8dee2aaSAndroid Build Coastguard Worker // drawImageRect with kStrict 195*c8dee2aaSAndroid Build Coastguard Worker auto srcRect = SkRect::MakeXYWH(.25f*w, .25f*h, .50f*w, .50f*h); 196*c8dee2aaSAndroid Build Coastguard Worker auto dstRect = SkRect::MakeXYWH( 0, 0, .50f*w, .50f*h); 197*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImageRect(fGradImgs[i], srcRect, dstRect, s, nullptr, 198*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::kStrict_SrcRectConstraint); 199*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(.5f*w + kPad, 0); 200*c8dee2aaSAndroid Build Coastguard Worker } 201*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 202*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, kPad + 1.5f*h*scale); 203*c8dee2aaSAndroid Build Coastguard Worker } 204*c8dee2aaSAndroid Build Coastguard Worker } 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkScalar kOutset = 25.f; 207*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kOutset, kOutset); 208*c8dee2aaSAndroid Build Coastguard Worker auto dstRect = SkRect::Make(fSmallImg->dimensions()).makeOutset(kOutset, kOutset); 209*c8dee2aaSAndroid Build Coastguard Worker 210*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions gSamplings[] = { 211*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkFilterMode::kNearest), 212*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkFilterMode::kLinear), 213*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear), 214*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(SkCubicResampler::Mitchell()), 215*c8dee2aaSAndroid Build Coastguard Worker }; 216*c8dee2aaSAndroid Build Coastguard Worker 217*c8dee2aaSAndroid Build Coastguard Worker for (const auto& sampling : gSamplings) { 218*c8dee2aaSAndroid Build Coastguard Worker if (!sampling.useCubic && sampling.mipmap != SkMipmapMode::kNone) { 219*c8dee2aaSAndroid Build Coastguard Worker // Medium is the same as Low for upscaling. 220*c8dee2aaSAndroid Build Coastguard Worker continue; 221*c8dee2aaSAndroid Build Coastguard Worker } 222*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 223*c8dee2aaSAndroid Build Coastguard Worker for (int ty = 0; ty < kSkTileModeCount; ++ty) { 224*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 225*c8dee2aaSAndroid Build Coastguard Worker for (int tx = 0; tx < kSkTileModeCount; ++tx) { 226*c8dee2aaSAndroid Build Coastguard Worker SkMatrix lm; 227*c8dee2aaSAndroid Build Coastguard Worker lm.setRotate(45.f, 1, 1); 228*c8dee2aaSAndroid Build Coastguard Worker lm.postScale(6.5f, 6.5f); 229*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 230*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(fSmallImg->makeShader(static_cast<SkTileMode>(tx), 231*c8dee2aaSAndroid Build Coastguard Worker static_cast<SkTileMode>(ty), 232*c8dee2aaSAndroid Build Coastguard Worker sampling, 233*c8dee2aaSAndroid Build Coastguard Worker lm)); 234*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(dstRect, paint); 235*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(dstRect.width() + kPad, 0); 236*c8dee2aaSAndroid Build Coastguard Worker } 237*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 238*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, dstRect.height() + kPad); 239*c8dee2aaSAndroid Build Coastguard Worker } 240*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 241*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((dstRect.width() + kPad)*kSkTileModeCount, 0); 242*c8dee2aaSAndroid Build Coastguard Worker } 243*c8dee2aaSAndroid Build Coastguard Worker 244*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kOk; 245*c8dee2aaSAndroid Build Coastguard Worker } 246*c8dee2aaSAndroid Build Coastguard Worker 247*c8dee2aaSAndroid Build Coastguard Worker private: 248*c8dee2aaSAndroid Build Coastguard Worker static const int kNumGradImages = 2; 249*c8dee2aaSAndroid Build Coastguard Worker 250*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fGradImgs[kNumGradImages]; 251*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fSmallImg; 252*c8dee2aaSAndroid Build Coastguard Worker 253*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 254*c8dee2aaSAndroid Build Coastguard Worker }; 255*c8dee2aaSAndroid Build Coastguard Worker 256*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new RectangleTexture;) 257*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 258*c8dee2aaSAndroid Build Coastguard Worker #endif 259