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

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

Issue 791743003: Remove GP from drawstate, revision of invariant output for GP (Closed) Base URL: https://skia.googlesource.com/skia.git@color-to-gp
Patch Set: feedback inc Created 6 years 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
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 "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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698