ultimatepp/bazaar/MapCommon/IMapRender.cpp
Sc0rch 9959d8888c MapRender: First release (FormEditorCommon, FormEditorProperties, Map, MapBG, MapCommon, MapEditor, MapRenderTest.
git-svn-id: svn://ultimatepp.org/upp/trunk@4180 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-11-18 06:28:11 +00:00

121 lines
2.2 KiB
C++

#include "IMapRender.h"
IMapRender::IMapRender(IMapRender* render)
: IMapItem(render), _renderType(RENDER_DRAW), _quality(MODE_NOAA), _opacity(-1),
_clearColor(RGBAZero())
{}
void IMapRender::Clear()
{
for (int i = 0; i < _items.GetCount(); ++i)
if (_items[i])
delete _items[i];
_items.Clear();
}
void IMapRender::Render(Draw* w)
{
if (!w || !IsShown())
return;
/* Rect r = GetRenderRect();
Size rsz = r.GetSize();
Size vsz = CurrentSceneSize();
int px = 0;
int py = 0;
if (rsz.cx > vsz.cx)
rsz.cx = vsz.cx;
else
px = r.TopLeft().x;
if (rsz.cy > vsz.cy)
rsz.cy = vsz.cy;
else
py = r.TopLeft().y;*/
Size rsz = GetPageRect().GetSize();
if (_renderType == RENDER_PAINTER)
{
ImageBuffer ib(rsz);
BufferPainter sw(ib, _quality);
sw.Clear(_clearColor);
// if (_opacity >= 0)
// sw.Opacity(_opacity);
sw.Opacity(0.5);
RenderItems(&sw);
w->DrawImage(0, 0, ib);
}
else
RenderItems(w);
}
void IMapRender::RenderItems(Draw* w)
{
Rect view = CurrentViewRect();
Vector<int> selected;
for (int i = 0; i < _items.GetCount(); ++i)
{
if (!_items[i] || !_items[i]->IsShown())
continue;
if (!view.Intersects(_items[i]->GetRect()))
continue;
if (_items[i]->IsSelected())
{
selected << i;
continue;
}
_items[i]->Render(w);
}
for (int i = 0; i < selected.GetCount(); ++i)
{
_items[selected[i]]->Render(w);
}
}
IMapRender* IMapRender::Antialiased(bool use, bool subpixel)
{
_quality = use ? (use + subpixel) : 0;
_renderType = RENDER_PAINTER;
return this;
}
IMapRender* IMapRender::Subpixel()
{
_renderType = RENDER_PAINTER;
_quality = MODE_SUBPIXEL;
return this;
}
IMapRender* IMapRender::NoAA()
{
_renderType = RENDER_DRAW;
_quality = MODE_NOAA;
return this;
}
Rect IMapRender::GetRect()
{
Point rb = Point(INT_MAX, INT_MAX);
Point lt = Point(-1, -1);
for (int i = 0; i < _items.GetCount(); i++)
{
Rect r = _items[i]->GetRect();
lt.x = min(r.TopLeft().x, lt.x);
lt.y = min(r.TopLeft().y, lt.y);
rb.x = max(r.BottomRight().x, rb.x);
rb.y = max(r.BottomRight().y, rb.y);
}
return Rect(lt, rb);
}