Esempio n. 1
0
static gboolean
export_render_eps(DiaPsRenderer *renderer, 
		  DiagramData *data, DiaContext *ctx,
		  const gchar *filename, const gchar *diafilename,
		  void* user_data)
{
  FILE *outfile;

  outfile = g_fopen(filename, "w");
  if (outfile == NULL) {
    dia_context_add_message_with_errno (ctx, errno, _("Can't open output file %s"), 
					dia_context_get_filename(ctx));
    return FALSE;
  }
  renderer->file = outfile;
  renderer->scale = 28.346 * data->paper.scaling;
  renderer->extent = data->extents;
  renderer->pstype = (guint)user_data;
  if (renderer->pstype & PSTYPE_EPSI) {
    /* Must store the diagram for making a preview */
    renderer->diagram = data;
  }

  if (renderer->file) {
    renderer->title = g_strdup (diafilename);

    data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);
  }
  fclose(outfile);

  return TRUE;
}
Esempio n. 2
0
gboolean
PyDia_export_data(DiagramData *data, DiaContext *ctx,
		  const gchar *filename, const gchar *diafilename, void* user_data)
{
  DiaPyRenderer *renderer;

  {
    FILE *file;
    file = g_fopen(filename, "w"); /* "wb" for binary! */

    if (file == NULL) {
      dia_context_add_message_with_errno(ctx, errno, _("Couldn't open '%s' for writing.\n"), 
				         dia_context_get_filename(ctx));
      return FALSE;
    }
    else
      fclose (file);
  }

  renderer = g_object_new (DIA_TYPE_PY_RENDERER, NULL);

  renderer->filename = g_strdup (filename);
  renderer->diagram_data = PyDiaDiagramData_New(data);

  /* The Python Renderer object was created at PyDia_Register */
  renderer->self = (PyObject*)user_data;

  /* this will call the required callback functions above */
  data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);

  g_object_unref(renderer);

  return TRUE;
}
Esempio n. 3
0
File: wpg.c Progetto: mpuels/dia
/* dia export funtion */
static gboolean
export_data(DiagramData *data, DiaContext *ctx,
	    const gchar *filename, const gchar *diafilename,
	    void* user_data)
{
  WpgRenderer *renderer;
  FILE *file;
  Rectangle *extent;
  real width, height;

  file = g_fopen(filename, "wb"); /* "wb" for binary! */

  if (file == NULL) {
    dia_context_add_message_with_errno (ctx, errno, _("Can't open output file %s"), 
					dia_context_get_filename(ctx));
    return FALSE;
  }

  renderer = g_object_new (WPG_TYPE_RENDERER, NULL);

  renderer->file = file;
  renderer->ctx = ctx;

  extent = &data->extents;

  /* use extents */
  DIAG_NOTE(g_message("export_data extents %f,%f -> %f,%f", 
            extent->left, extent->top, extent->right, extent->bottom));

  width  = extent->right - extent->left;
  height = extent->bottom - extent->top;
#if 0
  /* extend to use full range */
  renderer->Scale = 0.001;
  if (width > height)
    while (renderer->Scale * width < 3276.7) renderer->Scale *= 10.0;
  else
    while (renderer->Scale * height < 3276.7) renderer->Scale *= 10.0;
#else
  /* scale from Dia's cm to WPU (1/1200 inch) */
  renderer->Scale = WPU_PER_DCM;
  /* avoid int16 overflow */
  if (width > height)
    while (renderer->Scale * width > 32767) renderer->Scale /= 10.0;
  else
    while (renderer->Scale * height > 32767) renderer->Scale /= 10.0;
  renderer->XOffset = - extent->left;
  renderer->YOffset =   extent->bottom;
#endif
  renderer->Box.Width  = width * renderer->Scale;
  renderer->Box.Height = height * renderer->Scale;
  renderer->Box.Flag   = 0;
  renderer->Box.Version = 0;

  data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);

  g_object_unref(renderer);

  return TRUE;
}
Esempio n. 4
0
static void
_dae_draw(DiagramAsElement *dae, DiaRenderer *renderer)
{
  DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
  Element *elem = &dae->element;

  if (!dae->data) {
    /* just draw the box */
    Point lower_right = {
      elem->corner.x + elem->width,
      elem->corner.y + elem->height 
    };

    renderer_ops->draw_rect(renderer,&elem->corner, &lower_right, 
                            &dae->border_color);

  } else {
    if (FALSE) {
      /* if the renderer supports transformations ... */
      /* temporary messing with it (not enough) */
      dae->data->paper.scaling *= dae->scale;
      data_render (dae->data, DIA_RENDERER (renderer), NULL, NULL, NULL);
      dae->data->paper.scaling /= dae->scale;
    } else {
      /* we have to render to an image and draw that */
      if (!dae->image) { /* lazy creation */
	gchar *imgfname = NULL;
	gint fd = g_file_open_tmp ("diagram-as-elementXXXXXX.png", &imgfname, NULL);
	if (fd != -1) {
          DiaExportFilter *ef = filter_export_get_by_name ("cairo-alpha-png");
	  if (!ef) /* prefer cairo with alpha, but don't require it */
	    ef = filter_guess_export_filter (imgfname);
	  close(fd);
	  if (ef) {
	    DiaContext *ctx = dia_context_new ("Diagram as Object");

	    dia_context_set_filename (ctx, imgfname);
	    if (ef->export_func (dae->data, ctx, imgfname, dae->filename, ef->user_data)) {
	      DiaImage *tmp_image = dia_image_load (imgfname);

	      /* some extra gymnastics to create an image w/o filename */
	      if (tmp_image) {
	        dae->image = dia_image_new_from_pixbuf ((GdkPixbuf *)dia_image_pixbuf (tmp_image));
	        g_object_unref (tmp_image);
	      }
	      /* FIXME: where to put the message in case of an error? */
	      dia_context_release (ctx);
	    }
	  } /* found a filter */
	  g_unlink (imgfname);
	  g_free (imgfname);
	} /* temporary file created*/
      } /* only if we have no image yet */
      if (dae->image)
	renderer_ops->draw_image (renderer, &elem->corner, elem->width, elem->height, dae->image);
    }
  }
}
Esempio n. 5
0
static gboolean
export_shape(DiagramData *data, DiaContext *ctx,
	     const gchar *filename, const gchar *diafilename,
	     void* user_data)
{
    DiaSvgRenderer *renderer;
    int i;
    gchar *point;
    gchar *png_filename = NULL;
    DiaExportFilter *exportfilter;
    gfloat old_scaling;
    Rectangle *ext = &data->extents;
    gfloat scaling_x, scaling_y;

    /* create the png preview shown in the toolbox */
    point = strrchr(filename, '.');
    if (point == NULL || strcmp(point, ".shape") != 0) {
	dia_context_add_message(ctx, _("Shape files must end in .shape, or they cannot be loaded by Dia"));
	return FALSE;
    }
    i = (int)(point-filename);
    point = g_strndup(filename, i);
    png_filename = g_strdup_printf("%s.png",point);
    g_free(point);
    /* we are especially requesting the libart/png cause it is the only one with the size-hack */
    exportfilter = filter_export_get_by_name ("png-libart");
    /* ... but the code below does not use the size-hack anymore ... */
    if (!exportfilter)
      exportfilter = filter_guess_export_filter(png_filename);

    if (!exportfilter) {
      dia_context_add_message(ctx, _("Can't export PNG icon without export plugin!"));
    } else {
      /* get the scaling right */
      old_scaling = data->paper.scaling;
      scaling_x = 22/((ext->right - ext->left) * 20);
      scaling_y = 22/((ext->bottom - ext->top) * 20);
      data->paper.scaling = MIN(scaling_x, scaling_y);
      exportfilter->export_func(data, ctx, png_filename, diafilename, exportfilter->user_data);
      data->paper.scaling = old_scaling;
    }
    g_free(png_filename);

    /* create the shape */
    if((renderer = new_shape_renderer(data, filename))) {
      data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);
      g_object_unref (renderer);
      return TRUE;
    }

    /* Create a sheet entry if applicable (../../sheets exists) */

    return FALSE;
}
Esempio n. 6
0
static void
export_svg(DiagramData *data, const gchar *filename, 
           const gchar *diafilename, void* user_data)
{
  DiaSvgRenderer *renderer;

  if ((renderer = new_svg_renderer(data, filename))) {
    data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);
    g_object_unref(renderer);
  }
}
Esempio n. 7
0
File: hpgl.c Progetto: mpuels/dia
/* plug-in interface : export function */
static gboolean
export_data(DiagramData *data, DiaContext *ctx,
	    const gchar *filename, const gchar *diafilename,
	    void* user_data)
{
    HpglRenderer *renderer;
    FILE *file;
    Rectangle *extent;
    real width, height;

    file = g_fopen(filename, "w"); /* "wb" for binary! */

    if (!file) {
	dia_context_add_message_with_errno(ctx, errno, _("Can't open output file %s."), 
					   dia_context_get_filename(ctx));
	return FALSE;
    }

    renderer = g_object_new(HPGL_TYPE_RENDERER, NULL);

    renderer->file = file;

    extent = &data->extents;

    /* use extents */
    DIAG_NOTE(g_message("export_data extents %f,%f -> %f,%f", 
              extent->left, extent->top, extent->right, extent->bottom));

    width  = extent->right - extent->left;
    height = extent->bottom - extent->top;
    renderer->scale = 0.001;
    if (width > height)
        while (renderer->scale * width < 3276.7) renderer->scale *= 10.0;
    else
        while (renderer->scale * height < 3276.7) renderer->scale *= 10.0;
    renderer->offset = 0.0; /* just to have one */

    renderer->size.x = width * renderer->scale;
    renderer->size.y = height * renderer->scale;
#if 0
    /* OR: set page size and scale */
    fprintf(renderer->file, "PS0;SC%d,%d,%d,%d;\n",
            hpgl_scale(renderer, extent->left),
            hpgl_scale(renderer, extent->right),
            hpgl_scale(renderer, extent->bottom),
            hpgl_scale(renderer, extent->top));
#endif
    data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);

    g_object_unref(renderer);

    return TRUE;
}
Esempio n. 8
0
/*!
 * \brief Calls data_render() for paginated formats
 *
 * Call data_render() for every used page in the diagram
 *
 * \memberof _DiagramData
 */
void
data_render_paginated (DiagramData *data, DiaRenderer *renderer, gpointer user_data)
{
  Rectangle *extents;
  gdouble width, height;
  gdouble x, y, initx, inity;
  gint xpos, ypos;
  guint nobjs = 0;

  /* the usable area of the page */
  width = data->paper.width;
  height = data->paper.height;

  /* get extents, and make them multiples of width / height */
  extents = &data->extents;
  initx = extents->left;
  inity = extents->top;
  /* make page boundaries align with origin */
  if (!data->paper.fitto) {
    initx = floor(initx / width)  * width;
    inity = floor(inity / height) * height;
  }

  /* iterate through all the pages in the diagram */
  for (y = inity, ypos = 0; y < extents->bottom; y += height, ypos++) {
    /* ensure we are not producing pages for epsilon */
    if ((extents->bottom - y) < 1e-6)
      break;
    for (x = initx, xpos = 0; x < extents->right; x += width, xpos++) {
      Rectangle page_bounds;

      if ((extents->right - x) < 1e-6)
	break;

      page_bounds.left = x;
      page_bounds.right = x + width;
      page_bounds.top = y;
      page_bounds.bottom = y + height;

      data_render (data, renderer, &page_bounds, NULL, user_data);
    }
  }
}
Esempio n. 9
0
File: pixbuf.c Progetto: GNOME/dia
static gboolean
export_data(DiagramData *data, DiaContext *ctx,
	    const gchar *filename, const gchar *diafilename,
	    void* user_data)
{
  DiaCairoRenderer *renderer;
  GdkColor color;
  int width, height;
  GdkPixbuf* pixbuf = NULL;
  GError* error = NULL;
  Rectangle rect;
  real zoom = 1.0;
  cairo_t *cctx;
  const char* format = (const char*)user_data;

  rect.left = data->extents.left;
  rect.top = data->extents.top;
  rect.right = data->extents.right;
  rect.bottom = data->extents.bottom;

  /* quite arbitrary */
  zoom = 20.0 * data->paper.scaling; 
  /* Adding a bit of padding to account for rounding errors.  Better to
   * pad than to clip.  See bug #413275 */
  width = ceil((rect.right - rect.left) * zoom) + 1;
  height = ceil((rect.bottom - rect.top) * zoom) + 1;

  renderer = g_object_new (dia_cairo_renderer_get_type(), NULL);
  renderer->scale = zoom;
  renderer->surface = cairo_surface_reference (cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                                  width, height));

  cctx = cairo_create (renderer->surface);

  /* draw background */
  color_convert (&data->bg_color, &color);
  gdk_cairo_set_source_color (cctx, &color);
  cairo_rectangle (cctx, 0, 0, width, height);
  cairo_fill (cctx);

  data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL);

  #if GTK_CHECK_VERSION(3,0,0)
  pixbuf = gdk_pixbuf_get_from_surface (renderer->surface, 0, 0,
                                        width, height);
  #else
  {
    GdkPixmap *pixmap;
    cairo_t *cr;

    pixmap = gdk_pixmap_new (NULL, width, height, 24);
    cr = gdk_cairo_create (pixmap);

    cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
    cairo_set_source_surface (cr, renderer->surface, 0, 0);
    cairo_paint (cr);
    pixbuf = gdk_pixbuf_get_from_drawable (NULL,
                                           pixmap,
                                           gdk_colormap_get_system (),
                                           0, 0, 0, 0, width, height);
  }
  #endif
  if (pixbuf)
    {
      gdk_pixbuf_save (pixbuf, filename, format, &error, NULL);
      g_object_unref (pixbuf);
    }
  else
    {
      dia_context_add_message(ctx, _("Failed to create pixbuf from drawable."));
    }

  if (error)
    {
      dia_context_add_message(ctx, _("Could not save file:\n%s\n%s"),
		              dia_context_get_filename(ctx),
			      error->message);
      g_error_free (error);
    }

  g_object_unref (renderer);

  return TRUE;
}
Esempio n. 10
0
static void
draw_page (GtkPrintOperation *operation,
	   GtkPrintContext *context,
	   int page_nr,
	   PrintData *print_data)
{
  Rectangle bounds;
  DiagramData *data = print_data->data;
  int x, y;
  /* the effective sizes - dia already applied is_portrait */
  double dp_width = data->paper.width;
  double dp_height = data->paper.height;

  DiaCairoRenderer *cairo_renderer;
  g_return_if_fail (print_data->renderer != NULL);
  cairo_renderer = DIA_CAIRO_RENDERER (print_data->renderer);

  if (data->paper.fitto) {
    x = page_nr % data->paper.fitwidth;
    y = page_nr / data->paper.fitwidth;
    
    bounds.left = dp_width * x + data->extents.left;
    bounds.top = dp_height * y + data->extents.top;
    bounds.right = bounds.left + dp_width;
    bounds.bottom = bounds.top + dp_height;
  } else {
    double dx, dy;
    int nx = ceil((data->extents.right - data->extents.left) / dp_width);
    x = page_nr % nx;
    y = page_nr / nx;

    /* Respect the original pagination as shown by the page guides.
     * Caclulate the offset between page origin 0,0 and data.extents.topleft. 
     * For the usual first page this boils down to lefttop=(0,0) but beware
     * the origin being negative.
     */
    dx = fmod(data->extents.left, dp_width);
    if (dx < 0.0)
      dx += dp_width;
    dy = fmod(data->extents.top, dp_height);
    if (dy < 0.0)
      dy += dp_height;

    bounds.left = dp_width * x + data->extents.left - dx;
    bounds.top = dp_height * y + data->extents.top - dy;
    bounds.right = bounds.left + dp_width;
    bounds.bottom = bounds.top + dp_height;
  }

#if 0 /* calls begin/end of the given renderer */
  /* count the number of objects in this region */
  data_render(data, print_data->renderer, &bounds,
              (ObjectRenderer) count_objs, &nobjs);
  if (!nobjs)
    return; /* not printing empty pages */
#endif

  /* setup a clipping rect */
  {
    GtkPageSetup *setup = gtk_print_context_get_page_setup (context);
    double left = gtk_page_setup_get_left_margin (setup, GTK_UNIT_MM);
    double top = gtk_page_setup_get_top_margin (setup, GTK_UNIT_MM);
    double width = gtk_page_setup_get_paper_width (setup, GTK_UNIT_MM) 
		   - left - gtk_page_setup_get_right_margin (setup, GTK_UNIT_MM);
    double height = gtk_page_setup_get_paper_height (setup, GTK_UNIT_MM) 
		    - top - gtk_page_setup_get_bottom_margin (setup, GTK_UNIT_MM);
    cairo_save (cairo_renderer->cr);
    /* we are still in the gtk-print coordinate system */
#if 1
    /* ... but apparently already transalted to top,left */
    top = left = 0;
#endif
    cairo_rectangle (cairo_renderer->cr, left, top, width, height);
    
    cairo_clip (cairo_renderer->cr);
  }

  {
    Rectangle extents = data->extents;

    data->extents = bounds;
    /* render only the region, FIXME: better way than modifying DiagramData ?  */
    data_render(data, print_data->renderer, &bounds, NULL, NULL);
    data->extents = extents;
  }
  cairo_restore (cairo_renderer->cr);
}
Esempio n. 11
0
void
ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update)
{
  GList *list;
  DiaObject *obj;
  int i;
  DiaInteractiveRendererInterface *renderer;
#ifdef TRACES
  GTimer *timer;
#endif
  
  if (ddisp->renderer==NULL) {
    printf("ERROR! Renderer was NULL!!\n");
    return;
  }

  renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);

  /* Erase background */
  g_return_if_fail (renderer->fill_pixel_rect != NULL);
  DIA_RENDERER_GET_CLASS(ddisp->renderer)->begin_render(ddisp->renderer, update);
  if (update) {
    int x0, y0, x1, y1;

    ddisplay_transform_coords (ddisp, update->left, update->top, &x0, &y0);
    ddisplay_transform_coords (ddisp, update->right, update->bottom, &x1, &y1);
    renderer->fill_pixel_rect (ddisp->renderer,
			       x0, y0, x1-x0, y1-y0,
			       &ddisp->diagram->data->bg_color);
  } else
    renderer->fill_pixel_rect (ddisp->renderer,
			       0, 0,
		               dia_renderer_get_width_pixels (ddisp->renderer),
			       dia_renderer_get_height_pixels (ddisp->renderer),
			       &ddisp->diagram->data->bg_color);

  /* Draw grid */
  grid_draw(ddisp, update);
  pagebreak_draw(ddisp, update);

#ifdef TRACES
  timer = g_timer_new();
#endif
  data_render(ddisp->diagram->data, ddisp->renderer, update,
	      ddisplay_obj_render, (gpointer) ddisp);
#ifdef TRACES
  g_print ("data_render(%g%%) took %g seconds\n", ddisp->zoom_factor * 5.0, g_timer_elapsed (timer, NULL));
  g_timer_destroy (timer);
#endif
  /* Draw handles for all selected objects */
  list = ddisp->diagram->data->selected;
  while (list!=NULL) {
    obj = (DiaObject *) list->data;

    for (i=0;i<obj->num_handles;i++) {
       handle_draw(obj->handles[i], ddisp);
     }
    list = g_list_next(list);
  }
  DIA_RENDERER_GET_CLASS(ddisp->renderer)->end_render(ddisp->renderer);
}