Commit b115bb3febe985bbc81d4dcfd82966fe94c54277

Authored by pbrook
1 parent 28e10711

Eliminate spurous screen updates.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4857 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 106 additions and 102 deletions
hw/ssd0303.c
@@ -203,55 +203,57 @@ static void ssd0303_update_display(void *opaque) @@ -203,55 +203,57 @@ static void ssd0303_update_display(void *opaque)
203 int dest_width; 203 int dest_width;
204 uint8_t mask; 204 uint8_t mask;
205 205
206 - if (s->redraw) {  
207 - switch (s->ds->depth) {  
208 - case 0:  
209 - return;  
210 - case 15:  
211 - dest_width = 2;  
212 - break;  
213 - case 16:  
214 - dest_width = 2;  
215 - break;  
216 - case 24:  
217 - dest_width = 3;  
218 - break;  
219 - case 32:  
220 - dest_width = 4;  
221 - break;  
222 - default:  
223 - BADF("Bad color depth\n");  
224 - return;  
225 - }  
226 - dest_width *= MAGNIFY;  
227 - memset(colortab, 0xff, dest_width);  
228 - memset(colortab + dest_width, 0, dest_width);  
229 - if (s->flash) {  
230 - colors[0] = colortab;  
231 - colors[1] = colortab;  
232 - } else if (s->inverse) {  
233 - colors[0] = colortab;  
234 - colors[1] = colortab + dest_width;  
235 - } else {  
236 - colors[0] = colortab + dest_width;  
237 - colors[1] = colortab; 206 + if (!s->redraw)
  207 + return;
  208 +
  209 + switch (s->ds->depth) {
  210 + case 0:
  211 + return;
  212 + case 15:
  213 + dest_width = 2;
  214 + break;
  215 + case 16:
  216 + dest_width = 2;
  217 + break;
  218 + case 24:
  219 + dest_width = 3;
  220 + break;
  221 + case 32:
  222 + dest_width = 4;
  223 + break;
  224 + default:
  225 + BADF("Bad color depth\n");
  226 + return;
  227 + }
  228 + dest_width *= MAGNIFY;
  229 + memset(colortab, 0xff, dest_width);
  230 + memset(colortab + dest_width, 0, dest_width);
  231 + if (s->flash) {
  232 + colors[0] = colortab;
  233 + colors[1] = colortab;
  234 + } else if (s->inverse) {
  235 + colors[0] = colortab;
  236 + colors[1] = colortab + dest_width;
  237 + } else {
  238 + colors[0] = colortab + dest_width;
  239 + colors[1] = colortab;
  240 + }
  241 + dest = s->ds->data;
  242 + for (y = 0; y < 16; y++) {
  243 + line = (y + s->start_line) & 63;
  244 + src = s->framebuffer + 132 * (line >> 3) + 36;
  245 + mask = 1 << (line & 7);
  246 + for (x = 0; x < 96; x++) {
  247 + memcpy(dest, colors[(*src & mask) != 0], dest_width);
  248 + dest += dest_width;
  249 + src++;
238 } 250 }
239 - dest = s->ds->data;  
240 - for (y = 0; y < 16; y++) {  
241 - line = (y + s->start_line) & 63;  
242 - src = s->framebuffer + 132 * (line >> 3) + 36;  
243 - mask = 1 << (line & 7);  
244 - for (x = 0; x < 96; x++) {  
245 - memcpy(dest, colors[(*src & mask) != 0], dest_width);  
246 - dest += dest_width;  
247 - src++;  
248 - }  
249 - for (x = 1; x < MAGNIFY; x++) {  
250 - memcpy(dest, dest - dest_width * 96, dest_width * 96);  
251 - dest += dest_width * 96;  
252 - } 251 + for (x = 1; x < MAGNIFY; x++) {
  252 + memcpy(dest, dest - dest_width * 96, dest_width * 96);
  253 + dest += dest_width * 96;
253 } 254 }
254 } 255 }
  256 + s->redraw = 0;
255 dpy_update(s->ds, 0, 0, 96 * MAGNIFY, 16 * MAGNIFY); 257 dpy_update(s->ds, 0, 0, 96 * MAGNIFY, 16 * MAGNIFY);
256 } 258 }
257 259
hw/ssd0323.c
@@ -184,78 +184,80 @@ static void ssd0323_update_display(void *opaque) @@ -184,78 +184,80 @@ static void ssd0323_update_display(void *opaque)
184 char *p; 184 char *p;
185 int dest_width; 185 int dest_width;
186 186
187 - if (s->redraw) { 187 + if (!s->redraw)
  188 + return;
  189 +
  190 + switch (s->ds->depth) {
  191 + case 0:
  192 + return;
  193 + case 15:
  194 + dest_width = 2;
  195 + break;
  196 + case 16:
  197 + dest_width = 2;
  198 + break;
  199 + case 24:
  200 + dest_width = 3;
  201 + break;
  202 + case 32:
  203 + dest_width = 4;
  204 + break;
  205 + default:
  206 + BADF("Bad color depth\n");
  207 + return;
  208 + }
  209 + p = colortab;
  210 + for (i = 0; i < 16; i++) {
  211 + int n;
  212 + colors[i] = p;
188 switch (s->ds->depth) { 213 switch (s->ds->depth) {
189 - case 0:  
190 - return;  
191 case 15: 214 case 15:
192 - dest_width = 2; 215 + n = i * 2 + (i >> 3);
  216 + p[0] = n | (n << 5);
  217 + p[1] = (n << 2) | (n >> 3);
193 break; 218 break;
194 case 16: 219 case 16:
195 - dest_width = 2; 220 + n = i * 2 + (i >> 3);
  221 + p[0] = n | (n << 6) | ((n << 1) & 0x20);
  222 + p[1] = (n << 3) | (n >> 2);
196 break; 223 break;
197 case 24: 224 case 24:
198 - dest_width = 3;  
199 - break;  
200 case 32: 225 case 32:
201 - dest_width = 4; 226 + n = (i << 4) | i;
  227 + p[0] = p[1] = p[2] = n;
202 break; 228 break;
203 default: 229 default:
204 BADF("Bad color depth\n"); 230 BADF("Bad color depth\n");
205 return; 231 return;
206 } 232 }
207 - p = colortab;  
208 - for (i = 0; i < 16; i++) {  
209 - int n;  
210 - colors[i] = p;  
211 - switch (s->ds->depth) {  
212 - case 15:  
213 - n = i * 2 + (i >> 3);  
214 - p[0] = n | (n << 5);  
215 - p[1] = (n << 2) | (n >> 3);  
216 - break;  
217 - case 16:  
218 - n = i * 2 + (i >> 3);  
219 - p[0] = n | (n << 6) | ((n << 1) & 0x20);  
220 - p[1] = (n << 3) | (n >> 2);  
221 - break;  
222 - case 24:  
223 - case 32:  
224 - n = (i << 4) | i;  
225 - p[0] = p[1] = p[2] = n;  
226 - break;  
227 - default:  
228 - BADF("Bad color depth\n");  
229 - return;  
230 - }  
231 - p += dest_width;  
232 - }  
233 - /* TODO: Implement row/column remapping. */  
234 - dest = s->ds->data;  
235 - for (y = 0; y < 64; y++) {  
236 - line = y;  
237 - src = s->framebuffer + 64 * line;  
238 - for (x = 0; x < 64; x++) {  
239 - int val;  
240 - val = *src >> 4;  
241 - for (i = 0; i < MAGNIFY; i++) {  
242 - memcpy(dest, colors[val], dest_width);  
243 - dest += dest_width;  
244 - }  
245 - val = *src & 0xf;  
246 - for (i = 0; i < MAGNIFY; i++) {  
247 - memcpy(dest, colors[val], dest_width);  
248 - dest += dest_width;  
249 - }  
250 - src++; 233 + p += dest_width;
  234 + }
  235 + /* TODO: Implement row/column remapping. */
  236 + dest = s->ds->data;
  237 + for (y = 0; y < 64; y++) {
  238 + line = y;
  239 + src = s->framebuffer + 64 * line;
  240 + for (x = 0; x < 64; x++) {
  241 + int val;
  242 + val = *src >> 4;
  243 + for (i = 0; i < MAGNIFY; i++) {
  244 + memcpy(dest, colors[val], dest_width);
  245 + dest += dest_width;
251 } 246 }
252 - for (i = 1; i < MAGNIFY; i++) {  
253 - memcpy(dest, dest - dest_width * MAGNIFY * 128,  
254 - dest_width * 128 * MAGNIFY);  
255 - dest += dest_width * 128 * MAGNIFY; 247 + val = *src & 0xf;
  248 + for (i = 0; i < MAGNIFY; i++) {
  249 + memcpy(dest, colors[val], dest_width);
  250 + dest += dest_width;
256 } 251 }
  252 + src++;
  253 + }
  254 + for (i = 1; i < MAGNIFY; i++) {
  255 + memcpy(dest, dest - dest_width * MAGNIFY * 128,
  256 + dest_width * 128 * MAGNIFY);
  257 + dest += dest_width * 128 * MAGNIFY;
257 } 258 }
258 } 259 }
  260 + s->redraw = 0;
259 dpy_update(s->ds, 0, 0, 128 * MAGNIFY, 64 * MAGNIFY); 261 dpy_update(s->ds, 0, 0, 128 * MAGNIFY, 64 * MAGNIFY);
260 } 262 }
261 263