My favorites | Sign in
Project Home Downloads Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "MapBG.h"

MapBG::MapBG(IMapRender* render)
: IMapRender(render), _recalc(true), _currLevel(-1), _virtPage(Size(0, 0)),
_cachePageSize(CACHE_PAGE_SIZE), _cachePageInitSize(CACHE_PAGE_INIT_SIZE)
{}

void MapBG::Render(Draw* w)
{
if (_currLevel < 0 || _currLevel >= _levels.GetCount() || !GetTopRender())
return;

MipMapLevel& level = _levels[_currLevel];

Point offset = GetTopRender()->GetPageOffset();
Rect page = GetTopRender()->GetPageRect();
Point lt = GetTopRender()->GetPagePos();

for (int i = 0; i < level.GetMipMaps().GetCount(); ++i)
{
Rect itemRect(level.GetMipMaps().GetKey(i), level.GetBlockSize());

if (page.Intersects(itemRect))
if (level.GetMipMaps()[i])
{
level.GetMipMaps()[i]
->Render(w,
itemRect
.Offseted(-lt)
.Offseted(offset));
}
}

IMapRender::Render(w);
}

void MapBG::StatePerformed(dword state, const String& param)
{
if (_currLevel < 0 || _currLevel >= _levels.GetCount())
return;

MipMapLevel& level = _levels[_currLevel];
Rect pageRect = GetPageRect();

if (_recalc || !_virtPage.Contains(GetPageRect()))
{
_virtPage = pageRect.Inflated(level.GetBlockSize() * _cachePageInitSize);
_recalc = true;
}

Rect currVirtualPage = _virtPage.Inflated(level.GetBlockSize() * _cachePageSize);

if (!_recalc)
return;

for (int i = 0; i < level.GetMipMaps().GetCount(); ++i)
{
Point pi = level.GetMipMaps().GetKey(i);
Rect itemRect(pi, level.GetBlockSize());

if (!level.GetMipMaps()[i])
continue;

if (currVirtualPage.Intersects(itemRect))
{
level.GetMipMaps()[i]->Prepare(
AppendFileName(_mapDir, NFormat("%d-%d-%d.png", _currLevel, pi.x, pi.y)),
level.GetBlockSize()
);
}
else
level.GetMipMaps()[i]->Release();
}

_recalc = false;
}

bool MapBG::Load(const char* fp)
{
if (!FileExists(fp))
{
LOG(NFormat("MapBG: File not exists, \"%s\"", fp));
return false;
}

if (!LoadFromXMLFile(_levels, fp))
{
LOG("MapBG: Error while loading map from XML-file!");
return false;
}

_mapDir = AppendFileName(GetFileDirectory(fp), GetFileTitle(fp));
_currLevel = _levels.GetCount() > 0 ? 0 : -1;
if (_currLevel < 0)
{
LOG("MapBG: No zoom levels found in map!");
return false;
}
_recalc = true;

return true;
}

bool MapBG::Zoom(int level)
{
if (level < 0 || level >= _levels.GetCount())
return false;
_currLevel = level;
_recalc = true;
return true;
}

Rect MapBG::GetRect()
{
if (_currLevel < 0 || _currLevel >= _levels.GetCount())
return Size(0, 0);

return Rect(Point(0, 0), _levels[_currLevel].GetTotalSize());
}

Change log

r4180 by Sc0rch on Nov 17, 2011   Diff
MapRender: First release
(FormEditorCommon, FormEditorProperties,
Map, MapBG, MapCommon, MapEditor,
MapRenderTest.
Go to: 
Project members, sign in to write a code review

Older revisions

All revisions of this file

File info

Size: 2710 bytes, 119 lines
Powered by Google Project Hosting