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

Latest commit

 

History

History
285 lines (247 loc) · 9.24 KB

SDL_nullrender.c

File metadata and controls

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