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

Unified Diff: src/gpu/GrAARectRenderer.cpp

Issue 17845003: GPU "fix" for thin stroked rects (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Addressed some code review issues Created 7 years, 6 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrAARectRenderer.cpp
===================================================================
--- src/gpu/GrAARectRenderer.cpp (revision 9770)
+++ src/gpu/GrAARectRenderer.cpp (working copy)
@@ -470,13 +470,9 @@
GrColor innerColor;
if (useVertexCoverage) {
- innerColor = scale | (scale << 8) | (scale << 16) | (scale << 24);
+ innerColor = GrColorPackRGBA(scale, scale, scale, scale);
} else {
- if (0xff == scale) {
- innerColor = target->getDrawState().getColor();
- } else {
- innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale);
- }
+ innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale);
}
verts += 4 * vsize;
@@ -728,10 +724,19 @@
GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 8 * vsize);
GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + 12 * vsize);
+ // TODO: this only really works if the X & Y margins are the same all around
+ // the rect
+ SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRight);
+ inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft);
+ inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop);
+ inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fBottom);
+ SkASSERT(inset >= 0);
+
// outermost
set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
- set_inset_fan(fan1Pos, vsize, devOutside, SK_ScalarHalf, SK_ScalarHalf);
- set_inset_fan(fan2Pos, vsize, devInside, -SK_ScalarHalf, -SK_ScalarHalf);
+ // inner two
+ set_inset_fan(fan1Pos, vsize, devOutside, inset, inset);
+ set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset);
// innermost
set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf);
@@ -741,13 +746,22 @@
*reinterpret_cast<GrColor*>(verts + i * vsize) = 0;
}
+ int scale;
+ if (inset < SK_ScalarHalf) {
+ scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
+ SkASSERT(scale >= 0 && scale <= 255);
+ } else {
+ scale = 0xff;
+ }
+
// The inner two rects have full coverage
GrColor innerColor;
if (useVertexCoverage) {
- innerColor = 0xffffffff;
+ innerColor = GrColorPackRGBA(scale, scale, scale, scale);
} else {
- innerColor = target->getDrawState().getColor();
+ innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale);
}
+
verts += 4 * vsize;
for (int i = 0; i < 8; ++i) {
*reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698