graphene_matrix_t matrix;
} GskGLRenderModelview;
+#define GDK_ARRAY_NAME modelviews
+#define GDK_ARRAY_TYPE_NAME Modelviews
+#define GDK_ARRAY_ELEMENT_TYPE GskGLRenderModelview
+#define GDK_ARRAY_BY_VALUE 1
+#define GDK_ARRAY_PREALLOC 16
+#define GDK_ARRAY_NO_MEMSET
+#include "gdk/gdkarrayimpl.c"
+
struct _GskGLRenderJob
{
/* The context containing the framebuffer we are drawing to. Generally this
/* An array of GskGLRenderModelview updated as nodes are processed. The
* current modelview is the last element.
*/
- GArray *modelview;
+ Modelviews modelview;
/* An array of GskGLRenderClip updated as nodes are processed. The
* current clip is the last element.
return clips_get (clips, len);
}
+static inline GskGLRenderModelview *
+modelviews_grow_one (Modelviews *modelviews)
+{
+ guint len = modelviews_get_size (modelviews);
+ modelviews_set_size (modelviews, len + 1);
+ return modelviews_get (modelviews, len);
+}
+
static inline int
get_target_format (GskGLRenderJob *job,
const GskRenderNode *node)
GskGLRenderModelview *modelview;
g_assert (job != NULL);
- g_assert (job->modelview != NULL);
job->driver->stamps[UNIFORM_SHARED_MODELVIEW]++;
- g_array_set_size (job->modelview, job->modelview->len + 1);
-
- modelview = &g_array_index (job->modelview,
- GskGLRenderModelview,
- job->modelview->len - 1);
+ modelview = modelviews_grow_one (&job->modelview);
modelview->transform = transform;
GskGLRenderModelview *modelview;
g_assert (job != NULL);
- g_assert (job->modelview != NULL);
g_assert (transform != NULL);
job->driver->stamps[UNIFORM_SHARED_MODELVIEW]++;
- g_array_set_size (job->modelview, job->modelview->len + 1);
+ modelview = modelviews_grow_one (&job->modelview);
- modelview = &g_array_index (job->modelview,
- GskGLRenderModelview,
- job->modelview->len - 1);
-
- if G_LIKELY (job->modelview->len > 1)
+ if G_LIKELY (modelviews_get_size (&job->modelview) > 1)
{
- GskGLRenderModelview *last;
+ GskGLRenderModelview *last = job->modelview.end - 2;
GskTransform *t = NULL;
- last = &g_array_index (job->modelview,
- GskGLRenderModelview,
- job->modelview->len - 2);
-
/* Multiply given matrix with our previous modelview */
t = gsk_transform_translate (gsk_transform_ref (last->transform),
&(graphene_point_t) {
const GskGLRenderModelview *head;
g_assert (job != NULL);
- g_assert (job->modelview);
- g_assert (job->modelview->len > 0);
+ g_assert (modelviews_get_size (&job->modelview) > 0);
job->driver->stamps[UNIFORM_SHARED_MODELVIEW]++;
gsk_transform_unref (head->transform);
- job->modelview->len--;
+ job->modelview.end--;
- if (job->modelview->len >= 1)
+ if (modelviews_get_size (&job->modelview) >= 1)
{
- head = &g_array_index (job->modelview, GskGLRenderModelview, job->modelview->len - 1);
+ head = job->modelview.end - 1;
job->scale_x = head->scale_x;
job->scale_y = head->scale_y;
GskTransformCategory category;
g_assert (job != NULL);
- g_assert (job->modelview->len > 0);
+ g_assert (modelviews_get_size (&job->modelview) > 0);
g_assert (rect != NULL);
g_assert (out_rect != NULL);
job->driver = g_object_ref (driver);
job->command_queue = job->driver->command_queue;
clips_init (&job->clip);
- job->modelview = g_array_sized_new (FALSE, FALSE, sizeof (GskGLRenderModelview), 16);
+ modelviews_init (&job->modelview);
job->framebuffer = framebuffer;
job->clear_framebuffer = !!clear_framebuffer;
job->default_framebuffer = default_framebuffer;
job->current_modelview = NULL;
job->current_clip = NULL;
- while (job->modelview->len > 0)
+ while (job->modelview.end > job->modelview.start)
{
- GskGLRenderModelview *modelview = &g_array_index (job->modelview, GskGLRenderModelview, job->modelview->len-1);
+ GskGLRenderModelview *modelview = job->modelview.end-1;
g_clear_pointer (&modelview->transform, gsk_transform_unref);
- job->modelview->len--;
+ job->modelview.end--;
}
g_clear_object (&job->driver);
g_clear_pointer (&job->region, cairo_region_destroy);
- g_clear_pointer (&job->modelview, g_array_unref);
+ modelviews_clear (&job->modelview);
clips_clear (&job->clip);
g_free (job);
}