#ifndef MAP_BG__MAP_COMMON_H #define MAP_BG__MAP_COMMON_H #include "FileUtils.h" #include using namespace Upp; class IMipMapItem : public Moveable, public Pte { public: virtual ~IMipMapItem() {} virtual void Prepare(const char* fp, const Size& sz) = 0; virtual void Release() = 0; virtual void Render(Draw* w, const Rect& r) = 0; virtual void Xmlize(XmlIO xml) {} }; class MipMapItem : public IMipMapItem { public: MipMapItem() : _ready(false) {} virtual ~MipMapItem() {} virtual void Prepare(const char* fp, const Size& sz); virtual void Release(); virtual void Render(Draw* w, const Rect& r); private: bool _ready; Image _mipMap; }; class MipMapLevel : public Moveable { public: MipMapLevel() {} MipMapLevel(const MipMapLevel& other) { _blockX = other._blockX; _blockY = other._blockY; _totalX = other._totalX; _totalY = other._totalY; _zoomDX = other._zoomDX; _totalSizeX = other._totalSizeX; _totalSizeY = other._totalSizeY; _mipMaps <<= other._mipMaps; } virtual ~MipMapLevel() { Clear(); } void Clear() { for (int i = 0; i < _mipMaps.GetCount(); ++i) if (_mipMaps[i]) delete _mipMaps[i]; _mipMaps.Clear(); } void Release() { for (int i = 0; i < _mipMaps.GetCount(); ++i) if (_mipMaps[i]) _mipMaps[i]->Release(); } MipMapLevel& BlockCX (int i) { Mutex::Lock _(_mutex); _blockX = i; return *this; } MipMapLevel& BlockCY (int i) { Mutex::Lock _(_mutex); _blockY = i; return *this; } MipMapLevel& TotalCX (int i) { Mutex::Lock _(_mutex); _totalX = i; return *this; } MipMapLevel& TotalCY (int i) { Mutex::Lock _(_mutex); _totalY = i; return *this; } MipMapLevel& TotalSizeCX(int i) { Mutex::Lock _(_mutex); _totalSizeX = i; return *this; } MipMapLevel& TotalSizeCY(int i) { Mutex::Lock _(_mutex); _totalSizeY = i; return *this; } MipMapLevel& ZoomDX( double dx) { Mutex::Lock _(_mutex); _zoomDX = dx; return *this; } int GetBlockCX() { Mutex::Lock _(_mutex); return _blockX; } int GetBlockCY() { Mutex::Lock _(_mutex); return _blockY; } int GetTotalCX() { Mutex::Lock _(_mutex); return _totalX; } int GetTotalCY() { Mutex::Lock _(_mutex); return _totalY; } int GetTotalSizeCX() { Mutex::Lock _(_mutex); return _totalSizeX; } int GetTotalSizeCY() { Mutex::Lock _(_mutex); return _totalSizeY; } double GetZoomDX() { Mutex::Lock _(_mutex); return _zoomDX; } Size GetBlockSize() { Mutex::Lock _(_mutex); return Size(_blockX, _blockY); } Size GetTotalSize() { Mutex::Lock _(_mutex); return Size(_totalSizeX, _totalSizeY); } Size GetTotalBlockSize() { Mutex::Lock _(_mutex); return Size(_totalX, _totalY); } MipMapLevel& AddMipMap(const Point& p, Ptr item) { Mutex::Lock _(_mutex); _mipMaps.Add(p, item); return *this; } const VectorMap >& GetMipMaps() const { return _mipMaps; } VectorMap >& GetMipMaps() { return _mipMaps; } void Xmlize(XmlIO xml) { Mutex::Lock _(_mutex); xml ("blockX", _blockX) ("blockY", _blockY) ("totalX", _totalX) ("totalY", _totalY) ("zoomDX", _zoomDX) ("totalSizeX", _totalSizeX) ("totalSizeY", _totalSizeY); if (xml.IsStoring()) { Vector keys = _mipMaps.GetKeys(); xml("mipmaps", keys); } else { Vector keys; xml("mipmaps", keys); Clear(); for (int i = 0; i < keys.GetCount(); ++i) AddMipMap(keys[i], new MipMapItem()); } } private: Mutex _mutex; int _blockX; int _blockY; int _totalX; int _totalY; int _totalSizeX; int _totalSizeY; double _zoomDX; VectorMap > _mipMaps; }; class MapZoomLevel : public Moveable { public: MapZoomLevel() : _zoomDX(1.0) {} MapZoomLevel(double zx) : _zoomDX(zx) {} MapZoomLevel(const MapZoomLevel& other) { _zoomDX = other._zoomDX; } virtual ~MapZoomLevel() {} MapZoomLevel& Zoom( double dx) { Mutex::Lock _(_mutex); _zoomDX = dx; return *this; } double GetZoom() { Mutex::Lock _(_mutex); return _zoomDX; } void Xmlize(XmlIO xml) { Mutex::Lock _(_mutex); xml("zoomDX", _zoomDX); } private: Mutex _mutex; double _zoomDX; }; #endif