void WadImageCache::initialize_cache() { FileSpecifier info; info.SetToImageCacheDir(); info.AddPart("Cache.ini"); if (!info.Exists()) return; InfoTree pt; try { pt = InfoTree::load_ini(info); } catch (InfoTree::ini_error e) { logError("Could not read image cache from %s (%s)", info.GetPath(), e.what()); } for (InfoTree::iterator it = pt.begin(); it != pt.end(); ++it) { std::string name = it->first; InfoTree ptc = it->second; WadImageDescriptor desc; std::string path; ptc.read("path", path); desc.file = FileSpecifier(path); ptc.read("checksum", desc.checksum); ptc.read("index", desc.index); ptc.read("tag", desc.tag); int width = 0; ptc.read("width", width); int height = 0; ptc.read("height", height); size_t filesize = 0; ptc.read("filesize", filesize); cache_key_t key = cache_key_t(desc, width, height); cache_value_t val = cache_value_t(name, filesize); m_used.push_front(cache_pair_t(key, val)); m_cacheinfo[key] = m_used.begin(); m_cachesize += filesize; } }
bool Gui::display(movie_root* m) { assert(m == _stage); // why taking this arg ?? assert(_started); InvalidatedRanges changed_ranges; bool redraw_flag; // Should the frame be rendered completely, even if it did not change? #ifdef FORCE_REDRAW redraw_flag = true; #else redraw_flag = _redraw_flag || want_redraw(); #endif // reset class member if we do a redraw now if (redraw_flag) _redraw_flag=false; // Find out the surrounding frame of all characters which // have been updated. This just checks what region of the stage has changed // due to ActionScript code, the timeline or user events. The GUI can still // choose to render a different part of the stage. // if (!redraw_flag) { // choose snapping ranges factor changed_ranges.setSnapFactor(1.3f); // Use multi ranges only when GUI/Renderer supports it // (Useless CPU overhead, otherwise) changed_ranges.setSingleMode(!want_multiple_regions()); // scan through all sprites to compute invalidated bounds m->add_invalidated_bounds(changed_ranges, false); // grow ranges by a 2 pixels to avoid anti-aliasing issues changed_ranges.growBy(40.0f / _xscale); // optimize ranges changed_ranges.combineRanges(); } // TODO: Remove this and want_redraw to avoid confusion!? if (redraw_flag) { changed_ranges.setWorld(); } // DEBUG ONLY: // This is a good place to inspect the invalidated bounds state. Enable // the following block (and parts of it) if you need to. #if 0 { // This may print a huge amount of information, but is useful to analyze // the (visible) object structure of the movie and the flags of the // characters. For example, a characters should have set the // m_child_invalidated flag if at least one of it's childs has the // invalidated flag set. log_debug("DUMPING CHARACTER TREE"); InfoTree tr; InfoTree::iterator top = tr.begin(); _stage->getMovieInfo(tr, top); for (InfoTree::iterator i = tr.begin(), e = tr.end(); i != e; ++i) { std::cout << std::string(tr.depth(i) * 2, ' ') << i->first << ": " << i->second << std::endl; } // less verbose, and often necessary: see the exact coordinates of the // invalidated bounds (mainly to see if it's NULL or something else). std::cout << "Calculated changed ranges: " << changed_ranges << "\n"; } #endif // Avoid drawing of stopped movies if ( ! changed_ranges.isNull() ) { // use 'else'? // Tell the GUI(!) that we only need to update this // region. Note the GUI can do whatever it wants with // this information. It may simply ignore the bounds // (which will normally lead into a complete redraw), // or it may extend or shrink the bounds as it likes. So, // by calling set_invalidated_bounds we have no guarantee // that only this part of the stage is rendered again. #ifdef REGION_UPDATES_DEBUGGING_FULL_REDRAW // redraw the full screen so that only the // *new* invalidated region is visible // (helps debugging) InvalidatedRanges world_ranges; world_ranges.setWorld(); setInvalidatedRegions(world_ranges); #else setInvalidatedRegions(changed_ranges); #endif // TODO: should this be called even if we're late ? beforeRendering(); // Render the frame, if not late. // It's up to the GUI/renderer combination // to do any clipping, if desired. m->display(); // show invalidated region using a red rectangle // (Flash debug style) IF_DEBUG_REGION_UPDATES ( if (_renderer.get() && !changed_ranges.isWorld()) { for (size_t rno = 0; rno < changed_ranges.size(); rno++) { const geometry::Range2d<int>& bounds = changed_ranges.getRange(rno); float xmin = bounds.getMinX(); float xmax = bounds.getMaxX(); float ymin = bounds.getMinY(); float ymax = bounds.getMaxY(); const std::vector<point> box = { point(xmin, ymin), point(xmax, ymin), point(xmax, ymax), point(xmin, ymax) }; _renderer->draw_poly(box, rgba(0,0,0,0), rgba(255,0,0,255), SWFMatrix(), false); } } );