diff options
-rw-r--r-- | The Mana World.dev | 4 | ||||
-rw-r--r-- | src/graphic/image.h | 186 |
2 files changed, 131 insertions, 59 deletions
diff --git a/The Mana World.dev b/The Mana World.dev index 1a4a6f79..edf634c2 100644 --- a/The Mana World.dev +++ b/The Mana World.dev @@ -16,7 +16,7 @@ Linker=-ljgmod_@@_-lalfont_@@_-lguichan_@@_-lguichan_allegro_@@_-lalleg_@@_-lwso IsCpp=1 Icon=The Mana World.ico ExeOutput= -ObjectOutput=src\objects +ObjectOutput=obj OverrideOutput=1 OverrideOutputName=tmw.exe HostApplication= @@ -33,7 +33,7 @@ CompilerSettings=0010001001001000001101 Major=0 Minor=0 Release=8 -Build=621 +Build=628 LanguageID=1033 CharsetID=1252 CompanyName=The Mana World Development Team diff --git a/src/graphic/image.h b/src/graphic/image.h index c798fae0..f2ea6784 100644 --- a/src/graphic/image.h +++ b/src/graphic/image.h @@ -30,79 +30,151 @@ #include <iostream> #include "../log.h" +/* + * A class storing a single sprite in video memory if available, + * else as a refernece to a RLE_SPRITE in a datafile. + * The class stores the offsets needed to compensate the cropping + * operated by the grabber utility. + */ class Image { - protected: - int offset_x, offset_y; - public: - Image(int offset_x, int offset_y) { - this->offset_x = offset_x; - this->offset_y = offset_y; - } - virtual void draw(BITMAP *dest, int x, int y) = 0; + protected: + // From where to start drawing + int offset_x, offset_y; + public: + /* + * Creates an Image + * \param offset_x is the x offset from where to start drawing + * \param offset_y is the y offset from where to start drawing + */ + Image(int offset_x, int offset_y) { + this->offset_x = offset_x; + this->offset_y = offset_y; + } + /* + * Virtual function to draw a sprite + * \param dest is the destination bitmap on which to draw the sprite + * \param x is the horizontal position + * \param y is the vertical position + */ + virtual void draw(BITMAP *dest, int x, int y) = 0; }; +/* + * A RLE sprite + */ class RleImage : public Image { - private: - RLE_SPRITE *src; - public: - RleImage(RLE_SPRITE *src, int offset_x, int offset_y) : Image(offset_x, offset_y) { - this->src = src; - } - virtual ~RleImage() { - destroy_rle_sprite(src); - } - void draw(BITMAP *dest, int x, int y) { - draw_rle_sprite(dest, src, x+offset_x, y+offset_y); - } + private: + // Refernce to RLE_SPRITE + RLE_SPRITE *src; + public: + /* + * Creates a RleSprite + * \param src is a reference to a RLE_SPRITE in a datafile + * \param offset_x is the x offset from where to start drawing + * \param offset_y is the y offset from where to start drawing + */ + RleImage(RLE_SPRITE *src, int offset_x, int offset_y) : Image(offset_x, offset_y) { + this->src = src; + } + /* + * Destroy a RleSprite + */ + virtual ~RleImage() { + destroy_rle_sprite(src); + } + /* + * Draw a sprite + */ + void draw(BITMAP *dest, int x, int y) { + draw_rle_sprite(dest, src, x+offset_x, y+offset_y); + } }; +/* + * An image stored in video memory + */ class VideoImage : public Image { - private: - BITMAP *src; - public: - VideoImage(BITMAP *src, int offset_x, int offset_y) : Image(offset_x, offset_y) { - this->src = src; - } - virtual ~VideoImage() { - destroy_bitmap(src); - } - void draw(BITMAP *dest, int x, int y) { - masked_blit(src, dest, 0, 0, x+offset_x, y+offset_y, src->w, src->h); - } + private: + // Reference to bitmap stored in video memory + BITMAP *src; + public: + /* + * Creates a VideoImage + * \param src is a reference to a BITMAP in video memory + * \param offset_x is the x offset from where to start drawing + * \param offset_y is the y offset from where to start drawing + */ + VideoImage(BITMAP *src, int offset_x, int offset_y) : Image(offset_x, offset_y) { + this->src = src; + } + /* + * Destroy a VideoImage + */ + virtual ~VideoImage() { + destroy_bitmap(src); + } + /* + * Draw a sprite + */ + void draw(BITMAP *dest, int x, int y) { + masked_blit(src, dest, 0, 0, x+offset_x, y+offset_y, src->w, src->h); + } }; +/* + * Stores a complete set of sprites. + */ class Spriteset { private: + /* + * Helper function to get offset + * \param datafile is a reference to the whole spriteset + * \param type is the property of the datafile object + */ int get_property(DATAFILE *datafile, int type) { return atoi(get_datafile_property(datafile, type)); } public: - std::vector<Image *> spriteset; - - Spriteset(std::string filename) { - DATAFILE *datafile = load_datafile(filename.c_str()); - if(!datafile)error("Unable to load graphic file: " + filename); - int i = 0; - while(datafile[i].type!=DAT_END) { - Image *temp_image; - - if(gfx_capabilities & GFX_HW_VRAM_BLIT) { - BITMAP *temp_video_bitmap = create_video_bitmap(((RLE_SPRITE *)datafile[i].dat)->w, ((RLE_SPRITE *)datafile[i].dat)->h); - if(temp_video_bitmap) { - clear_to_color(temp_video_bitmap, makecol(255,0,255)); - draw_rle_sprite(temp_video_bitmap, (RLE_SPRITE *)datafile[i].dat, 0, 0); - temp_image = new VideoImage(temp_video_bitmap, get_property(&datafile[i], DAT_ID('X','C','R','P')), get_property(&datafile[i], DAT_ID('Y','C','R','P'))); - } else { - warning("You ran out of video memory!"); - temp_image = new RleImage((RLE_SPRITE*)datafile[i].dat, get_property(&datafile[i], DAT_ID('X','C','R','P')), get_property(&datafile[i], DAT_ID('Y','C','R','P'))); - } - } else { - temp_image = new RleImage((RLE_SPRITE*)datafile[i].dat, get_property(&datafile[i], DAT_ID('X','C','R','P')), get_property(&datafile[i], DAT_ID('Y','C','R','P'))); + // Vector storing the whole spriteset. + std::vector<Image *> spriteset; + /* + * Load a datafile containing the spriteset + * \param filename is the path of the datafile + */ + Spriteset(std::string filename) { + DATAFILE *datafile = load_datafile(filename.c_str()); + if(!datafile)error("Unable to load graphic file: " + filename); + int i = 0; + while(datafile[i].type!=DAT_END) { + Image *temp_image; + if(gfx_capabilities & GFX_HW_VRAM_BLIT) { + BITMAP *temp_video_bitmap = create_video_bitmap( + ((RLE_SPRITE *)datafile[i].dat)->w, + ((RLE_SPRITE *)datafile[i].dat)->h); + if(temp_video_bitmap) { + clear_to_color(temp_video_bitmap, makecol(255,0,255)); + draw_rle_sprite(temp_video_bitmap, + (RLE_SPRITE *)datafile[i].dat, 0, 0); + temp_image = new VideoImage(temp_video_bitmap, + get_property(&datafile[i], DAT_ID('X','C','R','P')), + get_property(&datafile[i], DAT_ID('Y','C','R','P'))); + } else { + warning("You ran out of video memory!"); + temp_image = new RleImage( + (RLE_SPRITE*)datafile[i].dat, + get_property(&datafile[i], DAT_ID('X','C','R','P')), + get_property(&datafile[i], DAT_ID('Y','C','R','P'))); + } + } else { + temp_image = new RleImage( + (RLE_SPRITE*)datafile[i].dat, + get_property(&datafile[i], DAT_ID('X','C','R','P')), + get_property(&datafile[i], DAT_ID('Y','C','R','P'))); + } + spriteset.push_back(temp_image); + i++; + } } - spriteset.push_back(temp_image); - i++; - } - } }; #endif |