Commit b115bb3febe985bbc81d4dcfd82966fe94c54277
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 |