diff options
Diffstat (limited to 'uisimulator/lcd-x11.c')
-rw-r--r-- | uisimulator/lcd-x11.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/uisimulator/lcd-x11.c b/uisimulator/lcd-x11.c index cd2b22b354..9659426f02 100644 --- a/uisimulator/lcd-x11.c +++ b/uisimulator/lcd-x11.c | |||
@@ -42,13 +42,18 @@ extern unsigned char display[LCD_WIDTH][LCD_HEIGHT/8]; | |||
42 | extern void screen_resized(int width, int height); | 42 | extern void screen_resized(int width, int height); |
43 | extern Display *dpy; | 43 | extern Display *dpy; |
44 | 44 | ||
45 | unsigned char display_copy[LCD_WIDTH][LCD_HEIGHT/8]; | ||
46 | |||
45 | void lcd_update (void) | 47 | void lcd_update (void) |
46 | { | 48 | { |
47 | int x, y; | 49 | int x, y; |
48 | int p=0; | 50 | int p=0; |
49 | int bit; | 51 | int bit; |
50 | XPoint points[LCD_WIDTH * LCD_HEIGHT]; | 52 | XPoint points[LCD_WIDTH * LCD_HEIGHT]; |
53 | int cp=0; | ||
54 | XPoint clearpoints[LCD_WIDTH * LCD_HEIGHT]; | ||
51 | 55 | ||
56 | #if 0 | ||
52 | screen_resized(LCD_WIDTH, LCD_HEIGHT); | 57 | screen_resized(LCD_WIDTH, LCD_HEIGHT); |
53 | 58 | ||
54 | for(y=0; y<LCD_HEIGHT; y+=8) { | 59 | for(y=0; y<LCD_HEIGHT; y+=8) { |
@@ -65,7 +70,40 @@ void lcd_update (void) | |||
65 | } | 70 | } |
66 | } | 71 | } |
67 | } | 72 | } |
68 | drawdots(&points[0], p); | 73 | #else |
69 | fprintf(stderr, "lcd_update: Draws %d pixels\n", p); | 74 | for(y=0; y<LCD_HEIGHT; y+=8) { |
75 | for(x=0; x<LCD_WIDTH; x++) { | ||
76 | if(display[x][y/8] || display_copy[x][y/8]) { | ||
77 | /* one or more bits/pixels are changed */ | ||
78 | unsigned char diff = | ||
79 | display[x][y/8] ^ display_copy[x][y/8]; | ||
80 | |||
81 | for(bit=0; bit<8; bit++) { | ||
82 | if(display[x][y/8]&(1<<bit)) { | ||
83 | /* set a dot */ | ||
84 | points[p].x = x + MARGIN_X; | ||
85 | points[p].y = y+bit + MARGIN_Y; | ||
86 | p++; /* increase the point counter */ | ||
87 | } | ||
88 | else if(diff &(1<<bit)) { | ||
89 | /* clear a dot */ | ||
90 | clearpoints[cp].x = x + MARGIN_X; | ||
91 | clearpoints[cp].y = y+bit + MARGIN_Y; | ||
92 | cp++; /* increase the point counter */ | ||
93 | } | ||
94 | } | ||
95 | } | ||
96 | } | ||
97 | } | ||
98 | |||
99 | /* copy a huge block */ | ||
100 | memcpy(display_copy, display, sizeof(display)); | ||
101 | |||
102 | #endif | ||
103 | |||
104 | |||
105 | drawdots(1, &points[0], p); | ||
106 | drawdots(0, &clearpoints[0], cp); | ||
107 | fprintf(stderr, "lcd_update: Draws %d pixels, clears %d pixels\n", p, cp); | ||
70 | XSync(dpy,False); | 108 | XSync(dpy,False); |
71 | } | 109 | } |