OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "GrAAHairLinePathRenderer.h" | 8 #include "GrAAHairLinePathRenderer.h" |
9 | 9 |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 SkScalarMul(normA.fY, normB.fX); | 465 SkScalarMul(normA.fY, normB.fX); |
466 wInv = SkScalarInvert(wInv); | 466 wInv = SkScalarInvert(wInv); |
467 | 467 |
468 result->fX = SkScalarMul(normA.fY, lineBW) - SkScalarMul(lineAW, normB.fY); | 468 result->fX = SkScalarMul(normA.fY, lineBW) - SkScalarMul(lineAW, normB.fY); |
469 result->fX = SkScalarMul(result->fX, wInv); | 469 result->fX = SkScalarMul(result->fX, wInv); |
470 | 470 |
471 result->fY = SkScalarMul(lineAW, normB.fX) - SkScalarMul(normA.fX, lineBW); | 471 result->fY = SkScalarMul(lineAW, normB.fX) - SkScalarMul(normA.fX, lineBW); |
472 result->fY = SkScalarMul(result->fY, wInv); | 472 result->fY = SkScalarMul(result->fY, wInv); |
473 } | 473 } |
474 | 474 |
| 475 void set_uv_quad(const SkPoint qpts[3], Vertex verts[kVertsPerQuad]) { |
| 476 // this should be in the src space, not dev coords, when we have perspective |
| 477 GrPathUtils::QuadUVMatrix DevToUV(qpts); |
| 478 DevToUV.apply<kVertsPerQuad, sizeof(Vertex), sizeof(GrPoint)>(verts); |
| 479 } |
| 480 |
475 void bloat_quad(const SkPoint qpts[3], const SkMatrix* toDevice, | 481 void bloat_quad(const SkPoint qpts[3], const SkMatrix* toDevice, |
476 const SkMatrix* toSrc, Vertex verts[kVertsPerQuad], | 482 const SkMatrix* toSrc, Vertex verts[kVertsPerQuad], |
477 SkRect* devBounds) { | 483 SkRect* devBounds) { |
478 GrAssert(!toDevice == !toSrc); | 484 GrAssert(!toDevice == !toSrc); |
479 // original quad is specified by tri a,b,c | 485 // original quad is specified by tri a,b,c |
480 SkPoint a = qpts[0]; | 486 SkPoint a = qpts[0]; |
481 SkPoint b = qpts[1]; | 487 SkPoint b = qpts[1]; |
482 SkPoint c = qpts[2]; | 488 SkPoint c = qpts[2]; |
483 | 489 |
484 // this should be in the src space, not dev coords, when we have perspective | |
485 GrPathUtils::QuadUVMatrix DevToUV(qpts); | |
486 | |
487 if (toDevice) { | 490 if (toDevice) { |
488 toDevice->mapPoints(&a, 1); | 491 toDevice->mapPoints(&a, 1); |
489 toDevice->mapPoints(&b, 1); | 492 toDevice->mapPoints(&b, 1); |
490 toDevice->mapPoints(&c, 1); | 493 toDevice->mapPoints(&c, 1); |
491 } | 494 } |
492 // make a new poly where we replace a and c by a 1-pixel wide edges orthog | 495 // make a new poly where we replace a and c by a 1-pixel wide edges orthog |
493 // to edges ab and bc: | 496 // to edges ab and bc: |
494 // | 497 // |
495 // before | after | 498 // before | after |
496 // | b0 | 499 // | b0 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 c1.fPos -= cbN; | 545 c1.fPos -= cbN; |
543 | 546 |
544 // This point may not be within 1 pixel of a control point. We update the bo
unding box to | 547 // This point may not be within 1 pixel of a control point. We update the bo
unding box to |
545 // include it. | 548 // include it. |
546 intersect_lines(a0.fPos, abN, c0.fPos, cbN, &b0.fPos); | 549 intersect_lines(a0.fPos, abN, c0.fPos, cbN, &b0.fPos); |
547 devBounds->growToInclude(b0.fPos.fX, b0.fPos.fY); | 550 devBounds->growToInclude(b0.fPos.fX, b0.fPos.fY); |
548 | 551 |
549 if (toSrc) { | 552 if (toSrc) { |
550 toSrc->mapPointsWithStride(&verts[0].fPos, sizeof(Vertex), kVertsPerQuad
); | 553 toSrc->mapPointsWithStride(&verts[0].fPos, sizeof(Vertex), kVertsPerQuad
); |
551 } | 554 } |
552 DevToUV.apply<kVertsPerQuad, sizeof(Vertex), sizeof(GrPoint)>(verts); | |
553 } | 555 } |
554 | 556 |
555 // Input: | 557 // Input: |
556 // Three control points: p[0], p[1], p[2] and weight: w | 558 // Three control points: p[0], p[1], p[2] and weight: w |
557 // Output: | 559 // Output: |
558 // Let: | 560 // Let: |
559 // l = (2*w * (y1 - y0), 2*w * (x0 - x1), 2*w * (x1*y0 - x0*y1)) | 561 // l = (2*w * (y1 - y0), 2*w * (x0 - x1), 2*w * (x1*y0 - x0*y1)) |
560 // m = (2*w * (y2 - y1), 2*w * (x1 - x2), 2*w * (x2*y1 - x1*y2)) | 562 // m = (2*w * (y2 - y1), 2*w * (x1 - x2), 2*w * (x2*y1 - x1*y2)) |
561 // k = (y2 - y0, x0 - x2, (x2 - x0)*y0 - (y2 - y0)*x0 ) | 563 // k = (y2 - y0, x0 - x2, (x2 - x0)*y0 - (y2 - y0)*x0 ) |
562 void calc_conic_klm(const SkPoint p[3], const SkScalar weight, | 564 void calc_conic_klm(const SkPoint p[3], const SkScalar weight, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 Vertex** vert, | 636 Vertex** vert, |
635 SkRect* devBounds) { | 637 SkRect* devBounds) { |
636 GrAssert(subdiv >= 0); | 638 GrAssert(subdiv >= 0); |
637 if (subdiv) { | 639 if (subdiv) { |
638 SkPoint newP[5]; | 640 SkPoint newP[5]; |
639 SkChopQuadAtHalf(p, newP); | 641 SkChopQuadAtHalf(p, newP); |
640 add_quads(newP + 0, subdiv-1, toDevice, toSrc, vert, devBounds); | 642 add_quads(newP + 0, subdiv-1, toDevice, toSrc, vert, devBounds); |
641 add_quads(newP + 2, subdiv-1, toDevice, toSrc, vert, devBounds); | 643 add_quads(newP + 2, subdiv-1, toDevice, toSrc, vert, devBounds); |
642 } else { | 644 } else { |
643 bloat_quad(p, toDevice, toSrc, *vert, devBounds); | 645 bloat_quad(p, toDevice, toSrc, *vert, devBounds); |
| 646 set_uv_quad(p, *vert); |
644 *vert += kVertsPerQuad; | 647 *vert += kVertsPerQuad; |
645 } | 648 } |
646 } | 649 } |
647 | 650 |
648 void add_line(const SkPoint p[2], | 651 void add_line(const SkPoint p[2], |
649 int rtHeight, | 652 int rtHeight, |
650 const SkMatrix* toSrc, | 653 const SkMatrix* toSrc, |
651 Vertex** vert) { | 654 Vertex** vert) { |
652 const SkPoint& a = p[0]; | 655 const SkPoint& a = p[0]; |
653 const SkPoint& b = p[1]; | 656 const SkPoint& b = p[1]; |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 kVertsPerQuad*n, // vCount | 1238 kVertsPerQuad*n, // vCount |
1236 kIdxsPerQuad*n, // iCount | 1239 kIdxsPerQuad*n, // iCount |
1237 &devBounds); | 1240 &devBounds); |
1238 conics += n; | 1241 conics += n; |
1239 } | 1242 } |
1240 } | 1243 } |
1241 target->resetIndexSource(); | 1244 target->resetIndexSource(); |
1242 | 1245 |
1243 return true; | 1246 return true; |
1244 } | 1247 } |
OLD | NEW |