GrPlot* GrAtlas::addToAtlas(ClientPlotUsage* usage, int width, int height, const void* image, SkIPoint16* loc) { // iterate through entire plot list for this atlas, see if we can find a hole // last one was most recently added and probably most empty for (int i = usage->fPlots.count()-1; i >= 0; --i) { GrPlot* plot = usage->fPlots[i]; // client may have plots from more than one atlas, must check for ours before adding if (this == plot->fAtlas && plot->addSubImage(width, height, image, loc)) { this->makeMRU(plot); return plot; } } // before we get a new plot, make sure we have a backing texture if (NULL == fTexture) { // TODO: Update this to use the cache rather than directly creating a texture. GrSurfaceDesc desc; desc.fFlags = fFlags; desc.fWidth = fBackingTextureSize.width(); desc.fHeight = fBackingTextureSize.height(); desc.fConfig = fPixelConfig; fTexture = fGpu->createTexture(desc, true, NULL, 0); if (NULL == fTexture) { return NULL; } } // now look through all allocated plots for one we can share, in MRU order GrPlotList::Iter plotIter; plotIter.init(fPlotList, GrPlotList::Iter::kHead_IterStart); GrPlot* plot; while ((plot = plotIter.get())) { // make sure texture is set for quick lookup plot->fTexture = fTexture; if (plot->addSubImage(width, height, image, loc)) { this->makeMRU(plot); // new plot for atlas, put at end of array SkASSERT(!usage->fPlots.contains(plot)); *(usage->fPlots.append()) = plot; return plot; } plotIter.next(); } // If the above fails, then the current plot list has no room return NULL; }
GrPlot* GrAtlasMgr::addToAtlas(GrAtlas* atlas, int width, int height, const void* image, GrIPoint16* loc) { // iterate through entire plot list for this atlas, see if we can find a hole // last one was most recently added and probably most empty for (int i = atlas->fPlots.count()-1; i >= 0; --i) { GrPlot* plot = atlas->fPlots[i]; if (plot->addSubImage(width, height, image, loc)) { this->moveToHead(plot); return plot; } } // before we get a new plot, make sure we have a backing texture if (NULL == fTexture) { // TODO: Update this to use the cache rather than directly creating a texture. GrTextureDesc desc; desc.fFlags = kDynamicUpdate_GrTextureFlagBit; desc.fWidth = GR_ATLAS_TEXTURE_WIDTH; desc.fHeight = GR_ATLAS_TEXTURE_HEIGHT; desc.fConfig = fPixelConfig; fTexture = fGpu->createTexture(desc, NULL, 0); if (NULL == fTexture) { return NULL; } } // now look through all allocated plots for one we can share, in MRU order GrPlotList::Iter plotIter; plotIter.init(fPlotList, GrPlotList::Iter::kHead_IterStart); GrPlot* plot; while (NULL != (plot = plotIter.get())) { // make sure texture is set for quick lookup plot->fTexture = fTexture; if (plot->addSubImage(width, height, image, loc)) { this->moveToHead(plot); // new plot for atlas, put at end of array *(atlas->fPlots.append()) = plot; return plot; } plotIter.next(); } // If the above fails, then the current plot list has no room return NULL; }