[dia] Move interactive renderer to it's own header
- From: Zander <zbrown src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] Move interactive renderer to it's own header
- Date: Sun, 15 Sep 2019 09:43:50 +0000 (UTC)
commit f2abb7ef97666a44840e251cf42d76055053e710
Author: Zander Brown <zbrown gnome org>
Date: Wed Sep 11 21:28:52 2019 +0100
Move interactive renderer to it's own header
app/connectionpoint_ops.c | 59 +++++++-------
app/display.c | 124 ++++++++++++++++------------
app/grid.c | 143 +++++++++++++++++---------------
app/handle_ops.c | 69 ++++++++--------
app/interface.c | 35 ++++----
app/modify_tool.c | 7 +-
lib/arrows.c | 3 +-
lib/diagramdata.c | 31 ++++---
lib/diainteractiverenderer.c | 158 +++++++++++++++++++++++++++++-------
lib/diainteractiverenderer.h | 119 +++++++++++++++++++++++++++
lib/diarenderer.c | 121 +++++++++++----------------
lib/diarenderer.h | 105 ++----------------------
lib/layer.c | 66 ++++++++-------
lib/meson.build | 1 +
lib/renderer/diacairo-interactive.c | 93 ++++++++++-----------
lib/renderer/diacairo-renderer.c | 2 +-
lib/renderer/diacairo.h | 3 +-
lib/text.c | 38 +++++----
objects/GRAFCET/action_text_draw.c | 9 +-
objects/standard/arc.c | 50 +++++++-----
objects/standard/bezier.c | 3 +-
objects/standard/beziergon.c | 5 +-
objects/standard/textobj.c | 5 +-
23 files changed, 704 insertions(+), 545 deletions(-)
---
diff --git a/app/connectionpoint_ops.c b/app/connectionpoint_ops.c
index 26d078c3..a50edd35 100644
--- a/app/connectionpoint_ops.c
+++ b/app/connectionpoint_ops.c
@@ -24,6 +24,7 @@
#include "color.h"
#include "object.h"
#include "connectionpoint.h"
+#include "diainteractiverenderer.h"
#define CONNECTIONPOINT_SIZE 7
#define CHANGED_TRESHOLD 0.001
@@ -33,29 +34,29 @@ static Color connectionpoint_color = { 0.4, 0.4, 1.0, 1.0 };
#define CP_SZ (CONNECTIONPOINT_SIZE/2)
static void
-connectionpoint_draw(ConnectionPoint *conpoint,
- DDisplay *ddisp,
- DiaRenderer *renderer,
- DiaInteractiveRendererInterface *irenderer,
- Color *color)
+connectionpoint_draw (ConnectionPoint *conpoint,
+ DDisplay *ddisp,
+ DiaRenderer *renderer,
+ DiaInteractiveRendererInterface *irenderer,
+ Color *color)
{
int x,y;
Point *point = &conpoint->pos;
-
- ddisplay_transform_coords(ddisp, point->x, point->y, &x, &y);
-
- irenderer->draw_pixel_line (renderer,
- x-CP_SZ,y-CP_SZ,
- x+CP_SZ,y+CP_SZ,
- color);
-
- irenderer->draw_pixel_line (renderer,
- x+CP_SZ,y-CP_SZ,
- x-CP_SZ,y+CP_SZ,
- color);
+
+ ddisplay_transform_coords (ddisp, point->x, point->y, &x, &y);
+
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x-CP_SZ,y-CP_SZ,
+ x+CP_SZ,y+CP_SZ,
+ color);
+
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x+CP_SZ,y-CP_SZ,
+ x-CP_SZ,y+CP_SZ,
+ color);
}
-void
+void
object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp)
{
int i;
@@ -63,14 +64,14 @@ object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp)
DiaRenderer *renderer = ddisp->renderer;
DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (ddisp->renderer);
DiaInteractiveRendererInterface *irenderer =
- DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+ DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
/* this does not change for any of the points */
renderer_ops->set_linewidth (renderer, 0.0);
renderer_ops->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
/* optimization to only draw the connection points at all if the size
- * of the object (bounding box) is bigger than the summed size of the
+ * of the object (bounding box) is bigger than the summed size of the
* connection points - or some variation thereof ;)
*/
if (dia_object_get_num_connections(obj) > 1)
@@ -119,16 +120,16 @@ diagram_update_connections_selection(Diagram *dia)
while (list!=NULL) {
DiaObject * selected_obj = (DiaObject *) list->data;
-
+
diagram_update_connections_object(dia, selected_obj, TRUE);
-
+
list = g_list_next(list);
}
}
/* Updates all objects connected to the 'obj' object.
Calls this function recursively for objects modified.
-
+
If update_nonmoved is TRUE, also objects that have not
moved since last time is updated. This is not propagated
in the recursion.
@@ -163,7 +164,7 @@ diagram_update_connections_object(Diagram *dia, DiaObject *obj,
object_add_updates(connected_obj, dia);
diagram_update_connections_object(dia, connected_obj, FALSE);
- }
+ }
list = g_list_next(list);
}
}
@@ -173,7 +174,7 @@ diagram_update_connections_object(Diagram *dia, DiaObject *obj,
for (child = obj->children; child != NULL; child = child->next) {
DiaObject *child_obj = (DiaObject *)child->data;
diagram_update_connections_object(dia, child_obj, update_nonmoved);
- }
+ }
}
}
@@ -183,7 +184,7 @@ ddisplay_connect_selected(DDisplay *ddisp)
GList *list;
list = ddisp->diagram->data->selected;
-
+
while (list!=NULL) {
DiaObject *selected_obj = (DiaObject *) list->data;
int i;
@@ -193,7 +194,7 @@ ddisplay_connect_selected(DDisplay *ddisp)
object_connect_display(ddisp, selected_obj, selected_obj->handles[i], FALSE);
}
}
-
+
list = g_list_next(list);
}
}
@@ -204,14 +205,14 @@ diagram_unconnect_selected(Diagram *dia)
GList *list;
list = dia->data->selected;
-
+
while (list!=NULL) {
DiaObject *selected_obj = (DiaObject *) list->data;
int i;
for (i=0; i<selected_obj->num_handles; i++) {
Handle *handle = selected_obj->handles[i];
-
+
if ((handle->connected_to != NULL) &&
(handle->connect_type == HANDLE_CONNECTABLE)){
/* don't do this if type is HANDLE_CONNECTABLE_BREAK */
diff --git a/app/display.c b/app/display.c
index 2a80e6f9..a997b4a9 100644
--- a/app/display.c
+++ b/app/display.c
@@ -281,57 +281,63 @@ new_display(Diagram *dia)
}
void
-ddisplay_transform_coords_double(DDisplay *ddisp,
- coord x, coord y,
- double *xi, double *yi)
+ddisplay_transform_coords_double (DDisplay *ddisp,
+ coord x,
+ coord y,
+ double *xi,
+ double *yi)
{
Rectangle *visible = &ddisp->visible;
- double width = dia_renderer_get_width_pixels (ddisp->renderer);
- double height = dia_renderer_get_height_pixels (ddisp->renderer);
+ double width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ double height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
- *xi = (x - visible->left) * (real)width / (visible->right - visible->left);
- *yi = (y - visible->top) * (real)height / (visible->bottom - visible->top);
+ *xi = (x - visible->left) * (real) width / (visible->right - visible->left);
+ *yi = (y - visible->top) * (real) height / (visible->bottom - visible->top);
}
void
-ddisplay_transform_coords(DDisplay *ddisp,
- coord x, coord y,
- int *xi, int *yi)
+ddisplay_transform_coords (DDisplay *ddisp,
+ coord x,
+ coord y,
+ int *xi,
+ int *yi)
{
Rectangle *visible = &ddisp->visible;
- int width = dia_renderer_get_width_pixels (ddisp->renderer);
- int height = dia_renderer_get_height_pixels (ddisp->renderer);
+ int width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ int height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
- *xi = ROUND ( (x - visible->left) * (real)width /
- (visible->right - visible->left) );
- *yi = ROUND ( (y - visible->top) * (real)height /
- (visible->bottom - visible->top) );
+ *xi = ROUND ( (x - visible->left) * (real) width /
+ (visible->right - visible->left) );
+ *yi = ROUND ( (y - visible->top) * (real) height /
+ (visible->bottom - visible->top) );
}
/* Takes real length and returns pixel length */
real
-ddisplay_transform_length(DDisplay *ddisp, real len)
+ddisplay_transform_length (DDisplay *ddisp, real len)
{
return len * ddisp->zoom_factor;
}
/* Takes pixel length and returns real length */
real
-ddisplay_untransform_length(DDisplay *ddisp, real len)
+ddisplay_untransform_length (DDisplay *ddisp, real len)
{
return len / ddisp->zoom_factor;
}
void
-ddisplay_untransform_coords(DDisplay *ddisp,
- int xi, int yi,
- coord *x, coord *y)
+ddisplay_untransform_coords (DDisplay *ddisp,
+ int xi,
+ int yi,
+ coord *x,
+ coord *y)
{
Rectangle *visible = &ddisp->visible;
- int width = dia_renderer_get_width_pixels (ddisp->renderer);
- int height = dia_renderer_get_height_pixels (ddisp->renderer);
+ int width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ int height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
*x = visible->left + xi*(visible->right - visible->left) / (real)width;
*y = visible->top + yi*(visible->bottom - visible->top) / (real)height;
@@ -443,23 +449,26 @@ ddisplay_flush(DDisplay *ddisp)
}
static void
-ddisplay_obj_render(DiaObject *obj, DiaRenderer *renderer,
- int active_layer,
- gpointer data)
+ddisplay_obj_render (DiaObject *obj,
+ DiaRenderer *renderer,
+ int active_layer,
+ gpointer data)
{
- DDisplay *ddisp = (DDisplay *)data;
+ DDisplay *ddisp = (DDisplay *) data;
DiaInteractiveRendererInterface *irenderer =
- DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
- DiaHighlightType hltype = data_object_get_highlight(DIA_DIAGRAM_DATA(ddisp->diagram), obj);
-
- if (hltype != DIA_HIGHLIGHT_NONE && irenderer->draw_object_highlighted != NULL)
- irenderer->draw_object_highlighted(renderer, obj, hltype);
- else /* maybe the renderer does not support highlighting */
- DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj, NULL);
+ DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
+ DiaHighlightType hltype = data_object_get_highlight (DIA_DIAGRAM_DATA (ddisp->diagram), obj);
+
+ if (hltype != DIA_HIGHLIGHT_NONE && irenderer->draw_object_highlighted != NULL) {
+ irenderer->draw_object_highlighted (DIA_INTERACTIVE_RENDERER (renderer), obj, hltype);
+ } else {
+ /* maybe the renderer does not support highlighting */
+ DIA_RENDERER_GET_CLASS (renderer)->draw_object (renderer, obj, NULL);
+ }
if (ddisp->show_cx_pts &&
obj->parent_layer != NULL && obj->parent_layer->connectable) {
- object_draw_connectionpoints(obj, ddisp);
+ object_draw_connectionpoints (obj, ddisp);
}
}
@@ -480,7 +489,7 @@ ddisplay_render_pixmap (DDisplay *ddisp,
return;
}
- renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+ renderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
/* Erase background */
g_return_if_fail (renderer->fill_pixel_rect != NULL);
@@ -490,14 +499,14 @@ ddisplay_render_pixmap (DDisplay *ddisp,
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,
+ renderer->fill_pixel_rect (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
x0, y0, x1-x0, y1-y0,
&ddisp->diagram->data->bg_color);
} else {
- renderer->fill_pixel_rect (ddisp->renderer,
+ renderer->fill_pixel_rect (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
0, 0,
- dia_renderer_get_width_pixels (ddisp->renderer),
- dia_renderer_get_height_pixels (ddisp->renderer),
+ dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER
(ddisp->renderer)),
+ dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER
(ddisp->renderer)),
&ddisp->diagram->data->bg_color);
}
@@ -562,7 +571,7 @@ ddisplay_update_scrollbars(DDisplay *ddisp)
}
void
-ddisplay_set_origo(DDisplay *ddisp, coord x, coord y)
+ddisplay_set_origo (DDisplay *ddisp, coord x, coord y)
{
Rectangle *extents = &ddisp->diagram->data->extents;
Rectangle *visible = &ddisp->visible;
@@ -574,19 +583,19 @@ ddisplay_set_origo(DDisplay *ddisp, coord x, coord y)
ddisp->origo.x = x;
ddisp->origo.y = y;
- if (ddisp->zoom_factor<DDISPLAY_MIN_ZOOM)
+ if (ddisp->zoom_factor < DDISPLAY_MIN_ZOOM)
ddisp->zoom_factor = DDISPLAY_MIN_ZOOM;
if (ddisp->zoom_factor > DDISPLAY_MAX_ZOOM)
ddisp->zoom_factor = DDISPLAY_MAX_ZOOM;
- width = dia_renderer_get_width_pixels (ddisp->renderer);
- height = dia_renderer_get_height_pixels (ddisp->renderer);
+ width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
visible->left = ddisp->origo.x;
visible->top = ddisp->origo.y;
- visible->right = ddisp->origo.x + ddisplay_untransform_length(ddisp, width);
- visible->bottom = ddisp->origo.y + ddisplay_untransform_length(ddisp, height);
+ visible->right = ddisp->origo.x + ddisplay_untransform_length (ddisp, width);
+ visible->bottom = ddisp->origo.y + ddisplay_untransform_length (ddisp, height);
ddisplay_update_rulers (ddisp, extents, visible);
}
@@ -973,8 +982,12 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer)
"rect", &ddisp->visible,
NULL);
- if (window)
- dia_renderer_set_size(ddisp->renderer, window, width, height);
+ if (window) {
+ dia_interactive_renderer_set_size (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
+ window,
+ width,
+ height);
+ }
}
void
@@ -992,12 +1005,15 @@ ddisplay_resize_canvas(DDisplay *ddisp,
NULL);
}
- dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height);
+ dia_interactive_renderer_set_size (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
+ gtk_widget_get_window (ddisp->canvas),
+ width,
+ height);
- ddisplay_set_origo(ddisp, ddisp->origo.x, ddisp->origo.y);
+ ddisplay_set_origo (ddisp, ddisp->origo.x, ddisp->origo.y);
- ddisplay_add_update_all(ddisp);
- ddisplay_flush(ddisp);
+ ddisplay_add_update_all (ddisp);
+ ddisplay_flush (ddisp);
}
DDisplay *
@@ -1489,8 +1505,8 @@ ddisplay_show_all (DDisplay *ddisp)
dia = ddisp->diagram;
- width = dia_renderer_get_width_pixels (ddisp->renderer);
- height = dia_renderer_get_height_pixels (ddisp->renderer);
+ width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
/* if there is something selected show that instead of all exisiting objects */
if (dia->data->selected) {
diff --git a/app/grid.c b/app/grid.c
index 16c9264d..6dcaf00f 100644
--- a/app/grid.c
+++ b/app/grid.c
@@ -26,6 +26,7 @@
#include "intl.h"
#include "grid.h"
#include "preferences.h"
+#include "diainteractiverenderer.h"
/** Calculate the width (in cm) of the gap between grid lines in dynamic
* grid mode.
@@ -90,7 +91,7 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length)
DiaInteractiveRendererInterface *irenderer;
int major_count = 0;
- irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+ irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
pos = ceil( update->top / length ) * length;
ddisplay_transform_coords(ddisp, update->left, pos, &x, &y);
@@ -108,23 +109,28 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length)
if (major_lines) {
major_count = ROUND (pos/length);
- if(major_count < 0) major_count -= major_lines * major_count;
+ if (major_count < 0) major_count -= major_lines * major_count;
major_count %= major_lines;
}
while (y < height) {
if (major_lines) {
- if (major_count == 0)
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
- else
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
- ddisplay_untransform_length(ddisp, 31));
- major_count = (major_count+1)%major_lines;
+ if (major_count == 0) {
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
+ } else {
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_DOTTED,
+ ddisplay_untransform_length (ddisp, 31));
+ }
+ major_count = (major_count + 1) % major_lines;
}
- irenderer->draw_pixel_line(renderer, x, y, width, y,
- &ddisp->diagram->grid.colour);
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x,
+ y,
+ width,
+ y,
+ &ddisp->diagram->grid.colour);
pos += length;
- ddisplay_transform_coords(ddisp, update->left, pos, &x, &y);
+ ddisplay_transform_coords (ddisp, update->left, pos, &x, &y);
}
}
@@ -139,7 +145,7 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length)
DiaInteractiveRendererInterface *irenderer;
int major_count = 0;
- irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+ irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
pos = ceil( update->left / length ) * length;
ddisplay_transform_coords(ddisp, update->right, update->bottom, &width, &height);
@@ -151,17 +157,25 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length)
}
while (x < width) {
- ddisplay_transform_coords(ddisp, pos, update->top, &x, &y);
+ ddisplay_transform_coords (ddisp, pos, update->top, &x, &y);
if (major_lines) {
- if (major_count == 0)
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
- else
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
- ddisplay_untransform_length(ddisp, 31));
- major_count = (major_count+1)%major_lines;
+ if (major_count == 0) {
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (DIA_INTERACTIVE_RENDERER (renderer),
+ LINESTYLE_SOLID,
+ 0.0);
+ } else {
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (DIA_INTERACTIVE_RENDERER (renderer),
+ LINESTYLE_DOTTED,
+ ddisplay_untransform_length (ddisp, 31));
+ }
+ major_count = (major_count + 1) % major_lines;
}
- irenderer->draw_pixel_line(renderer, x, y, x, height,
- &ddisp->diagram->grid.colour);
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x,
+ y,
+ x,
+ height,
+ &ddisp->diagram->grid.colour);
pos += length;
}
}
@@ -174,7 +188,7 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length)
DiaRenderer *renderer = ddisp->renderer;
DiaInteractiveRendererInterface *irenderer;
- irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+ irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
/* First horizontal lines: */
vert_pos = ceil( update->top / (length * sqrt(3)) ) * length * sqrt(3);
@@ -297,28 +311,29 @@ grid_draw(DDisplay *ddisp, Rectangle *update)
}
void
-pagebreak_draw(DDisplay *ddisp, Rectangle *update)
+pagebreak_draw (DDisplay *ddisp, Rectangle *update)
{
DiaRenderer *renderer = ddisp->renderer;
DiaInteractiveRendererInterface *irenderer;
- int width = dia_renderer_get_width_pixels(ddisp->renderer);
- int height = dia_renderer_get_height_pixels(ddisp->renderer);
+ int width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ int height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
- irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+ irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
if (prefs.pagebreak.visible) {
Diagram *dia = ddisp->diagram;
real origx = 0, origy = 0, pos;
real pwidth = dia->data->paper.width;
real pheight = dia->data->paper.height;
- int x,y;
+ int x, y;
- DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
- if (prefs.pagebreak.solid)
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
- else
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
- ddisplay_untransform_length(ddisp, 31));
+ DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, 0.0);
+ if (prefs.pagebreak.solid) {
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
+ } else {
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_DOTTED,
+ ddisplay_untransform_length (ddisp, 31));
+ }
if (dia->data->paper.fitto) {
origx = dia->data->extents.left;
@@ -326,61 +341,61 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update)
}
/* vertical lines ... */
- pos = origx + ceil((update->left - origx) / pwidth) * pwidth;
+ pos = origx + ceil ((update->left - origx) / pwidth) * pwidth;
while (pos <= update->right) {
- ddisplay_transform_coords(ddisp, pos,0,&x,&y);
- irenderer->draw_pixel_line(renderer,
- x, 0, x, height,
- &dia->pagebreak_color);
+ ddisplay_transform_coords (ddisp, pos, 0, &x, &y);
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x, 0, x, height,
+ &dia->pagebreak_color);
pos += pwidth;
}
/* Horizontal lines: */
- pos = origy + ceil((update->top - origy) / pheight) * pheight;
+ pos = origy + ceil ((update->top - origy) / pheight) * pheight;
while (pos <= update->bottom) {
- ddisplay_transform_coords(ddisp, 0,pos,&x,&y);
- irenderer->draw_pixel_line(renderer,
- 0, y, width, y,
- &dia->pagebreak_color);
+ ddisplay_transform_coords (ddisp, 0,pos,&x,&y);
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ 0, y, width, y,
+ &dia->pagebreak_color);
pos += pheight;
}
}
}
void
-snap_to_grid(DDisplay *ddisp, coord *x, coord *y)
+snap_to_grid (DDisplay *ddisp, coord *x, coord *y)
{
if (ddisp->grid.snap) {
if (ddisp->diagram->grid.hex) {
real width_x = ddisp->diagram->grid.width_w;
- real x_mod = (*x - 1*width_x) - floor((*x - 1*width_x) / (3*width_x)) * 3 * width_x;
- real y_mod = (*y - 0.25*sqrt(3) * width_x) -
- floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x;
+ real x_mod = (*x - 1 * width_x) - floor ((*x - 1 * width_x) / (3 * width_x)) * 3 * width_x;
+ real y_mod = (*y - 0.25 * sqrt (3) * width_x) -
+ floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3) * width_x)) * sqrt (3) * width_x;
if ( x_mod < (1.5 * width_x) ) {
- if ( y_mod < 0.5 * sqrt(3) * width_x ) {
- *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x + 2 * width_x;
- *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + 0.5 * sqrt(3)
* width_x;
- } else {
- *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x + 1.5 * width_x;
- *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + sqrt(3) *
width_x;
- }
+ if ( y_mod < 0.5 * sqrt (3) * width_x ) {
+ *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x + 2 * width_x;
+ *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3)*width_x)) * sqrt (3) * width_x + 0.5 *
sqrt (3) * width_x;
+ } else {
+ *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x + 1.5 * width_x;
+ *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3)*width_x)) * sqrt (3) * width_x + sqrt (3)
* width_x;
+ }
} else {
- if ( y_mod < 0.5 * sqrt(3) * width_x ) {
- *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x ;
- *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + 0.5 * sqrt(3)
* width_x;
- } else {
- *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x + 0.5 * width_x;
- *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + sqrt(3) *
width_x;
- }
+ if ( y_mod < 0.5 * sqrt (3) * width_x ) {
+ *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x ;
+ *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3) * width_x)) * sqrt (3) * width_x + 0.5 *
sqrt (3) * width_x;
+ } else {
+ *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x + 0.5 * width_x;
+ *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3) * width_x)) * sqrt (3) * width_x + sqrt
(3) * width_x;
+ }
}
} else {
real width_x = ddisp->diagram->grid.width_x;
real width_y = ddisp->diagram->grid.width_y;
if (ddisp->diagram->grid.dynamic) {
- calculate_dynamic_grid(ddisp, &width_x, &width_y);
+ calculate_dynamic_grid (ddisp, &width_x, &width_y);
}
- *x = ROUND((*x) / width_x) * width_x;
- *y = ROUND((*y) / width_y) * width_y;
+ *x = ROUND ((*x) / width_x) * width_x;
+ *y = ROUND ((*y) / width_y) * width_y;
}
}
}
diff --git a/app/handle_ops.c b/app/handle_ops.c
index 03fe31d9..052cf4f2 100644
--- a/app/handle_ops.c
+++ b/app/handle_ops.c
@@ -20,6 +20,7 @@
#include "handle_ops.h"
#include "handle.h"
#include "color.h"
+#include "diainteractiverenderer.h"
/* This value is best left odd so that the handles are centered. */
#define HANDLE_SIZE 9
@@ -47,58 +48,54 @@ static const Color handle_color_connected[NUM_HANDLE_TYPES<<1] =
};
void
-handle_draw(Handle *handle, DDisplay *ddisp)
+handle_draw (Handle *handle, DDisplay *ddisp)
{
gboolean some_selected;
int x,y;
DiaRenderer *renderer = ddisp->renderer;
DiaInteractiveRendererInterface *irenderer =
- DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+ DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
const Color *color;
- ddisplay_transform_coords(ddisp, handle->pos.x, handle->pos.y, &x, &y);
+ ddisplay_transform_coords (ddisp, handle->pos.x, handle->pos.y, &x, &y);
/* change handle color to reflect different behaviour for multiple selected */
/* this code relies on the fact that only selected objects get their handles drawn */
some_selected = g_list_length (ddisp->diagram->data->selected) > 1;
- if (handle->connected_to != NULL) {
+ if (handle->connected_to != NULL) {
color = &handle_color_connected[handle->type + (some_selected ? NUM_HANDLE_TYPES : 0)];
} else {
color = &handle_color[handle->type + (some_selected ? NUM_HANDLE_TYPES : 0)];
}
- DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
- DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
- DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
- DIA_RENDERER_GET_CLASS(renderer)->set_fillstyle(renderer, FILLSTYLE_SOLID);
-
-
- irenderer->fill_pixel_rect(renderer,
- x - HANDLE_SIZE/2 + 1,
- y - HANDLE_SIZE/2 + 1,
- HANDLE_SIZE-2, HANDLE_SIZE-2,
- /* it does not change the color, but does not reflect taht in the signature */
- (Color *)color);
-
- irenderer->draw_pixel_rect(renderer,
- x - HANDLE_SIZE/2,
- y - HANDLE_SIZE/2,
- HANDLE_SIZE-1, HANDLE_SIZE-1,
- &color_black);
-
-
-
+ DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, 0.0);
+ DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
+ DIA_RENDERER_GET_CLASS (renderer)->set_linejoin (renderer, LINEJOIN_MITER);
+ DIA_RENDERER_GET_CLASS (renderer)->set_fillstyle (renderer, FILLSTYLE_SOLID);
+
+
+ irenderer->fill_pixel_rect (DIA_INTERACTIVE_RENDERER (renderer),
+ x - HANDLE_SIZE/2 + 1,
+ y - HANDLE_SIZE/2 + 1,
+ HANDLE_SIZE-2, HANDLE_SIZE-2,
+ /* it does not change the color, but does not reflect taht in the signature */
+ (Color *) color);
+
+ irenderer->draw_pixel_rect (DIA_INTERACTIVE_RENDERER (renderer),
+ x - HANDLE_SIZE/2,
+ y - HANDLE_SIZE/2,
+ HANDLE_SIZE-1, HANDLE_SIZE-1,
+ &color_black);
+
if (handle->connect_type != HANDLE_NONCONNECTABLE) {
- irenderer->draw_pixel_line
- (renderer,
- x - HANDLE_SIZE/2, y - HANDLE_SIZE/2,
- x + HANDLE_SIZE/2, y + HANDLE_SIZE/2,
- &color_black);
- irenderer->draw_pixel_line
- (renderer,
- x - HANDLE_SIZE/2, y + HANDLE_SIZE/2,
- x + HANDLE_SIZE/2, y - HANDLE_SIZE/2,
- &color_black);
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x - HANDLE_SIZE/2, y - HANDLE_SIZE/2,
+ x + HANDLE_SIZE/2, y + HANDLE_SIZE/2,
+ &color_black);
+ irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+ x - HANDLE_SIZE/2, y + HANDLE_SIZE/2,
+ x + HANDLE_SIZE/2, y - HANDLE_SIZE/2,
+ &color_black);
}
}
@@ -119,7 +116,7 @@ handle_is_clicked(DDisplay *ddisp, Handle *handle, Point *pos)
if (handle==NULL)
return FALSE;
-
+
dx = ABS(handle->pos.x - pos->x);
dy = ABS(handle->pos.y - pos->y);
diff --git a/app/interface.c b/app/interface.c
index 523788d5..751bb029 100644
--- a/app/interface.c
+++ b/app/interface.c
@@ -46,6 +46,7 @@
#include "widgets.h"
#include "message.h"
#include "ruler.h"
+#include "diainteractiverenderer.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
@@ -355,18 +356,17 @@ notebook_switch_page (GtkNotebook *notebook,
*/
static gboolean
canvas_configure_event (GtkWidget *widget,
- GdkEventConfigure *cevent,
- DDisplay *ddisp)
+ GdkEventConfigure *cevent,
+ DDisplay *ddisp)
{
gboolean new_size = FALSE;
int width, height;
g_return_val_if_fail (widget == ddisp->canvas, FALSE);
-
if (ddisp->renderer) {
- width = dia_renderer_get_width_pixels (ddisp->renderer);
- height = dia_renderer_get_height_pixels (ddisp->renderer);
+ width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+ height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
} else {
/* We can continue even without a renderer here because
* ddisplay_resize_canvas () does the setup for us.
@@ -378,7 +378,7 @@ canvas_configure_event (GtkWidget *widget,
if (width != cevent->width || height != cevent->height) {
g_debug ("%s: Canvas size change...", G_STRLOC);
ddisplay_resize_canvas (ddisp, cevent->width, cevent->height);
- ddisplay_update_scrollbars(ddisp);
+ ddisplay_update_scrollbars (ddisp);
/* on resize stop further propagation - does not help */
new_size = TRUE;
}
@@ -386,8 +386,9 @@ canvas_configure_event (GtkWidget *widget,
/* If the UI is not integrated, resizing should set the resized
* window as active. With integrated UI, there is only one window.
*/
- if (is_integrated_ui () == 0)
- display_set_active(ddisp);
+ if (is_integrated_ui () == 0) {
+ display_set_active (ddisp);
+ }
/* continue propagation with FALSE */
return new_size;
@@ -409,7 +410,7 @@ canvas_expose_event (GtkWidget *widget,
g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
/* Renders updates to pixmap + copies display_areas to canvas(screen) */
- renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+ renderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
/* Only update if update_areas exist */
l = ddisp->update_areas;
@@ -420,15 +421,15 @@ canvas_expose_event (GtkWidget *widget,
g_return_val_if_fail ( renderer->clip_region_clear != NULL
&& renderer->clip_region_add_rect != NULL, FALSE);
- renderer->clip_region_clear (ddisp->renderer);
+ renderer->clip_region_clear (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
- while(l!=NULL) {
+ while ( l!= NULL) {
r = (Rectangle *) l->data;
- rectangle_union(&totrect, r);
- renderer->clip_region_add_rect (ddisp->renderer, r);
+ rectangle_union (&totrect, r);
+ renderer->clip_region_add_rect (DIA_INTERACTIVE_RENDERER (ddisp->renderer), r);
- l = g_slist_next(l);
+ l = g_slist_next (l);
}
/* Free update_areas list: */
l = ddisp->update_areas;
@@ -449,8 +450,10 @@ canvas_expose_event (GtkWidget *widget,
gtk_widget_get_allocation (widget, &alloc);
- dia_interactive_renderer_paint (ddisp->renderer, ctx,
- alloc.width, alloc.height);
+ dia_interactive_renderer_paint (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
+ ctx,
+ alloc.width,
+ alloc.height);
return FALSE;
}
diff --git a/app/modify_tool.c b/app/modify_tool.c
index ca558313..2256d37a 100644
--- a/app/modify_tool.c
+++ b/app/modify_tool.c
@@ -35,6 +35,7 @@
#include "textedit.h"
#include "textline.h"
#include "menus.h"
+#include "diainteractiverenderer.h"
#include "parent.h"
#include "prop_text.h"
@@ -296,7 +297,7 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event,
tool->x1 = tool->x2 = (int) event->x;
tool->y1 = tool->y2 = (int) event->y;
- dia_interactive_renderer_set_selection (ddisp->renderer,
+ dia_interactive_renderer_set_selection (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
TRUE,
tool->x1,
tool->y1,
@@ -643,7 +644,7 @@ modify_motion (ModifyTool *tool,
MAX (tool->start_box.y, tool->end_box.y),
&tool->x2, &tool->y2);
- dia_interactive_renderer_set_selection (ddisp->renderer,
+ dia_interactive_renderer_set_selection (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
TRUE,
tool->x1,
tool->y1,
@@ -784,7 +785,7 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event,
gdk_pointer_ungrab (event->time);
/* Remove last box: */
- dia_interactive_renderer_set_selection (ddisp->renderer,
+ dia_interactive_renderer_set_selection (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
FALSE, 0, 0, 0, 0);
{
diff --git a/lib/arrows.c b/lib/arrows.c
index 1bb32f78..c07f2a5b 100644
--- a/lib/arrows.c
+++ b/lib/arrows.c
@@ -25,6 +25,7 @@
#include <glib.h>
#include "diacontext.h"
+#include "diainteractiverenderer.h"
#include "boundingbox.h"
#ifdef G_OS_WIN32
@@ -2375,7 +2376,7 @@ arrow_draw (DiaRenderer *renderer,
break;
}
}
- if ((type != ARROW_NONE) && (render_bounding_boxes ()) && (renderer->is_interactive)) {
+ if ((type != ARROW_NONE) && (render_bounding_boxes ()) && DIA_IS_INTERACTIVE_RENDERER (renderer)) {
Arrow arrow = {type, length, width};
Rectangle bbox = {0, };
Point p1, p2;
diff --git a/lib/diagramdata.c b/lib/diagramdata.c
index 88d67bf2..05fcef47 100644
--- a/lib/diagramdata.c
+++ b/lib/diagramdata.c
@@ -25,6 +25,7 @@
#include "intl.h"
#include "diagramdata.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "paper.h"
#include "persistence.h"
@@ -802,28 +803,34 @@ data_emit(DiagramData *data, Layer *layer, DiaObject* obj,
* \memberof _DiagramData
*/
void
-data_render(DiagramData *data, DiaRenderer *renderer, Rectangle *update,
- ObjectRenderer obj_renderer, gpointer gdata)
+data_render (DiagramData *data,
+ DiaRenderer *renderer,
+ Rectangle *update,
+ ObjectRenderer obj_renderer,
+ gpointer gdata)
{
Layer *layer;
guint i, active_layer;
- if (!renderer->is_interactive)
- (DIA_RENDERER_GET_CLASS(renderer)->begin_render)(renderer, update);
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+ (DIA_RENDERER_GET_CLASS (renderer)->begin_render) (renderer, update);
+ }
- for (i=0; i<data->layers->len; i++) {
- layer = (Layer *) g_ptr_array_index(data->layers, i);
+ for (i = 0; i < data->layers->len; i++) {
+ layer = (Layer *) g_ptr_array_index (data->layers, i);
active_layer = (layer == data->active_layer);
if (layer->visible) {
- if (obj_renderer)
- layer_render(layer, renderer, update, obj_renderer, gdata, active_layer);
- else
- (DIA_RENDERER_GET_CLASS(renderer)->draw_layer)(renderer, layer, active_layer, update);
+ if (obj_renderer) {
+ layer_render (layer, renderer, update, obj_renderer, gdata, active_layer);
+ } else {
+ (DIA_RENDERER_GET_CLASS (renderer)->draw_layer) (renderer, layer, active_layer, update);
+ }
}
}
- if (!renderer->is_interactive)
- (DIA_RENDERER_GET_CLASS(renderer)->end_render)(renderer);
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+ (DIA_RENDERER_GET_CLASS (renderer)->end_render) (renderer);
+ }
}
/*!
diff --git a/lib/diainteractiverenderer.c b/lib/diainteractiverenderer.c
index 64e4d784..980af53b 100644
--- a/lib/diainteractiverenderer.c
+++ b/lib/diainteractiverenderer.c
@@ -21,11 +21,47 @@
*/
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
+
+/**
+ * SECTION:dia-interactive-renderer
+ * @title: DiaInteractiveRenderer
+ * @short_description: #DiaRenderer for displays
+ *
+ * Interface to be provide by interactive renderers
+ *
+ * The interactive renderer interface extends a renderer with clipping
+ * and drawing with pixel coordinates.
+ */
+
+static int
+get_width_pixels (DiaInteractiveRenderer *self)
+{
+ g_return_val_if_fail (DIA_IS_INTERACTIVE_RENDERER (self), 0);
+
+ g_critical ("get_width_pixels isn't implemented for %s",
+ g_type_name (G_TYPE_FROM_INSTANCE (self)));
+
+ return 0;
+}
+
+static int
+get_height_pixels (DiaInteractiveRenderer *self)
+{
+ g_return_val_if_fail (DIA_IS_INTERACTIVE_RENDERER (self), 0);
+
+ g_critical ("get_height_pixels isn't implemented for %s",
+ g_type_name (G_TYPE_FROM_INSTANCE (self)));
+
+ return 0;
+}
static void
dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
{
/* NULL initialization probably already done by GObject */
+ iface->get_width_pixels = get_width_pixels;
+ iface->get_height_pixels = get_height_pixels;
iface->clip_region_clear = NULL;
iface->clip_region_add_rect = NULL;
iface->draw_pixel_line = NULL;
@@ -37,7 +73,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
}
GType
-dia_interactive_renderer_interface_get_type (void)
+dia_interactive_renderer_get_type (void)
{
static GType iface_type = 0;
@@ -50,62 +86,126 @@ dia_interactive_renderer_interface_get_type (void)
(GBaseFinalizeFunc) NULL,
};
- iface_type = g_type_register_static (G_TYPE_INTERFACE,
- "DiaInteractiveRendererInterface",
- &iface_info,
+ iface_type = g_type_register_static (G_TYPE_INTERFACE,
+ "DiaInteractiveRendererInterface",
+ &iface_info,
0);
- g_type_interface_add_prerequisite (iface_type,
+ g_type_interface_add_prerequisite (iface_type,
DIA_TYPE_RENDERER);
}
-
+
return iface_type;
}
-/*
- * Wrapper functions using the above
+/**
+ * dia_interactive_renderer_set_size:
+ * @self: the #DiaInteractiveRenderer
+ * @window: the #GdkWindow
+ * @width: width of the canvas
+ * @height: height of the canvas
+ *
+ * Size adjustment to the given window
+ *
+ * Since: 0.98
*/
-void
-dia_renderer_set_size (DiaRenderer* renderer, gpointer window,
- int width, int height)
+void
+dia_interactive_renderer_set_size (DiaInteractiveRenderer *self,
+ gpointer window,
+ int width,
+ int height)
{
DiaInteractiveRendererInterface *irenderer =
- DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+ DIA_INTERACTIVE_RENDERER_GET_IFACE (self);
g_return_if_fail (irenderer != NULL);
g_return_if_fail (irenderer->set_size != NULL);
- irenderer->set_size (renderer, window, width, height);
+ irenderer->set_size (self, window, width, height);
}
+/**
+ * dia_interactive_renderer_paint:
+ * @self: the #DiaInteractiveRenderer
+ * @ctx: the #cairo_t
+ * @width: width of the canvas
+ * @height: height of the canvas
+ *
+ * Draw @self to @ctx
+ *
+ * Since: 0.98
+ */
void
-dia_interactive_renderer_paint (DiaRenderer *renderer,
- cairo_t *ctx,
- int width,
- int height)
+dia_interactive_renderer_paint (DiaInteractiveRenderer *self,
+ cairo_t *ctx,
+ int width,
+ int height)
{
DiaInteractiveRendererInterface *irenderer =
- DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
-
+ DIA_INTERACTIVE_RENDERER_GET_IFACE (self);
+
g_return_if_fail (irenderer != NULL);
g_return_if_fail (irenderer->paint != NULL);
- irenderer->paint (renderer, ctx, width, height);
+ irenderer->paint (self, ctx, width, height);
}
+/**
+ * dia_interactive_renderer_set_selection:
+ * @self: the #DiaInteractiveRenderer
+ * @has_selection: if %TRUE the selection box should be drawn
+ * @x: horizontal position of the selection
+ * @y: vertical position of the selection
+ * @width: width of the selection
+ * @height: height of the selection
+ *
+ * Since: 0.98
+ */
void
-dia_interactive_renderer_set_selection (DiaRenderer *renderer,
- gboolean has_selection,
- double x,
- double y,
- double width,
- double height)
+dia_interactive_renderer_set_selection (DiaInteractiveRenderer *self,
+ gboolean has_selection,
+ double x,
+ double y,
+ double width,
+ double height)
{
DiaInteractiveRendererInterface *irenderer =
- DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
-
+ DIA_INTERACTIVE_RENDERER_GET_IFACE (self);
+
g_return_if_fail (irenderer != NULL);
g_return_if_fail (irenderer->set_selection != NULL);
- irenderer->set_selection (renderer, has_selection, x, y, width, height);
+ irenderer->set_selection (self, has_selection, x, y, width, height);
+}
+
+/**
+ * dia_interactive_renderer_get_width_pixels:
+ * @self: the #DiaInteractiveRenderer
+ *
+ * Get the width in pixels of the drawing area (if any)
+ *
+ * Returns: the width
+ *
+ * Since: 0.98
+ */
+int
+dia_interactive_renderer_get_width_pixels (DiaInteractiveRenderer *self)
+{
+ return DIA_INTERACTIVE_RENDERER_GET_IFACE (self)->get_width_pixels (self);
+}
+
+/**
+ * dia_interactive_renderer_get_height_pixels:
+ * @self: the #DiaInteractiveRenderer
+ *
+ * Get the height in pixels of the drawing area (if any)
+ *
+ * Returns: the height
+ *
+ * Since: 0.98
+ */
+int
+dia_interactive_renderer_get_height_pixels (DiaInteractiveRenderer *self)
+{
+ return DIA_INTERACTIVE_RENDERER_GET_IFACE (self)->get_height_pixels (self);
}
diff --git a/lib/diainteractiverenderer.h b/lib/diainteractiverenderer.h
new file mode 100644
index 00000000..de3af04d
--- /dev/null
+++ b/lib/diainteractiverenderer.h
@@ -0,0 +1,119 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1998 Alexander Larsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#pragma once
+
+#include "diatypes.h"
+#include <glib-object.h>
+#include <glib.h>
+
+#include "dia-enums.h"
+
+#include "diagramdata.h"
+
+G_BEGIN_DECLS
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (DiaRenderer, g_object_unref)
+
+#define DIA_TYPE_INTERACTIVE_RENDERER dia_interactive_renderer_get_type ()
+G_DECLARE_INTERFACE (DiaInteractiveRenderer, dia_interactive_renderer, DIA, INTERACTIVE_RENDERER,
DiaRenderer)
+
+
+/**
+ * DiaInteractiveRendererInterface:
+ * @get_width_pixels: return width in pixels
+ * @get_height_pixels: return height in pixels
+ * @set_size: set the output size
+ * @clip_region_clear: Clear the current clipping region
+ * @clip_region_add_rect: Add a rectangle to the current clipping region
+ * @draw_pixel_line: Draw a line from start to end, using color and the
+ * current line style
+ * @draw_pixel_rect: Draw a rectangle, given its upper-left and lower-right
+ * corners in pixels
+ * @fill_pixel_rect: Fill a rectangle, given its upper-left and lower-right
+ * corners in pixels
+ * @paint: Copy already rendered content to the given context
+ * @draw_object_highlighted: Support for drawing selected objects highlighted
+ * @set_selection: Set the current selection box
+ */
+struct _DiaInteractiveRendererInterface
+{
+ /* < private > */
+ GTypeInterface base_iface;
+
+ /* < public > */
+ int (*get_width_pixels) (DiaInteractiveRenderer *self);
+ int (*get_height_pixels) (DiaInteractiveRenderer *self);
+ void (*set_size) (DiaInteractiveRenderer *self,
+ gpointer window,
+ int width,
+ int height);
+ void (*clip_region_clear) (DiaInteractiveRenderer *self);
+ void (*clip_region_add_rect) (DiaInteractiveRenderer *self,
+ Rectangle *rect);
+ void (*draw_pixel_line) (DiaInteractiveRenderer *self,
+ int x1,
+ int y1,
+ int x2,
+ int y2,
+ Color *color);
+ void (*draw_pixel_rect) (DiaInteractiveRenderer *self,
+ int x,
+ int y,
+ int width,
+ int height,
+ Color *color);
+ void (*fill_pixel_rect) (DiaInteractiveRenderer *self,
+ int x,
+ int y,
+ int width,
+ int height,
+ Color *color);
+ void (*paint) (DiaInteractiveRenderer *self,
+ cairo_t *ctx,
+ int width,
+ int height);
+ void (*draw_object_highlighted) (DiaInteractiveRenderer *self,
+ DiaObject *object,
+ DiaHighlightType type);
+ void (*set_selection) (DiaInteractiveRenderer *self,
+ gboolean has_selection,
+ double x,
+ double y,
+ double width,
+ double height);
+};
+
+void dia_interactive_renderer_paint (DiaInteractiveRenderer *self,
+ cairo_t *ctx,
+ int width,
+ int height);
+void dia_interactive_renderer_set_selection (DiaInteractiveRenderer *self,
+ gboolean has_selection,
+ double x,
+ double y,
+ double width,
+ double height);
+void dia_interactive_renderer_set_size (DiaInteractiveRenderer *self,
+ gpointer window,
+ int width,
+ int height);
+int dia_interactive_renderer_get_width_pixels (DiaInteractiveRenderer *self);
+int dia_interactive_renderer_get_height_pixels (DiaInteractiveRenderer *self);
+
+G_END_DECLS
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index a97fd976..292a72c8 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -51,9 +51,6 @@ struct _BezierApprox {
static void dia_renderer_class_init (DiaRendererClass *klass);
-static int get_width_pixels (DiaRenderer *);
-static int get_height_pixels (DiaRenderer *);
-
static void begin_render (DiaRenderer *, const Rectangle *update);
static void end_render (DiaRenderer *);
@@ -311,8 +308,6 @@ dia_renderer_class_init (DiaRendererClass *klass)
object_class->finalize = renderer_finalize;
- renderer_class->get_width_pixels = get_width_pixels;
- renderer_class->get_height_pixels = get_height_pixels;
renderer_class->draw_layer = draw_layer;
renderer_class->draw_object = draw_object;
renderer_class->get_text_width = get_text_width;
@@ -1424,49 +1419,62 @@ draw_rounded_polyline_with_arrows(DiaRenderer *renderer,
points[lastline-1] = oldend;
}
-/** Figure the equation for a line given by two points.
- * Returns FALSE if the line is vertical (infinite a).
+/**
+ * points_to_line:
+ *
+ * Figure the equation for a line given by two points.
+ *
+ * Returns: %FALSE if the line is vertical (infinite a).
*/
static gboolean
-points_to_line(real *a, real *b, Point *p1, Point *p2)
+points_to_line (real *a, real *b, Point *p1, Point *p2)
{
- if (fabs(p1->x - p2->x) < 0.000000001)
- return FALSE;
- *a = (p2->y-p1->y)/(p2->x-p1->x);
- *b = p1->y-(*a)*p1->x;
- return TRUE;
+ if (fabs (p1->x - p2->x) < 0.000000001) {
+ return FALSE;
+ }
+ *a = (p2->y-p1->y)/(p2->x-p1->x);
+ *b = p1->y-(*a)*p1->x;
+ return TRUE;
}
-/** Find the intersection between two lines.
- * Returns TRUE if the lines intersect in a single point.
+/**
+ * intersection_line_line:
+ *
+ * Find the intersection between two lines.
+ *
+ * Returns: %TRUE if the lines intersect in a single point.
*/
static gboolean
-intersection_line_line(Point *cross,
- Point *p1a, Point *p1b,
- Point *p2a, Point *p2b)
+intersection_line_line (Point *cross,
+ Point *p1a,
+ Point *p1b,
+ Point *p2a,
+ Point *p2b)
{
real a1, b1, a2, b2;
/* Find coefficients of lines */
- if (!(points_to_line(&a1, &b1, p1a, p1b))) {
- if (!(points_to_line(&a2, &b2, p2a, p2b))) {
- if (fabs(p1a->x-p2a->x) < 0.00000001) {
- *cross = *p1a;
- return TRUE;
- } else return FALSE;
+ if (!(points_to_line (&a1, &b1, p1a, p1b))) {
+ if (!(points_to_line (&a2, &b2, p2a, p2b))) {
+ if (fabs (p1a->x-p2a->x) < 0.00000001) {
+ *cross = *p1a;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
}
cross->x = p1a->x;
cross->y = a2*(p1a->x)+b2;
return TRUE;
}
- if (!(points_to_line(&a2, &b2, p2a, p2b))) {
+ if (!(points_to_line (&a2, &b2, p2a, p2b))) {
cross->x = p2a->x;
cross->y = a1*(p2a->x)+b1;
return TRUE;
}
/* Solve */
- if (fabs(a1-a2) < 0.000000001) {
- if (fabs(b1-b2) < 0.000000001) {
+ if (fabs (a1-a2) < 0.000000001) {
+ if (fabs (b1-b2) < 0.000000001) {
*cross = *p1a;
return TRUE;
} else {
@@ -1486,13 +1494,21 @@ intersection_line_line(Point *cross,
}
}
-/** Given three points, find the center of the circle they describe.
- * Returns FALSE if the center could not be determined (i.e. the points
- * all lie really close together).
+/**
+ * find_center_point:
+ *
+ * Given three points, find the center of the circle they describe.
+ *
* The renderer should disappear once the debugging is done.
+ *
+ * Returns: %FALSE if the center could not be determined (i.e. the points
+ * all lie really close together).
*/
static gboolean
-find_center_point(Point *center, const Point *p1, const Point *p2, const Point *p3)
+find_center_point (Point *center,
+ const Point *p1,
+ const Point *p2,
+ const Point *p3)
{
Point mid1;
Point mid2;
@@ -1781,27 +1797,6 @@ get_text_width (DiaRenderer *renderer,
return ret;
}
-/*!
- * \brief Get drawing width in pixels if any
- * \memberof _DiaRenderer \pure
- */
-static int
-get_width_pixels (DiaRenderer *renderer)
-{
- g_return_val_if_fail (renderer->is_interactive, 0);
- return 0;
-}
-
-/*!
- * \brief Get drawing height in pixels if any
- * \memberof _DiaRenderer \pure
- */
-static int
-get_height_pixels (DiaRenderer *renderer)
-{
- g_return_val_if_fail (renderer->is_interactive, 0);
- return 0;
-}
/*! @} */
/*!
@@ -1839,28 +1834,6 @@ set_pattern (DiaRenderer *renderer, DiaPattern *pat)
G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
}
-/*!
- * \brief Get the width in pixels of the drawing area (if any)
- *
- * \relates _DiaRenderer
- */
-int
-dia_renderer_get_width_pixels (DiaRenderer *renderer)
-{
- return DIA_RENDERER_GET_CLASS(renderer)->get_width_pixels (renderer);
-}
-
-/*!
- * \brief Get the height in pixels of the drawing area (if any)
- *
- * \relates _DiaRenderer
- */
-int
-dia_renderer_get_height_pixels (DiaRenderer *renderer)
-{
- return DIA_RENDERER_GET_CLASS(renderer)->get_height_pixels (renderer);
-}
-
/*!
* \brief Helper function to fill bezier with multiple BEZ_MOVE_TO
* A slightly improved version to split a bezier with multiple move-to into
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index bb1b1002..80085687 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -51,20 +51,23 @@ typedef enum {
GType dia_renderer_get_type (void) G_GNUC_CONST;
-/*!
- * \brief The member variables part of _DiaRenderer
+/**
+ * DiaRenderer:
+ * @font: the current #DiaFont
+ * @font_height: the height of @font
+ * @bezier: ???
+ *
+ * The member variables part of _DiaRenderer
*
* The Dia renderers are already realized with the GObject type system.
* Most of the renderers are only used for export, but there are also
* some renderers capable of interaction (i.e. display). These are
- * extended versions providing also the _DiaInteractiveRendererInterface
- *
- * \ingroup Renderers
+ * extended versions providing also the #DiaInteractiveRenderer
*/
struct _DiaRenderer
{
GObject parent_instance; /*!< inheritance in object oriented C */
- gboolean is_interactive; /*!< if the user can interact */
+
/*< private >*/
DiaFont *font;
real font_height; /* IMO It should be possible use the font's size to keep
@@ -84,10 +87,6 @@ struct _DiaRendererClass
{
GObjectClass parent_class; /*!< the base class */
- /*! return width in pixels, only for interactive renderers */
- int (*get_width_pixels) (DiaRenderer*);
- /*! return width in pixels, only for interactive renderers */
- int (*get_height_pixels) (DiaRenderer*);
/*! \brief Render all the visible object in the layer */
void (*draw_layer) (DiaRenderer*, Layer *, gboolean, Rectangle *);
/*! Calls the objects draw function, which calls the renderer again
@@ -263,92 +262,6 @@ struct _DiaRendererClass
DiaImage *image);
};
-/*
- * Declare the Interactive Renderer Interface, which get's added
- * to some renderer classes by app/
- */
-#define DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE (dia_interactive_renderer_interface_get_type ())
-#define DIA_GET_INTERACTIVE_RENDERER_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj),
DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, DiaInteractiveRendererInterface))
-
-/*!
- * \brief Interface to be provide by interactive renderers
- *
- * The interactive renderer interface extends a renderer with clipping
- * and drawing with pixel coordinates.
- *
- * \ingroup Renderers
- */
-struct _DiaInteractiveRendererInterface
-{
- GTypeInterface base_iface;
-
- /*! Clear the current clipping region. */
- void (*set_size) (DiaRenderer *renderer, gpointer, int, int);
-
- /*! Clear the current clipping region. */
- void (*clip_region_clear) (DiaRenderer *renderer);
-
- /*! Add a rectangle to the current clipping region. */
- void (*clip_region_add_rect) (DiaRenderer *renderer, Rectangle *rect);
-
- /*! Draw a line from start to end, using color and the current line style */
- void (*draw_pixel_line) (DiaRenderer *renderer,
- int x1, int y1, int x2, int y2,
- Color *color);
- /*! Draw a rectangle, given its upper-left and lower-right corners in pixels. */
- void (*draw_pixel_rect) (DiaRenderer *renderer,
- int x, int y, int width, int height,
- Color *color);
- /*! Fill a rectangle, given its upper-left and lower-right corners in pixels. */
- void (*fill_pixel_rect) (DiaRenderer *renderer,
- int x, int y, int width, int height,
- Color *color);
- /*! Copy already rendered content to the given context */
- void (*paint) (DiaRenderer *renderer,
- cairo_t *ctx,
- int width,
- int height);
- /*! Support for drawing selected objects highlighted */
- void (*draw_object_highlighted) (DiaRenderer *renderer,
- DiaObject *object,
- DiaHighlightType type);
- /* Draw a selection box */
- void (*set_selection) (DiaRenderer *renderer,
- gboolean has_selection,
- double x,
- double y,
- double width,
- double height);
-};
-
-GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST;
-
-void dia_interactive_renderer_paint (DiaRenderer *renderer,
- cairo_t *ctx,
- int width,
- int height);
-void dia_interactive_renderer_set_selection (DiaRenderer *renderer,
- gboolean has_selection,
- double x,
- double y,
- double width,
- double height);
-/*!
- * \brief Size adjustment to the given window
- * \memberof DiaInteractiveRendererInterface
- */
-void dia_renderer_set_size (DiaRenderer*, gpointer window, int, int);
-/*!
- * \brief Get the width in pixels
- * \memberof DiaInteractiveRendererInterface
- */
-int dia_renderer_get_width_pixels (DiaRenderer*);
-/*!
- * \brief Get the height in pixels
- * \memberof DiaInteractiveRendererInterface
- */
-int dia_renderer_get_height_pixels (DiaRenderer*);
-
/* Some standalone render helper functiions */
void bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *color);
void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color);
diff --git a/lib/layer.c b/lib/layer.c
index 6c6208c1..5f679cce 100644
--- a/lib/layer.c
+++ b/lib/layer.c
@@ -21,6 +21,7 @@
#include "intl.h"
#include "diagramdata.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "dynamic_obj.h"
static const Rectangle invalid_extents = { -1.0,-1.0,-1.0,-1.0 };
@@ -59,23 +60,26 @@ render_bounding_boxes (void)
}
/*!
- * \brief Render all components of a single layer.
+ * layer_render:
+ * @layer: The layer to render.
+ * @renderer: The renderer to draw things with.
+ * @update: The rectangle that requires update. Only objects that
+ * intersect with this rectangle will actually be get rendered.
+ * @obj_renderer: A function that will render an object.
+ * @data: The diagram that the layer belongs to.
+ * @active_layer: Which number layer in the diagram is currently active.
+ *
+ * Render all components of a single layer.
*
* This function also handles rendering of bounding boxes for debugging purposes.
- * @param layer The layer to render.
- * @param renderer The renderer to draw things with.
- * @param update The rectangle that requires update. Only objects that
- * intersect with this rectangle will actually be get rendered.
- * @param obj_renderer A function that will render an object.
- * @param data The diagram that the layer belongs to.
- * @param active_layer Which number layer in the diagram is currently active.
- * \memberof _Layer
*/
void
-layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update,
- ObjectRenderer obj_renderer,
- gpointer data,
- int active_layer)
+layer_render (Layer *layer,
+ DiaRenderer *renderer,
+ Rectangle *update,
+ ObjectRenderer obj_renderer,
+ gpointer data,
+ int active_layer)
{
GList *list;
DiaObject *obj;
@@ -85,29 +89,29 @@ layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update,
/* Draw all objects: */
list = layer->objects;
- while (list!=NULL) {
+ while (list != NULL) {
obj = (DiaObject *) list->data;
- if (update==NULL || rectangle_intersects(update, &obj->bounding_box)) {
- if ((render_bounding_boxes()) && (renderer->is_interactive)) {
- Point p1, p2;
- Color col;
- p1.x = obj->bounding_box.left;
- p1.y = obj->bounding_box.top;
- p2.x = obj->bounding_box.right;
- p2.y = obj->bounding_box.bottom;
- col.red = 1.0;
- col.green = 0.0;
- col.blue = 1.0;
- col.alpha = 1.0;
-
- DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer,0.01);
- DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, NULL, &col);
+ if (update==NULL || rectangle_intersects (update, &obj->bounding_box)) {
+ if ((render_bounding_boxes ()) && DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+ Point p1, p2;
+ Color col;
+ p1.x = obj->bounding_box.left;
+ p1.y = obj->bounding_box.top;
+ p2.x = obj->bounding_box.right;
+ p2.y = obj->bounding_box.bottom;
+ col.red = 1.0;
+ col.green = 0.0;
+ col.blue = 1.0;
+ col.alpha = 1.0;
+
+ DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer,0.01);
+ DIA_RENDERER_GET_CLASS (renderer)->draw_rect (renderer, &p1, &p2, NULL, &col);
}
- (*obj_renderer)(obj, renderer, active_layer, data);
+ (*obj_renderer) (obj, renderer, active_layer, data);
}
- list = g_list_next(list);
+ list = g_list_next (list);
}
}
diff --git a/lib/meson.build b/lib/meson.build
index 2e7f0ce9..a1ffa21f 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -69,6 +69,7 @@ libdia_sources = stdprop_sources + [
'diarenderer.c',
'diaimportrenderer.c',
'diainteractiverenderer.c',
+ 'diainteractiverenderer.h',
'renderer/diacairo.c',
'renderer/diacairo-renderer.c',
'renderer/diacairo-interactive.c',
diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c
index 628d6958..8950ce8c 100644
--- a/lib/renderer/diacairo-interactive.c
+++ b/lib/renderer/diacairo-interactive.c
@@ -30,6 +30,7 @@
#include "diatransform.h"
#include "object.h"
#include "textline.h"
+#include "diainteractiverenderer.h"
struct _DiaCairoInteractiveRenderer {
DiaCairoRenderer parent_instance;
@@ -57,7 +58,7 @@ struct _DiaCairoInteractiveRenderer {
static void dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface);
G_DEFINE_TYPE_WITH_CODE (DiaCairoInteractiveRenderer, dia_cairo_interactive_renderer,
DIA_CAIRO_TYPE_RENDERER,
- G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE,
dia_cairo_interactive_renderer_iface_init))
+ G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER,
dia_cairo_interactive_renderer_iface_init))
enum {
PROP_0,
@@ -69,9 +70,6 @@ static void
dia_cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
- DiaRenderer *dia_renderer = DIA_RENDERER (object);
-
- dia_renderer->is_interactive = 1;
renderer->surface = NULL;
@@ -139,7 +137,7 @@ dia_cairo_interactive_renderer_get_property (GObject *object,
}
static int
-dia_cairo_interactive_renderer_get_width_pixels (DiaRenderer *object)
+dia_cairo_interactive_renderer_get_width_pixels (DiaInteractiveRenderer *object)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
@@ -147,7 +145,7 @@ dia_cairo_interactive_renderer_get_width_pixels (DiaRenderer *object)
}
static int
-dia_cairo_interactive_renderer_get_height_pixels (DiaRenderer *object)
+dia_cairo_interactive_renderer_get_height_pixels (DiaInteractiveRenderer *object)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
@@ -350,9 +348,6 @@ dia_cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *kla
G_PARAM_READWRITE));
/* renderer members */
- renderer_class->get_width_pixels = dia_cairo_interactive_renderer_get_width_pixels;
- renderer_class->get_height_pixels = dia_cairo_interactive_renderer_get_height_pixels;
-
renderer_class->begin_render = dia_cairo_interactive_renderer_begin_render;
renderer_class->end_render = dia_cairo_interactive_renderer_end_render;
@@ -363,7 +358,7 @@ dia_cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *kla
}
static void
-dia_cairo_interactive_renderer_clip_region_clear (DiaRenderer *object)
+dia_cairo_interactive_renderer_clip_region_clear (DiaInteractiveRenderer *object)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
@@ -375,8 +370,8 @@ dia_cairo_interactive_renderer_clip_region_clear (DiaRenderer *object)
}
static void
-dia_cairo_interactive_renderer_clip_region_add_rect (DiaRenderer *object,
- Rectangle *rect)
+dia_cairo_interactive_renderer_clip_region_add_rect (DiaInteractiveRenderer *object,
+ Rectangle *rect)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
cairo_rectangle_int_t clip_rect;
@@ -399,12 +394,12 @@ dia_cairo_interactive_renderer_clip_region_add_rect (DiaRenderer *object,
}
static void
-dia_cairo_interactive_renderer_draw_pixel_line (DiaRenderer *object,
- int x1,
- int y1,
- int x2,
- int y2,
- Color *color)
+dia_cairo_interactive_renderer_draw_pixel_line (DiaInteractiveRenderer *object,
+ int x1,
+ int y1,
+ int x2,
+ int y2,
+ Color *color)
{
DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5;
@@ -424,12 +419,12 @@ dia_cairo_interactive_renderer_draw_pixel_line (DiaRenderer *object,
}
static void
-dia_cairo_interactive_renderer_draw_pixel_rect (DiaRenderer *object,
- int x,
- int y,
- int width,
- int height,
- Color *color)
+dia_cairo_interactive_renderer_draw_pixel_rect (DiaInteractiveRenderer *object,
+ int x,
+ int y,
+ int width,
+ int height,
+ Color *color)
{
DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
@@ -448,12 +443,12 @@ dia_cairo_interactive_renderer_draw_pixel_rect (DiaRenderer *object,
}
static void
-dia_cairo_interactive_renderer_fill_pixel_rect (DiaRenderer *object,
- int x,
- int y,
- int width,
- int height,
- Color *color)
+dia_cairo_interactive_renderer_fill_pixel_rect (DiaInteractiveRenderer *object,
+ int x,
+ int y,
+ int width,
+ int height,
+ Color *color)
{
DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
@@ -472,10 +467,10 @@ dia_cairo_interactive_renderer_fill_pixel_rect (DiaRenderer *object,
}
static void
-dia_cairo_interactive_renderer_paint (DiaRenderer *object,
- cairo_t *ctx,
- int width,
- int height)
+dia_cairo_interactive_renderer_paint (DiaInteractiveRenderer *object,
+ cairo_t *ctx,
+ int width,
+ int height)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
double dashes[1] = {3};
@@ -512,10 +507,10 @@ dia_cairo_interactive_renderer_paint (DiaRenderer *object,
}
static void
-dia_cairo_interactive_renderer_set_size (DiaRenderer *object,
- gpointer window,
- int width,
- int height)
+dia_cairo_interactive_renderer_set_size (DiaInteractiveRenderer *object,
+ gpointer window,
+ int width,
+ int height)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object);
@@ -535,9 +530,9 @@ dia_cairo_interactive_renderer_set_size (DiaRenderer *object,
static Color text_edit_color = {1.0, 1.0, 0.7 };
static void
-dia_cairo_interactive_renderer_draw_object_highlighted (DiaRenderer *self,
- DiaObject *object,
- DiaHighlightType type)
+dia_cairo_interactive_renderer_draw_object_highlighted (DiaInteractiveRenderer *self,
+ DiaObject *object,
+ DiaHighlightType type)
{
DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self);
@@ -555,18 +550,18 @@ dia_cairo_interactive_renderer_draw_object_highlighted (DiaRenderer *self,
/* usually this method would need to draw the object twice,
* once with highlight and once without. But due to our
* draw_text_line implementation we only need one run */
- dia_object_draw (object, self);
+ dia_object_draw (object, DIA_RENDERER (self));
/* always reset when done with this object */
interactive->highlight_color = NULL;
}
static void
-dia_cairo_interactive_renderer_set_selection (DiaRenderer *renderer,
- gboolean has_selection,
- double x,
- double y,
- double width,
- double height)
+dia_cairo_interactive_renderer_set_selection (DiaInteractiveRenderer *renderer,
+ gboolean has_selection,
+ double x,
+ double y,
+ double width,
+ double height)
{
DiaCairoInteractiveRenderer *self = DIA_CAIRO_INTERACTIVE_RENDERER (renderer);
@@ -580,6 +575,8 @@ dia_cairo_interactive_renderer_set_selection (DiaRenderer *renderer,
static void
dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface)
{
+ iface->get_width_pixels = dia_cairo_interactive_renderer_get_width_pixels;
+ iface->get_height_pixels = dia_cairo_interactive_renderer_get_height_pixels;
iface->clip_region_clear = dia_cairo_interactive_renderer_clip_region_clear;
iface->clip_region_add_rect = dia_cairo_interactive_renderer_clip_region_add_rect;
iface->draw_pixel_line = dia_cairo_interactive_renderer_draw_pixel_line;
diff --git a/lib/renderer/diacairo-renderer.c b/lib/renderer/diacairo-renderer.c
index 56467fc9..5c7af2e3 100644
--- a/lib/renderer/diacairo-renderer.c
+++ b/lib/renderer/diacairo-renderer.c
@@ -562,7 +562,7 @@ dia_cairo_renderer_set_font (DiaRenderer *self, DiaFont *font, real height)
pango_font_description_free (pfd);
/* for the interactive case we must maintain the font field in the base class */
- if (self->is_interactive) {
+ if (DIA_IS_INTERACTIVE_RENDERER (self)) {
dia_font_ref (font);
if (self->font) {
dia_font_unref (self->font);
diff --git a/lib/renderer/diacairo.h b/lib/renderer/diacairo.h
index 6cc5977c..1cd37e9b 100644
--- a/lib/renderer/diacairo.h
+++ b/lib/renderer/diacairo.h
@@ -21,6 +21,7 @@
#include <cairo.h>
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
/*
#define DEBUG_CAIRO
@@ -41,8 +42,6 @@
/* --- the renderer base class --- */
G_BEGIN_DECLS
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (DiaRenderer, g_object_unref)
-
#define DIA_CAIRO_TYPE_RENDERER dia_cairo_renderer_get_type ()
G_DECLARE_FINAL_TYPE (DiaCairoRenderer, dia_cairo_renderer, DIA_CAIRO, RENDERER, DiaRenderer)
diff --git a/lib/text.c b/lib/text.c
index 137d0791..75f365ba 100644
--- a/lib/text.c
+++ b/lib/text.c
@@ -28,6 +28,7 @@
#include "propinternals.h"
#include "text.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "diagramdata.h"
#include "objchange.h"
#include "textline.h"
@@ -556,9 +557,9 @@ text_distance_from(Text *text, Point *point)
void
text_draw(Text *text, DiaRenderer *renderer)
{
- DIA_RENDERER_GET_CLASS(renderer)->draw_text(renderer, text);
+ DIA_RENDERER_GET_CLASS (renderer)->draw_text (renderer, text);
- if ((renderer->is_interactive) && (text->focus.has_focus)) {
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer) && (text->focus.has_focus)) {
real curs_x, curs_y;
real str_width_first;
real str_width_whole;
@@ -566,16 +567,16 @@ text_draw(Text *text, DiaRenderer *renderer)
real height = text->ascent+text->descent;
curs_y = text->position.y - text->ascent + text->cursor_row*text->height;
- DIA_RENDERER_GET_CLASS(renderer)->set_font(renderer, text->font, text->height);
+ DIA_RENDERER_GET_CLASS (renderer)->set_font (renderer, text->font, text->height);
str_width_first =
- DIA_RENDERER_GET_CLASS(renderer)->get_text_width(renderer,
- text_get_line(text, text->cursor_row),
- text->cursor_pos);
+ DIA_RENDERER_GET_CLASS (renderer)->get_text_width (renderer,
+ text_get_line (text, text->cursor_row),
+ text->cursor_pos);
str_width_whole =
- DIA_RENDERER_GET_CLASS(renderer)->get_text_width(renderer,
- text_get_line(text, text->cursor_row),
- text_get_line_strlen(text, text->cursor_row));
+ DIA_RENDERER_GET_CLASS (renderer)->get_text_width (renderer,
+ text_get_line (text, text->cursor_row),
+ text_get_line_strlen (text, text->cursor_row));
curs_x = text->position.x + str_width_first;
switch (text->alignment) {
@@ -664,8 +665,9 @@ text_move_cursor(Text *text, CursorMovement mv)
/* The renderer is only used to determine where the click is, so is not
* required when no point is given. */
void
-text_set_cursor(Text *text, Point *clicked_point,
- DiaRenderer *renderer)
+text_set_cursor (Text *text,
+ Point *clicked_point,
+ DiaRenderer *renderer)
{
real str_width_whole;
real str_width_first;
@@ -688,18 +690,18 @@ text_set_cursor(Text *text, Point *clicked_point,
text->cursor_row = row;
text->cursor_pos = 0;
- if (!renderer->is_interactive) {
- g_warning("Internal error: Select gives non interactive renderer!\n"
- "val: %d\n", renderer->is_interactive);
+ if (!DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+ g_warning ("Internal error: Select gives non interactive renderer!\n"
+ "renderer: %s", g_type_name (G_TYPE_FROM_INSTANCE (renderer)));
return;
}
- DIA_RENDERER_GET_CLASS(renderer)->set_font(renderer, text->font, text->height);
+ DIA_RENDERER_GET_CLASS (renderer)->set_font (renderer, text->font, text->height);
str_width_whole =
- DIA_RENDERER_GET_CLASS(renderer)->get_text_width(renderer,
- text_get_line(text, row),
- text_get_line_strlen(text, row));
+ DIA_RENDERER_GET_CLASS (renderer)->get_text_width (renderer,
+ text_get_line (text, row),
+ text_get_line_strlen (text, row));
start_x = text->position.x;
switch (text->alignment) {
case ALIGN_LEFT:
diff --git a/objects/GRAFCET/action_text_draw.c b/objects/GRAFCET/action_text_draw.c
index d5565c6c..0aeadc53 100644
--- a/objects/GRAFCET/action_text_draw.c
+++ b/objects/GRAFCET/action_text_draw.c
@@ -29,10 +29,11 @@
#include "geometry.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "text.h"
#include "action_text_draw.h"
-/* This used to be really horrible code. Really.
+/* This used to be really horrible code. Really.
Now it's just a code fork. */
void
@@ -44,7 +45,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
real space_width;
renderer_ops->set_font(renderer, text->font, text->height);
-
+
pos = text->position;
space_width = action_text_spacewidth(text);
@@ -59,7 +60,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
2 * space_width;
}
- if ((renderer->is_interactive) && (text->focus.has_focus)) {
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer) && (text->focus.has_focus)) {
real curs_x, curs_y;
real str_width_first;
real str_width_whole;
@@ -97,7 +98,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
p1.y = curs_y;
p2.x = curs_x;
p2.y = curs_y + text->height;
-
+
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
renderer_ops->set_linewidth(renderer, 0.1);
renderer_ops->draw_line(renderer, &p1, &p2, &color_black);
diff --git a/objects/standard/arc.c b/objects/standard/arc.c
index 2ac4bdcd..e158fb25 100644
--- a/objects/standard/arc.c
+++ b/objects/standard/arc.c
@@ -29,6 +29,7 @@
#include "connection.h"
#include "connectionpoint.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "attributes.h"
#include "arrows.h"
#include "properties.h"
@@ -629,36 +630,41 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
real angle1 = arc->curve_distance > 0.0 ? arc->angle1 : arc->angle2;
real angle2 = arc->curve_distance > 0.0 ? arc->angle2 : arc->angle1;
/* make it direction aware */
- if (arc->curve_distance > 0.0 && angle2 < angle1)
+ if (arc->curve_distance > 0.0 && angle2 < angle1) {
angle1 -= 360.0;
- else if (arc->curve_distance < 0.0 && angle2 > angle1)
+ } else if (arc->curve_distance < 0.0 && angle2 > angle1) {
angle2 -= 360.0;
- renderer_ops->draw_arc(renderer, &arc->center_handle.pos,
- arc->radius*2.0, arc->radius*2.0,
- angle1, angle2,
- &arc->arc_color);
+ }
+ renderer_ops->draw_arc (renderer,
+ &arc->center_handle.pos,
+ arc->radius*2.0,
+ arc->radius*2.0,
+ angle1,
+ angle2,
+ &arc->arc_color);
} else {
- renderer_ops->draw_arc_with_arrows(renderer,
- &gaptmp[0],
- &gaptmp[1],
- &gaptmp[2],
- arc->line_width,
- &arc->arc_color,
- &arc->start_arrow,
- &arc->end_arrow);
+ renderer_ops->draw_arc_with_arrows (renderer,
+ &gaptmp[0],
+ &gaptmp[1],
+ &gaptmp[2],
+ arc->line_width,
+ &arc->arc_color,
+ &arc->start_arrow,
+ &arc->end_arrow);
}
- if (renderer->is_interactive &&
- dia_object_is_selected(&arc->connection.object)) {
+
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
+ dia_object_is_selected (&arc->connection.object)) {
/* draw the central angle */
Color line_color = { 0.0, 0.0, 0.6, 1.0 };
- renderer_ops->set_linewidth(renderer, 0);
- renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED, 1);
- renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+ renderer_ops->set_linewidth (renderer, 0);
+ renderer_ops->set_linestyle (renderer, LINESTYLE_DOTTED, 1);
+ renderer_ops->set_linejoin (renderer, LINEJOIN_MITER);
+ renderer_ops->set_linecaps (renderer, LINECAPS_BUTT);
- renderer_ops->draw_line(renderer, &endpoints[0], &arc->center, &line_color);
- renderer_ops->draw_line(renderer, &endpoints[1], &arc->center, &line_color);
+ renderer_ops->draw_line (renderer, &endpoints[0], &arc->center, &line_color);
+ renderer_ops->draw_line (renderer, &endpoints[1], &arc->center, &line_color);
}
}
diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c
index 7227f9b2..3c9d0006 100644
--- a/objects/standard/bezier.c
+++ b/objects/standard/bezier.c
@@ -29,6 +29,7 @@
#include "bezier_conn.h"
#include "connectionpoint.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "attributes.h"
#include "diamenu.h"
#include "properties.h"
@@ -420,7 +421,7 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
* whether the object is currently selected in bezierline_select, and
* only checking while selected. But we'll do that if needed.
*/
- if (renderer->is_interactive &&
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
dia_object_is_selected(&bezierline->bez.object)) {
bezier_draw_control_lines(bezierline->bez.bezier.num_points, bezierline->bez.bezier.points, renderer);
}
diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c
index 2f6c6934..e2830289 100644
--- a/objects/standard/beziergon.c
+++ b/objects/standard/beziergon.c
@@ -29,6 +29,7 @@
#include "beziershape.h"
#include "connectionpoint.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "attributes.h"
#include "diamenu.h"
#include "properties.h"
@@ -241,8 +242,8 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer)
/* these lines should only be displayed when object is selected.
* Unfortunately the draw function is not aware of the selected
* state. This is a compromise until I fix this properly. */
- if (renderer->is_interactive &&
- dia_object_is_selected((DiaObject*)beziergon)) {
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
+ dia_object_is_selected (DIA_OBJECT (beziergon))) {
bezier_draw_control_lines (beziergon->bezier.bezier.num_points, beziergon->bezier.bezier.points,
renderer);
}
}
diff --git a/objects/standard/textobj.c b/objects/standard/textobj.c
index c478c866..120965de 100644
--- a/objects/standard/textobj.c
+++ b/objects/standard/textobj.c
@@ -25,6 +25,7 @@
#include "object.h"
#include "connectionpoint.h"
#include "diarenderer.h"
+#include "diainteractiverenderer.h"
#include "font.h"
#include "text.h"
#include "attributes.h"
@@ -309,9 +310,9 @@ textobj_draw(Textobj *textobj, DiaRenderer *renderer)
DIA_RENDERER_GET_CLASS (renderer)->draw_rotated_text (renderer, textobj->text,
&textobj->text_handle.pos, textobj->text_angle);
/* XXX: interactive case not working correctly */
- if (renderer->is_interactive &&
+ if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
dia_object_is_selected(&textobj->object) &&
- textobj->text->focus.has_focus) {
+ textobj->text->focus.has_focus) {
/* editing is not rotated */
text_draw(textobj->text, renderer);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]