summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m40
1 files changed, 28 insertions, 12 deletions
diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
index df481441a..f0333b94c 100644
--- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
+++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
@@ -83,6 +83,9 @@ struct _GstGLWindowCocoaPrivate
gboolean visible;
GMainContext *main_context;
GMainLoop *loop;
+
+ GLint viewport_dim[4];
+ NSRect bounds, visibleRect;
};
static void
@@ -505,7 +508,6 @@ struct resize
{
GstGLWindowCocoa * window;
NSRect bounds, visibleRect;
- NSSize frameSize;
};
static void
@@ -518,12 +520,29 @@ resize_cb (gpointer data)
NSOpenGLContext * glContext = (NSOpenGLContext *) gst_gl_context_get_gl_context (context);
if (g_main_loop_is_running (window_cocoa->priv->loop) && ![window_cocoa->priv->internal_win_id isClosed]) {
- /* FIXME: Need to adjust viewport for clipping here */
- if (window->resize) {
- window->resize (window->resize_data, resize_data->bounds.size.width, resize_data->bounds.size.height);
- }
+ const GstGLFuncs *gl;
[glContext update];
+
+ if (window_cocoa->priv->bounds.size.width != resize_data->bounds.size.width ||
+ window_cocoa->priv->bounds.size.height != resize_data->bounds.size.height ||
+ window_cocoa->priv->visibleRect.origin.x != resize_data->visibleRect.origin.x ||
+ window_cocoa->priv->visibleRect.origin.y != resize_data->visibleRect.origin.y) {
+ gl = context->gl_vtable;
+
+ if (window->resize) {
+ window->resize (window->resize_data, resize_data->bounds.size.width, resize_data->bounds.size.height);
+ gl->GetIntegerv (GL_VIEWPORT, window_cocoa->priv->viewport_dim);
+ }
+
+ gl->Viewport (window_cocoa->priv->viewport_dim[0] - resize_data->visibleRect.origin.x,
+ window_cocoa->priv->viewport_dim[1] - resize_data->visibleRect.origin.y,
+ window_cocoa->priv->viewport_dim[2], window_cocoa->priv->viewport_dim[3]);
+
+ window_cocoa->priv->visibleRect = resize_data->visibleRect;
+ window_cocoa->priv->bounds = resize_data->bounds;
+ }
+
GST_GL_WINDOW (window_cocoa)->draw (GST_GL_WINDOW (window_cocoa)->draw_data);
[glContext flushBuffer];
}
@@ -542,21 +561,18 @@ resize_cb (gpointer data)
if (window->resize) {
NSRect bounds = [self bounds];
NSRect visibleRect = [self visibleRect];
- NSSize frameSize = [self frame].size;
struct resize *resize_data = g_new (struct resize, 1);
- GST_DEBUG_OBJECT (window, "Window resized: bounds %lf %lf %lf %lf, "
- "visibleRect %lf %lf %lf %lf, frame size %lf %lf",
+ GST_DEBUG_OBJECT (window, "Window resized: bounds %lf %lf %lf %lf "
+ "visibleRect %lf %lf %lf %lf",
bounds.origin.x, bounds.origin.y,
bounds.size.width, bounds.size.height,
visibleRect.origin.x, visibleRect.origin.y,
- visibleRect.size.width, visibleRect.size.height,
- frameSize.width, frameSize.height);
+ visibleRect.size.width, visibleRect.size.height);
resize_data->window = window_cocoa;
resize_data->bounds = bounds;
resize_data->visibleRect = visibleRect;
- resize_data->frameSize = frameSize;
gst_gl_window_send_message_async (GST_GL_WINDOW (window_cocoa), (GstGLWindowCB) resize_cb, resize_data, (GDestroyNotify) g_free);
}
@@ -567,7 +583,7 @@ resize_cb (gpointer data)
}
- (BOOL) isFlipped {
- return YES;
+ return NO;
}
@end