| 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 "GrBatch.h" | 9 #include "GrBatch.h" | 
| 10 #include "GrBatchTarget.h" | 10 #include "GrBatchTarget.h" | 
|  | 11 #include "GrBatchTest.h" | 
| 11 #include "GrBufferAllocPool.h" | 12 #include "GrBufferAllocPool.h" | 
|  | 13 #include "GrContext.h" | 
| 12 #include "GrDefaultGeoProcFactory.h" | 14 #include "GrDefaultGeoProcFactory.h" | 
| 13 #include "GrGeometryProcessor.h" | 15 #include "GrGeometryProcessor.h" | 
| 14 #include "GrGpu.h" | 16 #include "GrGpu.h" | 
| 15 #include "GrInvariantOutput.h" | 17 #include "GrInvariantOutput.h" | 
| 16 #include "GrVertexBuffer.h" | 18 #include "GrVertexBuffer.h" | 
|  | 19 #include "GrTestUtils.h" | 
| 17 #include "SkColorPriv.h" | 20 #include "SkColorPriv.h" | 
| 18 #include "gl/GrGLProcessor.h" | 21 #include "gl/GrGLProcessor.h" | 
| 19 #include "gl/GrGLGeometryProcessor.h" | 22 #include "gl/GrGLGeometryProcessor.h" | 
| 20 #include "gl/builders/GrGLProgramBuilder.h" | 23 #include "gl/builders/GrGLProgramBuilder.h" | 
| 21 | 24 | 
| 22 /////////////////////////////////////////////////////////////////////////////// | 25 /////////////////////////////////////////////////////////////////////////////// | 
| 23 | 26 | 
| 24 static void set_inset_fan(SkPoint* pts, size_t stride, | 27 static void set_inset_fan(SkPoint* pts, size_t stride, | 
| 25                           const SkRect& r, SkScalar dx, SkScalar dy) { | 28                           const SkRect& r, SkScalar dx, SkScalar dy) { | 
| 26     pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 29     pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 416 | 419 | 
| 417 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI
     dx); | 420 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI
     dx); | 
| 418 static const int kVertsPerBevelStrokeRect = 24; | 421 static const int kVertsPerBevelStrokeRect = 24; | 
| 419 static const int kNumBevelStrokeRectsInIndexBuffer = 256; | 422 static const int kNumBevelStrokeRectsInIndexBuffer = 256; | 
| 420 | 423 | 
| 421 static int aa_stroke_rect_index_count(bool miterStroke) { | 424 static int aa_stroke_rect_index_count(bool miterStroke) { | 
| 422     return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : | 425     return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : | 
| 423                          SK_ARRAY_COUNT(gBevelStrokeAARectIdx); | 426                          SK_ARRAY_COUNT(gBevelStrokeAARectIdx); | 
| 424 } | 427 } | 
| 425 | 428 | 
| 426 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(bool miterStroke) { | 429 static GrIndexBuffer* setup_aa_stroke_rect_indexbuffer(GrIndexBuffer** aaMiterSt
     rokeRectIndexBuffer, | 
|  | 430                                                        GrIndexBuffer** aaBevelSt
     rokeRectIndexBuffer, | 
|  | 431                                                        GrGpu* gpu, | 
|  | 432                                                        bool miterStroke) { | 
| 427     if (miterStroke) { | 433     if (miterStroke) { | 
| 428         if (NULL == fAAMiterStrokeRectIndexBuffer) { | 434         if (!*aaMiterStrokeRectIndexBuffer) { | 
| 429             fAAMiterStrokeRectIndexBuffer = | 435             *aaMiterStrokeRectIndexBuffer = | 
| 430                     fGpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, | 436                     gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, | 
| 431                                                      kIndicesPerMiterStrokeRect, | 437                                                     kIndicesPerMiterStrokeRect, | 
| 432                                                      kNumMiterStrokeRectsInIndex
     Buffer, | 438                                                     kNumMiterStrokeRectsInIndexB
     uffer, | 
| 433                                                      kVertsPerMiterStrokeRect); | 439                                                     kVertsPerMiterStrokeRect); | 
| 434         } | 440         } | 
| 435         return fAAMiterStrokeRectIndexBuffer; | 441         return *aaMiterStrokeRectIndexBuffer; | 
| 436     } else { | 442     } else { | 
| 437         if (NULL == fAABevelStrokeRectIndexBuffer) { | 443         if (!*aaBevelStrokeRectIndexBuffer) { | 
| 438             fAABevelStrokeRectIndexBuffer = | 444             *aaBevelStrokeRectIndexBuffer = | 
| 439                     fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, | 445                     gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, | 
| 440                                                      kIndicesPerBevelStrokeRect, | 446                                                     kIndicesPerBevelStrokeRect, | 
| 441                                                      kNumBevelStrokeRectsInIndex
     Buffer, | 447                                                     kNumBevelStrokeRectsInIndexB
     uffer, | 
| 442                                                      kVertsPerBevelStrokeRect); | 448                                                     kVertsPerBevelStrokeRect); | 
| 443         } | 449         } | 
| 444         return fAABevelStrokeRectIndexBuffer; | 450         return *aaBevelStrokeRectIndexBuffer; | 
| 445     } | 451     } | 
| 446 } | 452 } | 
| 447 | 453 | 
| 448 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, | 454 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, | 
| 449                                           GrPipelineBuilder* pipelineBuilder, | 455                                           GrPipelineBuilder* pipelineBuilder, | 
| 450                                           GrColor color, | 456                                           GrColor color, | 
| 451                                           const SkMatrix& viewMatrix, | 457                                           const SkMatrix& viewMatrix, | 
| 452                                           const SkRect& rect, | 458                                           const SkRect& rect, | 
| 453                                           const SkRect& devRect) { | 459                                           const SkRect& devRect) { | 
| 454     if (!fAAFillRectIndexBuffer) { | 460     if (!fAAFillRectIndexBuffer) { | 
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 845         bool fCoverageIgnored; | 851         bool fCoverageIgnored; | 
| 846         bool fMiterStroke; | 852         bool fMiterStroke; | 
| 847         bool fCanTweakAlphaForCoverage; | 853         bool fCanTweakAlphaForCoverage; | 
| 848     }; | 854     }; | 
| 849 | 855 | 
| 850     BatchTracker fBatch; | 856     BatchTracker fBatch; | 
| 851     const GrIndexBuffer* fIndexBuffer; | 857     const GrIndexBuffer* fIndexBuffer; | 
| 852     SkSTArray<1, Geometry, true> fGeoData; | 858     SkSTArray<1, Geometry, true> fGeoData; | 
| 853 }; | 859 }; | 
| 854 | 860 | 
| 855 |  | 
| 856 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, | 861 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, | 
| 857                                             GrPipelineBuilder* pipelineBuilder, | 862                                             GrPipelineBuilder* pipelineBuilder, | 
| 858                                             GrColor color, | 863                                             GrColor color, | 
| 859                                             const SkMatrix& viewMatrix, | 864                                             const SkMatrix& viewMatrix, | 
| 860                                             const SkRect& devOutside, | 865                                             const SkRect& devOutside, | 
| 861                                             const SkRect& devOutsideAssist, | 866                                             const SkRect& devOutsideAssist, | 
| 862                                             const SkRect& devInside, | 867                                             const SkRect& devInside, | 
| 863                                             bool miterStroke) { | 868                                             bool miterStroke) { | 
| 864     GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); | 869     GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&fAAMiterStrok
     eRectIndexBuffer, | 
|  | 870                                                                   &fAABevelStrok
     eRectIndexBuffer, | 
|  | 871                                                                   fGpu, | 
|  | 872                                                                   miterStroke); | 
| 865     if (!indexBuffer) { | 873     if (!indexBuffer) { | 
| 866         SkDebugf("Failed to create index buffer!\n"); | 874         SkDebugf("Failed to create index buffer!\n"); | 
| 867         return; | 875         return; | 
| 868     } | 876     } | 
| 869 | 877 | 
| 870     AAStrokeRectBatch::Geometry geometry; | 878     AAStrokeRectBatch::Geometry geometry; | 
| 871     geometry.fColor = color; | 879     geometry.fColor = color; | 
| 872     geometry.fDevOutside = devOutside; | 880     geometry.fDevOutside = devOutside; | 
| 873     geometry.fDevOutsideAssist = devOutsideAssist; | 881     geometry.fDevOutsideAssist = devOutsideAssist; | 
| 874     geometry.fDevInside = devInside; | 882     geometry.fDevInside = devInside; | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 892     viewMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2); | 900     viewMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2); | 
| 893 | 901 | 
| 894     if (devInside.isEmpty()) { | 902     if (devInside.isEmpty()) { | 
| 895         this->fillAARect(target, pipelineBuilder, color, viewMatrix, devOutside,
      devOutside); | 903         this->fillAARect(target, pipelineBuilder, color, viewMatrix, devOutside,
      devOutside); | 
| 896         return; | 904         return; | 
| 897     } | 905     } | 
| 898 | 906 | 
| 899     this->geometryStrokeAARect(target, pipelineBuilder, color, viewMatrix, devOu
     tside, | 907     this->geometryStrokeAARect(target, pipelineBuilder, color, viewMatrix, devOu
     tside, | 
| 900                                devOutsideAssist, devInside, true); | 908                                devOutsideAssist, devInside, true); | 
| 901 } | 909 } | 
|  | 910 | 
|  | 911 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 
|  | 912 | 
|  | 913 #ifdef GR_TEST_UTILS | 
|  | 914 | 
|  | 915 BATCH_TEST_DEFINE(AAFillRectBatch) { | 
|  | 916     AAFillRectBatch::Geometry geo; | 
|  | 917     geo.fColor = GrRandomColor(random); | 
|  | 918     geo.fViewMatrix = GrTest::TestMatrix(random); | 
|  | 919     geo.fRect = GrTest::TestRect(random); | 
|  | 920     geo.fDevRect = GrTest::TestRect(random); | 
|  | 921 | 
|  | 922     static GrIndexBuffer* aaFillRectIndexBuffer = NULL; | 
|  | 923     if (!aaFillRectIndexBuffer) { | 
|  | 924         aaFillRectIndexBuffer = | 
|  | 925                 context->getGpu()->createInstancedIndexBuffer(gFillAARectIdx, | 
|  | 926                                                               kIndicesPerAAFillR
     ect, | 
|  | 927                                                               kNumAAFillRectsInI
     ndexBuffer, | 
|  | 928                                                               kVertsPerAAFillRec
     t); | 
|  | 929     } | 
|  | 930 | 
|  | 931     return AAFillRectBatch::Create(geo, aaFillRectIndexBuffer); | 
|  | 932 } | 
|  | 933 | 
|  | 934 BATCH_TEST_DEFINE(AAStrokeRectBatch) { | 
|  | 935     static GrIndexBuffer* aaMiterStrokeRectIndexBuffer = NULL; | 
|  | 936     static GrIndexBuffer* aaBevelStrokeRectIndexBuffer = NULL; | 
|  | 937 | 
|  | 938     bool miterStroke = random->nextBool(); | 
|  | 939 | 
|  | 940     GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&aaMiterStroke
     RectIndexBuffer, | 
|  | 941                                                                   &aaBevelStroke
     RectIndexBuffer, | 
|  | 942                                                                   context->getGp
     u(), | 
|  | 943                                                                   miterStroke); | 
|  | 944 | 
|  | 945     // Create mock stroke rect | 
|  | 946     SkRect outside = GrTest::TestRect(random); | 
|  | 947     SkScalar minDim = SkMinScalar(outside.width(), outside.height()); | 
|  | 948     SkScalar strokeWidth = minDim * 0.1f; | 
|  | 949     SkRect outsideAssist = outside; | 
|  | 950     outsideAssist.outset(strokeWidth, strokeWidth); | 
|  | 951     SkRect inside = outside; | 
|  | 952     inside.inset(strokeWidth, strokeWidth); | 
|  | 953 | 
|  | 954     AAStrokeRectBatch::Geometry geo; | 
|  | 955     geo.fColor = GrRandomColor(random); | 
|  | 956     geo.fDevOutside = outside; | 
|  | 957     geo.fDevOutsideAssist = outsideAssist; | 
|  | 958     geo.fDevInside = inside; | 
|  | 959     geo.fMiterStroke = miterStroke; | 
|  | 960 | 
|  | 961     return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random), indexBuffe
     r); | 
|  | 962 } | 
|  | 963 | 
|  | 964 #endif | 
| OLD | NEW | 
|---|