Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrAARectRenderer.h" | 8 #include "GrAARectRenderer.h" |
| 9 #include "GrGpu.h" | 9 #include "GrGpu.h" |
| 10 #include "gl/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 282 static void set_inset_fan(GrPoint* pts, size_t stride, | 282 static void set_inset_fan(GrPoint* pts, size_t stride, |
| 283 const SkRect& r, SkScalar dx, SkScalar dy) { | 283 const SkRect& r, SkScalar dx, SkScalar dy) { |
| 284 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 284 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
| 285 r.fRight - dx, r.fBottom - dy, stride); | 285 r.fRight - dx, r.fBottom - dy, stride); |
| 286 } | 286 } |
| 287 | 287 |
| 288 }; | 288 }; |
| 289 | 289 |
| 290 void GrAARectRenderer::reset() { | 290 void GrAARectRenderer::reset() { |
| 291 SkSafeSetNull(fAAFillRectIndexBuffer); | 291 SkSafeSetNull(fAAFillRectIndexBuffer); |
| 292 SkSafeSetNull(fAAStrokeRectIndexBuffer); | 292 SkSafeSetNull(fAAMiterStrokeRectIndexBuffer); |
| 293 SkSafeSetNull(fAABevelStrokeRectIndexBuffer); | |
| 293 } | 294 } |
| 294 | 295 |
| 295 static const uint16_t gFillAARectIdx[] = { | 296 static const uint16_t gFillAARectIdx[] = { |
| 296 0, 1, 5, 5, 4, 0, | 297 0, 1, 5, 5, 4, 0, |
| 297 1, 2, 6, 6, 5, 1, | 298 1, 2, 6, 6, 5, 1, |
| 298 2, 3, 7, 7, 6, 2, | 299 2, 3, 7, 7, 6, 2, |
| 299 3, 0, 4, 4, 7, 3, | 300 3, 0, 4, 4, 7, 3, |
| 300 4, 5, 6, 6, 7, 4, | 301 4, 5, 6, 6, 7, 4, |
| 301 }; | 302 }; |
| 302 | 303 |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 333 SkDELETE_ARRAY(data); | 334 SkDELETE_ARRAY(data); |
| 334 } else { | 335 } else { |
| 335 fAAFillRectIndexBuffer->unlock(); | 336 fAAFillRectIndexBuffer->unlock(); |
| 336 } | 337 } |
| 337 } | 338 } |
| 338 } | 339 } |
| 339 | 340 |
| 340 return fAAFillRectIndexBuffer; | 341 return fAAFillRectIndexBuffer; |
| 341 } | 342 } |
| 342 | 343 |
| 343 static const uint16_t gStrokeAARectIdx[] = { | 344 static const uint16_t gMiterStrokeAARectIdx[] = { |
| 344 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0, | 345 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0, |
| 345 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0, | 346 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0, |
| 346 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0, | 347 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0, |
| 347 3 + 0, 0 + 0, 4 + 0, 4 + 0, 7 + 0, 3 + 0, | 348 3 + 0, 0 + 0, 4 + 0, 4 + 0, 7 + 0, 3 + 0, |
| 348 | 349 |
| 349 0 + 4, 1 + 4, 5 + 4, 5 + 4, 4 + 4, 0 + 4, | 350 0 + 4, 1 + 4, 5 + 4, 5 + 4, 4 + 4, 0 + 4, |
| 350 1 + 4, 2 + 4, 6 + 4, 6 + 4, 5 + 4, 1 + 4, | 351 1 + 4, 2 + 4, 6 + 4, 6 + 4, 5 + 4, 1 + 4, |
| 351 2 + 4, 3 + 4, 7 + 4, 7 + 4, 6 + 4, 2 + 4, | 352 2 + 4, 3 + 4, 7 + 4, 7 + 4, 6 + 4, 2 + 4, |
| 352 3 + 4, 0 + 4, 4 + 4, 4 + 4, 7 + 4, 3 + 4, | 353 3 + 4, 0 + 4, 4 + 4, 4 + 4, 7 + 4, 3 + 4, |
| 353 | 354 |
| 354 0 + 8, 1 + 8, 5 + 8, 5 + 8, 4 + 8, 0 + 8, | 355 0 + 8, 1 + 8, 5 + 8, 5 + 8, 4 + 8, 0 + 8, |
| 355 1 + 8, 2 + 8, 6 + 8, 6 + 8, 5 + 8, 1 + 8, | 356 1 + 8, 2 + 8, 6 + 8, 6 + 8, 5 + 8, 1 + 8, |
| 356 2 + 8, 3 + 8, 7 + 8, 7 + 8, 6 + 8, 2 + 8, | 357 2 + 8, 3 + 8, 7 + 8, 7 + 8, 6 + 8, 2 + 8, |
| 357 3 + 8, 0 + 8, 4 + 8, 4 + 8, 7 + 8, 3 + 8, | 358 3 + 8, 0 + 8, 4 + 8, 4 + 8, 7 + 8, 3 + 8, |
| 358 }; | 359 }; |
| 359 | 360 |
|
robertphillips
2013/10/30 14:36:08
Could you add a comment here (and maybe some ASCII
yunchao
2013/10/31 07:47:23
Agree with you. I added a comment about the indice
| |
| 360 int GrAARectRenderer::aaStrokeRectIndexCount() { | 361 static const uint16_t gBevelStrokeAARectIdx[] = { |
| 361 return GR_ARRAY_COUNT(gStrokeAARectIdx); | 362 0 + 0, 1 + 0, 9 + 0, 9 + 0, 8 + 0, 0 + 0, |
| 363 1 + 0, 5 + 0, 13 + 0, 13 + 0, 9 + 0, 1 + 0, | |
| 364 5 + 0, 6 + 0, 14 + 0, 14 + 0, 13 + 0, 5 + 0, | |
| 365 6 + 0, 2 + 0, 10 + 0, 10 + 0, 14 + 0, 6 + 0, | |
| 366 2 + 0, 3 + 0, 11 + 0, 11 + 0, 10 + 0, 2 + 0, | |
| 367 3 + 0, 7 + 0, 15 + 0, 15 + 0, 11 + 0, 3 + 0, | |
| 368 7 + 0, 4 + 0, 12 + 0, 12 + 0, 15 + 0, 7 + 0, | |
| 369 4 + 0, 0 + 0, 8 + 0, 8 + 0, 12 + 0, 4 + 0, | |
| 370 | |
| 371 0 + 8, 1 + 8, 9 + 8, 9 + 8, 8 + 8, 0 + 8, | |
| 372 1 + 8, 5 + 8, 9 + 8, | |
| 373 5 + 8, 6 + 8, 10 + 8, 10 + 8, 9 + 8, 5 + 8, | |
| 374 6 + 8, 2 + 8, 10 + 8, | |
| 375 2 + 8, 3 + 8, 11 + 8, 11 + 8, 10 + 8, 2 + 8, | |
| 376 3 + 8, 7 + 8, 11 + 8, | |
| 377 7 + 8, 4 + 8, 8 + 8, 8 + 8, 11 + 8, 7 + 8, | |
| 378 4 + 8, 0 + 8, 8 + 8, | |
| 379 | |
| 380 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, | |
| 381 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, | |
| 382 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, | |
| 383 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, | |
| 384 }; | |
| 385 | |
| 386 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { | |
| 387 return miterStroke ? GR_ARRAY_COUNT(gMiterStrokeAARectIdx) : | |
| 388 GR_ARRAY_COUNT(gBevelStrokeAARectIdx); | |
| 362 } | 389 } |
| 363 | 390 |
| 364 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu) { | 391 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, |
|
bsalomon
2013/10/30 14:13:02
this can stay as one line (we wrap at 100col)
| |
| 365 if (NULL == fAAStrokeRectIndexBuffer) { | 392 bool miterStroke) { |
| 366 fAAStrokeRectIndexBuffer = | 393 if (miterStroke) { |
| 367 gpu->createIndexBuffer(sizeof(gStrokeAARectIdx), false); | 394 if (NULL == fAAMiterStrokeRectIndexBuffer) { |
| 368 if (NULL != fAAStrokeRectIndexBuffer) { | 395 fAAMiterStrokeRectIndexBuffer = |
| 396 gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false); | |
| 397 if (NULL != fAAMiterStrokeRectIndexBuffer) { | |
| 369 #ifdef SK_DEBUG | 398 #ifdef SK_DEBUG |
| 370 bool updated = | 399 bool updated = |
| 371 #endif | 400 #endif |
| 372 fAAStrokeRectIndexBuffer->updateData(gStrokeAARectIdx, | 401 fAAMiterStrokeRectIndexBuffer->updateData(gMiterStrokeAARectIdx, |
|
robertphillips
2013/10/30 14:36:08
Please align the "sizeof" line with the above "(".
| |
| 373 sizeof(gStrokeAARectIdx)); | 402 sizeof(gMiterStrokeAARectIdx)); |
| 374 GR_DEBUGASSERT(updated); | 403 GR_DEBUGASSERT(updated); |
| 404 } | |
| 375 } | 405 } |
| 406 return fAAMiterStrokeRectIndexBuffer; | |
| 407 } else { | |
| 408 if (NULL == fAABevelStrokeRectIndexBuffer) { | |
| 409 fAABevelStrokeRectIndexBuffer = | |
| 410 gpu->createIndexBuffer(sizeof(gBevelStrokeAARectIdx), false); | |
| 411 if (NULL != fAABevelStrokeRectIndexBuffer) { | |
| 412 #ifdef SK_DEBUG | |
| 413 bool updated = | |
| 414 #endif | |
| 415 fAABevelStrokeRectIndexBuffer->updateData(gBevelStrokeAARectIdx, | |
|
robertphillips
2013/10/30 14:36:08
Here too please.
| |
| 416 sizeof(gBevelStrokeAARectIdx)); | |
| 417 GR_DEBUGASSERT(updated); | |
| 418 } | |
| 419 } | |
| 420 return fAABevelStrokeRectIndexBuffer; | |
| 376 } | 421 } |
| 377 return fAAStrokeRectIndexBuffer; | |
| 378 } | 422 } |
| 379 | 423 |
| 380 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, | 424 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| 381 GrDrawTarget* target, | 425 GrDrawTarget* target, |
| 382 const SkRect& rect, | 426 const SkRect& rect, |
| 383 const SkMatrix& combinedMatrix, | 427 const SkMatrix& combinedMatrix, |
| 384 const SkRect& devRect, | 428 const SkRect& devRect, |
| 385 bool useVertexCoverage) { | 429 bool useVertexCoverage) { |
| 386 GrDrawState* drawState = target->drawState(); | 430 GrDrawState* drawState = target->drawState(); |
| 387 | 431 |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 646 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 690 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); |
| 647 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 691 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
| 648 target->resetIndexSource(); | 692 target->resetIndexSource(); |
| 649 } | 693 } |
| 650 | 694 |
| 651 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 695 void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| 652 GrDrawTarget* target, | 696 GrDrawTarget* target, |
| 653 const SkRect& rect, | 697 const SkRect& rect, |
| 654 const SkMatrix& combinedMatrix, | 698 const SkMatrix& combinedMatrix, |
| 655 const SkRect& devRect, | 699 const SkRect& devRect, |
| 656 SkScalar width, | 700 //SkScalar width, |
|
bsalomon
2013/10/30 14:13:02
Please remove rather than commenting out.
| |
| 657 bool useVertexCoverage) { | 701 const SkStrokeRec* stroke, |
| 702 bool useVertexCoverage/*, | |
| 703 bool miterStroke*/) { | |
|
bsalomon
2013/10/30 14:13:02
and here
| |
| 658 GrVec devStrokeSize; | 704 GrVec devStrokeSize; |
| 705 SkScalar width = stroke->getWidth(); | |
| 659 if (width > 0) { | 706 if (width > 0) { |
| 660 devStrokeSize.set(width, width); | 707 devStrokeSize.set(width, width); |
| 661 combinedMatrix.mapVectors(&devStrokeSize, 1); | 708 combinedMatrix.mapVectors(&devStrokeSize, 1); |
| 662 devStrokeSize.setAbs(devStrokeSize); | 709 devStrokeSize.setAbs(devStrokeSize); |
| 663 } else { | 710 } else { |
| 664 devStrokeSize.set(SK_Scalar1, SK_Scalar1); | 711 devStrokeSize.set(SK_Scalar1, SK_Scalar1); |
| 665 } | 712 } |
| 666 | 713 |
| 667 const SkScalar dx = devStrokeSize.fX; | 714 const SkScalar dx = devStrokeSize.fX; |
| 668 const SkScalar dy = devStrokeSize.fY; | 715 const SkScalar dy = devStrokeSize.fY; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 689 | 736 |
| 690 if (spare <= 0) { | 737 if (spare <= 0) { |
| 691 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), | 738 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), |
| 692 devOutside, useVertexCoverage); | 739 devOutside, useVertexCoverage); |
| 693 return; | 740 return; |
| 694 } | 741 } |
| 695 | 742 |
| 696 SkRect devInside(devRect); | 743 SkRect devInside(devRect); |
| 697 devInside.inset(rx, ry); | 744 devInside.inset(rx, ry); |
| 698 | 745 |
| 699 this->geometryStrokeAARect(gpu, target, devOutside, devInside, useVertexCove rage); | 746 SkRect devOutsideAssist(devRect); |
| 747 | |
|
robertphillips
2013/10/30 14:36:08
I think the entire computation of "miterStroke" ca
| |
| 748 bool miterStroke = true; | |
| 749 // small miter limit means right angles show bevel... | |
| 750 if (stroke->getJoin() != SkPaint::kMiter_Join || | |
| 751 stroke->getMiter() < SK_ScalarSqrt2) { | |
| 752 miterStroke = false; | |
| 753 } | |
| 754 | |
| 755 if (!miterStroke) { | |
|
robertphillips
2013/10/30 14:36:08
inset(0, ry) rather than outset(0, -ry)?
yunchao
2013/10/31 07:47:23
I checked my local code, it is a typo, it should b
| |
| 756 devOutside.outset(0, -ry); | |
| 757 devOutsideAssist.outset(0, ry); | |
| 758 } | |
| 759 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | |
| 760 devInside, useVertexCoverage, miterStroke); | |
| 700 } | 761 } |
| 701 | 762 |
| 702 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, | 763 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| 703 GrDrawTarget* target, | 764 GrDrawTarget* target, |
| 704 const SkRect& devOutside, | 765 const SkRect& devOutside, |
|
robertphillips
2013/10/30 14:36:08
Is there a comment somewhere (maybe the header) as
| |
| 766 const SkRect& devOutsideAssist, | |
| 705 const SkRect& devInside, | 767 const SkRect& devInside, |
| 706 bool useVertexCoverage) { | 768 bool useVertexCoverage, |
| 769 bool miterStroke) { | |
| 707 GrDrawState* drawState = target->drawState(); | 770 GrDrawState* drawState = target->drawState(); |
| 708 | 771 |
| 709 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 772 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
| 710 | 773 |
|
robertphillips
2013/10/30 14:36:08
Make these two with static const (and prefix with
yunchao
2013/10/31 07:47:23
Yeah, a good suggestion, I will keep this style.
| |
| 711 GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0); | 774 int outerVertexNum4Miter = 4, outerVertexNum4Bevel = 8; |
| 775 int outerVertexNum, innerVertexNum = 4; | |
| 776 int totalVertexNum; | |
| 777 if (miterStroke) { | |
| 778 totalVertexNum = outerVertexNum4Miter * 2 + innerVertexNum * 2; | |
| 779 outerVertexNum = outerVertexNum4Miter; | |
| 780 } else { | |
| 781 totalVertexNum = outerVertexNum4Bevel * 2 + innerVertexNum * 2; | |
| 782 outerVertexNum = outerVertexNum4Bevel; | |
| 783 } | |
| 784 | |
| 785 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); | |
| 712 if (!geo.succeeded()) { | 786 if (!geo.succeeded()) { |
| 713 GrPrintf("Failed to get space for vertices!\n"); | 787 GrPrintf("Failed to get space for vertices!\n"); |
| 714 return; | 788 return; |
| 715 } | 789 } |
| 716 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu); | 790 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ; |
| 717 if (NULL == indexBuffer) { | 791 if (NULL == indexBuffer) { |
| 718 GrPrintf("Failed to create index buffer!\n"); | 792 GrPrintf("Failed to create index buffer!\n"); |
| 719 return; | 793 return; |
| 720 } | 794 } |
| 721 | 795 |
| 722 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 796 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 723 size_t vsize = drawState->getVertexSize(); | 797 size_t vsize = drawState->getVertexSize(); |
| 724 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); | 798 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); |
| 725 | 799 |
| 726 // We create vertices for four nested rectangles. There are two ramps from 0 to full | 800 // We create vertices for four nested rectangles. There are two ramps from 0 to full |
| 727 // coverage, one on the exterior of the stroke and the other on the interior . | 801 // coverage, one on the exterior of the stroke and the other on the interior . |
| 728 // The following pointers refer to the four rects, from outermost to innermo st. | 802 // The following pointers refer to the four rects, from outermost to innermo st. |
| 729 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); | 803 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); |
| 730 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | 804 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + outerVertexNum * vsize ); |
| 731 GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 8 * vsize); | 805 GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 2 * outerVertexNum * v size); |
| 732 GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + 12 * vsize); | 806 GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + (2 * outerVertexNum + innerVertexNum) * vsize); |
| 733 | 807 |
| 734 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX | 808 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX |
| 735 // TODO: this only really works if the X & Y margins are the same all around | 809 // TODO: this only really works if the X & Y margins are the same all around |
| 736 // the rect | 810 // the rect |
| 737 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh t); | 811 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh t); |
| 738 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); | 812 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); |
| 739 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); | 813 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); |
| 740 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fB ottom); | 814 if (miterStroke) { |
| 815 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid e.fBottom); | |
| 816 } else { | |
| 817 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de vInside.fBottom); | |
| 818 } | |
| 741 SkASSERT(inset >= 0); | 819 SkASSERT(inset >= 0); |
| 742 #else | 820 #else |
| 743 SkScalar inset = SK_ScalarHalf; | 821 SkScalar inset = SK_ScalarHalf; |
| 744 #endif | 822 #endif |
| 745 | 823 |
| 746 // outermost | 824 if (miterStroke) { |
| 747 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf); | 825 // outermost |
| 748 // inner two | 826 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf ); |
| 749 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 827 // inner two |
| 750 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 828 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); |
| 751 // innermost | 829 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); |
| 752 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf); | 830 // innermost |
| 831 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); | |
| 832 } else { | |
| 833 GrPoint* fan0AssistPos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | |
| 834 GrPoint* fan1AssistPos = reinterpret_cast<GrPoint*>(verts + (outerVertex Num + 4) * vsize); | |
| 835 // outermost | |
| 836 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf ); | |
| 837 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S K_ScalarHalf); | |
| 838 // outer one of the inner two | |
| 839 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | |
| 840 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); | |
| 841 // inner one of the inner two | |
| 842 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | |
| 843 // innermost | |
| 844 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); | |
| 845 } | |
| 753 | 846 |
| 754 // The outermost rect has 0 coverage | 847 // The outermost rect has 0 coverage |
| 755 verts += sizeof(GrPoint); | 848 verts += sizeof(GrPoint); |
| 756 for (int i = 0; i < 4; ++i) { | 849 for (int i = 0; i < outerVertexNum; ++i) { |
| 757 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 850 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| 758 } | 851 } |
| 759 | 852 |
| 760 int scale; | 853 int scale; |
| 761 if (inset < SK_ScalarHalf) { | 854 if (inset < SK_ScalarHalf) { |
| 762 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 855 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 763 SkASSERT(scale >= 0 && scale <= 255); | 856 SkASSERT(scale >= 0 && scale <= 255); |
| 764 } else { | 857 } else { |
| 765 scale = 0xff; | 858 scale = 0xff; |
| 766 } | 859 } |
| 767 | 860 |
| 768 // The inner two rects have full coverage | 861 // The inner two rects have full coverage |
| 769 GrColor innerColor; | 862 GrColor innerColor; |
| 770 if (useVertexCoverage) { | 863 if (useVertexCoverage) { |
| 771 innerColor = GrColorPackRGBA(scale, scale, scale, scale); | 864 innerColor = GrColorPackRGBA(scale, scale, scale, scale); |
| 772 } else { | 865 } else { |
| 773 if (0xff == scale) { | 866 if (0xff == scale) { |
| 774 innerColor = target->getDrawState().getColor(); | 867 innerColor = target->getDrawState().getColor(); |
| 775 } else { | 868 } else { |
| 776 innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); | 869 innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); |
| 777 } | 870 } |
| 778 } | 871 } |
| 779 | 872 |
| 780 verts += 4 * vsize; | 873 verts += outerVertexNum * vsize; |
| 781 for (int i = 0; i < 8; ++i) { | 874 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| 782 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 875 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; |
| 783 } | 876 } |
| 784 | 877 |
| 785 // The innermost rect has 0 coverage | 878 // The innermost rect has 0 coverage |
| 786 verts += 8 * vsize; | 879 verts += (2 * outerVertexNum + innerVertexNum) * vsize; |
| 787 for (int i = 0; i < 4; ++i) { | 880 for (int i = 0; i < innerVertexNum; ++i) { |
| 788 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 881 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| 789 } | 882 } |
| 790 | 883 |
| 791 target->setIndexSourceToBuffer(indexBuffer); | 884 target->setIndexSourceToBuffer(indexBuffer); |
| 792 target->drawIndexed(kTriangles_GrPrimitiveType, | 885 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, |
| 793 0, 0, 16, aaStrokeRectIndexCount()); | 886 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); |
| 794 } | 887 } |
| 795 | 888 |
| 796 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, | 889 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| 797 GrDrawTarget* target, | 890 GrDrawTarget* target, |
| 798 const SkRect rects[2], | 891 const SkRect rects[2], |
| 799 const SkMatrix& combinedMatrix, | 892 const SkMatrix& combinedMatrix, |
| 800 bool useVertexCoverage) { | 893 bool useVertexCoverage) { |
| 801 SkASSERT(combinedMatrix.rectStaysRect()); | 894 SkASSERT(combinedMatrix.rectStaysRect()); |
| 802 SkASSERT(!rects[1].isEmpty()); | 895 SkASSERT(!rects[1].isEmpty()); |
| 803 | 896 |
| 804 SkRect devOutside, devInside; | 897 SkRect devOutside, devOutsideAssist, devInside; |
| 805 combinedMatrix.mapRect(&devOutside, rects[0]); | 898 combinedMatrix.mapRect(&devOutside, rects[0]); |
| 806 // can't call mapRect for devInside since it calls sort | 899 // can't call mapRect for devInside since it calls sort |
| 807 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; | 900 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; |
| 808 | 901 |
| 809 if (devInside.isEmpty()) { | 902 if (devInside.isEmpty()) { |
| 810 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage); | 903 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage); |
| 811 return; | 904 return; |
| 812 } | 905 } |
| 813 | 906 |
| 814 this->geometryStrokeAARect(gpu, target, devOutside, devInside, useVertexCove rage); | 907 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, |
| 908 devInside, useVertexCoverage, true); | |
| 815 } | 909 } |
| OLD | NEW |