diff options
author | phintuka <phintuka> | 2008-12-05 21:30:19 +0000 |
---|---|---|
committer | phintuka <phintuka> | 2008-12-05 21:30:19 +0000 |
commit | 20d8c1c8e3731a7bc406709020ea145658804108 (patch) | |
tree | b3ca10b0df9e1307ba029504b29f4dd2d366f138 | |
parent | 628a8736185a8ef9d434c04a86a41beb6ede574f (diff) | |
download | xineliboutput-20d8c1c8e3731a7bc406709020ea145658804108.tar.gz xineliboutput-20d8c1c8e3731a7bc406709020ea145658804108.tar.bz2 |
Moved RLE scaling code to tools/rle.[hc]
-rw-r--r-- | xine_input_vdr.c | 154 |
1 files changed, 21 insertions, 133 deletions
diff --git a/xine_input_vdr.c b/xine_input_vdr.c index a2c66288..982ed2a9 100644 --- a/xine_input_vdr.c +++ b/xine_input_vdr.c @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: xine_input_vdr.c,v 1.204 2008-12-04 00:21:32 phintuka Exp $ + * $Id: xine_input_vdr.c,v 1.205 2008-12-05 21:30:19 phintuka Exp $ * */ @@ -1581,147 +1581,35 @@ static xine_rle_elem_t *uncompress_osd_net(uint8_t *raw, int elems, int datalen) return data; } - -/*#define NEW_SCALING*/ -#ifdef NEW_SCALING #include "tools/rle.h" -#else -typedef enum { - scale_fast = 0, /* simple pixel doubling/dropping */ - scale_good_BW = 1, /* linear interpolation, palette re-generation */ -} scale_mode_t; -#endif -/* re-scale compressed RLE image */ -static xine_rle_elem_t *scale_rle_image(osd_command_t *osdcmd, - int new_w, int new_h, - scale_mode_t mode) +/* + * scale_rle_image() + * + * Scale OSD_Set_RLE data + * - modified fields: x, y, w, h, (RLE) data and datalen + * - old RLE data is not stored, freed or returned ! + */ +static void scale_rle_image(osd_command_t *osdcmd, + int new_w, int new_h, + scale_mode_t mode) { - #define FACTORBASE 0x100 - #define FACTOR2PIXEL(f) ((f)>>8) - #define SCALEX(x) FACTOR2PIXEL(factor_x*(x)) - #define SCALEY(y) FACTOR2PIXEL(factor_y*(y)) - - xine_rle_elem_t *old_rle = osdcmd->data; - int old_w = osdcmd->w, old_h = osdcmd->h; - int old_y = 0, new_y = 0; - int factor_x = FACTORBASE*new_w/old_w; - int factor_y = FACTORBASE*new_h/old_h; - - xine_rle_elem_t *new_rle_start, *new_rle, *tmp; - int rle_size = 8128; - int num_rle = 0; - -#ifdef NEW_SCALING - /* try better quality grayscale 100%...200% */ - if(mode != scale_fast && - old_w <= new_w && old_w*2 >= new_w && - old_h <= new_h && old_h*2 >= new_h) { - tmp = upscale_grayscale_rle_image(osdcmd, new_w, new_h); - if(tmp) - return tmp; - } -#endif - - new_rle_start = new_rle = (xine_rle_elem_t*)malloc(4*rle_size); + xine_rle_elem_t *old_rle = osdcmd->data; + int rle_elems = osdcmd->datalen / sizeof(xine_rle_elem_t); - /* we assume rle elements are breaked at end of line */ - while(old_y < old_h) { - int elems_current_line = 0; - int old_x = 0, new_x = 0; + /*if (mode == scale_fast)*/ + osdcmd->data = rle_scale_nearest(old_rle, &rle_elems, osdcmd->w, osdcmd->h, + new_w, new_h); + osdcmd->datalen = rle_elems * sizeof(xine_rle_elem_t); - while(old_x < old_w) { - int new_x_end = SCALEX(old_x + old_rle->len); - - if(new_x_end > new_w) { - new_x_end = new_w; - } - - new_rle->len = new_x_end - new_x; - new_rle->color = old_rle->color; - - old_x += old_rle->len; - old_rle++; /* may be incremented to last element + 1 (element is not accessed anymore) */ - - if(new_rle->len > 0) { - new_x += new_rle->len; - new_rle++; - - num_rle++; - elems_current_line++; - - if( (num_rle + 1) >= rle_size ) { - rle_size *= 2; - new_rle_start = (xine_rle_elem_t*)realloc( new_rle_start, 4*rle_size); - new_rle = new_rle_start + num_rle; - } - } - } - if(new_x < new_w) - (new_rle-1)->len += new_w - new_x; - old_y++; - new_y++; - - if(factor_y > FACTORBASE) { - /* scale up -- duplicate current line ? */ - int dup = SCALEY(old_y) - new_y; - - /* if no lines left in (old) rle, copy all lines still missing from new */ - if(old_y == old_h) - dup = new_h - new_y - 1; - - while(dup-- && (new_y+1<new_h)) { - xine_rle_elem_t *prevline; - int n; - if( (num_rle + elems_current_line + 1) >= rle_size ) { - rle_size *= 2; - new_rle_start = (xine_rle_elem_t*)realloc( new_rle_start, 4*rle_size); - new_rle = new_rle_start + num_rle; - } - - /* duplicate previous line */ - prevline = new_rle - elems_current_line; - for(n = 0; n < elems_current_line; n++) { - *new_rle++ = *prevline++; - num_rle++; - } - new_y++; - } - - } else if(factor_y < FACTORBASE) { - /* scale down -- drop next line ? */ - int skip = new_y - SCALEY(old_y); - if(old_y == old_h-1) { - /* one (old) line left ; don't skip it if new rle is not complete */ - if(new_y < new_h) - skip = 0; - } - while(skip-- && - old_y<old_h /* rounding error may add one line, filter it out */) { - for(old_x = 0; old_x < old_w;) { - old_x += old_rle->len; - old_rle++; - } - old_y++; - } - } - } - - tmp = osdcmd->data; - - osdcmd->data = new_rle_start; - osdcmd->datalen = num_rle*4; - - if(old_w != new_w) { - osdcmd->x = (0x100*osdcmd->x * new_w/old_w)>>8; + if (osdcmd->w != new_w) { + osdcmd->x = osdcmd->x * new_w / osdcmd->w; osdcmd->w = new_w; } - if(old_h != new_h) { - osdcmd->y = (0x100*osdcmd->y * new_h/old_h)>>8; + if (osdcmd->h != new_h) { + osdcmd->y = osdcmd->y * new_h / osdcmd->h; osdcmd->h = new_h; } - - return tmp; } /* |