Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
libSDL
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PocketInsanity
libSDL
Commits
27db584f
Commit
27db584f
authored
Mar 11, 2011
by
Sam Lantinga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added a function to create color cursors: SDL_CreateColorCursor()
parent
3b5aaf89
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
84 additions
and
21 deletions
+84
-21
SDL_mouse.h
include/SDL_mouse.h
+9
-0
SDL_mouse.c
src/events/SDL_mouse.c
+47
-15
testcursor.c
test/testcursor.c
+28
-6
No files found.
include/SDL_mouse.h
View file @
27db584f
...
...
@@ -146,6 +146,15 @@ extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data,
int
w
,
int
h
,
int
hot_x
,
int
hot_y
);
/**
* \brief Create a color cursor.
*
* \sa SDL_FreeCursor()
*/
extern
DECLSPEC
SDL_Cursor
*
SDLCALL
SDL_CreateColorCursor
(
SDL_Surface
*
surface
,
int
hot_x
,
int
hot_y
);
/**
* \brief Set the active cursor.
*/
...
...
src/events/SDL_mouse.c
View file @
27db584f
...
...
@@ -360,23 +360,14 @@ SDL_CreateCursor(const Uint8 * data, const Uint8 * mask,
const
Uint32
white
=
0xFFFFFFFF
;
const
Uint32
transparent
=
0x00000000
;
if
(
!
mouse
->
CreateCursor
)
{
SDL_SetError
(
"Cursors are not currently supported"
);
return
NULL
;
}
/* Sanity check the hot spot */
if
((
hot_x
<
0
)
||
(
hot_y
<
0
)
||
(
hot_x
>=
w
)
||
(
hot_y
>=
h
))
{
SDL_SetError
(
"Cursor hot spot doesn't lie within cursor"
);
return
NULL
;
}
/* Make sure the width is a multiple of 8 */
w
=
((
w
+
7
)
&
~
7
);
/* Create the surface from a bitmap */
surface
=
SDL_CreateRGBSurface
(
0
,
w
,
h
,
32
,
0x00FF0000
,
0x0000FF00
,
0x000000FF
,
surface
=
SDL_CreateRGBSurface
(
0
,
w
,
h
,
32
,
0x00FF0000
,
0x0000FF00
,
0x000000FF
,
0xFF000000
);
if
(
!
surface
)
{
return
NULL
;
...
...
@@ -398,13 +389,54 @@ SDL_CreateCursor(const Uint8 * data, const Uint8 * mask,
}
}
cursor
=
SDL_CreateColorCursor
(
surface
,
hot_x
,
hot_y
);
SDL_FreeSurface
(
surface
);
return
cursor
;
}
SDL_Cursor
*
SDL_CreateColorCursor
(
SDL_Surface
*
surface
,
int
hot_x
,
int
hot_y
)
{
SDL_Mouse
*
mouse
=
SDL_GetMouse
();
SDL_Surface
*
temp
=
NULL
;
SDL_Cursor
*
cursor
;
if
(
!
surface
)
{
SDL_SetError
(
"Passed NULL cursor surface"
);
return
NULL
;
}
if
(
!
mouse
->
CreateCursor
)
{
SDL_SetError
(
"Cursors are not currently supported"
);
return
NULL
;
}
/* Sanity check the hot spot */
if
((
hot_x
<
0
)
||
(
hot_y
<
0
)
||
(
hot_x
>=
surface
->
w
)
||
(
hot_y
>=
surface
->
h
))
{
SDL_SetError
(
"Cursor hot spot doesn't lie within cursor"
);
return
NULL
;
}
if
(
surface
->
format
->
format
!=
SDL_PIXELFORMAT_ARGB8888
)
{
temp
=
SDL_ConvertSurfaceFormat
(
surface
,
SDL_PIXELFORMAT_ARGB8888
,
0
);
if
(
!
temp
)
{
return
NULL
;
}
surface
=
temp
;
}
cursor
=
mouse
->
CreateCursor
(
surface
,
hot_x
,
hot_y
);
if
(
cursor
)
{
cursor
->
next
=
mouse
->
cursors
;
mouse
->
cursors
=
cursor
;
}
SDL_FreeSurface
(
surface
);
if
(
temp
)
{
SDL_FreeSurface
(
temp
);
}
return
cursor
;
}
...
...
test/testcursor.c
View file @
27db584f
...
...
@@ -141,13 +141,34 @@ create_arrow_cursor()
return
SDL_CreateCursor
(
data
,
mask
,
32
,
32
,
hot_x
,
hot_y
);
}
SDL_Surface
*
LoadSprite
(
char
*
file
)
{
SDL_Surface
*
sprite
;
/* Load the sprite image */
sprite
=
SDL_LoadBMP
(
file
);
if
(
sprite
==
NULL
)
{
fprintf
(
stderr
,
"Couldn't load %s: %s"
,
file
,
SDL_GetError
());
return
NULL
;
}
/* Set transparent pixel as the pixel at (0,0) */
if
(
sprite
->
format
->
palette
)
{
SDL_SetColorKey
(
sprite
,
(
SDL_SRCCOLORKEY
|
SDL_RLEACCEL
),
*
(
Uint8
*
)
sprite
->
pixels
);
}
/* We're ready to roll. :) */
return
sprite
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
SDL_Surface
*
screen
;
SDL_bool
quit
=
SDL_FALSE
,
first_time
=
SDL_TRUE
;
SDL_Cursor
*
cursor
[
4
];
SDL_Cursor
*
cursor
[
5
];
int
current
;
/* Load the SDL library */
...
...
@@ -189,9 +210,10 @@ main(int argc, char *argv[])
SDL_Quit
();
return
(
1
);
}
cursor
[
3
]
=
SDL_GetCursor
();
cursor
[
3
]
=
SDL_CreateColorCursor
(
LoadSprite
(
"icon.bmp"
),
0
,
0
);
cursor
[
4
]
=
SDL_GetCursor
();
current
=
0
;
current
=
SDL_arraysize
(
cursor
)
-
1
;
SDL_SetCursor
(
cursor
[
current
]);
while
(
!
quit
)
{
...
...
@@ -216,9 +238,9 @@ main(int argc, char *argv[])
SDL_Delay
(
1
);
}
SDL_FreeCursor
(
cursor
[
0
]);
SDL_FreeCursor
(
cursor
[
1
]);
SDL_FreeCursor
(
cursor
[
2
]);
for
(
current
=
0
;
current
<
SDL_arraysize
(
cursor
);
++
current
)
{
SDL_FreeCursor
(
cursor
[
current
]);
}
SDL_Quit
();
return
(
0
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment