OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "GrAADistanceFieldPathRenderer.h" | 9 #include "GrAADistanceFieldPathRenderer.h" |
10 | 10 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 params, | 205 params, |
206 flags, | 206 flags, |
207 this->usesLocalCoords())); | 207 this->usesLocalCoords())); |
208 | 208 |
209 target->initDraw(dfProcessor, this->pipeline()); | 209 target->initDraw(dfProcessor, this->pipeline()); |
210 | 210 |
211 FlushInfo flushInfo; | 211 FlushInfo flushInfo; |
212 | 212 |
213 // allocate vertices | 213 // allocate vertices |
214 size_t vertexStride = dfProcessor->getVertexStride(); | 214 size_t vertexStride = dfProcessor->getVertexStride(); |
215 SkASSERT(vertexStride == 2 * sizeof(SkPoint)); | 215 SkASSERT(vertexStride == 2 * sizeof(SkPoint) + sizeof(GrColor)); |
216 | 216 |
217 const GrVertexBuffer* vertexBuffer; | 217 const GrVertexBuffer* vertexBuffer; |
218 void* vertices = target->makeVertexSpace(vertexStride, | 218 void* vertices = target->makeVertexSpace(vertexStride, |
219 kVerticesPerQuad * instanceCoun t, | 219 kVerticesPerQuad * instanceCoun t, |
220 &vertexBuffer, | 220 &vertexBuffer, |
221 &flushInfo.fVertexOffset); | 221 &flushInfo.fVertexOffset); |
222 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); | 222 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); |
223 flushInfo.fIndexBuffer.reset(target->resourceProvider()->refQuadIndexBuf fer()); | 223 flushInfo.fIndexBuffer.reset(target->resourceProvider()->refQuadIndexBuf fer()); |
224 if (!vertices || !flushInfo.fIndexBuffer) { | 224 if (!vertices || !flushInfo.fIndexBuffer) { |
225 SkDebugf("Could not allocate vertices\n"); | 225 SkDebugf("Could not allocate vertices\n"); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
271 SkDebugf("Can't rasterize path\n"); | 271 SkDebugf("Can't rasterize path\n"); |
272 return; | 272 return; |
273 } | 273 } |
274 } | 274 } |
275 | 275 |
276 atlas->setLastUseToken(pathData->fID, target->currentToken()); | 276 atlas->setLastUseToken(pathData->fID, target->currentToken()); |
277 | 277 |
278 // Now set vertices | 278 // Now set vertices |
279 intptr_t offset = reinterpret_cast<intptr_t>(vertices); | 279 intptr_t offset = reinterpret_cast<intptr_t>(vertices); |
280 offset += i * kVerticesPerQuad * vertexStride; | 280 offset += i * kVerticesPerQuad * vertexStride; |
281 SkPoint* positions = reinterpret_cast<SkPoint*>(offset); | |
282 this->writePathVertices(target, | 281 this->writePathVertices(target, |
283 atlas, | 282 atlas, |
284 this->pipeline(), | 283 this->pipeline(), |
285 dfProcessor, | 284 dfProcessor, |
286 positions, | 285 offset, |
286 this->color(), | |
287 vertexStride, | 287 vertexStride, |
288 this->viewMatrix(), | 288 this->viewMatrix(), |
289 args.fPath, | 289 args.fPath, |
290 pathData); | 290 pathData); |
291 flushInfo.fInstancesToFlush++; | 291 flushInfo.fInstancesToFlush++; |
292 } | 292 } |
293 | 293 |
294 this->flush(target, &flushInfo); | 294 this->flush(target, &flushInfo); |
295 } | 295 } |
296 | 296 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
430 #ifdef DF_PATH_TRACKING | 430 #ifdef DF_PATH_TRACKING |
431 ++g_NumCachedPaths; | 431 ++g_NumCachedPaths; |
432 #endif | 432 #endif |
433 return true; | 433 return true; |
434 } | 434 } |
435 | 435 |
436 void writePathVertices(GrDrawBatch::Target* target, | 436 void writePathVertices(GrDrawBatch::Target* target, |
437 GrBatchAtlas* atlas, | 437 GrBatchAtlas* atlas, |
438 const GrPipeline* pipeline, | 438 const GrPipeline* pipeline, |
439 const GrGeometryProcessor* gp, | 439 const GrGeometryProcessor* gp, |
440 SkPoint* positions, | 440 intptr_t offset, |
441 GrColor color, | |
441 size_t vertexStride, | 442 size_t vertexStride, |
442 const SkMatrix& viewMatrix, | 443 const SkMatrix& viewMatrix, |
443 const SkPath& path, | 444 const SkPath& path, |
444 const PathData* pathData) const { | 445 const PathData* pathData) const { |
445 GrTexture* texture = atlas->getTexture(); | 446 GrTexture* texture = atlas->getTexture(); |
446 | 447 |
447 SkScalar dx = pathData->fBounds.fLeft; | 448 SkScalar dx = pathData->fBounds.fLeft; |
448 SkScalar dy = pathData->fBounds.fTop; | 449 SkScalar dy = pathData->fBounds.fTop; |
449 SkScalar width = pathData->fBounds.width(); | 450 SkScalar width = pathData->fBounds.width(); |
450 SkScalar height = pathData->fBounds.height(); | 451 SkScalar height = pathData->fBounds.height(); |
451 | 452 |
452 SkScalar invScale = 1.0f / pathData->fScale; | 453 SkScalar invScale = 1.0f / pathData->fScale; |
453 dx *= invScale; | 454 dx *= invScale; |
454 dy *= invScale; | 455 dy *= invScale; |
455 width *= invScale; | 456 width *= invScale; |
456 height *= invScale; | 457 height *= invScale; |
457 | 458 |
458 SkFixed tx = SkIntToFixed(pathData->fAtlasLocation.fX); | 459 SkFixed tx = SkIntToFixed(pathData->fAtlasLocation.fX); |
459 SkFixed ty = SkIntToFixed(pathData->fAtlasLocation.fY); | 460 SkFixed ty = SkIntToFixed(pathData->fAtlasLocation.fY); |
460 SkFixed tw = SkScalarToFixed(pathData->fBounds.width()); | 461 SkFixed tw = SkScalarToFixed(pathData->fBounds.width()); |
461 SkFixed th = SkScalarToFixed(pathData->fBounds.height()); | 462 SkFixed th = SkScalarToFixed(pathData->fBounds.height()); |
462 | 463 |
464 SkPoint* positions = reinterpret_cast<SkPoint*>(offset); | |
465 | |
463 // vertex positions | 466 // vertex positions |
464 // TODO make the vertex attributes a struct | 467 // TODO make the vertex attributes a struct |
465 SkRect r = SkRect::MakeXYWH(dx, dy, width, height); | 468 SkRect r = SkRect::MakeXYWH(dx, dy, width, height); |
466 positions->setRectFan(r.left(), r.top(), r.right(), r.bottom(), vertexSt ride); | 469 positions->setRectFan(r.left(), r.top(), r.right(), r.bottom(), vertexSt ride); |
467 | 470 |
471 // colors | |
472 for (int i = 0; i < kVerticesPerQuad; i++) { | |
473 GrColor* colorPtr = (GrColor*)(offset + sizeof(SkPoint) + i * vertex Stride); | |
474 *colorPtr = color; | |
475 } | |
476 | |
468 // vertex texture coords | 477 // vertex texture coords |
469 SkPoint* textureCoords = positions + 1; | 478 SkPoint* textureCoords = (SkPoint*)(offset + sizeof(SkPoint) + sizeof(Gr Color)); |
470 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx)), | 479 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx)), |
471 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty)), | 480 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty)), |
472 SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx + tw)), | 481 SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx + tw)), |
473 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty + th)), | 482 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty + th)), |
474 vertexStride); | 483 vertexStride); |
475 } | 484 } |
476 | 485 |
477 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { | 486 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { |
478 GrVertices vertices; | 487 GrVertices vertices; |
479 int maxInstancesPerDraw = flushInfo->fIndexBuffer->maxQuads(); | 488 int maxInstancesPerDraw = flushInfo->fIndexBuffer->maxQuads(); |
(...skipping 10 matching lines...) Expand all Loading... | |
490 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 499 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
491 | 500 |
492 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 501 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
493 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); | 502 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); |
494 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi peline(), | 503 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi peline(), |
495 that->bounds(), caps)) { | 504 that->bounds(), caps)) { |
496 return false; | 505 return false; |
497 } | 506 } |
498 | 507 |
499 // TODO we could actually probably do a bunch of this work on the CPU, i e map viewMatrix, | 508 // TODO we could actually probably do a bunch of this work on the CPU, i e map viewMatrix, |
500 // maybe upload color via attribute | 509 // maybe upload color via attribute |
bsalomon
2015/12/09 02:10:05
To answer my own question, we should delete this.
| |
501 if (this->color() != that->color()) { | 510 if (this->color() != that->color()) { |
502 return false; | 511 return false; |
503 } | 512 } |
504 | 513 |
505 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { | 514 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { |
506 return false; | 515 return false; |
507 } | 516 } |
508 | 517 |
509 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin()) ; | 518 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin()) ; |
510 this->joinBounds(that->bounds()); | 519 this->joinBounds(that->bounds()); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
633 geometry.fAntiAlias = random->nextBool(); | 642 geometry.fAntiAlias = random->nextBool(); |
634 geometry.fGenID = random->nextU(); | 643 geometry.fGenID = random->nextU(); |
635 | 644 |
636 return AADistanceFieldPathBatch::Create(geometry, color, viewMatrix, | 645 return AADistanceFieldPathBatch::Create(geometry, color, viewMatrix, |
637 gTestStruct.fAtlas, | 646 gTestStruct.fAtlas, |
638 &gTestStruct.fPathCache, | 647 &gTestStruct.fPathCache, |
639 &gTestStruct.fPathList); | 648 &gTestStruct.fPathList); |
640 } | 649 } |
641 | 650 |
642 #endif | 651 #endif |
OLD | NEW |