summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-12-27 22:12:10 +0300
committerAndrei Karas <akaras@inbox.ru>2012-12-27 23:15:06 +0300
commit8714a174353529061c8c8d088d7246c4bd81000d (patch)
tree800067371dc1e4e425980afb9b54cf56f034ffa8
parentdee02b54a28994e78bd7e738ac0b49df9f59d67f (diff)
downloadmanaverse-8714a174353529061c8c8d088d7246c4bd81000d.tar.gz
manaverse-8714a174353529061c8c8d088d7246c4bd81000d.tar.bz2
manaverse-8714a174353529061c8c8d088d7246c4bd81000d.tar.xz
manaverse-8714a174353529061c8c8d088d7246c4bd81000d.zip
Change outline function to better quality but slower.
Also add function to create 32 bit surfaces.
-rw-r--r--src/gui/sdlfont.cpp34
-rw-r--r--src/resources/imagehelper.h3
-rw-r--r--src/resources/openglimagehelper.cpp22
-rw-r--r--src/resources/openglimagehelper.h2
-rw-r--r--src/resources/sdlimagehelper.cpp18
-rw-r--r--src/resources/sdlimagehelper.h2
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;