summaryrefslogtreecommitdiffstats
path: root/libvo/aspect.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-09-04 19:49:35 +0300
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-09-04 19:49:35 +0300
commit0e1b7765be878491565cf5e471f22b15e106164c (patch)
tree422e500c289335182a2a64934dcabf10b95e32dc /libvo/aspect.c
parenta9618c1c6fe9424dfaeb1677348e0382d7252554 (diff)
parentdcfd043ea8d0c46929aad78596314d837c290d39 (diff)
downloadmpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.bz2
mpv-0e1b7765be878491565cf5e471f22b15e106164c.tar.xz
Merge svn changes up to r29644
Diffstat (limited to 'libvo/aspect.c')
-rw-r--r--libvo/aspect.c52
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);
+}