aboutsummaryrefslogtreecommitdiff
path: root/source/nds/draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/nds/draw.c')
-rw-r--r--source/nds/draw.c1315
1 files changed, 0 insertions, 1315 deletions
diff --git a/source/nds/draw.c b/source/nds/draw.c
deleted file mode 100644
index 6344f5b..0000000
--- a/source/nds/draw.c
+++ /dev/null
@@ -1,1315 +0,0 @@
-/* draw.c
- *
- * Copyright (C) 2010 dking <dking024@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public Licens e as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program 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
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-//v1.1
-
-/******************************************************************************
- * draw.cpp
- * basic program to draw some graphic
- ******************************************************************************/
-#include "port.h"
-#include <string.h>
-#include <stdio.h>
-#include "ds2_malloc.h"
-#include "ds2_cpu.h"
-#include "bdf_font.h"
-#include "gui.h"
-#include "bitmap.h"
-#include "draw.h"
-
-/******************************************************************************
- * macro definition
- ******************************************************************************/
-#define progress_sx (screen_width2 - SCREEN_WIDTH / 3) // Center -160/-80
-#define progress_ex (screen_width2 + SCREEN_WIDTH / 3) // Center +160/+80
-#define progress_sy (screen_height2 + 3) // Center +3
-#define progress_ey (screen_height2 + 13) // Center +13
-#define yesno_sx (screen_width2 - SCREEN_WIDTH / 3) // Center -160/-80
-#define yesno_ex (screen_width2 + SCREEN_WIDTH / 3) // Center +160/+80
-#define yesno_sy (screen_height2 + 3) // Center +3
-#define yesno_ey (screen_height2 + 13) // Center +13
-#define progress_color COLOR16(15,15,15)
-
-//#define progress_wait (0.5 * 1000 * 1000)
-#define progress_wait (OS_TICKS_PER_SEC/2) //0.5S
-
-#define FONTS_HEIGHT 14
-
-#define SCREEN_PITCH 256
-
-#define VRAM_POS(screen, x, y) ((unsigned short*)screen + (x + (y) * SCREEN_PITCH))
-
-#define BOOTLOGO "SYSTEM/GUI/boot.bmp"
-#define GUI_SOURCE_PATH "SYSTEM/GUI"
-#define GUI_PIC_BUFSIZE 1024*512
-
-char gui_picture[GUI_PIC_BUFSIZE];
-
-struct gui_iconlist gui_icon_list[]= {
- //file system
- /* 00 */ {"zipfile", 16, 16, NULL},
- /* 01 */ {"directory", 16, 16, NULL},
- /* 02 */ {"sfcfile", 16, 16, NULL},
-
- //title
- /* 03 */ {"stitle", 256, 33, NULL},
- //main menu
- /* 04 */ {"savo", 52, 52, NULL},
- /* 05 */ {"ssaveo", 52, 52, NULL},
- /* 06 */ {"stoolo", 52, 52, NULL},
- /* 07 */ {"scheato", 52, 52, NULL},
- /* 08 */ {"sother", 52, 52, NULL},
- /* 09 */ {"sexito", 52, 52, NULL},
- /* 10 */ {"smsel", 79, 15, NULL},
- /* 11 */ {"smnsel", 79, 15, NULL},
-
- /* 12 */ {"snavo", 52, 52, NULL},
- /* 13 */ {"snsaveo", 52, 52, NULL},
- /* 14 */ {"sntoolo", 52, 52, NULL},
- /* 15 */ {"sncheato", 52, 52, NULL},
- /* 16 */ {"snother", 52, 52, NULL},
- /* 17 */ {"snexito", 52, 52, NULL},
-
- /* 18 */ {"sunnof", 16, 16, NULL},
- /* 19 */ {"smaini", 85, 38, NULL},
- /* 20 */ {"snmaini", 85, 38, NULL},
- /* 21 */ {"smaybgo", 256, 192, NULL},
-
- /* 22 */ {"sticon", 29, 13, NULL},
- /* 23 */ {"ssubbg", 256, 192, NULL},
-
- /* 24 */ {"subsela", 245, 22, NULL},
- /* 25 */ {"sfullo", 12, 12, NULL},
- /* 26 */ {"snfullo", 12, 12, NULL},
- /* 27 */ {"semptyo", 12, 12, NULL},
- /* 28 */ {"snemptyo", 12, 12, NULL},
- /* 29 */ {"fdoto", 16, 16, NULL},
- /* 30 */ {"backo", 19, 13, NULL},
- /* 31 */ {"nbacko", 19, 13, NULL},
- /* 32 */ {"chtfile", 16, 15, NULL},
- /* 33 */ {"smsgfr", 193, 111, NULL},
- /* 34 */ {"sbutto", 76, 16, NULL}
- };
-
-u16 COLOR_BG = COLOR16( 0, 0, 0);
-u16 COLOR_INACTIVE_ITEM = COLOR16( 0, 0, 0);
-u16 COLOR_ACTIVE_ITEM = COLOR16(31, 31, 31);
-u16 COLOR_MSSG = COLOR16( 0, 0, 0);
-u16 COLOR_INACTIVE_MAIN = COLOR16(31, 31, 31);
-u16 COLOR_ACTIVE_MAIN = COLOR16(31, 31, 31);
-
-
-/*
-* Drawing string aroud center
-*/
-void print_string_center(void* screen_addr, u32 sy, u32 color, u32 bg_color, char *str)
-{
- int width = 0;//fbm_getwidth(str);
- u32 sx = (SCREEN_WIDTH - width) / 2;
-
- PRINT_STRING_BG(screen_addr, str, color, bg_color, sx, sy);
-}
-
-/*
-* Drawing string with shadow around center
-*/
-void print_string_shadow_center(void* screen_addr, u32 sy, u32 color, char *str)
-{
- int width = 0;//fbm_getwidth(str);
- u32 sx = (SCREEN_WIDTH - width) / 2;
-
- PRINT_STRING_SHADOW(screen_addr, str, color, sx, sy);
-}
-
-/*
-* Drawing horizontal line
-*/
-void drawhline(void* screen_addr, u32 sx, u32 ex, u32 y, u32 color)
-{
- u32 x;
- u32 width = (ex - sx) + 1;
- u16 *dst = VRAM_POS(screen_addr, sx, y);
-
- for (x = 0; x < width; x++)
- *dst++ = (u16)color;
-}
-
-/*
-* Drawing vertical line
-*/
-void drawvline(void* screen_addr, u32 x, u32 sy, u32 ey, u32 color)
-{
- int y;
- int height = (ey - sy) + 1;
- u16 *dst = VRAM_POS(screen_addr, x, sy);
-
- for (y = 0; y < height; y++)
- {
- *dst = (u16)color;
- dst += SCREEN_PITCH;
- }
-}
-
-/*
-* Drawing rectangle
-*/
-void drawbox(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey, u32 color)
-{
- drawhline(screen_addr, sx, ex - 1, sy, color);
- drawvline(screen_addr, ex, sy, ey - 1, color);
- drawhline(screen_addr, sx + 1, ex, ey, color);
- drawvline(screen_addr, sx, sy + 1, ey, color);
-}
-
-/*
-* Filling a rectangle
-*/
-void drawboxfill(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey, u32 color)
-{
- u32 x, y;
- u32 width = (ex - sx) + 1;
- u32 height = (ey - sy) + 1;
- u16 *dst = VRAM_POS(screen_addr, sx, sy);
-
- for (y = 0; y < height; y++)
- {
- for (x = 0; x < width; x++)
- {
- dst[x + y * SCREEN_PITCH] = (u16)color;
- }
- }
-}
-
-/*
-* Drawing a selection item
-- active 0 not fill
-- 1 fill with gray
-- 2 fill with color
-- 3 fill with color and most brithness
-- color 0 Red
-- 1 Green
-- 2 Blue
-------------------------------------------------------*/
-void draw_selitem(void* screen_addr, u32 x, u32 y, u32 color, u32 active)
-{
- u32 size;
- u32 color0, color1, color2, color3;
-
- size= 10;
-
- switch(active)
- {
- case 1:
- color0 = COLOR16(12, 12, 12);
- color1 = COLOR16(2, 2, 2);
- color2 = COLOR16(7, 7, 7);
- color3 = COLOR16(22, 22, 22);
- break;
- case 2:
- switch(color)
- {
- case 0: //Red
- color0 = COLOR16(12, 12, 12);
- color1 = COLOR16(8, 0, 0);
- color2 = COLOR16(16, 0, 0);
- color3 = COLOR16(24, 0, 0);
- break;
- case 1: //Green
- color0 = COLOR16(12, 12, 12);
- color1 = COLOR16(0, 8, 0);
- color2 = COLOR16(0, 16, 0);
- color3 = COLOR16(0, 24, 0);
- break;
- case 2: //Blue
- color0 = COLOR16(12, 12, 12);
- color1 = COLOR16(0, 0, 8);
- color2 = COLOR16(0, 0, 16);
- color3 = COLOR16(0, 0, 24);
- break;
- default:
- color0 = COLOR16(12, 12, 12);
- color1 = COLOR16(0, 8, 0);
- color2 = COLOR16(0, 16, 0);
- color3 = COLOR16(0, 24, 0);
- break;
- }
- break;
- case 3:
- switch(color)
- {
- case 0: //Red
- color0 = COLOR16(31, 31, 31);
- color1 = COLOR16(16, 0, 0);
- color2 = COLOR16(22, 0, 0);
- color3 = COLOR16(31, 0, 0);
- break;
- case 1: //Green
- color0 = COLOR16(31, 31, 31);
- color1 = COLOR16(0, 16, 0);
- color2 = COLOR16(0, 22, 0);
- color3 = COLOR16(0, 31, 0);
- break;
- case 2: //Blue
- color0 = COLOR16(31, 31, 31);
- color1 = COLOR16(0, 0, 16);
- color2 = COLOR16(0, 0, 22);
- color3 = COLOR16(0, 0, 31);
- break;
- default:
- color0 = COLOR16(31, 31, 31);
- color1 = COLOR16(0, 16, 0);
- color2 = COLOR16(0, 22, 0);
- color3 = COLOR16(0, 31, 0);
- break;
- }
- break;
- default:
- color0= COLOR16(18, 18, 18);
- color1= color2= color3= COLOR16(18, 18, 18);
- break;
- }
-
- drawbox(screen_addr, x, y, x+size-1, y+size-1, color0);
-
- if(active >0)
- {
- drawbox(screen_addr, x+1, y+1, x+size-2, y+size-2, color1);
- drawbox(screen_addr, x+2, y+2, x+size-3, y+size-3, color2);
- drawboxfill(screen_addr, x+3, y+3, x+size-4, y+size-4, color3);
- }
-}
-
-/*
-* Drawing message box
-* Note if color_fg is transparent, screen_bg can't be transparent
-*/
-void draw_message(void* screen_addr, u16 *screen_bg, u32 sx, u32 sy, u32 ex, u32 ey,
- u32 color_fg)
-{
- if(!(color_fg & 0x8000))
- {
-// drawbox(screen_addr, sx, sy, ex, ey, COLOR16(12, 12, 12));
-// drawboxfill(screen_addr, sx+1, sy+1, ex-1, ey-1, color_fg);
- show_icon(screen_addr, &ICON_MSG, (NDS_SCREEN_WIDTH - ICON_MSG.x) / 2, (NDS_SCREEN_HEIGHT - ICON_MSG.y) / 2);
- }
- else
- {
- u16 *screenp, *screenp1;
- u32 width, height, i, k;
- u32 tmp, tmp1, tmp2;
- u32 r, g, b;
-
- width= ex-sx;
- height= ey-sy;
- r= ((color_fg >> 10) & 0x1F) * 6/7;
- g= ((color_fg >> 5) & 0x1F) * 6/7;
- b= (color_fg & 0x1F) * 6/7;
- for(k= 0; k < height; k++)
- {
- screenp = VRAM_POS(screen_addr, sx, sy+k);
- screenp1 = screen_bg + sx + (sy + k) * SCREEN_PITCH;
- for(i= 0; i < width; i++)
- {
- tmp = *screenp1++;
- tmp1 = ((tmp >> 10) & 0x1F) *1/7 + r;
- tmp2 = (tmp1 > 31) ? 31 : tmp1;
- tmp1 = ((tmp >> 5) & 0x1F) *1/7 + g;
- tmp2 = (tmp2 << 5) | ((tmp1 > 31) ? 31 : tmp1);
- tmp1 = (tmp & 0x1F) *1/7 + b;
- tmp2 = (tmp2 << 5) | ((tmp1 > 31) ? 31 : tmp1);
- *screenp++ = tmp2;
- }
- }
- }
-}
-
-/*
-* Drawing string horizontal center aligned
-*/
-void draw_string_vcenter(void* screen_addr, u32 sx, u32 sy, u32 width, u32 color_fg, char *string)
-{
- u32 x, num, i, m;
- u16 *screenp;
- u16 unicode[256];
-
- num= 0;
- while(*string)
- {
- string= utf8decode(string, unicode+num);
- num++;
- }
-
- if(num== 0) return;
-
- screenp = (unsigned short*)screen_addr + sx + sy*SCREEN_WIDTH;
- i= 0;
- while(i < num)
- {
- m= BDF_cut_unicode(&unicode[i], num-i, width, 1);
- x= (width - BDF_cut_unicode(&unicode[i], m, 0, 3)) / 2;
- while(m--)
- {
- x += BDF_render16_ucs(screenp+x, SCREEN_WIDTH, 0, COLOR_TRANS,
- color_fg, unicode[i++]);
- }
- if (i < num && (unicode[i] == 0x0D || unicode[i] == 0x0A))
- i++;
- else {
- while (i < num && (unicode[i] == ' ')) i++;
- }
- screenp += FONTS_HEIGHT * SCREEN_WIDTH;
- }
-}
-
-/*------------------------------------------------------
- Drawing a scroll string
-------------------------------------------------------*/
-//limited
-// < 256 Unicodes
-// width < 256+128
-//#define MAX_SCROLL_STRING 8
-
-/*------------------------------------------------------
-- scroll_val < 0 scroll toward left
-- > 0 scroll toward right
-------------------------------------------------------*/
-struct scroll_string_info{
- u16 *screenp;
- u32 sx;
- u32 sy;
- u32 width;
- u32 height;
- u16 *unicode;
- u32 color_bg;
- u32 color_fg;
- u16 *buff_fonts;
- u32 buff_width;
- u16 *buff_bg;
- s32 pos_pixel;
- u32 str_start;
- u32 str_end;
- u32 str_len;
-};
-
-static struct scroll_string_info scroll_strinfo[MAX_SCROLL_STRING];
-static u32 scroll_string_num= 0;
-
-/*
- * Initialises a text scroller to display a certain string.
- * Input assertions: sx + width < NDS_SCREEN_WIDTH &&
- * sy + [text height] < NDS_SCREEN_HEIGHT && string != NULL &&
- * screen_addr != NULL.
- * Input: 'screen_addr', the address of the upper-left corner of the screen.
- * 'sx' and 'sy', the X and Y coordinates of the upper-left corner of
- * the text.
- * 'width', the width of the scroller's viewport.
- * 'color_bg', the RGB15 color of the background around the text, or
- * COLOR_TRANS for transparency.
- * 'color_fg', the RGB15 color of the text.
- * 'string', the text to be scrolled, encoded as UTF-8.
- * Output: the scroller's handle, to be used to scroll the text in
- * draw_hscroll.
- */
-u32 hscroll_init(void* screen_addr, u32 sx, u32 sy, u32 width,
- u32 color_bg, u32 color_fg, char *string)
-{
- u32 index, x, textWidth, num, len, i;
- u16 *unicode, *screenp;
-
- // 1. Which scroller should we use for this request?
- for(i= 0; i < MAX_SCROLL_STRING; i++)
- {
- if(scroll_strinfo[i].screenp == NULL)
- break;
- }
-
- if(i >= MAX_SCROLL_STRING)
- return -1;
-
- index= i;
-
- // 2. Convert to Unicode while calculating the width of the text.
- unicode= (u16*)malloc(strlen(string)*sizeof(u16));
- if(unicode == NULL)
- {
- scroll_strinfo[index].str_len = 0;
- return -3;
- }
-
- num= 0;
- textWidth = 0;
- while(*string)
- {
- string= utf8decode(string, unicode+num);
- if(unicode[num] != 0x0D && unicode[num] != 0x0A) {
- textWidth += BDF_width16_ucs(unicode[num]);
- num++;
- }
- }
- if (textWidth < width)
- textWidth = width;
-
- // 3. Allocate a rectangle of pixels for drawing the entire text into.
- screenp= (u16*)malloc(textWidth*FONTS_HEIGHT*sizeof(u16));
- if(screenp == NULL)
- {
- scroll_strinfo[index].str_len = 0;
- free((void*)unicode);
- return -2;
- }
-
- if(color_bg == COLOR_TRANS)
- memset(screenp, 0, textWidth*FONTS_HEIGHT*sizeof(u16));
-
- scroll_string_num += 1;
- scroll_strinfo[index].screenp = (unsigned short*)screen_addr;
- scroll_strinfo[index].sx= sx;
- scroll_strinfo[index].sy= sy;
- scroll_strinfo[index].color_bg= color_bg;
- scroll_strinfo[index].color_fg= color_fg;
- scroll_strinfo[index].width= width;
- scroll_strinfo[index].height= FONTS_HEIGHT;
- scroll_strinfo[index].unicode= unicode;
- scroll_strinfo[index].buff_fonts= screenp;
- scroll_strinfo[index].buff_bg= 0;
- scroll_strinfo[index].buff_width= textWidth;
- scroll_strinfo[index].pos_pixel= 0;
- scroll_strinfo[index].str_start= 0;
- scroll_strinfo[index].str_end= len-1;
-
- scroll_strinfo[index].str_len= num;
- if(num == 0)
- return index; // (1. Which scroller?)
-
- // 4. Render text into the allocation.
- i= 0;
- x= 0;
- while(i < num)
- {
- x += BDF_render16_ucs(screenp + x, textWidth, 0, color_bg, color_fg, unicode[i++]);
- }
-
- return index; // (1. Which scroller?)
-}
-
-u32 draw_hscroll_init(void* screen_addr, u32 sx, u32 sy, u32 width,
- u32 color_bg, u32 color_fg, char *string)
-{
- u32 ret = hscroll_init(screen_addr, sx, sy, width, color_bg, color_fg, string);
-
- draw_hscroll(ret, 0 /* stay on the left */);
-
- return ret;
-}
-
-/*
- * Scrolls an initialised scroller's text.
- * A scroller is never allowed to go past the beginning of the text when
- * scrolling to the left, or to go past the end when scrolling to the right.
- * Input assertions: index was returned by a previous call to
- * draw_hscroll_init and not used in a call to draw_hscroll_over.
- * Input: 'index', the scroller's handle.
- * 'scroll_val', the number of pixels to scroll. The sign affects the
- * direction. If scroll_val > 0, the scroller's viewport is moved to
- * the left; if < 0, the scroller's viewport is moved to the right.
- * Output: the number of pixels still available to scroll in the direction
- * specified by the sign of 'scroll_val'.
- *
- * Example: (assume each letter is 1 pixel; this won't be true in reality)
- * [some lengthy text shown in ] |
- * val -5 -> | [lengthy text shown in a scr]xxxxx -> to right, returns 5
- * val -5 -> | [hy text shown in a scroller] -> to right, returns 0
- * val 3 -> xxxxxxx[ngthy text shown in a scrol] | -> to left, returns 7
- * val 3 -> xxxx[ lengthy text shown in a sc] | -> to left, returns 4
- */
-u32 draw_hscroll(u32 index, s32 scroll_val)
-{
- u32 color_bg, color_fg, i, width, height;
- s32 xoff;
-
- if(index >= MAX_SCROLL_STRING) return -1;
- if(scroll_strinfo[index].screenp == NULL) return -2;
- if(scroll_strinfo[index].str_len == 0) return 0;
-
- width= scroll_strinfo[index].width;
- height= scroll_strinfo[index].height;
- color_bg= scroll_strinfo[index].color_bg;
- color_fg= scroll_strinfo[index].color_fg;
-
- // 1. Shift the scroller.
- scroll_strinfo[index].pos_pixel -= scroll_val;
- if (scroll_strinfo[index].pos_pixel < 0) // Reached the beginning
- scroll_strinfo[index].pos_pixel = 0;
- else if (scroll_strinfo[index].pos_pixel > scroll_strinfo[index].buff_width - width) // Reached the end
- scroll_strinfo[index].pos_pixel = scroll_strinfo[index].buff_width - width;
-
- // 2. Draw the scroller's text at its new position.
- u32 x, sx, sy, pixel;
- u16 *screenp, *screenp1;
-
- sx= scroll_strinfo[index].sx;
- sy= scroll_strinfo[index].sy;
-
- if(color_bg == COLOR_TRANS)
- {
- for(i= 0; i < height; i++)
- {
- screenp= scroll_strinfo[index].screenp + sx + (sy + i) * SCREEN_WIDTH;
- screenp1= scroll_strinfo[index].buff_fonts + scroll_strinfo[index].pos_pixel + i*scroll_strinfo[index].buff_width;
- for(x= 0; x < width; x++)
- {
- pixel= *screenp1++;
- if(pixel) *screenp = pixel;
- screenp ++;
- }
- }
- }
- else
- {
- for(i= 0; i < height; i++)
- {
- screenp= scroll_strinfo[index].screenp + sx + (sy + i) * SCREEN_WIDTH;
- screenp1= scroll_strinfo[index].buff_fonts + scroll_strinfo[index].pos_pixel + i*scroll_strinfo[index].buff_width;
- for(x= 0; x < width; x++)
- *screenp++ = *screenp1++;
- }
- }
-
- // 3. Return how many more pixels we can scroll in the same direction.
- if(scroll_val > 0)
- // Scrolling to the left: Return the number of pixels we can still go
- // to the left.
- return scroll_strinfo[index].pos_pixel;
- else
- // Scrolling to the right: Return the number of pixels we can still go
- // to the right.
- return scroll_strinfo[index].buff_width - scroll_strinfo[index].pos_pixel - width;
-}
-
-void draw_hscroll_over(u32 index)
-{
- if(scroll_strinfo[index].screenp== NULL)
- return;
-
- if(index < MAX_SCROLL_STRING && scroll_string_num > 0)
- {
- if(scroll_strinfo[index].unicode)
- {
- free((void*)scroll_strinfo[index].unicode);
- scroll_strinfo[index].unicode= NULL;
- }
- if(scroll_strinfo[index].buff_fonts)
- {
- free((void*)scroll_strinfo[index].buff_fonts);
- scroll_strinfo[index].buff_fonts= NULL;
- }
- scroll_strinfo[index].screenp= NULL;
- scroll_strinfo[index].str_len= 0;
-
- scroll_string_num -=1;
- }
-}
-
-/*
-* Drawing dialog
-*/
-/*
-void draw_dialog(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey)
-{
- drawboxfill(screen_addr, sx + 5, sy + 5, ex + 5, ey + 5, COLOR_DIALOG_SHADOW);
-
- drawhline(screen_addr, sx, ex - 1, sy, COLOR_FRAME);
- drawvline(screen_addr, ex, sy, ey - 1, COLOR_FRAME);
- drawhline(screen_addr, sx + 1, ex, ey, COLOR_FRAME);
- drawvline(screen_addr, sx, sy + 1, ey, COLOR_FRAME);
-
- sx++;
- ex--;
- sy++;
- ey--;
-
- drawhline(screen_addr, sx, ex - 1, sy, COLOR_FRAME);
- drawvline(screen_addr, ex, sy, ey - 1, COLOR_FRAME);
- drawhline(screen_addr, sx + 1, ex, ey, COLOR_FRAME);
- drawvline(screen_addr, sx, sy + 1, ey, COLOR_FRAME);
-
- sx++;
- ex--;
- sy++;
- ey--;
-
- drawboxfill(screen_addr, sx, sy, ex, ey, COLOR_DIALOG);
-}
-*/
-
-/*
-* Draw yes or no dialog
-*/
-u32 draw_yesno_dialog(enum SCREEN_ID screen, u32 sy, char *yes, char *no)
-{
- u16 unicode[8];
- u32 len, width, box_width, i;
- char *string;
- void* screen_addr;
-
- len= 0;
- string= yes;
- while(*string)
- {
- string= utf8decode(string, &unicode[len]);
- if(unicode[len] != 0x0D && unicode[len] != 0x0A)
- {
- if(len < 8) len++;
- else break;
- }
- }
- width= BDF_cut_unicode(unicode, len, 0, 3);
-
- len= 0;
- string= no;
- while(*string)
- {
- string= utf8decode(string, &unicode[len]);
- if(unicode[len] != 0x0D && unicode[len] != 0x0A)
- {
- if(len < 8) len++;
- else break;
- }
- }
- i= BDF_cut_unicode(unicode, len, 0, 3);
-
- if(width < i) width= i;
- box_width= 64;
- if(box_width < (width +6)) box_width = width +6;
-
- if(screen & UP_MASK)
- screen_addr = up_screen_addr;
- else
- screen_addr = down_screen_addr;
-
- sy = (NDS_SCREEN_HEIGHT + ICON_MSG.y) / 2 - 8 - ICON_BUTTON.y;
-
- u32 left_sx = NDS_SCREEN_WIDTH / 2 - 8 - ICON_BUTTON.x,
- right_sx = NDS_SCREEN_WIDTH / 2 + 8;
-
- show_icon((unsigned short*)screen_addr, &ICON_BUTTON, left_sx, sy);
- draw_string_vcenter((unsigned short*)screen_addr, left_sx + 2, sy, ICON_BUTTON.x - 4, COLOR_WHITE, yes);
-
- show_icon((unsigned short*)screen_addr, &ICON_BUTTON, right_sx, sy);
- draw_string_vcenter((unsigned short*)screen_addr, right_sx + 2, sy, ICON_BUTTON.x - 4, COLOR_WHITE, no);
-
- ds2_flipScreen(screen, 2);
-
- gui_action_type gui_action = CURSOR_NONE;
- while((gui_action != CURSOR_SELECT) && (gui_action != CURSOR_BACK))
- {
- gui_action = get_gui_input();
- if (gui_action == CURSOR_TOUCH)
- {
- struct key_buf inputdata;
- ds2_getrawInput(&inputdata);
- // Turn it into a SELECT (A) or BACK (B) if the button is touched.
- if (inputdata.y >= sy && inputdata.y < sy + ICON_BUTTON.y)
- {
- if (inputdata.x >= left_sx && inputdata.x < left_sx + ICON_BUTTON.x)
- gui_action = CURSOR_SELECT;
- else if (inputdata.x >= right_sx && inputdata.x < right_sx + ICON_BUTTON.x)
- gui_action = CURSOR_BACK;
- }
- }
- mdelay(16);
- }
-
- if (gui_action == CURSOR_SELECT)
- return 1;
- else
- return 0;
-}
-
-/*
-* Draw hotkey dialog
-* Returns DS keys pressed, as in ds2io.h.
-*/
-u32 draw_hotkey_dialog(enum SCREEN_ID screen, u32 sy, char *clear, char *cancel)
-{
- u16 unicode[8];
- u32 len, width, box_width, i;
- char *string;
- void* screen_addr;
-
- len= 0;
- string= clear;
- while(*string)
- {
- string= utf8decode(string, &unicode[len]);
- if(unicode[len] != 0x0D && unicode[len] != 0x0A)
- {
- if(len < 8) len++;
- else break;
- }
- }
- width= BDF_cut_unicode(unicode, len, 0, 3);
-
- len= 0;
- string= cancel;
- while(*string)
- {
- string= utf8decode(string, &unicode[len]);
- if(unicode[len] != 0x0D && unicode[len] != 0x0A)
- {
- if(len < 8) len++;
- else break;
- }
- }
- i= BDF_cut_unicode(unicode, len, 0, 3);
-
- if(width < i) width= i;
- box_width= 64;
- if(box_width < (width +6)) box_width = width +6;
-
- if(screen & UP_MASK)
- screen_addr = up_screen_addr;
- else
- screen_addr = down_screen_addr;
-
- i= SCREEN_WIDTH/2 - box_width - 2;
- show_icon((unsigned short*)screen_addr, &ICON_BUTTON, 49, 128);
- draw_string_vcenter((unsigned short*)screen_addr, 51, 130, 73, COLOR_WHITE, clear);
-
- i= SCREEN_WIDTH/2 + 3;
- show_icon((unsigned short*)screen_addr, &ICON_BUTTON, 136, 128);
- draw_string_vcenter((unsigned short*)screen_addr, 138, 130, 73, COLOR_WHITE, cancel);
-
- ds2_flipScreen(screen, 2);
-
- // This function has been started by a key press. Wait for it to end.
- struct key_buf inputdata;
- do {
- mdelay(1);
- ds2_getrawInput(&inputdata);
- } while (inputdata.key != 0);
-
- // While there are no keys pressed, wait for keys.
- do {
- mdelay(1);
- ds2_getrawInput(&inputdata);
- } while (inputdata.key == 0);
-
- // Now, while there are keys pressed, keep a tally of keys that have
- // been pressed. (IGNORE TOUCH AND LID! Otherwise, closing the lid or
- // touching to get to the menu will do stuff the user doesn't expect.)
- u32 TotalKeys = 0;
-
- do {
- TotalKeys |= inputdata.key & ~(KEY_TOUCH | KEY_LID);
- // If there's a touch on either button, turn it into a
- // clear (A) or cancel (B) request.
- if (inputdata.key & KEY_TOUCH)
- {
- if (inputdata.y >= 128 && inputdata.y < 128 + ICON_BUTTON.y)
- {
- if (inputdata.x >= 49 && inputdata.x < 49 + ICON_BUTTON.x)
- return KEY_A;
- else if (inputdata.x >= 136 && inputdata.x < 136 + ICON_BUTTON.x)
- return KEY_B;
- }
- }
- mdelay(1);
- ds2_getrawInput(&inputdata);
- } while (inputdata.key != 0 || TotalKeys == 0);
-
- return TotalKeys;
-}
-
-/*
-* Drawing scroll bar
-*/
-#define SCROLLBAR_COLOR1 COLOR16( 0, 2, 8)
-#define SCROLLBAR_COLOR2 COLOR16(15,15,15)
-
-void scrollbar(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey, u32 all, u32 view, u32 now)
-{
- u32 scrollbar_sy;
- u32 scrollbar_ey;
- u32 len;
-
- len = ey - sy - 2;
-
- if ((all != 0) && (all > now))
- scrollbar_sy = (u32)((float)len * (float)now / (float)all) +sy + 1;
- else
- scrollbar_sy = sy + 1;
-
- if ((all > (now + view)) && (all != 0))
- scrollbar_ey = (u32)((float)len * (float)(now + view) / (float)all ) + sy + 1;
- else
- scrollbar_ey = len + sy + 1;
-
- drawbox(screen_addr, sx, sy, ex, ey, COLOR_BLACK);
- drawboxfill(screen_addr, sx + 1, sy + 1, ex - 1, ey - 1, SCROLLBAR_COLOR1);
- drawboxfill(screen_addr, sx + 1, scrollbar_sy, ex - 1, scrollbar_ey, SCROLLBAR_COLOR2);
-}
-
-#if 0
-static struct background back_ground = {{0}, {0}};
-
-int show_background(void *screen, char *bgname)
-{
- int ret;
-
- if(strcasecmp(bgname, back_ground.bgname))
- {
- char *buff, *src;
- int x, y;
- unsigned short *dst;
- unsigned int type;
-
- buff= (char*)malloc(256*192*4);
-
- ret= BMP_read(bgname, buff, 256, 192, &type);
- if(ret != BMP_OK)
- {
- free((intptr_t)buff);
- return(-1);
- }
-
- src = buff;
-
- if(type ==2) //2 bytes per pixel
- {
- unsigned short *pt;
- pt = (unsigned short*)buff;
-// memcpy((char*)back_ground.bgbuffer, buff, 256*192*2);
- dst=(unsigned short*)back_ground.bgbuffer;
- for(y= 0; y< 192; y++)
- {
- for(x= 0; x< 256; x++)
- {
- *dst++= RGB16_15(pt);
- pt += 1;
- }
- }
- }
- else if(type ==3) //3 bytes per pixel
- {
- dst=(unsigned short*)back_ground.bgbuffer;
- for(y= 0; y< 192; y++)
- {
- for(x= 0; x< 256; x++)
- {
- *dst++= RGB24_15(buff);
- buff += 3;
- }
- }
- }
- else
- {
- free((intptr_t)buff);
- return(-1);
- }
-
- free((intptr_t)src);
- strcpy(back_ground.bgname, bgname);
- }
-
- memcpy((char*)screen, back_ground.bgbuffer, 256*192*2);
-
- return 0;
-}
-#endif
-
-/*
-* change GUI icon
-*/
-int gui_change_icon(u32 language_id)
-{
- char path[128];
- char fpath[8];
- u32 i, item;
- int err, ret;
- char *buff, *src;
- u32 x, y;
- char *icondst;
- unsigned int type;
-
- item= sizeof(gui_icon_list)/16;
- buff= (char*)malloc(256*192*4);
- if(buff == NULL)
- return -1;
-
- ret= 0;
- icondst= gui_picture;
-
- sprintf(fpath, "%d.bmp", language_id);
- for(i= 0; i< item; i++)
- {
- sprintf(path, "%s/%s/%s%s", main_path, GUI_SOURCE_PATH, gui_icon_list[i].iconname, fpath);
-
- src= buff;
- err= BMP_read(path, src, gui_icon_list[i].x, gui_icon_list[i].y, &type);
- if(err != BMP_OK)
- {
- sprintf(path, "%s/%s/%s%s", main_path, GUI_SOURCE_PATH, gui_icon_list[i].iconname, ".bmp");
- err= BMP_read(path, src, gui_icon_list[i].x, gui_icon_list[i].y, &type);
- }
-
- if(type < 2) //< 1 byte per pixels, not surpport now
- {
- if(!ret) ret = -(i+1);
- gui_icon_list[i].iconbuff= NULL;
- continue;
- }
-
- if(err == BMP_OK)
- {
- unsigned short *dst;
-
- if(icondst >= gui_picture + GUI_PIC_BUFSIZE -1)
- {
- ret = 1;
- break;
- }
-
- if(type == 2)
- {
- unsigned short *pt;
- pt = (unsigned short*)src;
-// memcpy((char*)icondst, src, 256*192*2);
- dst = (unsigned short*)icondst;
- for(y= 0; y< gui_icon_list[i].y; y++)
- {
- for(x= 0; x < gui_icon_list[i].x; x++)
- {
- *dst++ = RGB16_15(pt);
- pt += 1;
- }
- }
- }
-
- if(type == 3)
- {
- dst = (unsigned short*)icondst;
- for(y= 0; y< gui_icon_list[i].y; y++)
- {
- for(x= 0; x < gui_icon_list[i].x; x++)
- {
- *dst++ = RGB24_15(src);
- src += 3;
- }
- }
- }
-
- gui_icon_list[i].iconbuff= icondst;
- icondst += gui_icon_list[i].x*gui_icon_list[i].y*2;
- }
- else
- {
- if(!ret) ret = -(i+1);
- gui_icon_list[i].iconbuff= NULL;
- }
- }
-
- free((void*)buff);
-//printf("icon_buf: %08x\n", icondst - gui_picture );
- return ret;
-}
-
-/*************************************************************/
-int icon_init(u32 language_id)
-{
- u32 i;
- int ret;
-
-//Initial draw_scroll_string function
- scroll_string_num = 0;
- for(i= 0; i < MAX_SCROLL_STRING; i++)
- {
- scroll_strinfo[i].unicode= NULL;
- scroll_strinfo[i].buff_fonts= NULL;
- scroll_strinfo[i].screenp = NULL;
- scroll_strinfo[i].str_len = 0;
- }
-
- ret= gui_change_icon(language_id);
-
-//#define GUI_INIT_DEBUG
-#if 0
- item= sizeof(gui_icon_list)/12;
- buff= (char*)malloc(256*192*4);
- src= buff;
- ret= 0;
- icondst= gui_picture;
-
- for(i= 0; i< item; i++)
- {
- sprintf(path, "%s\\%s", GUI_SOURCE_PATH, gui_icon_list[i].iconname);
-
- err= BMP_read(path, buff, gui_icon_list[i].x, gui_icon_list[i].y);
- if(err == BMP_OK)
- {
- unsigned short *dst;
-
- if(icondst >= gui_picture + GUI_PIC_BUFSIZE -1)
- {
- ret = 1;
-#ifdef GUI_INIT_DEBUG
- printf("GUI Initial overflow\n");
-#endif
- break;
- }
-
- for(y= 0; y< gui_icon_list[i].y; y++)
- {
- dst= (unsigned short*)(icondst + (gui_icon_list[i].y - y -1)*gui_icon_list[i].x*2);
- for(x= 0; x < gui_icon_list[i].x; x++)
- {
- *dst++ = RGB24_15(buff);
- buff += 4;
- }
- }
-
- gui_icon_list[i].iconname= icondst;
- icondst += gui_icon_list[i].x*gui_icon_list[i].y*2;
- }
- else
- if(!ret)
- {
- ret = -(i+1);
- gui_icon_list[i].iconname= NULL;
-#ifdef GUI_INIT_DEBUG
- printf("GUI Initial: %s not open\n", path);
-#endif
- }
- }
-
-#ifdef GUI_INIT_DEBUG
- printf("GUI buff %d\n", icondst - gui_picture);
-#endif
-
- free((intptr_t)src);
-#endif
-
- return ret;
-}
-
-int color_init()
-{
- char path[MAX_PATH];
- char current_line[256];
- sprintf(path, "%s/%s/%s", main_path, GUI_SOURCE_PATH, "uicolors.txt");
- FILE* fp = fopen(path, "r");
- if (fp != NULL)
- {
- while(fgets(current_line, 256, fp))
- {
- char* colon = strchr(current_line, ':');
- if (colon)
- {
- *colon = '\0';
- u16* color = NULL;
- if (strcasecmp(current_line, "Background") == 0)
- color = &COLOR_BG;
- else if (strcasecmp(current_line, "ActiveItem") == 0)
- color = &COLOR_ACTIVE_ITEM;
- else if (strcasecmp(current_line, "InactiveItem") == 0)
- color = &COLOR_INACTIVE_ITEM;
- else if (strcasecmp(current_line, "MessageText") == 0)
- color = &COLOR_MSSG;
- else if (strcasecmp(current_line, "ActiveMain") == 0)
- color = &COLOR_ACTIVE_MAIN;
- else if (strcasecmp(current_line, "InactiveMain") == 0)
- color = &COLOR_INACTIVE_MAIN;
-
- if (color != NULL)
- {
- char* end = strchr(colon + 1, '\0') - 1;
- while (*end && (*end == '\r' || *end == '\n'))
- *end-- = '\0';
- char* ptr = colon + 1;
- while (*ptr && *ptr == ' ')
- ptr++;
- u32 color32;
- u8 r, g, b;
- if (strlen(ptr) == 7 && *ptr == '#')
- {
- color32 = strtol(ptr + 1, NULL, 16);
- r = (color32 >> 16) & 0xFF;
- g = (color32 >> 8) & 0xFF;
- b = color32 & 0xFF;
- *color = COLOR16(r >> 3, g >> 3, b >> 3);
- }
- }
- }
- }
- fclose(fp);
- return 0;
- }
- else
- return 1;
-}
-
-/*************************************************************/
-void show_icon(void* screen, struct gui_iconlist* icon, u32 x, u32 y)
-{
- u32 i, k;
- unsigned short *src, *dst;
-
- src= (unsigned short*)icon->iconbuff;
- dst = (unsigned short*)screen + y*NDS_SCREEN_WIDTH + x;
- if(NULL == src) return; //The icon may initialized failure
-
- if (icon->x == NDS_SCREEN_WIDTH && icon->y == NDS_SCREEN_HEIGHT && x == 0 && y == 0)
- {
- // Don't support transparency for a background.
- memcpy(dst, src, NDS_SCREEN_WIDTH * NDS_SCREEN_HEIGHT * sizeof(u16));
- }
- else
- {
- for(i= 0; i < icon->y; i++)
- {
- for(k= 0; k < icon->x; k++)
- {
- if(0x03E0 != *src) dst[k]= *src;
- src++;
- }
-
- dst += NDS_SCREEN_WIDTH;
- }
- }
-}
-
-/*************************************************************/
-void show_Vscrollbar(char *screen, u32 x, u32 y, u32 part, u32 total)
-{
-// show_icon((u16*)screen, ICON_VSCROL_UPAROW, x+235, y+55);
-// show_icon((u16*)screen, ICON_VSCROL_DWAROW, x+235, y+167);
-// show_icon((u16*)screen, ICON_VSCROL_SLIDER, x+239, y+64);
-// if(total <= 1)
-// show_icon((u16*)screen, ICON_VSCROL_BAR, x+236, y+64);
-// else
-// show_icon((u16*)screen, ICON_VSCROL_BAR, x+236, y+64+(part*90)/(total-1));
-}
-
-/*
-* display a log
-*/
-void show_log(void* screen_addr)
-{
- char tmp_path[MAX_PATH];
- char *buff;
- int x, y;
- unsigned short *dst;
- unsigned int type;
- int ret;
-
- sprintf(tmp_path, "%s/%s", main_path, BOOTLOGO);
- buff= (char*)malloc(256*192*4);
-
- ret= BMP_read(tmp_path, buff, 256, 192, &type);
- if(ret != BMP_OK)
- {
- free((void*)buff);
- return;
- }
-
- if(type ==2) //2 bytes per pixel
- {
- unsigned short *pt;
- pt = (unsigned short*)buff;
- dst=(unsigned short*)screen_addr;
- for(y= 0; y< 192; y++)
- {
- for(x= 0; x< 256; x++)
- {
- *dst++= RGB16_15(pt);
- pt += 1;
- }
- }
- }
- else if(type ==3) //3 bytes per pixel
- {
- unsigned char *pt;
- pt = (unsigned char*)buff;
- dst=(unsigned short*)screen_addr;
- for(y= 0; y< 192; y++)
- {
- for(x= 0; x< 256; x++)
- {
- *dst++= RGB24_15(pt);
- pt += 3;
- }
- }
- }
-
- free((void*)buff);
-}
-
-/*************************************************************/
-void err_msg(enum SCREEN_ID screen, char *msg)
-{
- // A wild console appeared!
- ConsoleInit(RGB15(31, 31, 31), RGB15(0, 0, 0), UP_SCREEN, 2);
- printf(msg);
-}
-
-/*
-* Copy screen
-*/
-void copy_screen(void* to, void *from, u32 x, u32 y, u32 w, u32 h)
-{
- u32 yy;
- unsigned short *src, *dst;
-
- //not check argument
- src = (unsigned short*)from;
- dst = (unsigned short*)to;
-
- src += y*256+x;
- dst += y*256+x;
- for(yy= 0; yy < h; yy++)
- {
- memcpy((void*)dst, (void*)src, w*2);
- src += 256;
- dst += 256;
- }
-}
-
-/*
-*
-*/
-void blit_to_screen(void* screen_addr, u16 *src, u32 w, u32 h, u32 dest_x, u32 dest_y)
-{
- u32 x, y;
- u16 *dst;
- u16 *screenp;
-
- if(w > NDS_SCREEN_WIDTH) w= NDS_SCREEN_WIDTH;
- if(h > NDS_SCREEN_HEIGHT) h= NDS_SCREEN_HEIGHT;
- if(dest_x == -1) //align center
- dest_x= (NDS_SCREEN_WIDTH - w)/2;
- if(dest_y == -1)
- dest_y= (NDS_SCREEN_HEIGHT - h)/2;
-
- screenp= (unsigned short*)screen_addr -16*256 -8;
- for(y= 0; y < h; y++)
- {
- dst= screenp + (y+dest_y)*256 + dest_x;
- for(x= 0; x < w; x++)
- *dst++ = *src++;
- }
-}