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

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

Issue 216503004: SK_SUPPORT_LEGACY_GRTYPES to hide duplicate types from SkTypes.h (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 9 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 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 GrTexture* textures[]) { 254 GrTexture* textures[]) {
255 return GrRectEffect::Create(); 255 return GrRectEffect::Create();
256 } 256 }
257 257
258 /////////////////////////////////////////////////////////////////////////////// 258 ///////////////////////////////////////////////////////////////////////////////
259 259
260 namespace { 260 namespace {
261 261
262 extern const GrVertexAttrib gAARectCoverageAttribs[] = { 262 extern const GrVertexAttrib gAARectCoverageAttribs[] = {
263 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin g}, 263 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin g},
264 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kCoverage_GrVertexAttribBindin g}, 264 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBindin g},
265 }; 265 };
266 266
267 extern const GrVertexAttrib gAARectColorAttribs[] = { 267 extern const GrVertexAttrib gAARectColorAttribs[] = {
268 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin g}, 268 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin g},
269 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding}, 269 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding},
270 }; 270 };
271 271
272 static void set_aa_rect_vertex_attributes(GrDrawState* drawState, bool useCovera ge) { 272 static void set_aa_rect_vertex_attributes(GrDrawState* drawState, bool useCovera ge) {
273 if (useCoverage) { 273 if (useCoverage) {
274 drawState->setVertexAttribs<gAARectCoverageAttribs>(SK_ARRAY_COUNT(gAARe ctCoverageAttribs)); 274 drawState->setVertexAttribs<gAARectCoverageAttribs>(SK_ARRAY_COUNT(gAARe ctCoverageAttribs));
275 } else { 275 } else {
276 drawState->setVertexAttribs<gAARectColorAttribs>(SK_ARRAY_COUNT(gAARectC olorAttribs)); 276 drawState->setVertexAttribs<gAARectColorAttribs>(SK_ARRAY_COUNT(gAARectC olorAttribs));
277 } 277 }
278 } 278 }
279 279
280 static void set_inset_fan(GrPoint* pts, size_t stride, 280 static void set_inset_fan(SkPoint* pts, size_t stride,
281 const SkRect& r, SkScalar dx, SkScalar dy) { 281 const SkRect& r, SkScalar dx, SkScalar dy) {
282 pts->setRectFan(r.fLeft + dx, r.fTop + dy, 282 pts->setRectFan(r.fLeft + dx, r.fTop + dy,
283 r.fRight - dx, r.fBottom - dy, stride); 283 r.fRight - dx, r.fBottom - dy, stride);
284 } 284 }
285 285
286 }; 286 };
287 287
288 void GrAARectRenderer::reset() { 288 void GrAARectRenderer::reset() {
289 SkSafeSetNull(fAAFillRectIndexBuffer); 289 SkSafeSetNull(fAAFillRectIndexBuffer);
290 SkSafeSetNull(fAAMiterStrokeRectIndexBuffer); 290 SkSafeSetNull(fAAMiterStrokeRectIndexBuffer);
291 SkSafeSetNull(fAABevelStrokeRectIndexBuffer); 291 SkSafeSetNull(fAABevelStrokeRectIndexBuffer);
292 } 292 }
293 293
294 static const uint16_t gFillAARectIdx[] = { 294 static const uint16_t gFillAARectIdx[] = {
295 0, 1, 5, 5, 4, 0, 295 0, 1, 5, 5, 4, 0,
296 1, 2, 6, 6, 5, 1, 296 1, 2, 6, 6, 5, 1,
297 2, 3, 7, 7, 6, 2, 297 2, 3, 7, 7, 6, 2,
298 3, 0, 4, 4, 7, 3, 298 3, 0, 4, 4, 7, 3,
299 4, 5, 6, 6, 7, 4, 299 4, 5, 6, 6, 7, 4,
300 }; 300 };
301 301
302 static const int kIndicesPerAAFillRect = GR_ARRAY_COUNT(gFillAARectIdx); 302 static const int kIndicesPerAAFillRect = SK_ARRAY_COUNT(gFillAARectIdx);
303 static const int kVertsPerAAFillRect = 8; 303 static const int kVertsPerAAFillRect = 8;
304 static const int kNumAAFillRectsInIndexBuffer = 256; 304 static const int kNumAAFillRectsInIndexBuffer = 256;
305 305
306 GrIndexBuffer* GrAARectRenderer::aaFillRectIndexBuffer(GrGpu* gpu) { 306 GrIndexBuffer* GrAARectRenderer::aaFillRectIndexBuffer(GrGpu* gpu) {
307 static const size_t kAAFillRectIndexBufferSize = kIndicesPerAAFillRect * 307 static const size_t kAAFillRectIndexBufferSize = kIndicesPerAAFillRect *
308 sizeof(uint16_t) * 308 sizeof(uint16_t) *
309 kNumAAFillRectsInIndexBuffe r; 309 kNumAAFillRectsInIndexBuffe r;
310 310
311 if (NULL == fAAFillRectIndexBuffer) { 311 if (NULL == fAAFillRectIndexBuffer) {
312 fAAFillRectIndexBuffer = gpu->createIndexBuffer(kAAFillRectIndexBufferSi ze, false); 312 fAAFillRectIndexBuffer = gpu->createIndexBuffer(kAAFillRectIndexBufferSi ze, false);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 4 + 8, 0 + 8, 8 + 8, 407 4 + 8, 0 + 8, 8 + 8,
408 408
409 // Draw the inner AA, from inner edge to inner AA line, shift is 16. 409 // Draw the inner AA, from inner edge to inner AA line, shift is 16.
410 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, 410 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16,
411 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, 411 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16,
412 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, 412 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16,
413 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, 413 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16,
414 }; 414 };
415 415
416 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { 416 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) {
417 return miterStroke ? GR_ARRAY_COUNT(gMiterStrokeAARectIdx) : 417 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) :
418 GR_ARRAY_COUNT(gBevelStrokeAARectIdx); 418 SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
419 } 419 }
420 420
421 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS troke) { 421 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS troke) {
422 if (miterStroke) { 422 if (miterStroke) {
423 if (NULL == fAAMiterStrokeRectIndexBuffer) { 423 if (NULL == fAAMiterStrokeRectIndexBuffer) {
424 fAAMiterStrokeRectIndexBuffer = 424 fAAMiterStrokeRectIndexBuffer =
425 gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false); 425 gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false);
426 if (NULL != fAAMiterStrokeRectIndexBuffer) { 426 if (NULL != fAAMiterStrokeRectIndexBuffer) {
427 #ifdef SK_DEBUG 427 #ifdef SK_DEBUG
428 bool updated = 428 bool updated =
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 } 467 }
468 468
469 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); 469 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu);
470 if (NULL == indexBuffer) { 470 if (NULL == indexBuffer) {
471 GrPrintf("Failed to create index buffer!\n"); 471 GrPrintf("Failed to create index buffer!\n");
472 return; 472 return;
473 } 473 }
474 474
475 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); 475 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices());
476 size_t vsize = drawState->getVertexSize(); 476 size_t vsize = drawState->getVertexSize();
477 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); 477 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize);
478 478
479 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); 479 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts);
480 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); 480 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize);
481 481
482 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); 482 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1);
483 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); 483 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height());
484 484
485 if (combinedMatrix.rectStaysRect()) { 485 if (combinedMatrix.rectStaysRect()) {
486 // Temporarily #if'ed out. We don't want to pass in the devRect but 486 // Temporarily #if'ed out. We don't want to pass in the devRect but
487 // right now it is computed in GrContext::apply_aa_to_rect and we don't 487 // right now it is computed in GrContext::apply_aa_to_rect and we don't
488 // want to throw away the work 488 // want to throw away the work
489 #if 0 489 #if 0
490 SkRect devRect; 490 SkRect devRect;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 // BR 524 // BR
525 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = 525 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) =
526 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; 526 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1];
527 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; 527 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1];
528 // TR 528 // TR
529 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = 529 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) =
530 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; 530 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1];
531 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; 531 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1];
532 } 532 }
533 533
534 verts += sizeof(GrPoint); 534 verts += sizeof(SkPoint);
535 for (int i = 0; i < 4; ++i) { 535 for (int i = 0; i < 4; ++i) {
536 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; 536 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0;
537 } 537 }
538 538
539 int scale; 539 int scale;
540 if (inset < SK_ScalarHalf) { 540 if (inset < SK_ScalarHalf) {
541 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); 541 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
542 SkASSERT(scale >= 0 && scale <= 255); 542 SkASSERT(scale >= 0 && scale <= 255);
543 } else { 543 } else {
544 scale = 0xff; 544 scale = 0xff;
(...skipping 19 matching lines...) Expand all
564 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 564 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1,
565 kVertsPerAAFillRect, 565 kVertsPerAAFillRect,
566 kIndicesPerAAFillRect); 566 kIndicesPerAAFillRect);
567 target->resetIndexSource(); 567 target->resetIndexSource();
568 } 568 }
569 569
570 namespace { 570 namespace {
571 571
572 // Rotated 572 // Rotated
573 struct RectVertex { 573 struct RectVertex {
574 GrPoint fPos; 574 SkPoint fPos;
575 GrPoint fCenter; 575 SkPoint fCenter;
576 GrPoint fDir; 576 SkPoint fDir;
577 GrPoint fWidthHeight; 577 SkPoint fWidthHeight;
578 }; 578 };
579 579
580 // Rotated 580 // Rotated
581 extern const GrVertexAttrib gAARectVertexAttribs[] = { 581 extern const GrVertexAttrib gAARectVertexAttribs[] = {
582 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind ing }, 582 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind ing },
583 { kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBindin g }, 583 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kEffect_GrVertexAttribBindin g },
584 { kVec2f_GrVertexAttribType, 3*sizeof(GrPoint), kEffect_GrVertexAttribBindin g } 584 { kVec2f_GrVertexAttribType, 3*sizeof(SkPoint), kEffect_GrVertexAttribBindin g }
585 }; 585 };
586 586
587 // Axis Aligned 587 // Axis Aligned
588 struct AARectVertex { 588 struct AARectVertex {
589 GrPoint fPos; 589 SkPoint fPos;
590 GrPoint fOffset; 590 SkPoint fOffset;
591 GrPoint fWidthHeight; 591 SkPoint fWidthHeight;
592 }; 592 };
593 593
594 // Axis Aligned 594 // Axis Aligned
595 extern const GrVertexAttrib gAAAARectVertexAttribs[] = { 595 extern const GrVertexAttrib gAAAARectVertexAttribs[] = {
596 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind ing }, 596 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind ing },
597 { kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBindin g }, 597 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kEffect_GrVertexAttribBindin g },
598 }; 598 };
599 599
600 }; 600 };
601 601
602 void GrAARectRenderer::shaderFillAARect(GrGpu* gpu, 602 void GrAARectRenderer::shaderFillAARect(GrGpu* gpu,
603 GrDrawTarget* target, 603 GrDrawTarget* target,
604 const SkRect& rect, 604 const SkRect& rect,
605 const SkMatrix& combinedMatrix) { 605 const SkMatrix& combinedMatrix) {
606 GrDrawState* drawState = target->drawState(); 606 GrDrawState* drawState = target->drawState();
607 607
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 SkRect devRect; 688 SkRect devRect;
689 combinedMatrix.mapRect(&devRect, rect); 689 combinedMatrix.mapRect(&devRect, rect);
690 690
691 SkRect devBounds = { 691 SkRect devBounds = {
692 devRect.fLeft - SK_ScalarHalf, 692 devRect.fLeft - SK_ScalarHalf,
693 devRect.fTop - SK_ScalarHalf, 693 devRect.fTop - SK_ScalarHalf,
694 devRect.fRight + SK_ScalarHalf, 694 devRect.fRight + SK_ScalarHalf,
695 devRect.fBottom + SK_ScalarHalf 695 devRect.fBottom + SK_ScalarHalf
696 }; 696 };
697 697
698 GrPoint widthHeight = { 698 SkPoint widthHeight = {
699 SkScalarHalf(devRect.width()) + SK_ScalarHalf, 699 SkScalarHalf(devRect.width()) + SK_ScalarHalf,
700 SkScalarHalf(devRect.height()) + SK_ScalarHalf 700 SkScalarHalf(devRect.height()) + SK_ScalarHalf
701 }; 701 };
702 702
703 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop); 703 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop);
704 verts[0].fOffset = SkPoint::Make(-widthHeight.fX, -widthHeight.fY); 704 verts[0].fOffset = SkPoint::Make(-widthHeight.fX, -widthHeight.fY);
705 verts[0].fWidthHeight = widthHeight; 705 verts[0].fWidthHeight = widthHeight;
706 706
707 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom); 707 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom);
708 verts[1].fOffset = SkPoint::Make(-widthHeight.fX, widthHeight.fY); 708 verts[1].fOffset = SkPoint::Make(-widthHeight.fX, widthHeight.fY);
(...skipping 12 matching lines...) Expand all
721 target->resetIndexSource(); 721 target->resetIndexSource();
722 } 722 }
723 723
724 void GrAARectRenderer::strokeAARect(GrGpu* gpu, 724 void GrAARectRenderer::strokeAARect(GrGpu* gpu,
725 GrDrawTarget* target, 725 GrDrawTarget* target,
726 const SkRect& rect, 726 const SkRect& rect,
727 const SkMatrix& combinedMatrix, 727 const SkMatrix& combinedMatrix,
728 const SkRect& devRect, 728 const SkRect& devRect,
729 const SkStrokeRec* stroke, 729 const SkStrokeRec* stroke,
730 bool useVertexCoverage) { 730 bool useVertexCoverage) {
731 GrVec devStrokeSize; 731 SkVector devStrokeSize;
732 SkScalar width = stroke->getWidth(); 732 SkScalar width = stroke->getWidth();
733 if (width > 0) { 733 if (width > 0) {
734 devStrokeSize.set(width, width); 734 devStrokeSize.set(width, width);
735 combinedMatrix.mapVectors(&devStrokeSize, 1); 735 combinedMatrix.mapVectors(&devStrokeSize, 1);
736 devStrokeSize.setAbs(devStrokeSize); 736 devStrokeSize.setAbs(devStrokeSize);
737 } else { 737 } else {
738 devStrokeSize.set(SK_Scalar1, SK_Scalar1); 738 devStrokeSize.set(SK_Scalar1, SK_Scalar1);
739 } 739 }
740 740
741 const SkScalar dx = devStrokeSize.fX; 741 const SkScalar dx = devStrokeSize.fX;
742 const SkScalar dy = devStrokeSize.fY; 742 const SkScalar dy = devStrokeSize.fY;
743 const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf); 743 const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf);
744 const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf); 744 const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf);
745 745
746 // Temporarily #if'ed out. We don't want to pass in the devRect but 746 // Temporarily #if'ed out. We don't want to pass in the devRect but
747 // right now it is computed in GrContext::apply_aa_to_rect and we don't 747 // right now it is computed in GrContext::apply_aa_to_rect and we don't
748 // want to throw away the work 748 // want to throw away the work
749 #if 0 749 #if 0
750 SkRect devRect; 750 SkRect devRect;
751 combinedMatrix.mapRect(&devRect, rect); 751 combinedMatrix.mapRect(&devRect, rect);
752 #endif 752 #endif
753 753
754 SkScalar spare; 754 SkScalar spare;
755 { 755 {
756 SkScalar w = devRect.width() - dx; 756 SkScalar w = devRect.width() - dx;
757 SkScalar h = devRect.height() - dy; 757 SkScalar h = devRect.height() - dy;
758 spare = GrMin(w, h); 758 spare = SkTMin(w, h);
759 } 759 }
760 760
761 SkRect devOutside(devRect); 761 SkRect devOutside(devRect);
762 devOutside.outset(rx, ry); 762 devOutside.outset(rx, ry);
763 763
764 bool miterStroke = true; 764 bool miterStroke = true;
765 // small miter limit means right angles show bevel... 765 // small miter limit means right angles show bevel...
766 if (stroke->getJoin() != SkPaint::kMiter_Join || stroke->getMiter() < SK_Sca larSqrt2) { 766 if (stroke->getJoin() != SkPaint::kMiter_Join || stroke->getMiter() < SK_Sca larSqrt2) {
767 miterStroke = false; 767 miterStroke = false;
768 } 768 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 return; 811 return;
812 } 812 }
813 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ; 813 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ;
814 if (NULL == indexBuffer) { 814 if (NULL == indexBuffer) {
815 GrPrintf("Failed to create index buffer!\n"); 815 GrPrintf("Failed to create index buffer!\n");
816 return; 816 return;
817 } 817 }
818 818
819 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); 819 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices());
820 size_t vsize = drawState->getVertexSize(); 820 size_t vsize = drawState->getVertexSize();
821 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); 821 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize);
822 822
823 // We create vertices for four nested rectangles. There are two ramps from 0 to full 823 // We create vertices for four nested rectangles. There are two ramps from 0 to full
824 // coverage, one on the exterior of the stroke and the other on the interior . 824 // coverage, one on the exterior of the stroke and the other on the interior .
825 // The following pointers refer to the four rects, from outermost to innermo st. 825 // The following pointers refer to the four rects, from outermost to innermo st.
826 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); 826 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts);
827 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + outerVertexNum * vsize ); 827 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize );
828 GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 2 * outerVertexNum * v size); 828 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v size);
829 GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + (2 * outerVertexNum + innerVertexNum) * vsize); 829 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum + innerVertexNum) * vsize);
830 830
831 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX 831 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX
832 // TODO: this only really works if the X & Y margins are the same all around 832 // TODO: this only really works if the X & Y margins are the same all around
833 // the rect 833 // the rect
834 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh t); 834 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh t);
835 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); 835 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft);
836 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); 836 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop);
837 if (miterStroke) { 837 if (miterStroke) {
838 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid e.fBottom); 838 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid e.fBottom);
839 } else { 839 } else {
840 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de vInside.fBottom); 840 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de vInside.fBottom);
841 } 841 }
842 SkASSERT(inset >= 0); 842 SkASSERT(inset >= 0);
843 #else 843 #else
844 SkScalar inset = SK_ScalarHalf; 844 SkScalar inset = SK_ScalarHalf;
845 #endif 845 #endif
846 846
847 if (miterStroke) { 847 if (miterStroke) {
848 // outermost 848 // outermost
849 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf ); 849 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf );
850 // inner two 850 // inner two
851 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); 851 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset);
852 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); 852 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset);
853 // innermost 853 // innermost
854 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); 854 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf );
855 } else { 855 } else {
856 GrPoint* fan0AssistPos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); 856 SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vsize);
857 GrPoint* fan1AssistPos = reinterpret_cast<GrPoint*>(verts + (outerVertex Num + 4) * vsize); 857 SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts + (outerVertex Num + 4) * vsize);
858 // outermost 858 // outermost
859 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf ); 859 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf );
860 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S K_ScalarHalf); 860 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S K_ScalarHalf);
861 // outer one of the inner two 861 // outer one of the inner two
862 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); 862 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset);
863 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); 863 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset);
864 // inner one of the inner two 864 // inner one of the inner two
865 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); 865 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset);
866 // innermost 866 // innermost
867 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); 867 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf );
868 } 868 }
869 869
870 // The outermost rect has 0 coverage 870 // The outermost rect has 0 coverage
871 verts += sizeof(GrPoint); 871 verts += sizeof(SkPoint);
872 for (int i = 0; i < outerVertexNum; ++i) { 872 for (int i = 0; i < outerVertexNum; ++i) {
873 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; 873 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0;
874 } 874 }
875 875
876 int scale; 876 int scale;
877 if (inset < SK_ScalarHalf) { 877 if (inset < SK_ScalarHalf) {
878 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); 878 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
879 SkASSERT(scale >= 0 && scale <= 255); 879 SkASSERT(scale >= 0 && scale <= 255);
880 } else { 880 } else {
881 scale = 0xff; 881 scale = 0xff;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; 923 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ;
924 924
925 if (devInside.isEmpty()) { 925 if (devInside.isEmpty()) {
926 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage); 926 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage);
927 return; 927 return;
928 } 928 }
929 929
930 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, 930 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist,
931 devInside, useVertexCoverage, true); 931 devInside, useVertexCoverage, true);
932 } 932 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698