Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: src/gpu/GrOvalRenderer.cpp

Issue 38573007: Do not apply hairline optimization for paths if nv_path_rendering is used (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: address problems Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrOvalRenderer.h ('k') | src/gpu/GrPathRenderer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 "GrOvalRenderer.h" 8 #include "GrOvalRenderer.h"
9 9
10 #include "GrEffect.h" 10 #include "GrEffect.h"
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 453
454 /////////////////////////////////////////////////////////////////////////////// 454 ///////////////////////////////////////////////////////////////////////////////
455 455
456 void GrOvalRenderer::reset() { 456 void GrOvalRenderer::reset() {
457 SkSafeSetNull(fRRectIndexBuffer); 457 SkSafeSetNull(fRRectIndexBuffer);
458 } 458 }
459 459
460 bool GrOvalRenderer::drawOval(GrDrawTarget* target, const GrContext* context, bo ol useAA, 460 bool GrOvalRenderer::drawOval(GrDrawTarget* target, const GrContext* context, bo ol useAA,
461 const SkRect& oval, const SkStrokeRec& stroke) 461 const SkRect& oval, const SkStrokeRec& stroke)
462 { 462 {
463 if (!useAA) { 463 bool useCoverageAA = useAA &&
464 !target->getDrawState().getRenderTarget()->isMultisampled() &&
465 !target->shouldDisableCoverageAAForBlend();
466
467 if (!useCoverageAA) {
464 return false; 468 return false;
465 } 469 }
466 470
467 const SkMatrix& vm = context->getMatrix(); 471 const SkMatrix& vm = context->getMatrix();
468 472
469 // we can draw circles 473 // we can draw circles
470 if (SkScalarNearlyEqual(oval.width(), oval.height()) 474 if (SkScalarNearlyEqual(oval.width(), oval.height())
471 && circle_stays_circle(vm)) { 475 && circle_stays_circle(vm)) {
472 this->drawCircle(target, useAA, oval, stroke); 476 this->drawCircle(target, useCoverageAA, oval, stroke);
473 // if we have shader derivative support, render as device-independent 477 // if we have shader derivative support, render as device-independent
474 } else if (target->caps()->shaderDerivativeSupport()) { 478 } else if (target->caps()->shaderDerivativeSupport()) {
475 return this->drawDIEllipse(target, useAA, oval, stroke); 479 return this->drawDIEllipse(target, useCoverageAA, oval, stroke);
476 // otherwise axis-aligned ellipses only 480 // otherwise axis-aligned ellipses only
477 } else if (vm.rectStaysRect()) { 481 } else if (vm.rectStaysRect()) {
478 return this->drawEllipse(target, useAA, oval, stroke); 482 return this->drawEllipse(target, useCoverageAA, oval, stroke);
479 } else { 483 } else {
480 return false; 484 return false;
481 } 485 }
482 486
483 return true; 487 return true;
484 } 488 }
485 489
486 /////////////////////////////////////////////////////////////////////////////// 490 ///////////////////////////////////////////////////////////////////////////////
487 491
488 // position + edge 492 // position + edge
489 extern const GrVertexAttrib gCircleVertexAttribs[] = { 493 extern const GrVertexAttrib gCircleVertexAttribs[] = {
490 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, 494 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding },
491 {kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding} 495 {kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding}
492 }; 496 };
493 497
494 void GrOvalRenderer::drawCircle(GrDrawTarget* target, 498 void GrOvalRenderer::drawCircle(GrDrawTarget* target,
495 bool useAA, 499 bool useCoverageAA,
496 const SkRect& circle, 500 const SkRect& circle,
497 const SkStrokeRec& stroke) 501 const SkStrokeRec& stroke)
498 { 502 {
499 GrDrawState* drawState = target->drawState(); 503 GrDrawState* drawState = target->drawState();
500 504
501 const SkMatrix& vm = drawState->getViewMatrix(); 505 const SkMatrix& vm = drawState->getViewMatrix();
502 GrPoint center = GrPoint::Make(circle.centerX(), circle.centerY()); 506 GrPoint center = GrPoint::Make(circle.centerX(), circle.centerY());
503 vm.mapPoints(&center, 1); 507 vm.mapPoints(&center, 1);
504 SkScalar radius = vm.mapRadius(SkScalarHalf(circle.width())); 508 SkScalar radius = vm.mapRadius(SkScalarHalf(circle.width()));
505 SkScalar strokeWidth = vm.mapRadius(stroke.getWidth()); 509 SkScalar strokeWidth = vm.mapRadius(stroke.getWidth());
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 }; 594 };
591 595
592 // position + offsets 596 // position + offsets
593 extern const GrVertexAttrib gDIEllipseVertexAttribs[] = { 597 extern const GrVertexAttrib gDIEllipseVertexAttribs[] = {
594 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi ng}, 598 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi ng},
595 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding }, 599 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding },
596 {kVec2f_GrVertexAttribType, 2*sizeof(GrPoint), kEffect_GrVertexAttribBinding }, 600 {kVec2f_GrVertexAttribType, 2*sizeof(GrPoint), kEffect_GrVertexAttribBinding },
597 }; 601 };
598 602
599 bool GrOvalRenderer::drawEllipse(GrDrawTarget* target, 603 bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
600 bool useAA, 604 bool useCoverageAA,
601 const SkRect& ellipse, 605 const SkRect& ellipse,
602 const SkStrokeRec& stroke) 606 const SkStrokeRec& stroke)
603 { 607 {
604 GrDrawState* drawState = target->drawState(); 608 GrDrawState* drawState = target->drawState();
605 #ifdef SK_DEBUG 609 #ifdef SK_DEBUG
606 { 610 {
607 // we should have checked for this previously 611 // we should have checked for this previously
608 bool isAxisAlignedEllipse = drawState->getViewMatrix().rectStaysRect(); 612 bool isAxisAlignedEllipse = drawState->getViewMatrix().rectStaysRect();
609 SkASSERT(useAA && isAxisAlignedEllipse); 613 SkASSERT(useCoverageAA && isAxisAlignedEllipse);
610 } 614 }
611 #endif 615 #endif
612 616
613 // do any matrix crunching before we reset the draw state for device coords 617 // do any matrix crunching before we reset the draw state for device coords
614 const SkMatrix& vm = drawState->getViewMatrix(); 618 const SkMatrix& vm = drawState->getViewMatrix();
615 GrPoint center = GrPoint::Make(ellipse.centerX(), ellipse.centerY()); 619 GrPoint center = GrPoint::Make(ellipse.centerX(), ellipse.centerY());
616 vm.mapPoints(&center, 1); 620 vm.mapPoints(&center, 1);
617 SkScalar ellipseXRadius = SkScalarHalf(ellipse.width()); 621 SkScalar ellipseXRadius = SkScalarHalf(ellipse.width());
618 SkScalar ellipseYRadius = SkScalarHalf(ellipse.height()); 622 SkScalar ellipseYRadius = SkScalarHalf(ellipse.height());
619 SkScalar xRadius = SkScalarAbs(vm[SkMatrix::kMScaleX]*ellipseXRadius + 623 SkScalar xRadius = SkScalarAbs(vm[SkMatrix::kMScaleX]*ellipseXRadius +
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 verts[3].fOffset = SkPoint::Make(xRadius, yRadius); 726 verts[3].fOffset = SkPoint::Make(xRadius, yRadius);
723 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); 727 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
724 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip); 728 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
725 729
726 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds); 730 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds);
727 731
728 return true; 732 return true;
729 } 733 }
730 734
731 bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target, 735 bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
732 bool useAA, 736 bool useCoverageAA,
733 const SkRect& ellipse, 737 const SkRect& ellipse,
734 const SkStrokeRec& stroke) 738 const SkStrokeRec& stroke)
735 { 739 {
736 GrDrawState* drawState = target->drawState(); 740 GrDrawState* drawState = target->drawState();
737 const SkMatrix& vm = drawState->getViewMatrix(); 741 const SkMatrix& vm = drawState->getViewMatrix();
738 742
739 GrPoint center = GrPoint::Make(ellipse.centerX(), ellipse.centerY()); 743 GrPoint center = GrPoint::Make(ellipse.centerX(), ellipse.centerY());
740 SkScalar xRadius = SkScalarHalf(ellipse.width()); 744 SkScalar xRadius = SkScalarHalf(ellipse.width());
741 SkScalar yRadius = SkScalarHalf(ellipse.height()); 745 SkScalar yRadius = SkScalarHalf(ellipse.height());
742 746
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 sizeof(gRRectIndices)); 879 sizeof(gRRectIndices));
876 GR_DEBUGASSERT(updated); 880 GR_DEBUGASSERT(updated);
877 } 881 }
878 } 882 }
879 return fRRectIndexBuffer; 883 return fRRectIndexBuffer;
880 } 884 }
881 885
882 bool GrOvalRenderer::drawSimpleRRect(GrDrawTarget* target, GrContext* context, b ool useAA, 886 bool GrOvalRenderer::drawSimpleRRect(GrDrawTarget* target, GrContext* context, b ool useAA,
883 const SkRRect& rrect, const SkStrokeRec& st roke) 887 const SkRRect& rrect, const SkStrokeRec& st roke)
884 { 888 {
889 bool useCoverageAA = useAA &&
890 !target->getDrawState().getRenderTarget()->isMultisampled() &&
891 !target->shouldDisableCoverageAAForBlend();
892
885 // only anti-aliased rrects for now 893 // only anti-aliased rrects for now
886 if (!useAA) { 894 if (!useCoverageAA) {
887 return false; 895 return false;
888 } 896 }
889 897
890 const SkMatrix& vm = context->getMatrix(); 898 const SkMatrix& vm = context->getMatrix();
891 #ifdef SK_DEBUG 899 #ifdef SK_DEBUG
892 { 900 {
893 // we should have checked for this previously 901 // we should have checked for this previously
894 SkASSERT(useAA && vm.rectStaysRect() && rrect.isSimple()); 902 SkASSERT(useCoverageAA && vm.rectStaysRect() && rrect.isSimple());
895 } 903 }
896 #endif 904 #endif
897 905
898 // do any matrix crunching before we reset the draw state for device coords 906 // do any matrix crunching before we reset the draw state for device coords
899 const SkRect& rrectBounds = rrect.getBounds(); 907 const SkRect& rrectBounds = rrect.getBounds();
900 SkRect bounds; 908 SkRect bounds;
901 vm.mapRect(&bounds, rrectBounds); 909 vm.mapRect(&bounds, rrectBounds);
902 910
903 SkVector radii = rrect.getSimpleRadii(); 911 SkVector radii = rrect.getSimpleRadii();
904 SkScalar xRadius = SkScalarAbs(vm[SkMatrix::kMScaleX]*radii.fX + 912 SkScalar xRadius = SkScalarAbs(vm[SkMatrix::kMScaleX]*radii.fX +
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 } 1140 }
1133 1141
1134 // drop out the middle quad if we're stroked 1142 // drop out the middle quad if we're stroked
1135 int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO UNT(gRRectIndices); 1143 int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO UNT(gRRectIndices);
1136 target->setIndexSourceToBuffer(indexBuffer); 1144 target->setIndexSourceToBuffer(indexBuffer);
1137 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds); 1145 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds);
1138 } 1146 }
1139 1147
1140 return true; 1148 return true;
1141 } 1149 }
OLDNEW
« no previous file with comments | « src/gpu/GrOvalRenderer.h ('k') | src/gpu/GrPathRenderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698