diff options
author | Andrei Karas <akaras@inbox.ru> | 2012-12-27 22:12:10 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2012-12-27 23:15:06 +0300 |
commit | 8714a174353529061c8c8d088d7246c4bd81000d (patch) | |
tree | 800067371dc1e4e425980afb9b54cf56f034ffa8 /src | |
parent | dee02b54a28994e78bd7e738ac0b49df9f59d67f (diff) | |
download | manaplus-8714a174353529061c8c8d088d7246c4bd81000d.tar.gz manaplus-8714a174353529061c8c8d088d7246c4bd81000d.tar.bz2 manaplus-8714a174353529061c8c8d088d7246c4bd81000d.tar.xz manaplus-8714a174353529061c8c8d088d7246c4bd81000d.zip |
Change outline function to better quality but slower.
Also add function to create 32 bit surfaces.
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/sdlfont.cpp | 34 | ||||
-rw-r--r-- | src/resources/imagehelper.h | 3 | ||||
-rw-r--r-- | src/resources/openglimagehelper.cpp | 22 | ||||
-rw-r--r-- | src/resources/openglimagehelper.h | 2 | ||||
-rw-r--r-- | src/resources/sdlimagehelper.cpp | 18 | ||||
-rw-r--r-- | src/resources/sdlimagehelper.h | 2 |
6 files changed, 76 insertions, 5 deletions
diff --git a/src/gui/sdlfont.cpp b/src/gui/sdlfont.cpp index 30c16a4c3..d195278fa 100644 --- a/src/gui/sdlfont.cpp +++ b/src/gui/sdlfont.cpp @@ -35,6 +35,8 @@ #include <guichan/exception.hpp> +#include <SDL_gfxBlitFunc.h> + #include "debug.h" const unsigned int CACHE_SIZE = 256; @@ -92,11 +94,21 @@ class SDLTextChunk final || color.b != color2.b) { // outlining SDL_Color sdlCol2; + const SDL_PixelFormat * const format = surface->format; + SDL_Surface *background = imageHelper->create32BitSurface( + surface->w, surface->h); + if (!background) + { + img = nullptr; + SDL_FreeSurface(surface); + BLOCK_END("SDLTextChunk::generate") + return; + } sdlCol2.b = static_cast<uint8_t>(color2.b); sdlCol2.r = static_cast<uint8_t>(color2.r); sdlCol2.g = static_cast<uint8_t>(color2.g); SDL_Surface *const surface2 = TTF_RenderUTF8_Blended( - font2, strBuf, sdlCol2); + font, strBuf, sdlCol2); if (!surface2) { img = nullptr; @@ -106,13 +118,25 @@ class SDLTextChunk final } SDL_Rect rect = { - OUTLINE_SIZE, OUTLINE_SIZE, - surface2->w, surface2->h + OUTLINE_SIZE, 0, + surface->w, surface->h }; +// SDL_SetAlpha(surface2, 0, SDL_ALPHA_OPAQUE); + SDL_gfxBlitRGBA(surface2, nullptr, background, &rect); + rect.x = -OUTLINE_SIZE; + SDL_gfxBlitRGBA(surface2, nullptr, background, &rect); + rect.x = 0; + rect.y = -OUTLINE_SIZE; + SDL_gfxBlitRGBA(surface2, nullptr, background, &rect); + rect.y = OUTLINE_SIZE; + SDL_gfxBlitRGBA(surface2, nullptr, background, &rect); + rect.x = 0; + rect.y = 0; // SDL_SetAlpha(surface, 0, SDL_ALPHA_OPAQUE); - SDL_BlitSurface(surface, nullptr, surface2, &rect); + SDL_gfxBlitRGBA(surface, nullptr, background, &rect); SDL_FreeSurface(surface); - surface = surface2; + SDL_FreeSurface(surface2); + surface = background; } img = imageHelper->createTextSurface(surface, alpha); SDL_FreeSurface(surface); diff --git a/src/resources/imagehelper.h b/src/resources/imagehelper.h index a11a55e2e..83fc3e03c 100644 --- a/src/resources/imagehelper.h +++ b/src/resources/imagehelper.h @@ -90,6 +90,9 @@ class ImageHelper void dumpSurfaceFormat(const SDL_Surface *const image) const; + virtual SDL_Surface *create32BitSurface(int width, int height) + A_WARN_UNUSED = 0; + static void setEnableAlpha(const bool n) { mEnableAlpha = n; } diff --git a/src/resources/openglimagehelper.cpp b/src/resources/openglimagehelper.cpp index 7e5c77c7f..badaf0223 100644 --- a/src/resources/openglimagehelper.cpp +++ b/src/resources/openglimagehelper.cpp @@ -318,4 +318,26 @@ void OpenGLImageHelper::initTextureSampler(GLint id) mglSamplerParameteri(id, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } } + +SDL_Surface *OpenGLImageHelper::create32BitSurface(int width, int height) +{ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + const int rmask = 0xff000000; + const int gmask = 0x00ff0000; + const int bmask = 0x0000ff00; + const int amask = 0x000000ff; +#else + const int rmask = 0x000000ff; + const int gmask = 0x0000ff00; + const int bmask = 0x00ff0000; + const int amask = 0xff000000; +#endif + + width = powerOfTwo(width); + height = powerOfTwo(height); + + return SDL_CreateRGBSurface(SDL_SWSURFACE, + width, height, 32, rmask, gmask, bmask, amask); +} + #endif diff --git a/src/resources/openglimagehelper.h b/src/resources/openglimagehelper.h index 01ae7f66c..0036bf007 100644 --- a/src/resources/openglimagehelper.h +++ b/src/resources/openglimagehelper.h @@ -126,6 +126,8 @@ class OpenGLImageHelper final : public ImageHelper static void setUseTextureSampler(bool b) { mUseTextureSampler = b; } + SDL_Surface *create32BitSurface(int width, int height); + protected: /** * Returns the first power of two equal or bigger than the input. diff --git a/src/resources/sdlimagehelper.cpp b/src/resources/sdlimagehelper.cpp index a5423bc62..82e476b8c 100644 --- a/src/resources/sdlimagehelper.cpp +++ b/src/resources/sdlimagehelper.cpp @@ -302,3 +302,21 @@ int SDLImageHelper::useOpenGL() { return 0; } + +SDL_Surface *SDLImageHelper::create32BitSurface(int width, int height) +{ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + const int rmask = 0xff000000; + const int gmask = 0x00ff0000; + const int bmask = 0x0000ff00; + const int amask = 0x000000ff; +#else + const int rmask = 0x000000ff; + const int gmask = 0x0000ff00; + const int bmask = 0x00ff0000; + const int amask = 0xff000000; +#endif + + return SDL_CreateRGBSurface(SDL_SWSURFACE, + width, height, 32, rmask, gmask, bmask, amask); +} diff --git a/src/resources/sdlimagehelper.h b/src/resources/sdlimagehelper.h index 7c6cabaef..a0e19ca39 100644 --- a/src/resources/sdlimagehelper.h +++ b/src/resources/sdlimagehelper.h @@ -82,6 +82,8 @@ class SDLImageHelper final : public ImageHelper static SDL_Surface* SDLDuplicateSurface(SDL_Surface *const tmpImage) A_WARN_UNUSED; + SDL_Surface *create32BitSurface(int width, int height); + protected: /** SDL_Surface to SDL_Surface Image loader */ Image *_SDLload(SDL_Surface *tmpImage) const A_WARN_UNUSED; |