Convert cursors to RGBA
...instead of colour-keyed RGB. Less goofing-around for the user.
This commit is contained in:
parent
51e6cb5a6c
commit
baf88b0d4b
8 changed files with 21 additions and 56 deletions
Binary file not shown.
Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 229 B |
Binary file not shown.
Before Width: | Height: | Size: 131 B After Width: | Height: | Size: 144 B |
|
@ -92,7 +92,7 @@ void Backend_PostWindowCreation(void);
|
||||||
bool Backend_GetBasePath(std::string *string_buffer);
|
bool Backend_GetBasePath(std::string *string_buffer);
|
||||||
void Backend_HideMouse(void);
|
void Backend_HideMouse(void);
|
||||||
void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height);
|
void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height);
|
||||||
void Backend_SetCursor(const unsigned char *rgb_pixels, size_t width, size_t height);
|
void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height);
|
||||||
void PlaybackBackend_EnableDragAndDrop(void);
|
void PlaybackBackend_EnableDragAndDrop(void);
|
||||||
bool Backend_SystemTask(bool active);
|
bool Backend_SystemTask(bool active);
|
||||||
void Backend_GetKeyboardState(bool *keyboard_state);
|
void Backend_GetKeyboardState(bool *keyboard_state);
|
||||||
|
|
|
@ -229,45 +229,13 @@ void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Backend_SetCursor(const unsigned char *rgb_pixels, size_t width, size_t height)
|
void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height)
|
||||||
{
|
{
|
||||||
// Convert to RGBA, since that's the only thing GLFW3 accepts
|
GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels};
|
||||||
unsigned char *rgba_pixels = (unsigned char*)malloc(width * height * 4);
|
cursor = glfwCreateCursor(&glfw_image, 0, 0);
|
||||||
|
|
||||||
const unsigned char *rgb_pointer = rgb_pixels;
|
if (cursor != NULL)
|
||||||
unsigned char *rgba_pointer = rgba_pixels;
|
glfwSetCursor(window, cursor);
|
||||||
|
|
||||||
if (rgba_pixels != NULL)
|
|
||||||
{
|
|
||||||
for (size_t y = 0; y < height; ++y)
|
|
||||||
{
|
|
||||||
for (size_t x = 0; x < width; ++x)
|
|
||||||
{
|
|
||||||
if (rgb_pointer[0] == 0xFF && rgb_pointer[1] == 0 && rgb_pointer[2] == 0xFF) // Colour-key
|
|
||||||
{
|
|
||||||
*rgba_pointer++ = *rgb_pointer++;
|
|
||||||
*rgba_pointer++ = *rgb_pointer++;
|
|
||||||
*rgba_pointer++ = *rgb_pointer++;
|
|
||||||
*rgba_pointer++ = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*rgba_pointer++ = *rgb_pointer++;
|
|
||||||
*rgba_pointer++ = *rgb_pointer++;
|
|
||||||
*rgba_pointer++ = *rgb_pointer++;
|
|
||||||
*rgba_pointer++ = 0xFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels};
|
|
||||||
cursor = glfwCreateCursor(&glfw_image, 0, 0);
|
|
||||||
|
|
||||||
if (cursor != NULL)
|
|
||||||
glfwSetCursor(window, cursor);
|
|
||||||
|
|
||||||
free(rgba_pixels);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Backend_EnableDragAndDrop(void)
|
void Backend_EnableDragAndDrop(void)
|
||||||
|
|
|
@ -41,9 +41,9 @@ void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t
|
||||||
(void)height;
|
(void)height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Backend_SetCursor(const unsigned char *rgb_pixels, size_t width, size_t height)
|
void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height)
|
||||||
{
|
{
|
||||||
(void)rgb_pixels;
|
(void)rgba_pixels;
|
||||||
(void)width;
|
(void)width;
|
||||||
(void)height;
|
(void)height;
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,25 +134,22 @@ void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Backend_SetCursor(const unsigned char *rgb_pixels, size_t width, size_t height)
|
void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height)
|
||||||
{
|
{
|
||||||
cursor_surface_pixels = (unsigned char*)malloc(width * height * 3);
|
cursor_surface_pixels = (unsigned char*)malloc(width * height * 4);
|
||||||
|
|
||||||
if (cursor_surface_pixels != NULL)
|
if (cursor_surface_pixels != NULL)
|
||||||
{
|
{
|
||||||
memcpy(cursor_surface_pixels, rgb_pixels, width * height * 3);
|
memcpy(cursor_surface_pixels, rgba_pixels, width * height * 4);
|
||||||
|
|
||||||
cursor_surface = SDL_CreateRGBSurfaceWithFormatFrom(cursor_surface_pixels, width, height, 0, width * 3, SDL_PIXELFORMAT_RGB24);
|
cursor_surface = SDL_CreateRGBSurfaceWithFormatFrom(cursor_surface_pixels, width, height, 0, width * 4, SDL_PIXELFORMAT_RGBA32);
|
||||||
|
|
||||||
if (cursor_surface != NULL)
|
if (cursor_surface != NULL)
|
||||||
{
|
{
|
||||||
if (SDL_SetColorKey(cursor_surface, SDL_TRUE, SDL_MapRGB(cursor_surface->format, 0xFF, 0, 0xFF)) == 0)
|
cursor = SDL_CreateColorCursor(cursor_surface, 0, 0);
|
||||||
{
|
|
||||||
cursor = SDL_CreateColorCursor(cursor_surface, 0, 0);
|
|
||||||
|
|
||||||
if (cursor != NULL)
|
if (cursor != NULL)
|
||||||
SDL_SetCursor(cursor);
|
SDL_SetCursor(cursor);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -83,9 +83,9 @@ void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t
|
||||||
(void)height;
|
(void)height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Backend_SetCursor(const unsigned char *rgb_pixels, size_t width, size_t height)
|
void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height)
|
||||||
{
|
{
|
||||||
(void)rgb_pixels;
|
(void)rgba_pixels;
|
||||||
(void)width;
|
(void)width;
|
||||||
(void)height;
|
(void)height;
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,12 +312,12 @@ int main(int argc, char *argv[])
|
||||||
if (cursor_resource_data != NULL)
|
if (cursor_resource_data != NULL)
|
||||||
{
|
{
|
||||||
size_t cursor_width, cursor_height;
|
size_t cursor_width, cursor_height;
|
||||||
unsigned char *cursor_rgb_pixels = DecodeBitmap(cursor_resource_data, cursor_resource_size, &cursor_width, &cursor_height, 3);
|
unsigned char *cursor_rgba_pixels = DecodeBitmap(cursor_resource_data, cursor_resource_size, &cursor_width, &cursor_height, 4);
|
||||||
|
|
||||||
if (cursor_rgb_pixels != NULL)
|
if (cursor_rgba_pixels != NULL)
|
||||||
{
|
{
|
||||||
Backend_SetCursor(cursor_rgb_pixels, cursor_width, cursor_height);
|
Backend_SetCursor(cursor_rgba_pixels, cursor_width, cursor_height);
|
||||||
FreeBitmap(cursor_rgb_pixels);
|
FreeBitmap(cursor_rgba_pixels);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue