GrLayerAtlas::Plot* GrLayerAtlas::addToAtlas(ClientPlotUsage* usage, int width, int height, SkIPoint16* loc) { // Iterate through the plots currently being used by this client and see if we can find a hole. // The last one was most recently added and probably most empty. // We want to consolidate the uses from individual clients to the same plot(s) so that // when a specific client goes away they are more likely to completely empty a plot. for (int i = usage->numPlots()-1; i >= 0; --i) { Plot* plot = usage->plot(i); if (plot->allocateRect(width, height, loc)) { this->makeMRU(plot); return plot; } } // before we get a new plot, make sure we have a backing texture if (nullptr == fTexture) { this->createBackingTexture(); if (nullptr == fTexture) { return nullptr; } } // Now look through all allocated plots for one we can share, in MRU order // TODO: its seems like traversing from emptiest to fullest would make more sense PlotList::Iter plotIter; plotIter.init(fPlotList, PlotList::Iter::kHead_IterStart); Plot* plot; while ((plot = plotIter.get())) { if (plot->allocateRect(width, height, loc)) { this->makeMRU(plot); // new plot for atlas, put at end of array usage->appendPlot(plot); return plot; } plotIter.next(); } // If the above fails, then the current plot list has no room return nullptr; }