Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
318 lines (278 loc) · 11.5 KB

SDL_nullrender.c

File metadata and controls

318 lines (278 loc) · 11.5 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_video.h"
#include "../SDL_sysvideo.h"
Jul 15, 2006
Jul 15, 2006
26
#include "../SDL_yuv_sw_c.h"
Aug 12, 2007
Aug 12, 2007
27
#include "../SDL_renderer_sw.h"
28
29
30
31
/* SDL surface based renderer implementation */
Jul 16, 2006
Jul 16, 2006
32
33
static SDL_Renderer *SDL_DUMMY_CreateRenderer(SDL_Window * window,
Uint32 flags);
Dec 9, 2009
Dec 9, 2009
34
35
36
37
38
39
static int SDL_DUMMY_RenderPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int SDL_DUMMY_RenderLines(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int SDL_DUMMY_RenderRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
Jul 16, 2006
Jul 16, 2006
40
41
42
static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer,
SDL_Texture * texture,
const SDL_Rect * srcrect,
Aug 28, 2006
Aug 28, 2006
43
const SDL_Rect * dstrect);
Nov 18, 2009
Nov 18, 2009
44
45
46
47
48
49
50
51
static int SDL_DUMMY_RenderReadPixels(SDL_Renderer * renderer,
const SDL_Rect * rect,
Uint32 format,
void * pixels, int pitch);
static int SDL_DUMMY_RenderWritePixels(SDL_Renderer * renderer,
const SDL_Rect * rect,
Uint32 format,
const void * pixels, int pitch);
52
53
54
55
56
57
58
static void SDL_DUMMY_RenderPresent(SDL_Renderer * renderer);
static void SDL_DUMMY_DestroyRenderer(SDL_Renderer * renderer);
SDL_RenderDriver SDL_DUMMY_RenderDriver = {
SDL_DUMMY_CreateRenderer,
{
Jul 14, 2006
Jul 14, 2006
59
"dummy",
Aug 5, 2006
Aug 5, 2006
60
61
62
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTDISCARD),
Aug 11, 2007
Aug 11, 2007
63
}
64
65
66
67
};
typedef struct
{
Jul 15, 2006
Jul 15, 2006
68
69
int current_screen;
SDL_Surface *screens[3];
70
71
72
73
74
75
76
77
78
} SDL_DUMMY_RenderData;
SDL_Renderer *
SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
{
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_DisplayMode *displayMode = &display->current_mode;
SDL_Renderer *renderer;
SDL_DUMMY_RenderData *data;
Jul 15, 2006
Jul 15, 2006
79
int i, n;
80
81
82
83
84
85
86
87
88
int bpp;
Uint32 Rmask, Gmask, Bmask, Amask;
if (!SDL_PixelFormatEnumToMasks
(displayMode->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
SDL_SetError("Unknown display format");
return NULL;
}
Jul 15, 2006
Jul 15, 2006
89
renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
90
91
92
93
94
95
96
97
98
99
100
101
102
if (!renderer) {
SDL_OutOfMemory();
return NULL;
}
data = (SDL_DUMMY_RenderData *) SDL_malloc(sizeof(*data));
if (!data) {
SDL_DUMMY_DestroyRenderer(renderer);
SDL_OutOfMemory();
return NULL;
}
SDL_zerop(data);
Dec 9, 2009
Dec 9, 2009
103
104
105
renderer->RenderPoints = SDL_DUMMY_RenderPoints;
renderer->RenderLines = SDL_DUMMY_RenderLines;
renderer->RenderRects = SDL_DUMMY_RenderRects;
Jul 15, 2006
Jul 15, 2006
106
renderer->RenderCopy = SDL_DUMMY_RenderCopy;
Nov 18, 2009
Nov 18, 2009
107
108
renderer->RenderReadPixels = SDL_DUMMY_RenderReadPixels;
renderer->RenderWritePixels = SDL_DUMMY_RenderWritePixels;
109
110
renderer->RenderPresent = SDL_DUMMY_RenderPresent;
renderer->DestroyRenderer = SDL_DUMMY_DestroyRenderer;
Aug 11, 2007
Aug 11, 2007
111
112
renderer->info.name = SDL_DUMMY_RenderDriver.info.name;
renderer->info.flags = 0;
113
114
renderer->window = window->id;
renderer->driverdata = data;
Aug 11, 2007
Aug 11, 2007
115
Setup_SoftwareRenderer(renderer);
Jul 15, 2006
Jul 15, 2006
116
Aug 5, 2006
Aug 5, 2006
117
118
if (flags & SDL_RENDERER_PRESENTFLIP2) {
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
Jul 15, 2006
Jul 15, 2006
119
n = 2;
Aug 5, 2006
Aug 5, 2006
120
121
} else if (flags & SDL_RENDERER_PRESENTFLIP3) {
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3;
Jul 15, 2006
Jul 15, 2006
122
123
n = 3;
} else {
Aug 5, 2006
Aug 5, 2006
124
renderer->info.flags |= SDL_RENDERER_PRESENTCOPY;
Jul 15, 2006
Jul 15, 2006
125
n = 1;
Jul 15, 2006
Jul 15, 2006
127
128
129
130
131
132
133
134
135
136
137
for (i = 0; i < n; ++i) {
data->screens[i] =
SDL_CreateRGBSurface(0, window->w, window->h, bpp, Rmask, Gmask,
Bmask, Amask);
if (!data->screens[i]) {
SDL_DUMMY_DestroyRenderer(renderer);
return NULL;
}
SDL_SetSurfacePalette(data->screens[i], display->palette);
}
data->current_screen = 0;
138
139
140
141
return renderer;
}
Dec 21, 2008
Dec 21, 2008
142
static int
Dec 9, 2009
Dec 9, 2009
143
144
SDL_DUMMY_RenderPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count)
Dec 21, 2008
Dec 21, 2008
145
146
147
148
149
150
151
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
if (renderer->blendMode == SDL_BLENDMODE_NONE ||
renderer->blendMode == SDL_BLENDMODE_MASK) {
Dec 9, 2009
Dec 9, 2009
152
153
154
Uint32 color = SDL_MapRGBA(target->format,
renderer->r, renderer->g, renderer->b,
renderer->a);
Dec 21, 2008
Dec 21, 2008
155
Dec 9, 2009
Dec 9, 2009
156
return SDL_DrawPoints(target, points, count, color);
Dec 21, 2008
Dec 21, 2008
157
} else {
Dec 9, 2009
Dec 9, 2009
158
159
160
return SDL_BlendPoints(target, points, count, renderer->blendMode,
renderer->r, renderer->g, renderer->b,
renderer->a);
Dec 21, 2008
Dec 21, 2008
161
162
163
}
}
Dec 20, 2008
Dec 20, 2008
164
static int
Dec 9, 2009
Dec 9, 2009
165
166
SDL_DUMMY_RenderLines(SDL_Renderer * renderer,
const SDL_Point * points, int count)
Dec 20, 2008
Dec 20, 2008
167
168
169
170
171
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
Dec 21, 2008
Dec 21, 2008
172
173
if (renderer->blendMode == SDL_BLENDMODE_NONE ||
renderer->blendMode == SDL_BLENDMODE_MASK) {
Dec 9, 2009
Dec 9, 2009
174
175
176
Uint32 color = SDL_MapRGBA(target->format,
renderer->r, renderer->g, renderer->b,
renderer->a);
Dec 20, 2008
Dec 20, 2008
177
Dec 9, 2009
Dec 9, 2009
178
return SDL_DrawLines(target, points, count, color);
Dec 20, 2008
Dec 20, 2008
179
} else {
Dec 9, 2009
Dec 9, 2009
180
181
182
return SDL_BlendLines(target, points, count, renderer->blendMode,
renderer->r, renderer->g, renderer->b,
renderer->a);
Dec 20, 2008
Dec 20, 2008
183
184
185
}
}
Dec 20, 2008
Dec 20, 2008
186
static int
Dec 9, 2009
Dec 9, 2009
187
188
SDL_DUMMY_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
Jul 15, 2006
Jul 15, 2006
189
{
Jul 16, 2006
Jul 16, 2006
190
191
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
192
193
SDL_Surface *target = data->screens[data->current_screen];
Dec 9, 2009
Dec 9, 2009
194
195
196
197
198
if (renderer->blendMode == SDL_BLENDMODE_NONE ||
renderer->blendMode == SDL_BLENDMODE_MASK) {
Uint32 color = SDL_MapRGBA(target->format,
renderer->r, renderer->g, renderer->b,
renderer->a);
Jul 15, 2006
Jul 15, 2006
199
Dec 9, 2009
Dec 9, 2009
200
return SDL_FillRects(target, rects, count, color);
Dec 20, 2008
Dec 20, 2008
201
} else {
Dec 9, 2009
Dec 9, 2009
202
203
204
205
return SDL_BlendRects(target, rects, count,
renderer->blendMode,
renderer->r, renderer->g, renderer->b,
renderer->a);
Dec 20, 2008
Dec 20, 2008
206
}
Jul 15, 2006
Jul 15, 2006
207
208
209
210
}
static int
SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
Aug 28, 2006
Aug 28, 2006
211
const SDL_Rect * srcrect, const SDL_Rect * dstrect)
Jul 15, 2006
Jul 15, 2006
212
{
Jul 16, 2006
Jul 16, 2006
213
214
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
SDL_Surface *target = data->screens[data->current_screen];
void *pixels =
(Uint8 *) target->pixels + dstrect->y * target->pitch +
dstrect->x * target->format->BytesPerPixel;
return SDL_SW_CopyYUVToRGB((SDL_SW_YUVTexture *) texture->driverdata,
srcrect, display->current_mode.format,
dstrect->w, dstrect->h, pixels,
target->pitch);
} else {
SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
Aug 18, 2007
Aug 18, 2007
230
231
232
233
SDL_Rect real_srcrect = *srcrect;
SDL_Rect real_dstrect = *dstrect;
return SDL_LowerBlit(surface, &real_srcrect, target, &real_dstrect);
Jul 15, 2006
Jul 15, 2006
234
235
236
}
}
Nov 18, 2009
Nov 18, 2009
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
static int
SDL_DUMMY_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
Uint32 format, void * pixels, int pitch)
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_Surface *screen = data->screens[data->current_screen];
Uint32 screen_format = display->current_mode.format;
Uint8 *screen_pixels = (Uint8 *) screen->pixels +
rect->y * screen->pitch +
rect->x * screen->format->BytesPerPixel;
int screen_pitch = screen->pitch;
return SDL_ConvertPixels(rect->w, rect->h,
screen_format, screen_pixels, screen_pitch,
format, pixels, pitch);
}
static int
SDL_DUMMY_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
Uint32 format, const void * pixels, int pitch)
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_Surface *screen = data->screens[data->current_screen];
Uint32 screen_format = display->current_mode.format;
Uint8 *screen_pixels = (Uint8 *) screen->pixels +
rect->y * screen->pitch +
rect->x * screen->format->BytesPerPixel;
int screen_pitch = screen->pitch;
return SDL_ConvertPixels(rect->w, rect->h,
format, pixels, pitch,
screen_format, screen_pixels, screen_pitch);
}
Jul 15, 2006
Jul 15, 2006
277
static void
278
279
280
SDL_DUMMY_RenderPresent(SDL_Renderer * renderer)
{
static int frame_number;
Jul 16, 2006
Jul 16, 2006
281
282
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
284
/* Send the data to the display */
285
286
287
288
if (SDL_getenv("SDL_VIDEO_DUMMY_SAVE_FRAMES")) {
char file[128];
SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
renderer->window, ++frame_number);
Jul 15, 2006
Jul 15, 2006
289
290
291
292
SDL_SaveBMP(data->screens[data->current_screen], file);
}
/* Update the flipping chain, if any */
Aug 5, 2006
Aug 5, 2006
293
if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP2) {
Jul 15, 2006
Jul 15, 2006
294
data->current_screen = (data->current_screen + 1) % 2;
Aug 5, 2006
Aug 5, 2006
295
} else if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP3) {
Jul 15, 2006
Jul 15, 2006
296
297
298
299
300
data->current_screen = (data->current_screen + 1) % 3;
}
}
static void
301
302
SDL_DUMMY_DestroyRenderer(SDL_Renderer * renderer)
{
Jul 16, 2006
Jul 16, 2006
303
304
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
305
int i;
Jul 15, 2006
Jul 15, 2006
308
309
310
311
for (i = 0; i < SDL_arraysize(data->screens); ++i) {
if (data->screens[i]) {
SDL_FreeSurface(data->screens[i]);
}
312
313
314
315
316
317
318
}
SDL_free(data);
}
SDL_free(renderer);
}
/* vi: set ts=4 sw=4 expandtab: */