/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2002 by Alan Korr * * 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 "config.h" #include "hwcompat.h" #include "lcd.h" #include "kernel.h" #include "thread.h" #include #include #include "file.h" #include "debug.h" #include "system.h" #include "font-player.h" #include "lcd-playersim.h" /*** definitions ***/ #define CHAR_WIDTH 6 #define CHAR_HEIGHT 8 #define ICON_HEIGHT 24 #define CHAR_PIXEL 4 #define BORDER_MARGIN 2 static int double_height=1; extern bool lcd_display_redraw; extern const unsigned short *lcd_ascii; extern unsigned char hardware_buffer_lcd[11][2]; void lcd_print_icon(int x, int icon_line, bool enable, char **icon) { int xpos = x; int ypos = icon_line*(ICON_HEIGHT+CHAR_HEIGHT*2*4); int row=0, col; int p=0, cp=0; struct coordinate points[LCD_WIDTH * LCD_HEIGHT]; struct coordinate clearpoints[LCD_WIDTH * LCD_HEIGHT]; while (icon[row]) { col=0; while (icon[row][col]) { switch(icon[row][col]) { case '*': if (enable) { /* set a dot */ points[p].x = xpos + col +BORDER_MARGIN; points[p].y = ypos+row +BORDER_MARGIN; p++; /* increase the point counter */ } else { /* clear a dot */ clearpoints[cp].x = xpos + col +BORDER_MARGIN; clearpoints[cp].y = ypos+row +BORDER_MARGIN; cp++; /* increase the point counter */ } break; case ' ': /* Clear bit */ /* clear a dot */ clearpoints[cp].x = xpos + col+BORDER_MARGIN; clearpoints[cp].y = ypos+row+BORDER_MARGIN; cp++; /* increase the point counter */ break; } col++; } row++; } /* DEBUGF("icon draw %d/%d\n", p, cp);*/ if (cp) drawdots(0, &clearpoints[0], cp); if (p) drawdots(1, &points[0], p); } void lcd_print_char(int x, int y) { int xpos = x * CHAR_WIDTH * CHAR_PIXEL; int ypos = y * CHAR_HEIGHT * CHAR_PIXEL + ICON_HEIGHT; int col, row; int p=0, cp=0; struct rectangle points[CHAR_HEIGHT*CHAR_WIDTH]; struct rectangle clearpoints[CHAR_HEIGHT*CHAR_WIDTH]; unsigned char ch=hardware_buffer_lcd[x][y]; static char bitmap_content[11*8][2*8]; if (double_height == 2 && y == 1) return; /* Second row can't be printed in double height. ??*/ for (col=0; col<5; col++) { unsigned char fontbitmap=(*font_player)[ch][col]; for (row=0; row<7; row++) { char fontbit=fontbitmap&(1<