/* gcw - PLplot Gnome Canvas Widget device driver.

  Copyright (C) 2004, 2005  Thomas J. Duck
  Copyright (C) 2004  Rafael Laboissiere
  All rights reserved.

NOTICE

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
  USA 
*/

#ifndef __GCW_H__
#define __GCW_H__

#include "plDevs.h"
#include "plplotP.h"
#include "drivers.h"

#include <math.h>
#include <stdio.h>
#include <sys/stat.h>

#include <glib.h>
#include <gtk/gtk.h>
#include <libgnomecanvas/libgnomecanvas.h>
#include <libart_lgpl/libart.h>
#include <libgnomeprint/gnome-print.h>


/* #define DEBUG_GCW_1 */
/* #define DEBUG_GCW_2 */
/* #define ASSERT_GCW */


/*=========================================================================*/
/* GcwPLdev - the PLplot device structure for the GCW driver */

typedef struct {
  GnomeCanvas* canvas;   /* The canvas to draw on */
  GdkPixmap* background; /* The background */
  GdkGC* gc;             /* A graphics context for the pixmap */

  GnomeCanvasGroup* group_visible;    /* Visible group, removed at next eop */
  GnomeCanvasGroup* group_hidden;     /* Hidden group --> visible at eop */
  GnomeCanvasGroup* group_persistent; /* Persistent group, at from and never erased */

  gboolean use_persistence;      /* Flags the persistent group should be used,
				  * and that it and the background should not be 
				  * erased when the page is advanced. 
				  */

  GtkWidget* window;    /* A window used in standalone mode */
  GtkWidget* notebook;  /* A notebook pager in the window */
  GtkWidget* statusbar; /* A statusbar for the window */
  GtkWidget* filew;     /* A file widget chooser when Save is pressed */

  guint32 color;    /* Current pen color */
  GdkColor bgcolor; /* Background color (shouldn't change) */
  GdkColormap* colormap; /* The gdk colormap for the canvas */

  PLINT width;   /* Width of the canvas in device pixels */
  PLINT height;  /* Height of the canvas in device pixels */

  PLINT pen_color; /* Current pen color */
  PLINT pen_width; /* Current pen width */

  gboolean use_pixmap;      /* Flags pixmap use for lines and fills */
  gboolean pixmap_has_data; /* Flags that the pixmap has data */

  gboolean plstate_width;  /* Flags indicating change of state before */
  gboolean plstate_color0; /*  device is fully initialized */
  gboolean plstate_color1;

  gboolean allow_resize; /* Flags whether device resizing is allowed */

} GcwPLdev;


/*=========================================================================*/
/* Physical dimension constants used by the driver */

/* Virtual coordinate scaling parameter, used to do calculations at
 * higher resolution.  Chosen to be 32 for consistency with the PLplot
 * metafile (see plplotP.h).
 *
 * The trick here is to do everything in device coordinates on the driver
 * side, but report/receive everything in virtual coordinates to/from the
 * PLplot core.
 */
#define VSCALE (32.)

/* pixels per mm */
#define DEVICE_PIXELS_PER_MM (3.4)
#define VIRTUAL_PIXELS_PER_MM (DEVICE_PIXELS_PER_MM*VSCALE)

/* mm per inch */
#define MM_PER_IN (25.4)

/* pixels per inch */
#define DEVICE_PIXELS_PER_IN (DEVICE_PIXELS_PER_MM*MM_PER_IN)
#define VIRTUAL_PIXELS_PER_IN (VIRTUAL_PIXELS_PER_MM*MM_PER_IN)

/* Default dimensions of the canvas (in inches) */
#define CANVAS_WIDTH (10.)
#define CANVAS_HEIGHT (7.5)

/* The zoom factor for 100% zoom in */
#define ZOOM100 (1.0)
#define ZOOMSTEP (1.25)


/*=========================================================================*/
/* GCW "Gnome Canvas Widget" Library prototypes (see gcw-lib.c) */

/* Public_functions */

void gcw_use_text(PLINT use_text);
void gcw_use_pixmap(PLINT use_pixmap);
void gcw_use_hrshsym(PLINT use_hrshsym);

/* Private functions */

void gcw_debug(char* msg);
void gcw_set_gdk_color();
void gcw_clear_background();
void gcw_init_canvas(GnomeCanvas* canvas);
void gcw_install_canvas(GnomeCanvas *canvas);
void gcw_set_device_size(PLINT width,PLINT height);
void gcw_set_canvas_size(GnomeCanvas* canvas,PLINT width,PLINT height);
void gcw_set_canvas_zoom(GnomeCanvas* canvas,PLFLT magnification);
void gcw_use_persistence(PLINT use_persistence);

#endif /* __GCW_H__ */
