| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrBatchTest.h" | 8 #include "GrBatchTest.h" |
| 9 #include "GrColor.h" | 9 #include "GrColor.h" |
| 10 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 if (!viewMatrix.invert(&localMatrix)) { | 228 if (!viewMatrix.invert(&localMatrix)) { |
| 229 SkDebugf("Could not invert matrix\n"); | 229 SkDebugf("Could not invert matrix\n"); |
| 230 return; | 230 return; |
| 231 } | 231 } |
| 232 | 232 |
| 233 AutoCheckFlush acf(fDrawingManager); | 233 AutoCheckFlush acf(fDrawingManager); |
| 234 | 234 |
| 235 SkAutoTUnref<GrDrawBatch> batch( | 235 SkAutoTUnref<GrDrawBatch> batch( |
| 236 GrRectBatchFactory::CreateNonAAFill(paint->getColor(), SkMatrix:
:I(), r, nullptr, | 236 GrRectBatchFactory::CreateNonAAFill(paint->getColor(), SkMatrix:
:I(), r, nullptr, |
| 237 &localMatrix)); | 237 &localMatrix)); |
| 238 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget.get(), clip); | 238 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget.get()); |
| 239 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 239 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 240 } | 240 } |
| 241 } | 241 } |
| 242 | 242 |
| 243 static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po
int) { | 243 static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po
int) { |
| 244 return point.fX >= rect.fLeft && point.fX <= rect.fRight && | 244 return point.fX >= rect.fLeft && point.fX <= rect.fRight && |
| 245 point.fY >= rect.fTop && point.fY <= rect.fBottom; | 245 point.fY >= rect.fTop && point.fY <= rect.fBottom; |
| 246 } | 246 } |
| 247 | 247 |
| 248 static bool view_matrix_ok_for_aa_fill_rect(const SkMatrix& viewMatrix) { | 248 static bool view_matrix_ok_for_aa_fill_rect(const SkMatrix& viewMatrix) { |
| 249 return viewMatrix.preservesRightAngles(); | 249 return viewMatrix.preservesRightAngles(); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix,
rect, | 350 batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix,
rect, |
| 351 width, snapToPixel
Centers)); | 351 width, snapToPixel
Centers)); |
| 352 | 352 |
| 353 // Depending on sub-pixel coordinates and the particular GPU, we may
lose a corner of | 353 // Depending on sub-pixel coordinates and the particular GPU, we may
lose a corner of |
| 354 // hairline rects. We jam all the vertices to pixel centers to avoid
this, but not | 354 // hairline rects. We jam all the vertices to pixel centers to avoid
this, but not |
| 355 // when MSAA is enabled because it can cause ugly artifacts. | 355 // when MSAA is enabled because it can cause ugly artifacts. |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 | 358 |
| 359 if (batch) { | 359 if (batch) { |
| 360 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 360 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 361 | 361 |
| 362 if (snapToPixelCenters) { | 362 if (snapToPixelCenters) { |
| 363 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCent
ers_Flag, | 363 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCent
ers_Flag, |
| 364 snapToPixelCenters); | 364 snapToPixelCenters); |
| 365 } | 365 } |
| 366 | 366 |
| 367 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 367 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 368 return; | 368 return; |
| 369 } | 369 } |
| 370 | 370 |
| 371 SkPath path; | 371 SkPath path; |
| 372 path.setIsVolatile(true); | 372 path.setIsVolatile(true); |
| 373 path.addRect(rect); | 373 path.addRect(rect); |
| 374 this->internalDrawPath(clip, paint, viewMatrix, path, *style); | 374 this->internalDrawPath(clip, paint, viewMatrix, path, *style); |
| 375 } | 375 } |
| 376 | 376 |
| 377 bool GrDrawContextPriv::drawAndStencilRect(const SkIRect* scissorRect, | 377 bool GrDrawContextPriv::drawAndStencilRect(const GrClip& clip, |
| 378 const GrUserStencilSettings* ss, | 378 const GrUserStencilSettings* ss, |
| 379 SkRegion::Op op, | 379 SkRegion::Op op, |
| 380 bool invert, | 380 bool invert, |
| 381 bool doAA, | 381 bool doAA, |
| 382 const SkMatrix& viewMatrix, | 382 const SkMatrix& viewMatrix, |
| 383 const SkRect& rect) { | 383 const SkRect& rect) { |
| 384 ASSERT_SINGLE_OWNER_PRIV | 384 ASSERT_SINGLE_OWNER_PRIV |
| 385 RETURN_FALSE_IF_ABANDONED_PRIV | 385 RETURN_FALSE_IF_ABANDONED_PRIV |
| 386 SkDEBUGCODE(fDrawContext->validate();) | 386 SkDEBUGCODE(fDrawContext->validate();) |
| 387 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::stencil
Rect"); | 387 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::stencil
Rect"); |
| 388 | 388 |
| 389 AutoCheckFlush acf(fDrawContext->fDrawingManager); | 389 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| 390 | 390 |
| 391 GrPaint paint; | 391 GrPaint paint; |
| 392 paint.setAntiAlias(doAA); | 392 paint.setAntiAlias(doAA); |
| 393 paint.setCoverageSetOpXPFactory(op, invert); | 393 paint.setCoverageSetOpXPFactory(op, invert); |
| 394 | 394 |
| 395 SkAutoTUnref<GrDrawBatch> batch(fDrawContext->getFillRectBatch(paint, viewMa
trix, rect)); | 395 SkAutoTUnref<GrDrawBatch> batch(fDrawContext->getFillRectBatch(paint, viewMa
trix, rect)); |
| 396 if (batch) { | 396 if (batch) { |
| 397 GrPipelineBuilder pipelineBuilder(paint, | 397 GrPipelineBuilder pipelineBuilder(paint, fDrawContext->accessRenderTarge
t()); |
| 398 fDrawContext->accessRenderTarget(), | |
| 399 GrClip::WideOpen()); | |
| 400 pipelineBuilder.setUserStencil(ss); | 398 pipelineBuilder.setUserStencil(ss); |
| 401 | 399 |
| 402 fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, batch, scissor
Rect); | 400 fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 403 return true; | 401 return true; |
| 404 } | 402 } |
| 405 | 403 |
| 406 SkPath path; | 404 SkPath path; |
| 407 path.setIsVolatile(true); | 405 path.setIsVolatile(true); |
| 408 path.addRect(rect); | 406 path.addRect(rect); |
| 409 return this->drawAndStencilPath(scissorRect, ss, op, invert, doAA, viewMatri
x, path); | 407 return this->drawAndStencilPath(clip, ss, op, invert, doAA, viewMatrix, path
); |
| 410 } | 408 } |
| 411 | 409 |
| 412 void GrDrawContext::fillRectToRect(const GrClip& clip, | 410 void GrDrawContext::fillRectToRect(const GrClip& clip, |
| 413 const GrPaint& paint, | 411 const GrPaint& paint, |
| 414 const SkMatrix& viewMatrix, | 412 const SkMatrix& viewMatrix, |
| 415 const SkRect& rectToDraw, | 413 const SkRect& rectToDraw, |
| 416 const SkRect& localRect) { | 414 const SkRect& localRect) { |
| 417 ASSERT_SINGLE_OWNER | 415 ASSERT_SINGLE_OWNER |
| 418 RETURN_IF_ABANDONED | 416 RETURN_IF_ABANDONED |
| 419 SkDEBUGCODE(this->validate();) | 417 SkDEBUGCODE(this->validate();) |
| 420 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); | 418 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); |
| 421 | 419 |
| 422 AutoCheckFlush acf(fDrawingManager); | 420 AutoCheckFlush acf(fDrawingManager); |
| 423 | 421 |
| 424 SkAutoTUnref<GrDrawBatch> batch; | 422 SkAutoTUnref<GrDrawBatch> batch; |
| 425 if (should_apply_coverage_aa(paint, fRenderTarget.get()) && | 423 if (should_apply_coverage_aa(paint, fRenderTarget.get()) && |
| 426 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 424 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 427 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie
wMatrix, rectToDraw, | 425 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie
wMatrix, rectToDraw, |
| 428 localRect)); | 426 localRect)); |
| 429 } else { | 427 } else { |
| 430 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, | 428 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, |
| 431 &localRect, nullptr)); | 429 &localRect, nullptr)); |
| 432 } | 430 } |
| 433 | 431 |
| 434 if (batch) { | 432 if (batch) { |
| 435 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 433 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 436 this->drawBatch(&pipelineBuilder, batch); | 434 this->drawBatch(&pipelineBuilder, clip, batch); |
| 437 } | 435 } |
| 438 } | 436 } |
| 439 | 437 |
| 440 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, | 438 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
| 441 const GrPaint& paint, | 439 const GrPaint& paint, |
| 442 const SkMatrix& viewMatrix, | 440 const SkMatrix& viewMatrix, |
| 443 const SkRect& rectToDraw, | 441 const SkRect& rectToDraw, |
| 444 const SkMatrix& localMatrix) { | 442 const SkMatrix& localMatrix) { |
| 445 ASSERT_SINGLE_OWNER | 443 ASSERT_SINGLE_OWNER |
| 446 RETURN_IF_ABANDONED | 444 RETURN_IF_ABANDONED |
| 447 SkDEBUGCODE(this->validate();) | 445 SkDEBUGCODE(this->validate();) |
| 448 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr
ix"); | 446 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr
ix"); |
| 449 | 447 |
| 450 AutoCheckFlush acf(fDrawingManager); | 448 AutoCheckFlush acf(fDrawingManager); |
| 451 | 449 |
| 452 SkAutoTUnref<GrDrawBatch> batch; | 450 SkAutoTUnref<GrDrawBatch> batch; |
| 453 if (should_apply_coverage_aa(paint, fRenderTarget.get()) && | 451 if (should_apply_coverage_aa(paint, fRenderTarget.get()) && |
| 454 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 452 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 455 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca
lMatrix, | 453 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca
lMatrix, |
| 456 rectToDraw)); | 454 rectToDraw)); |
| 457 } else { | 455 } else { |
| 458 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, | 456 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, |
| 459 nullptr, &localMatrix)); | 457 nullptr, &localMatrix)); |
| 460 } | 458 } |
| 461 | 459 |
| 462 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 460 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 463 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 461 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 464 } | 462 } |
| 465 | 463 |
| 466 void GrDrawContext::drawVertices(const GrClip& clip, | 464 void GrDrawContext::drawVertices(const GrClip& clip, |
| 467 const GrPaint& paint, | 465 const GrPaint& paint, |
| 468 const SkMatrix& viewMatrix, | 466 const SkMatrix& viewMatrix, |
| 469 GrPrimitiveType primitiveType, | 467 GrPrimitiveType primitiveType, |
| 470 int vertexCount, | 468 int vertexCount, |
| 471 const SkPoint positions[], | 469 const SkPoint positions[], |
| 472 const SkPoint texCoords[], | 470 const SkPoint texCoords[], |
| 473 const GrColor colors[], | 471 const GrColor colors[], |
| (...skipping 23 matching lines...) Expand all Loading... |
| 497 bounds.outset(0.5f, 0.5f); | 495 bounds.outset(0.5f, 0.5f); |
| 498 } | 496 } |
| 499 | 497 |
| 500 GrDrawVerticesBatch::Geometry geometry; | 498 GrDrawVerticesBatch::Geometry geometry; |
| 501 geometry.fColor = paint.getColor(); | 499 geometry.fColor = paint.getColor(); |
| 502 SkAutoTUnref<GrDrawBatch> batch(GrDrawVerticesBatch::Create(geometry, primit
iveType, viewMatrix, | 500 SkAutoTUnref<GrDrawBatch> batch(GrDrawVerticesBatch::Create(geometry, primit
iveType, viewMatrix, |
| 503 positions, verte
xCount, indices, | 501 positions, verte
xCount, indices, |
| 504 indexCount, colo
rs, texCoords, | 502 indexCount, colo
rs, texCoords, |
| 505 bounds)); | 503 bounds)); |
| 506 | 504 |
| 507 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 505 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 508 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 506 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 509 } | 507 } |
| 510 | 508 |
| 511 /////////////////////////////////////////////////////////////////////////////// | 509 /////////////////////////////////////////////////////////////////////////////// |
| 512 | 510 |
| 513 void GrDrawContext::drawAtlas(const GrClip& clip, | 511 void GrDrawContext::drawAtlas(const GrClip& clip, |
| 514 const GrPaint& paint, | 512 const GrPaint& paint, |
| 515 const SkMatrix& viewMatrix, | 513 const SkMatrix& viewMatrix, |
| 516 int spriteCount, | 514 int spriteCount, |
| 517 const SkRSXform xform[], | 515 const SkRSXform xform[], |
| 518 const SkRect texRect[], | 516 const SkRect texRect[], |
| 519 const SkColor colors[]) { | 517 const SkColor colors[]) { |
| 520 ASSERT_SINGLE_OWNER | 518 ASSERT_SINGLE_OWNER |
| 521 RETURN_IF_ABANDONED | 519 RETURN_IF_ABANDONED |
| 522 SkDEBUGCODE(this->validate();) | 520 SkDEBUGCODE(this->validate();) |
| 523 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawAtlas"); | 521 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawAtlas"); |
| 524 | 522 |
| 525 AutoCheckFlush acf(fDrawingManager); | 523 AutoCheckFlush acf(fDrawingManager); |
| 526 | 524 |
| 527 GrDrawAtlasBatch::Geometry geometry; | 525 GrDrawAtlasBatch::Geometry geometry; |
| 528 geometry.fColor = paint.getColor(); | 526 geometry.fColor = paint.getColor(); |
| 529 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, | 527 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, |
| 530 xform, texRect, col
ors)); | 528 xform, texRect, col
ors)); |
| 531 | 529 |
| 532 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 530 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 533 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 531 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 534 } | 532 } |
| 535 | 533 |
| 536 /////////////////////////////////////////////////////////////////////////////// | 534 /////////////////////////////////////////////////////////////////////////////// |
| 537 | 535 |
| 538 void GrDrawContext::drawRRect(const GrClip& clip, | 536 void GrDrawContext::drawRRect(const GrClip& clip, |
| 539 const GrPaint& paint, | 537 const GrPaint& paint, |
| 540 const SkMatrix& viewMatrix, | 538 const SkMatrix& viewMatrix, |
| 541 const SkRRect& rrect, | 539 const SkRRect& rrect, |
| 542 const GrStyle& style) { | 540 const GrStyle& style) { |
| 543 ASSERT_SINGLE_OWNER | 541 ASSERT_SINGLE_OWNER |
| (...skipping 11 matching lines...) Expand all Loading... |
| 555 | 553 |
| 556 if (should_apply_coverage_aa(paint, fRenderTarget.get())) { | 554 if (should_apply_coverage_aa(paint, fRenderTarget.get())) { |
| 557 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 555 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
| 558 | 556 |
| 559 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.g
etColor(), | 557 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.g
etColor(), |
| 560 viewMat
rix, | 558 viewMat
rix, |
| 561 rrect, | 559 rrect, |
| 562 stroke, | 560 stroke, |
| 563 shaderC
aps)); | 561 shaderC
aps)); |
| 564 if (batch) { | 562 if (batch) { |
| 565 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 563 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 566 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 564 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 567 return; | 565 return; |
| 568 } | 566 } |
| 569 } | 567 } |
| 570 | 568 |
| 571 SkPath path; | 569 SkPath path; |
| 572 path.setIsVolatile(true); | 570 path.setIsVolatile(true); |
| 573 path.addRRect(rrect); | 571 path.addRRect(rrect); |
| 574 this->internalDrawPath(clip, paint, viewMatrix, path, style); | 572 this->internalDrawPath(clip, paint, viewMatrix, path, style); |
| 575 } | 573 } |
| 576 | 574 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 if (this->drawFilledDRRect(clip, paint, viewMatrix, outer, inner)) { | 647 if (this->drawFilledDRRect(clip, paint, viewMatrix, outer, inner)) { |
| 650 return; | 648 return; |
| 651 } | 649 } |
| 652 | 650 |
| 653 SkPath path; | 651 SkPath path; |
| 654 path.setIsVolatile(true); | 652 path.setIsVolatile(true); |
| 655 path.addRRect(inner); | 653 path.addRRect(inner); |
| 656 path.addRRect(outer); | 654 path.addRRect(outer); |
| 657 path.setFillType(SkPath::kEvenOdd_FillType); | 655 path.setFillType(SkPath::kEvenOdd_FillType); |
| 658 | 656 |
| 659 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | |
| 660 this->internalDrawPath(clip, paint, viewMatrix, path, GrStyle::SimpleFill())
; | 657 this->internalDrawPath(clip, paint, viewMatrix, path, GrStyle::SimpleFill())
; |
| 661 } | 658 } |
| 662 | 659 |
| 663 /////////////////////////////////////////////////////////////////////////////// | 660 /////////////////////////////////////////////////////////////////////////////// |
| 664 | 661 |
| 665 void GrDrawContext::drawOval(const GrClip& clip, | 662 void GrDrawContext::drawOval(const GrClip& clip, |
| 666 const GrPaint& paint, | 663 const GrPaint& paint, |
| 667 const SkMatrix& viewMatrix, | 664 const SkMatrix& viewMatrix, |
| 668 const SkRect& oval, | 665 const SkRect& oval, |
| 669 const GrStyle& style) { | 666 const GrStyle& style) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 681 AutoCheckFlush acf(fDrawingManager); | 678 AutoCheckFlush acf(fDrawingManager); |
| 682 const SkStrokeRec& stroke = style.strokeRec(); | 679 const SkStrokeRec& stroke = style.strokeRec(); |
| 683 if (should_apply_coverage_aa(paint, fRenderTarget.get())) { | 680 if (should_apply_coverage_aa(paint, fRenderTarget.get())) { |
| 684 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 681 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
| 685 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.ge
tColor(), | 682 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.ge
tColor(), |
| 686 viewMatr
ix, | 683 viewMatr
ix, |
| 687 oval, | 684 oval, |
| 688 stroke, | 685 stroke, |
| 689 shaderCa
ps)); | 686 shaderCa
ps)); |
| 690 if (batch) { | 687 if (batch) { |
| 691 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 688 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 692 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 689 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 693 return; | 690 return; |
| 694 } | 691 } |
| 695 } | 692 } |
| 696 | 693 |
| 697 SkPath path; | 694 SkPath path; |
| 698 path.setIsVolatile(true); | 695 path.setIsVolatile(true); |
| 699 path.addOval(oval); | 696 path.addOval(oval); |
| 700 this->internalDrawPath(clip, paint, viewMatrix, path, style); | 697 this->internalDrawPath(clip, paint, viewMatrix, path, style); |
| 701 } | 698 } |
| 702 | 699 |
| 703 void GrDrawContext::drawImageNine(const GrClip& clip, | 700 void GrDrawContext::drawImageNine(const GrClip& clip, |
| 704 const GrPaint& paint, | 701 const GrPaint& paint, |
| 705 const SkMatrix& viewMatrix, | 702 const SkMatrix& viewMatrix, |
| 706 int imageWidth, | 703 int imageWidth, |
| 707 int imageHeight, | 704 int imageHeight, |
| 708 const SkIRect& center, | 705 const SkIRect& center, |
| 709 const SkRect& dst) { | 706 const SkRect& dst) { |
| 710 ASSERT_SINGLE_OWNER | 707 ASSERT_SINGLE_OWNER |
| 711 RETURN_IF_ABANDONED | 708 RETURN_IF_ABANDONED |
| 712 SkDEBUGCODE(this->validate();) | 709 SkDEBUGCODE(this->validate();) |
| 713 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawImageNine"); | 710 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawImageNine"); |
| 714 | 711 |
| 715 AutoCheckFlush acf(fDrawingManager); | 712 AutoCheckFlush acf(fDrawingManager); |
| 716 | 713 |
| 717 SkAutoTUnref<GrDrawBatch> batch(GrNinePatch::CreateNonAA(paint.getColor(), v
iewMatrix, | 714 SkAutoTUnref<GrDrawBatch> batch(GrNinePatch::CreateNonAA(paint.getColor(), v
iewMatrix, |
| 718 imageWidth, imageHe
ight, | 715 imageWidth, imageHe
ight, |
| 719 center, dst)); | 716 center, dst)); |
| 720 | 717 |
| 721 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 718 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 722 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 719 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 723 } | 720 } |
| 724 | 721 |
| 725 | 722 |
| 726 // Can 'path' be drawn as a pair of filled nested rectangles? | 723 // Can 'path' be drawn as a pair of filled nested rectangles? |
| 727 static bool fills_as_nested_rects(const SkMatrix& viewMatrix, const SkPath& path
, SkRect rects[2]) { | 724 static bool fills_as_nested_rects(const SkMatrix& viewMatrix, const SkPath& path
, SkRect rects[2]) { |
| 728 | 725 |
| 729 if (path.isInverseFillType()) { | 726 if (path.isInverseFillType()) { |
| 730 return false; | 727 return false; |
| 731 } | 728 } |
| 732 | 729 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 | 768 |
| 772 void GrDrawContext::drawBatch(const GrClip& clip, | 769 void GrDrawContext::drawBatch(const GrClip& clip, |
| 773 const GrPaint& paint, GrDrawBatch* batch) { | 770 const GrPaint& paint, GrDrawBatch* batch) { |
| 774 ASSERT_SINGLE_OWNER | 771 ASSERT_SINGLE_OWNER |
| 775 RETURN_IF_ABANDONED | 772 RETURN_IF_ABANDONED |
| 776 SkDEBUGCODE(this->validate();) | 773 SkDEBUGCODE(this->validate();) |
| 777 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 774 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| 778 | 775 |
| 779 AutoCheckFlush acf(fDrawingManager); | 776 AutoCheckFlush acf(fDrawingManager); |
| 780 | 777 |
| 781 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 778 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 782 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 779 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 783 } | 780 } |
| 784 | 781 |
| 785 void GrDrawContext::drawPath(const GrClip& clip, | 782 void GrDrawContext::drawPath(const GrClip& clip, |
| 786 const GrPaint& paint, | 783 const GrPaint& paint, |
| 787 const SkMatrix& viewMatrix, | 784 const SkMatrix& viewMatrix, |
| 788 const SkPath& path, | 785 const SkPath& path, |
| 789 const GrStyle& style) { | 786 const GrStyle& style) { |
| 790 ASSERT_SINGLE_OWNER | 787 ASSERT_SINGLE_OWNER |
| 791 RETURN_IF_ABANDONED | 788 RETURN_IF_ABANDONED |
| 792 SkDEBUGCODE(this->validate();) | 789 SkDEBUGCODE(this->validate();) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 803 | 800 |
| 804 if (should_apply_coverage_aa(paint, fRenderTarget.get()) && !style.pathEffec
t()) { | 801 if (should_apply_coverage_aa(paint, fRenderTarget.get()) && !style.pathEffec
t()) { |
| 805 if (style.isSimpleFill() && !path.isConvex()) { | 802 if (style.isSimpleFill() && !path.isConvex()) { |
| 806 // Concave AA paths are expensive - try to avoid them for special ca
ses | 803 // Concave AA paths are expensive - try to avoid them for special ca
ses |
| 807 SkRect rects[2]; | 804 SkRect rects[2]; |
| 808 | 805 |
| 809 if (fills_as_nested_rects(viewMatrix, path, rects)) { | 806 if (fills_as_nested_rects(viewMatrix, path, rects)) { |
| 810 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill
NestedRects( | 807 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill
NestedRects( |
| 811 paint.getColor(), viewMatrix, rects)); | 808 paint.getColor(), viewMatrix, rects)); |
| 812 if (batch) { | 809 if (batch) { |
| 813 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()
, clip); | 810 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()
); |
| 814 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 811 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batc
h); |
| 815 } | 812 } |
| 816 return; | 813 return; |
| 817 } | 814 } |
| 818 } | 815 } |
| 819 SkRect ovalRect; | 816 SkRect ovalRect; |
| 820 bool isOval = path.isOval(&ovalRect); | 817 bool isOval = path.isOval(&ovalRect); |
| 821 | 818 |
| 822 if (isOval && !path.isInverseFillType()) { | 819 if (isOval && !path.isInverseFillType()) { |
| 823 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); | 820 GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
| 824 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(pain
t.getColor(), | 821 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(pain
t.getColor(), |
| 825 view
Matrix, | 822 view
Matrix, |
| 826 oval
Rect, | 823 oval
Rect, |
| 827 styl
e.strokeRec(), | 824 styl
e.strokeRec(), |
| 828 shad
erCaps)); | 825 shad
erCaps)); |
| 829 if (batch) { | 826 if (batch) { |
| 830 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), cl
ip); | 827 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 831 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 828 this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| 832 return; | 829 return; |
| 833 } | 830 } |
| 834 } | 831 } |
| 835 } | 832 } |
| 836 | 833 |
| 837 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 834 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
| 838 // Scratch textures can be recycled after they are returned to the texture | 835 // Scratch textures can be recycled after they are returned to the texture |
| 839 // cache. This presents a potential hazard for buffered drawing. However, | 836 // cache. This presents a potential hazard for buffered drawing. However, |
| 840 // the writePixels that uploads to the scratch will perform a flush so we're | 837 // the writePixels that uploads to the scratch will perform a flush so we're |
| 841 // OK. | 838 // OK. |
| 842 this->internalDrawPath(clip, paint, viewMatrix, path, style); | 839 this->internalDrawPath(clip, paint, viewMatrix, path, style); |
| 843 } | 840 } |
| 844 | 841 |
| 845 bool GrDrawContextPriv::drawAndStencilPath(const SkIRect* scissorRect, | 842 bool GrDrawContextPriv::drawAndStencilPath(const GrClip& clip, |
| 846 const GrUserStencilSettings* ss, | 843 const GrUserStencilSettings* ss, |
| 847 SkRegion::Op op, | 844 SkRegion::Op op, |
| 848 bool invert, | 845 bool invert, |
| 849 bool doAA, | 846 bool doAA, |
| 850 const SkMatrix& viewMatrix, | 847 const SkMatrix& viewMatrix, |
| 851 const SkPath& path) { | 848 const SkPath& path) { |
| 852 ASSERT_SINGLE_OWNER_PRIV | 849 ASSERT_SINGLE_OWNER_PRIV |
| 853 RETURN_FALSE_IF_ABANDONED_PRIV | 850 RETURN_FALSE_IF_ABANDONED_PRIV |
| 854 SkDEBUGCODE(fDrawContext->validate();) | 851 SkDEBUGCODE(fDrawContext->validate();) |
| 855 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPat
h"); | 852 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPat
h"); |
| 856 | 853 |
| 857 if (path.isEmpty() && path.isInverseFillType()) { | 854 if (path.isEmpty() && path.isInverseFillType()) { |
| 858 this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I
(), | 855 this->drawAndStencilRect(clip, ss, op, invert, false, SkMatrix::I(), |
| 859 SkRect::MakeIWH(fDrawContext->width(), | 856 SkRect::MakeIWH(fDrawContext->width(), |
| 860 fDrawContext->height())); | 857 fDrawContext->height())); |
| 861 return true; | 858 return true; |
| 862 } | 859 } |
| 863 | 860 |
| 864 AutoCheckFlush acf(fDrawContext->fDrawingManager); | 861 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| 865 | 862 |
| 866 // An Assumption here is that path renderer would use some form of tweaking | 863 // An Assumption here is that path renderer would use some form of tweaking |
| 867 // the src color (either the input alpha or in the frag shader) to implement | 864 // the src color (either the input alpha or in the frag shader) to implement |
| 868 // aa. If we have some future driver-mojo path AA that can do the right | 865 // aa. If we have some future driver-mojo path AA that can do the right |
| (...skipping 17 matching lines...) Expand all Loading... |
| 886 | 883 |
| 887 // Don't allow the SW renderer | 884 // Don't allow the SW renderer |
| 888 GrPathRenderer* pr = fDrawContext->fDrawingManager->getPathRenderer(canDrawA
rgs, false, type); | 885 GrPathRenderer* pr = fDrawContext->fDrawingManager->getPathRenderer(canDrawA
rgs, false, type); |
| 889 if (!pr) { | 886 if (!pr) { |
| 890 return false; | 887 return false; |
| 891 } | 888 } |
| 892 | 889 |
| 893 GrPaint paint; | 890 GrPaint paint; |
| 894 paint.setCoverageSetOpXPFactory(op, invert); | 891 paint.setCoverageSetOpXPFactory(op, invert); |
| 895 | 892 |
| 896 // TODO: it is unfortunate that we have to convert this to a GrClip to | 893 GrPipelineBuilder pipelineBuilder(paint, fDrawContext->accessRenderTarget())
; |
| 897 // call drawPath. | |
| 898 GrClip clip; | |
| 899 if (scissorRect) { | |
| 900 clip.setIRect(*scissorRect); | |
| 901 } | |
| 902 | |
| 903 GrPipelineBuilder pipelineBuilder(paint, fDrawContext->accessRenderTarget(),
clip); | |
| 904 pipelineBuilder.setUserStencil(ss); | 894 pipelineBuilder.setUserStencil(ss); |
| 905 | 895 |
| 906 GrPathRenderer::DrawPathArgs args; | 896 GrPathRenderer::DrawPathArgs args; |
| 907 args.fTarget = fDrawContext->getDrawTarget(); | 897 args.fTarget = fDrawContext->getDrawTarget(); |
| 908 args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resour
ceProvider(); | 898 args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resour
ceProvider(); |
| 909 args.fPipelineBuilder = &pipelineBuilder; | 899 args.fPipelineBuilder = &pipelineBuilder; |
| 900 args.fClip = &clip; |
| 910 args.fColor = GrColor_WHITE; | 901 args.fColor = GrColor_WHITE; |
| 911 args.fViewMatrix = &viewMatrix; | 902 args.fViewMatrix = &viewMatrix; |
| 912 args.fPath = &path; | 903 args.fPath = &path; |
| 913 args.fStyle = &GrStyle::SimpleFill(); | 904 args.fStyle = &GrStyle::SimpleFill(); |
| 914 args.fAntiAlias = useCoverageAA; | 905 args.fAntiAlias = useCoverageAA; |
| 915 args.fGammaCorrect = fDrawContext->isGammaCorrect(); | 906 args.fGammaCorrect = fDrawContext->isGammaCorrect(); |
| 916 pr->drawPath(args); | 907 pr->drawPath(args); |
| 917 return true; | 908 return true; |
| 918 } | 909 } |
| 919 | 910 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 pr = fDrawingManager->getPathRenderer(canDrawArgs, true, type); | 989 pr = fDrawingManager->getPathRenderer(canDrawArgs, true, type); |
| 999 } | 990 } |
| 1000 | 991 |
| 1001 if (nullptr == pr) { | 992 if (nullptr == pr) { |
| 1002 #ifdef SK_DEBUG | 993 #ifdef SK_DEBUG |
| 1003 SkDebugf("Unable to find path renderer compatible with path.\n"); | 994 SkDebugf("Unable to find path renderer compatible with path.\n"); |
| 1004 #endif | 995 #endif |
| 1005 return; | 996 return; |
| 1006 } | 997 } |
| 1007 | 998 |
| 1008 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); | 999 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get()); |
| 1009 | 1000 |
| 1010 GrPathRenderer::DrawPathArgs args; | 1001 GrPathRenderer::DrawPathArgs args; |
| 1011 args.fTarget = this->getDrawTarget(); | 1002 args.fTarget = this->getDrawTarget(); |
| 1012 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); | 1003 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); |
| 1013 args.fPipelineBuilder = &pipelineBuilder; | 1004 args.fPipelineBuilder = &pipelineBuilder; |
| 1005 args.fClip = &clip; |
| 1014 args.fColor = paint.getColor(); | 1006 args.fColor = paint.getColor(); |
| 1015 args.fViewMatrix = &viewMatrix; | 1007 args.fViewMatrix = &viewMatrix; |
| 1016 args.fPath = canDrawArgs.fPath; | 1008 args.fPath = canDrawArgs.fPath; |
| 1017 args.fStyle = canDrawArgs.fStyle; | 1009 args.fStyle = canDrawArgs.fStyle; |
| 1018 args.fAntiAlias = useCoverageAA; | 1010 args.fAntiAlias = useCoverageAA; |
| 1019 args.fGammaCorrect = this->isGammaCorrect(); | 1011 args.fGammaCorrect = this->isGammaCorrect(); |
| 1020 pr->drawPath(args); | 1012 pr->drawPath(args); |
| 1021 } | 1013 } |
| 1022 | 1014 |
| 1023 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 1015 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, const GrClip&
clip, |
| 1016 GrDrawBatch* batch) { |
| 1024 ASSERT_SINGLE_OWNER | 1017 ASSERT_SINGLE_OWNER |
| 1025 RETURN_IF_ABANDONED | 1018 RETURN_IF_ABANDONED |
| 1026 SkDEBUGCODE(this->validate();) | 1019 SkDEBUGCODE(this->validate();) |
| 1027 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1020 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| 1028 | 1021 |
| 1029 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 1022 this->getDrawTarget()->drawBatch(*pipelineBuilder, clip, batch); |
| 1030 } | 1023 } |
| OLD | NEW |