summaryrefslogtreecommitdiff
path: root/eel/eel-canvas-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'eel/eel-canvas-util.c')
-rw-r--r--eel/eel-canvas-util.c426
1 files changed, 0 insertions, 426 deletions
diff --git a/eel/eel-canvas-util.c b/eel/eel-canvas-util.c
deleted file mode 100644
index 26e2b29e..00000000
--- a/eel/eel-canvas-util.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Mate Library.
- *
- * The Mate Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Mate 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Mate Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-/*
- @NOTATION@
- */
-/* Miscellaneous utility functions for the EelCanvas widget
- *
- * EelCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <[email protected]>
- */
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <glib.h>
-#include <math.h>
-
-#include "eel-canvas.h"
-#include "eel-canvas-util.h"
-
-/*
- * Ok, so some systems require magic incantations for M_PI to be defined.
- * It's not important enough to worry about.
- */
-#ifndef M_PI
-#define M_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117
-#endif
-
-/**
- * eel_canvas_points_new:
- * @num_points: The number of points to allocate space for in the array.
- *
- * Creates a structure that should be used to pass an array of points to
- * items.
- *
- * Return value: A newly-created array of points. It should be filled in
- * by the user.
- **/
-EelCanvasPoints *
-eel_canvas_points_new (int num_points)
-{
- EelCanvasPoints *points;
-
- g_return_val_if_fail (num_points > 1, NULL);
-
- points = g_new (EelCanvasPoints, 1);
- points->num_points = num_points;
- points->coords = g_new (double, 2 * num_points);
- points->ref_count = 1;
-
- return points;
-}
-
-/**
- * eel_canvas_points_ref:
- * @points: A canvas points structure.
- *
- * Increases the reference count of the specified points structure.
- *
- * Return value: The canvas points structure itself.
- **/
-EelCanvasPoints *
-eel_canvas_points_ref (EelCanvasPoints *points)
-{
- g_return_val_if_fail (points != NULL, NULL);
-
- points->ref_count += 1;
- return points;
-}
-
-/**
- * eel_canvas_points_free:
- * @points: A canvas points structure.
- *
- * Decreases the reference count of the specified points structure. If it
- * reaches zero, then the structure is freed.
- **/
-void
-eel_canvas_points_free (EelCanvasPoints *points)
-{
- g_return_if_fail (points != NULL);
-
- points->ref_count -= 1;
- if (points->ref_count == 0)
- {
- g_free (points->coords);
- g_free (points);
- }
-}
-
-/**
- * eel_canvas_get_miter_points:
- * @x1: X coordinate of the first point
- * @y1: Y coordinate of the first point
- * @x2: X coordinate of the second (angle) point
- * @y2: Y coordinate of the second (angle) point
- * @x3: X coordinate of the third point
- * @y3: Y coordinate of the third point
- * @width: Width of the line
- * @mx1: The X coordinate of the first miter point is returned here.
- * @my1: The Y coordinate of the first miter point is returned here.
- * @mx2: The X coordinate of the second miter point is returned here.
- * @my2: The Y coordinate of the second miter point is returned here.
- *
- * Given three points forming an angle, computes the coordinates of the inside
- * and outside points of the mitered corner formed by a line of a given width at
- * that angle.
- *
- * Return value: FALSE if the angle is less than 11 degrees (this is the same
- * threshold as X uses. If this occurs, the return points are not modified.
- * Otherwise, returns TRUE.
- **/
-int
-eel_canvas_get_miter_points (double x1, double y1, double x2, double y2, double x3, double y3,
- double width,
- double *mx1, double *my1, double *mx2, double *my2)
-{
- double theta1; /* angle of segment p2-p1 */
- double theta2; /* angle of segment p2-p3 */
- double theta; /* angle between line segments */
- double theta3; /* angle that bisects theta1 and theta2 and points to p1 */
- double dist; /* distance of miter points from p2 */
- double dx, dy; /* x and y offsets corresponding to dist */
-
- double ELEVEN_DEGREES = 11.0 * M_PI / 180.0;
-
- /* Degenerate cases. */
- if ((x1 == x2 && y1 == y2) || (x2 == x3 && y2 == y3))
- return FALSE;
-
- theta1 = atan2 (y1 - y2, x1 - x2);
- theta2 = atan2 (y3 - y2, x3 - x2);
- theta = theta1 - theta2;
-
- /* Normalize to (-pi; pi]. */
- if (theta > M_PI)
- theta -= 2.0 * M_PI;
- else if (theta <= -M_PI)
- theta += 2.0 * M_PI;
-
- if (fabs (theta) < ELEVEN_DEGREES)
- return FALSE;
-
- dist = fabs (0.5 * width / sin (0.5 * theta));
-
- theta3 = (theta1 + theta2) / 2.0;
- if (sin (theta3 - theta1) > 0.0)
- theta3 += M_PI;
-
- dx = dist * cos (theta3);
- dy = dist * sin (theta3);
-
- *mx1 = x2 + dx;
- *mx2 = x2 - dx;
- *my1 = y2 + dy;
- *my2 = y2 - dy;
-
- return TRUE;
-}
-
-/**
- * eel_canvas_get_butt_points:
- * @x1: X coordinate of first point in the line
- * @y1: Y cooordinate of first point in the line
- * @x2: X coordinate of second point (endpoint) of the line
- * @y2: Y coordinate of second point (endpoint) of the line
- * @width: Width of the line
- * @project: Whether the butt points should project out by width/2 distance
- * @bx1: X coordinate of first butt point is returned here
- * @by1: Y coordinate of first butt point is returned here
- * @bx2: X coordinate of second butt point is returned here
- * @by2: Y coordinate of second butt point is returned here
- *
- * Computes the butt points of a line segment.
- **/
-void
-eel_canvas_get_butt_points (double x1, double y1, double x2, double y2,
- double width, int project,
- double *bx1, double *by1, double *bx2, double *by2)
-{
- double length;
- double dx, dy;
-
- width *= 0.5;
- dx = x2 - x1;
- dy = y2 - y1;
- length = sqrt (dx * dx + dy * dy);
-
- if (length < EEL_CANVAS_EPSILON)
- {
- *bx1 = *bx2 = x2;
- *by1 = *by2 = y2;
- }
- else
- {
- dx = -width * (y2 - y1) / length;
- dy = width * (x2 - x1) / length;
-
- *bx1 = x2 + dx;
- *bx2 = x2 - dx;
- *by1 = y2 + dy;
- *by2 = y2 - dy;
-
- if (project)
- {
- *bx1 += dy;
- *bx2 += dy;
- *by1 -= dx;
- *by2 -= dx;
- }
- }
-}
-
-/**
- * eel_canvas_polygon_to_point:
- * @poly: Vertices of the polygon. X coordinates are in the even indices, and Y
- * coordinates are in the odd indices
- * @num_points: Number of points in the polygon
- * @x: X coordinate of the point
- * @y: Y coordinate of the point
- *
- * Computes the distance between a point and a polygon.
- *
- * Return value: The distance from the point to the polygon, or zero if the
- * point is inside the polygon.
- **/
-double
-eel_canvas_polygon_to_point (double *poly, int num_points, double x, double y)
-{
- double best;
- int intersections;
- int i;
- double *p;
- double dx, dy;
-
- /* Iterate through all the edges in the polygon, updating best and intersections.
- *
- * When computing intersections, include left X coordinate of line within its range, but not
- * Y coordinate. Otherwise if the point lies exactly below a vertex we'll count it as two
- * intersections.
- */
-
- best = 1.0e36;
- if (poly == NULL)
- return best;
-
- intersections = 0;
-
- for (i = num_points, p = poly; i > 1; i--, p += 2)
- {
- double px, py, dist;
-
- /* Compute the point on the current edge closest to the point and update the
- * intersection count. This must be done separately for vertical edges, horizontal
- * edges, and others.
- */
-
- if (p[2] == p[0])
- {
- /* Vertical edge */
-
- px = p[0];
-
- if (p[1] >= p[3])
- {
- py = MIN (p[1], y);
- py = MAX (py, p[3]);
- }
- else
- {
- py = MIN (p[3], y);
- py = MAX (py, p[1]);
- }
- }
- else if (p[3] == p[1])
- {
- /* Horizontal edge */
-
- py = p[1];
-
- if (p[0] >= p[2])
- {
- px = MIN (p[0], x);
- px = MAX (px, p[2]);
-
- if ((y < py) && (x < p[0]) && (x >= p[2]))
- intersections++;
- }
- else
- {
- px = MIN (p[2], x);
- px = MAX (px, p[0]);
-
- if ((y < py) && (x < p[2]) && (x >= p[0]))
- intersections++;
- }
- }
- else
- {
- double m1, b1, m2, b2;
- int lower;
-
- /* Diagonal edge. Convert the edge to a line equation (y = m1*x + b1), then
- * compute a line perpendicular to this edge but passing through the point,
- * (y = m2*x + b2).
- */
-
- m1 = (p[3] - p[1]) / (p[2] - p[0]);
- b1 = p[1] - m1 * p[0];
-
- m2 = -1.0 / m1;
- b2 = y - m2 * x;
-
- px = (b2 - b1) / (m1 - m2);
- py = m1 * px + b1;
-
- if (p[0] > p[2])
- {
- if (px > p[0])
- {
- px = p[0];
- py = p[1];
- }
- else if (px < p[2])
- {
- px = p[2];
- py = p[3];
- }
- }
- else
- {
- if (px > p[2])
- {
- px = p[2];
- py = p[3];
- }
- else if (px < p[0])
- {
- px = p[0];
- py = p[1];
- }
- }
-
- lower = (m1 * x + b1) > y;
-
- if (lower && (x >= MIN (p[0], p[2])) && (x < MAX (p[0], p[2])))
- intersections++;
- }
-
- /* Compute the distance to the closest point, and see if that is the best so far */
-
- dx = x - px;
- dy = y - py;
- dist = sqrt (dx * dx + dy * dy);
- if (dist < best)
- best = dist;
- }
-
- /* We've processed all the points. If the number of intersections is odd, the point is
- * inside the polygon.
- */
-
- if (intersections & 0x1)
- return 0.0;
- else
- return best;
-}
-
-/**
- * eel_canvas_item_reset_bounds:
- * @item: A canvas item
- *
- * Resets the bounding box of a canvas item to an empty rectangle.
- **/
-void
-eel_canvas_item_reset_bounds (EelCanvasItem *item)
-{
- item->x1 = 0.0;
- item->y1 = 0.0;
- item->x2 = 0.0;
- item->y2 = 0.0;
-}
-
-/**
- * eel_canvas_update_bbox:
- * @canvas: the canvas needing update
- * @x1: Left coordinate of the new bounding box
- * @y1: Top coordinate of the new bounding box
- * @x2: Right coordinate of the new bounding box
- * @y2: Bottom coordinate of the new bounding box
- *
- * Sets the bbox to the new value, requesting full repaint.
- **/
-void
-eel_canvas_update_bbox (EelCanvasItem *item, int x1, int y1, int x2, int y2)
-{
- eel_canvas_item_request_redraw (item);
- item->x1 = x1;
- item->y1 = y1;
- item->x2 = x2;
- item->y2 = y2;
- eel_canvas_item_request_redraw (item);
-}
-