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 "effects/GrRRectEffect.h" | |
27 | |
28 #include "text/GrAtlasTextContext.h" | 26 #include "text/GrAtlasTextContext.h" |
29 #include "text/GrStencilAndCoverTextContext.h" | 27 #include "text/GrStencilAndCoverTextContext.h" |
30 | 28 |
31 #include "../private/GrAuditTrail.h" | 29 #include "../private/GrAuditTrail.h" |
32 | 30 |
33 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) | 31 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) |
34 #define ASSERT_SINGLE_OWNER \ | 32 #define ASSERT_SINGLE_OWNER \ |
35 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);) | 33 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);) |
36 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } | 34 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } |
37 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } | 35 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 SkPath path; | 508 SkPath path; |
511 path.setIsVolatile(true); | 509 path.setIsVolatile(true); |
512 path.addRRect(rrect); | 510 path.addRRect(rrect); |
513 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, | 511 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, |
514 paint.isAntiAlias(), path, strokeInfo); | 512 paint.isAntiAlias(), path, strokeInfo); |
515 } | 513 } |
516 } | 514 } |
517 | 515 |
518 /////////////////////////////////////////////////////////////////////////////// | 516 /////////////////////////////////////////////////////////////////////////////// |
519 | 517 |
520 static bool draw_drrect(GrDrawTarget* drawTarget, | |
521 const GrPipelineBuilder& pipelineBuilder, | |
522 GrColor color, | |
523 const SkMatrix& viewMatrix, | |
524 bool useAA, | |
525 const SkRRect& origOuter, | |
526 const SkRRect& origInner, | |
527 GrShaderCaps* shaderCaps) { | |
528 bool applyAA = useAA && !pipelineBuilder.getRenderTarget()->isUnifiedMultisa
mpled(); | |
529 GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; | |
530 if (!origInner.isEmpty()) { | |
531 SkTCopyOnFirstWrite<SkRRect> inner(origInner); | |
532 if (!viewMatrix.isIdentity()) { | |
533 if (!origInner.transform(viewMatrix, inner.writable())) { | |
534 return false; | |
535 } | |
536 } | |
537 GrPrimitiveEdgeType edgeType = applyAA ? | |
538 kInverseFillAA_GrProcessorEdgeType : | |
539 kInverseFillBW_GrProcessorEdgeType; | |
540 // TODO this needs to be a geometry processor | |
541 GrFragmentProcessor* fp = GrRRectEffect::Create(edgeType, *inner); | |
542 if (nullptr == fp) { | |
543 return false; | |
544 } | |
545 arfps.set(&pipelineBuilder); | |
546 arfps.addCoverageFragmentProcessor(fp)->unref(); | |
547 } | |
548 | |
549 SkStrokeRec fillRec(SkStrokeRec::kFill_InitStyle); | |
550 SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(pipelineBui
lder, color, | |
551 viewMatrix,
useAA, origOuter, | |
552 fillRec, sh
aderCaps)); | |
553 if (batch) { | |
554 drawTarget->drawBatch(pipelineBuilder, batch); | |
555 return true; | |
556 } | |
557 | |
558 SkASSERT(!origOuter.isEmpty()); | |
559 SkTCopyOnFirstWrite<SkRRect> outer(origOuter); | |
560 if (!viewMatrix.isIdentity()) { | |
561 if (!origOuter.transform(viewMatrix, outer.writable())) { | |
562 return false; | |
563 } | |
564 } | |
565 GrPrimitiveEdgeType edgeType = applyAA ? kFillAA_GrProcessorEdgeType : | |
566 kFillBW_GrProcessorEdgeType; | |
567 SkAutoTUnref<GrFragmentProcessor> effect(GrRRectEffect::Create(edgeType, *ou
ter)); | |
568 if (!effect) { | |
569 return false; | |
570 } | |
571 if (!arfps.isSet()) { | |
572 arfps.set(&pipelineBuilder); | |
573 } | |
574 | |
575 SkMatrix invert; | |
576 if (!viewMatrix.invert(&invert)) { | |
577 return false; | |
578 } | |
579 | |
580 arfps.addCoverageFragmentProcessor(effect); | |
581 SkRect bounds = outer->getBounds(); | |
582 if (applyAA) { | |
583 bounds.outset(SK_ScalarHalf, SK_ScalarHalf); | |
584 } | |
585 batch.reset(GrRectBatchFactory::CreateNonAAFill(color, SkMatrix::I(), bounds
, | |
586 nullptr, &invert)); | |
587 drawTarget->drawBatch(pipelineBuilder, batch); | |
588 return true; | |
589 } | |
590 | |
591 void GrDrawContext::drawDRRect(const GrClip& clip, | |
592 const GrPaint& paint, | |
593 const SkMatrix& viewMatrix, | |
594 const SkRRect& outer, | |
595 const SkRRect& inner) { | |
596 ASSERT_SINGLE_OWNER | |
597 RETURN_IF_ABANDONED | |
598 SkDEBUGCODE(this->validate();) | |
599 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawDRRect"); | |
600 | |
601 if (outer.isEmpty()) { | |
602 return; | |
603 } | |
604 | |
605 AutoCheckFlush acf(fDrawingManager); | |
606 | |
607 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | |
608 GrColor color = paint.getColor(); | |
609 | |
610 if (!draw_drrect(this->getDrawTarget(), pipelineBuilder, | |
611 color, viewMatrix, paint.isAntiAlias(), | |
612 outer, inner, fContext->caps()->shaderCaps())) { | |
613 SkPath path; | |
614 path.setIsVolatile(true); | |
615 path.addRRect(inner); | |
616 path.addRRect(outer); | |
617 path.setFillType(SkPath::kEvenOdd_FillType); | |
618 | |
619 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); | |
620 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, | |
621 paint.isAntiAlias(), path, fillRec); | |
622 } | |
623 } | |
624 | |
625 /////////////////////////////////////////////////////////////////////////////// | |
626 | |
627 void GrDrawContext::drawOval(const GrClip& clip, | 518 void GrDrawContext::drawOval(const GrClip& clip, |
628 const GrPaint& paint, | 519 const GrPaint& paint, |
629 const SkMatrix& viewMatrix, | 520 const SkMatrix& viewMatrix, |
630 const SkRect& oval, | 521 const SkRect& oval, |
631 const GrStrokeInfo& strokeInfo) { | 522 const GrStrokeInfo& strokeInfo) { |
632 ASSERT_SINGLE_OWNER | 523 ASSERT_SINGLE_OWNER |
633 RETURN_IF_ABANDONED | 524 RETURN_IF_ABANDONED |
634 SkDEBUGCODE(this->validate();) | 525 SkDEBUGCODE(this->validate();) |
635 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawOval"); | 526 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawOval"); |
636 | 527 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 } | 819 } |
929 | 820 |
930 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 821 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
931 ASSERT_SINGLE_OWNER | 822 ASSERT_SINGLE_OWNER |
932 RETURN_IF_ABANDONED | 823 RETURN_IF_ABANDONED |
933 SkDEBUGCODE(this->validate();) | 824 SkDEBUGCODE(this->validate();) |
934 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 825 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
935 | 826 |
936 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 827 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
937 } | 828 } |
OLD | NEW |