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
|
@ -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)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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 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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue