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

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

Issue 732693002: Drawstate on stack (Closed) Base URL: https://skia.googlesource.com/skia.git@real_def_gp
Patch Set: ready Created 6 years, 1 month 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"
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, 169 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
170 kIndicesPerBevelStrokeRect, 170 kIndicesPerBevelStrokeRect,
171 kNumBevelStrokeRectsInIndex Buffer, 171 kNumBevelStrokeRectsInIndex Buffer,
172 kVertsPerBevelStrokeRect); 172 kVertsPerBevelStrokeRect);
173 } 173 }
174 return fAABevelStrokeRectIndexBuffer; 174 return fAABevelStrokeRectIndexBuffer;
175 } 175 }
176 } 176 }
177 177
178 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, 178 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target,
179 GrDrawState* drawState,
179 const SkRect& rect, 180 const SkRect& rect,
180 const SkMatrix& combinedMatrix, 181 const SkMatrix& combinedMatrix,
181 const SkRect& devRect) { 182 const SkRect& devRect) {
182 GrDrawState* drawState = target->drawState();
183 GrDrawState::AutoRestoreEffects are(drawState); 183 GrDrawState::AutoRestoreEffects are(drawState);
184 184
185 GrColor color = drawState->getColor(); 185 GrColor color = drawState->getColor();
186 186
187 CoverageAttribType covAttribType = set_rect_attribs(drawState); 187 CoverageAttribType covAttribType = set_rect_attribs(drawState);
188 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { 188 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) {
189 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 189 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
190 } 190 }
191 191
192 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); 192 GrDrawTarget::AutoReleaseGeometry geo(target, 8, drawState->getVertexStride( ), 0);
193 if (!geo.succeeded()) { 193 if (!geo.succeeded()) {
194 SkDebugf("Failed to get space for vertices!\n"); 194 SkDebugf("Failed to get space for vertices!\n");
195 return; 195 return;
196 } 196 }
197 197
198 if (NULL == fAAFillRectIndexBuffer) { 198 if (NULL == fAAFillRectIndexBuffer) {
199 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx , 199 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx ,
200 kIndicesPerAAF illRect, 200 kIndicesPerAAF illRect,
201 kNumAAFillRect sInIndexBuffer, 201 kNumAAFillRect sInIndexBuffer,
202 kVertsPerAAFil lRect); 202 kVertsPerAAFil lRect);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 for (int i = 0; i < 4; ++i) { 292 for (int i = 0; i < 4; ++i) {
293 if (kUseCoverage_CoverageAttribType == covAttribType) { 293 if (kUseCoverage_CoverageAttribType == covAttribType) {
294 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; 294 *reinterpret_cast<GrColor*>(verts + i * vstride) = color;
295 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage; 295 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage;
296 } else { 296 } else {
297 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor; 297 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor;
298 } 298 }
299 } 299 }
300 300
301 target->setIndexSourceToBuffer(indexBuffer); 301 target->setIndexSourceToBuffer(indexBuffer);
302 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 302 target->drawIndexedInstances(drawState,
303 kTriangles_GrPrimitiveType,
304 1,
303 kVertsPerAAFillRect, 305 kVertsPerAAFillRect,
304 kIndicesPerAAFillRect); 306 kIndicesPerAAFillRect);
305 target->resetIndexSource(); 307 target->resetIndexSource();
306 } 308 }
307 309
308 void GrAARectRenderer::strokeAARect(GrDrawTarget* target, 310 void GrAARectRenderer::strokeAARect(GrDrawTarget* target,
311 GrDrawState* drawState,
309 const SkRect& rect, 312 const SkRect& rect,
310 const SkMatrix& combinedMatrix, 313 const SkMatrix& combinedMatrix,
311 const SkRect& devRect, 314 const SkRect& devRect,
312 const SkStrokeRec& stroke) { 315 const SkStrokeRec& stroke) {
313 SkVector devStrokeSize; 316 SkVector devStrokeSize;
314 SkScalar width = stroke.getWidth(); 317 SkScalar width = stroke.getWidth();
315 if (width > 0) { 318 if (width > 0) {
316 devStrokeSize.set(width, width); 319 devStrokeSize.set(width, width);
317 combinedMatrix.mapVectors(&devStrokeSize, 1); 320 combinedMatrix.mapVectors(&devStrokeSize, 1);
318 devStrokeSize.setAbs(devStrokeSize); 321 devStrokeSize.setAbs(devStrokeSize);
(...skipping 26 matching lines...) Expand all
345 348
346 bool miterStroke = true; 349 bool miterStroke = true;
347 // For hairlines, make bevel and round joins appear the same as mitered ones . 350 // For hairlines, make bevel and round joins appear the same as mitered ones .
348 // small miter limit means right angles show bevel... 351 // small miter limit means right angles show bevel...
349 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || 352 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join ||
350 stroke.getMiter() < SK_ScalarSqrt2)) { 353 stroke.getMiter() < SK_ScalarSqrt2)) {
351 miterStroke = false; 354 miterStroke = false;
352 } 355 }
353 356
354 if (spare <= 0 && miterStroke) { 357 if (spare <= 0 && miterStroke) {
355 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside); 358 this->fillAARect(target, drawState, devOutside, SkMatrix::I(), devOutsid e);
356 return; 359 return;
357 } 360 }
358 361
359 SkRect devInside(devRect); 362 SkRect devInside(devRect);
360 devInside.inset(rx, ry); 363 devInside.inset(rx, ry);
361 364
362 SkRect devOutsideAssist(devRect); 365 SkRect devOutsideAssist(devRect);
363 366
364 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) 367 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist)
365 // to draw the outer of the rect. Because there are 8 vertices on the outer 368 // to draw the outer of the rect. Because there are 8 vertices on the outer
366 // edge, while vertex number of inner edge is 4, the same as miter-stroke. 369 // edge, while vertex number of inner edge is 4, the same as miter-stroke.
367 if (!miterStroke) { 370 if (!miterStroke) {
368 devOutside.inset(0, ry); 371 devOutside.inset(0, ry);
369 devOutsideAssist.outset(0, ry); 372 devOutsideAssist.outset(0, ry);
370 } 373 }
371 374
372 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside, miterStroke); 375 this->geometryStrokeAARect(target, drawState, devOutside, devOutsideAssist, devInside,
376 miterStroke);
373 } 377 }
374 378
375 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, 379 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
380 GrDrawState* drawState,
376 const SkRect& devOutside, 381 const SkRect& devOutside,
377 const SkRect& devOutsideAssist, 382 const SkRect& devOutsideAssist,
378 const SkRect& devInside, 383 const SkRect& devInside,
379 bool miterStroke) { 384 bool miterStroke) {
380 GrDrawState* drawState = target->drawState();
381 GrDrawState::AutoRestoreEffects are(drawState); 385 GrDrawState::AutoRestoreEffects are(drawState);
382
383 CoverageAttribType covAttribType = set_rect_attribs(drawState); 386 CoverageAttribType covAttribType = set_rect_attribs(drawState);
384 387
385 GrColor color = drawState->getColor(); 388 GrColor color = drawState->getColor();
386 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { 389 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) {
387 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 390 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
388 } 391 }
389 392
390 int innerVertexNum = 4; 393 int innerVertexNum = 4;
391 int outerVertexNum = miterStroke ? 4 : 8; 394 int outerVertexNum = miterStroke ? 4 : 8;
392 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; 395 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2;
393 396
394 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); 397 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, drawState->ge tVertexStride(), 0);
395 if (!geo.succeeded()) { 398 if (!geo.succeeded()) {
396 SkDebugf("Failed to get space for vertices!\n"); 399 SkDebugf("Failed to get space for vertices!\n");
397 return; 400 return;
398 } 401 }
399 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); 402 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke);
400 if (NULL == indexBuffer) { 403 if (NULL == indexBuffer) {
401 SkDebugf("Failed to create index buffer!\n"); 404 SkDebugf("Failed to create index buffer!\n");
402 return; 405 return;
403 } 406 }
404 407
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 for (int i = 0; i < innerVertexNum; ++i) { 494 for (int i = 0; i < innerVertexNum; ++i) {
492 if (kUseCoverage_CoverageAttribType == covAttribType) { 495 if (kUseCoverage_CoverageAttribType == covAttribType) {
493 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; 496 *reinterpret_cast<GrColor*>(verts + i * vstride) = color;
494 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0; 497 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0;
495 } else { 498 } else {
496 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; 499 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0;
497 } 500 }
498 } 501 }
499 502
500 target->setIndexSourceToBuffer(indexBuffer); 503 target->setIndexSourceToBuffer(indexBuffer);
501 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 504 target->drawIndexedInstances(drawState,
502 totalVertexNum, aa_stroke_rect_index_count(mite rStroke)); 505 kTriangles_GrPrimitiveType,
506 1,
507 totalVertexNum,
508 aa_stroke_rect_index_count(miterStroke));
503 target->resetIndexSource(); 509 target->resetIndexSource();
504 } 510 }
505 511
506 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target, 512 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target,
513 GrDrawState* drawState,
507 const SkRect rects[2], 514 const SkRect rects[2],
508 const SkMatrix& combinedMatrix) { 515 const SkMatrix& combinedMatrix) {
509 SkASSERT(combinedMatrix.rectStaysRect()); 516 SkASSERT(combinedMatrix.rectStaysRect());
510 SkASSERT(!rects[1].isEmpty()); 517 SkASSERT(!rects[1].isEmpty());
511 518
512 SkRect devOutside, devOutsideAssist, devInside; 519 SkRect devOutside, devOutsideAssist, devInside;
513 combinedMatrix.mapRect(&devOutside, rects[0]); 520 combinedMatrix.mapRect(&devOutside, rects[0]);
514 // can't call mapRect for devInside since it calls sort 521 // can't call mapRect for devInside since it calls sort
515 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; 522 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ;
516 523
517 if (devInside.isEmpty()) { 524 if (devInside.isEmpty()) {
518 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside); 525 this->fillAARect(target, drawState, devOutside, SkMatrix::I(), devOutsid e);
519 return; 526 return;
520 } 527 }
521 528
522 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside, true); 529 this->geometryStrokeAARect(target, drawState, devOutside, devOutsideAssist, devInside, true);
523 } 530 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698