1 /* 2 * Copyright 2019 Google LLC. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "gm/gm.h" 9 10 #include "include/core/SkPath.h" 11 #include "include/gpu/GrContextOptions.h" 12 #include "include/gpu/GrRecordingContext.h" 13 #include "src/gpu/GrDirectContextPriv.h" 14 #include "src/gpu/GrDrawingManager.h" 15 #include "src/gpu/GrRecordingContextPriv.h" 16 #include "tools/ToolUtils.h" 17 18 namespace skiagm { 19 20 /** 21 * This test originally ensured that the ccpr path cache preserved fill rules properly. CCRP is gone 22 * now, but we decided to keep the test. 23 */ 24 class ManyPathAtlasesGM : public GpuGM { 25 public: ManyPathAtlasesGM(int maxAtlasSize)26 ManyPathAtlasesGM(int maxAtlasSize) : fMaxAtlasSize(maxAtlasSize) {} 27 private: onShortName()28 SkString onShortName() override { return SkStringPrintf("manypathatlases_%i", fMaxAtlasSize); } onISize()29 SkISize onISize() override { return SkISize::Make(128, 128); } 30 modifyGrContextOptions(GrContextOptions * ctxOptions)31 void modifyGrContextOptions(GrContextOptions* ctxOptions) override { 32 // This will test the case where the atlas runs out of room if fMaxAtlasSize is small. 33 ctxOptions->fMaxTextureAtlasSize = fMaxAtlasSize; 34 } 35 onDraw(GrRecordingContext * rContext,SkCanvas * canvas,SkString * errorMsg)36 DrawResult onDraw(GrRecordingContext* rContext, SkCanvas* canvas, SkString* errorMsg) override { 37 canvas->clear({1,1,0,1}); 38 39 // Flush the context to make the DAG empty. This will test the case where we try to add an 40 // atlas task to an empty DAG. 41 if (auto dContext = rContext->asDirectContext()) { 42 dContext->flush(); 43 } 44 45 SkPath clip = SkPath().moveTo(-50, 20) 46 .cubicTo(-50, -20, 50, -20, 50, 40) 47 .cubicTo(20, 0, -20, 0, -50, 20); 48 clip.transform(SkMatrix::Translate(64, 70)); 49 for (int i = 0; i < 4; ++i) { 50 SkPath rotatedClip = clip; 51 rotatedClip.transform(SkMatrix::RotateDeg(30 * i + 128, {64, 70})); 52 rotatedClip.setIsVolatile(true); 53 canvas->clipPath(rotatedClip, SkClipOp::kDifference, true); 54 } 55 SkPath path = SkPath().moveTo(20, 0) 56 .lineTo(108, 0).cubicTo(108, 20, 108, 20, 128, 20) 57 .lineTo(128, 108).cubicTo(108, 108, 108, 108, 108, 128) 58 .lineTo(20, 128).cubicTo(20, 108, 20, 108, 0, 108) 59 .lineTo(0, 20).cubicTo(20, 20, 20, 20, 20, 0); 60 path.setIsVolatile(true); 61 SkPaint teal; 62 teal.setColor4f({.03f, .91f, .87f, 1}); 63 teal.setAntiAlias(true); 64 canvas->drawPath(path, teal); 65 return DrawResult::kOk; 66 } 67 68 const int fMaxAtlasSize; 69 }; 70 71 DEF_GM( return new ManyPathAtlasesGM(128); ) // Atlas runs out of room. 72 DEF_GM( return new ManyPathAtlasesGM(2048); ) // Atlas does not run out of room. 73 74 } // namespace skiagm 75