mutter/cogl/cogl/cogl-framebuffer-driver.c
Jonas Ådahl 0fcb26075f cogl/framebuffer: Move read_pixels_into_bitmap() to driver class
This was the last driver vfunc used specifically to implement the
CoglFramebuffer driver.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1514>
2021-01-30 09:11:46 +00:00

225 lines
8.3 KiB
C

/*
* Copyright (C) 2007,2008,2009,2012 Intel Corporation.
* Copyright (C) 2019 DisplayLink (UK) Ltd.
* Copyright (C) 2020 Red Hat
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
#include "cogl-config.h"
#include "cogl-framebuffer-driver.h"
enum
{
PROP_0,
PROP_FRAMEBUFFER,
N_PROPS
};
static GParamSpec *obj_props[N_PROPS];
typedef struct _CoglFramebufferDriverPrivate
{
CoglFramebuffer *framebuffer;
} CoglFramebufferDriverPrivate;
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (CoglFramebufferDriver,
cogl_framebuffer_driver,
G_TYPE_OBJECT)
CoglFramebuffer *
cogl_framebuffer_driver_get_framebuffer (CoglFramebufferDriver *driver)
{
CoglFramebufferDriverPrivate *priv =
cogl_framebuffer_driver_get_instance_private (driver);
return priv->framebuffer;
}
void
cogl_framebuffer_driver_query_bits (CoglFramebufferDriver *driver,
CoglFramebufferBits *bits)
{
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver)->query_bits (driver, bits);
}
void
cogl_framebuffer_driver_clear (CoglFramebufferDriver *driver,
unsigned long buffers,
float red,
float green,
float blue,
float alpha)
{
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver)->clear (driver,
buffers,
red,
green,
blue,
alpha);
}
void
cogl_framebuffer_driver_finish (CoglFramebufferDriver *driver)
{
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver)->finish (driver);
}
void
cogl_framebuffer_driver_flush (CoglFramebufferDriver *driver)
{
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver)->flush (driver);
}
void
cogl_framebuffer_driver_discard_buffers (CoglFramebufferDriver *driver,
unsigned long buffers)
{
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver)->discard_buffers (driver, buffers);
}
void
cogl_framebuffer_driver_draw_attributes (CoglFramebufferDriver *driver,
CoglPipeline *pipeline,
CoglVerticesMode mode,
int first_vertex,
int n_vertices,
CoglAttribute **attributes,
int n_attributes,
CoglDrawFlags flags)
{
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver)->draw_attributes (driver,
pipeline,
mode,
first_vertex,
n_vertices,
attributes,
n_attributes,
flags);
}
void
cogl_framebuffer_driver_draw_indexed_attributes (CoglFramebufferDriver *driver,
CoglPipeline *pipeline,
CoglVerticesMode mode,
int first_vertex,
int n_vertices,
CoglIndices *indices,
CoglAttribute **attributes,
int n_attributes,
CoglDrawFlags flags)
{
CoglFramebufferDriverClass *klass =
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver);
klass->draw_indexed_attributes (driver,
pipeline,
mode,
first_vertex,
n_vertices,
indices,
attributes,
n_attributes,
flags);
}
gboolean
cogl_framebuffer_driver_read_pixels_into_bitmap (CoglFramebufferDriver *driver,
int x,
int y,
CoglReadPixelsFlags source,
CoglBitmap *bitmap,
GError **error)
{
CoglFramebufferDriverClass *klass =
COGL_FRAMEBUFFER_DRIVER_GET_CLASS (driver);
return klass->read_pixels_into_bitmap (driver, x, y, source, bitmap, error);
}
static void
cogl_framebuffer_driver_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
CoglFramebufferDriver *driver = COGL_FRAMEBUFFER_DRIVER (object);
CoglFramebufferDriverPrivate *priv =
cogl_framebuffer_driver_get_instance_private (driver);
switch (prop_id)
{
case PROP_FRAMEBUFFER:
g_value_set_object (value, priv->framebuffer);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
cogl_framebuffer_driver_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
CoglFramebufferDriver *driver = COGL_FRAMEBUFFER_DRIVER (object);
CoglFramebufferDriverPrivate *priv =
cogl_framebuffer_driver_get_instance_private (driver);
switch (prop_id)
{
case PROP_FRAMEBUFFER:
priv->framebuffer = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
cogl_framebuffer_driver_init (CoglFramebufferDriver *driver)
{
}
static void
cogl_framebuffer_driver_class_init (CoglFramebufferDriverClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->get_property = cogl_framebuffer_driver_get_property;
object_class->set_property = cogl_framebuffer_driver_set_property;
obj_props[PROP_FRAMEBUFFER] =
g_param_spec_object ("framebuffer",
"framebuffer",
"CoglFramebuffer",
COGL_TYPE_FRAMEBUFFER,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, obj_props);
}