|
|
|
@ -32,6 +32,8 @@
|
|
|
|
|
#define EMULATOR_BORDER 16
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
// Set if the driver is initialized
|
|
|
|
|
bool initialized;
|
|
|
|
|
// Current display orientation (0 or 180)
|
|
|
|
|
int orientation_angle;
|
|
|
|
|
// Current backlight level ranging from 0 to 255
|
|
|
|
@ -52,7 +54,9 @@ typedef struct {
|
|
|
|
|
|
|
|
|
|
} display_driver_t;
|
|
|
|
|
|
|
|
|
|
static display_driver_t g_display_driver;
|
|
|
|
|
static display_driver_t g_display_driver = {
|
|
|
|
|
.initialized = false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//!@# TODO get rid of this...
|
|
|
|
|
int sdl_display_res_x = DISPLAY_RESX, sdl_display_res_y = DISPLAY_RESY;
|
|
|
|
@ -65,6 +69,10 @@ static void display_exit_handler(void) {
|
|
|
|
|
void display_init(display_content_mode_t mode) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
|
|
|
|
|
printf("%s\n", SDL_GetError());
|
|
|
|
|
error_shutdown("SDL_Init error");
|
|
|
|
@ -144,11 +152,16 @@ void display_init(display_content_mode_t mode) {
|
|
|
|
|
#else
|
|
|
|
|
drv->orientation_angle = 0;
|
|
|
|
|
#endif
|
|
|
|
|
drv->initialized = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void display_deinit(display_content_mode_t mode) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SDL_FreeSurface(drv->prev_saved);
|
|
|
|
|
SDL_FreeSurface(drv->buffer);
|
|
|
|
|
if (drv->background != NULL) {
|
|
|
|
@ -164,11 +177,17 @@ void display_deinit(display_content_mode_t mode) {
|
|
|
|
|
SDL_DestroyWindow(drv->window);
|
|
|
|
|
}
|
|
|
|
|
SDL_Quit();
|
|
|
|
|
|
|
|
|
|
drv->initialized = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int display_set_backlight(int level) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if !USE_BACKLIGHT
|
|
|
|
|
level = 255;
|
|
|
|
|
#endif
|
|
|
|
@ -183,11 +202,21 @@ int display_set_backlight(int level) {
|
|
|
|
|
|
|
|
|
|
int display_get_backlight(void) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return drv->backlight_level;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int display_set_orientation(int angle) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (angle != drv->orientation_angle) {
|
|
|
|
|
#if defined ORIENTATION_NSEW
|
|
|
|
|
if (angle == 0 || angle == 90 || angle == 180 || angle == 270) {
|
|
|
|
@ -205,6 +234,11 @@ int display_set_orientation(int angle) {
|
|
|
|
|
|
|
|
|
|
int display_get_orientation(void) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return drv->orientation_angle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -212,25 +246,32 @@ int display_get_orientation(void) {
|
|
|
|
|
display_fb_info_t display_get_frame_buffer(void) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
display_fb_info_t fb = {
|
|
|
|
|
.ptr = NULL,
|
|
|
|
|
.stride = 0,
|
|
|
|
|
};
|
|
|
|
|
return fb;
|
|
|
|
|
} else {
|
|
|
|
|
#ifdef DISPLAY_MONO
|
|
|
|
|
display_fb_info_t fb = {
|
|
|
|
|
.ptr = drv->mono_framebuf,
|
|
|
|
|
.stride = DISPLAY_RESX,
|
|
|
|
|
};
|
|
|
|
|
display_fb_info_t fb = {
|
|
|
|
|
.ptr = drv->mono_framebuf,
|
|
|
|
|
.stride = DISPLAY_RESX,
|
|
|
|
|
};
|
|
|
|
|
#else
|
|
|
|
|
display_fb_info_t fb = {
|
|
|
|
|
.ptr = drv->buffer->pixels,
|
|
|
|
|
.stride = DISPLAY_RESX * sizeof(uint16_t),
|
|
|
|
|
};
|
|
|
|
|
display_fb_info_t fb = {
|
|
|
|
|
.ptr = drv->buffer->pixels,
|
|
|
|
|
.stride = DISPLAY_RESX * sizeof(uint16_t),
|
|
|
|
|
};
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return fb;
|
|
|
|
|
return fb;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else // XFRAMEBUFFER
|
|
|
|
|
|
|
|
|
|
void display_wait_for_sync(void) {
|
|
|
|
|
// not used
|
|
|
|
|
// not implemented in the emulator
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@ -253,7 +294,7 @@ static void copy_mono_framebuf(display_driver_t *drv) {
|
|
|
|
|
void display_refresh(void) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->renderer) {
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -292,6 +333,10 @@ void display_refresh(void) {
|
|
|
|
|
void display_fill(const gfx_bitblt_t *bb) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_bitblt_t bb_new = *bb;
|
|
|
|
|
bb_new.dst_row =
|
|
|
|
|
(uint8_t *)drv->buffer->pixels + (drv->buffer->pitch * bb_new.dst_y);
|
|
|
|
@ -303,6 +348,10 @@ void display_fill(const gfx_bitblt_t *bb) {
|
|
|
|
|
void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_bitblt_t bb_new = *bb;
|
|
|
|
|
bb_new.dst_row =
|
|
|
|
|
(uint8_t *)drv->buffer->pixels + (drv->buffer->pitch * bb_new.dst_y);
|
|
|
|
@ -314,6 +363,10 @@ void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
|
|
|
|
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_bitblt_t bb_new = *bb;
|
|
|
|
|
bb_new.dst_row =
|
|
|
|
|
(uint8_t *)drv->buffer->pixels + (drv->buffer->pitch * bb_new.dst_y);
|
|
|
|
@ -325,6 +378,10 @@ void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
|
|
|
|
void display_copy_mono4(const gfx_bitblt_t *bb) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_bitblt_t bb_new = *bb;
|
|
|
|
|
bb_new.dst_row =
|
|
|
|
|
(uint8_t *)drv->buffer->pixels + (drv->buffer->pitch * bb_new.dst_y);
|
|
|
|
@ -338,6 +395,10 @@ void display_copy_mono4(const gfx_bitblt_t *bb) {
|
|
|
|
|
void display_fill(const gfx_bitblt_t *bb) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_bitblt_t bb_new = *bb;
|
|
|
|
|
bb_new.dst_row = drv->mono_framebuf + (DISPLAY_RESX * bb_new.dst_y);
|
|
|
|
|
bb_new.dst_stride = DISPLAY_RESX;
|
|
|
|
@ -348,6 +409,10 @@ void display_fill(const gfx_bitblt_t *bb) {
|
|
|
|
|
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_bitblt_t bb_new = *bb;
|
|
|
|
|
bb_new.dst_row = drv->mono_framebuf + (DISPLAY_RESX * bb_new.dst_y);
|
|
|
|
|
bb_new.dst_stride = DISPLAY_RESX;
|
|
|
|
@ -360,7 +425,7 @@ void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
|
|
|
|
const char *display_save(const char *prefix) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->renderer) {
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -396,6 +461,10 @@ const char *display_save(const char *prefix) {
|
|
|
|
|
void display_clear_save(void) {
|
|
|
|
|
display_driver_t *drv = &g_display_driver;
|
|
|
|
|
|
|
|
|
|
if (!drv->initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SDL_FreeSurface(drv->prev_saved);
|
|
|
|
|
drv->prev_saved = NULL;
|
|
|
|
|
}
|
|
|
|
|