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 |