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

Latest commit

 

History

History
269 lines (233 loc) · 8.85 KB

SDL_nullrender.c

File metadata and controls

269 lines (233 loc) · 8.85 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 21, 2008
Dec 21, 2008
34
static int SDL_DUMMY_RenderPoint(SDL_Renderer * renderer, int x, int y);
Dec 20, 2008
Dec 20, 2008
35
36
static int SDL_DUMMY_RenderLine(SDL_Renderer * renderer, int x1, int y1,
int x2, int y2);
Dec 20, 2008
Dec 20, 2008
37
38
static int SDL_DUMMY_RenderFill(SDL_Renderer * renderer,
const SDL_Rect * rect);
Jul 16, 2006
Jul 16, 2006
39
40
41
static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer,
SDL_Texture * texture,
const SDL_Rect * srcrect,
Aug 28, 2006
Aug 28, 2006
42
const SDL_Rect * dstrect);
43
44
45
46
47
48
49
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
50
"dummy",
Aug 5, 2006
Aug 5, 2006
51
52
53
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTDISCARD),
Aug 11, 2007
Aug 11, 2007
54
}
55
56
57
58
};
typedef struct
{
Jul 15, 2006
Jul 15, 2006
59
60
int current_screen;
SDL_Surface *screens[3];
61
62
63
64
65
66
67
68
69
} 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
70
int i, n;
71
72
73
74
75
76
77
78
79
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
80
renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
81
82
83
84
85
86
87
88
89
90
91
92
93
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 21, 2008
Dec 21, 2008
94
renderer->RenderPoint = SDL_DUMMY_RenderPoint;
Dec 20, 2008
Dec 20, 2008
95
renderer->RenderLine = SDL_DUMMY_RenderLine;
Jul 15, 2006
Jul 15, 2006
96
97
renderer->RenderFill = SDL_DUMMY_RenderFill;
renderer->RenderCopy = SDL_DUMMY_RenderCopy;
98
99
renderer->RenderPresent = SDL_DUMMY_RenderPresent;
renderer->DestroyRenderer = SDL_DUMMY_DestroyRenderer;
Aug 11, 2007
Aug 11, 2007
100
101
renderer->info.name = SDL_DUMMY_RenderDriver.info.name;
renderer->info.flags = 0;
102
103
renderer->window = window->id;
renderer->driverdata = data;
Aug 11, 2007
Aug 11, 2007
104
Setup_SoftwareRenderer(renderer);
Jul 15, 2006
Jul 15, 2006
105
Aug 5, 2006
Aug 5, 2006
106
107
if (flags & SDL_RENDERER_PRESENTFLIP2) {
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
Jul 15, 2006
Jul 15, 2006
108
n = 2;
Aug 5, 2006
Aug 5, 2006
109
110
} else if (flags & SDL_RENDERER_PRESENTFLIP3) {
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3;
Jul 15, 2006
Jul 15, 2006
111
112
n = 3;
} else {
Aug 5, 2006
Aug 5, 2006
113
renderer->info.flags |= SDL_RENDERER_PRESENTCOPY;
Jul 15, 2006
Jul 15, 2006
114
n = 1;
Jul 15, 2006
Jul 15, 2006
116
117
118
119
120
121
122
123
124
125
126
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;
127
128
129
130
return renderer;
}
Dec 21, 2008
Dec 21, 2008
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
static int
SDL_DUMMY_RenderPoint(SDL_Renderer * renderer, int x, int y)
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
int status;
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);
status = SDL_DrawPoint(target, x, y, color);
} else {
status =
SDL_BlendPoint(target, x, y, renderer->blendMode, renderer->r,
renderer->g, renderer->b, renderer->a);
}
return status;
}
Dec 20, 2008
Dec 20, 2008
154
155
156
157
158
159
160
161
static int
SDL_DUMMY_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
int status;
Dec 21, 2008
Dec 21, 2008
162
163
if (renderer->blendMode == SDL_BLENDMODE_NONE ||
renderer->blendMode == SDL_BLENDMODE_MASK) {
Dec 20, 2008
Dec 20, 2008
164
165
166
167
168
169
170
171
172
173
174
175
176
Uint32 color =
SDL_MapRGBA(target->format, renderer->r, renderer->g, renderer->b,
renderer->a);
status = SDL_DrawLine(target, x1, y1, x2, y2, color);
} else {
status =
SDL_BlendLine(target, x1, y1, x2, y2, renderer->blendMode,
renderer->r, renderer->g, renderer->b, renderer->a);
}
return status;
}
Dec 20, 2008
Dec 20, 2008
177
178
static int
SDL_DUMMY_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect)
Jul 15, 2006
Jul 15, 2006
179
{
Jul 16, 2006
Jul 16, 2006
180
181
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
182
183
SDL_Surface *target = data->screens[data->current_screen];
SDL_Rect real_rect = *rect;
Dec 20, 2008
Dec 20, 2008
184
int status;
Jul 15, 2006
Jul 15, 2006
185
Dec 20, 2008
Dec 20, 2008
186
187
188
189
if (renderer->blendMode == SDL_BLENDMODE_NONE) {
Uint32 color =
SDL_MapRGBA(target->format, renderer->r, renderer->g, renderer->b,
renderer->a);
Jul 15, 2006
Jul 15, 2006
190
Dec 20, 2008
Dec 20, 2008
191
192
193
194
195
196
197
status = SDL_FillRect(target, &real_rect, color);
} else {
status =
SDL_BlendRect(target, &real_rect, renderer->blendMode,
renderer->r, renderer->g, renderer->b, renderer->a);
}
return status;
Jul 15, 2006
Jul 15, 2006
198
199
200
201
}
static int
SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
Aug 28, 2006
Aug 28, 2006
202
const SDL_Rect * srcrect, const SDL_Rect * dstrect)
Jul 15, 2006
Jul 15, 2006
203
{
Jul 16, 2006
Jul 16, 2006
204
205
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
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
221
222
223
224
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
225
226
227
228
}
}
static void
229
230
231
SDL_DUMMY_RenderPresent(SDL_Renderer * renderer)
{
static int frame_number;
Jul 16, 2006
Jul 16, 2006
232
233
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
235
/* Send the data to the display */
236
237
238
239
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
240
241
242
243
SDL_SaveBMP(data->screens[data->current_screen], file);
}
/* Update the flipping chain, if any */
Aug 5, 2006
Aug 5, 2006
244
if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP2) {
Jul 15, 2006
Jul 15, 2006
245
data->current_screen = (data->current_screen + 1) % 2;
Aug 5, 2006
Aug 5, 2006
246
} else if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP3) {
Jul 15, 2006
Jul 15, 2006
247
248
249
250
251
data->current_screen = (data->current_screen + 1) % 3;
}
}
static void
252
253
SDL_DUMMY_DestroyRenderer(SDL_Renderer * renderer)
{
Jul 16, 2006
Jul 16, 2006
254
255
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
Jul 15, 2006
Jul 15, 2006
256
int i;
Jul 15, 2006
Jul 15, 2006
259
260
261
262
for (i = 0; i < SDL_arraysize(data->screens); ++i) {
if (data->screens[i]) {
SDL_FreeSurface(data->screens[i]);
}
263
264
265
266
267
268
269
}
SDL_free(data);
}
SDL_free(renderer);
}
/* vi: set ts=4 sw=4 expandtab: */