Commit 0266f2c733911ca3f70e009e3230c790c800e524
1 parent
ea01e5fd
Fix MusicPal LCD on non-32 bpp displays or with -nographic.
Prevents an immediate segfault. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4252 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
38 additions
and
20 deletions
hw/musicpal.c
... | ... | @@ -759,32 +759,50 @@ static uint8_t scale_lcd_color(uint8_t col) |
759 | 759 | } |
760 | 760 | } |
761 | 761 | |
762 | -static void set_lcd_pixel(musicpal_lcd_state *s, int x, int y, int col) | |
763 | -{ | |
764 | - int dx, dy; | |
765 | - | |
766 | - for (dy = 0; dy < 3; dy++) | |
767 | - for (dx = 0; dx < 3; dx++) { | |
768 | - s->ds->data[(x*3 + dx + (y*3 + dy) * 128*3) * 4 + 0] = | |
769 | - scale_lcd_color(col); | |
770 | - s->ds->data[(x*3 + dx + (y*3 + dy) * 128*3) * 4 + 1] = | |
771 | - scale_lcd_color(col >> 8); | |
772 | - s->ds->data[(x*3 + dx + (y*3 + dy) * 128*3) * 4 + 2] = | |
773 | - scale_lcd_color(col >> 16); | |
774 | - } | |
762 | +#define SET_LCD_PIXEL(depth, type) \ | |
763 | +static inline void glue(set_lcd_pixel, depth) \ | |
764 | + (musicpal_lcd_state *s, int x, int y, type col) \ | |
765 | +{ \ | |
766 | + int dx, dy; \ | |
767 | + type *pixel = &((type *) s->ds->data)[(y * 128 * 3 + x) * 3]; \ | |
768 | +\ | |
769 | + for (dy = 0; dy < 3; dy++, pixel += 127 * 3) \ | |
770 | + for (dx = 0; dx < 3; dx++, pixel++) \ | |
771 | + *pixel = col; \ | |
775 | 772 | } |
773 | +SET_LCD_PIXEL(8, uint8_t) | |
774 | +SET_LCD_PIXEL(16, uint16_t) | |
775 | +SET_LCD_PIXEL(32, uint32_t) | |
776 | + | |
777 | +#include "pixel_ops.h" | |
776 | 778 | |
777 | 779 | static void lcd_refresh(void *opaque) |
778 | 780 | { |
779 | 781 | musicpal_lcd_state *s = opaque; |
780 | - int x, y; | |
782 | + int x, y, col; | |
781 | 783 | |
782 | - for (x = 0; x < 128; x++) | |
783 | - for (y = 0; y < 64; y++) | |
784 | - if (s->video_ram[x + (y/8)*128] & (1 << (y % 8))) | |
785 | - set_lcd_pixel(s, x, y, MP_LCD_TEXTCOLOR); | |
786 | - else | |
787 | - set_lcd_pixel(s, x, y, 0); | |
784 | + switch (s->ds->depth) { | |
785 | + case 0: | |
786 | + return; | |
787 | +#define LCD_REFRESH(depth, func) \ | |
788 | + case depth: \ | |
789 | + col = func(scale_lcd_color((MP_LCD_TEXTCOLOR >> 16) & 0xff), \ | |
790 | + scale_lcd_color((MP_LCD_TEXTCOLOR >> 8) & 0xff), \ | |
791 | + scale_lcd_color(MP_LCD_TEXTCOLOR & 0xff)); \ | |
792 | + for (x = 0; x < 128; x++) \ | |
793 | + for (y = 0; y < 64; y++) \ | |
794 | + if (s->video_ram[x + (y/8)*128] & (1 << (y % 8))) \ | |
795 | + glue(set_lcd_pixel, depth)(s, x, y, col); \ | |
796 | + else \ | |
797 | + glue(set_lcd_pixel, depth)(s, x, y, 0); \ | |
798 | + break; | |
799 | + LCD_REFRESH(8, rgb_to_pixel8) | |
800 | + LCD_REFRESH(16, rgb_to_pixel16) | |
801 | + LCD_REFRESH(32, (s->ds->bgr ? rgb_to_pixel32bgr : rgb_to_pixel32)) | |
802 | + default: | |
803 | + cpu_abort(cpu_single_env, "unsupported colour depth %i\n", | |
804 | + s->ds->depth); | |
805 | + } | |
788 | 806 | |
789 | 807 | dpy_update(s->ds, 0, 0, 128*3, 64*3); |
790 | 808 | } | ... | ... |