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 "GrDefaultGeoProcFactory.h" | 9 #include "GrDefaultGeoProcFactory.h" |
10 #include "GrGeometryProcessor.h" | 10 #include "GrGeometryProcessor.h" |
11 #include "GrGpu.h" | 11 #include "GrGpu.h" |
12 #include "GrInvariantOutput.h" | 12 #include "GrInvariantOutput.h" |
13 #include "SkColorPriv.h" | 13 #include "SkColorPriv.h" |
14 #include "gl/GrGLProcessor.h" | 14 #include "gl/GrGLProcessor.h" |
15 #include "gl/GrGLGeometryProcessor.h" | 15 #include "gl/GrGLGeometryProcessor.h" |
16 #include "gl/builders/GrGLProgramBuilder.h" | 16 #include "gl/builders/GrGLProgramBuilder.h" |
17 | 17 |
18 /////////////////////////////////////////////////////////////////////////////// | 18 /////////////////////////////////////////////////////////////////////////////// |
19 | 19 |
20 namespace { | 20 namespace { |
21 // Should the coverage be multiplied into the color attrib or use a separate att rib. | 21 // Should the coverage be multiplied into the color attrib or use a separate att rib. |
22 enum CoverageAttribType { | 22 enum CoverageAttribType { |
23 kUseColor_CoverageAttribType, | 23 kUseColor_CoverageAttribType, |
24 kUseCoverage_CoverageAttribType, | 24 kUseCoverage_CoverageAttribType, |
25 }; | 25 }; |
26 } | 26 } |
27 | 27 |
28 static CoverageAttribType set_rect_attribs(GrDrawState* drawState, GrColor color ) { | 28 static const GrGeometryProcessor* create_rect_gp(const GrDrawState* drawState, G rColor color, |
bsalomon
2014/12/10 18:44:31
pass ds by ref?
| |
29 CoverageAttribType* type) { | |
29 uint32_t flags = GrDefaultGeoProcFactory::kColor_GPType; | 30 uint32_t flags = GrDefaultGeoProcFactory::kColor_GPType; |
31 const GrGeometryProcessor* gp; | |
30 if (drawState->canTweakAlphaForCoverage()) { | 32 if (drawState->canTweakAlphaForCoverage()) { |
31 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(color, f lags))->unref(); | 33 gp = GrDefaultGeoProcFactory::Create(color, flags); |
32 SkASSERT(drawState->getGeometryProcessor()->getVertexStride() == | 34 SkASSERT(gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::Positi onColorAttr)); |
33 sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); | 35 *type = kUseColor_CoverageAttribType; |
34 return kUseColor_CoverageAttribType; | |
35 } else { | 36 } else { |
36 flags |= GrDefaultGeoProcFactory::kCoverage_GPType; | 37 flags |= GrDefaultGeoProcFactory::kCoverage_GPType; |
37 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(color, f lags))->unref(); | 38 gp = GrDefaultGeoProcFactory::Create(color, flags); |
38 SkASSERT(drawState->getGeometryProcessor()->getVertexStride() == | 39 SkASSERT(gp->getVertexStride()==sizeof(GrDefaultGeoProcFactory::Position ColorCoverageAttr)); |
39 sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); | 40 *type = kUseCoverage_CoverageAttribType; |
40 return kUseCoverage_CoverageAttribType; | |
41 } | 41 } |
42 return gp; | |
42 } | 43 } |
43 | 44 |
44 static void set_inset_fan(SkPoint* pts, size_t stride, | 45 static void set_inset_fan(SkPoint* pts, size_t stride, |
45 const SkRect& r, SkScalar dx, SkScalar dy) { | 46 const SkRect& r, SkScalar dx, SkScalar dy) { |
46 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 47 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
47 r.fRight - dx, r.fBottom - dy, stride); | 48 r.fRight - dx, r.fBottom - dy, stride); |
48 } | 49 } |
49 | 50 |
50 void GrAARectRenderer::reset() { | 51 void GrAARectRenderer::reset() { |
51 SkSafeSetNull(fAAFillRectIndexBuffer); | 52 SkSafeSetNull(fAAFillRectIndexBuffer); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
175 } | 176 } |
176 | 177 |
177 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, | 178 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, |
178 GrDrawState* drawState, | 179 GrDrawState* drawState, |
179 GrColor color, | 180 GrColor color, |
180 const SkRect& rect, | 181 const SkRect& rect, |
181 const SkMatrix& combinedMatrix, | 182 const SkMatrix& combinedMatrix, |
182 const SkRect& devRect) { | 183 const SkRect& devRect) { |
183 GrDrawState::AutoRestoreEffects are(drawState); | 184 GrDrawState::AutoRestoreEffects are(drawState); |
184 | 185 |
185 CoverageAttribType covAttribType = set_rect_attribs(drawState, color); | 186 CoverageAttribType type; |
186 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { | 187 SkAutoTUnref<const GrGeometryProcessor> gp(create_rect_gp(drawState, color, &type)); |
188 if (kUseCoverage_CoverageAttribType == type && GrColorIsOpaque(color)) { | |
187 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | 189 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
188 } | 190 } |
189 | 191 |
190 size_t vstride = drawState->getGeometryProcessor()->getVertexStride(); | 192 size_t vertexStride = gp->getVertexStride(); |
191 GrDrawTarget::AutoReleaseGeometry geo(target, 8, vstride, 0); | 193 GrDrawTarget::AutoReleaseGeometry geo(target, 8, vertexStride, 0); |
192 if (!geo.succeeded()) { | 194 if (!geo.succeeded()) { |
193 SkDebugf("Failed to get space for vertices!\n"); | 195 SkDebugf("Failed to get space for vertices!\n"); |
194 return; | 196 return; |
195 } | 197 } |
196 | 198 |
197 if (NULL == fAAFillRectIndexBuffer) { | 199 if (NULL == fAAFillRectIndexBuffer) { |
198 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx , | 200 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx , |
199 kIndicesPerAAF illRect, | 201 kIndicesPerAAF illRect, |
200 kNumAAFillRect sInIndexBuffer, | 202 kNumAAFillRect sInIndexBuffer, |
201 kVertsPerAAFil lRect); | 203 kVertsPerAAFil lRect); |
202 } | 204 } |
203 GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer; | 205 GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer; |
204 if (NULL == indexBuffer) { | 206 if (NULL == indexBuffer) { |
205 SkDebugf("Failed to create index buffer!\n"); | 207 SkDebugf("Failed to create index buffer!\n"); |
206 return; | 208 return; |
207 } | 209 } |
208 | 210 |
209 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 211 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
210 | 212 |
211 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 213 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
212 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vstride); | 214 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vertexStride); |
213 | 215 |
214 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); | 216 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); |
215 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); | 217 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); |
216 | 218 |
217 if (combinedMatrix.rectStaysRect()) { | 219 if (combinedMatrix.rectStaysRect()) { |
218 // Temporarily #if'ed out. We don't want to pass in the devRect but | 220 // Temporarily #if'ed out. We don't want to pass in the devRect but |
219 // right now it is computed in GrContext::apply_aa_to_rect and we don't | 221 // right now it is computed in GrContext::apply_aa_to_rect and we don't |
220 // want to throw away the work | 222 // want to throw away the work |
221 #if 0 | 223 #if 0 |
222 SkRect devRect; | 224 SkRect devRect; |
223 combinedMatrix.mapRect(&devRect, rect); | 225 combinedMatrix.mapRect(&devRect, rect); |
224 #endif | 226 #endif |
225 | 227 |
226 set_inset_fan(fan0Pos, vstride, devRect, -SK_ScalarHalf, -SK_ScalarHalf) ; | 228 set_inset_fan(fan0Pos, vertexStride, devRect, -SK_ScalarHalf, -SK_Scalar Half); |
227 set_inset_fan(fan1Pos, vstride, devRect, inset, inset); | 229 set_inset_fan(fan1Pos, vertexStride, devRect, inset, inset); |
228 } else { | 230 } else { |
229 // compute transformed (1, 0) and (0, 1) vectors | 231 // compute transformed (1, 0) and (0, 1) vectors |
230 SkVector vec[2] = { | 232 SkVector vec[2] = { |
231 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY ] }, | 233 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY ] }, |
232 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale Y] } | 234 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale Y] } |
233 }; | 235 }; |
234 | 236 |
235 vec[0].normalize(); | 237 vec[0].normalize(); |
236 vec[0].scale(SK_ScalarHalf); | 238 vec[0].scale(SK_ScalarHalf); |
237 vec[1].normalize(); | 239 vec[1].normalize(); |
238 vec[1].scale(SK_ScalarHalf); | 240 vec[1].scale(SK_ScalarHalf); |
239 | 241 |
240 // create the rotated rect | 242 // create the rotated rect |
241 fan0Pos->setRectFan(rect.fLeft, rect.fTop, | 243 fan0Pos->setRectFan(rect.fLeft, rect.fTop, |
242 rect.fRight, rect.fBottom, vstride); | 244 rect.fRight, rect.fBottom, vertexStride); |
243 combinedMatrix.mapPointsWithStride(fan0Pos, vstride, 4); | 245 combinedMatrix.mapPointsWithStride(fan0Pos, vertexStride, 4); |
244 | 246 |
245 // Now create the inset points and then outset the original | 247 // Now create the inset points and then outset the original |
246 // rotated points | 248 // rotated points |
247 | 249 |
248 // TL | 250 // TL |
249 *((SkPoint*)((intptr_t)fan1Pos + 0 * vstride)) = | 251 *((SkPoint*)((intptr_t)fan1Pos + 0 * vertexStride)) = |
250 *((SkPoint*)((intptr_t)fan0Pos + 0 * vstride)) + vec[0] + vec[1]; | 252 *((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) + vec[0] + vec[1 ]; |
251 *((SkPoint*)((intptr_t)fan0Pos + 0 * vstride)) -= vec[0] + vec[1]; | 253 *((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) -= vec[0] + vec[1]; |
252 // BL | 254 // BL |
253 *((SkPoint*)((intptr_t)fan1Pos + 1 * vstride)) = | 255 *((SkPoint*)((intptr_t)fan1Pos + 1 * vertexStride)) = |
254 *((SkPoint*)((intptr_t)fan0Pos + 1 * vstride)) + vec[0] - vec[1]; | 256 *((SkPoint*)((intptr_t)fan0Pos + 1 * vertexStride)) + vec[0] - vec[1 ]; |
255 *((SkPoint*)((intptr_t)fan0Pos + 1 * vstride)) -= vec[0] - vec[1]; | 257 *((SkPoint*)((intptr_t)fan0Pos + 1 * vertexStride)) -= vec[0] - vec[1]; |
256 // BR | 258 // BR |
257 *((SkPoint*)((intptr_t)fan1Pos + 2 * vstride)) = | 259 *((SkPoint*)((intptr_t)fan1Pos + 2 * vertexStride)) = |
258 *((SkPoint*)((intptr_t)fan0Pos + 2 * vstride)) - vec[0] - vec[1]; | 260 *((SkPoint*)((intptr_t)fan0Pos + 2 * vertexStride)) - vec[0] - vec[1 ]; |
259 *((SkPoint*)((intptr_t)fan0Pos + 2 * vstride)) += vec[0] + vec[1]; | 261 *((SkPoint*)((intptr_t)fan0Pos + 2 * vertexStride)) += vec[0] + vec[1]; |
260 // TR | 262 // TR |
261 *((SkPoint*)((intptr_t)fan1Pos + 3 * vstride)) = | 263 *((SkPoint*)((intptr_t)fan1Pos + 3 * vertexStride)) = |
262 *((SkPoint*)((intptr_t)fan0Pos + 3 * vstride)) - vec[0] + vec[1]; | 264 *((SkPoint*)((intptr_t)fan0Pos + 3 * vertexStride)) - vec[0] + vec[1 ]; |
263 *((SkPoint*)((intptr_t)fan0Pos + 3 * vstride)) += vec[0] - vec[1]; | 265 *((SkPoint*)((intptr_t)fan0Pos + 3 * vertexStride)) += vec[0] - vec[1]; |
264 } | 266 } |
265 | 267 |
266 // Make verts point to vertex color and then set all the color and coverage vertex attrs values. | 268 // Make verts point to vertex color and then set all the color and coverage vertex attrs values. |
267 verts += sizeof(SkPoint); | 269 verts += sizeof(SkPoint); |
268 for (int i = 0; i < 4; ++i) { | 270 for (int i = 0; i < 4; ++i) { |
269 if (kUseCoverage_CoverageAttribType == covAttribType) { | 271 if (kUseCoverage_CoverageAttribType == type) { |
270 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; | 272 *reinterpret_cast<GrColor*>(verts + i * vertexStride) = color; |
271 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = 0 ; | 273 *reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor) ) = 0; |
272 } else { | 274 } else { |
273 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; | 275 *reinterpret_cast<GrColor*>(verts + i * vertexStride) = 0; |
274 } | 276 } |
275 } | 277 } |
276 | 278 |
277 int scale; | 279 int scale; |
278 if (inset < SK_ScalarHalf) { | 280 if (inset < SK_ScalarHalf) { |
279 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 281 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
280 SkASSERT(scale >= 0 && scale <= 255); | 282 SkASSERT(scale >= 0 && scale <= 255); |
281 } else { | 283 } else { |
282 scale = 0xff; | 284 scale = 0xff; |
283 } | 285 } |
284 | 286 |
285 verts += 4 * vstride; | 287 verts += 4 * vertexStride; |
286 | 288 |
287 float innerCoverage = GrNormalizeByteToFloat(scale); | 289 float innerCoverage = GrNormalizeByteToFloat(scale); |
288 GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale); | 290 GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
289 | 291 |
290 for (int i = 0; i < 4; ++i) { | 292 for (int i = 0; i < 4; ++i) { |
291 if (kUseCoverage_CoverageAttribType == covAttribType) { | 293 if (kUseCoverage_CoverageAttribType == type) { |
292 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; | 294 *reinterpret_cast<GrColor*>(verts + i * vertexStride) = color; |
293 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage; | 295 *reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor) ) = innerCoverage; |
294 } else { | 296 } else { |
295 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor; | 297 *reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor; |
296 } | 298 } |
297 } | 299 } |
298 | 300 |
299 target->setIndexSourceToBuffer(indexBuffer); | 301 target->setIndexSourceToBuffer(indexBuffer); |
300 target->drawIndexedInstances(drawState, | 302 target->drawIndexedInstances(drawState, |
303 gp, | |
301 kTriangles_GrPrimitiveType, | 304 kTriangles_GrPrimitiveType, |
302 1, | 305 1, |
303 kVertsPerAAFillRect, | 306 kVertsPerAAFillRect, |
304 kIndicesPerAAFillRect); | 307 kIndicesPerAAFillRect); |
305 target->resetIndexSource(); | 308 target->resetIndexSource(); |
306 } | 309 } |
307 | 310 |
308 void GrAARectRenderer::strokeAARect(GrDrawTarget* target, | 311 void GrAARectRenderer::strokeAARect(GrDrawTarget* target, |
309 GrDrawState* drawState, | 312 GrDrawState* drawState, |
310 GrColor color, | 313 GrColor color, |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
376 } | 379 } |
377 | 380 |
378 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, | 381 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, |
379 GrDrawState* drawState, | 382 GrDrawState* drawState, |
380 GrColor color, | 383 GrColor color, |
381 const SkRect& devOutside, | 384 const SkRect& devOutside, |
382 const SkRect& devOutsideAssist, | 385 const SkRect& devOutsideAssist, |
383 const SkRect& devInside, | 386 const SkRect& devInside, |
384 bool miterStroke) { | 387 bool miterStroke) { |
385 GrDrawState::AutoRestoreEffects are(drawState); | 388 GrDrawState::AutoRestoreEffects are(drawState); |
386 CoverageAttribType covAttribType = set_rect_attribs(drawState, color); | |
387 | 389 |
388 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { | 390 CoverageAttribType type; |
391 SkAutoTUnref<const GrGeometryProcessor> gp(create_rect_gp(drawState, color, &type)); | |
392 | |
393 if (kUseCoverage_CoverageAttribType == type && GrColorIsOpaque(color)) { | |
389 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | 394 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
390 } | 395 } |
391 | 396 |
392 int innerVertexNum = 4; | 397 int innerVertexNum = 4; |
393 int outerVertexNum = miterStroke ? 4 : 8; | 398 int outerVertexNum = miterStroke ? 4 : 8; |
394 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; | 399 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; |
395 | 400 |
396 size_t vstride = drawState->getGeometryProcessor()->getVertexStride(); | 401 size_t vstride = gp->getVertexStride(); |
397 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, vstride, 0); | 402 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, vstride, 0); |
398 if (!geo.succeeded()) { | 403 if (!geo.succeeded()) { |
399 SkDebugf("Failed to get space for vertices!\n"); | 404 SkDebugf("Failed to get space for vertices!\n"); |
400 return; | 405 return; |
401 } | 406 } |
402 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); | 407 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); |
403 if (NULL == indexBuffer) { | 408 if (NULL == indexBuffer) { |
404 SkDebugf("Failed to create index buffer!\n"); | 409 SkDebugf("Failed to create index buffer!\n"); |
405 return; | 410 return; |
406 } | 411 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 // inner one of the inner two | 456 // inner one of the inner two |
452 set_inset_fan(fan2Pos, vstride, devInside, -inset, -inset); | 457 set_inset_fan(fan2Pos, vstride, devInside, -inset, -inset); |
453 // innermost | 458 // innermost |
454 set_inset_fan(fan3Pos, vstride, devInside, SK_ScalarHalf, SK_ScalarHa lf); | 459 set_inset_fan(fan3Pos, vstride, devInside, SK_ScalarHalf, SK_ScalarHa lf); |
455 } | 460 } |
456 | 461 |
457 // Make verts point to vertex color and then set all the color and coverage vertex attrs values. | 462 // Make verts point to vertex color and then set all the color and coverage vertex attrs values. |
458 // The outermost rect has 0 coverage | 463 // The outermost rect has 0 coverage |
459 verts += sizeof(SkPoint); | 464 verts += sizeof(SkPoint); |
460 for (int i = 0; i < outerVertexNum; ++i) { | 465 for (int i = 0; i < outerVertexNum; ++i) { |
461 if (kUseCoverage_CoverageAttribType == covAttribType) { | 466 if (kUseCoverage_CoverageAttribType == type) { |
462 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; | 467 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
463 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = 0 ; | 468 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = 0 ; |
464 } else { | 469 } else { |
465 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; | 470 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; |
466 } | 471 } |
467 } | 472 } |
468 | 473 |
469 // scale is the coverage for the the inner two rects. | 474 // scale is the coverage for the the inner two rects. |
470 int scale; | 475 int scale; |
471 if (inset < SK_ScalarHalf) { | 476 if (inset < SK_ScalarHalf) { |
472 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 477 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
473 SkASSERT(scale >= 0 && scale <= 255); | 478 SkASSERT(scale >= 0 && scale <= 255); |
474 } else { | 479 } else { |
475 scale = 0xff; | 480 scale = 0xff; |
476 } | 481 } |
477 | 482 |
478 float innerCoverage = GrNormalizeByteToFloat(scale); | 483 float innerCoverage = GrNormalizeByteToFloat(scale); |
479 GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale); | 484 GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
480 | 485 |
481 verts += outerVertexNum * vstride; | 486 verts += outerVertexNum * vstride; |
482 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { | 487 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
483 if (kUseCoverage_CoverageAttribType == covAttribType) { | 488 if (kUseCoverage_CoverageAttribType == type) { |
484 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; | 489 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
485 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage; | 490 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage; |
486 } else { | 491 } else { |
487 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor; | 492 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor; |
488 } | 493 } |
489 } | 494 } |
490 | 495 |
491 // The innermost rect has 0 coverage | 496 // The innermost rect has 0 coverage |
492 verts += (outerVertexNum + innerVertexNum) * vstride; | 497 verts += (outerVertexNum + innerVertexNum) * vstride; |
493 for (int i = 0; i < innerVertexNum; ++i) { | 498 for (int i = 0; i < innerVertexNum; ++i) { |
494 if (kUseCoverage_CoverageAttribType == covAttribType) { | 499 if (kUseCoverage_CoverageAttribType == type) { |
495 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; | 500 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
496 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0; | 501 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0; |
497 } else { | 502 } else { |
498 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; | 503 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; |
499 } | 504 } |
500 } | 505 } |
501 | 506 |
502 target->setIndexSourceToBuffer(indexBuffer); | 507 target->setIndexSourceToBuffer(indexBuffer); |
503 target->drawIndexedInstances(drawState, | 508 target->drawIndexedInstances(drawState, |
509 gp, | |
504 kTriangles_GrPrimitiveType, | 510 kTriangles_GrPrimitiveType, |
505 1, | 511 1, |
506 totalVertexNum, | 512 totalVertexNum, |
507 aa_stroke_rect_index_count(miterStroke)); | 513 aa_stroke_rect_index_count(miterStroke)); |
508 target->resetIndexSource(); | 514 target->resetIndexSource(); |
509 } | 515 } |
510 | 516 |
511 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target, | 517 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target, |
512 GrDrawState* drawState, | 518 GrDrawState* drawState, |
513 GrColor color, | 519 GrColor color, |
514 const SkRect rects[2], | 520 const SkRect rects[2], |
515 const SkMatrix& combinedMatrix) { | 521 const SkMatrix& combinedMatrix) { |
516 SkASSERT(combinedMatrix.rectStaysRect()); | 522 SkASSERT(combinedMatrix.rectStaysRect()); |
517 SkASSERT(!rects[1].isEmpty()); | 523 SkASSERT(!rects[1].isEmpty()); |
518 | 524 |
519 SkRect devOutside, devOutsideAssist, devInside; | 525 SkRect devOutside, devOutsideAssist, devInside; |
520 combinedMatrix.mapRect(&devOutside, rects[0]); | 526 combinedMatrix.mapRect(&devOutside, rects[0]); |
521 // can't call mapRect for devInside since it calls sort | 527 // can't call mapRect for devInside since it calls sort |
522 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; | 528 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; |
523 | 529 |
524 if (devInside.isEmpty()) { | 530 if (devInside.isEmpty()) { |
525 this->fillAARect(target, drawState, color, devOutside, SkMatrix::I(), de vOutside); | 531 this->fillAARect(target, drawState, color, devOutside, SkMatrix::I(), de vOutside); |
526 return; | 532 return; |
527 } | 533 } |
528 | 534 |
529 this->geometryStrokeAARect(target, drawState, color, devOutside, devOutsideA ssist, devInside, | 535 this->geometryStrokeAARect(target, drawState, color, devOutside, devOutsideA ssist, devInside, |
530 true); | 536 true); |
531 } | 537 } |
OLD | NEW |