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 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
143 } | 143 } |
144 } | 144 } |
145 | 145 |
146 // use signed distance field to render | 146 // use signed distance field to render |
147 return this->internalDrawPath(target, pipelineBuilder, color, viewMatrix, pa th, pathData); | 147 return this->internalDrawPath(target, pipelineBuilder, color, viewMatrix, pa th, pathData); |
148 } | 148 } |
149 | 149 |
150 // padding around path bounds to allow for antialiased pixels | 150 // padding around path bounds to allow for antialiased pixels |
151 const SkScalar kAntiAliasPad = 1.0f; | 151 const SkScalar kAntiAliasPad = 1.0f; |
152 | 152 |
153 inline bool GrAADistanceFieldPathRenderer::uploadPath(GrPlot** plot, SkIPoint16* atlasLocation, | |
154 int width, int height, voi d* dfStorage) { | |
155 *plot = fAtlas->addToAtlas(&fPlotUsage, width, height, dfStorage, atlasLocat ion); | |
156 | |
157 // if atlas full | |
158 if (NULL == *plot) { | |
159 if (this->freeUnusedPlot()) { | |
160 *plot = fAtlas->addToAtlas(&fPlotUsage, width, height, dfStorage, at lasLocation); | |
161 if (*plot) { | |
162 return true; | |
163 } | |
164 } | |
165 | |
166 if (c_DumpPathCache) { | |
167 #ifdef SK_DEVELOPER | |
168 GrTexture* texture = fAtlas->getTexture(); | |
169 texture->surfacePriv().savePixels("pathcache.png"); | |
170 #endif | |
171 } | |
172 | |
173 // before we purge the cache, we must flush any accumulated draws | |
174 fContext->flush(); | |
175 | |
176 if (this->freeUnusedPlot()) { | |
177 *plot = fAtlas->addToAtlas(&fPlotUsage, width, height, dfStorage, at lasLocation); | |
178 if (*plot) { | |
179 return true; | |
180 } | |
181 } | |
182 return false; | |
183 } | |
184 return true; | |
185 } | |
186 | |
153 GrAADistanceFieldPathRenderer::PathData* GrAADistanceFieldPathRenderer::addPathT oAtlas( | 187 GrAADistanceFieldPathRenderer::PathData* GrAADistanceFieldPathRenderer::addPathT oAtlas( |
154 const Sk Path& path, | 188 const Sk Path& path, |
155 const Sk StrokeRec& stroke, | 189 const Sk StrokeRec& stroke, |
156 bool ant iAlias, | 190 bool ant iAlias, |
157 uint32_t dimension, | 191 uint32_t dimension, |
158 SkScalar scale) { | 192 SkScalar scale) { |
159 | 193 |
160 // generate distance field and add to atlas | 194 // generate distance field and add to atlas |
161 if (NULL == fAtlas) { | 195 if (NULL == fAtlas) { |
162 SkISize textureSize = SkISize::Make(ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_H EIGHT); | 196 SkISize textureSize = SkISize::Make(ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_H EIGHT); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 helper.draw(path, stroke, SkRegion::kReplace_Op, antiAlias, 0xFF); | 236 helper.draw(path, stroke, SkRegion::kReplace_Op, antiAlias, 0xFF); |
203 | 237 |
204 // generate signed distance field | 238 // generate signed distance field |
205 devPathBounds.outset(SK_DistanceFieldPad, SK_DistanceFieldPad); | 239 devPathBounds.outset(SK_DistanceFieldPad, SK_DistanceFieldPad); |
206 int width = devPathBounds.width(); | 240 int width = devPathBounds.width(); |
207 int height = devPathBounds.height(); | 241 int height = devPathBounds.height(); |
208 SkAutoSMalloc<1024> dfStorage(width*height*sizeof(unsigned char)); | 242 SkAutoSMalloc<1024> dfStorage(width*height*sizeof(unsigned char)); |
209 helper.toSDF((unsigned char*) dfStorage.get()); | 243 helper.toSDF((unsigned char*) dfStorage.get()); |
210 | 244 |
211 // add to atlas | 245 // add to atlas |
246 GrPlot* plot; | |
212 SkIPoint16 atlasLocation; | 247 SkIPoint16 atlasLocation; |
213 GrPlot* plot = fAtlas->addToAtlas(&fPlotUsage, width, height, dfStorage.get( ), | 248 if (!this->uploadPath(&plot, &atlasLocation, width, height, dfStorage.get()) ) { |
jvanverth1
2015/02/11 18:14:20
I think this should be okay -- but I would test on
| |
214 &atlasLocation); | |
215 | |
216 // if atlas full | |
217 if (NULL == plot) { | |
218 if (this->freeUnusedPlot()) { | |
219 plot = fAtlas->addToAtlas(&fPlotUsage, width, height, dfStorage.get( ), | |
220 &atlasLocation); | |
221 if (plot) { | |
222 goto HAS_ATLAS; | |
223 } | |
224 } | |
225 | |
226 if (c_DumpPathCache) { | |
227 #ifdef SK_DEVELOPER | |
228 GrTexture* texture = fAtlas->getTexture(); | |
229 texture->surfacePriv().savePixels("pathcache.png"); | |
230 #endif | |
231 } | |
232 | |
233 // before we purge the cache, we must flush any accumulated draws | |
234 fContext->flush(); | |
235 | |
236 if (this->freeUnusedPlot()) { | |
237 plot = fAtlas->addToAtlas(&fPlotUsage, width, height, dfStorage.get( ), | |
238 &atlasLocation); | |
239 if (plot) { | |
240 goto HAS_ATLAS; | |
241 } | |
242 } | |
243 | |
244 return NULL; | 249 return NULL; |
245 } | 250 } |
246 | 251 |
247 HAS_ATLAS: | |
248 // add to cache | 252 // add to cache |
249 PathData* pathData = SkNEW(PathData); | 253 PathData* pathData = SkNEW(PathData); |
250 pathData->fKey.fGenID = path.getGenerationID(); | 254 pathData->fKey.fGenID = path.getGenerationID(); |
251 pathData->fKey.fDimension = dimension; | 255 pathData->fKey.fDimension = dimension; |
252 pathData->fScale = scale; | 256 pathData->fScale = scale; |
253 pathData->fPlot = plot; | 257 pathData->fPlot = plot; |
254 // change the scaled rect to match the size of the inset distance field | 258 // change the scaled rect to match the size of the inset distance field |
255 scaledBounds.fRight = scaledBounds.fLeft + | 259 scaledBounds.fRight = scaledBounds.fLeft + |
256 SkIntToScalar(devPathBounds.width() - 2*SK_DistanceFieldInset); | 260 SkIntToScalar(devPathBounds.width() - 2*SK_DistanceFieldInset); |
257 scaledBounds.fBottom = scaledBounds.fTop + | 261 scaledBounds.fBottom = scaledBounds.fTop + |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
374 | 378 |
375 viewMatrix.mapRect(&r); | 379 viewMatrix.mapRect(&r); |
376 target->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); | 380 target->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
377 target->drawIndexedInstances(pipelineBuilder, fCachedGeometryProcessor.get() , | 381 target->drawIndexedInstances(pipelineBuilder, fCachedGeometryProcessor.get() , |
378 kTriangles_GrPrimitiveType, 1, 4, 6, &r); | 382 kTriangles_GrPrimitiveType, 1, 4, 6, &r); |
379 target->resetVertexSource(); | 383 target->resetVertexSource(); |
380 | 384 |
381 return true; | 385 return true; |
382 } | 386 } |
383 | 387 |
OLD | NEW |