1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1998 Alexander Larsson
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 #include "render_gdk.h"
28 #include "diagdkrenderer.h"
30 static void clip_region_clear(DiaRenderer
*renderer
);
31 static void clip_region_add_rect(DiaRenderer
*renderer
,
34 static void draw_pixel_line(DiaRenderer
*renderer
,
38 static void draw_pixel_rect(DiaRenderer
*renderer
,
40 int width
, int height
,
42 static void fill_pixel_rect(DiaRenderer
*renderer
,
44 int width
, int height
,
46 static void set_size (DiaRenderer
*renderer
,
48 int width
, int height
);
49 static void copy_to_window (DiaRenderer
*renderer
,
51 int x
, int y
, int width
, int height
);
53 static void dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface
* iface
)
55 iface
->clip_region_clear
= clip_region_clear
;
56 iface
->clip_region_add_rect
= clip_region_add_rect
;
57 iface
->draw_pixel_line
= draw_pixel_line
;
58 iface
->draw_pixel_rect
= draw_pixel_rect
;
59 iface
->fill_pixel_rect
= fill_pixel_rect
;
60 iface
->copy_to_window
= copy_to_window
;
61 iface
->set_size
= set_size
;
65 new_gdk_renderer(DDisplay
*ddisp
)
67 DiaGdkRenderer
*renderer
;
68 GType renderer_type
= 0;
70 renderer
= g_object_new (DIA_TYPE_GDK_RENDERER
, NULL
);
71 renderer
->transform
= dia_transform_new (&ddisp
->visible
, &ddisp
->zoom_factor
);
72 if (!DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer
))
74 static const GInterfaceInfo irenderer_iface_info
=
76 (GInterfaceInitFunc
) dia_gdk_renderer_iface_init
,
77 NULL
, /* iface_finalize */
81 renderer_type
= DIA_TYPE_GDK_RENDERER
;
82 /* register the interactive renderer interface */
83 g_type_add_interface_static (renderer_type
,
84 DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE
,
85 &irenderer_iface_info
);
88 renderer
->parent_instance
.is_interactive
= 1;
91 renderer
->pixmap
= NULL
;
92 renderer
->clip_region
= NULL
;
94 return DIA_RENDERER(renderer
);
98 set_size(DiaRenderer
*object
, GdkWindow
*window
,
99 int width
, int height
)
101 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
103 if (renderer
->pixmap
!= NULL
)
104 gdk_drawable_unref(renderer
->pixmap
);
106 renderer
->pixmap
= gdk_pixmap_new(window
, width
, height
, -1);
108 if (renderer
->gc
== NULL
) {
109 renderer
->gc
= gdk_gc_new(renderer
->pixmap
);
111 gdk_gc_set_line_attributes(renderer
->gc
,
112 renderer
->line_width
,
113 renderer
->line_style
,
115 renderer
->join_style
);
120 copy_to_window (DiaRenderer
*object
, GdkWindow
*window
,
121 int x
, int y
, int width
, int height
)
123 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
124 static GdkGC
*copy_gc
= NULL
;
127 copy_gc
= gdk_gc_new(window
);
129 gdk_draw_pixmap (window
,
138 clip_region_clear(DiaRenderer
*object
)
140 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
142 if (renderer
->clip_region
!= NULL
)
143 gdk_region_destroy(renderer
->clip_region
);
145 renderer
->clip_region
= gdk_region_new();
147 gdk_gc_set_clip_region(renderer
->gc
, renderer
->clip_region
);
151 clip_region_add_rect(DiaRenderer
*object
,
154 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
155 GdkRectangle clip_rect
;
159 dia_transform_coords(renderer
->transform
, rect
->left
, rect
->top
, &x1
, &y1
);
160 dia_transform_coords(renderer
->transform
, rect
->right
, rect
->bottom
, &x2
, &y2
);
164 clip_rect
.width
= x2
- x1
+ 1;
165 clip_rect
.height
= y2
- y1
+ 1;
167 gdk_region_union_with_rect( renderer
->clip_region
, &clip_rect
);
169 gdk_gc_set_clip_region(renderer
->gc
, renderer
->clip_region
);
173 draw_pixel_line(DiaRenderer
*object
,
178 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
179 GdkGC
*gc
= renderer
->gc
;
182 dia_gdk_renderer_set_dashes(renderer
, x1
+y1
);
184 color_convert(color
, &gdkcolor
);
185 gdk_gc_set_foreground(gc
, &gdkcolor
);
187 gdk_draw_line(renderer
->pixmap
, gc
, x1
, y1
, x2
, y2
);
191 draw_pixel_rect(DiaRenderer
*object
,
193 int width
, int height
,
196 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
197 GdkGC
*gc
= renderer
->gc
;
200 dia_gdk_renderer_set_dashes(renderer
, x
+y
);
202 color_convert(color
, &gdkcolor
);
203 gdk_gc_set_foreground(gc
, &gdkcolor
);
205 gdk_draw_rectangle (renderer
->pixmap
, gc
, FALSE
,
206 x
, y
, width
, height
);
210 fill_pixel_rect(DiaRenderer
*object
,
212 int width
, int height
,
215 DiaGdkRenderer
*renderer
= DIA_GDK_RENDERER (object
);
216 GdkGC
*gc
= renderer
->gc
;
219 color_convert(color
, &gdkcolor
);
220 gdk_gc_set_foreground(gc
, &gdkcolor
);
222 gdk_draw_rectangle (renderer
->pixmap
, gc
, TRUE
,
223 x
, y
, width
, height
);