Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
| 8 | * $Id$ |
| 9 | * |
| 10 | * Copyright (C) 2006 Dan Everton |
| 11 | * |
Daniel Stenberg | 2acc0ac | 2008-06-28 18:10:04 +0000 | [diff] [blame] | 12 | * This program is free software; you can redistribute it and/or |
| 13 | * modify it under the terms of the GNU General Public License |
| 14 | * as published by the Free Software Foundation; either version 2 |
| 15 | * of the License, or (at your option) any later version. |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 16 | * |
| 17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 18 | * KIND, either express or implied. |
| 19 | * |
| 20 | ****************************************************************************/ |
| 21 | |
Thomas Martitz | 3d0cee8 | 2010-05-15 21:02:47 +0000 | [diff] [blame] | 22 | #include "sim-ui-defines.h" |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 23 | #include "lcd-sdl.h" |
Jens Arnold | 05ddd9a | 2006-07-28 07:35:45 +0000 | [diff] [blame] | 24 | #include "lcd-remote-bitmap.h" |
Jens Arnold | 11ad7b4 | 2009-02-10 23:43:37 +0000 | [diff] [blame] | 25 | #include "screendump.h" |
Thomas Martitz | 3d0cee8 | 2010-05-15 21:02:47 +0000 | [diff] [blame] | 26 | #include "system.h" /* background */ |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 27 | |
Steve Bavin | b341f5d | 2009-10-26 09:58:39 +0000 | [diff] [blame] | 28 | SDL_Surface *remote_surface = 0; |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 29 | |
Jens Arnold | 0d935ce | 2009-02-09 00:32:59 +0000 | [diff] [blame] | 30 | SDL_Color remote_bl_color_dark = {RED_CMP(LCD_REMOTE_BL_DARKCOLOR), |
| 31 | GREEN_CMP(LCD_REMOTE_BL_DARKCOLOR), |
| 32 | BLUE_CMP(LCD_REMOTE_BL_DARKCOLOR), 0}; |
| 33 | SDL_Color remote_bl_color_bright = {RED_CMP(LCD_REMOTE_BL_BRIGHTCOLOR), |
| 34 | GREEN_CMP(LCD_REMOTE_BL_BRIGHTCOLOR), |
| 35 | BLUE_CMP(LCD_REMOTE_BL_BRIGHTCOLOR), 0}; |
| 36 | SDL_Color remote_color_dark = {RED_CMP(LCD_REMOTE_DARKCOLOR), |
| 37 | GREEN_CMP(LCD_REMOTE_DARKCOLOR), |
| 38 | BLUE_CMP(LCD_REMOTE_DARKCOLOR), 0}; |
| 39 | SDL_Color remote_color_bright = {RED_CMP(LCD_REMOTE_BRIGHTCOLOR), |
| 40 | GREEN_CMP(LCD_REMOTE_BRIGHTCOLOR), |
| 41 | BLUE_CMP(LCD_REMOTE_BRIGHTCOLOR), 0}; |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 42 | |
Jens Arnold | 11ad7b4 | 2009-02-10 23:43:37 +0000 | [diff] [blame] | 43 | #define NUM_SHADES 129 |
Jens Arnold | 0d935ce | 2009-02-09 00:32:59 +0000 | [diff] [blame] | 44 | |
| 45 | #if LCD_REMOTE_DEPTH == 2 |
| 46 | /* Only defined for positive, non-split LCD for now */ |
| 47 | static const unsigned char colorindex[4] = {128, 85, 43, 0}; |
| 48 | #endif |
| 49 | |
| 50 | static unsigned long get_lcd_remote_pixel(int x, int y) |
| 51 | { |
Jens Arnold | 05ddd9a | 2006-07-28 07:35:45 +0000 | [diff] [blame] | 52 | #if LCD_REMOTE_DEPTH == 1 |
Jonathan Gordon | b37e6bc | 2012-02-22 21:18:05 +1100 | [diff] [blame] | 53 | return *FBREMOTEADDR(x, y/8) & (1 << (y & 7)) ? 0 : (NUM_SHADES-1); |
Jens Arnold | 05ddd9a | 2006-07-28 07:35:45 +0000 | [diff] [blame] | 54 | #elif LCD_REMOTE_DEPTH == 2 |
| 55 | #if LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED |
Jonathan Gordon | b37e6bc | 2012-02-22 21:18:05 +1100 | [diff] [blame] | 56 | unsigned bits = (*FBREMOTEADDR(x, y/8) >> (y & 7)) & 0x0101; |
Jens Arnold | 0d935ce | 2009-02-09 00:32:59 +0000 | [diff] [blame] | 57 | return colorindex[(bits | (bits >> 7)) & 3]; |
Jens Arnold | 05ddd9a | 2006-07-28 07:35:45 +0000 | [diff] [blame] | 58 | #endif |
| 59 | #endif |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | void lcd_remote_update (void) |
| 63 | { |
| 64 | lcd_remote_update_rect(0, 0, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT); |
| 65 | } |
| 66 | |
| 67 | void lcd_remote_update_rect(int x_start, int y_start, int width, int height) |
| 68 | { |
Steve Bavin | b341f5d | 2009-10-26 09:58:39 +0000 | [diff] [blame] | 69 | if (remote_surface) |
| 70 | { |
| 71 | sdl_update_rect(remote_surface, x_start, y_start, width, height, |
| 72 | LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, get_lcd_remote_pixel); |
| 73 | sdl_gui_update(remote_surface, x_start, y_start, width, height, |
| 74 | LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, background ? UI_REMOTE_POSX : 0, |
| 75 | background ? UI_REMOTE_POSY : LCD_HEIGHT); |
| 76 | } |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 77 | } |
| 78 | |
Dan Everton | 3ba0060 | 2006-02-13 21:46:28 +0000 | [diff] [blame] | 79 | void sim_remote_backlight(int value) |
| 80 | { |
Steve Bavin | b341f5d | 2009-10-26 09:58:39 +0000 | [diff] [blame] | 81 | if (remote_surface) |
| 82 | { |
| 83 | if (value > 0) |
| 84 | { |
| 85 | sdl_set_gradient(remote_surface, &remote_bl_color_dark, |
| 86 | &remote_bl_color_bright, 0, NUM_SHADES); |
| 87 | } |
| 88 | else |
| 89 | { |
| 90 | sdl_set_gradient(remote_surface, &remote_color_dark, |
| 91 | &remote_color_bright, 0, NUM_SHADES); |
| 92 | } |
| 93 | sdl_gui_update(remote_surface, 0, 0, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, |
| 94 | LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, |
| 95 | background ? UI_REMOTE_POSX : 0, |
| 96 | background? UI_REMOTE_POSY : LCD_HEIGHT); |
Dan Everton | 3ba0060 | 2006-02-13 21:46:28 +0000 | [diff] [blame] | 97 | } |
| 98 | } |
| 99 | |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 100 | /* initialise simulator lcd remote driver */ |
Thomas Martitz | 6cbc701 | 2010-05-18 12:27:20 +0000 | [diff] [blame] | 101 | void lcd_remote_init_device(void) |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 102 | { |
Thomas Martitz | 6cbc701 | 2010-05-18 12:27:20 +0000 | [diff] [blame] | 103 | if (!showremote) |
| 104 | return; |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 105 | remote_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, |
Jens Arnold | 0d935ce | 2009-02-09 00:32:59 +0000 | [diff] [blame] | 106 | LCD_REMOTE_WIDTH * display_zoom, |
| 107 | LCD_REMOTE_HEIGHT * display_zoom, |
| 108 | 8, 0, 0, 0, 0); |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 109 | |
Jens Arnold | 0d935ce | 2009-02-09 00:32:59 +0000 | [diff] [blame] | 110 | sdl_set_gradient(remote_surface, &remote_bl_color_dark, |
Jens Arnold | 11ad7b4 | 2009-02-10 23:43:37 +0000 | [diff] [blame] | 111 | &remote_bl_color_bright, 0, NUM_SHADES); |
Dan Everton | b585e87 | 2006-02-09 21:49:28 +0000 | [diff] [blame] | 112 | } |
| 113 | |