Fix hBars drawing into the next character or wrapping at screen end.

This commit is contained in:
mmdolze
2010-12-28 11:08:00 +00:00
parent e86de6ff24
commit 0107040bdf
2 changed files with 18 additions and 7 deletions
+18 -5
View File
@@ -221,7 +221,7 @@ mdm166a_init(Driver *drvthis)
/* Clear internal screen */
mdm166a_clear(drvthis);
report(RPT_DEBUG, "%s: init() done", drvthis->name);
report(RPT_INFO, "%s: init() done", drvthis->name);
return 0;
/* Central error exit point */
@@ -375,13 +375,21 @@ mdm166a_flush(Driver *drvthis)
if (!p->changed)
return;
/* First clear the packed framebuffer area */
memset(p->framebuf + packed_begin, 0, MDM166A_PACKEDSIZE);
/* Convert framebuffer */
/*
* Convert framebuffer by packing pixel values from each column into
* 2 adjacent bytes (= 16 bit) of the packed part of the framebuffer.
*/
/* FIXME: Using the same memory area for framebuffer and packed
* framebuffer is hard to read. Better if two memory areas would be
* used.
*/
for (xpos = 0; xpos < MDM166A_XSIZE; xpos++)
for (ypos = 0; ypos < MDM166A_YSIZE; ypos++)
if (p->framebuf[ypos * MDM166A_XSIZE + xpos])
p->framebuf[packed_begin + 2 * xpos + (ypos / 8)] |= (1 << (7 - (ypos % 8)));
p->framebuf[packed_begin + (2 * xpos) + (ypos / 8)] |= (1 << (7 - (ypos % 8)));
/* Write data to display */
/* Set position (0,0) */
@@ -398,6 +406,7 @@ mdm166a_flush(Driver *drvthis)
Cmd[3] = 48;
for (i = 0; i < 4; i++) {
for (j = 0; j < 24; j++) {
/* Copy two bytes in each step (= 48 bytes) */
Cmd[4 + 2 * j] = p->framebuf[packed_begin + i * 48 + 2 * j];
Cmd[5 + 2 * j] = p->framebuf[packed_begin + i * 48 + 2 * j + 1];
}
@@ -542,10 +551,14 @@ mdm166a_hbar(Driver *drvthis, int x, int y, int len, int promille, int pattern)
return;
}
offset = 2 + x * CELLWIDTH + y * MDM166A_XSIZE * CELLHEIGHT;
/*
* Calculate starting point in framebuffer. Leave the leftmost column
* empty (+1). Shorten the length by 1 then.
*/
offset = x * CELLWIDTH + y * MDM166A_XSIZE * CELLHEIGHT + 1;
/* calculate length of bar */
pixels = len * CELLWIDTH * promille / 1000;
pixels = len * CELLWIDTH * promille / 1000 - 1;
for (i = 0; i < CELLHEIGHT - 1; i++) {
for (j = 0; j < pixels; j++) {
-2
View File
@@ -1,8 +1,6 @@
#ifndef MDM166A_H
#define MDM166A_H
#include "lcd.h"
MODULE_EXPORT int mdm166a_init (Driver *drvthis);
MODULE_EXPORT void mdm166a_close (Driver *drvthis);
MODULE_EXPORT int mdm166a_width (Driver *drvthis);