summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/cube.c2
-rw-r--r--apps/plugins/doom/i_video.c8
-rw-r--r--apps/plugins/fire.c2
-rw-r--r--apps/plugins/grayscale.c2
-rw-r--r--apps/plugins/jpeg.c2
-rw-r--r--apps/plugins/lib/gray.h10
-rw-r--r--apps/plugins/lib/gray_core.c216
-rw-r--r--apps/plugins/lib/gray_draw.c37
-rw-r--r--apps/plugins/lib/gray_parm.c16
-rw-r--r--apps/plugins/mandelbrot.c2
-rw-r--r--apps/plugins/plasma.c2
11 files changed, 251 insertions, 48 deletions
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c
index c7f7b63243..3e7e7f1ce2 100644
--- a/apps/plugins/cube.c
+++ b/apps/plugins/cube.c
@@ -534,7 +534,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
534 xlcd_init(rb); 534 xlcd_init(rb);
535#elif defined(USE_GSLIB) 535#elif defined(USE_GSLIB)
536 gbuf = (unsigned char *)rb->plugin_get_buffer(&gbuf_size); 536 gbuf = (unsigned char *)rb->plugin_get_buffer(&gbuf_size);
537 if (gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, LCD_HEIGHT/8, 3, NULL) 537 if (gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, LCD_HEIGHT/8, 3, 0, NULL)
538 != 3) 538 != 3)
539 { 539 {
540 rb->splash(HZ, true, "Couldn't get grayscale buffer"); 540 rb->splash(HZ, true, "Couldn't get grayscale buffer");
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c
index 42e1c2610b..f90f7cd82f 100644
--- a/apps/plugins/doom/i_video.c
+++ b/apps/plugins/doom/i_video.c
@@ -16,7 +16,10 @@
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * $Log$ 18 * $Log$
19 * Revision 1.17 2006/04/22 03:48:15 kkurbjun 19 * Revision 1.18 2006/08/02 00:21:59 amiconn
20 * Grayscale library: LCD linearisation and gamma correction.
21 *
22 * Revision 1.17 2006-04-22 03:48:15 kkurbjun
20 * Better video update, add options to startup menu, change default screensize 23 * Better video update, add options to startup menu, change default screensize
21 * 24 *
22 * Revision 1.16 2006-04-20 19:39:56 kkurbjun 25 * Revision 1.16 2006-04-20 19:39:56 kkurbjun
@@ -484,7 +487,8 @@ void I_InitGraphics(void)
484 487
485#ifndef HAVE_LCD_COLOR 488#ifndef HAVE_LCD_COLOR
486 gbuf=malloc(GRAYBUFSIZE); 489 gbuf=malloc(GRAYBUFSIZE);
487 gray_init(rb, gbuf, GRAYBUFSIZE, false, LCD_WIDTH, LCD_HEIGHT/8, 32, NULL); 490 gray_init(rb, gbuf, GRAYBUFSIZE, false, LCD_WIDTH, LCD_HEIGHT/8, 32,
491 3<<7 /* 1.5 */, NULL);
488 /* switch on grayscale overlay */ 492 /* switch on grayscale overlay */
489 gray_show(true); 493 gray_show(true);
490#endif 494#endif
diff --git a/apps/plugins/fire.c b/apps/plugins/fire.c
index 7e0c3ba4f5..6207a8894e 100644
--- a/apps/plugins/fire.c
+++ b/apps/plugins/fire.c
@@ -332,7 +332,7 @@ int main(void)
332 shades = 256; 332 shades = 256;
333#else 333#else
334 shades = gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8, 334 shades = gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8,
335 32, NULL) + 1; 335 32, 2<<8, NULL) + 1;
336 if(shades <= 1) 336 if(shades <= 1)
337 { 337 {
338 rb->splash(HZ, true, "not enough memory"); 338 rb->splash(HZ, true, "not enough memory");
diff --git a/apps/plugins/grayscale.c b/apps/plugins/grayscale.c
index 162f8d7b21..ad3ee4f144 100644
--- a/apps/plugins/grayscale.c
+++ b/apps/plugins/grayscale.c
@@ -183,7 +183,7 @@ int main(void)
183 H1x0: 160 pixels wide, 30 rows (120 pixels) high, (try to) reserve 183 H1x0: 160 pixels wide, 30 rows (120 pixels) high, (try to) reserve
184 32 bitplanes for 33 shades of grey. */ 184 32 bitplanes for 33 shades of grey. */
185 shades = gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, GFX_HEIGHT/8, 185 shades = gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, GFX_HEIGHT/8,
186 32, NULL) + 1; 186 32, 0, NULL) + 1;
187 187
188 /* place greyscale overlay 1 row down */ 188 /* place greyscale overlay 1 row down */
189 gray_set_position(0, 1); 189 gray_set_position(0, 1);
diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c
index 890ee8e252..5166f4ef5e 100644
--- a/apps/plugins/jpeg.c
+++ b/apps/plugins/jpeg.c
@@ -2771,7 +2771,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2771#ifdef USEGSLIB 2771#ifdef USEGSLIB
2772 /* initialize the grayscale buffer: 32 bitplanes for 33 shades of gray. */ 2772 /* initialize the grayscale buffer: 32 bitplanes for 33 shades of gray. */
2773 grayscales = gray_init(rb, buf, buf_size, false, LCD_WIDTH, LCD_HEIGHT/8, 2773 grayscales = gray_init(rb, buf, buf_size, false, LCD_WIDTH, LCD_HEIGHT/8,
2774 32, &graysize) + 1; 2774 32, 2<<8, &graysize) + 1;
2775 buf += graysize; 2775 buf += graysize;
2776 buf_size -= graysize; 2776 buf_size -= graysize;
2777 if (grayscales < 33 || buf_size <= 0) 2777 if (grayscales < 33 || buf_size <= 0)
diff --git a/apps/plugins/lib/gray.h b/apps/plugins/lib/gray.h
index 96dec346cf..398462fd81 100644
--- a/apps/plugins/lib/gray.h
+++ b/apps/plugins/lib/gray.h
@@ -38,7 +38,8 @@
38 38
39/* Library initialisation and release */ 39/* Library initialisation and release */
40int gray_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, 40int gray_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size,
41 bool buffered, int width, int bheight, int depth, long *buf_taken); 41 bool buffered, int width, int bheight, int depth, int gamma,
42 long *buf_taken);
42void gray_release(void); 43void gray_release(void);
43 44
44/* Special functions */ 45/* Special functions */
@@ -138,9 +139,12 @@ struct _gray_info
138#endif 139#endif
139 unsigned char *cur_buffer; /* start of current chunky pixel buffer */ 140 unsigned char *cur_buffer; /* start of current chunky pixel buffer */
140 unsigned char *back_buffer;/* start of chunky pixel back buffer */ 141 unsigned char *back_buffer;/* start of chunky pixel back buffer */
142 unsigned char idxtable[256]; /* calculated brightness -> index translation table */
143 int fg_index; /* current foreground index */
144 int bg_index; /* current background index */
145 int fg_brightness; /* current foreground brightness, for returning */
146 int bg_brightness; /* current background brightness, for returning */
141 int drawmode; /* current draw mode */ 147 int drawmode; /* current draw mode */
142 int fg_brightness; /* current foreground brightness */
143 int bg_brightness; /* current background brightness */
144 int curfont; /* current selected font */ 148 int curfont; /* current selected font */
145}; 149};
146 150
diff --git a/apps/plugins/lib/gray_core.c b/apps/plugins/lib/gray_core.c
index 6cc33e05da..ef41e7e215 100644
--- a/apps/plugins/lib/gray_core.c
+++ b/apps/plugins/lib/gray_core.c
@@ -33,7 +33,117 @@ struct plugin_api *_gray_rb = NULL; /* global api struct pointer */
33struct _gray_info _gray_info; /* global info structure */ 33struct _gray_info _gray_info; /* global info structure */
34#ifndef SIMULATOR 34#ifndef SIMULATOR
35short _gray_random_buffer; /* buffer for random number generator */ 35short _gray_random_buffer; /* buffer for random number generator */
36
37#if CONFIG_LCD == LCD_SSD1815
38/* measured and interpolated curve */
39static const unsigned char lcdlinear[256] = {
40 0, 3, 5, 8, 11, 13, 16, 18,
41 21, 23, 26, 28, 31, 33, 36, 38,
42 40, 42, 45, 47, 49, 51, 53, 55,
43 57, 59, 60, 62, 64, 66, 67, 69,
44 70, 72, 73, 74, 76, 77, 78, 79,
45 81, 82, 83, 84, 85, 86, 87, 88,
46 88, 89, 90, 91, 92, 92, 93, 94,
47 95, 95, 96, 97, 97, 98, 99, 99,
48 100, 101, 102, 102, 103, 104, 104, 105,
49 106, 106, 107, 107, 108, 109, 109, 110,
50 111, 111, 112, 113, 113, 114, 114, 115,
51 116, 116, 117, 117, 118, 119, 119, 120,
52 120, 121, 121, 122, 122, 123, 123, 124,
53 124, 125, 125, 126, 126, 127, 127, 128,
54 128, 128, 129, 129, 130, 130, 131, 131,
55 132, 132, 133, 133, 133, 134, 134, 135,
56 135, 136, 136, 137, 137, 138, 138, 138,
57 139, 139, 140, 140, 141, 141, 142, 142,
58 143, 143, 144, 144, 145, 145, 146, 146,
59 147, 147, 148, 148, 148, 149, 149, 150,
60 150, 151, 151, 152, 152, 153, 153, 153,
61 154, 154, 155, 155, 156, 156, 157, 157,
62 158, 158, 158, 159, 159, 160, 160, 161,
63 161, 162, 162, 163, 163, 164, 164, 165,
64 165, 166, 167, 167, 168, 168, 169, 169,
65 170, 171, 171, 172, 173, 173, 174, 175,
66 176, 176, 177, 178, 179, 180, 181, 181,
67 182, 183, 184, 185, 186, 188, 189, 190,
68 191, 192, 194, 195, 196, 198, 199, 201,
69 202, 204, 205, 207, 209, 211, 213, 215,
70 217, 219, 222, 224, 226, 229, 231, 234,
71 236, 239, 242, 244, 247, 250, 252, 255
72};
73#elif CONFIG_LCD == LCD_S1D15E06
74/* measured and interpolated curve */
75static const unsigned char lcdlinear[256] = {
76 0, 5, 11, 16, 21, 27, 32, 37,
77 42, 47, 51, 56, 60, 64, 68, 72,
78 75, 78, 81, 84, 87, 89, 91, 93,
79 95, 96, 98, 99, 101, 102, 103, 104,
80 105, 106, 107, 108, 109, 110, 111, 111,
81 112, 113, 113, 114, 115, 115, 116, 117,
82 117, 118, 118, 119, 119, 120, 120, 121,
83 121, 122, 122, 123, 123, 124, 124, 125,
84 125, 126, 126, 127, 127, 127, 128, 128,
85 129, 129, 130, 130, 131, 131, 132, 132,
86 133, 133, 134, 134, 135, 135, 136, 136,
87 137, 137, 138, 138, 138, 139, 139, 140,
88 140, 141, 141, 141, 142, 142, 143, 143,
89 143, 144, 144, 145, 145, 145, 146, 146,
90 146, 147, 147, 147, 148, 148, 149, 149,
91 149, 150, 150, 150, 151, 151, 151, 152,
92 152, 153, 153, 153, 154, 154, 155, 155,
93 155, 156, 156, 157, 157, 157, 158, 158,
94 159, 159, 159, 160, 160, 161, 161, 162,
95 162, 162, 163, 163, 164, 164, 164, 165,
96 165, 166, 166, 167, 167, 167, 168, 168,
97 169, 169, 170, 170, 170, 171, 171, 172,
98 172, 173, 173, 174, 174, 175, 175, 176,
99 176, 177, 177, 178, 178, 179, 179, 180,
100 180, 181, 182, 182, 183, 184, 184, 185,
101 186, 186, 187, 188, 188, 189, 190, 191,
102 191, 192, 193, 194, 195, 196, 196, 197,
103 198, 199, 200, 201, 202, 203, 204, 205,
104 206, 207, 208, 209, 210, 211, 213, 214,
105 215, 216, 218, 219, 220, 222, 223, 225,
106 227, 228, 230, 232, 233, 235, 237, 239,
107 241, 243, 245, 247, 249, 251, 253, 255
108};
36#endif 109#endif
110#else /* SIMULATOR */
111/* undo a (generic) PC display gamma of 2.0 to simulate target behaviour */
112static const unsigned char lcdlinear[256] = {
113 0, 16, 23, 28, 32, 36, 39, 42,
114 45, 48, 50, 53, 55, 58, 60, 62,
115 64, 66, 68, 70, 71, 73, 75, 77,
116 78, 80, 81, 83, 84, 86, 87, 89,
117 90, 92, 93, 94, 96, 97, 98, 100,
118 101, 102, 103, 105, 106, 107, 108, 109,
119 111, 112, 113, 114, 115, 116, 117, 118,
120 119, 121, 122, 123, 124, 125, 126, 127,
121 128, 129, 130, 131, 132, 133, 134, 135,
122 135, 136, 137, 138, 139, 140, 141, 142,
123 143, 144, 145, 145, 146, 147, 148, 149,
124 150, 151, 151, 152, 153, 154, 155, 156,
125 156, 157, 158, 159, 160, 160, 161, 162,
126 163, 164, 164, 165, 166, 167, 167, 168,
127 169, 170, 170, 171, 172, 173, 173, 174,
128 175, 176, 176, 177, 178, 179, 179, 180,
129 181, 181, 182, 183, 183, 184, 185, 186,
130 186, 187, 188, 188, 189, 190, 190, 191,
131 192, 192, 193, 194, 194, 195, 196, 196,
132 197, 198, 198, 199, 199, 200, 201, 201,
133 202, 203, 203, 204, 204, 205, 206, 206,
134 207, 208, 208, 209, 209, 210, 211, 211,
135 212, 212, 213, 214, 214, 215, 215, 216,
136 217, 217, 218, 218, 219, 220, 220, 221,
137 221, 222, 222, 223, 224, 224, 225, 225,
138 226, 226, 227, 228, 228, 229, 229, 230,
139 230, 231, 231, 232, 233, 233, 234, 234,
140 235, 235, 236, 236, 237, 237, 238, 238,
141 239, 240, 240, 241, 241, 242, 242, 243,
142 243, 244, 244, 245, 245, 246, 246, 247,
143 247, 248, 248, 249, 249, 250, 250, 251,
144 251, 252, 252, 253, 253, 254, 254, 255
145};
146#endif /* SIMULATOR */
37 147
38/* Prototypes */ 148/* Prototypes */
39static inline void _deferred_update(void) __attribute__ ((always_inline)); 149static inline void _deferred_update(void) __attribute__ ((always_inline));
@@ -84,6 +194,75 @@ static void _timer_isr(void)
84} 194}
85#endif /* !SIMULATOR */ 195#endif /* !SIMULATOR */
86 196
197/* fixed point exp() */
198static int exp_s16p16(int x)
199{
200 int t;
201 int y = 0x00010000;
202
203 if (x == 0)
204 {
205 return y;
206 }
207 else if (x > 0)
208 {
209 t = x - 0x58b91; if (t >= 0) x = t, y <<= 8;
210 t = x - 0x2c5c8; if (t >= 0) x = t, y <<= 4;
211 t = x - 0x162e4; if (t >= 0) x = t, y <<= 2;
212 t = x - 0x0b172; if (t >= 0) x = t, y <<= 1;
213 }
214 else
215 {
216 t = x + 0x58b91; if (t < 0) x = t, y >>= 8;
217 t = x + 0x2c5c8; if (t < 0) x = t, y >>= 4;
218 t = x + 0x162e4; if (t < 0) x = t, y >>= 2;
219 t = x + 0x0b172; if (t < 0) x = t, y >>= 1;
220 x += 0x0b172; y >>= 1;
221 }
222 t = x - 0x067cd; if (t >= 0) x = t, y += y >> 1;
223 t = x - 0x03920; if (t >= 0) x = t, y += y >> 2;
224 t = x - 0x01e27; if (t >= 0) x = t, y += y >> 3;
225 t = x - 0x00f85; if (t >= 0) x = t, y += y >> 4;
226 t = x - 0x007e1; if (t >= 0) x = t, y += y >> 5;
227 t = x - 0x003f8; if (t >= 0) x = t, y += y >> 6;
228 t = x - 0x001fe; if (t >= 0) x = t, y += y >> 7;
229 if (x & 0x100) y += y >> 8;
230 if (x & 0x080) y += y >> 9;
231 if (x & 0x040) y += y >> 10;
232 if (x & 0x020) y += y >> 11;
233 if (x & 0x010) y += y >> 12;
234 if (x & 0x008) y += y >> 13;
235 if (x & 0x004) y += y >> 14;
236 if (x & 0x002) y += y >> 15;
237 if (x & 0x001) y += y >> 16;
238
239 return y;
240}
241
242/* fixed point log() */
243int log_s16p16(int x)
244{
245 int t;
246 int y = 0xa65af;
247
248 if (x < 0x00008000) x <<=16, y -= 0xb1721;
249 if (x < 0x00800000) x <<= 8, y -= 0x58b91;
250 if (x < 0x08000000) x <<= 4, y -= 0x2c5c8;
251 if (x < 0x20000000) x <<= 2, y -= 0x162e4;
252 if (x < 0x40000000) x <<= 1, y -= 0x0b172;
253 t = x + (x >> 1); if ((t & 0x80000000) == 0) x = t, y -= 0x067cd;
254 t = x + (x >> 2); if ((t & 0x80000000) == 0) x = t, y -= 0x03920;
255 t = x + (x >> 3); if ((t & 0x80000000) == 0) x = t, y -= 0x01e27;
256 t = x + (x >> 4); if ((t & 0x80000000) == 0) x = t, y -= 0x00f85;
257 t = x + (x >> 5); if ((t & 0x80000000) == 0) x = t, y -= 0x007e1;
258 t = x + (x >> 6); if ((t & 0x80000000) == 0) x = t, y -= 0x003f8;
259 t = x + (x >> 7); if ((t & 0x80000000) == 0) x = t, y -= 0x001fe;
260 x = 0x80000000 - x;
261 y -= x >> 15;
262
263 return y;
264}
265
87/* Initialise the framework and prepare the greyscale display buffer 266/* Initialise the framework and prepare the greyscale display buffer
88 267
89 arguments: 268 arguments:
@@ -97,6 +276,8 @@ static void _timer_isr(void)
97 width = width in pixels (1..LCD_WIDTH) 276 width = width in pixels (1..LCD_WIDTH)
98 bheight = height in LCD pixel-block units (8 pixels) (1..LCD_HEIGHT/8) 277 bheight = height in LCD pixel-block units (8 pixels) (1..LCD_HEIGHT/8)
99 depth = number of bitplanes to use (1..32). 278 depth = number of bitplanes to use (1..32).
279 gamma = gamma value as s8p8 fixed point. gamma <= 0 means no
280 correction at all, i.e. no LCD linearisation as well.
100 281
101 result: 282 result:
102 = depth if there was enough memory 283 = depth if there was enough memory
@@ -128,12 +309,14 @@ static void _timer_isr(void)
128 one situation where it will consume more memory on the sim than on the 309 one situation where it will consume more memory on the sim than on the
129 target: if you're allocating a low depth (< 8) without buffering. */ 310 target: if you're allocating a low depth (< 8) without buffering. */
130int gray_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, 311int gray_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size,
131 bool buffered, int width, int bheight, int depth, long *buf_taken) 312 bool buffered, int width, int bheight, int depth, int gamma,
313 long *buf_taken)
132{ 314{
133 int possible_depth; 315 int possible_depth, i;
134 long plane_size, buftaken; 316 long plane_size, buftaken;
317 unsigned data;
135#ifndef SIMULATOR 318#ifndef SIMULATOR
136 int i, j; 319 int j;
137#endif 320#endif
138 321
139 _gray_rb = newrb; 322 _gray_rb = newrb;
@@ -240,8 +423,33 @@ int gray_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size,
240 } 423 }
241#endif 424#endif
242 425
426 /* precalculate the value -> pattern index conversion table, taking
427 linearisation and gamma correction into account */
428 if (gamma <= 0)
429 {
430 for (i = 0; i < 256; i++)
431 {
432 data = MULU16(depth, lcdlinear[i]) + 127;
433 _gray_info.idxtable[i] = (data + (data >> 8)) >> 8;
434 /* approx. data / 255 */
435 }
436 }
437 else
438 {
439 for (i = 0; i < 256; i++)
440 {
441 data = exp_s16p16(gamma * (log_s16p16(i * 257 + 1) >> 8));
442 data = (data - (data >> 8)) >> 8; /* approx. data /= 257 */
443 data = MULU16(depth, lcdlinear[data]) + 127;
444 _gray_info.idxtable[i] = (data + (data >> 8)) >> 8;
445 /* approx. data / 255 */
446 }
447 }
448
449 _gray_info.fg_index = 0;
450 _gray_info.bg_index = depth;
243 _gray_info.fg_brightness = 0; 451 _gray_info.fg_brightness = 0;
244 _gray_info.bg_brightness = depth; 452 _gray_info.bg_brightness = 255;
245 _gray_info.drawmode = DRMODE_SOLID; 453 _gray_info.drawmode = DRMODE_SOLID;
246 _gray_info.curfont = FONT_SYSFIXED; 454 _gray_info.curfont = FONT_SYSFIXED;
247 455
diff --git a/apps/plugins/lib/gray_draw.c b/apps/plugins/lib/gray_draw.c
index 6779b6eeb5..7e1197bd4b 100644
--- a/apps/plugins/lib/gray_draw.c
+++ b/apps/plugins/lib/gray_draw.c
@@ -32,12 +32,12 @@
32 32
33static void setpixel(unsigned char *address) 33static void setpixel(unsigned char *address)
34{ 34{
35 *address = _gray_info.fg_brightness; 35 *address = _gray_info.fg_index;
36} 36}
37 37
38static void clearpixel(unsigned char *address) 38static void clearpixel(unsigned char *address)
39{ 39{
40 *address = _gray_info.bg_brightness; 40 *address = _gray_info.bg_index;
41} 41}
42 42
43static void flippixel(unsigned char *address) 43static void flippixel(unsigned char *address)
@@ -61,7 +61,7 @@ void (* const _gray_pixelfuncs[8])(unsigned char *address) = {
61void gray_clear_display(void) 61void gray_clear_display(void)
62{ 62{
63 int brightness = (_gray_info.drawmode & DRMODE_INVERSEVID) ? 63 int brightness = (_gray_info.drawmode & DRMODE_INVERSEVID) ?
64 _gray_info.fg_brightness : _gray_info.bg_brightness; 64 _gray_info.fg_index : _gray_info.bg_index;
65 65
66 _gray_rb->memset(_gray_info.cur_buffer, brightness, 66 _gray_rb->memset(_gray_info.cur_buffer, brightness,
67 MULU16(_gray_info.width, _gray_info.height)); 67 MULU16(_gray_info.width, _gray_info.height));
@@ -219,7 +219,7 @@ void gray_vline(int x, int y1, int y2)
219 if (_gray_info.drawmode & DRMODE_BG) 219 if (_gray_info.drawmode & DRMODE_BG)
220 { 220 {
221 fillopt = true; 221 fillopt = true;
222 bits = _gray_info.bg_brightness; 222 bits = _gray_info.bg_index;
223 } 223 }
224 } 224 }
225 else 225 else
@@ -227,7 +227,7 @@ void gray_vline(int x, int y1, int y2)
227 if (_gray_info.drawmode & DRMODE_FG) 227 if (_gray_info.drawmode & DRMODE_FG)
228 { 228 {
229 fillopt = true; 229 fillopt = true;
230 bits = _gray_info.fg_brightness; 230 bits = _gray_info.fg_index;
231 } 231 }
232 } 232 }
233 pfunc = _gray_pixelfuncs[_gray_info.drawmode]; 233 pfunc = _gray_pixelfuncs[_gray_info.drawmode];
@@ -293,7 +293,7 @@ void gray_fillrect(int x, int y, int width, int height)
293 if (_gray_info.drawmode & DRMODE_BG) 293 if (_gray_info.drawmode & DRMODE_BG)
294 { 294 {
295 fillopt = true; 295 fillopt = true;
296 bits = _gray_info.bg_brightness; 296 bits = _gray_info.bg_index;
297 } 297 }
298 } 298 }
299 else 299 else
@@ -301,7 +301,7 @@ void gray_fillrect(int x, int y, int width, int height)
301 if (_gray_info.drawmode & DRMODE_FG) 301 if (_gray_info.drawmode & DRMODE_FG)
302 { 302 {
303 fillopt = true; 303 fillopt = true;
304 bits = _gray_info.fg_brightness; 304 bits = _gray_info.fg_index;
305 } 305 }
306 } 306 }
307 pfunc = _gray_pixelfuncs[_gray_info.drawmode]; 307 pfunc = _gray_pixelfuncs[_gray_info.drawmode];
@@ -525,8 +525,7 @@ void gray_gray_bitmap_part(const unsigned char *src, int src_x, int src_y,
525 dst_end = dst_col + height; 525 dst_end = dst_col + height;
526 do 526 do
527 { 527 {
528 unsigned data = MULU16(_gray_info.depth, *src_col) + 127; 528 *dst_col++ = _gray_info.idxtable[*src_col];
529 *dst_col++ = (data + (data >> 8)) >> 8; /* approx. data / 255 */
530 src_col += stride; 529 src_col += stride;
531 } 530 }
532 while (dst_col < dst_end); 531 while (dst_col < dst_end);
@@ -642,13 +641,8 @@ static void _writearray(unsigned char *address, const unsigned char *src,
642 641
643 "mov.b @%[src],r0 \n" /* load src byte */ 642 "mov.b @%[src],r0 \n" /* load src byte */
644 "extu.b r0,r0 \n" /* extend unsigned */ 643 "extu.b r0,r0 \n" /* extend unsigned */
645 "mulu %[dpth],r0 \n" /* macl = byte * depth; */ 644 "mov.b @(r0,%[trns]),r0\n" /* idxtable into pattern index */
646 "sts macl,r1 \n" /* r1 = macl; */ 645 "extu.b r0,r0 \n" /* extend unsigned */
647 "add #127,r1 \n" /* byte += 127; */
648 "mov r1,r0 \n"
649 "shlr8 r1 \n"
650 "add r1,r0 \n" /* byte += byte >> 8; */
651 "shlr8 r0 \n" /* byte >>= 8; */
652 "shll2 r0 \n" 646 "shll2 r0 \n"
653 "mov.l @(r0,%[bpat]),r4\n" /* r4 = bitpattern[byte]; */ 647 "mov.l @(r0,%[bpat]),r4\n" /* r4 = bitpattern[byte]; */
654 648
@@ -693,7 +687,8 @@ static void _writearray(unsigned char *address, const unsigned char *src,
693 [stri]"r"(stride), 687 [stri]"r"(stride),
694 [dpth]"r"(_gray_info.depth), 688 [dpth]"r"(_gray_info.depth),
695 [bpat]"r"(_gray_info.bitpattern), 689 [bpat]"r"(_gray_info.bitpattern),
696 [rmsk]"r"(_gray_info.randmask) 690 [rmsk]"r"(_gray_info.randmask),
691 [trns]"r"(_gray_info.idxtable)
697 : /* clobbers */ 692 : /* clobbers */
698 "r0", "r1", "r3", "r4", "r5", "macl", "pr" 693 "r0", "r1", "r3", "r4", "r5", "macl", "pr"
699 ); 694 );
@@ -811,12 +806,7 @@ static void _writearray(unsigned char *address, const unsigned char *src,
811 806
812 "clr.l %%d0 \n" 807 "clr.l %%d0 \n"
813 "move.b (%[src]),%%d0 \n" /* load src byte */ 808 "move.b (%[src]),%%d0 \n" /* load src byte */
814 "mulu.w %[dpth],%%d0\n" /* byte = byte * depth; */ 809 "move.b (%%d0:l:1,%[trns]),%%d0\n" /* idxtable into pattern index */
815 "add.l #127,%%d0 \n" /* byte += 127; */
816 "move.l %%d0,%%d1 \n"
817 "lsr.l #8,%%d1 \n"
818 "add.l %%d1,%%d0 \n" /* byte += byte >> 8; */
819 "lsr.l #8,%%d0 \n" /* byte >>= 8; */
820 "move.l (%%d0:l:4,%[bpat]),%%d2\n" /* d2 = bitpattern[byte]; */ 810 "move.l (%%d0:l:4,%[bpat]),%%d2\n" /* d2 = bitpattern[byte]; */
821 811
822 "mulu.w #75,%[rnd] \n" /* multiply by 75 */ 812 "mulu.w #75,%[rnd] \n" /* multiply by 75 */
@@ -852,6 +842,7 @@ static void _writearray(unsigned char *address, const unsigned char *src,
852 : /* inputs */ 842 : /* inputs */
853 [stri]"r"(stride), 843 [stri]"r"(stride),
854 [bpat]"a"(_gray_info.bitpattern), 844 [bpat]"a"(_gray_info.bitpattern),
845 [trns]"a"(_gray_info.idxtable),
855 [dpth]"d"(_gray_info.depth), 846 [dpth]"d"(_gray_info.depth),
856 [rmsk]"d"(_gray_info.randmask) 847 [rmsk]"d"(_gray_info.randmask)
857 : /* clobbers */ 848 : /* clobbers */
diff --git a/apps/plugins/lib/gray_parm.c b/apps/plugins/lib/gray_parm.c
index c6305421c1..a6064e3ad3 100644
--- a/apps/plugins/lib/gray_parm.c
+++ b/apps/plugins/lib/gray_parm.c
@@ -61,31 +61,27 @@ int gray_get_drawmode(void)
61/* Set the foreground shade for subsequent drawing operations */ 61/* Set the foreground shade for subsequent drawing operations */
62void gray_set_foreground(unsigned brightness) 62void gray_set_foreground(unsigned brightness)
63{ 63{
64 unsigned data = MULU16(_gray_info.depth, brightness & 0xFF) + 127; 64 _gray_info.fg_brightness = brightness;
65 65 _gray_info.fg_index = _gray_info.idxtable[brightness];
66 _gray_info.fg_brightness = (data + (data >> 8)) >> 8; /* approx. data / 255 */
67} 66}
68 67
69/* Return the current foreground shade */ 68/* Return the current foreground shade */
70unsigned gray_get_foreground(void) 69unsigned gray_get_foreground(void)
71{ 70{
72 return (_gray_info.fg_brightness * 255 + (_gray_info.depth >> 1)) 71 return _gray_info.fg_brightness;
73 / _gray_info.depth;
74} 72}
75 73
76/* Set the background shade for subsequent drawing operations */ 74/* Set the background shade for subsequent drawing operations */
77void gray_set_background(unsigned brightness) 75void gray_set_background(unsigned brightness)
78{ 76{
79 unsigned data = MULU16(_gray_info.depth, brightness & 0xFF) + 127; 77 _gray_info.bg_brightness = brightness;
80 78 _gray_info.bg_index = _gray_info.idxtable[brightness];
81 _gray_info.bg_brightness = (data + (data >> 8)) >> 8; /* approx. data / 255 */
82} 79}
83 80
84/* Return the current background shade */ 81/* Return the current background shade */
85unsigned gray_get_background(void) 82unsigned gray_get_background(void)
86{ 83{
87 return (_gray_info.bg_brightness * 255 + (_gray_info.depth >> 1)) 84 return _gray_info.bg_brightness;
88 / _gray_info.depth;
89} 85}
90 86
91/* Set draw mode, foreground and background shades at once */ 87/* Set draw mode, foreground and background shades at once */
diff --git a/apps/plugins/mandelbrot.c b/apps/plugins/mandelbrot.c
index bd0994a5ba..3841e2625a 100644
--- a/apps/plugins/mandelbrot.c
+++ b/apps/plugins/mandelbrot.c
@@ -474,7 +474,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
474 /* initialize the grayscale buffer: 474 /* initialize the grayscale buffer:
475 * 8 bitplanes for 9 shades of gray.*/ 475 * 8 bitplanes for 9 shades of gray.*/
476 grayscales = gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8, 476 grayscales = gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8,
477 8, NULL) + 1; 477 8, 0, NULL) + 1;
478 if (grayscales != 9) { 478 if (grayscales != 9) {
479 rb->snprintf(buff, sizeof(buff), "%d", grayscales); 479 rb->snprintf(buff, sizeof(buff), "%d", grayscales);
480 rb->lcd_puts(0, 1, buff); 480 rb->lcd_puts(0, 1, buff);
diff --git a/apps/plugins/plasma.c b/apps/plugins/plasma.c
index e2738eceab..4e8b38db05 100644
--- a/apps/plugins/plasma.c
+++ b/apps/plugins/plasma.c
@@ -237,7 +237,7 @@ int main(void)
237 /* get the remainder of the plugin buffer */ 237 /* get the remainder of the plugin buffer */
238 gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); 238 gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
239 239
240 gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8, 32, NULL); 240 gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8, 32, 2<<8, NULL);
241 /* switch on grayscale overlay */ 241 /* switch on grayscale overlay */
242 gray_show(true); 242 gray_show(true);
243#endif 243#endif