/* functions from SGE library */
inline void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
-#ifdef PLATFORM_WIN32
+/* #ifdef PLATFORM_WIN32 */
#define FULLSCREEN_BUG
-#endif
+/* #endif */
/* stuff needed to work around SDL/Windows fullscreen drawing bug */
static int fullscreen_width;
}
#endif
-inline Pixel SDLGetPixel(Bitmap *dst_bitmap, int x, int y)
+inline Pixel SDLGetPixel(Bitmap *src_bitmap, int x, int y)
{
- SDL_Surface *surface = dst_bitmap->surface;
+ SDL_Surface *surface = src_bitmap->surface;
#ifdef FULLSCREEN_BUG
- if (dst_bitmap == backbuffer || dst_bitmap == window)
+ if (src_bitmap == backbuffer || src_bitmap == window)
{
x += video_xoffset;
y += video_yoffset;
sge_Line(Surface, x1, y1, x2, y2, SDL_MapRGB(Surface->format, R, G, B));
}
+inline void SDLPutPixel(Bitmap *dst_bitmap, int x, int y, Pixel pixel)
+{
+#ifdef FULLSCREEN_BUG
+ if (dst_bitmap == backbuffer || dst_bitmap == window)
+ {
+ x += video_xoffset;
+ y += video_yoffset;
+ }
+#endif
+
+ sge_PutPixel(dst_bitmap->surface, x, y, pixel);
+}
+
/*
-----------------------------------------------------------------------------
inline void SDLInvertArea(Bitmap *bitmap, int src_x, int src_y,
int width, int height, Uint32 color)
{
- SDL_Surface *surface = bitmap->surface;
int x, y;
for (y=src_y; y < src_y + height; y++)
{
Uint32 pixel = SDLGetPixel(bitmap, x, y);
- sge_PutPixel(surface, x, y, pixel == BLACK_PIXEL ? color : BLACK_PIXEL);
+ SDLPutPixel(bitmap, x, y, pixel == BLACK_PIXEL ? color : BLACK_PIXEL);
+ }
+ }
+}
+
+inline void SDLCopyInverseMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap,
+ int src_x, int src_y, int width, int height,
+ int dst_x, int dst_y)
+{
+ int x, y;
+
+ for (y=0; y < height; y++)
+ {
+ for (x=0; x < width; x++)
+ {
+ Uint32 pixel = SDLGetPixel(src_bitmap, src_x + x, src_y + y);
+
+ if (pixel != BLACK_PIXEL)
+ SDLPutPixel(dst_bitmap, dst_x + x, dst_y + y, BLACK_PIXEL);
}
}
}
/* custom cursor fuctions */
/* ------------------------------------------------------------------------- */
-static SDL_Cursor *create_cursor(const char **image)
+static SDL_Cursor *create_cursor(struct MouseCursorInfo *cursor_info)
{
- int i, row, col;
- Uint8 data[4*32];
- Uint8 mask[4*32];
- int hot_x, hot_y;
-
- i = -1;
- for (row=0; row<32; ++row)
- {
- for (col=0; col<32; ++col)
- {
- if (col % 8)
- {
- data[i] <<= 1;
- mask[i] <<= 1;
- }
- else
- {
- i++;
- data[i] = mask[i] = 0;
- }
-
- switch (image[4+row][col])
- {
- case 'X':
- data[i] |= 0x01;
- mask[i] |= 0x01;
- break;
- case '.':
- mask[i] |= 0x01;
- break;
- case ' ':
- break;
- }
- }
- }
-
- sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
-
- return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
+ return SDL_CreateCursor(cursor_info->data, cursor_info->mask,
+ cursor_info->width, cursor_info->height,
+ cursor_info->hot_x, cursor_info->hot_y);
}
-void SDLSetMouseCursor(const char **cursor_image)
+void SDLSetMouseCursor(struct MouseCursorInfo *cursor_info)
{
- static const char **last_cursor_image = NULL;
+ static struct MouseCursorInfo *last_cursor_info = NULL;
static SDL_Cursor *cursor_default = NULL;
static SDL_Cursor *cursor_current = NULL;
if (cursor_default == NULL)
cursor_default = SDL_GetCursor();
- if (cursor_image != NULL && cursor_image != last_cursor_image)
+ if (cursor_info != NULL && cursor_info != last_cursor_info)
{
- cursor_current = create_cursor(cursor_image);
- last_cursor_image = cursor_image;
+ cursor_current = create_cursor(cursor_info);
+ last_cursor_info = cursor_info;
}
- SDL_SetCursor(cursor_image ? cursor_current : cursor_default);
+ SDL_SetCursor(cursor_info ? cursor_current : cursor_default);
}
}
else if (event->type == EVENT_MOTIONNOTIFY)
{
- if (((ButtonEvent *)event)->x > video_xoffset)
- ((ButtonEvent *)event)->x -= video_xoffset;
+ if (((MotionEvent *)event)->x > video_xoffset)
+ ((MotionEvent *)event)->x -= video_xoffset;
else
- ((ButtonEvent *)event)->x = 0;
- if (((ButtonEvent *)event)->y > video_yoffset)
- ((ButtonEvent *)event)->y -= video_yoffset;
+ ((MotionEvent *)event)->x = 0;
+ if (((MotionEvent *)event)->y > video_yoffset)
+ ((MotionEvent *)event)->y -= video_yoffset;
else
- ((ButtonEvent *)event)->y = 0;
+ ((MotionEvent *)event)->y = 0;
}
#endif
}