Initial commit
This commit is contained in:
216
engines/ultima/ultima4/gfx/imagemgr.h
Normal file
216
engines/ultima/ultima4/gfx/imagemgr.h
Normal file
@@ -0,0 +1,216 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ULTIMA4_GFX_IMAGEMGR_H
|
||||
#define ULTIMA4_GFX_IMAGEMGR_H
|
||||
|
||||
#include "ultima/ultima4/gfx/image.h"
|
||||
#include "ultima/ultima4/core/observer.h"
|
||||
#include "ultima/shared/std/containers.h"
|
||||
|
||||
namespace Common {
|
||||
class File;
|
||||
}
|
||||
|
||||
namespace Image {
|
||||
class ImageDecoder;
|
||||
}
|
||||
|
||||
namespace Ultima {
|
||||
namespace Ultima4 {
|
||||
|
||||
class ConfigElement;
|
||||
class Debug;
|
||||
class ImageSet;
|
||||
class Settings;
|
||||
|
||||
/*
|
||||
* The image manager is responsible for loading and keeping track of
|
||||
* the various images.
|
||||
*/
|
||||
|
||||
#define BKGD_SHAPES "tiles"
|
||||
#define BKGD_CHARSET "charset"
|
||||
#define BKGD_BORDERS "borders"
|
||||
#define BKGD_INTRO "title"
|
||||
#define BKGD_OPTIONS_TOP "options_top"
|
||||
#define BKGD_OPTIONS_BTM "options_btm"
|
||||
#define BKGD_TREE "tree"
|
||||
#define BKGD_PORTAL "portal"
|
||||
#define BKGD_OUTSIDE "outside"
|
||||
#define BKGD_INSIDE "inside"
|
||||
#define BKGD_WAGON "wagon"
|
||||
#define BKGD_GYPSY "gypsy"
|
||||
#define BKGD_ABACUS "abacus"
|
||||
#define BKGD_HONCOM "honcom"
|
||||
#define BKGD_VALJUS "valjus"
|
||||
#define BKGD_SACHONOR "sachonor"
|
||||
#define BKGD_SPIRHUM "spirhum"
|
||||
#define BKGD_ANIMATE "beasties"
|
||||
#define BKGD_KEY "key"
|
||||
#define BKGD_HONESTY "honesty"
|
||||
#define BKGD_COMPASSN "compassn"
|
||||
#define BKGD_VALOR "valor"
|
||||
#define BKGD_JUSTICE "justice"
|
||||
#define BKGD_SACRIFIC "sacrific"
|
||||
#define BKGD_HONOR "honor"
|
||||
#define BKGD_SPIRIT "spirit"
|
||||
#define BKGD_HUMILITY "humility"
|
||||
#define BKGD_TRUTH "truth"
|
||||
#define BKGD_LOVE "love"
|
||||
#define BKGD_COURAGE "courage"
|
||||
#define BKGD_STONCRCL "stoncrcl"
|
||||
#define BKGD_RUNE_INF "rune0"
|
||||
#define BKGD_SHRINE_HON "rune1"
|
||||
#define BKGD_SHRINE_COM "rune2"
|
||||
#define BKGD_SHRINE_VAL "rune3"
|
||||
#define BKGD_SHRINE_JUS "rune4"
|
||||
#define BKGD_SHRINE_SAC "rune5"
|
||||
#define BKGD_SHRINE_HNR "rune6"
|
||||
#define BKGD_SHRINE_SPI "rune7"
|
||||
#define BKGD_SHRINE_HUM "rune8"
|
||||
#define BKGD_GEMTILES "gemtiles"
|
||||
|
||||
enum ImageFixup {
|
||||
FIXUP_NONE,
|
||||
FIXUP_INTRO,
|
||||
FIXUP_ABYSS,
|
||||
FIXUP_ABACUS,
|
||||
FIXUP_DUNGNS,
|
||||
FIXUP_BLACKTRANSPARENCYHACK,
|
||||
FIXUP_FMTOWNSSCREEN
|
||||
};
|
||||
|
||||
/**
|
||||
* Image meta info.
|
||||
*/
|
||||
class ImageInfo {
|
||||
public:
|
||||
~ImageInfo();
|
||||
|
||||
Common::String _name;
|
||||
Common::String _filename;
|
||||
int _width, _height, _depth;
|
||||
int _prescale;
|
||||
Common::String _filetype;
|
||||
int _tiles; /**< used to scale the without bleeding colors between adjacent tiles */
|
||||
bool _introOnly; /**< whether can be freed after the intro */
|
||||
int _transparentIndex; /**< color index to consider transparent */
|
||||
bool _xu4Graphic; /**< an original xu4 graphic not part of u4dos or the VGA upgrade */
|
||||
ImageFixup _fixup; /**< a routine to do miscellaneous fixes to the image */
|
||||
Image *_image; /**< the image we're describing */
|
||||
Common::HashMap<Common::String, SubImage *> _subImages;
|
||||
|
||||
bool hasBlackBackground();
|
||||
};
|
||||
|
||||
/**
|
||||
* The image manager singleton that keeps track of all the images.
|
||||
*/
|
||||
class ImageMgr : Observer<Settings *> {
|
||||
public:
|
||||
static ImageMgr *getInstance();
|
||||
static void destroy();
|
||||
|
||||
/**
|
||||
* Load in a background image from a ".ega" file.
|
||||
*/
|
||||
ImageInfo *get(const Common::String &name, bool returnUnscaled = false);
|
||||
|
||||
/**
|
||||
* Returns information for the given image set.
|
||||
*/
|
||||
SubImage *getSubImage(const Common::String &name);
|
||||
|
||||
/**
|
||||
* Free up any background images used only in the animations.
|
||||
*/
|
||||
void freeIntroBackgrounds();
|
||||
const Std::vector<Common::String> &getSetNames();
|
||||
Common::File *getImageFile(ImageInfo *info);
|
||||
bool imageExists(ImageInfo *info);
|
||||
|
||||
private:
|
||||
ImageMgr();
|
||||
~ImageMgr();
|
||||
void init();
|
||||
|
||||
ImageSet *loadImageSetFromConf(const ConfigElement &conf);
|
||||
ImageInfo *loadImageInfoFromConf(const ConfigElement &conf);
|
||||
SubImage *loadSubImageFromConf(const ImageInfo *info, const ConfigElement &conf);
|
||||
|
||||
/**
|
||||
* Returns information for the given image set.
|
||||
*/
|
||||
ImageSet *getSet(const Common::String &setname);
|
||||
|
||||
/**
|
||||
* Returns image information for the current image set.
|
||||
*/
|
||||
ImageInfo *getInfo(const Common::String &name);
|
||||
|
||||
/**
|
||||
* Returns information for the given image set.
|
||||
*/
|
||||
ImageInfo *getInfoFromSet(const Common::String &name, ImageSet *set);
|
||||
|
||||
Common::String guessFileType(const Common::String &filename);
|
||||
|
||||
void fixupIntro(Image *im, int prescale);
|
||||
void fixupAbyssVision(Image *im, int prescale);
|
||||
void fixupAbacus(Image *im, int prescale);
|
||||
|
||||
/**
|
||||
* Swap blue and green for the dungeon walls when facing north or
|
||||
* south.
|
||||
*/
|
||||
void fixupDungNS(Image *im, int prescale);
|
||||
|
||||
/**
|
||||
* The FMTowns images have a different screen dimension. This moves them
|
||||
* up to what xu4 is accustomed to. south.
|
||||
*/
|
||||
void fixupFMTowns(Image *im, int prescale);
|
||||
|
||||
/**
|
||||
* Find the new base image set when settings have changed.
|
||||
*/
|
||||
void update(Settings *newSettings);
|
||||
|
||||
/**
|
||||
* Create an image decoder for the specified file type.
|
||||
*/
|
||||
::Image::ImageDecoder *createDecoder(const Common::String &fileType, int width, int height, int bpp);
|
||||
|
||||
static ImageMgr *_instance;
|
||||
Common::HashMap<Common::String, ImageSet *> _imageSets;
|
||||
Std::vector<Common::String> _imageSetNames;
|
||||
ImageSet *_baseSet;
|
||||
ImageInfo _screenInfo;
|
||||
uint *_abyssData;
|
||||
};
|
||||
|
||||
#define imageMgr (ImageMgr::getInstance())
|
||||
|
||||
} // End of namespace Ultima4
|
||||
} // End of namespace Ultima
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user