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:
parent
d20e6eee0e
commit
319d1f3406
6 changed files with 189 additions and 57 deletions
|
@ -29,7 +29,7 @@ LDFLAGS = -lX11 -lm -lXt -lXmu -lsocket -lnsl
|
|||
DEPEND = .depends
|
||||
|
||||
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)
|
||||
HDRS = $(OBJS:%.o=%.h)
|
||||
|
|
|
@ -79,6 +79,7 @@ void lcd_update (void)
|
|||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* 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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -21,8 +21,10 @@
|
|||
* This file is meant for generic LCD defines and global variables etc.
|
||||
*/
|
||||
|
||||
#define DISP_X 112 /* Display width in pixels */
|
||||
#define DISP_Y 64 /* Display height in pixels */
|
||||
#include "lcd.h"
|
||||
|
||||
#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_Y 8 /* Character height in pixels */
|
||||
|
@ -38,7 +40,7 @@
|
|||
#define ASCII_MIN 0x20 /* First 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, 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.
|
||||
* 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 uint16 lcd_x; /* Current pixel column */
|
||||
static unsigned char lcd_y; /* Current pixel row */
|
||||
static unsigned char lcd_x; /* Current pixel column */
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
lcd_x = x;
|
||||
lcd_y = y;
|
||||
}
|
||||
if (x >= 0 && x < DISP_X && y >= 0 && y < DISP_Y) {
|
||||
lcd_x = x;
|
||||
lcd_y = y;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear the display
|
||||
*/
|
||||
void lcd_clear (void)
|
||||
void lcd_clear(void)
|
||||
{
|
||||
lcd_x = 0;
|
||||
lcd_y = 0;
|
||||
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
26
uisimulator/lcd.h
Normal 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 */
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
/* -- -- */
|
||||
|
||||
static GC draw_gc, erase_gc;
|
||||
GC draw_gc, erase_gc;
|
||||
static Colormap cmap;
|
||||
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));
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (color==0) {
|
||||
|
@ -199,11 +220,10 @@ screenhack (Display *the_dpy, Window the_window)
|
|||
|
||||
init_window();
|
||||
|
||||
drawtext(1, 20, 20, PROGNAME);
|
||||
drawline(1, 0, 0, 40, 50);
|
||||
|
||||
Logf("Rockbox will kill ya!");
|
||||
|
||||
lcd_string( PROGNAME, 0);
|
||||
|
||||
while (1) {
|
||||
/* deal with input here */
|
||||
|
||||
|
@ -214,7 +234,18 @@ screenhack (Display *the_dpy, Window the_window)
|
|||
|
||||
void screen_redraw()
|
||||
{
|
||||
/* does nothing yet */
|
||||
drawtext(1, 20, 20, PROGNAME);
|
||||
drawline(1, 0, 0, 40, 50);
|
||||
int y, x;
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue