mirror of
https://github.com/yann64/haikuports.git
synced 2026-04-22 19:50:05 +02:00
fifechan: Add patches for non 32 bit screen modes and linking.
This commit is contained in:
@@ -7,7 +7,7 @@ SOURCE_URI="https://github.com/fifengine/fifechan/archive/0.1.2.tar.gz"
|
||||
LICENSE="GNU LGPL v2.1"
|
||||
COPYRIGHT="2004-2014 fifechan developers"
|
||||
CHECKSUM_SHA256="4a4239314ae33c5413e4d7d3e5f2f1a7e53fb596fd1480ea7443ee78041e6b2d"
|
||||
REVISION="1"
|
||||
REVISION="2"
|
||||
ARCHITECTURES="x86 x86_64"
|
||||
PATCHES="fifechan-$portVersion.patchset"
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
From 5b9679cb68b2f9334aa1b20e01fe64c97853f66a Mon Sep 17 00:00:00 2001
|
||||
From 28d23ce3c076a141f8bb6fe294e408b004c91dc0 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Lotz <mmlr@mlotz.ch>
|
||||
Date: Tue, 13 Oct 2015 22:46:23 +0000
|
||||
Subject: [PATCH] Add LIB_INSTALL_DIR and INCLUDE_INSTALL_DIR in build system.
|
||||
Subject: [PATCH 1/5] Add LIB_INSTALL_DIR and INCLUDE_INSTALL_DIR in build
|
||||
system.
|
||||
|
||||
---
|
||||
CMakeLists.txt | 42 ++++++++++++++++++++++--------------------
|
||||
@@ -113,3 +114,293 @@ index c6d638e..7fed177 100644
|
||||
--
|
||||
2.2.2
|
||||
|
||||
|
||||
From 60abc7fabb4e4e10d3398771c80497f6b0eb4d9b Mon Sep 17 00:00:00 2001
|
||||
From: Michael Lotz <mmlr@mlotz.ch>
|
||||
Date: Sat, 31 Oct 2015 15:38:58 +0000
|
||||
Subject: [PATCH 2/5] Make build system Haiku aware to actually link required
|
||||
libs.
|
||||
|
||||
Previously the libraries didn't actually link to their dependencies.
|
||||
---
|
||||
CMakeLists.txt | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 7fed177..7c06c2f 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -210,11 +210,11 @@ OPTION(ENABLE_OPENGL_CONTRIB "Enabled the Fifechan OpenGL Contrib extension" OFF
|
||||
OPTION(BUILD_FIFECHAN_OPENGL_SHARED "Build the Fifechan OpenGL extension library as a shared library." ON)
|
||||
FIND_PACKAGE(OpenGL)
|
||||
|
||||
-IF(APPLE AND ENABLE_OPENGL)
|
||||
+IF((APPLE OR HAIKU) AND ENABLE_OPENGL)
|
||||
FIND_LIBRARY(OPENGL_LIBRARY OpenGL)
|
||||
MARK_AS_ADVANCED(OPENGL_LIBRARY)
|
||||
SET(EXTRA_LIBS ${OPENGL_LIBRARY})
|
||||
-ENDIF(APPLE AND ENABLE_OPENGL)
|
||||
+ENDIF((APPLE OR HAIKU) AND ENABLE_OPENGL)
|
||||
|
||||
IF(ENABLE_OPENGL_CONTRIB)
|
||||
FIND_PACKAGE(OGLFT)
|
||||
@@ -266,6 +266,9 @@ IF(ENABLE_OPENGL AND OPENGL_FOUND)
|
||||
TARGET_LINK_LIBRARIES(${PROJECT_NAME}_opengl ${OPENGL_LIBRARY} ${PROJECT_NAME})
|
||||
ENDIF(ENABLE_OPENGL_CONTRIB AND OpenGL-FT_FOUND)
|
||||
ENDIF(APPLE)
|
||||
+ IF(HAIKU)
|
||||
+ TARGET_LINK_LIBRARIES(${PROJECT_NAME}_opengl ${OPENGL_LIBRARY} ${PROJECT_NAME})
|
||||
+ ENDIF(HAIKU)
|
||||
|
||||
ADD_CUSTOM_TARGET(opengllib DEPENDS ${PROJECT_NAME}_opengl) # Create symlink
|
||||
SET_TARGET_PROPERTIES(${PROJECT_NAME}_opengl PROPERTIES
|
||||
@@ -295,12 +298,12 @@ IF(ENABLE_SDL_CONTRIB)
|
||||
FIND_PACKAGE(SDL_ttf)
|
||||
ENDIF(ENABLE_SDL_CONTRIB)
|
||||
|
||||
-IF(APPLE AND ENABLE_SDL)
|
||||
+IF((APPLE OR HAIKU) AND ENABLE_SDL)
|
||||
FIND_LIBRARY(SDL_LIBRARY SDL)
|
||||
FIND_LIBRARY(SDLIMAGE_LIBRARY SDL_image)
|
||||
MARK_AS_ADVANCED(SDL_LIBRARY SDLIMAGE_LIBRARY)
|
||||
SET(EXTRA_LIBS ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY})
|
||||
-ENDIF(APPLE AND ENABLE_SDL)
|
||||
+ENDIF((APPLE OR HAIKU) AND ENABLE_SDL)
|
||||
IF(ENABLE_SDL AND SDL_FOUND AND SDLIMAGE_FOUND)
|
||||
|
||||
INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR})
|
||||
@@ -340,6 +343,9 @@ IF(ENABLE_SDL AND SDL_FOUND AND SDLIMAGE_FOUND)
|
||||
IF(APPLE)
|
||||
TARGET_LINK_LIBRARIES(${PROJECT_NAME}_sdl ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} SDLmain ${PROJECT_NAME})
|
||||
ENDIF(APPLE)
|
||||
+ IF(HAIKU)
|
||||
+ TARGET_LINK_LIBRARIES(${PROJECT_NAME}_sdl ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${PROJECT_NAME})
|
||||
+ ENDIF(HAIKU)
|
||||
ADD_CUSTOM_TARGET(sdllib DEPENDS ${PROJECT_NAME}_sdl) # Create symlink
|
||||
SET_TARGET_PROPERTIES(${PROJECT_NAME}_sdl PROPERTIES
|
||||
VERSION ${${PROJECT_NAME}_VERSION}
|
||||
--
|
||||
2.2.2
|
||||
|
||||
|
||||
From 931f7327361a86accb771ce539495fbcff6f2873 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Lotz <mmlr@mlotz.ch>
|
||||
Date: Wed, 28 Oct 2015 02:17:16 +0000
|
||||
Subject: [PATCH 3/5] Fix casting of 16 bit buffer in SDL blending function.
|
||||
|
||||
The buffer was erroneously cast to Uint32 leading to reads past the
|
||||
allocation for the very last pixel.
|
||||
---
|
||||
include/fifechan/sdl/sdlpixel.hpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/fifechan/sdl/sdlpixel.hpp b/include/fifechan/sdl/sdlpixel.hpp
|
||||
index 665d976..5470570 100644
|
||||
--- a/include/fifechan/sdl/sdlpixel.hpp
|
||||
+++ b/include/fifechan/sdl/sdlpixel.hpp
|
||||
@@ -243,7 +243,7 @@ namespace fcn
|
||||
break;
|
||||
|
||||
case 2:
|
||||
- *(Uint16 *)p = SDLAlpha16(pixel, *(Uint32 *)p, color.a, surface->format);
|
||||
+ *(Uint16 *)p = SDLAlpha16(pixel, *(Uint16 *)p, color.a, surface->format);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
--
|
||||
2.2.2
|
||||
|
||||
|
||||
From be2540efa64a2a30095a3e2d09cf676b4265e5f3 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Lotz <mmlr@mlotz.ch>
|
||||
Date: Wed, 28 Oct 2015 02:22:01 +0000
|
||||
Subject: [PATCH 4/5] Avoid needless SDL blending operation for fully opaque
|
||||
pixels.
|
||||
|
||||
This avoids some overhead and truncation artefacts.
|
||||
---
|
||||
include/fifechan/sdl/sdlpixel.hpp | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/include/fifechan/sdl/sdlpixel.hpp b/include/fifechan/sdl/sdlpixel.hpp
|
||||
index 5470570..5332c59 100644
|
||||
--- a/include/fifechan/sdl/sdlpixel.hpp
|
||||
+++ b/include/fifechan/sdl/sdlpixel.hpp
|
||||
@@ -228,6 +228,11 @@ namespace fcn
|
||||
*/
|
||||
inline void SDLputPixelAlpha(SDL_Surface* surface, int x, int y, const Color& color)
|
||||
{
|
||||
+ if (color.a == 255) {
|
||||
+ SDLputPixel(surface, x, y, color);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
int bpp = surface->format->BytesPerPixel;
|
||||
|
||||
SDL_LockSurface(surface);
|
||||
--
|
||||
2.2.2
|
||||
|
||||
|
||||
From a3adac2f041867b02d2dce10cf4cc788f9d46db6 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Lotz <mmlr@mlotz.ch>
|
||||
Date: Sat, 31 Oct 2015 15:21:24 +0000
|
||||
Subject: [PATCH 5/5] Replace individual SDL blending functions with generic
|
||||
ones.
|
||||
|
||||
The base blending formula is changed to the one found in SDL_gfx
|
||||
which produces better output.
|
||||
---
|
||||
include/fifechan/sdl/sdlpixel.hpp | 75 ++++++++++++++++++++-------------------
|
||||
src/sdl/sdlgraphics.cpp | 4 +--
|
||||
2 files changed, 41 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/include/fifechan/sdl/sdlpixel.hpp b/include/fifechan/sdl/sdlpixel.hpp
|
||||
index 5332c59..7232d70 100644
|
||||
--- a/include/fifechan/sdl/sdlpixel.hpp
|
||||
+++ b/include/fifechan/sdl/sdlpixel.hpp
|
||||
@@ -175,35 +175,31 @@ namespace fcn
|
||||
}
|
||||
|
||||
/**
|
||||
- * Blends two 32 bit colors together.
|
||||
+ * Blends two color components together.
|
||||
*
|
||||
- * @param src the source color.
|
||||
- * @param dst the destination color.
|
||||
- * @param a alpha.
|
||||
+ * @param source the source value.
|
||||
+ * @param dest the destination value.
|
||||
+ * @param alpha alpha.
|
||||
*/
|
||||
- inline unsigned int SDLAlpha32(unsigned int src, unsigned int dst, unsigned char a)
|
||||
+ template<typename T>
|
||||
+ inline T SDLBlend(T source, T dest, unsigned char alpha)
|
||||
{
|
||||
- unsigned int b = ((src & 0xff) * a + (dst & 0xff) * (255 - a)) >> 8;
|
||||
- unsigned int g = ((src & 0xff00) * a + (dst & 0xff00) * (255 - a)) >> 8;
|
||||
- unsigned int r = ((src & 0xff0000) * a + (dst & 0xff0000) * (255 - a)) >> 8;
|
||||
-
|
||||
- return (b & 0xff) | (g & 0xff00) | (r & 0xff0000);
|
||||
+ return dest + ((source - dest) * alpha >> 8);
|
||||
}
|
||||
|
||||
/**
|
||||
- * Blends two 16 bit colors together.
|
||||
+ * Blends two colors together.
|
||||
*
|
||||
* @param src the source color.
|
||||
* @param dst the destination color.
|
||||
* @param a alpha.
|
||||
*/
|
||||
- inline unsigned short SDLAlpha16(unsigned short src, unsigned short dst, unsigned char a, const SDL_PixelFormat *f)
|
||||
+ template<typename T>
|
||||
+ inline T SDLBlendColor(T src, T dst, unsigned char alpha, const SDL_PixelFormat *f)
|
||||
{
|
||||
- unsigned int b = ((src & f->Rmask) * a + (dst & f->Rmask) * (255 - a)) >> 8;
|
||||
- unsigned int g = ((src & f->Gmask) * a + (dst & f->Gmask) * (255 - a)) >> 8;
|
||||
- unsigned int r = ((src & f->Bmask) * a + (dst & f->Bmask) * (255 - a)) >> 8;
|
||||
-
|
||||
- return (unsigned short)((b & f->Rmask) | (g & f->Gmask) | (r & f->Bmask));
|
||||
+ return (SDLBlend(src & f->Rmask, dst & f->Rmask, alpha) & f->Rmask)
|
||||
+ | (SDLBlend(src & f->Gmask, dst & f->Gmask, alpha) & f->Gmask)
|
||||
+ | (SDLBlend(src & f->Bmask, dst & f->Bmask, alpha) & f->Bmask);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -239,44 +235,51 @@ namespace fcn
|
||||
|
||||
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
|
||||
|
||||
- Uint32 pixel = SDL_MapRGB(surface->format, color.r, color.g, color.b);
|
||||
-
|
||||
switch(bpp)
|
||||
{
|
||||
case 1:
|
||||
- *p = pixel;
|
||||
+ {
|
||||
+ Uint32 pixel = SDL_MapRGB(surface->format, color.r, color.g, color.b);
|
||||
+
|
||||
+ SDL_Color *colors = surface->format->palette->colors;
|
||||
+ SDL_Color &sourceColor = colors[pixel];
|
||||
+ SDL_Color &destColor = colors[*p];
|
||||
+
|
||||
+ *p = SDL_MapRGB(surface->format,
|
||||
+ SDLBlend(sourceColor.r, destColor.r, color.a),
|
||||
+ SDLBlend(sourceColor.g, destColor.g, color.a),
|
||||
+ SDLBlend(sourceColor.b, destColor.b, color.a));
|
||||
break;
|
||||
+ }
|
||||
|
||||
case 2:
|
||||
- *(Uint16 *)p = SDLAlpha16(pixel, *(Uint16 *)p, color.a, surface->format);
|
||||
+ {
|
||||
+ Uint32 pixel = SDL_MapRGB(surface->format, color.r, color.g, color.b);
|
||||
+ *(Uint16 *)p = SDLBlendColor<Uint16>(pixel, *(Uint16 *)p, color.a, surface->format);
|
||||
break;
|
||||
+ }
|
||||
|
||||
case 3:
|
||||
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
|
||||
{
|
||||
- unsigned int r = (p[0] * (255 - color.a) + color.r * color.a) >> 8;
|
||||
- unsigned int g = (p[1] * (255 - color.a) + color.g * color.a) >> 8;
|
||||
- unsigned int b = (p[2] * (255 - color.a) + color.b * color.a) >> 8;
|
||||
-
|
||||
- p[2] = b;
|
||||
- p[1] = g;
|
||||
- p[0] = r;
|
||||
+ p[0] = SDLBlend<Uint8>(color.r, p[0], color.a);
|
||||
+ p[1] = SDLBlend<Uint8>(color.g, p[1], color.a);
|
||||
+ p[2] = SDLBlend<Uint8>(color.b, p[2], color.a);
|
||||
}
|
||||
else
|
||||
{
|
||||
- unsigned int r = (p[2] * (255 - color.a) + color.r * color.a) >> 8;
|
||||
- unsigned int g = (p[1] * (255 - color.a) + color.g * color.a) >> 8;
|
||||
- unsigned int b = (p[0] * (255 - color.a) + color.b * color.a) >> 8;
|
||||
-
|
||||
- p[0] = b;
|
||||
- p[1] = g;
|
||||
- p[2] = r;
|
||||
+ p[0] = SDLBlend<Uint8>(color.b, p[0], color.a);
|
||||
+ p[1] = SDLBlend<Uint8>(color.g, p[1], color.a);
|
||||
+ p[2] = SDLBlend<Uint8>(color.r, p[2], color.a);
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
- *(Uint32 *)p = SDLAlpha32(pixel, *(Uint32 *)p, color.a);
|
||||
+ {
|
||||
+ Uint32 pixel = SDL_MapRGB(surface->format, color.r, color.g, color.b);
|
||||
+ *(Uint32 *)p = SDLBlendColor<Uint32>(pixel, *(Uint32 *)p, color.a, surface->format);
|
||||
break;
|
||||
+ }
|
||||
}
|
||||
|
||||
SDL_UnlockSurface(surface);
|
||||
diff --git a/src/sdl/sdlgraphics.cpp b/src/sdl/sdlgraphics.cpp
|
||||
index ce135a1..d641271 100644
|
||||
--- a/src/sdl/sdlgraphics.cpp
|
||||
+++ b/src/sdl/sdlgraphics.cpp
|
||||
@@ -364,7 +364,7 @@ namespace fcn
|
||||
{
|
||||
if (mAlpha)
|
||||
{
|
||||
- *q = SDLAlpha32(pixel,*q,mColor.a);
|
||||
+ *q = SDLBlendColor<Uint32>(pixel,*q,mColor.a,mTarget->format);
|
||||
q++;
|
||||
}
|
||||
else
|
||||
@@ -479,7 +479,7 @@ namespace fcn
|
||||
{
|
||||
if (mAlpha)
|
||||
{
|
||||
- *(Uint32*)p = SDLAlpha32(pixel,*(Uint32*)p,mColor.a);
|
||||
+ *(Uint32*)p = SDLBlendColor<Uint32>(pixel,*(Uint32*)p,mColor.a,mTarget->format);
|
||||
}
|
||||
else
|
||||
{
|
||||
--
|
||||
2.2.2
|
||||
|
||||
|
||||
Reference in New Issue
Block a user