diff options
-rw-r--r-- | projects/openttd_vs80.vcproj | 4 | ||||
-rw-r--r-- | projects/openttd_vs90.vcproj | 4 | ||||
-rw-r--r-- | source.list | 1 | ||||
-rw-r--r-- | src/misc/smallvec.h | 44 | ||||
-rw-r--r-- | src/viewport.cpp | 51 |
5 files changed, 77 insertions, 27 deletions
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index 56eedfc24..932c7d3b0 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -2272,6 +2272,10 @@ > </File> <File + RelativePath=".\..\src\misc\smallveh.h" + > + </File> + <File RelativePath=".\..\src\misc\str.hpp" > </File> diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index 435e7f87e..5b6c66137 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -2269,6 +2269,10 @@ > </File> <File + RelativePath=".\..\src\misc\smallveh.h" + > + </File> + <File RelativePath=".\..\src\misc\str.hpp" > </File> diff --git a/source.list b/source.list index 137a860b1..7d0c75f95 100644 --- a/source.list +++ b/source.list @@ -515,6 +515,7 @@ misc/dbg_helpers.cpp misc/dbg_helpers.h misc/fixedsizearray.hpp misc/hashtable.hpp +misc/smallveh.h misc/str.hpp misc/strapi.hpp diff --git a/src/misc/smallvec.h b/src/misc/smallvec.h new file mode 100644 index 000000000..952261ae7 --- /dev/null +++ b/src/misc/smallvec.h @@ -0,0 +1,44 @@ +/* $Id$ */ + +/* @file smallvec.h */ + +#ifndef SMALLVEC_H +#define SMALLVEC_H + +template <typename T, uint S> struct SmallVector { + T *data; + uint items; + uint capacity; + + SmallVector() : data(NULL), items(0), capacity(0) { } + + ~SmallVector() + { + free(data); + } + + /** + * Append an item and return it. + */ + T *Append() + { + if (items == capacity) { + capacity += S; + data = ReallocT(data, capacity); + } + + return &data[items++]; + } + + const T *Begin() const + { + return data; + } + + const T *End() const + { + return &data[items]; + } +}; + +#endif /* SMALLVEC_H */ diff --git a/src/viewport.cpp b/src/viewport.cpp index 94c7b000e..b724c60a5 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -28,8 +28,7 @@ #include "settings_type.h" #include "station_func.h" #include "core/alloc_type.hpp" - -#include <vector> +#include "misc/smallvec.h" #include "table/sprites.h" #include "table/strings.h" @@ -139,8 +138,8 @@ enum FoundationPart { FOUNDATION_PART_END }; -typedef std::vector<TileSpriteToDraw> TileSpriteToDrawVector; -typedef std::vector<StringSpriteToDraw> StringSpriteToDrawVector; +typedef SmallVector<TileSpriteToDraw, 64> TileSpriteToDrawVector; +typedef SmallVector<StringSpriteToDraw, 4> StringSpriteToDrawVector; struct ViewportDrawer { DrawPixelInfo dpi; @@ -488,15 +487,13 @@ void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, { assert((image & SPRITE_MASK) < MAX_SPRITES); - TileSpriteToDraw ts; - ts.image = image; - ts.pal = pal; - ts.sub = sub; - ts.x = x; - ts.y = y; - ts.z = z; - - _cur_vd->tile_sprites_to_draw.push_back(ts); + TileSpriteToDraw *ts = _cur_vd->tile_sprites_to_draw.Append(); + ts->image = image; + ts->pal = pal; + ts->sub = sub; + ts->x = x; + ts->y = y; + ts->z = z; } /** @@ -787,16 +784,14 @@ void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool trans /* Returns a StringSpriteToDraw */ void AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2, uint16 color, uint16 width) { - StringSpriteToDraw ss; - ss.string = string; - ss.x = x; - ss.y = y; - ss.params[0] = params_1; - ss.params[1] = params_2; - ss.width = width; - ss.color = color; - - _cur_vd->string_sprites_to_draw.push_back(ss); + StringSpriteToDraw *ss = _cur_vd->string_sprites_to_draw.Append(); + ss->string = string; + ss->x = x; + ss->y = y; + ss->params[0] = params_1; + ss->params[1] = params_2; + ss->width = width; + ss->color = color; } @@ -1333,7 +1328,8 @@ void UpdateViewportSignPos(ViewportSign *sign, int left, int top, StringID str) static void ViewportDrawTileSprites(const TileSpriteToDrawVector *tstdv) { - for (TileSpriteToDrawVector::const_iterator ts = tstdv->begin(); ts != tstdv->end(); ts++) { + const TileSpriteToDraw *tsend = tstdv->End(); + for (const TileSpriteToDraw *ts = tstdv->Begin(); ts != tsend; ++ts) { Point pt = RemapCoords(ts->x, ts->y, ts->z); DrawSprite(ts->image, ts->pal, pt.x, pt.y, ts->sub); } @@ -1444,7 +1440,8 @@ static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDrawVect dp.width = UnScaleByZoom(dp.width, zoom); dp.height = UnScaleByZoom(dp.height, zoom); - for (StringSpriteToDrawVector::const_iterator ss = sstdv->begin(); ss != sstdv->end(); ss++) { + const StringSpriteToDraw *ssend = sstdv->End(); + for (const StringSpriteToDraw *ss = sstdv->Begin(); ss != ssend; ++ss) { uint16 colour; if (ss->width != 0) { @@ -1541,7 +1538,7 @@ void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom * is checked) */ assert(vd.parent_list <= endof(parent_list)); - if (!vd.tile_sprites_to_draw.empty()) ViewportDrawTileSprites(&vd.tile_sprites_to_draw); + if (vd.tile_sprites_to_draw.items != 0) ViewportDrawTileSprites(&vd.tile_sprites_to_draw); /* null terminate parent sprite list */ *vd.parent_list = NULL; @@ -1551,7 +1548,7 @@ void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(parent_list); - if (!vd.string_sprites_to_draw.empty()) ViewportDrawStrings(&vd.dpi, &vd.string_sprites_to_draw); + if (vd.string_sprites_to_draw.items != 0) ViewportDrawStrings(&vd.dpi, &vd.string_sprites_to_draw); _cur_dpi = old_dpi; } |