| 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 |
| 11 #include "GrAtlas.h" | 11 #include "GrAtlas.h" |
| 12 #include "GrContext.h" | 12 #include "GrContext.h" |
| 13 #include "GrPipelineBuilder.h" | 13 #include "GrPipelineBuilder.h" |
| 14 #include "GrSurfacePriv.h" | 14 #include "GrSurfacePriv.h" |
| 15 #include "GrSWMaskHelper.h" | 15 #include "GrSWMaskHelper.h" |
| 16 #include "GrTexturePriv.h" | 16 #include "GrTexturePriv.h" |
| 17 #include "effects/GrDistanceFieldTextureEffect.h" | 17 #include "effects/GrDistanceFieldTextureEffect.h" |
| 18 | 18 |
| 19 #include "SkDistanceFieldGen.h" | 19 #include "SkDistanceFieldGen.h" |
| 20 #include "SkRTConf.h" | 20 #include "SkRTConf.h" |
| 21 | 21 |
| 22 #define ATLAS_TEXTURE_WIDTH 1024 | 22 #define ATLAS_TEXTURE_WIDTH 1024 |
| 23 #define ATLAS_TEXTURE_HEIGHT 2048 | 23 #define ATLAS_TEXTURE_HEIGHT 2048 |
| 24 #define PLOT_WIDTH 256 | 24 #define PLOT_WIDTH 256 |
| 25 #define PLOT_HEIGHT 256 | 25 #define PLOT_HEIGHT 256 |
| 26 | 26 |
| 27 #define NUM_PLOTS_X (ATLAS_TEXTURE_WIDTH / PLOT_WIDTH) | 27 #define NUM_PLOTS_X (ATLAS_TEXTURE_WIDTH / PLOT_WIDTH) |
| 28 #define NUM_PLOTS_Y (ATLAS_TEXTURE_HEIGHT / PLOT_HEIGHT) | 28 #define NUM_PLOTS_Y (ATLAS_TEXTURE_HEIGHT / PLOT_HEIGHT) |
| 29 | 29 |
| 30 SK_CONF_DECLARE(bool, c_DumpPathCache, "gpu.dumpPathCache", false, | 30 SK_CONF_DECLARE(bool, c_DumpPathCache, "gpu.dumpPathCache", false, |
| 31 "Dump the contents of the path cache before every purge."); | 31 "Dump the contents of the path cache before every purge."); |
| 32 | 32 |
| 33 #ifdef DF_PATH_TRACKING | 33 #ifdef DF_PATH_TRACKING |
| 34 static int g_NumCachedPaths = 0; | 34 static int g_NumCachedPaths = 0; |
| 35 static int g_NumFreedPaths = 0; | 35 static int g_NumFreedPaths = 0; |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335
params, | 335
params, |
| 336
flags, | 336
flags, |
| 337
false)); | 337
false)); |
| 338 fEffectFlags = flags; | 338 fEffectFlags = flags; |
| 339 } | 339 } |
| 340 | 340 |
| 341 void* vertices = NULL; | 341 void* vertices = NULL; |
| 342 bool success = target->reserveVertexAndIndexSpace(4, | 342 bool success = target->reserveVertexAndIndexSpace(4, |
| 343 fCachedGeometryProcessor->
getVertexStride(), | 343 fCachedGeometryProcessor->
getVertexStride(), |
| 344 0, &vertices, NULL); | 344 0, &vertices, NULL); |
| 345 SkASSERT(fCachedGeometryProcessor->getVertexStride() == sizeof(SkPoint) + si
zeof(SkIPoint16)); | 345 SkASSERT(fCachedGeometryProcessor->getVertexStride() == 2 * sizeof(SkPoint))
; |
| 346 GrAlwaysAssert(success); | 346 GrAlwaysAssert(success); |
| 347 | 347 |
| 348 SkScalar dx = pathData->fBounds.fLeft; | 348 SkScalar dx = pathData->fBounds.fLeft; |
| 349 SkScalar dy = pathData->fBounds.fTop; | 349 SkScalar dy = pathData->fBounds.fTop; |
| 350 // need to compute integer sizes for the glyph because we're using | 350 SkScalar width = pathData->fBounds.width(); |
| 351 // uint16_t tex coords and they need to lie on integer texel bounds | 351 SkScalar height = pathData->fBounds.height(); |
| 352 int iwidth = SkScalarCeilToInt(pathData->fBounds.width()); | |
| 353 int iheight = SkScalarCeilToInt(pathData->fBounds.height()); | |
| 354 // the quad rect before we scale needs to be the same size as the path data
in the atlas | |
| 355 SkScalar width = SkIntToScalar(iwidth); | |
| 356 SkScalar height = SkIntToScalar(iheight); | |
| 357 | 352 |
| 358 SkScalar invScale = 1.0f/pathData->fScale; | 353 SkScalar invScale = 1.0f/pathData->fScale; |
| 359 dx *= invScale; | 354 dx *= invScale; |
| 360 dy *= invScale; | 355 dy *= invScale; |
| 361 width *= invScale; | 356 width *= invScale; |
| 362 height *= invScale; | 357 height *= invScale; |
| 363 | 358 |
| 364 int u0 = pathData->fAtlasLocation.fX; | 359 SkFixed tx = SkIntToFixed(pathData->fAtlasLocation.fX); |
| 365 int v0 = pathData->fAtlasLocation.fY; | 360 SkFixed ty = SkIntToFixed(pathData->fAtlasLocation.fY); |
| 366 int u1 = u0 + iwidth; | 361 SkFixed tw = SkScalarToFixed(pathData->fBounds.width()); |
| 367 int v1 = v0 + iheight; | 362 SkFixed th = SkScalarToFixed(pathData->fBounds.height()); |
| 363 |
| 368 // vertex positions | 364 // vertex positions |
| 369 SkRect r = SkRect::MakeXYWH(dx, dy, width, height); | 365 SkRect r = SkRect::MakeXYWH(dx, dy, width, height); |
| 370 size_t vertSize = sizeof(SkPoint) + sizeof(SkIPoint16); | 366 size_t vertSize = 2 * sizeof(SkPoint); |
| 371 SkPoint* positions = reinterpret_cast<SkPoint*>(vertices); | 367 SkPoint* positions = reinterpret_cast<SkPoint*>(vertices); |
| 372 positions->setRectFan(r.left(), r.top(), r.right(), r.bottom(), vertSize); | 368 positions->setRectFan(r.left(), r.top(), r.right(), r.bottom(), vertSize); |
| 373 | 369 |
| 374 // vertex texture coords | 370 // vertex texture coords |
| 375 intptr_t textureCoords = reinterpret_cast<intptr_t>(positions) + vertSize -
sizeof(SkIPoint16); | 371 intptr_t intPtr = reinterpret_cast<intptr_t>(positions); |
| 376 ((SkIPoint16*)(textureCoords + 0 * vertSize))->set(u0, v0); | 372 SkPoint* textureCoords = reinterpret_cast<SkPoint*>(intPtr + vertSize - size
of(SkPoint)); |
| 377 ((SkIPoint16*)(textureCoords + 1 * vertSize))->set(u0, v1); | 373 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normalizeFix
edX(tx)), |
| 378 ((SkIPoint16*)(textureCoords + 2 * vertSize))->set(u1, v1); | 374 SkFixedToFloat(texture->texturePriv().normalizeFix
edY(ty)), |
| 379 ((SkIPoint16*)(textureCoords + 3 * vertSize))->set(u1, v0); | 375 SkFixedToFloat(texture->texturePriv().normalizeFix
edX(tx + tw)), |
| 376 SkFixedToFloat(texture->texturePriv().normalizeFix
edY(ty + th)), |
| 377 vertSize); |
| 380 | 378 |
| 381 viewMatrix.mapRect(&r); | 379 viewMatrix.mapRect(&r); |
| 382 target->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); | 380 target->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
| 383 target->drawIndexedInstances(pipelineBuilder, fCachedGeometryProcessor.get()
, | 381 target->drawIndexedInstances(pipelineBuilder, fCachedGeometryProcessor.get()
, |
| 384 kTriangles_GrPrimitiveType, 1, 4, 6, &r); | 382 kTriangles_GrPrimitiveType, 1, 4, 6, &r); |
| 385 target->resetVertexSource(); | 383 target->resetVertexSource(); |
| 386 | 384 |
| 387 return true; | 385 return true; |
| 388 } | 386 } |
| 389 | 387 |
| OLD | NEW |