| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 // This test only works with the GPU backend. | 9 // This test only works with the GPU backend. |
| 10 | 10 |
| 11 #include "gm.h" | 11 #include "gm.h" |
| 12 | 12 |
| 13 #if SK_SUPPORT_GPU | 13 #if SK_SUPPORT_GPU |
| 14 | 14 |
| 15 #include "GrContext.h" | 15 #include "GrContext.h" |
| 16 #include "GrDefaultGeoProcFactory.h" | 16 #include "GrDefaultGeoProcFactory.h" |
| 17 #include "GrDrawContextPriv.h" | 17 #include "GrDrawContextPriv.h" |
| 18 #include "GrPathUtils.h" | 18 #include "GrPathUtils.h" |
| 19 #include "GrTest.h" | 19 #include "GrTest.h" |
| 20 #include "SkColorPriv.h" | 20 #include "SkColorPriv.h" |
| 21 #include "SkDevice.h" | 21 #include "SkDevice.h" |
| 22 #include "SkGeometry.h" | 22 #include "SkGeometry.h" |
| 23 #include "SkTLList.h" | 23 #include "SkTLList.h" |
| 24 | 24 |
| 25 #include "batches/GrTestBatch.h" | 25 #include "batches/GrTestBatch.h" |
| 26 #include "batches/GrVertexBatch.h" | 26 #include "batches/GrVertexBatch.h" |
| 27 | 27 |
| 28 #include "effects/GrConvexPolyEffect.h" | 28 #include "effects/GrConvexPolyEffect.h" |
| 29 | 29 |
| 30 /** outset rendered rect to visualize anti-aliased poly edges */ |
| 31 static SkRect outset(const SkRect& unsorted) { |
| 32 SkRect r = unsorted; |
| 33 r.outset(5.f, 5.f); |
| 34 return r; |
| 35 } |
| 36 |
| 37 /** sorts a rect */ |
| 38 static SkRect sorted_rect(const SkRect& unsorted) { |
| 39 SkRect r = unsorted; |
| 40 r.sort(); |
| 41 return r; |
| 42 } |
| 43 |
| 30 namespace skiagm { | 44 namespace skiagm { |
| 31 | 45 class PolyBoundsBatch : public GrTestBatch { |
| 32 class ConvexPolyTestBatch : public GrTestBatch { | |
| 33 public: | 46 public: |
| 34 DEFINE_BATCH_CLASS_ID | 47 DEFINE_BATCH_CLASS_ID |
| 35 struct Geometry : public GrTestBatch::Geometry { | |
| 36 SkRect fRect; | |
| 37 SkRect fBounds; // This will be == fRect, except fBounds must be sorted,
whereas fRect can | |
| 38 // be inverted | |
| 39 }; | |
| 40 | 48 |
| 41 const char* name() const override { return "ConvexPolyTestBatch"; } | 49 const char* name() const override { return "PolyBoundsBatch"; } |
| 42 | 50 |
| 43 static GrDrawBatch* Create(const GrGeometryProcessor* gp, const Geometry& ge
o) { | 51 PolyBoundsBatch(const SkRect& rect, GrColor color) |
| 44 return new ConvexPolyTestBatch(gp, geo); | 52 : INHERITED(ClassID(), outset(sorted_rect(rect)), color) |
| 53 , fRect(outset(rect)) { |
| 45 } | 54 } |
| 46 | 55 |
| 47 private: | 56 private: |
| 48 ConvexPolyTestBatch(const GrGeometryProcessor* gp, const Geometry& geo) | 57 void onPrepareDraws(Target* target) const override { |
| 49 : INHERITED(ClassID(), gp, geo.fBounds) | 58 using namespace GrDefaultGeoProcFactory; |
| 50 , fGeometry(geo) { | |
| 51 // Make sure any artifacts around the exterior of path are visible by us
ing overly | |
| 52 // conservative bounding geometry. | |
| 53 fGeometry.fBounds.outset(5.f, 5.f); | |
| 54 fGeometry.fRect.outset(5.f, 5.f); | |
| 55 } | |
| 56 | 59 |
| 57 Geometry* geoData(int index) override { | 60 Color color(this->color()); |
| 58 SkASSERT(0 == index); | 61 Coverage coverage(Coverage::kSolid_Type); |
| 59 return &fGeometry; | 62 LocalCoords localCoords(LocalCoords::kUnused_Type); |
| 60 } | 63 SkAutoTUnref<const GrGeometryProcessor> gp( |
| 64 GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatr
ix::I())); |
| 61 | 65 |
| 62 const Geometry* geoData(int index) const override { | 66 size_t vertexStride = gp->getVertexStride(); |
| 63 SkASSERT(0 == index); | |
| 64 return &fGeometry; | |
| 65 } | |
| 66 | |
| 67 void generateGeometry(Target* target) const override { | |
| 68 size_t vertexStride = this->geometryProcessor()->getVertexStride(); | |
| 69 SkASSERT(vertexStride == sizeof(SkPoint)); | 67 SkASSERT(vertexStride == sizeof(SkPoint)); |
| 70 QuadHelper helper; | 68 QuadHelper helper; |
| 71 SkPoint* verts = reinterpret_cast<SkPoint*>(helper.init(target, vertexSt
ride, 1)); | 69 SkPoint* verts = reinterpret_cast<SkPoint*>(helper.init(target, vertexSt
ride, 1)); |
| 72 if (!verts) { | 70 if (!verts) { |
| 73 return; | 71 return; |
| 74 } | 72 } |
| 75 | 73 |
| 76 fGeometry.fRect.toQuad(verts); | 74 fRect.toQuad(verts); |
| 77 | 75 |
| 78 helper.recordDraw(target); | 76 helper.recordDraw(target, gp); |
| 79 } | 77 } |
| 80 | 78 |
| 81 Geometry fGeometry; | 79 SkRect fRect; |
| 82 | 80 |
| 83 typedef GrTestBatch INHERITED; | 81 typedef GrTestBatch INHERITED; |
| 84 }; | 82 }; |
| 85 | 83 |
| 86 /** | 84 /** |
| 87 * This GM directly exercises a GrProcessor that draws convex polygons. | 85 * This GM directly exercises a GrProcessor that draws convex polygons. |
| 88 */ | 86 */ |
| 89 class ConvexPolyEffect : public GM { | 87 class ConvexPolyEffect : public GM { |
| 90 public: | 88 public: |
| 91 ConvexPolyEffect() { | 89 ConvexPolyEffect() { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 // vertically/horizontally thin rects that don't cover pixel centers | 143 // vertically/horizontally thin rects that don't cover pixel centers |
| 146 fRects.addToTail(SkRect::MakeLTRB(5.55f, 0.5f, 5.75f, 24.5f)); | 144 fRects.addToTail(SkRect::MakeLTRB(5.55f, 0.5f, 5.75f, 24.5f)); |
| 147 fRects.addToTail(SkRect::MakeLTRB(5.5f, .05f, 29.5f, .25f)); | 145 fRects.addToTail(SkRect::MakeLTRB(5.5f, .05f, 29.5f, .25f)); |
| 148 // small in x and y | 146 // small in x and y |
| 149 fRects.addToTail(SkRect::MakeLTRB(5.05f, .55f, 5.45f, .85f)); | 147 fRects.addToTail(SkRect::MakeLTRB(5.05f, .55f, 5.45f, .85f)); |
| 150 // inverted in x and y | 148 // inverted in x and y |
| 151 fRects.addToTail(SkRect::MakeLTRB(100.f, 50.5f, 5.f, 0.5f)); | 149 fRects.addToTail(SkRect::MakeLTRB(100.f, 50.5f, 5.f, 0.5f)); |
| 152 } | 150 } |
| 153 | 151 |
| 154 void onDraw(SkCanvas* canvas) override { | 152 void onDraw(SkCanvas* canvas) override { |
| 155 using namespace GrDefaultGeoProcFactory; | |
| 156 GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget
(); | 153 GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget
(); |
| 157 if (nullptr == rt) { | 154 if (nullptr == rt) { |
| 158 skiagm::GM::DrawGpuOnlyMessage(canvas); | 155 skiagm::GM::DrawGpuOnlyMessage(canvas); |
| 159 return; | 156 return; |
| 160 } | 157 } |
| 161 GrContext* context = rt->getContext(); | 158 GrContext* context = rt->getContext(); |
| 162 if (nullptr == context) { | 159 if (nullptr == context) { |
| 163 return; | 160 return; |
| 164 } | 161 } |
| 165 | 162 |
| 166 SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(rt)); | 163 SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(rt)); |
| 167 if (!drawContext) { | 164 if (!drawContext) { |
| 168 return; | 165 return; |
| 169 } | 166 } |
| 170 | 167 |
| 171 Color color(0xff000000); | |
| 172 Coverage coverage(Coverage::kSolid_Type); | |
| 173 LocalCoords localCoords(LocalCoords::kUnused_Type); | |
| 174 SkAutoTUnref<const GrGeometryProcessor> gp( | |
| 175 GrDefaultGeoProcFactory::Create(color, coverage, localCoords, Sk
Matrix::I())); | |
| 176 | |
| 177 SkScalar y = 0; | 168 SkScalar y = 0; |
| 178 for (PathList::Iter iter(fPaths, PathList::Iter::kHead_IterStart); | 169 for (PathList::Iter iter(fPaths, PathList::Iter::kHead_IterStart); |
| 179 iter.get(); | 170 iter.get(); |
| 180 iter.next()) { | 171 iter.next()) { |
| 181 const SkPath* path = iter.get(); | 172 const SkPath* path = iter.get(); |
| 182 SkScalar x = 0; | 173 SkScalar x = 0; |
| 183 | 174 |
| 184 for (int et = 0; et < kGrProcessorEdgeTypeCnt; ++et) { | 175 for (int et = 0; et < kGrProcessorEdgeTypeCnt; ++et) { |
| 185 const SkMatrix m = SkMatrix::MakeTrans(x, y); | 176 const SkMatrix m = SkMatrix::MakeTrans(x, y); |
| 186 SkPath p; | 177 SkPath p; |
| 187 path->transform(m, &p); | 178 path->transform(m, &p); |
| 188 | 179 |
| 189 GrPrimitiveEdgeType edgeType = (GrPrimitiveEdgeType) et; | 180 GrPrimitiveEdgeType edgeType = (GrPrimitiveEdgeType) et; |
| 190 SkAutoTUnref<GrFragmentProcessor> fp(GrConvexPolyEffect::Create(
edgeType, p)); | 181 SkAutoTUnref<GrFragmentProcessor> fp(GrConvexPolyEffect::Create(
edgeType, p)); |
| 191 if (!fp) { | 182 if (!fp) { |
| 192 continue; | 183 continue; |
| 193 } | 184 } |
| 194 | 185 |
| 195 GrPipelineBuilder pipelineBuilder; | 186 GrPipelineBuilder pipelineBuilder; |
| 196 pipelineBuilder.setXPFactory( | 187 pipelineBuilder.setXPFactory( |
| 197 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref
(); | 188 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref
(); |
| 198 pipelineBuilder.addCoverageFragmentProcessor(fp); | 189 pipelineBuilder.addCoverageFragmentProcessor(fp); |
| 199 pipelineBuilder.setRenderTarget(rt); | 190 pipelineBuilder.setRenderTarget(rt); |
| 200 | 191 |
| 201 ConvexPolyTestBatch::Geometry geometry; | 192 SkAutoTUnref<GrDrawBatch> batch(new PolyBoundsBatch(p.getBounds(
), 0xff000000)); |
| 202 geometry.fColor = color.fColor; | |
| 203 geometry.fRect = p.getBounds(); | |
| 204 geometry.fBounds = p.getBounds(); | |
| 205 | |
| 206 SkAutoTUnref<GrDrawBatch> batch(ConvexPolyTestBatch::Create(gp,
geometry)); | |
| 207 | 193 |
| 208 drawContext->drawContextPriv().testingOnly_drawBatch(pipelineBui
lder, batch); | 194 drawContext->drawContextPriv().testingOnly_drawBatch(pipelineBui
lder, batch); |
| 209 | 195 |
| 210 x += SkScalarCeilToScalar(path->getBounds().width() + 10.f); | 196 x += SkScalarCeilToScalar(path->getBounds().width() + 10.f); |
| 211 } | 197 } |
| 212 | 198 |
| 213 // Draw AA and non AA paths using normal API for reference. | 199 // Draw AA and non AA paths using normal API for reference. |
| 214 canvas->save(); | 200 canvas->save(); |
| 215 canvas->translate(x, y); | 201 canvas->translate(x, y); |
| 216 SkPaint paint; | 202 SkPaint paint; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 237 if (!fp) { | 223 if (!fp) { |
| 238 continue; | 224 continue; |
| 239 } | 225 } |
| 240 | 226 |
| 241 GrPipelineBuilder pipelineBuilder; | 227 GrPipelineBuilder pipelineBuilder; |
| 242 pipelineBuilder.setXPFactory( | 228 pipelineBuilder.setXPFactory( |
| 243 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref
(); | 229 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref
(); |
| 244 pipelineBuilder.addCoverageFragmentProcessor(fp); | 230 pipelineBuilder.addCoverageFragmentProcessor(fp); |
| 245 pipelineBuilder.setRenderTarget(rt); | 231 pipelineBuilder.setRenderTarget(rt); |
| 246 | 232 |
| 247 ConvexPolyTestBatch::Geometry geometry; | 233 SkAutoTUnref<GrDrawBatch> batch(new PolyBoundsBatch(rect, 0xff00
0000)); |
| 248 geometry.fColor = color.fColor; | |
| 249 geometry.fRect = rect; | |
| 250 geometry.fBounds = rect; | |
| 251 geometry.fBounds.sort(); | |
| 252 | |
| 253 SkAutoTUnref<GrDrawBatch> batch(ConvexPolyTestBatch::Create(gp,
geometry)); | |
| 254 | 234 |
| 255 drawContext->drawContextPriv().testingOnly_drawBatch(pipelineBui
lder, batch); | 235 drawContext->drawContextPriv().testingOnly_drawBatch(pipelineBui
lder, batch); |
| 256 | 236 |
| 257 x += SkScalarCeilToScalar(rect.width() + 10.f); | 237 x += SkScalarCeilToScalar(rect.width() + 10.f); |
| 258 } | 238 } |
| 259 | 239 |
| 260 // Draw rect without and with AA using normal API for reference | 240 // Draw rect without and with AA using normal API for reference |
| 261 canvas->save(); | 241 canvas->save(); |
| 262 canvas->translate(x, y); | 242 canvas->translate(x, y); |
| 263 SkPaint paint; | 243 SkPaint paint; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 277 PathList fPaths; | 257 PathList fPaths; |
| 278 RectList fRects; | 258 RectList fRects; |
| 279 | 259 |
| 280 typedef GM INHERITED; | 260 typedef GM INHERITED; |
| 281 }; | 261 }; |
| 282 | 262 |
| 283 DEF_GM(return new ConvexPolyEffect;) | 263 DEF_GM(return new ConvexPolyEffect;) |
| 284 } | 264 } |
| 285 | 265 |
| 286 #endif | 266 #endif |
| OLD | NEW |