void uidisplay_area( int x, int y, int w, int h ) { static unsigned char linebuf[2*DISPLAY_SCREEN_WIDTH]; unsigned char *ptr; float scale; int scaled_x, scaled_y, xx, yy; unsigned char grey = settings_current.bw_tv ? 16 : 0; /* a simplified shortcut, for normal usage */ if ( !hires && image_scale == 1 ) { for( yy = y; yy < y + h; yy++ ) { for( xx = x, ptr = linebuf; xx < x + w; xx++ ) *ptr++ = svgadisplay_image[yy][xx] | grey; vga_drawscansegment( linebuf, x, yy, w ); } return; } scale = (float) ( hires + 1 ) / image_scale; /* Extend the dirty region by 1 pixel for scalers that "smear" the screen, e.g. AdvMAME2x */ if( scaler_flags & SCALER_FLAGS_EXPAND ) scaler_expander( &x, &y, &w, &h, image_width, image_height ); scaled_x = scale * x; scaled_y = scale * y; /* Create scaled image */ scaler_proc16( (libspectrum_byte*)&svgadisplay_image[y][x], svgadisplay_pitch, (libspectrum_byte*)&scaled_image[scaled_y][scaled_x], scaled_pitch, w, h ); w *= scale; h *= scale; for( yy = scaled_y; yy < scaled_y + h; yy++ ) { for( xx = scaled_x, ptr = linebuf; xx < scaled_x + w; xx++ ) *ptr++ = scaled_image[yy][xx] | grey; vga_drawscansegment( linebuf, scaled_x, yy, w ); } }
void uidisplay_area( int x, int y, int w, int h ) { float scale = (float)gtkdisplay_current_size / image_scale; int scaled_x, scaled_y, i, yy; libspectrum_dword *palette; /* Extend the dirty region by 1 pixel for scalers that "smear" the screen, e.g. 2xSAI */ if( scaler_flags & SCALER_FLAGS_EXPAND ) scaler_expander( &x, &y, &w, &h, image_width, image_height ); scaled_x = scale * x; scaled_y = scale * y; palette = settings_current.bw_tv ? bw_colours : gtkdisplay_colours; /* Create the RGB image */ for( yy = y; yy < y + h; yy++ ) { libspectrum_dword *rgb; libspectrum_word *display; rgb = (libspectrum_dword*)( rgb_image + ( yy + 2 ) * rgb_pitch ); rgb += x + 1; display = >kdisplay_image[yy][x]; for( i = 0; i < w; i++, rgb++, display++ ) *rgb = palette[ *display ]; } /* Create scaled image */ scaler_proc32( &rgb_image[ ( y + 2 ) * rgb_pitch + 4 * ( x + 1 ) ], rgb_pitch, &scaled_image[ scaled_y * scaled_pitch + 4 * scaled_x ], scaled_pitch, w, h ); w *= scale; h *= scale; /* Blit to the real screen */ gtkdisplay_area( scaled_x, scaled_y, w, h ); }
void uidisplay_area( int x, int y, int w, int h ) { float scale = (float)wiidisplay_current_size / image_scale; int scaled_x, scaled_y, i, yy; libspectrum_dword *palette; /* Extend the dirty region by 1 pixel for scalers that "smear" the screen, e.g. 2xSAI */ if( scaler_flags & SCALER_FLAGS_EXPAND ) scaler_expander( &x, &y, &w, &h, image_width, image_height ); scaled_x = scale * x; scaled_y = scale * y; palette = settings_current.bw_tv ? bw_colours : wiidisplay_colours; /* Create the RGB image */ for( yy = y; yy < y + h; yy++ ) { libspectrum_dword *rgb; libspectrum_word *display; rgb = (libspectrum_dword*)( rgb_image + ( yy + 2 ) * rgb_pitch ); rgb += x + 1; display = &display_image[yy][x]; for( i = 0; i < w; i++, rgb++, display++ ) *rgb = palette[ *display ]; } /* Create scaled image */ scaler_proc32( &rgb_image[ ( y + 2 ) * rgb_pitch + 4 * ( x + 1 ) ], rgb_pitch, &scaled_image[ scaled_y * scaled_pitch + 4 * scaled_x ], scaled_pitch, w, h ); w *= scale; h *= scale; /* Blit to the real screen */ int disp_x,disp_y; long ofs; u16 fb_pitch = rmode->fbWidth / 2; /* ystart is an offset to center spectrum screen on wii screen */ int ystart = ( rmode->xfbHeight - 2 * DISPLAY_SCREEN_HEIGHT ) / 4; u32 *dest, *next_line; if( scaled_x%2 ) { scaled_x -= 1; w += 1; } /* FIXME: optimize this procedure and implement double buffering */ next_line = xfb + scaled_x / 2 + ( scaled_y + ystart ) * fb_pitch; for( disp_y = scaled_y; disp_y < scaled_y + h; disp_y++ ) { dest = next_line; for( disp_x = scaled_x; disp_x < scaled_x + w; disp_x++ ) { ofs = ( 4 * disp_x ) + ( scaled_pitch * disp_y ); rgb_t rgb1, rgb2; rgb1.b = scaled_image[ ofs + 2 ]; /* blue */ rgb1.g = scaled_image[ ofs + 1 ]; /* green */ rgb1.r = scaled_image[ ofs + 0 ]; /* red */ rgb2.b = scaled_image[ ofs + 2 + 4 ]; /* blue */ rgb2.g = scaled_image[ ofs + 1 + 4 ]; /* green */ rgb2.r = scaled_image[ ofs + 0 + 4 ]; /* red */ *dest = convert_rgb( rgb1, rgb2 ); dest += disp_x%2; } next_line += fb_pitch; } }