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 203 int dest_width;
204 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 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 184 char *p;
185 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 213 switch (s->ds->depth) {
189   - case 0:
190   - return;
191 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 218 break;
194 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 223 break;
197 224 case 24:
198   - dest_width = 3;
199   - break;
200 225 case 32:
201   - dest_width = 4;
  226 + n = (i << 4) | i;
  227 + p[0] = p[1] = p[2] = n;
202 228 break;
203 229 default:
204 230 BADF("Bad color depth\n");
205 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 261 dpy_update(s->ds, 0, 0, 128 * MAGNIFY, 64 * MAGNIFY);
260 262 }
261 263  
... ...