GRASS GIS 8 Programmer's Manual 8.2.0(2022)-exported
draw_line.c
Go to the documentation of this file.
1
2/*
3 * draw a line between two given points in the current color.
4 *
5 * Called by:
6 * Cont_abs() in ../lib/Cont_abs.c
7 */
8
9#include <stdlib.h>
10#include <math.h>
11
12#include "pngdriver.h"
13
14static void store_xy(double x, double y)
15{
16 int xi = (int) floor(x);
17 int yi = (int) floor(y);
18
19 if (x < png.clip_left || x >= png.clip_rite || y < png.clip_top || y >= png.clip_bot)
20 return;
21
22 png.grid[yi * png.width + xi] = png.current_color;
23}
24
25static void swap(double *a, double *b)
26{
27 double t = *a; *a = *b; *b = t;
28}
29
30static void draw_line(double x1, double y1, double x2, double y2)
31{
32 double x, y;
33 double dx, dy;
34
35 if (fabs(y1 - y2) > fabs(x1 - x2)) {
36 if (y1 > y2) {
37 swap(&y1, &y2);
38 swap(&x1, &x2);
39 }
40
41 dy = y2 - y1;
42 dx = x2 - x1;
43
44 for (y = floor(y1) + 0.5; y < y2; y++) {
45 x = x1 + (y - y1) * dx / dy;
46 store_xy(x, y);
47 }
48 }
49 else {
50 if (x1 > x2) {
51 swap(&x1, &x2);
52 swap(&y1, &y2);
53 }
54
55 dx = x2 - x1;
56 dy = y2 - y1;
57
58 for (x = floor(x1) + 0.5; x < x2; x++) {
59 y = y1 + (x - x1) * dy / dx;
60 store_xy(x, y);
61 }
62 }
63}
64
65void png_draw_line(double x1, double y1, double x2, double y2)
66{
67 struct path path;
68 struct vertex vertices[5];
69 double k = png.linewidth / 2;
70 double dx, dy;
71
72 if (png.linewidth <= 1) {
73 draw_line(x1, y1, x2, y2);
74 png.modified = 1;
75 return;
76 }
77
78 path.vertices = vertices;
79 path.count = 0;
80 path.alloc = 5;
81 path.start = -1;
82
83 /* FIXME: rendering issues (#1283) */
84 dx = fabs(x2 - x1);
85 dy = fabs(y2 - y1);
86
87 if (dy > dx) {
88 path_move(&path, x1 - k, y1);
89 path_cont(&path, x1 + k, y1);
90 path_cont(&path, x2 + k, y2);
91 path_cont(&path, x2 - k, y2);
93 }
94 else {
95 path_move(&path, x1, y1 - k);
96 path_cont(&path, x1, y1 + k);
97 path_cont(&path, x2, y2 + k);
98 path_cont(&path, x2, y2 - k);
100 }
101
103}
104
void png_draw_line(double x1, double y1, double x2, double y2)
Definition: draw_line.c:65
double b
double t
void path_close(struct path *p)
Definition: path.c:84
void path_cont(struct path *p, double x, double y)
Definition: path.c:79
void path_move(struct path *p, double x, double y)
Definition: path.c:73
struct png_state png
GRASS png display driver - header file.
void png_polygon(struct path *)
Draw polygon.
Definition: path.h:16
int count
Definition: path.h:18
int start
Definition: path.h:20
struct vertex * vertices
Definition: path.h:17
int alloc
Definition: path.h:19
double clip_bot
Definition: pngdriver.h:42
int current_color
Definition: pngdriver.h:34
unsigned int * grid
Definition: pngdriver.h:44
int width
Definition: pngdriver.h:43
double clip_rite
Definition: pngdriver.h:42
int linewidth
Definition: pngdriver.h:49
int modified
Definition: pngdriver.h:47
Definition: path.h:11
#define x