2004-11-21 Hans Breuer <hans@breuer.org>
[dia.git] / app / render_gdk.c
blobdbef9e21d201f96b7b027585868361e8045147ea
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.
19 #include <config.h>
21 #include <math.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <gdk/gdk.h>
26 #include "message.h"
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,
32 Rectangle *rect);
34 static void draw_pixel_line(DiaRenderer *renderer,
35 int x1, int y1,
36 int x2, int y2,
37 Color *color);
38 static void draw_pixel_rect(DiaRenderer *renderer,
39 int x, int y,
40 int width, int height,
41 Color *color);
42 static void fill_pixel_rect(DiaRenderer *renderer,
43 int x, int y,
44 int width, int height,
45 Color *color);
46 static void set_size (DiaRenderer *renderer,
47 GdkWindow *window,
48 int width, int height);
49 static void copy_to_window (DiaRenderer *renderer,
50 GdkWindow *window,
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;
64 DiaRenderer *
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 */
78 NULL /* iface_data */
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;
89 renderer->gc = NULL;
91 renderer->pixmap = NULL;
92 renderer->clip_region = NULL;
94 return DIA_RENDERER(renderer);
97 static void
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,
114 renderer->cap_style,
115 renderer->join_style);
119 static void
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;
126 if (!copy_gc)
127 copy_gc = gdk_gc_new(window);
129 gdk_draw_pixmap (window,
130 copy_gc,
131 renderer->pixmap,
132 x, y,
133 x, y,
134 width, height);
137 static void
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);
150 static void
151 clip_region_add_rect(DiaRenderer *object,
152 Rectangle *rect)
154 DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
155 GdkRectangle clip_rect;
156 int x1,y1;
157 int x2,y2;
159 dia_transform_coords(renderer->transform, rect->left, rect->top, &x1, &y1);
160 dia_transform_coords(renderer->transform, rect->right, rect->bottom, &x2, &y2);
162 clip_rect.x = x1;
163 clip_rect.y = y1;
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);
172 static void
173 draw_pixel_line(DiaRenderer *object,
174 int x1, int y1,
175 int x2, int y2,
176 Color *color)
178 DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
179 GdkGC *gc = renderer->gc;
180 GdkColor gdkcolor;
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);
190 static void
191 draw_pixel_rect(DiaRenderer *object,
192 int x, int y,
193 int width, int height,
194 Color *color)
196 DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
197 GdkGC *gc = renderer->gc;
198 GdkColor gdkcolor;
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);
209 static void
210 fill_pixel_rect(DiaRenderer *object,
211 int x, int y,
212 int width, int height,
213 Color *color)
215 DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
216 GdkGC *gc = renderer->gc;
217 GdkColor gdkcolor;
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);