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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
263 } | 263 } |
264 return false; | 264 return false; |
265 } else { | 265 } else { |
266 if (useHWAA) { | 266 if (useHWAA) { |
267 *useHWAA = rt->isUnifiedMultisampled(); | 267 *useHWAA = rt->isUnifiedMultisampled(); |
268 } | 268 } |
269 return !rt->isUnifiedMultisampled(); | 269 return !rt->isUnifiedMultisampled(); |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 enum class CropResult { | |
274 kSkip, | |
275 kDidCrop, | |
276 kDidNotCrop | |
277 }; | |
278 | |
279 static CropResult crop_fill_rect(const GrRenderTarget* rt, const GrClip& clip, | |
280 const SkMatrix& viewMatrix, SkRect* rect) { | |
281 if (!viewMatrix.rectStaysRect()) { | |
282 return CropResult::kDidNotCrop; | |
283 } | |
284 SkMatrix inverseViewMatrix; | |
285 if (!viewMatrix.invert(&inverseViewMatrix)) { | |
286 return CropResult::kSkip; | |
287 } | |
288 SkASSERT(inverseViewMatrix.rectStaysRect()); | |
289 SkIRect clipDevBounds; | |
290 clip.getConservativeBounds(rt->width(), rt->height(), &clipDevBounds); | |
291 SkRect clipUserSpaceBounds; | |
292 inverseViewMatrix.mapRect(&clipUserSpaceBounds, SkRect::Make(clipDevBounds)) ; | |
293 if (!rect->intersect(clipUserSpaceBounds)) { | |
294 return CropResult::kSkip; | |
295 } | |
296 return CropResult::kDidCrop; | |
297 } | |
298 | |
273 bool GrDrawContext::drawFilledRect(const GrClip& clip, | 299 bool GrDrawContext::drawFilledRect(const GrClip& clip, |
274 const GrPaint& paint, | 300 const GrPaint& paint, |
275 const SkMatrix& viewMatrix, | 301 const SkMatrix& viewMatrix, |
276 const SkRect& rect, | 302 const SkRect& rect, |
277 const GrUserStencilSettings* ss) { | 303 const GrUserStencilSettings* ss) { |
304 SkRect croppedRect = rect; | |
305 if (CropResult::kSkip == crop_fill_rect(fRenderTarget.get(), clip, viewMatri x, &croppedRect)) { | |
306 return true; | |
307 } | |
278 | 308 |
279 SkAutoTUnref<GrDrawBatch> batch; | 309 SkAutoTUnref<GrDrawBatch> batch; |
280 bool useHWAA; | 310 bool useHWAA; |
281 | 311 |
282 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { | 312 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
283 batch.reset(ir->recordRect(rect, viewMatrix, paint.getColor(), | 313 batch.reset(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), |
284 paint.isAntiAlias(), fInstancedPipelineInfo, | 314 paint.isAntiAlias(), fInstancedPipelineInfo, |
285 &useHWAA)); | 315 &useHWAA)); |
286 if (batch) { | 316 if (batch) { |
287 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 317 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
288 if (ss) { | 318 if (ss) { |
289 pipelineBuilder.setUserStencil(ss); | 319 pipelineBuilder.setUserStencil(ss); |
290 } | 320 } |
291 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; | 321 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; |
292 return true; | 322 return true; |
293 } | 323 } |
294 } | 324 } |
295 | 325 |
296 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { | 326 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { |
297 // The fill path can handle rotation but not skew. | 327 // The fill path can handle rotation but not skew. |
298 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 328 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
299 SkRect devBoundRect; | 329 SkRect devBoundRect; |
300 viewMatrix.mapRect(&devBoundRect, rect); | 330 viewMatrix.mapRect(&devBoundRect, croppedRect); |
301 | 331 |
302 batch.reset(GrRectBatchFactory::CreateAAFill(paint.getColor(), viewM atrix, | 332 batch.reset(GrRectBatchFactory::CreateAAFill(paint.getColor(), viewM atrix, |
303 rect, devBoundRect)); | 333 croppedRect, devBoundRe ct)); |
304 if (batch) { | 334 if (batch) { |
305 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 335 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
306 if (ss) { | 336 if (ss) { |
307 pipelineBuilder.setUserStencil(ss); | 337 pipelineBuilder.setUserStencil(ss); |
308 } | 338 } |
309 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, ba tch); | 339 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, ba tch); |
310 return true; | 340 return true; |
311 } | 341 } |
312 } | 342 } |
313 } else { | 343 } else { |
314 this->drawNonAAFilledRect(clip, paint, viewMatrix, rect, nullptr, nullpt r, ss); | 344 this->drawNonAAFilledRect(clip, paint, viewMatrix, croppedRect, nullptr, nullptr, ss); |
315 return true; | 345 return true; |
316 } | 346 } |
317 | 347 |
318 return false; | 348 return false; |
319 } | 349 } |
320 | 350 |
321 void GrDrawContext::drawRect(const GrClip& clip, | 351 void GrDrawContext::drawRect(const GrClip& clip, |
322 const GrPaint& paint, | 352 const GrPaint& paint, |
323 const SkMatrix& viewMatrix, | 353 const SkMatrix& viewMatrix, |
324 const SkRect& rect, | 354 const SkRect& rect, |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
515 void GrDrawContext::fillRectToRect(const GrClip& clip, | 545 void GrDrawContext::fillRectToRect(const GrClip& clip, |
516 const GrPaint& paint, | 546 const GrPaint& paint, |
517 const SkMatrix& viewMatrix, | 547 const SkMatrix& viewMatrix, |
518 const SkRect& rectToDraw, | 548 const SkRect& rectToDraw, |
519 const SkRect& localRect) { | 549 const SkRect& localRect) { |
520 ASSERT_SINGLE_OWNER | 550 ASSERT_SINGLE_OWNER |
521 RETURN_IF_ABANDONED | 551 RETURN_IF_ABANDONED |
522 SkDEBUGCODE(this->validate();) | 552 SkDEBUGCODE(this->validate();) |
523 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); | 553 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect"); |
524 | 554 |
555 SkRect croppedRect = rectToDraw; | |
556 CropResult cropResult = crop_fill_rect(fRenderTarget.get(), clip, viewMatrix , &croppedRect); | |
557 if (CropResult::kSkip == cropResult) { | |
558 return; | |
559 } | |
560 SkRect croppedLocalRect = localRect; | |
bsalomon
2016/07/11 13:52:23
What do you think about making this an optional pa
csmartdalton
2016/07/11 16:37:10
Done.
| |
561 if (CropResult::kDidCrop == cropResult) { | |
562 const SkScalar dx = localRect.width() / rectToDraw.width(); | |
563 const SkScalar dy = localRect.height() / rectToDraw.height(); | |
564 croppedLocalRect.fLeft += (croppedRect.fLeft - rectToDraw.fLeft) * dx; | |
565 croppedLocalRect.fTop += (croppedRect.fTop - rectToDraw.fTop) * dy; | |
566 croppedLocalRect.fRight -= (rectToDraw.fRight - croppedRect.fRight) * dx ; | |
567 croppedLocalRect.fBottom -= (rectToDraw.fBottom - croppedRect.fBottom) * dy; | |
568 } | |
569 | |
525 AutoCheckFlush acf(fDrawingManager); | 570 AutoCheckFlush acf(fDrawingManager); |
526 SkAutoTUnref<GrDrawBatch> batch; | 571 SkAutoTUnref<GrDrawBatch> batch; |
527 bool useHWAA; | 572 bool useHWAA; |
528 | 573 |
529 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { | 574 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
530 batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), loc alRect, | 575 batch.reset(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), cr oppedLocalRect, |
531 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); | 576 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); |
532 if (batch) { | 577 if (batch) { |
533 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 578 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
534 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; | 579 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; |
535 return; | 580 return; |
536 } | 581 } |
537 } | 582 } |
538 | 583 |
539 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && | 584 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && |
540 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 585 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
541 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie wMatrix, rectToDraw, | 586 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie wMatrix, |
542 localRect)); | 587 croppedRect, croppedL ocalRect)); |
543 if (batch) { | 588 if (batch) { |
544 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 589 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
545 this->drawBatch(pipelineBuilder, clip, batch); | 590 this->drawBatch(pipelineBuilder, clip, batch); |
546 return; | 591 return; |
547 } | 592 } |
548 } else { | 593 } else { |
549 this->drawNonAAFilledRect(clip, paint, viewMatrix, rectToDraw, &localRec t, | 594 this->drawNonAAFilledRect(clip, paint, viewMatrix, croppedRect, &cropped LocalRect, |
550 nullptr, nullptr); | 595 nullptr, nullptr); |
551 } | 596 } |
552 | 597 |
553 } | 598 } |
554 | 599 |
555 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, | 600 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
556 const GrPaint& paint, | 601 const GrPaint& paint, |
557 const SkMatrix& viewMatrix, | 602 const SkMatrix& viewMatrix, |
558 const SkRect& rectToDraw, | 603 const SkRect& rectToDraw, |
559 const SkMatrix& localMatrix) { | 604 const SkMatrix& localMatrix) { |
560 ASSERT_SINGLE_OWNER | 605 ASSERT_SINGLE_OWNER |
561 RETURN_IF_ABANDONED | 606 RETURN_IF_ABANDONED |
562 SkDEBUGCODE(this->validate();) | 607 SkDEBUGCODE(this->validate();) |
563 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr ix"); | 608 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatr ix"); |
564 | 609 |
610 SkRect croppedRect = rectToDraw; | |
611 if (CropResult::kSkip == crop_fill_rect(fRenderTarget.get(), clip, viewMatri x, &croppedRect)) { | |
612 return; | |
613 } | |
614 | |
565 AutoCheckFlush acf(fDrawingManager); | 615 AutoCheckFlush acf(fDrawingManager); |
566 SkAutoTUnref<GrDrawBatch> batch; | 616 SkAutoTUnref<GrDrawBatch> batch; |
567 bool useHWAA; | 617 bool useHWAA; |
568 | 618 |
569 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { | 619 if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
570 batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), loc alMatrix, | 620 batch.reset(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), lo calMatrix, |
571 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); | 621 paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); |
572 if (batch) { | 622 if (batch) { |
573 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 623 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
574 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; | 624 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch) ; |
575 return; | 625 return; |
576 } | 626 } |
577 } | 627 } |
578 | 628 |
579 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && | 629 if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && |
580 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 630 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
581 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca lMatrix, | 631 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca lMatrix, |
582 rectToDraw)); | 632 croppedRect)); |
583 GrPipelineBuilder pipelineBuilder(paint, useHWAA); | 633 GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
584 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); | 634 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
585 } else { | 635 } else { |
586 this->drawNonAAFilledRect(clip, paint, viewMatrix, rectToDraw, nullptr, | 636 this->drawNonAAFilledRect(clip, paint, viewMatrix, croppedRect, nullptr, |
587 &localMatrix, nullptr); | 637 &localMatrix, nullptr); |
588 } | 638 } |
589 | 639 |
590 } | 640 } |
591 | 641 |
592 void GrDrawContext::drawVertices(const GrClip& clip, | 642 void GrDrawContext::drawVertices(const GrClip& clip, |
593 const GrPaint& paint, | 643 const GrPaint& paint, |
594 const SkMatrix& viewMatrix, | 644 const SkMatrix& viewMatrix, |
595 GrPrimitiveType primitiveType, | 645 GrPrimitiveType primitiveType, |
596 int vertexCount, | 646 int vertexCount, |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1146 | 1196 |
1147 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr Clip& clip, | 1197 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr Clip& clip, |
1148 GrDrawBatch* batch) { | 1198 GrDrawBatch* batch) { |
1149 ASSERT_SINGLE_OWNER | 1199 ASSERT_SINGLE_OWNER |
1150 RETURN_IF_ABANDONED | 1200 RETURN_IF_ABANDONED |
1151 SkDEBUGCODE(this->validate();) | 1201 SkDEBUGCODE(this->validate();) |
1152 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1202 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
1153 | 1203 |
1154 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); | 1204 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
1155 } | 1205 } |
OLD | NEW |