From 0e419987e48b006104748118fa28161484b7dfa1 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 9 Jan 2006 11:22:36 +0000 Subject: SDL simulator brought by Nathan Hand and Nick Lanham. This is added as a third simulator with the hope that once it works fine, we can remove the other two and only have one unified simulator. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8312 a1c6a512-1295-4272-9138-f99709370657 --- uisimulator/sdl/uisdl.c | 226 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 uisimulator/sdl/uisdl.c (limited to 'uisimulator/sdl/uisdl.c') diff --git a/uisimulator/sdl/uisdl.c b/uisimulator/sdl/uisdl.c new file mode 100644 index 0000000000..e17a925313 --- /dev/null +++ b/uisimulator/sdl/uisdl.c @@ -0,0 +1,226 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Daniel Stenberg + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "config.h" +#include "screenhack.h" + +#include "version.h" + +#include "lcd-x11.h" +#include "lcd-playersim.h" + +#define MAX(x,y) ((x)>(y)?(x):(y)) +#define MIN(x,y) ((x)<(y)?(x):(y)) + +#define PROGNAME "rockboxui" + +/* -- -- */ + +extern SDL_Surface *surface; + +int display_zoom=2; + +bool lcd_display_redraw=true; + +char *progclass = "rockboxui"; + +void init_window () +{ + /* stub */ +} + +/* used for the player sim */ +void drawdots(int color, struct coordinate *points, int count) +{ + SDL_Rect rect; + + while (count--) { + rect.x = points[count].x * display_zoom; + rect.y = points[count].y * display_zoom; + rect.w = display_zoom; + rect.h = display_zoom; + + SDL_FillRect(surface, &rect, color); + } +} + +void drawrect(int color, int x1, int y1, int x2, int y2) +{ + SDL_Rect rect; + + rect.x = x1 * display_zoom; + rect.y = y1 * display_zoom; + rect.w = (x2-x1) * display_zoom; + rect.h = (y2-y1) * display_zoom; + + SDL_FillRect(surface, &rect, color); +} + +#if 0 +static void help(void) +{ + printf(PROGNAME " " ROCKBOXUI_VERSION " " __DATE__ "\n" + "usage: " PROGNAME "\n"); +} +#endif + +void dots(int *colors, struct coordinate *points, int count) +{ + int bpp = surface->format->BytesPerPixel; + + if (SDL_MUSTLOCK(surface)) { + if (SDL_LockSurface(surface)) { + fprintf(stderr, "cannot lock surface: %s", SDL_GetError()); + exit(-1); + } + } + + while (count--) { + int x_off, y_off; + + for (x_off = 0; x_off < display_zoom; x_off++) { + for (y_off = 0; y_off < display_zoom; y_off++) { + int x = points[count].x*display_zoom + x_off; + int y = points[count].y*display_zoom + y_off; + + Uint8 *p = (Uint8 *) surface->pixels + y * surface->pitch + x * bpp; + + switch (bpp) { + case 1: + *p = colors[count]; + break; + + case 2: + *(Uint16 *)p = colors[count]; + break; + + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (colors[count] >> 16) & 0xff; + p[1] = (colors[count] >> 8) & 0xff; + p[2] = (colors[count]) & 0xff; + } else { + p[2] = (colors[count] >> 16) & 0xff; + p[1] = (colors[count] >> 8) & 0xff; + p[0] = (colors[count]) & 0xff; + } + break; + + case 4: + *(Uint32 *)p = colors[count]; + break; + } + } + } + } + + if (SDL_MUSTLOCK(surface)) { + SDL_UnlockSurface(surface); + } + + SDL_UpdateRect(surface, 0, 0, 0, 0); +} + +/* this is where the applicaton starts */ +extern void app_main(void); + +void screenhack() +{ +#if 0 + Bool helpme; + + /* This doesn't work, but I don't know why (Daniel 1999-12-01) */ + helpme = get_boolean_resource ("help", "Boolean"); + if(helpme) + help(); +#endif + + printf(PROGNAME " " ROCKBOXUI_VERSION " (" __DATE__ ")\n"); + + init_window(); + + screen_redraw(); + + app_main(); +} + +/* used for the player sim */ +void drawrectangles(int color, struct rectangle *points, int count) +{ + SDL_Rect rect; + Uint32 sdl_white = SDL_MapRGB(surface->format, 255, 255, 255); + Uint32 sdl_black = SDL_MapRGB(surface->format, 0, 0, 0); + + while (count--) { + rect.x = points[count].x * display_zoom; + rect.y = points[count].y * display_zoom; + rect.w = points[count].width * display_zoom; + rect.h = points[count].height * display_zoom; + + SDL_FillRect(surface, &rect, color ? sdl_white : sdl_black); + } +} + + +void screen_redraw() +{ + /* draw a border around the screen */ + int X1 = 0; + int Y1 = 0; + int X2 = LCD_WIDTH + 2*MARGIN_X - 1; + int Y2 = LCD_HEIGHT + 2*MARGIN_Y - 1; + + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X1, Y1, X2, Y1+1); + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X2, Y1, X2+1, Y2); + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X1, Y2, X2, Y2+1); + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X1, Y1, X1+1, Y2); + + lcd_display_redraw = true; + lcd_update(); + +#ifdef LCD_REMOTE_HEIGHT + /* draw a border around the remote LCD screen */ + int RX1 = 0; + int RY1 = Y2 + 1; + int RX2 = LCD_REMOTE_WIDTH + 2*MARGIN_X - 1; + int RY2 = RY1 + LCD_REMOTE_HEIGHT + 2*MARGIN_Y - 1; + + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX1, RY1, RX2, RY1+1); + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX2, RY1, RX2+1, RY2); + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX1, RY2, RX2, RY2+1); + drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX1, RY1, RX1+1, RY2); + + lcd_display_redraw = true; + lcd_remote_update(); +#endif +} -- cgit v1.2.3