lcd_update() works for X11 now...

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Daniel Stenberg 2002-03-26 10:59:39 +00:00
parent d20e6eee0e
commit 319d1f3406
6 changed files with 189 additions and 57 deletions

View File

@ -29,7 +29,7 @@ LDFLAGS = -lX11 -lm -lXt -lXmu -lsocket -lnsl
DEPEND = .depends DEPEND = .depends
OBJS= alpha.o hsv.o screenhack.o yarandom.o uibasic.o resources.o visual.o\ OBJS= alpha.o hsv.o screenhack.o yarandom.o uibasic.o resources.o visual.o\
usleep.o usleep.o lcd.c lcd-x11.c
SRCS = $(OBJS:%.o=%.c) SRCS = $(OBJS:%.o=%.c)
HDRS = $(OBJS:%.o=%.h) HDRS = $(OBJS:%.o=%.h)

View File

@ -79,6 +79,7 @@ void lcd_update (void)
} }
} }
#if 0
/* /*
* Display a string at current position * Display a string at current position
*/ */
@ -107,42 +108,8 @@ void lcd_string (const char *text, BOOL invert)
} }
} }
} }
#endif
/*
* Display a character.
* This writes a 5x8 character within a 6x8 cell.
* The cell does not have to be aligned to a display byte.
* The top left of the cell is displayed at the current position.
* invert is TRUE to display in reverse video.
*/
void lcd_char (int ch, BOOL invert)
{
uchar (*dp)[DISP_X] = (void *) &display[lcd_y/8][lcd_x];
uint32 shift, mask, col;
/* Limit to char generation table */
if (ch < ASCII_MIN || ch > ASCII_MAX)
ch = ASCII_MAX;
/* Calculate shift and masks for cell bit position */
shift = (lcd_y & 0x7);
mask = ~(COL_MASK << shift);
if (invert)
invert = ~mask;
/* Write each char column */
for (col = 0; col < CHAR_X-1; col++) {
uint32 data = (char_gen[ch-ASCII_MIN][col] << shift) ^ invert;
dp[0][col] = (dp[0][col] & mask) | data;
if (lcd_y < DISP_Y-8)
dp[1][col] = (dp[1][col] & (mask >> 8)) | (data >> 8);
}
/* Column after char */
dp[0][CHAR_X-1] = (dp[0][CHAR_X-1] & mask) | invert;
if (lcd_y < DISP_Y-8)
dp[1][CHAR_X-1] = (dp[1][CHAR_X-1] & (mask >> 8)) | (invert >> 8);
}
/* /*
* Write a byte to LCD controller. * Write a byte to LCD controller.

View File

@ -17,7 +17,50 @@
* *
****************************************************************************/ ****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>
#include "screenhack.h"
/* /*
* Specific implementations for X11, using the generic LCD functions and data. * Specific implementations for X11, using the generic LCD API and data.
*/ */
#include "lcd.h"
extern unsigned char display[LCD_WIDTH/8][LCD_HEIGHT];
void lcd_update (void)
{
int x, y;
int p=0;
int bit;
XPoint points[LCD_WIDTH * LCD_HEIGHT];
for(y=0; y<LCD_HEIGHT; y+=8) {
for(x=0; x<LCD_WIDTH; x++) {
if(display[y/8][x]) {
/* one or more bits/pixels are set */
for(bit=0; bit<8; bit++) {
if(display[y/8][x]&(1<<bit)) {
points[p].x = x;
points[p].y = y+bit;
p++; /* increase the point counter */
}
}
}
}
}
drawdots(&points[0], p);
}

View File

@ -21,8 +21,10 @@
* This file is meant for generic LCD defines and global variables etc. * This file is meant for generic LCD defines and global variables etc.
*/ */
#define DISP_X 112 /* Display width in pixels */ #include "lcd.h"
#define DISP_Y 64 /* Display height in pixels */
#define DISP_X LCD_WIDTH /* Display width in pixels */
#define DISP_Y LCD_HEIGHT /* Display height in pixels */
#define CHAR_X 6 /* Character width in pixels */ #define CHAR_X 6 /* Character width in pixels */
#define CHAR_Y 8 /* Character height in pixels */ #define CHAR_Y 8 /* Character height in pixels */
@ -38,7 +40,7 @@
#define ASCII_MIN 0x20 /* First char in table */ #define ASCII_MIN 0x20 /* First char in table */
#define ASCII_MAX 0x7f /* Last char in table */ #define ASCII_MAX 0x7f /* Last char in table */
static const uchar char_gen[ASCII_MAX-ASCII_MIN+1][CHAR_X-1] = static const unsigned char char_gen[ASCII_MAX-ASCII_MIN+1][CHAR_X-1] =
{ {
0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x2f */
0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00,
@ -150,30 +152,93 @@ static const uchar char_gen[ASCII_MAX-ASCII_MIN+1][CHAR_X-1] =
* Bits within a byte are arranged veritcally, LSB at top. * Bits within a byte are arranged veritcally, LSB at top.
* Byte 0 is top left, byte 1 is 2nd left, byte DISP_X starts 2nd row. * Byte 0 is top left, byte 1 is 2nd left, byte DISP_X starts 2nd row.
*/ */
static uchar display[DISP_Y/8][DISP_X]; unsigned char display[LCD_HEIGHT/8][LCD_WIDTH];
static uint16 lcd_y; /* Current pixel row */ static unsigned char lcd_y; /* Current pixel row */
static uint16 lcd_x; /* Current pixel column */ static unsigned char lcd_x; /* Current pixel column */
/* /*
* Set current x,y position * Set current x,y position
*/ */
void lcd_position (int x, int y) void lcd_position(int x, int y)
{ {
if (x >= 0 && x < DISP_X && y >= 0 && y < DISP_Y) if (x >= 0 && x < DISP_X && y >= 0 && y < DISP_Y) {
{ lcd_x = x;
lcd_x = x; lcd_y = y;
lcd_y = y; }
}
} }
/* /*
* Clear the display * Clear the display
*/ */
void lcd_clear (void) void lcd_clear(void)
{ {
lcd_x = 0; lcd_x = 0;
lcd_y = 0; lcd_y = 0;
memset (display, 0, sizeof display); memset (display, 0, sizeof display);
} }
/*
* Display a character at current position.
* This writes a 5x8 character within a 6x8 cell.
* The cell does not have to be aligned to a display byte.
* The top left of the cell is displayed at the current position.
* invert is TRUE to display in reverse video.
*/
void lcd_char (int ch, char invert)
{
unsigned char (*dp)[DISP_X] = (void *) &display[lcd_y/8][lcd_x];
unsigned long shift, mask, col;
/* Limit to char generation table */
if (ch < ASCII_MIN || ch > ASCII_MAX)
ch = ASCII_MAX;
/* Calculate shift and masks for cell bit position */
shift = (lcd_y & 0x7);
mask = ~(COL_MASK << shift);
if (invert)
invert = ~mask;
/* Write each char column */
for (col = 0; col < CHAR_X-1; col++) {
unsigned long data = (char_gen[ch-ASCII_MIN][col] << shift) ^ invert;
dp[0][col] = (dp[0][col] & mask) | data;
if (lcd_y < DISP_Y-8)
dp[1][col] = (dp[1][col] & (mask >> 8)) | (data >> 8);
}
/* Column after char */
dp[0][CHAR_X-1] = (dp[0][CHAR_X-1] & mask) | invert;
if (lcd_y < DISP_Y-8)
dp[1][CHAR_X-1] = (dp[1][CHAR_X-1] & (mask >> 8)) | (invert >> 8);
}
/*
* Output a string at current position
*/
void lcd_string(const char *text, char invert)
{
int ch;
while ((ch = *text++) != '\0') {
if (lcd_y > DISP_Y-CHAR_Y) {
/* Scroll (8 pixels) */
memcpy (display[0], display[1], DISP_X*(DISP_Y/8-1));
lcd_y -= 8;
}
if (ch == '\n')
lcd_x = DISP_X;
else {
lcd_char (ch, invert);
lcd_x += CHAR_X;
}
if (lcd_x > DISP_X-CHAR_X) {
/* Wrap to next line */
lcd_x = 0;
lcd_y += CHAR_Y;
}
}
}

26
uisimulator/lcd.h Normal file
View File

@ -0,0 +1,26 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
*
* 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.
*
****************************************************************************/
/*
* This file is meant for generic LCD defines
*/
#define LCD_WIDTH 112 /* Display width in pixels */
#define LCD_HEIGHT 64 /* Display height in pixels */

View File

@ -41,7 +41,7 @@
/* -- -- */ /* -- -- */
static GC draw_gc, erase_gc; GC draw_gc, erase_gc;
static Colormap cmap; static Colormap cmap;
static XColor color_track, color_car; static XColor color_track, color_car;
@ -163,6 +163,27 @@ void drawline(int color, int x1, int y1, int x2, int y2)
(int)(y2*track_zoom)); (int)(y2*track_zoom));
} }
void drawdot(int color, int x, int y)
{
if (color==0) {
XSetForeground(dpy, draw_gc,
get_pixel_resource("background", "Background", dpy, cmap));
}
else
XSetForeground(dpy, draw_gc,
get_pixel_resource("foreground", "Foreground", dpy, cmap));
XDrawPoint(dpy, window, draw_gc, x, y);
}
void drawdots(XPoint *points, int count)
{
XSetForeground(dpy, draw_gc,
get_pixel_resource("foreground", "Foreground", dpy, cmap));
XDrawPoints(dpy, window, draw_gc, points, count, CoordModeOrigin);
}
void drawtext(int color, int x, int y, char *text) void drawtext(int color, int x, int y, char *text)
{ {
if (color==0) { if (color==0) {
@ -199,11 +220,10 @@ screenhack (Display *the_dpy, Window the_window)
init_window(); init_window();
drawtext(1, 20, 20, PROGNAME);
drawline(1, 0, 0, 40, 50);
Logf("Rockbox will kill ya!"); Logf("Rockbox will kill ya!");
lcd_string( PROGNAME, 0);
while (1) { while (1) {
/* deal with input here */ /* deal with input here */
@ -214,7 +234,18 @@ screenhack (Display *the_dpy, Window the_window)
void screen_redraw() void screen_redraw()
{ {
/* does nothing yet */ int y, x;
drawtext(1, 20, 20, PROGNAME);
drawline(1, 0, 0, 40, 50); lcd_update();
#if 0
/* does nothing "real" yet */
/* drawtext(1, 20, 20, PROGNAME);*/
for(y=0; y< 112; y++)
for(x=0; x<64; x++)
drawdot(1, x+16, y+16);
/* drawline(1, 0, 0, 40, 50); */
#endif
} }