OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 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 #include "GrAtlasTextContext.h" | 9 #include "GrAtlasTextContext.h" |
10 #include "GrBatchTest.h" | 10 #include "GrBatchTest.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 class AutoCheckFlush { | 31 class AutoCheckFlush { |
32 public: | 32 public: |
33 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} | 33 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} |
34 ~AutoCheckFlush() { fContext->flushIfNecessary(); } | 34 ~AutoCheckFlush() { fContext->flushIfNecessary(); } |
35 | 35 |
36 private: | 36 private: |
37 GrContext* fContext; | 37 GrContext* fContext; |
38 }; | 38 }; |
39 | 39 |
| 40 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress |
| 41 // drawTargets to be picked up and added to by drawContexts lower in the call |
| 42 // stack. When this occurs with a closed drawTarget, a new one will be allocated |
| 43 // when the drawContext attempts to use it (via getDrawTarget). |
40 GrDrawContext::GrDrawContext(GrContext* context, | 44 GrDrawContext::GrDrawContext(GrContext* context, |
41 GrRenderTarget* rt, | 45 GrRenderTarget* rt, |
42 GrDrawTarget* drawTarget, | |
43 const SkSurfaceProps* surfaceProps) | 46 const SkSurfaceProps* surfaceProps) |
44 : fContext(context) | 47 : fContext(context) |
45 , fRenderTarget(rt) | 48 , fRenderTarget(rt) |
46 , fDrawTarget(SkRef(drawTarget)) | 49 , fDrawTarget(SkSafeRef(rt->getLastDrawTarget())) |
47 , fTextContext(nullptr) | 50 , fTextContext(nullptr) |
48 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { | 51 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { |
49 SkDEBUGCODE(this->validate();) | 52 SkDEBUGCODE(this->validate();) |
50 } | 53 } |
51 | 54 |
52 GrDrawContext::~GrDrawContext() { | |
53 SkSafeUnref(fDrawTarget); | |
54 } | |
55 | |
56 #ifdef SK_DEBUG | 55 #ifdef SK_DEBUG |
57 void GrDrawContext::validate() const { | 56 void GrDrawContext::validate() const { |
58 SkASSERT(fRenderTarget); | 57 SkASSERT(fRenderTarget); |
59 ASSERT_OWNED_RESOURCE(fRenderTarget); | 58 ASSERT_OWNED_RESOURCE(fRenderTarget); |
| 59 |
| 60 if (fDrawTarget && !fDrawTarget->isClosed()) { |
| 61 SkASSERT(fRenderTarget->getLastDrawTarget() == fDrawTarget); |
| 62 } |
60 } | 63 } |
61 #endif | 64 #endif |
62 | 65 |
| 66 GrDrawContext::~GrDrawContext() { |
| 67 SkSafeUnref(fDrawTarget); |
| 68 } |
| 69 |
| 70 GrDrawTarget* GrDrawContext::getDrawTarget() { |
| 71 SkDEBUGCODE(this->validate();) |
| 72 |
| 73 if (!fDrawTarget || fDrawTarget->isClosed()) { |
| 74 fDrawTarget = fContext->newDrawTarget(fRenderTarget); |
| 75 fRenderTarget->setLastDrawTarget(fDrawTarget); |
| 76 } |
| 77 |
| 78 return fDrawTarget; |
| 79 } |
| 80 |
63 void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const Sk
IPoint& dstPoint) { | 81 void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const Sk
IPoint& dstPoint) { |
64 RETURN_IF_ABANDONED | 82 RETURN_IF_ABANDONED |
65 SkDEBUGCODE(this->validate();) | 83 SkDEBUGCODE(this->validate();) |
66 | 84 |
67 fDrawTarget->copySurface(fRenderTarget, src, srcRect, dstPoint); | 85 this->getDrawTarget()->copySurface(fRenderTarget, src, srcRect, dstPoint); |
68 } | 86 } |
69 | 87 |
70 | 88 |
71 void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, | 89 void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, |
72 const SkPaint& skPaint, | 90 const SkPaint& skPaint, |
73 const SkMatrix& viewMatrix, | 91 const SkMatrix& viewMatrix, |
74 const char text[], size_t byteLength, | 92 const char text[], size_t byteLength, |
75 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ | 93 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ |
76 RETURN_IF_ABANDONED | 94 RETURN_IF_ABANDONED |
77 SkDEBUGCODE(this->validate();) | 95 SkDEBUGCODE(this->validate();) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, | 137 void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, |
120 const SkMatrix& viewMatrix, | 138 const SkMatrix& viewMatrix, |
121 const SkMatrix& localMatrix, | 139 const SkMatrix& localMatrix, |
122 GrColor color, | 140 GrColor color, |
123 GrPathRange* range, | 141 GrPathRange* range, |
124 GrPathRangeDraw* draw, | 142 GrPathRangeDraw* draw, |
125 int /*GrPathRendering::FillType*/ fill) { | 143 int /*GrPathRendering::FillType*/ fill) { |
126 RETURN_IF_ABANDONED | 144 RETURN_IF_ABANDONED |
127 SkDEBUGCODE(this->validate();) | 145 SkDEBUGCODE(this->validate();) |
128 | 146 |
129 fDrawTarget->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, c
olor, range, draw, | 147 this->getDrawTarget()->drawPathsFromRange(*pipelineBuilder, viewMatrix, loca
lMatrix, color, |
130 (GrPathRendering::FillType) fill); | 148 range, draw, (GrPathRendering::Fil
lType) fill); |
131 } | 149 } |
132 | 150 |
133 void GrDrawContext::discard() { | 151 void GrDrawContext::discard() { |
134 RETURN_IF_ABANDONED | 152 RETURN_IF_ABANDONED |
135 SkDEBUGCODE(this->validate();) | 153 SkDEBUGCODE(this->validate();) |
136 | 154 |
137 AutoCheckFlush acf(fContext); | 155 AutoCheckFlush acf(fContext); |
138 fDrawTarget->discard(fRenderTarget); | 156 this->getDrawTarget()->discard(fRenderTarget); |
139 } | 157 } |
140 | 158 |
141 void GrDrawContext::clear(const SkIRect* rect, | 159 void GrDrawContext::clear(const SkIRect* rect, |
142 const GrColor color, | 160 const GrColor color, |
143 bool canIgnoreRect) { | 161 bool canIgnoreRect) { |
144 RETURN_IF_ABANDONED | 162 RETURN_IF_ABANDONED |
145 SkDEBUGCODE(this->validate();) | 163 SkDEBUGCODE(this->validate();) |
146 | 164 |
147 AutoCheckFlush acf(fContext); | 165 AutoCheckFlush acf(fContext); |
148 fDrawTarget->clear(rect, color, canIgnoreRect, fRenderTarget); | 166 this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget); |
149 } | 167 } |
150 | 168 |
151 | 169 |
152 void GrDrawContext::drawPaint(const GrClip& clip, | 170 void GrDrawContext::drawPaint(const GrClip& clip, |
153 const GrPaint& origPaint, | 171 const GrPaint& origPaint, |
154 const SkMatrix& viewMatrix) { | 172 const SkMatrix& viewMatrix) { |
155 RETURN_IF_ABANDONED | 173 RETURN_IF_ABANDONED |
156 SkDEBUGCODE(this->validate();) | 174 SkDEBUGCODE(this->validate();) |
157 | 175 |
158 // set rect to be big enough to fill the space, but not super-huge, so we | 176 // set rect to be big enough to fill the space, but not super-huge, so we |
(...skipping 25 matching lines...) Expand all Loading... |
184 } else { | 202 } else { |
185 SkMatrix localMatrix; | 203 SkMatrix localMatrix; |
186 if (!viewMatrix.invert(&localMatrix)) { | 204 if (!viewMatrix.invert(&localMatrix)) { |
187 SkDebugf("Could not invert matrix\n"); | 205 SkDebugf("Could not invert matrix\n"); |
188 return; | 206 return; |
189 } | 207 } |
190 | 208 |
191 AutoCheckFlush acf(fContext); | 209 AutoCheckFlush acf(fContext); |
192 | 210 |
193 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); | 211 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); |
194 fDrawTarget->drawNonAARect(pipelineBuilder, | 212 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
195 paint->getColor(), | 213 paint->getColor(), |
196 SkMatrix::I(), | 214 SkMatrix::I(), |
197 r, | 215 r, |
198 localMatrix); | 216 localMatrix); |
199 } | 217 } |
200 } | 218 } |
201 | 219 |
202 static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po
int) { | 220 static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po
int) { |
203 return point.fX >= rect.fLeft && point.fX <= rect.fRight && | 221 return point.fX >= rect.fLeft && point.fX <= rect.fRight && |
204 point.fY >= rect.fTop && point.fY <= rect.fBottom; | 222 point.fY >= rect.fTop && point.fY <= rect.fBottom; |
205 } | 223 } |
206 | 224 |
207 void GrDrawContext::drawRect(const GrClip& clip, | 225 void GrDrawContext::drawRect(const GrClip& clip, |
208 const GrPaint& paint, | 226 const GrPaint& paint, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 // Does the rect bound the RT? | 264 // Does the rect bound the RT? |
247 SkPoint srcSpaceRTQuad[4]; | 265 SkPoint srcSpaceRTQuad[4]; |
248 invM.mapRectToQuad(srcSpaceRTQuad, rtRect); | 266 invM.mapRectToQuad(srcSpaceRTQuad, rtRect); |
249 if (rect_contains_inclusive(rect, srcSpaceRTQuad[0]) && | 267 if (rect_contains_inclusive(rect, srcSpaceRTQuad[0]) && |
250 rect_contains_inclusive(rect, srcSpaceRTQuad[1]) && | 268 rect_contains_inclusive(rect, srcSpaceRTQuad[1]) && |
251 rect_contains_inclusive(rect, srcSpaceRTQuad[2]) && | 269 rect_contains_inclusive(rect, srcSpaceRTQuad[2]) && |
252 rect_contains_inclusive(rect, srcSpaceRTQuad[3])) { | 270 rect_contains_inclusive(rect, srcSpaceRTQuad[3])) { |
253 // Will it blend? | 271 // Will it blend? |
254 GrColor clearColor; | 272 GrColor clearColor; |
255 if (paint.isConstantBlendedColor(&clearColor)) { | 273 if (paint.isConstantBlendedColor(&clearColor)) { |
256 fDrawTarget->clear(nullptr, clearColor, true, fRenderTarget)
; | 274 this->getDrawTarget()->clear(nullptr, clearColor, true, fRen
derTarget); |
257 return; | 275 return; |
258 } | 276 } |
259 } | 277 } |
260 } | 278 } |
261 } | 279 } |
262 | 280 |
263 GrColor color = paint.getColor(); | 281 GrColor color = paint.getColor(); |
264 bool needAA = paint.isAntiAlias() && | 282 bool needAA = paint.isAntiAlias() && |
265 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); | 283 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
266 | 284 |
267 // The fill path can handle rotation but not skew | 285 // The fill path can handle rotation but not skew |
268 // The stroke path needs the rect to remain axis aligned (no rotation or ske
w) | 286 // The stroke path needs the rect to remain axis aligned (no rotation or ske
w) |
269 // None of our AA draw rect calls can handle perspective yet | 287 // None of our AA draw rect calls can handle perspective yet |
270 bool canApplyAA = width >=0 ? viewMatrix.rectStaysRect() : viewMatrix.preser
vesRightAngles(); | 288 bool canApplyAA = width >=0 ? viewMatrix.rectStaysRect() : viewMatrix.preser
vesRightAngles(); |
271 | 289 |
272 if (needAA && canApplyAA) { | 290 if (needAA && canApplyAA) { |
273 SkASSERT(!viewMatrix.hasPerspective()); | 291 SkASSERT(!viewMatrix.hasPerspective()); |
274 SkAutoTUnref<GrDrawBatch> batch; | 292 SkAutoTUnref<GrDrawBatch> batch; |
275 if (width >= 0) { | 293 if (width >= 0) { |
276 batch.reset(GrRectBatchFactory::CreateAAStroke(color, viewMatrix, re
ct, *strokeInfo)); | 294 batch.reset(GrRectBatchFactory::CreateAAStroke(color, viewMatrix, re
ct, *strokeInfo)); |
277 } else { | 295 } else { |
278 SkRect devBoundRect; | 296 SkRect devBoundRect; |
279 viewMatrix.mapRect(&devBoundRect, rect); | 297 viewMatrix.mapRect(&devBoundRect, rect); |
280 batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix, rect
, devBoundRect)); | 298 batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix, rect
, devBoundRect)); |
281 } | 299 } |
282 fDrawTarget->drawBatch(pipelineBuilder, batch); | 300 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
283 return; | 301 return; |
284 } | 302 } |
285 | 303 |
286 if (width >= 0) { | 304 if (width >= 0) { |
287 // Non-AA hairlines are snapped to pixel centers to make which pixels ar
e hit deterministic | 305 // Non-AA hairlines are snapped to pixel centers to make which pixels ar
e hit deterministic |
288 bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultis
ampled()); | 306 bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultis
ampled()); |
289 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAStroke( | 307 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAStroke( |
290 color, viewMatrix, rect, width, snapToPi
xelCenters)); | 308 color, viewMatrix, rect, width, snapToPi
xelCenters)); |
291 | 309 |
292 // Depending on sub-pixel coordinates and the particular GPU, we may los
e a corner of | 310 // Depending on sub-pixel coordinates and the particular GPU, we may los
e a corner of |
293 // hairline rects. We jam all the vertices to pixel centers to avoid thi
s, but not when MSAA | 311 // hairline rects. We jam all the vertices to pixel centers to avoid thi
s, but not when MSAA |
294 // is enabled because it can cause ugly artifacts. | 312 // is enabled because it can cause ugly artifacts. |
295 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_
Flag, | 313 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_
Flag, |
296 snapToPixelCenters); | 314 snapToPixelCenters); |
297 fDrawTarget->drawBatch(pipelineBuilder, batch); | 315 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
298 } else { | 316 } else { |
299 // filled BW rect | 317 // filled BW rect |
300 fDrawTarget->drawNonAARect(pipelineBuilder, color, viewMatrix, rect); | 318 this->getDrawTarget()->drawNonAARect(pipelineBuilder, color, viewMatrix,
rect); |
301 } | 319 } |
302 } | 320 } |
303 | 321 |
304 void GrDrawContext::drawNonAARectToRect(const GrClip& clip, | 322 void GrDrawContext::drawNonAARectToRect(const GrClip& clip, |
305 const GrPaint& paint, | 323 const GrPaint& paint, |
306 const SkMatrix& viewMatrix, | 324 const SkMatrix& viewMatrix, |
307 const SkRect& rectToDraw, | 325 const SkRect& rectToDraw, |
308 const SkRect& localRect) { | 326 const SkRect& localRect) { |
309 RETURN_IF_ABANDONED | 327 RETURN_IF_ABANDONED |
310 SkDEBUGCODE(this->validate();) | 328 SkDEBUGCODE(this->validate();) |
311 | 329 |
312 AutoCheckFlush acf(fContext); | 330 AutoCheckFlush acf(fContext); |
313 | 331 |
314 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 332 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
315 fDrawTarget->drawNonAARect(pipelineBuilder, | 333 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
316 paint.getColor(), | 334 paint.getColor(), |
317 viewMatrix, | 335 viewMatrix, |
318 rectToDraw, | 336 rectToDraw, |
319 localRect); | 337 localRect); |
320 } | 338 } |
321 | 339 |
322 void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip, | 340 void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip, |
323 const GrPaint& paint, | 341 const GrPaint& paint, |
324 const SkMatrix& viewMatrix, | 342 const SkMatrix& viewMatrix, |
325 const SkRect& rectToDraw, | 343 const SkRect& rectToDraw, |
326 const SkMatrix& localMatrix) { | 344 const SkMatrix& localMatrix) { |
327 RETURN_IF_ABANDONED | 345 RETURN_IF_ABANDONED |
328 SkDEBUGCODE(this->validate();) | 346 SkDEBUGCODE(this->validate();) |
329 | 347 |
330 AutoCheckFlush acf(fContext); | 348 AutoCheckFlush acf(fContext); |
331 | 349 |
332 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 350 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
333 fDrawTarget->drawNonAARect(pipelineBuilder, | 351 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
334 paint.getColor(), | 352 paint.getColor(), |
335 viewMatrix, | 353 viewMatrix, |
336 rectToDraw, | 354 rectToDraw, |
337 localMatrix); | 355 localMatrix); |
338 } | 356 } |
339 | 357 |
340 void GrDrawContext::drawVertices(const GrClip& clip, | 358 void GrDrawContext::drawVertices(const GrClip& clip, |
341 const GrPaint& paint, | 359 const GrPaint& paint, |
342 const SkMatrix& viewMatrix, | 360 const SkMatrix& viewMatrix, |
343 GrPrimitiveType primitiveType, | 361 GrPrimitiveType primitiveType, |
344 int vertexCount, | 362 int vertexCount, |
345 const SkPoint positions[], | 363 const SkPoint positions[], |
346 const SkPoint texCoords[], | 364 const SkPoint texCoords[], |
347 const GrColor colors[], | 365 const GrColor colors[], |
(...skipping 21 matching lines...) Expand all Loading... |
369 bounds.outset(0.5f, 0.5f); | 387 bounds.outset(0.5f, 0.5f); |
370 } | 388 } |
371 | 389 |
372 GrDrawVerticesBatch::Geometry geometry; | 390 GrDrawVerticesBatch::Geometry geometry; |
373 geometry.fColor = paint.getColor(); | 391 geometry.fColor = paint.getColor(); |
374 SkAutoTUnref<GrDrawBatch> batch(GrDrawVerticesBatch::Create(geometry, primit
iveType, viewMatrix, | 392 SkAutoTUnref<GrDrawBatch> batch(GrDrawVerticesBatch::Create(geometry, primit
iveType, viewMatrix, |
375 positions, verte
xCount, indices, | 393 positions, verte
xCount, indices, |
376 indexCount, colo
rs, texCoords, | 394 indexCount, colo
rs, texCoords, |
377 bounds)); | 395 bounds)); |
378 | 396 |
379 fDrawTarget->drawBatch(pipelineBuilder, batch); | 397 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
380 } | 398 } |
381 | 399 |
382 /////////////////////////////////////////////////////////////////////////////// | 400 /////////////////////////////////////////////////////////////////////////////// |
383 | 401 |
384 void GrDrawContext::drawAtlas(const GrClip& clip, | 402 void GrDrawContext::drawAtlas(const GrClip& clip, |
385 const GrPaint& paint, | 403 const GrPaint& paint, |
386 const SkMatrix& viewMatrix, | 404 const SkMatrix& viewMatrix, |
387 int spriteCount, | 405 int spriteCount, |
388 const SkRSXform xform[], | 406 const SkRSXform xform[], |
389 const SkRect texRect[], | 407 const SkRect texRect[], |
390 const SkColor colors[]) { | 408 const SkColor colors[]) { |
391 RETURN_IF_ABANDONED | 409 RETURN_IF_ABANDONED |
392 SkDEBUGCODE(this->validate();) | 410 SkDEBUGCODE(this->validate();) |
393 | 411 |
394 AutoCheckFlush acf(fContext); | 412 AutoCheckFlush acf(fContext); |
395 | 413 |
396 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 414 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
397 | 415 |
398 GrDrawAtlasBatch::Geometry geometry; | 416 GrDrawAtlasBatch::Geometry geometry; |
399 geometry.fColor = paint.getColor(); | 417 geometry.fColor = paint.getColor(); |
400 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, | 418 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, |
401 xform, texRect, col
ors)); | 419 xform, texRect, col
ors)); |
402 | 420 |
403 fDrawTarget->drawBatch(pipelineBuilder, batch); | 421 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
404 } | 422 } |
405 | 423 |
406 /////////////////////////////////////////////////////////////////////////////// | 424 /////////////////////////////////////////////////////////////////////////////// |
407 | 425 |
408 void GrDrawContext::drawRRect(const GrClip& clip, | 426 void GrDrawContext::drawRRect(const GrClip& clip, |
409 const GrPaint& paint, | 427 const GrPaint& paint, |
410 const SkMatrix& viewMatrix, | 428 const SkMatrix& viewMatrix, |
411 const SkRRect& rrect, | 429 const SkRRect& rrect, |
412 const GrStrokeInfo& strokeInfo) { | 430 const GrStrokeInfo& strokeInfo) { |
413 RETURN_IF_ABANDONED | 431 RETURN_IF_ABANDONED |
414 SkDEBUGCODE(this->validate();) | 432 SkDEBUGCODE(this->validate();) |
415 | 433 |
416 if (rrect.isEmpty()) { | 434 if (rrect.isEmpty()) { |
417 return; | 435 return; |
418 } | 436 } |
419 | 437 |
420 if (strokeInfo.isDashed()) { | 438 if (strokeInfo.isDashed()) { |
421 SkPath path; | 439 SkPath path; |
422 path.setIsVolatile(true); | 440 path.setIsVolatile(true); |
423 path.addRRect(rrect); | 441 path.addRRect(rrect); |
424 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); | 442 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); |
425 return; | 443 return; |
426 } | 444 } |
427 | 445 |
428 AutoCheckFlush acf(fContext); | 446 AutoCheckFlush acf(fContext); |
429 | 447 |
430 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 448 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
431 GrColor color = paint.getColor(); | 449 GrColor color = paint.getColor(); |
432 | 450 |
433 if (!GrOvalRenderer::DrawRRect(fDrawTarget, | 451 if (!GrOvalRenderer::DrawRRect(this->getDrawTarget(), |
434 pipelineBuilder, | 452 pipelineBuilder, |
435 color, | 453 color, |
436 viewMatrix, | 454 viewMatrix, |
437 paint.isAntiAlias(), | 455 paint.isAntiAlias(), |
438 rrect, | 456 rrect, |
439 strokeInfo)) { | 457 strokeInfo)) { |
440 SkPath path; | 458 SkPath path; |
441 path.setIsVolatile(true); | 459 path.setIsVolatile(true); |
442 path.addRRect(rrect); | 460 path.addRRect(rrect); |
443 this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color, | 461 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatr
ix, color, |
444 paint.isAntiAlias(), path, strokeInfo); | 462 paint.isAntiAlias(), path, strokeInfo); |
445 } | 463 } |
446 } | 464 } |
447 | 465 |
448 /////////////////////////////////////////////////////////////////////////////// | 466 /////////////////////////////////////////////////////////////////////////////// |
449 | 467 |
450 void GrDrawContext::drawDRRect(const GrClip& clip, | 468 void GrDrawContext::drawDRRect(const GrClip& clip, |
451 const GrPaint& paint, | 469 const GrPaint& paint, |
452 const SkMatrix& viewMatrix, | 470 const SkMatrix& viewMatrix, |
453 const SkRRect& outer, | 471 const SkRRect& outer, |
454 const SkRRect& inner) { | 472 const SkRRect& inner) { |
455 RETURN_IF_ABANDONED | 473 RETURN_IF_ABANDONED |
456 SkDEBUGCODE(this->validate();) | 474 SkDEBUGCODE(this->validate();) |
457 | 475 |
458 if (outer.isEmpty()) { | 476 if (outer.isEmpty()) { |
459 return; | 477 return; |
460 } | 478 } |
461 | 479 |
462 AutoCheckFlush acf(fContext); | 480 AutoCheckFlush acf(fContext); |
463 | 481 |
464 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 482 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
465 GrColor color = paint.getColor(); | 483 GrColor color = paint.getColor(); |
466 if (!GrOvalRenderer::DrawDRRect(fDrawTarget, | 484 if (!GrOvalRenderer::DrawDRRect(this->getDrawTarget(), |
467 pipelineBuilder, | 485 pipelineBuilder, |
468 color, | 486 color, |
469 viewMatrix, | 487 viewMatrix, |
470 paint.isAntiAlias(), | 488 paint.isAntiAlias(), |
471 outer, | 489 outer, |
472 inner)) { | 490 inner)) { |
473 SkPath path; | 491 SkPath path; |
474 path.setIsVolatile(true); | 492 path.setIsVolatile(true); |
475 path.addRRect(inner); | 493 path.addRRect(inner); |
476 path.addRRect(outer); | 494 path.addRRect(outer); |
477 path.setFillType(SkPath::kEvenOdd_FillType); | 495 path.setFillType(SkPath::kEvenOdd_FillType); |
478 | 496 |
479 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); | 497 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); |
480 this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color, | 498 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatr
ix, color, |
481 paint.isAntiAlias(), path, fillRec); | 499 paint.isAntiAlias(), path, fillRec); |
482 } | 500 } |
483 } | 501 } |
484 | 502 |
485 /////////////////////////////////////////////////////////////////////////////// | 503 /////////////////////////////////////////////////////////////////////////////// |
486 | 504 |
487 void GrDrawContext::drawOval(const GrClip& clip, | 505 void GrDrawContext::drawOval(const GrClip& clip, |
488 const GrPaint& paint, | 506 const GrPaint& paint, |
489 const SkMatrix& viewMatrix, | 507 const SkMatrix& viewMatrix, |
490 const SkRect& oval, | 508 const SkRect& oval, |
(...skipping 11 matching lines...) Expand all Loading... |
502 path.addOval(oval); | 520 path.addOval(oval); |
503 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); | 521 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); |
504 return; | 522 return; |
505 } | 523 } |
506 | 524 |
507 AutoCheckFlush acf(fContext); | 525 AutoCheckFlush acf(fContext); |
508 | 526 |
509 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 527 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
510 GrColor color = paint.getColor(); | 528 GrColor color = paint.getColor(); |
511 | 529 |
512 if (!GrOvalRenderer::DrawOval(fDrawTarget, | 530 if (!GrOvalRenderer::DrawOval(this->getDrawTarget(), |
513 pipelineBuilder, | 531 pipelineBuilder, |
514 color, | 532 color, |
515 viewMatrix, | 533 viewMatrix, |
516 paint.isAntiAlias(), | 534 paint.isAntiAlias(), |
517 oval, | 535 oval, |
518 strokeInfo)) { | 536 strokeInfo)) { |
519 SkPath path; | 537 SkPath path; |
520 path.setIsVolatile(true); | 538 path.setIsVolatile(true); |
521 path.addOval(oval); | 539 path.addOval(oval); |
522 this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color, | 540 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatr
ix, color, |
523 paint.isAntiAlias(), path, strokeInfo); | 541 paint.isAntiAlias(), path, strokeInfo); |
524 } | 542 } |
525 } | 543 } |
526 | 544 |
527 // Can 'path' be drawn as a pair of filled nested rectangles? | 545 // Can 'path' be drawn as a pair of filled nested rectangles? |
528 static bool is_nested_rects(const SkMatrix& viewMatrix, | 546 static bool is_nested_rects(const SkMatrix& viewMatrix, |
529 const SkPath& path, | 547 const SkPath& path, |
530 const SkStrokeRec& stroke, | 548 const SkStrokeRec& stroke, |
531 SkRect rects[2]) { | 549 SkRect rects[2]) { |
532 SkASSERT(stroke.isFillStyle()); | 550 SkASSERT(stroke.isFillStyle()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 } | 593 } |
576 | 594 |
577 void GrDrawContext::drawBatch(const GrClip& clip, | 595 void GrDrawContext::drawBatch(const GrClip& clip, |
578 const GrPaint& paint, GrDrawBatch* batch) { | 596 const GrPaint& paint, GrDrawBatch* batch) { |
579 RETURN_IF_ABANDONED | 597 RETURN_IF_ABANDONED |
580 SkDEBUGCODE(this->validate();) | 598 SkDEBUGCODE(this->validate();) |
581 | 599 |
582 AutoCheckFlush acf(fContext); | 600 AutoCheckFlush acf(fContext); |
583 | 601 |
584 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 602 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
585 fDrawTarget->drawBatch(pipelineBuilder, batch); | 603 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
586 } | 604 } |
587 | 605 |
588 void GrDrawContext::drawPath(const GrClip& clip, | 606 void GrDrawContext::drawPath(const GrClip& clip, |
589 const GrPaint& paint, | 607 const GrPaint& paint, |
590 const SkMatrix& viewMatrix, | 608 const SkMatrix& viewMatrix, |
591 const SkPath& path, | 609 const SkPath& path, |
592 const GrStrokeInfo& strokeInfo) { | 610 const GrStrokeInfo& strokeInfo) { |
593 RETURN_IF_ABANDONED | 611 RETURN_IF_ABANDONED |
594 SkDEBUGCODE(this->validate();) | 612 SkDEBUGCODE(this->validate();) |
595 | 613 |
(...skipping 18 matching lines...) Expand all Loading... |
614 bool useCoverageAA = paint.isAntiAlias() && | 632 bool useCoverageAA = paint.isAntiAlias() && |
615 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); | 633 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
616 | 634 |
617 if (useCoverageAA && strokeInfo.getWidth() < 0 && !path.isConvex()) { | 635 if (useCoverageAA && strokeInfo.getWidth() < 0 && !path.isConvex()) { |
618 // Concave AA paths are expensive - try to avoid them for special ca
ses | 636 // Concave AA paths are expensive - try to avoid them for special ca
ses |
619 SkRect rects[2]; | 637 SkRect rects[2]; |
620 | 638 |
621 if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) { | 639 if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) { |
622 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill
NestedRects( | 640 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill
NestedRects( |
623 color, viewMatrix, rects)); | 641 color, viewMatrix, rects)); |
624 fDrawTarget->drawBatch(pipelineBuilder, batch); | 642 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
625 return; | 643 return; |
626 } | 644 } |
627 } | 645 } |
628 SkRect ovalRect; | 646 SkRect ovalRect; |
629 bool isOval = path.isOval(&ovalRect); | 647 bool isOval = path.isOval(&ovalRect); |
630 | 648 |
631 if (isOval && !path.isInverseFillType()) { | 649 if (isOval && !path.isInverseFillType()) { |
632 if (GrOvalRenderer::DrawOval(fDrawTarget, | 650 if (GrOvalRenderer::DrawOval(this->getDrawTarget(), |
633 pipelineBuilder, | 651 pipelineBuilder, |
634 color, | 652 color, |
635 viewMatrix, | 653 viewMatrix, |
636 paint.isAntiAlias(), | 654 paint.isAntiAlias(), |
637 ovalRect, | 655 ovalRect, |
638 strokeInfo)) { | 656 strokeInfo)) { |
639 return; | 657 return; |
640 } | 658 } |
641 } | 659 } |
642 } | 660 } |
643 this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color, pai
nt.isAntiAlias(), | 661 this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatrix,
color, |
644 path, strokeInfo); | 662 paint.isAntiAlias(), path, strokeInfo); |
645 } | 663 } |
646 | 664 |
647 void GrDrawContext::internalDrawPath(GrDrawTarget* target, | 665 void GrDrawContext::internalDrawPath(GrDrawTarget* target, |
648 GrPipelineBuilder* pipelineBuilder, | 666 GrPipelineBuilder* pipelineBuilder, |
649 const SkMatrix& viewMatrix, | 667 const SkMatrix& viewMatrix, |
650 GrColor color, | 668 GrColor color, |
651 bool useAA, | 669 bool useAA, |
652 const SkPath& path, | 670 const SkPath& path, |
653 const GrStrokeInfo& strokeInfo) { | 671 const GrStrokeInfo& strokeInfo) { |
654 RETURN_IF_ABANDONED | 672 RETURN_IF_ABANDONED |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 args.fPath = pathPtr; | 747 args.fPath = pathPtr; |
730 args.fStroke = strokeInfoPtr; | 748 args.fStroke = strokeInfoPtr; |
731 args.fAntiAlias = useCoverageAA; | 749 args.fAntiAlias = useCoverageAA; |
732 pr->drawPath(args); | 750 pr->drawPath(args); |
733 } | 751 } |
734 | 752 |
735 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 753 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
736 RETURN_IF_ABANDONED | 754 RETURN_IF_ABANDONED |
737 SkDEBUGCODE(this->validate();) | 755 SkDEBUGCODE(this->validate();) |
738 | 756 |
739 fDrawTarget->drawBatch(*pipelineBuilder, batch); | 757 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
740 } | 758 } |
OLD | NEW |