diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-02-13 14:10:15 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-02-13 14:10:15 +0000 |
commit | 821732ebbc2760ec98e0097f38a962c67285d421 (patch) | |
tree | 2e4fbb5b22108bf6d71011541acb927e9f633a5e /src | |
parent | 6c5351a2cbe2655a6b255cb882ade9e6f988c0ea (diff) | |
download | mana-821732ebbc2760ec98e0097f38a962c67285d421.tar.gz mana-821732ebbc2760ec98e0097f38a962c67285d421.tar.bz2 mana-821732ebbc2760ec98e0097f38a962c67285d421.tar.xz mana-821732ebbc2760ec98e0097f38a962c67285d421.zip |
Allow preservation of alpha channel when loading image resources, which is used
to load alpha blended mouse cursor, which is now drawn instead of using the
system cursor.
Diffstat (limited to 'src')
-rw-r--r-- | src/graphic/graphic.cpp | 16 | ||||
-rw-r--r-- | src/graphic/graphic.h | 3 | ||||
-rw-r--r-- | src/gui/char_select.cpp | 6 | ||||
-rw-r--r-- | src/gui/char_server.cpp | 6 | ||||
-rw-r--r-- | src/gui/login.cpp | 6 | ||||
-rw-r--r-- | src/main.cpp | 9 | ||||
-rw-r--r-- | src/resources/image.cpp | 11 | ||||
-rw-r--r-- | src/resources/image.h | 7 | ||||
-rw-r--r-- | src/resources/resource.h | 3 | ||||
-rw-r--r-- | src/resources/resourcemanager.cpp | 12 | ||||
-rw-r--r-- | src/resources/resourcemanager.h | 6 |
11 files changed, 68 insertions, 17 deletions
diff --git a/src/graphic/graphic.cpp b/src/graphic/graphic.cpp index d39338de..a0786e59 100644 --- a/src/graphic/graphic.cpp +++ b/src/graphic/graphic.cpp @@ -150,9 +150,20 @@ int get_y_offset(Being *being) { } -Graphics::Graphics() +Graphics::Graphics(): + mouseCursor(NULL) { setTarget(SDL_GetVideoSurface()); + + // Load the mouse cursor + ResourceManager *resman = ResourceManager::getInstance(); + mouseCursor = resman->getImage("core/graphics/gui/mouse.png", IMG_ALPHA); + if (!mouseCursor) { + error("Unable to load mouse cursor."); + } + + // Hide the system mouse cursor + SDL_ShowCursor(SDL_DISABLE); } Graphics::~Graphics() { @@ -210,6 +221,9 @@ void Graphics::drawImageRect( void Graphics::updateScreen() { + // Draw mouse before flipping + mouseCursor->draw(screen, mouseX - 5, mouseY - 2); + SDL_Flip(screen); } diff --git a/src/graphic/graphic.h b/src/graphic/graphic.h index 0bae4327..3e4bc168 100644 --- a/src/graphic/graphic.h +++ b/src/graphic/graphic.h @@ -152,6 +152,9 @@ class Graphics : public gcn::SDLGraphics { * screen or swapping pages. */ void updateScreen(); + + private: + Image *mouseCursor; }; /** diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp index 5032b196..128fbf7c 100644 --- a/src/gui/char_select.cpp +++ b/src/gui/char_select.cpp @@ -441,6 +441,12 @@ void charSelect() case SDL_QUIT: state = EXIT; break; + + case SDL_MOUSEMOTION: + // Update the known mouse position + mouseX = event.motion.x; + mouseY = event.motion.y; + break; } guiInput->pushInput(event); diff --git a/src/gui/char_server.cpp b/src/gui/char_server.cpp index c0f1c523..781f4a37 100644 --- a/src/gui/char_server.cpp +++ b/src/gui/char_server.cpp @@ -126,6 +126,12 @@ void char_server() { case SDL_QUIT: state = EXIT; break; + + case SDL_MOUSEMOTION: + // Update the known mouse position + mouseX = event.motion.x; + mouseY = event.motion.y; + break; } guiInput->pushInput(event); diff --git a/src/gui/login.cpp b/src/gui/login.cpp index 5496c01b..d0cfa899 100644 --- a/src/gui/login.cpp +++ b/src/gui/login.cpp @@ -147,6 +147,12 @@ void login() { state = EXIT; } break; + + case SDL_MOUSEMOTION: + // Update the known mouse position + mouseX = event.motion.x; + mouseY = event.motion.y; + break; } guiInput->pushInput(event); diff --git a/src/main.cpp b/src/main.cpp index 8944387a..7e67bafd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,7 +59,7 @@ unsigned char state; unsigned short x, y; unsigned char direction; //unsigned short job, hair, hair_color; -unsigned char stretch_mode, screen_mode; +unsigned char screen_mode; char *dir; Sound sound; @@ -176,7 +176,6 @@ void init_engine() { #else config.setValue("chatlog", "chatlog.txt"); #endif - config.setValue("stretch", 1); config.setValue("remember", 1); config.setValue("username", "Player"); @@ -310,6 +309,12 @@ int main(int argc, char *argv[]) { case SDL_QUIT: state = EXIT; break; + + case SDL_MOUSEMOTION: + // Update the known mouse position + mouseX = event.motion.x; + mouseY = event.motion.y; + break; } guiInput->pushInput(event); diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 15ef6708..f84826bb 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -26,6 +26,7 @@ #include <iostream> #include <SDL_image.h> #include "../graphic/graphic.h" +#include "resourcemanager.h" Image::Image(SDL_Surface *image): image(image) @@ -37,7 +38,7 @@ Image::~Image() unload(); } -Image* Image::load(const std::string &filePath) +Image* Image::load(const std::string &filePath, int flags) { #ifdef __DEBUG std::cout << "Image::load(" << filePath << ")\n"; @@ -46,7 +47,13 @@ Image* Image::load(const std::string &filePath) SDL_Surface *tmpImage = IMG_Load(filePath.c_str()); SDL_SetColorKey(tmpImage, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(tmpImage->format, 255, 0, 255)); - SDL_Surface *image = SDL_DisplayFormat(tmpImage); + SDL_Surface *image = NULL; + if (flags & IMG_ALPHA) { + image = SDL_DisplayFormatAlpha(tmpImage); + } + else { + image = SDL_DisplayFormat(tmpImage); + } SDL_FreeSurface(tmpImage); // Check if the file was opened and return the appropriate value. diff --git a/src/resources/image.h b/src/resources/image.h index 1c2b58cf..bed75983 100644 --- a/src/resources/image.h +++ b/src/resources/image.h @@ -27,6 +27,11 @@ #include "resource.h" #include <SDL.h> +// This flag causes image alpha channel to be preserved, otherwise masking is +// used. +#define IMG_ALPHA 1 + + // Forward declarations class SubImage; class ScaledImage; @@ -53,7 +58,7 @@ class Image : public Resource * @return <code>true</code> if the image was loaded * <code>false</code> otherwise. */ - static Image *load(const std::string &filePath); + static Image *load(const std::string &filePath, int flags); /** * Frees the resources created by SDL. diff --git a/src/resources/resource.h b/src/resources/resource.h index f1252c12..bd6bfcc5 100644 --- a/src/resources/resource.h +++ b/src/resources/resource.h @@ -24,9 +24,6 @@ #ifndef _TMW_RESOURCE_H #define _TMW_RESOURCE_H -#include <string> -//#include <SDL/SDL.h> - /** * A generic reference counted resource object. */ diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index 0d936836..1a2c7a5f 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -21,9 +21,8 @@ * $Id$ */ -#include "../log.h" -#include "image.h" #include "resourcemanager.h" +#include "../log.h" #include <iostream> #include <sstream> @@ -71,7 +70,7 @@ ResourceManager::~ResourceManager() } Resource* ResourceManager::get(const E_RESOURCE_TYPE &type, - const std::string &idPath) + const std::string &idPath, int flags) { // Check if the id exists, and return the value if it does. std::map<std::string, ResourceEntry>::iterator resIter = @@ -108,7 +107,8 @@ Resource* ResourceManager::get(const E_RESOURCE_TYPE &type, break; case IMAGE: // Attempt to create and load our image object. - resource = reinterpret_cast<Resource*>(Image::load(filePath)); + resource = + reinterpret_cast<Resource*>(Image::load(filePath, flags)); break; case SCRIPT: warning("Script resource not supported."); @@ -139,9 +139,9 @@ Resource* ResourceManager::get(const E_RESOURCE_TYPE &type, return resource; } -Image *ResourceManager::getImage(const std::string &idPath) +Image *ResourceManager::getImage(const std::string &idPath, int flags) { - return (Image*)get(IMAGE, idPath); + return (Image*)get(IMAGE, idPath, flags); } ResourceManager* ResourceManager::getInstance() diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h index 1b719b41..fe8b2a96 100644 --- a/src/resources/resourcemanager.h +++ b/src/resources/resourcemanager.h @@ -27,6 +27,7 @@ #include <map> #include <string> #include "resource.h" +#include "image.h" /** * A resource entry descriptor. @@ -80,12 +81,13 @@ class ResourceManager */ Resource *get( const E_RESOURCE_TYPE &type, - const std::string &idPath); + const std::string &idPath, + int flags = 0); /** * Convenience wrapper around ResourceManager::create. */ - Image *getImage(const std::string &idPath); + Image *getImage(const std::string &idPath, int flags = 0); /** * Returns an instance of the class, creating one if it does not |