Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 1332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1343 // | | | | | 1343 // | | | | |
| 1344 // | | | | | 1344 // | | | | |
| 1345 // | | | | | 1345 // | | | | |
| 1346 // |_|________|_| | 1346 // |_|________|_| |
| 1347 // |_|________|_| | 1347 // |_|________|_| |
| 1348 // | 1348 // |
| 1349 // For strokes, we don't draw the center quad. | 1349 // For strokes, we don't draw the center quad. |
| 1350 // | 1350 // |
| 1351 // For circular roundrects, in the case where the stroke width is greater than t wice | 1351 // For circular roundrects, in the case where the stroke width is greater than t wice |
| 1352 // the corner radius (overstroke), we add additional geometry to mark out the re ctangle | 1352 // the corner radius (overstroke), we add additional geometry to mark out the re ctangle |
| 1353 // in the center: | 1353 // in the center. The shared vertices are duplicated so we can set a different o uter radius |
| 1354 // for the fill calculation. | |
| 1354 // ____________ | 1355 // ____________ |
| 1355 // |_|________|_| | 1356 // |_|________|_| |
| 1356 // | |\ ____ /| | | 1357 // | |\ ____ /| | |
| 1357 // | | | | | | | 1358 // | | | | | | |
| 1358 // | | |____| | | | 1359 // | | |____| | | |
| 1359 // |_|/______\|_| | 1360 // |_|/______\|_| |
| 1360 // |_|________|_| | 1361 // |_|________|_| |
| 1361 // | 1362 // |
| 1362 // We don't draw the center quad from the fill rect in this case. | 1363 // We don't draw the center quad from the fill rect in this case. |
| 1363 | 1364 |
| 1364 static const uint16_t gRRectOverstrokeIndices[] = { | 1365 static const uint16_t gRRectOverstrokeIndices[] = { |
| 1365 // overstroke quads | 1366 // overstroke quads |
| 1366 // we place this at the beginning so that we can skip these indices when ren dering normally | 1367 // we place this at the beginning so that we can skip these indices when ren dering normally |
| 1367 5, 6, 17, 5, 17, 16, | 1368 16, 17, 19, 16, 19, 18, |
| 1368 17, 6, 10, 17, 10, 19, | 1369 19, 17, 23, 19, 23, 21, |
| 1369 10, 9, 18, 10, 18, 19, | 1370 21, 23, 22, 21, 22, 20, |
| 1370 18, 9, 5, 18, 5, 16, | 1371 22, 16, 18, 22, 18, 20, |
| 1371 | 1372 |
| 1372 // corners | 1373 // corners |
| 1373 0, 1, 5, 0, 5, 4, | 1374 0, 1, 5, 0, 5, 4, |
| 1374 2, 3, 7, 2, 7, 6, | 1375 2, 3, 7, 2, 7, 6, |
| 1375 8, 9, 13, 8, 13, 12, | 1376 8, 9, 13, 8, 13, 12, |
| 1376 10, 11, 15, 10, 15, 14, | 1377 10, 11, 15, 10, 15, 14, |
| 1377 | 1378 |
| 1378 // edges | 1379 // edges |
| 1379 1, 2, 6, 1, 6, 5, | 1380 1, 2, 6, 1, 6, 5, |
| 1380 4, 5, 9, 4, 9, 8, | 1381 4, 5, 9, 4, 9, 8, |
| 1381 6, 7, 11, 6, 11, 10, | 1382 6, 7, 11, 6, 11, 10, |
| 1382 9, 10, 14, 9, 14, 13, | 1383 9, 10, 14, 9, 14, 13, |
| 1383 | 1384 |
| 1384 // center | 1385 // center |
| 1385 // we place this at the end so that we can ignore these indices when not ren dering as filled | 1386 // we place this at the end so that we can ignore these indices when not ren dering as filled |
| 1386 5, 6, 10, 5, 10, 9, | 1387 5, 6, 10, 5, 10, 9, |
| 1387 }; | 1388 }; |
| 1388 | 1389 |
| 1389 static const uint16_t* gRRectIndices = gRRectOverstrokeIndices + 6*4; | 1390 static const uint16_t* gRRectIndices = gRRectOverstrokeIndices + 6*4; |
| 1390 | 1391 |
| 1391 // overstroke count is arraysize | 1392 // overstroke count is arraysize |
| 1392 static const int kIndicesPerOverstrokeRRect = SK_ARRAY_COUNT(gRRectOverstrokeInd ices) - 6; | 1393 static const int kIndicesPerOverstrokeRRect = SK_ARRAY_COUNT(gRRectOverstrokeInd ices) - 6; |
| 1393 static const int kIndicesPerFillRRect = kIndicesPerOverstrokeRRect - 6*4 + 6; | 1394 static const int kIndicesPerFillRRect = kIndicesPerOverstrokeRRect - 6*4 + 6; |
| 1394 static const int kIndicesPerStrokeRRect = kIndicesPerFillRRect - 6; | 1395 static const int kIndicesPerStrokeRRect = kIndicesPerFillRRect - 6; |
| 1395 static const int kVertsPerStandardRRect = 16; | 1396 static const int kVertsPerStandardRRect = 16; |
| 1396 static const int kVertsPerOverstrokeRRect = 20; | 1397 static const int kVertsPerOverstrokeRRect = 24; |
| 1397 static const int kNumRRectsInIndexBuffer = 256; | 1398 static const int kNumRRectsInIndexBuffer = 256; |
| 1398 | 1399 |
| 1399 enum RRectType { | 1400 enum RRectType { |
| 1400 kFill_RRectType, | 1401 kFill_RRectType, |
| 1401 kStroke_RRectType, | 1402 kStroke_RRectType, |
| 1402 kOverstroke_RRectType | 1403 kOverstroke_RRectType |
| 1403 }; | 1404 }; |
| 1404 | 1405 |
| 1405 GR_DECLARE_STATIC_UNIQUE_KEY(gStrokeRRectOnlyIndexBufferKey); | 1406 GR_DECLARE_STATIC_UNIQUE_KEY(gStrokeRRectOnlyIndexBufferKey); |
| 1406 GR_DECLARE_STATIC_UNIQUE_KEY(gRRectOnlyIndexBufferKey); | 1407 GR_DECLARE_STATIC_UNIQUE_KEY(gRRectOnlyIndexBufferKey); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1604 verts++; | 1605 verts++; |
| 1605 | 1606 |
| 1606 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); | 1607 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); |
| 1607 verts->fColor = color; | 1608 verts->fColor = color; |
| 1608 verts->fOffset = SkPoint::Make(1, yOuterRadii[i]); | 1609 verts->fOffset = SkPoint::Make(1, yOuterRadii[i]); |
| 1609 verts->fOuterRadius = outerRadius; | 1610 verts->fOuterRadius = outerRadius; |
| 1610 verts->fInnerRadius = innerRadius; | 1611 verts->fInnerRadius = innerRadius; |
| 1611 verts++; | 1612 verts++; |
| 1612 } | 1613 } |
| 1613 // Add the additional vertices for overstroked rrects. | 1614 // Add the additional vertices for overstroked rrects. |
| 1615 // Effectively this is an additional rrect, drawn inside out, | |
| 1616 // with outerRadius == -innerRadius. This will give us correct AA in the center. | |
| 1614 // | 1617 // |
| 1615 // Note that args.fInnerRadius is negative in this case. | 1618 // Note that args.fInnerRadius is negative in this case. |
| 1616 // Also, the offset is a constant vector pointing to the right, whic h guarantees | 1619 // Also, the offset is a constant vector pointing to the right, whic h guarantees |
| 1617 // that the distance value along the inner rectangle is constant, wh ich | 1620 // that the distance value along the inner rectangle is constant, wh ich |
| 1618 // is what we want to get nice anti-aliasing. | 1621 // is what we want to get nice anti-aliasing. |
| 1619 if (kOverstroke_RRectType == fType) { | 1622 if (kOverstroke_RRectType == fType) { |
| 1620 // outerRadius = originalOuter + 0.5, and innerRadius = original Inner - 0.5. | 1623 verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[ 1]); |
| 1621 // What we want is originalOuter - originalInner + 0.5, so we su btract 0.5. | 1624 verts->fColor = color; |
| 1622 SkScalar inset = outerRadius - args.fInnerRadius - SK_ScalarHalf ; | 1625 verts->fOffset = SkPoint::Make(0, 0); |
| 1626 verts->fOuterRadius = -args.fInnerRadius; | |
| 1627 verts->fInnerRadius = innerRadius; | |
| 1628 verts++; | |
| 1629 | |
| 1630 verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords [1]); | |
| 1631 verts->fColor = color; | |
| 1632 verts->fOffset = SkPoint::Make(0, 0); | |
| 1633 verts->fOuterRadius = -args.fInnerRadius; | |
| 1634 verts->fInnerRadius = innerRadius; | |
| 1635 verts++; | |
| 1636 | |
| 1637 SkScalar inset = outerRadius - args.fInnerRadius; | |
| 1623 verts->fPos = SkPoint::Make(bounds.fLeft + inset, | 1638 verts->fPos = SkPoint::Make(bounds.fLeft + inset, |
| 1624 bounds.fTop + inset); | 1639 bounds.fTop + inset); |
| 1625 verts->fColor = color; | 1640 verts->fColor = color; |
| 1626 verts->fOffset = SkPoint::Make(1, 0); | 1641 verts->fOffset = SkPoint::Make(1, 0); |
| 1627 verts->fOuterRadius = outerRadius; | 1642 verts->fOuterRadius = -args.fInnerRadius; |
|
egdaniel
2016/08/25 20:24:27
does this need to be normalized? If so just use -i
jvanverth1
2016/08/26 14:35:20
No, the math is a little weird. We pass in normali
| |
| 1628 verts->fInnerRadius = innerRadius; | 1643 verts->fInnerRadius = innerRadius; |
| 1629 verts++; | 1644 verts++; |
| 1630 | 1645 |
| 1631 verts->fPos = SkPoint::Make(bounds.fRight - inset, | 1646 verts->fPos = SkPoint::Make(bounds.fRight - inset, |
| 1632 bounds.fTop + inset); | 1647 bounds.fTop + inset); |
| 1633 verts->fColor = color; | 1648 verts->fColor = color; |
| 1634 verts->fOffset = SkPoint::Make(1, 0); | 1649 verts->fOffset = SkPoint::Make(1, 0); |
| 1635 verts->fOuterRadius = outerRadius; | 1650 verts->fOuterRadius = -args.fInnerRadius; |
| 1636 verts->fInnerRadius = innerRadius; | 1651 verts->fInnerRadius = innerRadius; |
| 1637 verts++; | 1652 verts++; |
| 1638 | 1653 |
| 1639 verts->fPos = SkPoint::Make(bounds.fLeft + inset, | 1654 verts->fPos = SkPoint::Make(bounds.fLeft + inset, |
| 1640 bounds.fBottom - inset); | 1655 bounds.fBottom - inset); |
| 1641 verts->fColor = color; | 1656 verts->fColor = color; |
| 1642 verts->fOffset = SkPoint::Make(1, 0); | 1657 verts->fOffset = SkPoint::Make(1, 0); |
| 1643 verts->fOuterRadius = outerRadius; | 1658 verts->fOuterRadius = -args.fInnerRadius; |
| 1644 verts->fInnerRadius = innerRadius; | 1659 verts->fInnerRadius = innerRadius; |
| 1645 verts++; | 1660 verts++; |
| 1646 | 1661 |
| 1647 verts->fPos = SkPoint::Make(bounds.fRight - inset, | 1662 verts->fPos = SkPoint::Make(bounds.fRight - inset, |
| 1648 bounds.fBottom - inset); | 1663 bounds.fBottom - inset); |
| 1649 verts->fColor = color; | 1664 verts->fColor = color; |
| 1650 verts->fOffset = SkPoint::Make(1, 0); | 1665 verts->fOffset = SkPoint::Make(1, 0); |
| 1651 verts->fOuterRadius = outerRadius; | 1666 verts->fOuterRadius = -args.fInnerRadius; |
| 1667 verts->fInnerRadius = innerRadius; | |
| 1668 verts++; | |
| 1669 | |
| 1670 verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[ 2]); | |
| 1671 verts->fColor = color; | |
| 1672 verts->fOffset = SkPoint::Make(0, 0); | |
| 1673 verts->fOuterRadius = -args.fInnerRadius; | |
| 1674 verts->fInnerRadius = innerRadius; | |
| 1675 verts++; | |
| 1676 | |
| 1677 verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords [2]); | |
| 1678 verts->fColor = color; | |
| 1679 verts->fOffset = SkPoint::Make(0, 0); | |
| 1680 verts->fOuterRadius = -args.fInnerRadius; | |
| 1652 verts->fInnerRadius = innerRadius; | 1681 verts->fInnerRadius = innerRadius; |
| 1653 verts++; | 1682 verts++; |
| 1654 } | 1683 } |
| 1655 } | 1684 } |
| 1656 | 1685 |
| 1657 helper.recordDraw(target, gp); | 1686 helper.recordDraw(target, gp); |
| 1658 } | 1687 } |
| 1659 | 1688 |
| 1660 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1689 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1661 RRectCircleRendererBatch* that = t->cast<RRectCircleRendererBatch>(); | 1690 RRectCircleRendererBatch* that = t->cast<RRectCircleRendererBatch>(); |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2090 } | 2119 } |
| 2091 | 2120 |
| 2092 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2121 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
| 2093 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2122 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
| 2094 GrColor color = GrRandomColor(random); | 2123 GrColor color = GrRandomColor(random); |
| 2095 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2124 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
| 2096 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra ndom)); | 2125 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra ndom)); |
| 2097 } | 2126 } |
| 2098 | 2127 |
| 2099 #endif | 2128 #endif |
| OLD | NEW |