Пример #1
0
Файл: wpg.c Проект: mpuels/dia
static void
draw_beziergon (DiaRenderer *self, 
		BezPoint *points,
		int numpoints,
		Color *fill,
		Color *stroke)
{
  DIAG_NOTE(g_message("draw_beziezgon %d points", numpoints));

#if 1
  /* Use fallback from base class until another program can
   * actually correctly show the filled Polycurve created
   * by Dia (our own import can).
   */
  if (fill)
    DIA_RENDERER_CLASS(parent_class)->draw_beziergon (self, points, numpoints, fill, NULL);
#else
  if (fill) {
    WpgRenderer *renderer = WPG_RENDERER (self);

    WriteFillAttr(renderer, fill, TRUE);
    draw_bezier (self, points, numpoints, fill);
    WriteFillAttr(renderer, fill, FALSE);
  }
#endif
  if (stroke) /* XXX: still not closing the path */
    draw_bezier (self, points, numpoints, stroke);
}
Пример #2
0
static void
cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass)
{
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  gobject_class->finalize = cairo_interactive_renderer_finalize;

  gobject_class->set_property = cairo_interactive_renderer_set_property;
  gobject_class->get_property = cairo_interactive_renderer_get_property;

  g_object_class_install_property (gobject_class,
				   PROP_ZOOM,
				   g_param_spec_pointer ("zoom",
 							_("Zoom pointer"),
							_("Zoom pointer"),
							G_PARAM_READWRITE));

  g_object_class_install_property (gobject_class,
				   PROP_RECT,
				   g_param_spec_pointer ("rect",
 							_("Visible rect pointer"),
							_("Visible rect pointer"),
							G_PARAM_READWRITE));
							
  /* renderer members */
  renderer_class->get_width_pixels  = get_width_pixels;
  renderer_class->get_height_pixels = get_height_pixels;

  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;
}
Пример #3
0
static void
draw_object (DiaRenderer *self, DiaObject *object, DiaMatrix *matrix)
{
    WmfRenderer *renderer = WMF_RENDERER (self);
    W32::XFORM xFormPrev = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
    int mode = W32::GetGraphicsMode (renderer->hFileDC);
    gboolean fallback = FALSE;

    if (matrix) {
        if (   W32::SetGraphicsMode (renderer->hFileDC, GM_ADVANCED)
            && W32::GetWorldTransform (renderer->hFileDC, &xFormPrev)) {

            W32::XFORM xForm;

            xForm.eM11 = matrix->xx;
            xForm.eM12 = matrix->yx;
            xForm.eM21 = matrix->xy;
            xForm.eM22 = matrix->yy;
            xForm.eDx = matrix->x0;
            xForm.eDy = matrix->y0;
            if (!W32::SetWorldTransform (renderer->hFileDC, &xForm))
                fallback = TRUE;
        }
    }

    if (fallback)
        DIA_RENDERER_CLASS (parent_class)->draw_object (self, object, matrix);
    else
        object->ops->draw(object, DIA_RENDERER (renderer));

    if (matrix)
        W32::SetWorldTransform (renderer->hFileDC, &xFormPrev);

    W32::SetGraphicsMode (renderer->hFileDC, mode);
}
Пример #4
0
/*!
 * \brief Advertise the renderer's capabilities
 * \memberof _DiaTransformRenderer
 */
static gboolean
is_capable_to (DiaRenderer *renderer, RenderCapability cap)
{
  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
  gboolean bRet = FALSE;

  func = PyObject_GetAttrString (self, "is_capable_to");
  if (func && PyCallable_Check(func)) {
    Py_INCREF(self);
    Py_INCREF(func);
    arg = Py_BuildValue ("(i)", cap);
    if (arg) {
      res = PyEval_CallObject (func, arg);
      if (res && PyInt_Check(res)) {
        bRet = (PyInt_AsLong(res) != 0);
        Py_DECREF (res);
      } else {
        ON_RES(res, FALSE);
      }
    }
    Py_XDECREF(arg);
    Py_DECREF(func);
    Py_DECREF(self);
  } else {
    PyErr_Clear(); /* member optional */
    return DIA_RENDERER_CLASS (parent_class)->is_capable_to (renderer, cap);
  }
  return bRet;
}
Пример #5
0
static void
end_render (DiaRenderer *self)
{
  SvgRenderer *renderer = SVG_RENDERER (self);
  g_assert (g_queue_is_empty (renderer->parents));
  DIA_RENDERER_CLASS (parent_class)->end_render (DIA_RENDERER (self));
}
Пример #6
0
/*!
 * \brief Draw polyline
 *
 * Optional on the PyDia side. If not implemented fallback to base class member.
 *
 * \memberof _DiaPyRenderer
 */
static void
draw_polyline(DiaRenderer *renderer, 
	      Point *points, int num_points, 
	      Color *line_colour)
{
  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);

  func = PyObject_GetAttrString (self, "draw_polyline");
  if (func && PyCallable_Check(func)) {
    PyObject *optt = PyDiaPointTuple_New (points, num_points);
    PyObject *ocolor = PyDiaColor_New (line_colour);

    Py_INCREF(self);
    Py_INCREF(func);
    arg = Py_BuildValue ("(OO)", optt, ocolor);
    if (arg) {
      res = PyEval_CallObject (func, arg);
      ON_RES(res, FALSE);
    }
    Py_XDECREF (arg);
    Py_XDECREF (optt);
    Py_XDECREF (ocolor);
    Py_DECREF(func);
    Py_DECREF(self);
  }
  else { /* member optional */
    PyErr_Clear();
    /* XXX: implementing the same fallback as DiaRenderer */
    DIA_RENDERER_CLASS (parent_class)->draw_polyline (renderer, points, num_points, line_colour);
  }
}
Пример #7
0
/*!
 * \brief Draw object
 *
 * Optional on the PyDia side. If not implemented the base class method
 * will be called.
 *
 * Intercepting this method on the Python side allows to create per 
 * object information in the drawing. It is also necessary if the PyDia 
 * renderer should support transformations.
 *
 * If implementing a drawing export filter and overwriting draw_object()
 * the following code shall be used. Otherwise no draw/fill method will
 * be called at all.
 *
 * \code
	# don't forget to render the object
	object.draw (self)
 * \endcode
 *
 * Not calling the object draw method is only useful when a non-drawing
 * export - e.g. code generation \sa codegen.py - is implemented.
 *
 * @param renderer Self
 * @param object The object to draw
 * @param matrix The transformation matrix to use or NULL for no transformation
 *
 * \memberof _DiaPyRenderer
 */
static void
draw_object (DiaRenderer *renderer, DiaObject *object, DiaMatrix *matrix)
{
  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);

  func = PyObject_GetAttrString (self, "draw_object");
  if (func && PyCallable_Check(func)) {
    PyObject *oobj = PyDiaObject_New (object);
    PyObject *mat = NULL;

    Py_INCREF(self);
    Py_INCREF(func);
    if (matrix)
      mat = PyDiaMatrix_New (matrix);
    else {
      Py_INCREF(Py_None);
      mat = Py_None;
    }
    arg = Py_BuildValue ("(OO)", oobj, mat);
    if (arg) {
      res = PyEval_CallObject (func, arg);
      ON_RES(res, FALSE);
    }
    Py_XDECREF (arg);
    Py_XDECREF (oobj);
    Py_XDECREF (mat);
    Py_DECREF(func);
    Py_DECREF(self);
  } else { /* member optional */
    PyErr_Clear();
    /* but should still call the base class */
    DIA_RENDERER_CLASS (parent_class)->draw_object (renderer, object, matrix);
  }
}
Пример #8
0
Файл: hpgl.c Проект: mpuels/dia
static void
hpgl_renderer_class_init (HpglRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = hpgl_renderer_finalize;

  /* renderer members */
  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;

  renderer_class->set_linewidth  = set_linewidth;
  renderer_class->set_linecaps   = set_linecaps;
  renderer_class->set_linejoin   = set_linejoin;
  renderer_class->set_linestyle  = set_linestyle;
  renderer_class->set_fillstyle  = set_fillstyle;

  renderer_class->set_font  = set_font;

  renderer_class->draw_line    = draw_line;
  renderer_class->draw_polygon = draw_polygon;
  renderer_class->draw_arc     = draw_arc;
  renderer_class->fill_arc     = fill_arc;
  renderer_class->draw_ellipse = draw_ellipse;

  renderer_class->draw_string  = draw_string;
  renderer_class->draw_image   = draw_image;

  /* medium level functions */
  renderer_class->draw_rect = draw_rect;
  renderer_class->draw_polyline  = draw_polyline;
}
Пример #9
0
/* kept for backward compatibility, not any longer in the renderer interface */
static void
fill_bezier(DiaRenderer *renderer, 
	    BezPoint *points, /* Last point must be same as first point */
	    int num_points,
	    Color *colour)
{
  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);

  func = PyObject_GetAttrString (self, "fill_bezier");
  if (func && PyCallable_Check(func)) {
    PyObject *obt = PyDiaBezPointTuple_New (points, num_points);
    PyObject *ocolor = PyDiaColor_New (colour);
    Py_INCREF(self);
    Py_INCREF(func);
    arg = Py_BuildValue ("(OO)", obt, ocolor);
    if (arg) {
      res = PyEval_CallObject (func, arg);
      ON_RES(res, FALSE);
    }
    Py_XDECREF (arg);
    Py_XDECREF (obt);
    Py_XDECREF (ocolor);
    Py_DECREF(func);
    Py_DECREF(self);
  }
  else { /* member optional */
    PyErr_Clear();
    /* XXX: implementing the same fallback as DiaRenderer would do */
    DIA_RENDERER_CLASS (parent_class)->draw_beziergon (renderer, points, num_points, colour, NULL);
  }
}
Пример #10
0
static void
drs_renderer_class_init (DrsRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = drs_renderer_finalize;

  /* renderer members */
  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;

  renderer_class->draw_object = draw_object;

  renderer_class->set_linewidth  = set_linewidth;
  renderer_class->set_linecaps   = set_linecaps;
  renderer_class->set_linejoin   = set_linejoin;
  renderer_class->set_linestyle  = set_linestyle;
  renderer_class->set_dashlength = set_dashlength;
  renderer_class->set_fillstyle  = set_fillstyle;

  renderer_class->set_font  = set_font;

  renderer_class->draw_line    = draw_line;
  renderer_class->fill_polygon = fill_polygon;
  renderer_class->draw_rect    = draw_rect;
  renderer_class->fill_rect    = fill_rect;
  renderer_class->draw_arc     = draw_arc;
  renderer_class->fill_arc     = fill_arc;
  renderer_class->draw_ellipse = draw_ellipse;
  renderer_class->fill_ellipse = fill_ellipse;

  renderer_class->draw_string  = draw_string;
  renderer_class->draw_image   = draw_image;

  /* medium level functions */
  renderer_class->draw_rect = draw_rect;
  renderer_class->draw_polyline  = draw_polyline;
  renderer_class->draw_polygon   = draw_polygon;

  renderer_class->draw_bezier   = draw_bezier;
  renderer_class->fill_bezier   = fill_bezier;

  renderer_class->draw_rounded_polyline = draw_rounded_polyline;
  /* highest level functions */
  renderer_class->draw_rounded_rect = draw_rounded_rect;
  renderer_class->fill_rounded_rect = fill_rounded_rect;
#if 0
  renderer_class->draw_text  = draw_text;
  renderer_class->draw_text_line  = draw_text_line;
  /* TODO: more to come ... */
#endif
}
Пример #11
0
static void
draw_rect (DiaRenderer *self, 
           Point *ul_corner, Point *lr_corner,
           Color *colour) 
{
  ShapeRenderer *renderer = SHAPE_RENDERER(self);

  /* use base class implementation */
  DIA_RENDERER_CLASS(parent_class)->draw_rect (self, ul_corner, lr_corner, colour);
  /* do our own stuff */
  add_rectangle_connection_points(renderer, ul_corner, lr_corner);
}
Пример #12
0
/** Initialize members of the renderer class object.  This sets up a bunch
 * of functions to call for various render functions.
 * @param klass The class object to initialize. 
 */
static void
dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = renderer_finalize;

  renderer_class->get_width_pixels  = get_width_pixels;
  renderer_class->get_height_pixels = get_height_pixels;

  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;

  renderer_class->set_linewidth  = set_linewidth;
  renderer_class->set_linecaps   = set_linecaps;
  renderer_class->set_linejoin   = set_linejoin;
  renderer_class->set_linestyle  = set_linestyle;
  renderer_class->set_dashlength = set_dashlength;
  renderer_class->set_fillstyle  = set_fillstyle;

  renderer_class->draw_line    = draw_line;
  renderer_class->fill_polygon = fill_polygon;
  renderer_class->draw_rect    = draw_rect;
  renderer_class->fill_rect    = fill_rect;
  renderer_class->draw_arc     = draw_arc;
  renderer_class->fill_arc     = fill_arc;
  renderer_class->draw_ellipse = draw_ellipse;
  renderer_class->fill_ellipse = fill_ellipse;

  /* use <draw|fill>_bezier from DiaRenderer */

  renderer_class->draw_string  = draw_string;
  renderer_class->draw_text_line = draw_text_line;
  renderer_class->draw_image   = draw_image;

  /* medium level functions */
  renderer_class->draw_rect = draw_rect;
  renderer_class->draw_polyline  = draw_polyline;
  renderer_class->draw_polygon   = draw_polygon;
  renderer_class->draw_object    = draw_object;

  /* highest level functions */
  renderer_class->draw_rounded_rect = draw_rounded_rect;
  renderer_class->fill_rounded_rect = fill_rounded_rect;

  /* Interactive functions */
  renderer_class->get_text_width = get_text_width;
}
Пример #13
0
static void
draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
             Color *colour)
{
  ShapeRenderer *renderer = SHAPE_RENDERER(self);

  /* use base class implementation */
  DIA_RENDERER_CLASS(parent_class)->draw_ellipse (self, center, width, height, colour);

  /* do our own stuff */
  add_ellipse_connection_points(renderer, center, width, height);
}
Пример #14
0
static void
dia_py_renderer_class_init (DiaPyRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = dia_py_renderer_finalize;

  /* all defined members from above */
  /* renderer members */
  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;

  renderer_class->draw_layer = draw_layer;
  renderer_class->draw_object  = draw_object;

  renderer_class->set_linewidth  = set_linewidth;
  renderer_class->set_linecaps   = set_linecaps;
  renderer_class->set_linejoin   = set_linejoin;
  renderer_class->set_linestyle  = set_linestyle;
  renderer_class->set_fillstyle  = set_fillstyle;

  renderer_class->set_font  = set_font;

  renderer_class->draw_line    = draw_line;
  renderer_class->draw_polygon = draw_polygon;
  renderer_class->draw_arc     = draw_arc;
  renderer_class->fill_arc     = fill_arc;
  renderer_class->draw_ellipse = draw_ellipse;

  renderer_class->draw_string  = draw_string;
  renderer_class->draw_image   = draw_image;

  /* medium level functions */
  renderer_class->draw_rect      = draw_rect;
  renderer_class->draw_polyline  = draw_polyline;

  renderer_class->draw_bezier   = draw_bezier;
  renderer_class->draw_beziergon = draw_beziergon;

  /* highest level functions */
  renderer_class->draw_rounded_rect = draw_rounded_rect;
  /* other */
  renderer_class->is_capable_to = is_capable_to;
}
Пример #15
0
static void
dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);
  DiaSvgRendererClass *svg_renderer_class = DIA_SVG_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = dia_svg_renderer_finalize;

  /* renderer members */
  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;

  renderer_class->is_capable_to = is_capable_to;

  renderer_class->set_linewidth  = set_linewidth;
  renderer_class->set_linecaps   = set_linecaps;
  renderer_class->set_linejoin   = set_linejoin;
  renderer_class->set_linestyle  = set_linestyle;
  renderer_class->set_fillstyle  = set_fillstyle;
  renderer_class->set_pattern    = set_pattern;

  renderer_class->draw_line    = draw_line;
  renderer_class->draw_polygon = draw_polygon;
  renderer_class->draw_arc     = draw_arc;
  renderer_class->fill_arc     = fill_arc;
  renderer_class->draw_ellipse = draw_ellipse;

  renderer_class->draw_string  = draw_string;
  renderer_class->draw_image   = draw_image;

  /* medium level functions */
  renderer_class->draw_rect = draw_rect;
  renderer_class->draw_polyline  = draw_polyline;

  renderer_class->draw_bezier   = draw_bezier;
  renderer_class->draw_beziergon = draw_beziergon;
  renderer_class->draw_text_line  = draw_text_line;

  /* high level */
  renderer_class->draw_rounded_rect = draw_rounded_rect;

  /* SVG specific */
  svg_renderer_class->get_draw_style = get_draw_style;
}
Пример #16
0
static void
shape_renderer_class_init (ShapeRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = shape_renderer_finalize;

  /* dia svg renderer overwrites */
  renderer_class->end_render = end_render;
  renderer_class->draw_line = draw_line;
  renderer_class->draw_polyline = draw_polyline;
  renderer_class->draw_polygon = draw_polygon;
  renderer_class->draw_rect = draw_rect;
  renderer_class->draw_ellipse = draw_ellipse;
}
Пример #17
0
static void
draw_line(DiaRenderer *self, 
	  Point *start, Point *end, 
	  Color *line_colour)
{
  Point center;
  ShapeRenderer *renderer = SHAPE_RENDERER(self);

  /* use base class implementation */
  DIA_RENDERER_CLASS(parent_class)->draw_line (self, start, end, line_colour);

  /* do our own stuff */
  add_connection_point(renderer, start, FALSE, FALSE);
  add_connection_point(renderer, end, FALSE, FALSE);
  center.x = (start->x + end->x)/2;
  center.y = (start->y + end->y)/2;
  add_connection_point(renderer, &center, FALSE, FALSE);

}
Пример #18
0
static void
dia_ps_ft2_renderer_class_init (DiaPsFt2RendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);
  DiaPsRendererClass *ps_renderer_class = DIA_PS_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = dia_ps_ft2_renderer_finalize;

  renderer_class->set_font     = set_font;
  renderer_class->draw_string  = draw_string;

  renderer_class->draw_text_line = draw_text_line;

  /* ps specific */
  ps_renderer_class->dump_fonts   = dump_fonts;
}
Пример #19
0
static void
svg_renderer_class_init (SvgRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = svg_renderer_finalize;

  renderer_class->begin_render = begin_render;
  renderer_class->end_render = end_render;
  renderer_class->draw_object = draw_object;
  renderer_class->draw_rounded_rect = draw_rounded_rect;
  renderer_class->fill_rounded_rect = fill_rounded_rect;
  renderer_class->draw_string  = draw_string;
  renderer_class->draw_text  = draw_text;
  renderer_class->draw_text_line  = draw_text_line;
}
Пример #20
0
static void
draw_rounded_rect(DiaRenderer *renderer, 
	  Point *ul_corner, Point *lr_corner,
	  Color *fill, Color *stroke, real rounding)
{
  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);

  func = PyObject_GetAttrString (self, "draw_rounded_rect");
  if (func && PyCallable_Check(func)) {
    PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
    PyObject *fill_po, *stroke_po;

    Py_INCREF(self);
    Py_INCREF(func);
    if (fill)
      fill_po = PyDiaColor_New (fill);
    else
      Py_INCREF(Py_None), fill_po = Py_None;
    if (stroke)
      stroke_po = PyDiaColor_New (stroke);
    else
      Py_INCREF(Py_None), stroke_po = Py_None;

    arg = Py_BuildValue ("(OOOd)", orect, fill_po, stroke_po, rounding);
    if (arg) {
      res = PyEval_CallObject (func, arg);
      ON_RES(res, FALSE);
    }
    Py_XDECREF (arg);
    Py_XDECREF (fill_po);
    Py_XDECREF (stroke_po);
    Py_XDECREF (orect);
    Py_DECREF(func);
    Py_DECREF(self);
  }
  else { /* member optional */
    PyErr_Clear();
    /* implementing the same fallback as DiaRenderer would do */
    DIA_RENDERER_CLASS (parent_class)->draw_rounded_rect (renderer, ul_corner, lr_corner,
							  fill, stroke, rounding);
  }
}
Пример #21
0
/* full overwrite */
static void 
draw_object(DiaRenderer *self,
            DiaObject   *object,
	    DiaMatrix   *matrix)
{
  Point center;
  ShapeRenderer *renderer = SHAPE_RENDERER(self);
  gboolean main_point = (0 == strncmp(MAIN_CONNECTION_POINT_SHAPE, 
  	               object->type->name, strlen(MAIN_CONNECTION_POINT_SHAPE)));

  if ((0 == strncmp(CONNECTION_POINT_SHAPE, object->type->name, 
  	 strlen(CONNECTION_POINT_SHAPE))) || main_point) {
	  /* add user defined connection point */
	  center.x = (object->bounding_box.left + object->bounding_box.right)/2;
	  center.y = (object->bounding_box.top + object->bounding_box.bottom)/2;
	  add_connection_point(renderer, &center, TRUE, main_point);
  } else {
  	/* use base class implementation */
    DIA_RENDERER_CLASS(parent_class)->draw_object (self, object, matrix);
  }
}
Пример #22
0
static void
dia_ps_renderer_class_init (DiaPsRendererClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
  DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass);
  DiaPsRendererClass *ps_renderer_class = DIA_PS_RENDERER_CLASS (klass);

  parent_class = g_type_class_peek_parent (klass);

  object_class->finalize = dia_ps_renderer_finalize;

  renderer_class->begin_render = begin_render;
  renderer_class->end_render   = end_render;

  renderer_class->set_linewidth  = set_linewidth;
  renderer_class->set_linecaps   = set_linecaps;
  renderer_class->set_linejoin   = set_linejoin;
  renderer_class->set_linestyle  = set_linestyle;
  renderer_class->set_fillstyle  = set_fillstyle;
  renderer_class->set_font       = set_font;

  renderer_class->draw_line    = draw_line;
  renderer_class->draw_polygon = draw_polygon;
  renderer_class->draw_arc     = draw_arc;
  renderer_class->fill_arc     = fill_arc;
  renderer_class->draw_ellipse = draw_ellipse;
  renderer_class->draw_string  = draw_string;
  renderer_class->draw_image   = draw_image;

  /* medium level functions */
  renderer_class->draw_bezier  = draw_bezier;
  renderer_class->draw_beziergon  = draw_beziergon;
  renderer_class->draw_polyline  = draw_polyline;

  /* ps specific */
  ps_renderer_class->begin_prolog = begin_prolog;
  ps_renderer_class->dump_fonts = dump_fonts;
  ps_renderer_class->end_prolog = end_prolog;
}
Пример #23
0
/*! 
 * \brief Render all the visible object in the layer
 * @param renderer explicit this pointer
 * @param layer    layer to draw
 * @param active   TRUE if it is the currently active layer
 * @param update   the update rectangle, NULL for unlimited
 *
 * \memberof _DiaPyRenderer
 */
static void
draw_layer (DiaRenderer *renderer,
	    Layer       *layer,
	    gboolean     active,
	    Rectangle   *update)
{
  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);

  func = PyObject_GetAttrString (self, "draw_layer");
  if (func && PyCallable_Check(func)) {
    PyObject *olayer = PyDiaLayer_New (layer);
    PyObject *orect;

    Py_INCREF (self);
    Py_INCREF (func);
    if (update) {
      orect = PyDiaRectangle_New (update, NULL);
    } else {
      Py_INCREF(Py_None);
      orect = Py_None;
    }
    arg = Py_BuildValue ("(OiO)", olayer, active, orect);
    if (arg) {
      res = PyEval_CallObject (func, arg);
      ON_RES(res, FALSE);
    }
    Py_XDECREF (olayer);
    Py_XDECREF (orect);
    Py_DECREF(func);
    Py_DECREF(self);
  } else { /* member optional */
    PyErr_Clear();
    /* have to call the base class */
    DIA_RENDERER_CLASS (parent_class)->draw_layer (renderer, layer, active, update);
  }
}