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);
}
Example #2
0
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);
}