| 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 "GrBatchTest.h" | 9 #include "GrBatchTest.h" |
| 10 #include "GrColor.h" | 10 #include "GrColor.h" |
| 11 #include "GrDrawContext.h" | 11 #include "GrDrawContext.h" |
| 12 #include "GrDrawingManager.h" | 12 #include "GrDrawingManager.h" |
| 13 #include "GrOvalRenderer.h" | 13 #include "GrOvalRenderer.h" |
| 14 #include "GrPathRenderer.h" | 14 #include "GrPathRenderer.h" |
| 15 #include "GrRenderTarget.h" | 15 #include "GrRenderTarget.h" |
| 16 #include "GrRenderTargetPriv.h" | 16 #include "GrRenderTargetPriv.h" |
| 17 #include "GrResourceProvider.h" | 17 #include "GrResourceProvider.h" |
| 18 #include "SkSurfacePriv.h" | 18 #include "SkSurfacePriv.h" |
| 19 | 19 |
| 20 #include "batches/GrBatch.h" | 20 #include "batches/GrBatch.h" |
| 21 #include "batches/GrDrawAtlasBatch.h" | 21 #include "batches/GrDrawAtlasBatch.h" |
| 22 #include "batches/GrDrawVerticesBatch.h" | 22 #include "batches/GrDrawVerticesBatch.h" |
| 23 #include "batches/GrRectBatchFactory.h" | 23 #include "batches/GrRectBatchFactory.h" |
| 24 #include "batches/GrNinePatch.h" // TODO Factory | 24 #include "batches/GrNinePatch.h" // TODO Factory |
| 25 | 25 |
| 26 #include "text/GrAtlasTextContext.h" | 26 #include "text/GrAtlasTextContext.h" |
| 27 #include "text/GrStencilAndCoverTextContext.h" | 27 #include "text/GrStencilAndCoverTextContext.h" |
| 28 | 28 |
| 29 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) | 29 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) |
| 30 #define ASSERT_SINGLE_OWNER \ |
| 31 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(&fSingleOwner);) |
| 30 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } | 32 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } |
| 31 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } | 33 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } |
| 32 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->abandoned()) { return nu
llptr; } | 34 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->abandoned()) { return nu
llptr; } |
| 33 | 35 |
| 34 class AutoCheckFlush { | 36 class AutoCheckFlush { |
| 35 public: | 37 public: |
| 36 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { | 38 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { |
| 37 SkASSERT(fDrawingManager); | 39 SkASSERT(fDrawingManager); |
| 38 } | 40 } |
| 39 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } | 41 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 62 SkASSERT(fRenderTarget); | 64 SkASSERT(fRenderTarget); |
| 63 ASSERT_OWNED_RESOURCE(fRenderTarget); | 65 ASSERT_OWNED_RESOURCE(fRenderTarget); |
| 64 | 66 |
| 65 if (fDrawTarget && !fDrawTarget->isClosed()) { | 67 if (fDrawTarget && !fDrawTarget->isClosed()) { |
| 66 SkASSERT(fRenderTarget->getLastDrawTarget() == fDrawTarget); | 68 SkASSERT(fRenderTarget->getLastDrawTarget() == fDrawTarget); |
| 67 } | 69 } |
| 68 } | 70 } |
| 69 #endif | 71 #endif |
| 70 | 72 |
| 71 GrDrawContext::~GrDrawContext() { | 73 GrDrawContext::~GrDrawContext() { |
| 74 ASSERT_SINGLE_OWNER |
| 72 SkSafeUnref(fDrawTarget); | 75 SkSafeUnref(fDrawTarget); |
| 73 } | 76 } |
| 74 | 77 |
| 75 GrDrawTarget* GrDrawContext::getDrawTarget() { | 78 GrDrawTarget* GrDrawContext::getDrawTarget() { |
| 79 ASSERT_SINGLE_OWNER |
| 76 SkDEBUGCODE(this->validate();) | 80 SkDEBUGCODE(this->validate();) |
| 77 | 81 |
| 78 if (!fDrawTarget || fDrawTarget->isClosed()) { | 82 if (!fDrawTarget || fDrawTarget->isClosed()) { |
| 79 fDrawTarget = fDrawingManager->newDrawTarget(fRenderTarget); | 83 fDrawTarget = fDrawingManager->newDrawTarget(fRenderTarget); |
| 80 } | 84 } |
| 81 | 85 |
| 82 return fDrawTarget; | 86 return fDrawTarget; |
| 83 } | 87 } |
| 84 | 88 |
| 85 void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const Sk
IPoint& dstPoint) { | 89 void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const Sk
IPoint& dstPoint) { |
| 90 ASSERT_SINGLE_OWNER |
| 86 RETURN_IF_ABANDONED | 91 RETURN_IF_ABANDONED |
| 87 SkDEBUGCODE(this->validate();) | 92 SkDEBUGCODE(this->validate();) |
| 88 | 93 |
| 89 this->getDrawTarget()->copySurface(fRenderTarget, src, srcRect, dstPoint); | 94 this->getDrawTarget()->copySurface(fRenderTarget, src, srcRect, dstPoint); |
| 90 } | 95 } |
| 91 | 96 |
| 92 void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, | 97 void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, |
| 93 const SkPaint& skPaint, | 98 const SkPaint& skPaint, |
| 94 const SkMatrix& viewMatrix, | 99 const SkMatrix& viewMatrix, |
| 95 const char text[], size_t byteLength, | 100 const char text[], size_t byteLength, |
| 96 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ | 101 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ |
| 102 ASSERT_SINGLE_OWNER |
| 97 RETURN_IF_ABANDONED | 103 RETURN_IF_ABANDONED |
| 98 SkDEBUGCODE(this->validate();) | 104 SkDEBUGCODE(this->validate();) |
| 99 | 105 |
| 100 if (!fTextContext) { | 106 if (!fTextContext) { |
| 101 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); | 107 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); |
| 102 } | 108 } |
| 103 | 109 |
| 104 fTextContext->drawText(this, clip, grPaint, skPaint, viewMatrix, | 110 fTextContext->drawText(this, clip, grPaint, skPaint, viewMatrix, |
| 105 text, byteLength, x, y, clipBounds); | 111 text, byteLength, x, y, clipBounds); |
| 106 } | 112 } |
| 107 | 113 |
| 108 void GrDrawContext::drawPosText(const GrClip& clip, const GrPaint& grPaint, | 114 void GrDrawContext::drawPosText(const GrClip& clip, const GrPaint& grPaint, |
| 109 const SkPaint& skPaint, | 115 const SkPaint& skPaint, |
| 110 const SkMatrix& viewMatrix, | 116 const SkMatrix& viewMatrix, |
| 111 const char text[], size_t byteLength, | 117 const char text[], size_t byteLength, |
| 112 const SkScalar pos[], int scalarsPerPosition, | 118 const SkScalar pos[], int scalarsPerPosition, |
| 113 const SkPoint& offset, const SkIRect& clipBounds
) { | 119 const SkPoint& offset, const SkIRect& clipBounds
) { |
| 120 ASSERT_SINGLE_OWNER |
| 114 RETURN_IF_ABANDONED | 121 RETURN_IF_ABANDONED |
| 115 SkDEBUGCODE(this->validate();) | 122 SkDEBUGCODE(this->validate();) |
| 116 | 123 |
| 117 if (!fTextContext) { | 124 if (!fTextContext) { |
| 118 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); | 125 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); |
| 119 } | 126 } |
| 120 | 127 |
| 121 fTextContext->drawPosText(this, clip, grPaint, skPaint, viewMatrix, text, by
teLength, | 128 fTextContext->drawPosText(this, clip, grPaint, skPaint, viewMatrix, text, by
teLength, |
| 122 pos, scalarsPerPosition, offset, clipBounds); | 129 pos, scalarsPerPosition, offset, clipBounds); |
| 123 | 130 |
| 124 } | 131 } |
| 125 | 132 |
| 126 void GrDrawContext::drawTextBlob(const GrClip& clip, const SkPaint& skPaint, | 133 void GrDrawContext::drawTextBlob(const GrClip& clip, const SkPaint& skPaint, |
| 127 const SkMatrix& viewMatrix, const SkTextBlob* b
lob, | 134 const SkMatrix& viewMatrix, const SkTextBlob* b
lob, |
| 128 SkScalar x, SkScalar y, | 135 SkScalar x, SkScalar y, |
| 129 SkDrawFilter* filter, const SkIRect& clipBounds
) { | 136 SkDrawFilter* filter, const SkIRect& clipBounds
) { |
| 137 ASSERT_SINGLE_OWNER |
| 130 RETURN_IF_ABANDONED | 138 RETURN_IF_ABANDONED |
| 131 SkDEBUGCODE(this->validate();) | 139 SkDEBUGCODE(this->validate();) |
| 132 | 140 |
| 133 if (!fTextContext) { | 141 if (!fTextContext) { |
| 134 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); | 142 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); |
| 135 } | 143 } |
| 136 | 144 |
| 137 fTextContext->drawTextBlob(this, clip, skPaint, viewMatrix, blob, x, y, filt
er, clipBounds); | 145 fTextContext->drawTextBlob(this, clip, skPaint, viewMatrix, blob, x, y, filt
er, clipBounds); |
| 138 } | 146 } |
| 139 | 147 |
| 140 void GrDrawContext::discard() { | 148 void GrDrawContext::discard() { |
| 149 ASSERT_SINGLE_OWNER |
| 141 RETURN_IF_ABANDONED | 150 RETURN_IF_ABANDONED |
| 142 SkDEBUGCODE(this->validate();) | 151 SkDEBUGCODE(this->validate();) |
| 143 | 152 |
| 144 AutoCheckFlush acf(fDrawingManager); | 153 AutoCheckFlush acf(fDrawingManager); |
| 145 this->getDrawTarget()->discard(fRenderTarget); | 154 this->getDrawTarget()->discard(fRenderTarget); |
| 146 } | 155 } |
| 147 | 156 |
| 148 void GrDrawContext::clear(const SkIRect* rect, | 157 void GrDrawContext::clear(const SkIRect* rect, |
| 149 const GrColor color, | 158 const GrColor color, |
| 150 bool canIgnoreRect) { | 159 bool canIgnoreRect) { |
| 160 ASSERT_SINGLE_OWNER |
| 151 RETURN_IF_ABANDONED | 161 RETURN_IF_ABANDONED |
| 152 SkDEBUGCODE(this->validate();) | 162 SkDEBUGCODE(this->validate();) |
| 153 | 163 |
| 154 AutoCheckFlush acf(fDrawingManager); | 164 AutoCheckFlush acf(fDrawingManager); |
| 155 this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget); | 165 this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget); |
| 156 } | 166 } |
| 157 | 167 |
| 158 | 168 |
| 159 void GrDrawContext::drawPaint(const GrClip& clip, | 169 void GrDrawContext::drawPaint(const GrClip& clip, |
| 160 const GrPaint& origPaint, | 170 const GrPaint& origPaint, |
| 161 const SkMatrix& viewMatrix) { | 171 const SkMatrix& viewMatrix) { |
| 172 ASSERT_SINGLE_OWNER |
| 162 RETURN_IF_ABANDONED | 173 RETURN_IF_ABANDONED |
| 163 SkDEBUGCODE(this->validate();) | 174 SkDEBUGCODE(this->validate();) |
| 164 | 175 |
| 165 // 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 |
| 166 // don't overflow fixed-point implementations | 177 // don't overflow fixed-point implementations |
| 167 SkRect r; | 178 SkRect r; |
| 168 r.setLTRB(0, 0, | 179 r.setLTRB(0, 0, |
| 169 SkIntToScalar(fRenderTarget->width()), | 180 SkIntToScalar(fRenderTarget->width()), |
| 170 SkIntToScalar(fRenderTarget->height())); | 181 SkIntToScalar(fRenderTarget->height())); |
| 171 SkTCopyOnFirstWrite<GrPaint> paint(origPaint); | 182 SkTCopyOnFirstWrite<GrPaint> paint(origPaint); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 | 228 |
| 218 static bool should_apply_coverage_aa(const GrPaint& paint, GrRenderTarget* rt) { | 229 static bool should_apply_coverage_aa(const GrPaint& paint, GrRenderTarget* rt) { |
| 219 return paint.isAntiAlias() && !rt->isUnifiedMultisampled(); | 230 return paint.isAntiAlias() && !rt->isUnifiedMultisampled(); |
| 220 } | 231 } |
| 221 | 232 |
| 222 void GrDrawContext::drawRect(const GrClip& clip, | 233 void GrDrawContext::drawRect(const GrClip& clip, |
| 223 const GrPaint& paint, | 234 const GrPaint& paint, |
| 224 const SkMatrix& viewMatrix, | 235 const SkMatrix& viewMatrix, |
| 225 const SkRect& rect, | 236 const SkRect& rect, |
| 226 const GrStrokeInfo* strokeInfo) { | 237 const GrStrokeInfo* strokeInfo) { |
| 238 ASSERT_SINGLE_OWNER |
| 227 RETURN_IF_ABANDONED | 239 RETURN_IF_ABANDONED |
| 228 SkDEBUGCODE(this->validate();) | 240 SkDEBUGCODE(this->validate();) |
| 229 | 241 |
| 230 // Dashing should've been devolved to a path in SkGpuDevice | 242 // Dashing should've been devolved to a path in SkGpuDevice |
| 231 SkASSERT(!strokeInfo || !strokeInfo->isDashed()); | 243 SkASSERT(!strokeInfo || !strokeInfo->isDashed()); |
| 232 | 244 |
| 233 AutoCheckFlush acf(fDrawingManager); | 245 AutoCheckFlush acf(fDrawingManager); |
| 234 | 246 |
| 235 SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth(); | 247 SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth(); |
| 236 | 248 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 // filled BW rect | 321 // filled BW rect |
| 310 this->getDrawTarget()->drawNonAARect(pipelineBuilder, color, viewMatrix,
rect); | 322 this->getDrawTarget()->drawNonAARect(pipelineBuilder, color, viewMatrix,
rect); |
| 311 } | 323 } |
| 312 } | 324 } |
| 313 | 325 |
| 314 void GrDrawContext::fillRectToRect(const GrClip& clip, | 326 void GrDrawContext::fillRectToRect(const GrClip& clip, |
| 315 const GrPaint& paint, | 327 const GrPaint& paint, |
| 316 const SkMatrix& viewMatrix, | 328 const SkMatrix& viewMatrix, |
| 317 const SkRect& rectToDraw, | 329 const SkRect& rectToDraw, |
| 318 const SkRect& localRect) { | 330 const SkRect& localRect) { |
| 331 ASSERT_SINGLE_OWNER |
| 319 RETURN_IF_ABANDONED | 332 RETURN_IF_ABANDONED |
| 320 SkDEBUGCODE(this->validate();) | 333 SkDEBUGCODE(this->validate();) |
| 321 | 334 |
| 322 AutoCheckFlush acf(fDrawingManager); | 335 AutoCheckFlush acf(fDrawingManager); |
| 323 | 336 |
| 324 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 337 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 325 if (should_apply_coverage_aa(paint, fRenderTarget) && | 338 if (should_apply_coverage_aa(paint, fRenderTarget) && |
| 326 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 339 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 327 SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::CreateWithLocalRect( | 340 SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::CreateWithLocalRect( |
| 328 paint.getColor(), viewMatrix, rectToDraw, localRect)); | 341 paint.getColor(), viewMatrix, rectToDraw, localRect)); |
| 329 if (batch) { | 342 if (batch) { |
| 330 this->drawBatch(&pipelineBuilder, batch); | 343 this->drawBatch(&pipelineBuilder, batch); |
| 331 } | 344 } |
| 332 } else { | 345 } else { |
| 333 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 346 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
| 334 paint.getColor(), | 347 paint.getColor(), |
| 335 viewMatrix, | 348 viewMatrix, |
| 336 rectToDraw, | 349 rectToDraw, |
| 337 localRect); | 350 localRect); |
| 338 } | 351 } |
| 339 } | 352 } |
| 340 | 353 |
| 341 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, | 354 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
| 342 const GrPaint& paint, | 355 const GrPaint& paint, |
| 343 const SkMatrix& viewMatrix, | 356 const SkMatrix& viewMatrix, |
| 344 const SkRect& rectToDraw, | 357 const SkRect& rectToDraw, |
| 345 const SkMatrix& localMatrix) { | 358 const SkMatrix& localMatrix) { |
| 359 ASSERT_SINGLE_OWNER |
| 346 RETURN_IF_ABANDONED | 360 RETURN_IF_ABANDONED |
| 347 SkDEBUGCODE(this->validate();) | 361 SkDEBUGCODE(this->validate();) |
| 348 | 362 |
| 349 AutoCheckFlush acf(fDrawingManager); | 363 AutoCheckFlush acf(fDrawingManager); |
| 350 | 364 |
| 351 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 365 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 352 | 366 |
| 353 if (should_apply_coverage_aa(paint, fRenderTarget) && | 367 if (should_apply_coverage_aa(paint, fRenderTarget) && |
| 354 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 368 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 355 SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::Create( | 369 SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::Create( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 367 void GrDrawContext::drawVertices(const GrClip& clip, | 381 void GrDrawContext::drawVertices(const GrClip& clip, |
| 368 const GrPaint& paint, | 382 const GrPaint& paint, |
| 369 const SkMatrix& viewMatrix, | 383 const SkMatrix& viewMatrix, |
| 370 GrPrimitiveType primitiveType, | 384 GrPrimitiveType primitiveType, |
| 371 int vertexCount, | 385 int vertexCount, |
| 372 const SkPoint positions[], | 386 const SkPoint positions[], |
| 373 const SkPoint texCoords[], | 387 const SkPoint texCoords[], |
| 374 const GrColor colors[], | 388 const GrColor colors[], |
| 375 const uint16_t indices[], | 389 const uint16_t indices[], |
| 376 int indexCount) { | 390 int indexCount) { |
| 391 ASSERT_SINGLE_OWNER |
| 377 RETURN_IF_ABANDONED | 392 RETURN_IF_ABANDONED |
| 378 SkDEBUGCODE(this->validate();) | 393 SkDEBUGCODE(this->validate();) |
| 379 | 394 |
| 380 AutoCheckFlush acf(fDrawingManager); | 395 AutoCheckFlush acf(fDrawingManager); |
| 381 | 396 |
| 382 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 397 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 383 | 398 |
| 384 // TODO clients should give us bounds | 399 // TODO clients should give us bounds |
| 385 SkRect bounds; | 400 SkRect bounds; |
| 386 if (!bounds.setBoundsCheck(positions, vertexCount)) { | 401 if (!bounds.setBoundsCheck(positions, vertexCount)) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 410 | 425 |
| 411 /////////////////////////////////////////////////////////////////////////////// | 426 /////////////////////////////////////////////////////////////////////////////// |
| 412 | 427 |
| 413 void GrDrawContext::drawAtlas(const GrClip& clip, | 428 void GrDrawContext::drawAtlas(const GrClip& clip, |
| 414 const GrPaint& paint, | 429 const GrPaint& paint, |
| 415 const SkMatrix& viewMatrix, | 430 const SkMatrix& viewMatrix, |
| 416 int spriteCount, | 431 int spriteCount, |
| 417 const SkRSXform xform[], | 432 const SkRSXform xform[], |
| 418 const SkRect texRect[], | 433 const SkRect texRect[], |
| 419 const SkColor colors[]) { | 434 const SkColor colors[]) { |
| 435 ASSERT_SINGLE_OWNER |
| 420 RETURN_IF_ABANDONED | 436 RETURN_IF_ABANDONED |
| 421 SkDEBUGCODE(this->validate();) | 437 SkDEBUGCODE(this->validate();) |
| 422 | 438 |
| 423 AutoCheckFlush acf(fDrawingManager); | 439 AutoCheckFlush acf(fDrawingManager); |
| 424 | 440 |
| 425 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 441 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 426 | 442 |
| 427 GrDrawAtlasBatch::Geometry geometry; | 443 GrDrawAtlasBatch::Geometry geometry; |
| 428 geometry.fColor = paint.getColor(); | 444 geometry.fColor = paint.getColor(); |
| 429 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, | 445 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, |
| 430 xform, texRect, col
ors)); | 446 xform, texRect, col
ors)); |
| 431 | 447 |
| 432 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 448 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 433 } | 449 } |
| 434 | 450 |
| 435 /////////////////////////////////////////////////////////////////////////////// | 451 /////////////////////////////////////////////////////////////////////////////// |
| 436 | 452 |
| 437 void GrDrawContext::drawRRect(const GrClip& clip, | 453 void GrDrawContext::drawRRect(const GrClip& clip, |
| 438 const GrPaint& paint, | 454 const GrPaint& paint, |
| 439 const SkMatrix& viewMatrix, | 455 const SkMatrix& viewMatrix, |
| 440 const SkRRect& rrect, | 456 const SkRRect& rrect, |
| 441 const GrStrokeInfo& strokeInfo) { | 457 const GrStrokeInfo& strokeInfo) { |
| 458 ASSERT_SINGLE_OWNER |
| 442 RETURN_IF_ABANDONED | 459 RETURN_IF_ABANDONED |
| 443 SkDEBUGCODE(this->validate();) | 460 SkDEBUGCODE(this->validate();) |
| 444 | 461 |
| 445 if (rrect.isEmpty()) { | 462 if (rrect.isEmpty()) { |
| 446 return; | 463 return; |
| 447 } | 464 } |
| 448 | 465 |
| 449 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice | 466 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice |
| 450 | 467 |
| 451 AutoCheckFlush acf(fDrawingManager); | 468 AutoCheckFlush acf(fDrawingManager); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 468 } | 485 } |
| 469 } | 486 } |
| 470 | 487 |
| 471 /////////////////////////////////////////////////////////////////////////////// | 488 /////////////////////////////////////////////////////////////////////////////// |
| 472 | 489 |
| 473 void GrDrawContext::drawDRRect(const GrClip& clip, | 490 void GrDrawContext::drawDRRect(const GrClip& clip, |
| 474 const GrPaint& paint, | 491 const GrPaint& paint, |
| 475 const SkMatrix& viewMatrix, | 492 const SkMatrix& viewMatrix, |
| 476 const SkRRect& outer, | 493 const SkRRect& outer, |
| 477 const SkRRect& inner) { | 494 const SkRRect& inner) { |
| 495 ASSERT_SINGLE_OWNER |
| 478 RETURN_IF_ABANDONED | 496 RETURN_IF_ABANDONED |
| 479 SkDEBUGCODE(this->validate();) | 497 SkDEBUGCODE(this->validate();) |
| 480 | 498 |
| 481 if (outer.isEmpty()) { | 499 if (outer.isEmpty()) { |
| 482 return; | 500 return; |
| 483 } | 501 } |
| 484 | 502 |
| 485 AutoCheckFlush acf(fDrawingManager); | 503 AutoCheckFlush acf(fDrawingManager); |
| 486 | 504 |
| 487 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 505 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 505 } | 523 } |
| 506 } | 524 } |
| 507 | 525 |
| 508 /////////////////////////////////////////////////////////////////////////////// | 526 /////////////////////////////////////////////////////////////////////////////// |
| 509 | 527 |
| 510 void GrDrawContext::drawOval(const GrClip& clip, | 528 void GrDrawContext::drawOval(const GrClip& clip, |
| 511 const GrPaint& paint, | 529 const GrPaint& paint, |
| 512 const SkMatrix& viewMatrix, | 530 const SkMatrix& viewMatrix, |
| 513 const SkRect& oval, | 531 const SkRect& oval, |
| 514 const GrStrokeInfo& strokeInfo) { | 532 const GrStrokeInfo& strokeInfo) { |
| 533 ASSERT_SINGLE_OWNER |
| 515 RETURN_IF_ABANDONED | 534 RETURN_IF_ABANDONED |
| 516 SkDEBUGCODE(this->validate();) | 535 SkDEBUGCODE(this->validate();) |
| 517 | 536 |
| 518 if (oval.isEmpty()) { | 537 if (oval.isEmpty()) { |
| 519 return; | 538 return; |
| 520 } | 539 } |
| 521 | 540 |
| 522 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice | 541 SkASSERT(!strokeInfo.isDashed()); // this should've been devolved to a path
in SkGpuDevice |
| 523 | 542 |
| 524 AutoCheckFlush acf(fDrawingManager); | 543 AutoCheckFlush acf(fDrawingManager); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 541 } | 560 } |
| 542 } | 561 } |
| 543 | 562 |
| 544 void GrDrawContext::drawImageNine(const GrClip& clip, | 563 void GrDrawContext::drawImageNine(const GrClip& clip, |
| 545 const GrPaint& paint, | 564 const GrPaint& paint, |
| 546 const SkMatrix& viewMatrix, | 565 const SkMatrix& viewMatrix, |
| 547 int imageWidth, | 566 int imageWidth, |
| 548 int imageHeight, | 567 int imageHeight, |
| 549 const SkIRect& center, | 568 const SkIRect& center, |
| 550 const SkRect& dst) { | 569 const SkRect& dst) { |
| 570 ASSERT_SINGLE_OWNER |
| 551 RETURN_IF_ABANDONED | 571 RETURN_IF_ABANDONED |
| 552 SkDEBUGCODE(this->validate();) | 572 SkDEBUGCODE(this->validate();) |
| 553 | 573 |
| 554 AutoCheckFlush acf(fDrawingManager); | 574 AutoCheckFlush acf(fDrawingManager); |
| 555 | 575 |
| 556 SkAutoTUnref<GrDrawBatch> batch(GrNinePatch::CreateNonAA(paint.getColor(), v
iewMatrix, | 576 SkAutoTUnref<GrDrawBatch> batch(GrNinePatch::CreateNonAA(paint.getColor(), v
iewMatrix, |
| 557 imageWidth, imageHe
ight, | 577 imageWidth, imageHe
ight, |
| 558 center, dst)); | 578 center, dst)); |
| 559 | 579 |
| 560 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 580 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 if (!SkScalarNearlyEqual(margin, temp)) { | 627 if (!SkScalarNearlyEqual(margin, temp)) { |
| 608 allEq = false; | 628 allEq = false; |
| 609 } | 629 } |
| 610 } | 630 } |
| 611 | 631 |
| 612 return allEq || allGoE1; | 632 return allEq || allGoE1; |
| 613 } | 633 } |
| 614 | 634 |
| 615 void GrDrawContext::drawBatch(const GrClip& clip, | 635 void GrDrawContext::drawBatch(const GrClip& clip, |
| 616 const GrPaint& paint, GrDrawBatch* batch) { | 636 const GrPaint& paint, GrDrawBatch* batch) { |
| 637 ASSERT_SINGLE_OWNER |
| 617 RETURN_IF_ABANDONED | 638 RETURN_IF_ABANDONED |
| 618 SkDEBUGCODE(this->validate();) | 639 SkDEBUGCODE(this->validate();) |
| 619 | 640 |
| 620 AutoCheckFlush acf(fDrawingManager); | 641 AutoCheckFlush acf(fDrawingManager); |
| 621 | 642 |
| 622 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 643 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 623 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 644 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 624 } | 645 } |
| 625 | 646 |
| 626 void GrDrawContext::drawPathBatch(const GrPipelineBuilder& pipelineBuilder, | 647 void GrDrawContext::drawPathBatch(const GrPipelineBuilder& pipelineBuilder, |
| 627 GrDrawPathBatchBase* batch) { | 648 GrDrawPathBatchBase* batch) { |
| 649 ASSERT_SINGLE_OWNER |
| 628 RETURN_IF_ABANDONED | 650 RETURN_IF_ABANDONED |
| 629 SkDEBUGCODE(this->validate();) | 651 SkDEBUGCODE(this->validate();) |
| 630 | 652 |
| 631 AutoCheckFlush acf(fDrawingManager); | 653 AutoCheckFlush acf(fDrawingManager); |
| 632 | 654 |
| 633 this->getDrawTarget()->drawPathBatch(pipelineBuilder, batch); | 655 this->getDrawTarget()->drawPathBatch(pipelineBuilder, batch); |
| 634 } | 656 } |
| 635 | 657 |
| 636 void GrDrawContext::drawPath(const GrClip& clip, | 658 void GrDrawContext::drawPath(const GrClip& clip, |
| 637 const GrPaint& paint, | 659 const GrPaint& paint, |
| 638 const SkMatrix& viewMatrix, | 660 const SkMatrix& viewMatrix, |
| 639 const SkPath& path, | 661 const SkPath& path, |
| 640 const GrStrokeInfo& strokeInfo) { | 662 const GrStrokeInfo& strokeInfo) { |
| 663 ASSERT_SINGLE_OWNER |
| 641 RETURN_IF_ABANDONED | 664 RETURN_IF_ABANDONED |
| 642 SkDEBUGCODE(this->validate();) | 665 SkDEBUGCODE(this->validate();) |
| 643 | 666 |
| 644 if (path.isEmpty()) { | 667 if (path.isEmpty()) { |
| 645 if (path.isInverseFillType()) { | 668 if (path.isInverseFillType()) { |
| 646 this->drawPaint(clip, paint, viewMatrix); | 669 this->drawPaint(clip, paint, viewMatrix); |
| 647 } | 670 } |
| 648 return; | 671 return; |
| 649 } | 672 } |
| 650 | 673 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, | 713 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
| 691 paint.isAntiAlias(), path, strokeInfo); | 714 paint.isAntiAlias(), path, strokeInfo); |
| 692 } | 715 } |
| 693 | 716 |
| 694 void GrDrawContext::internalDrawPath(GrPipelineBuilder* pipelineBuilder, | 717 void GrDrawContext::internalDrawPath(GrPipelineBuilder* pipelineBuilder, |
| 695 const SkMatrix& viewMatrix, | 718 const SkMatrix& viewMatrix, |
| 696 GrColor color, | 719 GrColor color, |
| 697 bool useAA, | 720 bool useAA, |
| 698 const SkPath& path, | 721 const SkPath& path, |
| 699 const GrStrokeInfo& strokeInfo) { | 722 const GrStrokeInfo& strokeInfo) { |
| 723 ASSERT_SINGLE_OWNER |
| 700 RETURN_IF_ABANDONED | 724 RETURN_IF_ABANDONED |
| 701 SkASSERT(!path.isEmpty()); | 725 SkASSERT(!path.isEmpty()); |
| 702 | 726 |
| 703 // An Assumption here is that path renderer would use some form of tweaking | 727 // An Assumption here is that path renderer would use some form of tweaking |
| 704 // the src color (either the input alpha or in the frag shader) to implement | 728 // the src color (either the input alpha or in the frag shader) to implement |
| 705 // aa. If we have some future driver-mojo path AA that can do the right | 729 // aa. If we have some future driver-mojo path AA that can do the right |
| 706 // thing WRT to the blend then we'll need some query on the PR. | 730 // thing WRT to the blend then we'll need some query on the PR. |
| 707 bool useCoverageAA = useAA && | 731 bool useCoverageAA = useAA && |
| 708 !pipelineBuilder->getRenderTarget()->isUnifiedMultisampled(); | 732 !pipelineBuilder->getRenderTarget()->isUnifiedMultisampled(); |
| 709 bool isStencilDisabled = pipelineBuilder->getStencil().isDisabled(); | 733 bool isStencilDisabled = pipelineBuilder->getStencil().isDisabled(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 786 args.fPipelineBuilder = pipelineBuilder; | 810 args.fPipelineBuilder = pipelineBuilder; |
| 787 args.fColor = color; | 811 args.fColor = color; |
| 788 args.fViewMatrix = &viewMatrix; | 812 args.fViewMatrix = &viewMatrix; |
| 789 args.fPath = pathPtr; | 813 args.fPath = pathPtr; |
| 790 args.fStroke = strokeInfoPtr; | 814 args.fStroke = strokeInfoPtr; |
| 791 args.fAntiAlias = useCoverageAA; | 815 args.fAntiAlias = useCoverageAA; |
| 792 pr->drawPath(args); | 816 pr->drawPath(args); |
| 793 } | 817 } |
| 794 | 818 |
| 795 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 819 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 820 ASSERT_SINGLE_OWNER |
| 796 RETURN_IF_ABANDONED | 821 RETURN_IF_ABANDONED |
| 797 SkDEBUGCODE(this->validate();) | 822 SkDEBUGCODE(this->validate();) |
| 798 | 823 |
| 799 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 824 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
| 800 } | 825 } |
| OLD | NEW |