diff options
-rw-r--r-- | projects/openttd_vs140.vcxproj | 1 | ||||
-rw-r--r-- | projects/openttd_vs140.vcxproj.filters | 3 | ||||
-rw-r--r-- | projects/openttd_vs141.vcxproj | 1 | ||||
-rw-r--r-- | projects/openttd_vs141.vcxproj.filters | 3 | ||||
-rw-r--r-- | projects/openttd_vs142.vcxproj | 1 | ||||
-rw-r--r-- | projects/openttd_vs142.vcxproj.filters | 3 | ||||
-rw-r--r-- | source.list | 1 | ||||
-rw-r--r-- | src/bitmap_type.h | 120 |
8 files changed, 133 insertions, 0 deletions
diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj index c5137a61d..ded9b9267 100644 --- a/projects/openttd_vs140.vcxproj +++ b/projects/openttd_vs140.vcxproj @@ -448,6 +448,7 @@ <ClInclude Include="..\src\base_media_base.h" /> <ClInclude Include="..\src\base_media_func.h" /> <ClInclude Include="..\src\base_station_base.h" /> + <ClInclude Include="..\src\bitmap_type.h" /> <ClInclude Include="..\src\bmp.h" /> <ClInclude Include="..\src\bridge.h" /> <ClInclude Include="..\src\cargo_type.h" /> diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index 751e54887..cfc4199cc 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -432,6 +432,9 @@ <ClInclude Include="..\src\base_station_base.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\src\bitmap_type.h"> + <Filter>Header Files</Filter> + </ClInclude> <ClInclude Include="..\src\bmp.h"> <Filter>Header Files</Filter> </ClInclude> diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj index 66974da28..d550186c1 100644 --- a/projects/openttd_vs141.vcxproj +++ b/projects/openttd_vs141.vcxproj @@ -448,6 +448,7 @@ <ClInclude Include="..\src\base_media_base.h" /> <ClInclude Include="..\src\base_media_func.h" /> <ClInclude Include="..\src\base_station_base.h" /> + <ClInclude Include="..\src\bitmap_type.h" /> <ClInclude Include="..\src\bmp.h" /> <ClInclude Include="..\src\bridge.h" /> <ClInclude Include="..\src\cargo_type.h" /> diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters index 751e54887..cfc4199cc 100644 --- a/projects/openttd_vs141.vcxproj.filters +++ b/projects/openttd_vs141.vcxproj.filters @@ -432,6 +432,9 @@ <ClInclude Include="..\src\base_station_base.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\src\bitmap_type.h"> + <Filter>Header Files</Filter> + </ClInclude> <ClInclude Include="..\src\bmp.h"> <Filter>Header Files</Filter> </ClInclude> diff --git a/projects/openttd_vs142.vcxproj b/projects/openttd_vs142.vcxproj index f0a75ff82..92327ad25 100644 --- a/projects/openttd_vs142.vcxproj +++ b/projects/openttd_vs142.vcxproj @@ -448,6 +448,7 @@ <ClInclude Include="..\src\base_media_base.h" /> <ClInclude Include="..\src\base_media_func.h" /> <ClInclude Include="..\src\base_station_base.h" /> + <ClInclude Include="..\src\bitmap_type.h" /> <ClInclude Include="..\src\bmp.h" /> <ClInclude Include="..\src\bridge.h" /> <ClInclude Include="..\src\cargo_type.h" /> diff --git a/projects/openttd_vs142.vcxproj.filters b/projects/openttd_vs142.vcxproj.filters index 751e54887..cfc4199cc 100644 --- a/projects/openttd_vs142.vcxproj.filters +++ b/projects/openttd_vs142.vcxproj.filters @@ -432,6 +432,9 @@ <ClInclude Include="..\src\base_station_base.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\src\bitmap_type.h"> + <Filter>Header Files</Filter> + </ClInclude> <ClInclude Include="..\src\bmp.h"> <Filter>Header Files</Filter> </ClInclude> diff --git a/source.list b/source.list index 5bc395a84..c96b99bb9 100644 --- a/source.list +++ b/source.list @@ -135,6 +135,7 @@ autoslope.h base_media_base.h base_media_func.h base_station_base.h +bitmap_type.h bmp.h bridge.h cargo_type.h diff --git a/src/bitmap_type.h b/src/bitmap_type.h new file mode 100644 index 000000000..11a419093 --- /dev/null +++ b/src/bitmap_type.h @@ -0,0 +1,120 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. + */ + +/** @file bitmap_type.hpp Bitmap functions. */ + +#ifndef BITMAP_TYPE_HPP +#define BITMAP_TYPE_HPP + +#include <vector> + +/** Represents a tile area containing containing individually set tiles. + * Each tile must be contained within the preallocated area. + * A std::vector<bool> is used to mark which tiles are contained. + */ +class BitmapTileArea : public TileArea { +protected: + std::vector<bool> data; + + inline uint Index(uint x, uint y) const { return y * this->w + x; } + + inline uint Index(TileIndex tile) const { return Index(TileX(tile) - TileX(this->tile), TileY(tile) - TileY(this->tile)); } + +public: + BitmapTileArea() + { + this->tile = INVALID_TILE; + this->w = 0; + this->h = 0; + } + + /** + * Reset and clear the BitmapTileArea. + */ + void Reset() + { + this->tile = INVALID_TILE; + this->w = 0; + this->h = 0; + this->data.clear(); + } + + /** + * Initialize the BitmapTileArea with the specified Rect. + * @param rect Rect to use. + */ + void Initialize(Rect r) + { + this->tile = TileXY(r.left, r.top); + this->w = r.right - r.left + 1; + this->h = r.bottom - r.top + 1; + this->data.clear(); + this->data.resize(Index(w, h)); + } + + /** + * Add a tile as part of the tile area. + * @param tile Tile to add. + */ + inline void SetTile(TileIndex tile) + { + assert(this->Contains(tile)); + this->data[Index(tile)] = true; + } + + /** + * Clear a tile from the tile area. + * @param tile Tile to clear + */ + inline void ClrTile(TileIndex tile) + { + assert(this->Contains(tile)); + this->data[Index(tile)] = false; + } + + /** + * Test if a tile is part of the tile area. + * @param tile Tile to check + */ + inline bool HasTile(TileIndex tile) const + { + return this->Contains(tile) && this->data[Index(tile)]; + } +}; + +/** Iterator to iterate over all tiles belonging to a bitmaptilearea. */ +class BitmapTileIterator : public OrthogonalTileIterator { +protected: + const BitmapTileArea *bitmap; +public: + /** + * Construct the iterator. + * @param bitmap BitmapTileArea to iterate. + */ + BitmapTileIterator(const BitmapTileArea &bitmap) : OrthogonalTileIterator(bitmap), bitmap(&bitmap) + { + if (!this->bitmap->HasTile(TileIndex(this->tile))) ++(*this); + } + + inline TileIterator& operator ++() + { + (*this).OrthogonalTileIterator::operator++(); + while (this->tile != INVALID_TILE && !this->bitmap->HasTile(TileIndex(this->tile))) { + (*this).OrthogonalTileIterator::operator++(); + } + return *this; + } + + virtual TileIterator *Clone() const + { + return new BitmapTileIterator(*this); + } +}; + +#endif /* BITMAP_TYPE_HPP */ |