diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-09-04 19:49:35 +0300 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-09-04 19:49:35 +0300 |
commit | 0e1b7765be878491565cf5e471f22b15e106164c (patch) | |
tree | 422e500c289335182a2a64934dcabf10b95e32dc /libvo/aspect.c | |
parent | a9618c1c6fe9424dfaeb1677348e0382d7252554 (diff) | |
parent | dcfd043ea8d0c46929aad78596314d837c290d39 (diff) | |
download | mpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.bz2 mpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.xz |
Merge svn changes up to r29644
Diffstat (limited to 'libvo/aspect.c')
-rw-r--r-- | libvo/aspect.c | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/libvo/aspect.c b/libvo/aspect.c index 6fa9905731..1b1e5857f3 100644 --- a/libvo/aspect.c +++ b/libvo/aspect.c @@ -87,11 +87,11 @@ void aspect_fit(struct vo *vo, int *srcw, int *srch, int fitw, int fith) #ifdef ASPECT_DEBUG printf("aspect(2) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat->prew,aspdat->preh); #endif - if(*srch>aspdat->scrh || *srch<aspdat->orgh){ + if(*srch>fith || *srch<aspdat->orgh){ tmpw = (int)(((float)fith / (float)aspdat->preh * (float)aspdat->prew) * ((float)aspdat->scrw / ((float)aspdat->scrh / (1.0/vo->monitor_aspect)))); tmpw+= tmpw%2; // round - if(tmpw<=aspdat->scrw /*&& tmpw>=aspdat->orgw*/){ + if(tmpw<=fitw /*&& tmpw>=aspdat->orgw*/){ *srch = fith; *srcw = tmpw; }else{ @@ -108,9 +108,23 @@ void aspect_fit(struct vo *vo, int *srcw, int *srch, int fitw, int fith) #endif } -void aspect(struct vo *vo, int *srcw, int *srch, int zoom){ - int fitw = zoom ? vo->aspdat.scrw : vo->aspdat.prew; - int fith = zoom ? vo->aspdat.scrh : vo->aspdat.preh; +static void get_max_dims(struct vo *vo, int *w, int *h, int zoom) +{ + struct aspect_data *aspdat = &vo->aspdat; + *w = zoom ? aspdat->scrw : aspdat->prew; + *h = zoom ? aspdat->scrh : aspdat->preh; + if (zoom && WinID >= 0) zoom = A_WINZOOM; + if (zoom == A_WINZOOM) { + *w = vo->dwidth; + *h = vo->dheight; + } +} + +void aspect(struct vo *vo, int *srcw, int *srch, int zoom) +{ + int fitw; + int fith; + get_max_dims(vo, &fitw, &fith, zoom); if( !zoom && geometry_wh_changed ) { #ifdef ASPECT_DEBUG printf("aspect(0) no aspect forced!\n"); @@ -127,22 +141,38 @@ void panscan_init(struct vo *vo) vo->panscan_amount = 0.0f; } -void panscan_calc(struct vo *vo) +static void panscan_calc_internal(struct vo *vo, int zoom) { int fwidth,fheight; int vo_panscan_area; + int max_w, max_h; + get_max_dims(vo, &max_w, &max_h, zoom); struct MPOpts *opts = vo->opts; if (opts->vo_panscanrange > 0) { - aspect(vo, &fwidth, &fheight, A_ZOOM); - vo_panscan_area = (vo->aspdat.scrh - fheight); + aspect(vo, &fwidth, &fheight, zoom); + vo_panscan_area = max_h - fheight; if (!vo_panscan_area) - vo_panscan_area = vo->aspdat.scrw - fwidth; + vo_panscan_area = max_w - fwidth; vo_panscan_area *= opts->vo_panscanrange; } else - vo_panscan_area = -opts->vo_panscanrange * vo->aspdat.scrh; + vo_panscan_area = -opts->vo_panscanrange * max_h; - vo->panscan_amount = vo_fs ? vo_panscan : 0; + vo->panscan_amount = vo_fs || zoom == A_WINZOOM ? vo_panscan : 0; vo->panscan_x = vo_panscan_area * vo->panscan_amount * vo->aspdat.asp; vo->panscan_y = vo_panscan_area * vo->panscan_amount; } + +void panscan_calc(struct vo *vo) +{ + panscan_calc_internal(vo, A_ZOOM); +} + +/** + * vos that set vo_dwidth and v_dheight correctly should call this to update + * vo_panscan_x and vo_panscan_y + */ +void panscan_calc_windowed(struct vo *vo) +{ + panscan_calc_internal(vo, A_WINZOOM); +} |