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 |
| 360 int GrAARectRenderer::aaStrokeRectIndexCount() { | 361 /** |
| 361 return GR_ARRAY_COUNT(gStrokeAARectIdx); | 362 * As in miter-stroke, index = a + b, and a is the current index, b is the shift |
| 363 * from the first index. The index layout: | |
| 364 * outer AA line: 0~3, 4~7 | |
| 365 * outer edge: 8~11, 12~15 | |
| 366 * inner edge: 16~19 | |
| 367 * inner AA line: 20~23 | |
| 368 * Following comes a bevel-stroke rect and its indices: | |
| 369 * | |
| 370 * 4 7 | |
| 371 * ********************************* | |
| 372 * * ______________________________ * | |
| 373 * * / 12 15 \ * | |
| 374 * * / \ * | |
| 375 * 0 * |8 16_____________________19 11 | * 3 | |
| 376 * * | | | | * | |
| 377 * * | | **************** | | * | |
| 378 * * | | * 20 23 * | | * | |
| 379 * * | | * * | | * | |
| 380 * * | | * 21 22 * | | * | |
| 381 * * | | **************** | | * | |
| 382 * * | |____________________| | * | |
| 383 * 1 * |9 17 18 10| * 2 | |
| 384 * * \ / * | |
| 385 * * \13 __________________________14/ * | |
| 386 * * * | |
| 387 * ********************************** | |
| 388 * 5 6 | |
| 389 */ | |
| 390 static const uint16_t gBevelStrokeAARectIdx[] = { | |
| 391 // Draw outer AA, from outer AA line to outer edge, shift is 0. | |
| 392 0 + 0, 1 + 0, 9 + 0, 9 + 0, 8 + 0, 0 + 0, | |
| 393 1 + 0, 5 + 0, 13 + 0, 13 + 0, 9 + 0, 1 + 0, | |
| 394 5 + 0, 6 + 0, 14 + 0, 14 + 0, 13 + 0, 5 + 0, | |
| 395 6 + 0, 2 + 0, 10 + 0, 10 + 0, 14 + 0, 6 + 0, | |
| 396 2 + 0, 3 + 0, 11 + 0, 11 + 0, 10 + 0, 2 + 0, | |
| 397 3 + 0, 7 + 0, 15 + 0, 15 + 0, 11 + 0, 3 + 0, | |
| 398 7 + 0, 4 + 0, 12 + 0, 12 + 0, 15 + 0, 7 + 0, | |
| 399 4 + 0, 0 + 0, 8 + 0, 8 + 0, 12 + 0, 4 + 0, | |
| 400 | |
| 401 // Draw the stroke, from outer edge to inner edge, shift is 8. | |
| 402 0 + 8, 1 + 8, 9 + 8, 9 + 8, 8 + 8, 0 + 8, | |
| 403 1 + 8, 5 + 8, 9 + 8, | |
| 404 5 + 8, 6 + 8, 10 + 8, 10 + 8, 9 + 8, 5 + 8, | |
| 405 6 + 8, 2 + 8, 10 + 8, | |
| 406 2 + 8, 3 + 8, 11 + 8, 11 + 8, 10 + 8, 2 + 8, | |
| 407 3 + 8, 7 + 8, 11 + 8, | |
| 408 7 + 8, 4 + 8, 8 + 8, 8 + 8, 11 + 8, 7 + 8, | |
| 409 4 + 8, 0 + 8, 8 + 8, | |
| 410 | |
| 411 // Draw the inner AA, from inner edge to inner AA line, shift is 16. | |
| 412 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, | |
| 413 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, | |
| 414 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, | |
| 415 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, | |
| 416 }; | |
| 417 | |
| 418 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { | |
| 419 return miterStroke ? GR_ARRAY_COUNT(gMiterStrokeAARectIdx) : | |
| 420 GR_ARRAY_COUNT(gBevelStrokeAARectIdx); | |
| 362 } | 421 } |
| 363 | 422 |
| 364 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu) { | 423 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS troke) { |
| 365 if (NULL == fAAStrokeRectIndexBuffer) { | 424 if (miterStroke) { |
| 366 fAAStrokeRectIndexBuffer = | 425 if (NULL == fAAMiterStrokeRectIndexBuffer) { |
| 367 gpu->createIndexBuffer(sizeof(gStrokeAARectIdx), false); | 426 fAAMiterStrokeRectIndexBuffer = |
| 368 if (NULL != fAAStrokeRectIndexBuffer) { | 427 gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false); |
| 428 if (NULL != fAAMiterStrokeRectIndexBuffer) { | |
| 369 #ifdef SK_DEBUG | 429 #ifdef SK_DEBUG |
| 370 bool updated = | 430 bool updated = |
| 371 #endif | 431 #endif |
| 372 fAAStrokeRectIndexBuffer->updateData(gStrokeAARectIdx, | 432 fAAMiterStrokeRectIndexBuffer->updateData(gMiterStrokeAARectIdx, |
| 373 sizeof(gStrokeAARectIdx)); | 433 sizeof(gMiterStrokeAAR ectIdx)); |
| 374 GR_DEBUGASSERT(updated); | 434 GR_DEBUGASSERT(updated); |
| 435 } | |
| 375 } | 436 } |
| 437 return fAAMiterStrokeRectIndexBuffer; | |
| 438 } else { | |
| 439 if (NULL == fAABevelStrokeRectIndexBuffer) { | |
| 440 fAABevelStrokeRectIndexBuffer = | |
| 441 gpu->createIndexBuffer(sizeof(gBevelStrokeAARectIdx), false); | |
| 442 if (NULL != fAABevelStrokeRectIndexBuffer) { | |
| 443 #ifdef SK_DEBUG | |
| 444 bool updated = | |
| 445 #endif | |
| 446 fAABevelStrokeRectIndexBuffer->updateData(gBevelStrokeAARectIdx, | |
| 447 sizeof(gBevelStrokeAAR ectIdx)); | |
| 448 GR_DEBUGASSERT(updated); | |
| 449 } | |
| 450 } | |
| 451 return fAABevelStrokeRectIndexBuffer; | |
| 376 } | 452 } |
| 377 return fAAStrokeRectIndexBuffer; | |
| 378 } | 453 } |
| 379 | 454 |
| 380 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, | 455 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| 381 GrDrawTarget* target, | 456 GrDrawTarget* target, |
| 382 const SkRect& rect, | 457 const SkRect& rect, |
| 383 const SkMatrix& combinedMatrix, | 458 const SkMatrix& combinedMatrix, |
| 384 const SkRect& devRect, | 459 const SkRect& devRect, |
| 385 bool useVertexCoverage) { | 460 bool useVertexCoverage) { |
| 386 GrDrawState* drawState = target->drawState(); | 461 GrDrawState* drawState = target->drawState(); |
| 387 | 462 |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 646 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 721 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); |
| 647 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 722 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
| 648 target->resetIndexSource(); | 723 target->resetIndexSource(); |
| 649 } | 724 } |
| 650 | 725 |
| 651 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 726 void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| 652 GrDrawTarget* target, | 727 GrDrawTarget* target, |
| 653 const SkRect& rect, | 728 const SkRect& rect, |
| 654 const SkMatrix& combinedMatrix, | 729 const SkMatrix& combinedMatrix, |
| 655 const SkRect& devRect, | 730 const SkRect& devRect, |
| 656 SkScalar width, | 731 const SkStrokeRec* stroke, |
| 657 bool useVertexCoverage) { | 732 bool useVertexCoverage) { |
| 658 GrVec devStrokeSize; | 733 GrVec devStrokeSize; |
| 734 SkScalar width = stroke->getWidth(); | |
| 659 if (width > 0) { | 735 if (width > 0) { |
| 660 devStrokeSize.set(width, width); | 736 devStrokeSize.set(width, width); |
| 661 combinedMatrix.mapVectors(&devStrokeSize, 1); | 737 combinedMatrix.mapVectors(&devStrokeSize, 1); |
| 662 devStrokeSize.setAbs(devStrokeSize); | 738 devStrokeSize.setAbs(devStrokeSize); |
| 663 } else { | 739 } else { |
| 664 devStrokeSize.set(SK_Scalar1, SK_Scalar1); | 740 devStrokeSize.set(SK_Scalar1, SK_Scalar1); |
| 665 } | 741 } |
| 666 | 742 |
| 667 const SkScalar dx = devStrokeSize.fX; | 743 const SkScalar dx = devStrokeSize.fX; |
| 668 const SkScalar dy = devStrokeSize.fY; | 744 const SkScalar dy = devStrokeSize.fY; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 680 SkScalar spare; | 756 SkScalar spare; |
| 681 { | 757 { |
| 682 SkScalar w = devRect.width() - dx; | 758 SkScalar w = devRect.width() - dx; |
| 683 SkScalar h = devRect.height() - dy; | 759 SkScalar h = devRect.height() - dy; |
| 684 spare = GrMin(w, h); | 760 spare = GrMin(w, h); |
| 685 } | 761 } |
| 686 | 762 |
| 687 SkRect devOutside(devRect); | 763 SkRect devOutside(devRect); |
| 688 devOutside.outset(rx, ry); | 764 devOutside.outset(rx, ry); |
| 689 | 765 |
| 690 if (spare <= 0) { | 766 bool miterStroke = true; |
| 767 // small miter limit means right angles show bevel... | |
| 768 if (stroke->getJoin() != SkPaint::kMiter_Join || stroke->getMiter() < SK_Sca larSqrt2) { | |
| 769 miterStroke = false; | |
| 770 } | |
| 771 | |
| 772 if (spare <= 0 && miterStroke) { | |
| 691 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), | 773 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), |
| 692 devOutside, useVertexCoverage); | 774 devOutside, useVertexCoverage); |
| 693 return; | 775 return; |
| 694 } | 776 } |
| 695 | 777 |
| 696 SkRect devInside(devRect); | 778 SkRect devInside(devRect); |
| 697 devInside.inset(rx, ry); | 779 devInside.inset(rx, ry); |
| 698 | 780 |
| 699 this->geometryStrokeAARect(gpu, target, devOutside, devInside, useVertexCove rage); | 781 SkRect devOutsideAssist(devRect); |
| 782 | |
| 783 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) | |
| 784 // to draw the outer of the rect. Because there are 8 vertices on the outer | |
| 785 // edge, while vertex number of inner edge is 4, the same as miter-stroke. | |
| 786 if (!miterStroke) { | |
| 787 devOutside.inset(0, ry); | |
| 788 devOutsideAssist.outset(0, ry); | |
| 789 } | |
| 790 | |
| 791 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | |
| 792 devInside, useVertexCoverage, miterStroke); | |
| 700 } | 793 } |
| 701 | 794 |
| 702 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, | 795 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| 703 GrDrawTarget* target, | 796 GrDrawTarget* target, |
| 704 const SkRect& devOutside, | 797 const SkRect& devOutside, |
| 798 const SkRect& devOutsideAssist, | |
| 705 const SkRect& devInside, | 799 const SkRect& devInside, |
| 706 bool useVertexCoverage) { | 800 bool useVertexCoverage, |
| 801 bool miterStroke) { | |
| 707 GrDrawState* drawState = target->drawState(); | 802 GrDrawState* drawState = target->drawState(); |
| 708 | 803 |
| 709 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 804 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
| 710 | 805 |
| 711 GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0); | 806 int innerVertexNum = 4; |
| 807 int outerVertexNum = miterStroke ? 4 : 8; | |
| 808 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; | |
| 809 | |
| 810 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); | |
| 712 if (!geo.succeeded()) { | 811 if (!geo.succeeded()) { |
| 713 GrPrintf("Failed to get space for vertices!\n"); | 812 GrPrintf("Failed to get space for vertices!\n"); |
| 714 return; | 813 return; |
| 715 } | 814 } |
| 716 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu); | 815 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ; |
| 717 if (NULL == indexBuffer) { | 816 if (NULL == indexBuffer) { |
| 718 GrPrintf("Failed to create index buffer!\n"); | 817 GrPrintf("Failed to create index buffer!\n"); |
| 719 return; | 818 return; |
| 720 } | 819 } |
| 721 | 820 |
| 722 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 821 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 723 size_t vsize = drawState->getVertexSize(); | 822 size_t vsize = drawState->getVertexSize(); |
| 724 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); | 823 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); |
| 725 | 824 |
| 726 // We create vertices for four nested rectangles. There are two ramps from 0 to full | 825 // 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 . | 826 // 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. | 827 // The following pointers refer to the four rects, from outermost to innermo st. |
| 729 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); | 828 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); |
| 730 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | 829 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + outerVertexNum * vsize ); |
| 731 GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 8 * vsize); | 830 GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 2 * outerVertexNum * v size); |
| 732 GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + 12 * vsize); | 831 GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + (2 * outerVertexNum + innerVertexNum) * vsize); |
| 733 | 832 |
| 734 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX | 833 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX |
| 735 // TODO: this only really works if the X & Y margins are the same all around | 834 // TODO: this only really works if the X & Y margins are the same all around |
| 736 // the rect | 835 // the rect |
| 737 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh t); | 836 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh t); |
| 738 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); | 837 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); |
| 739 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); | 838 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); |
| 740 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fB ottom); | 839 if (miterStroke) { |
| 840 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid e.fBottom); | |
| 841 } else { | |
| 842 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de vInside.fBottom); | |
| 843 } | |
| 741 SkASSERT(inset >= 0); | 844 SkASSERT(inset >= 0); |
| 742 #else | 845 #else |
| 743 SkScalar inset = SK_ScalarHalf; | 846 SkScalar inset = SK_ScalarHalf; |
| 744 #endif | 847 #endif |
| 745 | 848 |
| 746 // outermost | 849 if (miterStroke) { |
| 747 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf); | 850 // outermost |
| 748 // inner two | 851 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf ); |
| 749 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 852 // inner two |
| 750 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 853 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); |
| 751 // innermost | 854 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); |
| 752 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf); | 855 // innermost |
| 856 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); | |
| 857 } else { | |
| 858 GrPoint* fan0AssistPos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | |
| 859 GrPoint* fan1AssistPos = reinterpret_cast<GrPoint*>(verts + (outerVertex Num + 4) * vsize); | |
| 860 // outermost | |
| 861 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf ); | |
| 862 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S K_ScalarHalf); | |
| 863 // outer one of the inner two | |
| 864 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | |
| 865 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); | |
| 866 // inner one of the inner two | |
| 867 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | |
| 868 // innermost | |
| 869 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); | |
| 870 } | |
| 753 | 871 |
| 754 // The outermost rect has 0 coverage | 872 // The outermost rect has 0 coverage |
| 755 verts += sizeof(GrPoint); | 873 verts += sizeof(GrPoint); |
| 756 for (int i = 0; i < 4; ++i) { | 874 for (int i = 0; i < outerVertexNum; ++i) { |
| 757 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 875 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| 758 } | 876 } |
| 759 | 877 |
| 760 int scale; | 878 int scale; |
| 761 if (inset < SK_ScalarHalf) { | 879 if (inset < SK_ScalarHalf) { |
| 762 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 880 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 763 SkASSERT(scale >= 0 && scale <= 255); | 881 SkASSERT(scale >= 0 && scale <= 255); |
| 764 } else { | 882 } else { |
| 765 scale = 0xff; | 883 scale = 0xff; |
| 766 } | 884 } |
| 767 | 885 |
| 768 // The inner two rects have full coverage | 886 // The inner two rects have full coverage |
| 769 GrColor innerColor; | 887 GrColor innerColor; |
| 770 if (useVertexCoverage) { | 888 if (useVertexCoverage) { |
| 771 innerColor = GrColorPackRGBA(scale, scale, scale, scale); | 889 innerColor = GrColorPackRGBA(scale, scale, scale, scale); |
| 772 } else { | 890 } else { |
| 773 if (0xff == scale) { | 891 if (0xff == scale) { |
| 774 innerColor = target->getDrawState().getColor(); | 892 innerColor = target->getDrawState().getColor(); |
| 775 } else { | 893 } else { |
| 776 innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); | 894 innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); |
| 777 } | 895 } |
| 778 } | 896 } |
| 779 | 897 |
| 780 verts += 4 * vsize; | 898 verts += outerVertexNum * vsize; |
| 781 for (int i = 0; i < 8; ++i) { | 899 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| 782 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 900 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; |
| 783 } | 901 } |
| 784 | 902 |
| 785 // The innermost rect has 0 coverage | 903 // The innermost rect has 0 coverage |
| 786 verts += 8 * vsize; | 904 verts += (outerVertexNum + innerVertexNum) * vsize; |
|
yunchao
2013/11/05 04:58:30
variable 'verts' needs to move 2*outerVertexNum+in
| |
| 787 for (int i = 0; i < 4; ++i) { | 905 for (int i = 0; i < innerVertexNum; ++i) { |
| 788 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 906 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| 789 } | 907 } |
| 790 | 908 |
| 791 target->setIndexSourceToBuffer(indexBuffer); | 909 target->setIndexSourceToBuffer(indexBuffer); |
| 792 target->drawIndexed(kTriangles_GrPrimitiveType, | 910 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, |
| 793 0, 0, 16, aaStrokeRectIndexCount()); | 911 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); |
| 794 } | 912 } |
| 795 | 913 |
| 796 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, | 914 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| 797 GrDrawTarget* target, | 915 GrDrawTarget* target, |
| 798 const SkRect rects[2], | 916 const SkRect rects[2], |
| 799 const SkMatrix& combinedMatrix, | 917 const SkMatrix& combinedMatrix, |
| 800 bool useVertexCoverage) { | 918 bool useVertexCoverage) { |
| 801 SkASSERT(combinedMatrix.rectStaysRect()); | 919 SkASSERT(combinedMatrix.rectStaysRect()); |
| 802 SkASSERT(!rects[1].isEmpty()); | 920 SkASSERT(!rects[1].isEmpty()); |
| 803 | 921 |
| 804 SkRect devOutside, devInside; | 922 SkRect devOutside, devOutsideAssist, devInside; |
| 805 combinedMatrix.mapRect(&devOutside, rects[0]); | 923 combinedMatrix.mapRect(&devOutside, rects[0]); |
| 806 // can't call mapRect for devInside since it calls sort | 924 // can't call mapRect for devInside since it calls sort |
| 807 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; | 925 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; |
| 808 | 926 |
| 809 if (devInside.isEmpty()) { | 927 if (devInside.isEmpty()) { |
| 810 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage); | 928 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage); |
| 811 return; | 929 return; |
| 812 } | 930 } |
| 813 | 931 |
| 814 this->geometryStrokeAARect(gpu, target, devOutside, devInside, useVertexCove rage); | 932 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, |
| 933 devInside, useVertexCoverage, true); | |
| 815 } | 934 } |
| OLD | NEW |