diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-12-18 12:04:08 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-12-18 12:04:08 +0000 |
commit | 2a15e8beb88ad6d39447308eec9ed802b83788de (patch) | |
tree | e37474436aa10df08dd8ea5dc7ac0dea4ca9b577 /libvo | |
parent | 06ed3c2b57c5088d3b35af67f047d5ed3192d72c (diff) | |
download | mpv-2a15e8beb88ad6d39447308eec9ed802b83788de.tar.bz2 mpv-2a15e8beb88ad6d39447308eec9ed802b83788de.tar.xz |
support negative stride (flipping) in vo_gl.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17221 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/gl_common.c | 11 | ||||
-rw-r--r-- | libvo/gl_common.h | 2 | ||||
-rw-r--r-- | libvo/vo_gl.c | 9 | ||||
-rw-r--r-- | libvo/vo_gl2.c | 3 |
4 files changed, 19 insertions, 6 deletions
diff --git a/libvo/gl_common.c b/libvo/gl_common.c index a885159abd..7f8f719a00 100644 --- a/libvo/gl_common.c +++ b/libvo/gl_common.c @@ -493,6 +493,10 @@ void glUploadTex(GLenum target, GLenum format, GLenum type, if (w <= 0 || h <= 0) return; if (slice <= 0) slice = h; + if (stride < 0) { + data += h * stride; + stride = -stride; + } // this is not always correct, but should work for MPlayer glAdjustAlignment(stride); glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type)); @@ -910,16 +914,21 @@ void inline glDisableYUVConversion(GLenum target, int type) { * \param sy height of texture in pixels * \param rect_tex whether this texture uses texture_rectangle extension * \param is_yv12 if set, also draw the textures from units 1 and 2 + * \param flip flip the texture upside down * \ingroup gltexture */ void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h, GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th, - int sx, int sy, int rect_tex, int is_yv12) { + int sx, int sy, int rect_tex, int is_yv12, int flip) { GLfloat tx2 = tx / 2, ty2 = ty / 2, tw2 = tw / 2, th2 = th / 2; if (!rect_tex) { tx /= sx; ty /= sy; tw /= sx; th /= sy; tx2 = tx, ty2 = ty, tw2 = tw, th2 = th; } + if (flip) { + y += h; + h = -h; + } glBegin(GL_QUADS); glTexCoord2f(tx, ty); if (is_yv12) { diff --git a/libvo/gl_common.h b/libvo/gl_common.h index 29564f6a3d..15dd1f8bfa 100644 --- a/libvo/gl_common.h +++ b/libvo/gl_common.h @@ -196,7 +196,7 @@ void glUploadTex(GLenum target, GLenum format, GLenum type, int x, int y, int w, int h, int slice); void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h, GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th, - int sx, int sy, int rect_tex, int is_yv12); + int sx, int sy, int rect_tex, int is_yv12, int flip); /** \addtogroup glconversion * \{ */ diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 8b3b99e6cd..9fb7e829a5 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -90,6 +90,7 @@ static int eq_bgamma = 0; static int texture_width; static int texture_height; +static int mpi_flipped; static unsigned int slice_height = 1; @@ -473,12 +474,12 @@ static void create_osd_texture(int x0, int y0, int w, int h, // render alpha glBlendFunc(GL_ZERO, GL_SRC_ALPHA); BindTexture(gl_target, osdatex[osdtexCnt]); - glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0); + glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); #endif // render OSD glBlendFunc (GL_ONE, GL_ONE); BindTexture(gl_target, osdtex[osdtexCnt]); - glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0); + glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); glEndList(); osdtexCnt++; @@ -508,7 +509,7 @@ flip_page(void) glDrawTex(0, 0, image_width, image_height, 0, 0, image_width, image_height, texture_width, texture_height, - use_rectangle == 1, image_format == IMGFMT_YV12); + use_rectangle == 1, image_format == IMGFMT_YV12, mpi_flipped); if (image_format == IMGFMT_YV12) glDisableYUVConversion(gl_target, use_yuv); @@ -544,6 +545,7 @@ flip_page(void) //static inline uint32_t draw_slice_x11(uint8_t *src[], uint32_t slice_num) static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) { + mpi_flipped = (stride[0] < 0); glUploadTex(gl_target, gl_format, gl_type, src[0], stride[0], x, y, w, h, slice_height); if (image_format == IMGFMT_YV12) { @@ -612,6 +614,7 @@ static uint32_t draw_image(mp_image_t *mpi) { UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); slice = 0; // always "upload" full texture } + mpi_flipped = (mpi->stride[0] < 0); glUploadTex(gl_target, gl_format, gl_type, data, mpi->stride[0], mpi->x, mpi->y, mpi->w, mpi->h, slice); if (mpi->imgfmt == IMGFMT_YV12) { diff --git a/libvo/vo_gl2.c b/libvo/vo_gl2.c index 0c744fd73e..6274cf27e9 100644 --- a/libvo/vo_gl2.c +++ b/libvo/vo_gl2.c @@ -531,7 +531,8 @@ static void drawTextureDisplay () glDrawTex(square->fx, square->fy, square->fw, square->fh, 0, 0, texture_width, texture_height, - texture_width, texture_height, 0, image_format == IMGFMT_YV12); + texture_width, texture_height, + 0, image_format == IMGFMT_YV12, 0); square++; } /* for all texnumx */ } /* for all texnumy */ |