Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/gpu/GrAARectRenderer.cpp

Issue 23712005: Add bevel-stroke support in GrAARectRenderer (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrContext.cpp » ('j') | src/gpu/SkGpuDevice.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698