/* Idle handler for the drawing process. We pull a rectangle from the dirty * region microtile array, paint it, and leave the rest to the next idle * iteration. */ static gboolean paint_iteration_idle (gpointer data) { ImageView *view; ImageViewPrivate *priv; ArtIRect rect; view = IMAGE_VIEW (data); priv = view->priv; g_assert (priv->uta != NULL); pull_rectangle (priv->uta, &rect, PAINT_RECT_WIDTH, PAINT_RECT_HEIGHT); if (art_irect_empty (&rect)) { art_uta_free (priv->uta); priv->uta = NULL; } else paint_rectangle (view, &rect, priv->interp_type); if (!priv->uta) { priv->idle_id = 0; return FALSE; } return TRUE; }
/* Frees the dirty region uta and removes the idle handler */ static void remove_dirty_region (ImageView *view) { ImageViewPrivate *priv; priv = view->priv; if (priv->uta) { g_assert (priv->idle_id != 0); art_uta_free (priv->uta); priv->uta = NULL; g_source_remove (priv->idle_id); priv->idle_id = 0; } else g_assert (priv->idle_id == 0); }
static MateComponent_Canvas_ArtUTA * impl_MateComponent_Canvas_Component_update (PortableServer_Servant servant, const MateComponent_Canvas_State *state, const MateComponent_Canvas_affine aff, const MateComponent_Canvas_SVP *clip_path, CORBA_long flags, CORBA_double *x1, CORBA_double *y1, CORBA_double *x2, CORBA_double *y2, CORBA_Environment *ev) { Gcc *gcc = GCC (matecomponent_object_from_servant (servant)); MateCanvasItem *item = MATE_CANVAS_ITEM (gcc->priv->item); double affine [6]; int i; ArtSVP *svp = NULL; MateComponent_Canvas_ArtUTA *cuta; MateCanvasItemClass *gci_class = g_type_class_ref ( mate_canvas_item_get_type ()); restore_state (item, state); for (i = 0; i < 6; i++) affine [i] = aff [i]; if (clip_path->_length > 0) { svp = art_alloc (sizeof (ArtSVP) + (clip_path->_length * sizeof (ArtSVPSeg))); if (svp == NULL) goto fail; svp->n_segs = clip_path->_length; for (i = 0; svp->n_segs; i++) { gboolean ok; ok = CORBA_SVP_Segment_to_SVPSeg (&clip_path->_buffer [i], &svp->segs [i]); if (!ok) { int j; for (j = 0; j < i; j++) { free_seg (&svp->segs [j]); art_free (svp); goto fail; } } } } invoke_update (item, (double *)aff, svp, flags); if (svp){ for (i = 0; i < svp->n_segs; i++) free_seg (&svp->segs [i]); art_free (svp); } fail: if (getenv ("CC_DEBUG")) printf ("%g %g %g %g\n", item->x1, item->x2, item->y1, item->y2); *x1 = item->x1; *x2 = item->x2; *y1 = item->y1; *y2 = item->y2; cuta = CORBA_UTA (item->canvas->redraw_area); if (cuta == NULL) { CORBA_exception_set_system (ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO); return NULL; } /* * Now, mark our canvas as fully up to date */ /* Clears flags for root item. */ (* gci_class->update) (item->canvas->root, affine, svp, flags); if (item->canvas->redraw_area) { art_uta_free (item->canvas->redraw_area); item->canvas->redraw_area = NULL; } item->canvas->need_redraw = FALSE; return cuta; }