summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
Diffstat (limited to 'video')
-rw-r--r--video/out/opengl/utils.c11
-rw-r--r--video/out/opengl/utils.h2
-rw-r--r--video/out/vo_opengl.c3
3 files changed, 7 insertions, 9 deletions
diff --git a/video/out/opengl/utils.c b/video/out/opengl/utils.c
index 6c879fd535..aa43728cb8 100644
--- a/video/out/opengl/utils.c
+++ b/video/out/opengl/utils.c
@@ -100,13 +100,11 @@ void gl_upload_tex(GL *gl, GLenum target, GLenum format, GLenum type,
gl->PixelStorei(GL_UNPACK_ALIGNMENT, 4);
}
-mp_image_t *gl_read_window_contents(GL *gl)
+mp_image_t *gl_read_window_contents(GL *gl, int w, int h)
{
if (gl->es)
return NULL; // ES can't read from front buffer
- GLint vp[4]; //x, y, w, h
- gl->GetIntegerv(GL_VIEWPORT, vp);
- mp_image_t *image = mp_image_alloc(IMGFMT_RGB24, vp[2], vp[3]);
+ mp_image_t *image = mp_image_alloc(IMGFMT_RGB24, w, h);
if (!image)
return NULL;
gl->BindFramebuffer(GL_FRAMEBUFFER, gl->main_fb);
@@ -114,9 +112,8 @@ mp_image_t *gl_read_window_contents(GL *gl)
gl->PixelStorei(GL_PACK_ALIGNMENT, 1);
gl->ReadBuffer(obj);
//flip image while reading (and also avoid stride-related trouble)
- for (int y = 0; y < vp[3]; y++) {
- gl->ReadPixels(vp[0], vp[1] + vp[3] - y - 1, vp[2], 1,
- GL_RGB, GL_UNSIGNED_BYTE,
+ for (int y = 0; y < h; y++) {
+ gl->ReadPixels(0, h - y - 1, w, 1, GL_RGB, GL_UNSIGNED_BYTE,
image->planes[0] + y * image->stride[0]);
}
gl->PixelStorei(GL_PACK_ALIGNMENT, 4);
diff --git a/video/out/opengl/utils.h b/video/out/opengl/utils.h
index 33c2daa5be..f4e522cdf7 100644
--- a/video/out/opengl/utils.h
+++ b/video/out/opengl/utils.h
@@ -30,7 +30,7 @@ void gl_upload_tex(GL *gl, GLenum target, GLenum format, GLenum type,
const void *dataptr, int stride,
int x, int y, int w, int h);
-mp_image_t *gl_read_window_contents(GL *gl);
+mp_image_t *gl_read_window_contents(GL *gl, int w, int h);
const char* mp_sampler_type(GLenum texture_target);
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index 508ba9cda9..7f65a1eafc 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -272,7 +272,8 @@ static int control(struct vo *vo, uint32_t request, void *data)
return VO_NOTIMPL;
}
case VOCTRL_SCREENSHOT_WIN: {
- struct mp_image *screen = gl_read_window_contents(p->gl);
+ struct mp_image *screen =
+ gl_read_window_contents(p->gl, vo->dwidth, vo->dheight);
if (!screen)
break; // redirect to backend
// set image parameters according to the display, if possible