static void sunxi_setup_scale (void *data, unsigned width, unsigned height, unsigned pitch) { int i; float aspect; unsigned int xpos, visible_width; struct sunxi_video *_dispvars = (struct sunxi_video*)data; settings_t *settings = config_get_ptr(); _dispvars->src_width = width; _dispvars->src_height = height; /* Total pitch, including things the * cores render between "visible" scanlines. */ _dispvars->src_pitch = pitch; /* Pixels per line */ _dispvars->src_pixels_per_line = _dispvars->src_pitch/_dispvars->bytes_per_pixel; /* Incremental offset that sums up on * each previous page offset. * Total offset of each page has to * be adjusted when internal resolution changes. */ for (i = 0; i < NUMPAGES; i++) { _dispvars->pages[i].offset = (_dispvars->sunxi_disp->yres + i * _dispvars->src_height) * _dispvars->sunxi_disp->xres * 4; _dispvars->pages[i].address = ((uint32_t*) _dispvars->sunxi_disp->framebuffer_addr + (_dispvars->sunxi_disp->yres + i * _dispvars->src_height) * _dispvars->dst_pitch/4); } switch (settings->video.aspect_ratio_idx) { case ASPECT_RATIO_4_3: aspect = (float)4 / (float)3; break; case ASPECT_RATIO_16_9: aspect = (float)16 / (float)9; break; case ASPECT_RATIO_16_10: aspect = (float)16 / (float)10; break; case ASPECT_RATIO_16_15: aspect = (float)16 / (float)15; break; case ASPECT_RATIO_CORE: aspect = (float)_dispvars->src_width / (float)_dispvars->src_height; break; default: aspect = (float)_dispvars->src_width / (float)_dispvars->src_height; break; } visible_width = _dispvars->sunxi_disp->yres * aspect; xpos = (_dispvars->sunxi_disp->xres - visible_width) / 2; /* setup layer window */ sunxi_layer_set_output_window(_dispvars->sunxi_disp, xpos, 0, visible_width, _dispvars->sunxi_disp->yres); /* make the layer visible */ sunxi_layer_show(_dispvars->sunxi_disp); }
static void sunxi_setup_scale (void *data, unsigned width, unsigned height, unsigned pitch) { int i; unsigned int xpos, visible_width; struct sunxi_video *_dispvars = (struct sunxi_video*)data; _dispvars->src_width = width; _dispvars->src_height = height; /* Total pitch, including things the * cores render between "visible" scanlines. */ _dispvars->src_pitch = pitch; /* Pixels per line */ _dispvars->src_pixels_per_line = _dispvars->src_pitch/_dispvars->bytes_per_pixel; /* Incremental offset that sums up on * each previous page offset. * Total offset of each page has to * be adjusted when internal resolution changes. */ for (i = 0; i < NUMPAGES; i++) { _dispvars->pages[i].offset = (_dispvars->sunxi_disp->yres + i * _dispvars->src_height) * _dispvars->sunxi_disp->xres * 4; _dispvars->pages[i].address = ((uint32_t*) _dispvars->sunxi_disp->framebuffer_addr + (_dispvars->sunxi_disp->yres + i * _dispvars->src_height) * _dispvars->dst_pitch/4); } visible_width = _dispvars->sunxi_disp->yres * _dispvars->aspect_ratio; xpos = (_dispvars->sunxi_disp->xres - visible_width) / 2; /* setup layer window */ sunxi_layer_set_output_window(_dispvars->sunxi_disp, xpos, 0, visible_width, _dispvars->sunxi_disp->yres); /* make the layer visible */ sunxi_layer_show(_dispvars->sunxi_disp); }