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
6fe14e17
Commit
6fe14e17
authored
Feb 07, 2011
by
Sam Lantinga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated testoverlay2 to use the SDL 2D rendering API
parent
9b289f0b
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
103 additions
and
166 deletions
+103
-166
SDL_render.h
include/SDL_render.h
+1
-0
testoverlay2.c
test/testoverlay2.c
+102
-166
No files found.
include/SDL_render.h
View file @
6fe14e17
...
@@ -192,6 +192,7 @@ extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer,
...
@@ -192,6 +192,7 @@ extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer,
* of range.
* of range.
*
*
* \sa SDL_QueryTexture()
* \sa SDL_QueryTexture()
* \sa SDL_UpdateTexture()
* \sa SDL_DestroyTexture()
* \sa SDL_DestroyTexture()
*/
*/
extern
DECLSPEC
SDL_Texture
*
SDLCALL
SDL_CreateTexture
(
SDL_Renderer
*
renderer
,
Uint32
format
,
extern
DECLSPEC
SDL_Texture
*
SDLCALL
SDL_CreateTexture
(
SDL_Renderer
*
renderer
,
Uint32
format
,
...
...
test/testoverlay2.c
View file @
6fe14e17
...
@@ -172,35 +172,27 @@ RGBtoYUV(Uint8 * rgb, int *yuv, int monochrome, int luminance)
...
@@ -172,35 +172,27 @@ RGBtoYUV(Uint8 * rgb, int *yuv, int monochrome, int luminance)
}
}
void
void
ConvertRGBtoYV12
(
SDL_Surface
*
s
,
SDL_Overlay
*
o
,
int
monochrome
,
ConvertRGBtoYV12
(
Uint8
*
rgb
,
Uint8
*
out
,
int
w
,
int
h
,
int
luminance
)
int
monochrome
,
int
luminance
)
{
{
int
x
,
y
;
int
x
,
y
;
int
yuv
[
3
];
int
yuv
[
3
];
Uint8
*
p
,
*
op
[
3
];
Uint8
*
op
[
3
];
SDL_LockSurface
(
s
);
op
[
0
]
=
out
;
SDL_LockYUVOverlay
(
o
);
op
[
1
]
=
op
[
0
]
+
w
*
h
;
op
[
2
]
=
op
[
1
]
+
w
*
h
/
4
;
/* Convert */
for
(
y
=
0
;
y
<
h
;
++
y
)
{
for
(
y
=
0
;
y
<
s
->
h
&&
y
<
o
->
h
;
y
++
)
{
for
(
x
=
0
;
x
<
w
;
++
x
)
{
p
=
((
Uint8
*
)
s
->
pixels
)
+
s
->
pitch
*
y
;
RGBtoYUV
(
rgb
,
yuv
,
monochrome
,
luminance
);
op
[
0
]
=
o
->
pixels
[
0
]
+
o
->
pitches
[
0
]
*
y
;
op
[
1
]
=
o
->
pixels
[
1
]
+
o
->
pitches
[
1
]
*
(
y
/
2
);
op
[
2
]
=
o
->
pixels
[
2
]
+
o
->
pitches
[
2
]
*
(
y
/
2
);
for
(
x
=
0
;
x
<
s
->
w
&&
x
<
o
->
w
;
x
++
)
{
RGBtoYUV
(
p
,
yuv
,
monochrome
,
luminance
);
*
(
op
[
0
]
++
)
=
yuv
[
0
];
*
(
op
[
0
]
++
)
=
yuv
[
0
];
if
(
x
%
2
==
0
&&
y
%
2
==
0
)
{
if
(
x
%
2
==
0
&&
y
%
2
==
0
)
{
*
(
op
[
1
]
++
)
=
yuv
[
2
];
*
(
op
[
1
]
++
)
=
yuv
[
2
];
*
(
op
[
2
]
++
)
=
yuv
[
1
];
*
(
op
[
2
]
++
)
=
yuv
[
1
];
}
}
p
+=
s
->
format
->
BytesPerPixel
;
rgb
+=
3
;
}
}
}
}
SDL_UnlockYUVOverlay
(
o
);
SDL_UnlockSurface
(
s
);
}
}
void
void
...
@@ -339,12 +331,11 @@ PrintUsage(char *argv0)
...
@@ -339,12 +331,11 @@ PrintUsage(char *argv0)
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
"Where 'arg' is any of the following options:
\n
"
);
fprintf
(
stderr
,
"Where 'arg' is any of the following options:
\n
"
);
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
" -fps <frames per second>
\n
"
);
fprintf
(
stderr
,
" -fps <frames per second>
\n
"
);
fprintf
(
stderr
,
fprintf
(
stderr
,
" -nodelay
\n
"
);
" -format <fmt> (one of the: YV12, IYUV, YUY2, UYVY, YVYU)
\n
"
);
fprintf
(
stderr
,
" -format <fmt> (one of the: YV12, IYUV, YUY2, UYVY, YVYU)
\n
"
);
fprintf
(
stderr
,
fprintf
(
stderr
,
" -scale <scale factor> (initial scale of the overlay)
\n
"
);
" -scale <scale factor> (initial scale of the overlay)
\n
"
);
fprintf
(
stderr
,
" -help (shows this help)
\n
"
);
fprintf
(
stderr
,
" -help (shows this help)
\n
"
);
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
fprintf
(
stderr
,
"Press ESC to exit, or SPACE to freeze the movie while application running.
\n
"
);
"Press ESC to exit, or SPACE to freeze the movie while application running.
\n
"
);
...
@@ -356,19 +347,22 @@ main(int argc, char **argv)
...
@@ -356,19 +347,22 @@ main(int argc, char **argv)
{
{
Uint8
*
RawMooseData
;
Uint8
*
RawMooseData
;
SDL_RWops
*
handle
;
SDL_RWops
*
handle
;
SDL_Surface
*
screen
;
int
window_w
;
SDL_Surface
*
MooseFrame
[
MOOSEFRAMES_COUNT
];
int
window_h
;
SDL_Overlay
*
overlay
;
SDL_Window
*
window
;
SDL_Rect
overlayrect
;
SDL_Renderer
*
renderer
;
Uint8
MooseFrame
[
MOOSEFRAMES_COUNT
][
MOOSEFRAME_SIZE
*
2
];
SDL_Texture
*
MooseTexture
;
SDL_Rect
displayrect
;
SDL_Event
event
;
SDL_Event
event
;
Uint32
lastftick
;
int
paused
=
0
;
int
paused
=
0
;
int
resized
=
0
;
int
i
,
j
;
int
i
;
int
fps
=
12
;
int
fps
=
12
;
int
fpsdelay
;
int
fpsdelay
;
int
nodelay
=
0
;
int
overlay_format
=
SDL_YUY2_OVERLAY
;
int
overlay_format
=
SDL_YUY2_OVERLAY
;
int
scale
=
5
;
int
scale
=
5
;
SDL_bool
done
=
SDL_FALSE
;
if
(
SDL_Init
(
SDL_INIT_VIDEO
|
SDL_INIT_NOPARACHUTE
)
<
0
)
{
if
(
SDL_Init
(
SDL_INIT_VIDEO
|
SDL_INIT_NOPARACHUTE
)
<
0
)
{
fprintf
(
stderr
,
"Couldn't initialize SDL: %s
\n
"
,
SDL_GetError
());
fprintf
(
stderr
,
"Couldn't initialize SDL: %s
\n
"
,
SDL_GetError
());
...
@@ -396,6 +390,10 @@ main(int argc, char **argv)
...
@@ -396,6 +390,10 @@ main(int argc, char **argv)
"The -fps option requires an argument [from 1 to 1000], default is 12.
\n
"
);
"The -fps option requires an argument [from 1 to 1000], default is 12.
\n
"
);
quit
(
10
);
quit
(
10
);
}
}
}
else
if
(
strcmp
(
argv
[
1
],
"-nodelay"
)
==
0
)
{
nodelay
=
1
;
argv
+=
1
;
argc
-=
1
;
}
else
if
(
strcmp
(
argv
[
1
],
"-format"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
1
],
"-format"
)
==
0
)
{
if
(
argv
[
2
])
{
if
(
argv
[
2
])
{
if
(
!
strcmp
(
argv
[
2
],
"YV12"
))
if
(
!
strcmp
(
argv
[
2
],
"YV12"
))
...
@@ -471,122 +469,87 @@ main(int argc, char **argv)
...
@@ -471,122 +469,87 @@ main(int argc, char **argv)
SDL_RWclose
(
handle
);
SDL_RWclose
(
handle
);
/* Set video mode */
/* Create the window and renderer */
if
((
screen
=
window_w
=
MOOSEPIC_W
*
scale
;
SDL_SetVideoMode
(
MOOSEPIC_W
*
scale
,
MOOSEPIC_H
*
scale
,
0
,
window_h
=
MOOSEPIC_H
*
scale
;
SDL_RESIZABLE
|
SDL_SWSURFACE
))
==
NULL
)
{
window
=
SDL_CreateWindow
(
"Happy Moose"
,
fprintf
(
stderr
,
"Couldn't set video mode: %s
\n
"
,
SDL_GetError
());
SDL_WINDOWPOS_UNDEFINED
,
SDL_WINDOWPOS_UNDEFINED
,
window_w
,
window_h
,
SDL_WINDOW_SHOWN
|
SDL_WINDOW_RESIZABLE
);
if
(
!
window
)
{
fprintf
(
stderr
,
"Couldn't set create window: %s
\n
"
,
SDL_GetError
());
free
(
RawMooseData
);
free
(
RawMooseData
);
quit
(
4
);
quit
(
4
);
}
}
/* Set the window manager title bar */
renderer
=
SDL_CreateRenderer
(
window
,
-
1
,
0
);
SDL_WM_SetCaption
(
"SDL test overlay: running moose"
,
"testoverlay2"
);
if
(
!
renderer
)
{
fprintf
(
stderr
,
"Couldn't set create renderer: %s
\n
"
,
SDL_GetError
());
for
(
i
=
0
;
i
<
MOOSEFRAMES_COUNT
;
i
++
)
{
free
(
RawMooseData
);
MooseFrame
[
i
]
=
quit
(
4
);
SDL_CreateRGBSurfaceFrom
(
RawMooseData
+
i
*
MOOSEFRAME_SIZE
,
MOOSEPIC_W
,
MOOSEPIC_H
,
8
,
MOOSEPIC_W
,
0
,
0
,
0
,
0
);
if
(
MooseFrame
[
i
]
==
NULL
)
{
fprintf
(
stderr
,
"Couldn't create SDL_Surfaces:%s
\n
"
,
SDL_GetError
());
free
(
RawMooseData
);
quit
(
5
);
}
SDL_SetColors
(
MooseFrame
[
i
],
MooseColors
,
0
,
84
);
{
SDL_Surface
*
newsurf
;
SDL_PixelFormat
format
;
format
.
palette
=
NULL
;
format
.
BitsPerPixel
=
32
;
format
.
BytesPerPixel
=
4
;
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
format
.
Rshift
=
0
;
format
.
Gshift
=
8
;
format
.
Bshift
=
16
;
#else
format
.
Rshift
=
24
;
format
.
Gshift
=
16
;
format
.
Bshift
=
8
;
#endif
format
.
Ashift
=
0
;
format
.
Rmask
=
0xff
<<
format
.
Rshift
;
format
.
Gmask
=
0xff
<<
format
.
Gshift
;
format
.
Bmask
=
0xff
<<
format
.
Bshift
;
format
.
Amask
=
0
;
format
.
Rloss
=
0
;
format
.
Gloss
=
0
;
format
.
Bloss
=
0
;
format
.
Aloss
=
8
;
newsurf
=
SDL_ConvertSurface
(
MooseFrame
[
i
],
&
format
,
SDL_SWSURFACE
);
if
(
!
newsurf
)
{
fprintf
(
stderr
,
"Couldn't convert picture to 32bits RGB: %s
\n
"
,
SDL_GetError
());
quit
(
6
);
}
SDL_FreeSurface
(
MooseFrame
[
i
]);
MooseFrame
[
i
]
=
newsurf
;
}
}
}
free
(
RawMooseData
);
MooseTexture
=
SDL_CreateTexture
(
renderer
,
SDL_PIXELFORMAT_YV12
,
SDL_TEXTUREACCESS_STREAMING
,
MOOSEPIC_W
,
MOOSEPIC_H
);
if
(
!
renderer
)
{
overlay
=
fprintf
(
stderr
,
"Couldn't set create texture: %s
\n
"
,
SDL_GetError
());
SDL_CreateYUVOverlay
(
MOOSEPIC_W
,
MOOSEPIC_H
,
overlay_format
,
screen
);
free
(
RawMooseData
);
if
(
!
overlay
)
{
quit
(
5
);
fprintf
(
stderr
,
"Couldn't create overlay: %s
\n
"
,
SDL_GetError
());
quit
(
7
);
}
}
printf
(
"Created %dx%dx%d %s %s overlay
\n
"
,
overlay
->
w
,
overlay
->
h
,
for
(
i
=
0
;
i
<
MOOSEFRAMES_COUNT
;
i
++
)
{
overlay
->
planes
,
overlay
->
hw_overlay
?
"hardware"
:
"software"
,
Uint8
MooseFrameRGB
[
MOOSEFRAME_SIZE
*
3
];
overlay
->
format
==
SDL_YV12_OVERLAY
?
"YV12"
:
overlay
->
format
==
Uint8
*
rgb
;
SDL_IYUV_OVERLAY
?
"IYUV"
:
overlay
->
format
==
Uint8
*
frame
;
SDL_YUY2_OVERLAY
?
"YUY2"
:
overlay
->
format
==
SDL_UYVY_OVERLAY
?
"UYVY"
:
overlay
->
format
==
rgb
=
MooseFrameRGB
;
SDL_YVYU_OVERLAY
?
"YVYU"
:
"Unknown"
);
frame
=
RawMooseData
+
i
*
MOOSEFRAME_SIZE
;
for
(
j
=
0
;
j
<
MOOSEFRAME_SIZE
;
++
j
)
{
for
(
i
=
0
;
i
<
overlay
->
planes
;
i
++
)
{
rgb
[
0
]
=
MooseColors
[
frame
[
j
]].
r
;
printf
(
" plane %d: pitch=%d
\n
"
,
i
,
overlay
->
pitches
[
i
]);
rgb
[
1
]
=
MooseColors
[
frame
[
j
]].
g
;
rgb
[
2
]
=
MooseColors
[
frame
[
j
]].
b
;
rgb
+=
3
;
}
ConvertRGBtoYV12
(
MooseFrameRGB
,
MooseFrame
[
i
],
MOOSEPIC_W
,
MOOSEPIC_H
,
0
,
100
);
}
}
overlayrect
.
x
=
0
;
free
(
RawMooseData
);
overlayrect
.
y
=
0
;
overlayrect
.
w
=
MOOSEPIC_W
*
scale
;
overlayrect
.
h
=
MOOSEPIC_H
*
scale
;
/* set the start frame */
/* set the start frame */
i
=
0
;
i
=
0
;
fpsdelay
=
1000
/
fps
;
if
(
nodelay
)
{
fpsdelay
=
0
;
}
else
{
fpsdelay
=
1000
/
fps
;
}
displayrect
.
x
=
0
;
displayrect
.
y
=
0
;
displayrect
.
w
=
window_w
;
displayrect
.
h
=
window_h
;
/* Ignore key up events, they don't even get filtered */
/* Ignore key up events, they don't even get filtered */
SDL_EventState
(
SDL_KEYUP
,
SDL_IGNORE
);
SDL_EventState
(
SDL_KEYUP
,
SDL_IGNORE
);
lastftick
=
SDL_GetTicks
();
/* Loop, waiting for QUIT or RESIZE */
/* Loop, waiting for QUIT or RESIZE */
while
(
1
)
{
while
(
!
done
)
{
if
(
SDL_PollEvent
(
&
event
))
{
while
(
SDL_PollEvent
(
&
event
))
{
switch
(
event
.
type
)
{
switch
(
event
.
type
)
{
case
SDL_VIDEORESIZE
:
case
SDL_WINDOWEVENT
:
screen
=
if
(
event
.
window
.
event
==
SDL_WINDOWEVENT_RESIZED
)
{
SDL_SetVideoMode
(
event
.
resize
.
w
,
event
.
resize
.
h
,
0
,
displayrect
.
w
=
window_w
=
event
.
window
.
data1
;
SDL_RESIZABLE
|
SDL_SWSURFACE
);
displayrect
.
w
=
window_h
=
event
.
window
.
data2
;
overlayrect
.
w
=
event
.
resize
.
w
;
overlayrect
.
h
=
event
.
resize
.
h
;
if
(
paused
)
{
resized
=
1
;
}
}
break
;
break
;
case
SDL_MOUSEBUTTONDOWN
:
case
SDL_MOUSEBUTTONDOWN
:
overlayrect
.
x
=
event
.
button
.
x
-
overlayrect
.
w
/
2
;
displayrect
.
x
=
event
.
button
.
x
-
window_w
/
2
;
overlayrect
.
y
=
event
.
button
.
y
-
overlayrect
.
h
/
2
;
displayrect
.
y
=
event
.
button
.
y
-
window_h
/
2
;
break
;
case
SDL_MOUSEMOTION
:
if
(
event
.
motion
.
state
)
{
displayrect
.
x
=
event
.
motion
.
x
-
window_w
/
2
;
displayrect
.
y
=
event
.
motion
.
y
-
window_h
/
2
;
}
break
;
break
;
case
SDL_KEYDOWN
:
case
SDL_KEYDOWN
:
if
(
event
.
key
.
keysym
.
sym
==
SDLK_SPACE
)
{
if
(
event
.
key
.
keysym
.
sym
==
SDLK_SPACE
)
{
...
@@ -597,51 +560,24 @@ main(int argc, char **argv)
...
@@ -597,51 +560,24 @@ main(int argc, char **argv)
break
;
break
;
}
}
case
SDL_QUIT
:
case
SDL_QUIT
:
SDL_FreeYUVOverlay
(
overlay
);
done
=
SDL_TRUE
;
for
(
i
=
0
;
i
<
MOOSEFRAMES_COUNT
;
i
++
)
{
break
;
SDL_FreeSurface
(
MooseFrame
[
i
]);
}
quit
(
0
);
}
}
}
}
SDL_Delay
(
fpsdelay
);
if
((
!
paused
)
||
(
resized
))
{
if
(
!
paused
)
{
if
(((
SDL_GetTicks
()
-
lastftick
)
>
(
Uint32
)
fpsdelay
)
||
(
resized
))
{
i
=
(
i
+
1
)
%
MOOSEFRAMES_COUNT
;
lastftick
=
SDL_GetTicks
();
switch
(
overlay_format
)
{
case
SDL_YUY2_OVERLAY
:
ConvertRGBtoYUY2
(
MooseFrame
[
i
],
overlay
,
0
,
100
);
break
;
case
SDL_YV12_OVERLAY
:
ConvertRGBtoYV12
(
MooseFrame
[
i
],
overlay
,
0
,
100
);
break
;
case
SDL_UYVY_OVERLAY
:
ConvertRGBtoUYVY
(
MooseFrame
[
i
],
overlay
,
0
,
100
);
break
;
case
SDL_YVYU_OVERLAY
:
ConvertRGBtoYVYU
(
MooseFrame
[
i
],
overlay
,
0
,
100
);
break
;
case
SDL_IYUV_OVERLAY
:
ConvertRGBtoIYUV
(
MooseFrame
[
i
],
overlay
,
0
,
100
);
break
;
}
SDL_DisplayYUVOverlay
(
overlay
,
&
overlayrect
);
SDL_UpdateTexture
(
MooseTexture
,
NULL
,
MooseFrame
[
i
],
MOOSEPIC_W
*
2
);
if
(
!
resized
)
{
i
++
;
if
(
i
==
10
)
{
i
=
0
;
}
}
else
{
resized
=
0
;
}
}
}
}
/* kind of timeslice to OS */
SDL_RenderClear
(
renderer
);
SDL_Delay
(
1
);
SDL_RenderCopy
(
renderer
,
MooseTexture
,
NULL
,
&
displayrect
);
SDL_RenderPresent
(
renderer
);
}
}
SDL_DestroyRenderer
(
renderer
);
SDL_Quit
(
);
quit
(
0
);
return
0
;
return
0
;
}
}
/* vi: set ts=4 sw=4 expandtab: */
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