Mercurial > MadButterfly
annotate src/shape_path.c @ 1160:1a699dc00fa3
Fix the issue of not removing node in old scene when switching scenes.
- When a timeline is playing and crossing two scenes (tween block),
nodes, for the old scene, in duplicate group must be removed. But,
it is not.
- It is fixed by checking if nodes, in the duplicate group, are also
in the key frame next to the new scene. All nodes that is not in
next key frame are remove.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 28 Dec 2010 13:35:34 +0800 |
parents | bd0cfb8666b8 |
children | 9f2b5a1a0d84 |
rev | line source |
---|---|
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
1 // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*- |
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
2 // vim: sw=4:ts=8:sts=4 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
3 #include <stdio.h> |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
4 #include <stdlib.h> |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
5 #include <ctype.h> |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
6 #include <string.h> |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
7 #include <math.h> |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
8 #include "mb_graph_engine.h" |
186
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
9 #include "mb_types.h" |
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
10 #include "mb_redraw_man.h" |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
11 |
8 | 12 /*! \brief Implement respective objects for SVG path tag. |
13 * | |
14 * In user_data or dev_data, 0x00 bytes are padding after commands. | |
15 * No commands other than 0x00 can resident after 0x00 itself. | |
16 * It means command processing code can skip commands after a 0x00. | |
12 | 17 * |
18 * Shapes should check if shape_t::geo is assigned. Once transformation | |
19 * matrics are changed, shape objects should update shape_t::geo if | |
20 * it is assigned. | |
8 | 21 */ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
22 typedef struct _sh_path { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
23 shape_t shape; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
24 int cmd_len; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
25 int pnt_len; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
26 int float_arg_len; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
27 char *user_data; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
28 char *dev_data; /* device space data */ |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
29 |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
30 redraw_man_t *rdman; /*!< \brief This is used by sh_path_free() */ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
31 } sh_path_t; |
10 | 32 #define RESERVED_AIXS sizeof(co_aix[2]) |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
33 |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
34 int _sh_path_size = sizeof(sh_path_t); |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
35 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
36 #define ASSERT(x) |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
37 #define SKIP_SPACE(x) while(*(x) && (isspace(*(x)) || *(x) == ',')) { (x)++; } |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
38 #define SKIP_NUM(x) \ |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
39 while(*(x) && \ |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
40 (isdigit(*(x)) || \ |
112
abb5511c23f7
Accept exponent of float point
Thinker K.F. Li <thinker@branda.to>
parents:
101
diff
changeset
|
41 *(x) == 'e' || \ |
abb5511c23f7
Accept exponent of float point
Thinker K.F. Li <thinker@branda.to>
parents:
101
diff
changeset
|
42 *(x) == 'E' || \ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
43 *(x) == '-' || \ |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
44 *(x) == '+' || \ |
709 | 45 *(x) == '.')) { \ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
46 (x)++; \ |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
47 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
48 #define OK 0 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
49 #define ERR -1 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
50 #define PI 3.1415926535897931 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
51 #define FRAC_PI ((int)(PI * FRACTION_ONE)) |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
52 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
53 #define SWAP(x, y) do { x ^= y; y ^= x; x ^= y; } while(0) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
54 #define MAX(x, y) (((x) > (y))? (x): (y)) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
55 #define MIN(x, y) (((x) > (y))? (y): (x)) |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
56 #define IS_NEGATIVE(x) ((x) < 0) |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
57 |
235 | 58 #ifdef UNITTEST |
1062
a8d20bc8ce40
Rename rdman_shape_man() to rdman_man_shape() to mean managing a shape
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
59 #undef rdman_man_shape |
a8d20bc8ce40
Rename rdman_shape_man() to rdman_man_shape() to mean managing a shape
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
60 #define rdman_man_shape(x, y) |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
61 |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
62 #undef elmpool_elm_alloc |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
63 #define elmpool_elm_alloc(pool) _elmpool_elm_alloc(pool) |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
64 static void * |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
65 _elmpool_elm_alloc(void *dummy) { |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
66 return malloc(sizeof(sh_path_t)); |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
67 } |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
68 |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
69 #undef elmpool_elm_free |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
70 #define elmpool_elm_free(pool, elm) _elmpool_elm_free(pool, elm) |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
71 static void |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
72 _elmpool_elm_free(void *pool, void *elm) { |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
73 free(elm); |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
74 } |
235 | 75 #endif |
76 | |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
77 /* ============================================================ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
78 * Implement arc in path. |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
79 */ |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
80 #if 1 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
81 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
82 #include <stdint.h> |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
83 #include "precomputed.h" |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
84 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
85 #define ABS(x) (((x) > 0)? (x): -(x)) |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
86 #define FRACTION_ONE (1 << FRACTION_SHIFT) |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
87 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
88 /*! \brief Compute the small slope of a vector. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
89 * |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
90 * A small slope is based on absolute value of x-axis and y-axis. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
91 * And use smaller one of absolute values as divisor. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
92 */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
93 static int |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
94 _small_slope(int x, int y) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
95 int _x, _y; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
96 int r; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
97 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
98 _x = ABS(x); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
99 _y = ABS(y); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
100 if(_x > _y) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
101 r = (_y << FRACTION_SHIFT) / _x; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
102 else |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
103 r = (_x << FRACTION_SHIFT) / _y; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
104 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
105 return r; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
106 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
107 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
108 /*! \brief Index a given angle in slope table. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
109 * |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
110 * Binary search. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
111 */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
112 static int |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
113 _find_slope_index(int slope) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
114 int left, right, v; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
115 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
116 left = 0; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
117 right = SLOPE_TAB_SZ - 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
118 while(left <= right) { |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
119 v = (left + right) / 2; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
120 if(slope < slope_tab[v]) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
121 right = v - 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
122 else |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
123 left = v + 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
124 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
125 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
126 return v; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
127 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
128 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
129 static int |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
130 _vector_len(int x, int y) { |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
131 int64_t _x, _y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
132 int64_t slope; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
133 int64_t slope_index; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
134 int64_t radius; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
135 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
136 _x = ABS(x); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
137 _y = ABS(y); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
138 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
139 if(_x > _y) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
140 slope = (_y << FRACTION_SHIFT) / _x; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
141 slope_index = _find_slope_index(slope); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
142 radius = _x * vector_len_factor_tab[slope_index]; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
143 } else { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
144 slope = (_x << FRACTION_SHIFT) / _y; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
145 slope_index = _find_slope_index(slope); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
146 radius = _y * vector_len_factor_tab[slope_index]; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
147 } |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
148 radius = radius / FRACTION_ONE; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
149 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
150 return radius; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
151 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
152 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
153 /*! \brief Find index of an arc-to-radius ratio in arc_radius_ratio_tab. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
154 * |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
155 * Binary search. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
156 */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
157 static int |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
158 _find_arc_radius(int arc_radius_ratio) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
159 int left, right, v; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
160 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
161 left = 0; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
162 right = ARC_RADIUS_RATIO_TAB_SZ - 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
163 while(left <= right) { |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
164 v = (left + right) / 2; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
165 if(arc_radius_ratio < arc_radius_ratio_tab[v]) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
166 right = v - 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
167 else |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
168 left = v + 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
169 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
170 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
171 return v; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
172 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
173 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
174 /* Compute shift factor for the ratio of arc to radius */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
175 static int |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
176 _get_arc_radius_shift_factor(int arc_x, int arc_y, int radius) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
177 int arc_len; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
178 int radius_len; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
179 int arc_radius_ratio; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
180 int arc_radius_index; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
181 int arc_radius_factor; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
182 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
183 arc_len = _vector_len(ABS(arc_x), ABS(arc_y)); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
184 arc_radius_ratio = (arc_len << FRACTION_SHIFT) / radius; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
185 arc_radius_index = _find_arc_radius(arc_radius_ratio); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
186 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
187 arc_radius_factor = arc_radius_factor_tab[arc_radius_index]; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
188 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
189 return arc_radius_factor; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
190 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
191 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
192 /* Return a unit vector in the extend direction. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
193 * |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
194 * This function make a decision on the direction of extend to make |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
195 * radius of rx direction equivlant to ry direction. It extends the |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
196 * direction of short one. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
197 */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
198 static void |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
199 _compute_extend_unit_vector(int rx, int ry, int x_rotate, |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
200 int64_t *ext_unit_x, int64_t *ext_unit_y) { |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
201 int extend_dir; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
202 int extend_phase; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
203 int extend_index; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
204 int extend_sin, extend_cos; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
205 /* Change sign of x, y values accroding phase of the vector. */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
206 static int sin_cos_signs_tab[4][2] = { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
207 /* 0 for positive, 1 for negative */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
208 {0, 0}, {1, 0}, {1, 1}, {0, 1}}; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
209 int *signs; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
210 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
211 if(rx > ry) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
212 extend_dir = x_rotate + (FRAC_PI >> 1); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
213 else |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
214 extend_dir = x_rotate; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
215 extend_dir %= FRAC_PI * 2; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
216 extend_phase = extend_dir / (FRAC_PI >> 1); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
217 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
218 extend_index = (extend_dir % (FRAC_PI >> 1)) * SIN_TAB_SZ / |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
219 (FRAC_PI >> 1); |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
220 if(extend_phase & 0x1) /* half-phases 1,3 */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
221 extend_index = SIN_TAB_SZ - extend_index - 1; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
222 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
223 extend_sin = sin_tab[extend_index]; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
224 extend_cos = sin_tab[SIN_TAB_SZ - extend_index - 1]; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
225 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
226 signs = sin_cos_signs_tab[extend_phase]; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
227 *ext_unit_x = signs[0]? -extend_cos: extend_cos; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
228 *ext_unit_y = signs[1]? -extend_sin: extend_sin; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
229 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
230 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
231 static void |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
232 _get_center_ref_shift(int arc_x, int arc_y, int large, int sweep, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
233 int slope_index, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
234 int64_t *shift_cx, int64_t *shift_cy) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
235 int _shift_cx, _shift_cy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
236 int stat = 0; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
237 /* Change sign of shift-x/y accroding sign of arc_x, arc_y, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
238 * large and sweep. |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
239 */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
240 static int shift_signs_tab[16][2] = { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
241 /* +x,+y -x,+y +x,-y -x,-y */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
242 {1, 1}, {0, 1}, {1, 0}, {0, 0}, /* small, negative-angle */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
243 {0, 0}, {1, 0}, {0, 1}, {1, 1}, /* large, negative-angle */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
244 {0, 0}, {1, 0}, {0, 1}, {1, 1}, /* small, positive-angle */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
245 {1, 1}, {0, 1}, {1, 0}, {0, 0} /* large, positive-angle */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
246 }; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
247 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
248 _shift_cx = center_shift_tab[slope_index][0]; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
249 _shift_cy = center_shift_tab[slope_index][1]; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
250 if(ABS(arc_x) <= ABS(arc_y)) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
251 SWAP(_shift_cx, _shift_cy); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
252 _shift_cx = -_shift_cx; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
253 _shift_cy = -_shift_cy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
254 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
255 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
256 if(IS_NEGATIVE(arc_x)) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
257 stat |= 0x1; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
258 if(IS_NEGATIVE(arc_y)) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
259 stat |= 0x2; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
260 if(large) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
261 stat |= 0x4; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
262 if(sweep) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
263 stat |= 0x8; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
264 if(shift_signs_tab[stat][0]) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
265 _shift_cx = -_shift_cx; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
266 if(shift_signs_tab[stat][1]) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
267 _shift_cy = -_shift_cy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
268 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
269 *shift_cx = _shift_cx; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
270 *shift_cy = _shift_cy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
271 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
272 |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
273 static int |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
274 _calc_center_i(int x0, int y0, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
275 int x, int y, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
276 int rx, int ry, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
277 int x_rotate, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
278 int large, int sweep, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
279 int *cx, int *cy) { |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
280 int64_t radius; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
281 int64_t ext_unit_y, ext_unit_x; /* x and y value of unit vector on |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
282 * extend direction */ |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
283 int64_t arc_x, arc_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
284 int64_t radius_ref_ratio; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
285 int64_t arc_radius_factor; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
286 int64_t slope, slope_index; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
287 int64_t shift_cx, shift_cy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
288 int64_t center_shift_factor; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
289 static int negatives[4] = {0, 1, 1, 0}; |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
290 int64_t extend_len; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
291 int64_t extend_x, extend_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
292 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
293 ASSERT(rx >= 0 && ry >= 0); |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
294 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
295 arc_x = x - x0; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
296 arc_y = y - y0; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
297 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
298 if(arc_x == 0 && arc_y == 0) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
299 *cx = x0; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
300 *cy = y0; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
301 return OK; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
302 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
303 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
304 /* Translate arc to the coordinate that extend rx or ry to the |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
305 * equivlant size as another. It translate the ellipse to a |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
306 * circle. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
307 */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
308 radius = MAX(rx, ry); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
309 _compute_extend_unit_vector(rx, ry, x_rotate, &ext_unit_x, &ext_unit_y); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
310 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
311 extend_len = (arc_x * ext_unit_x + arc_y * ext_unit_y) / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
312 extend_len = extend_len * (MAX(rx, ry) - MIN(rx, ry)) / MIN(rx, ry); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
313 extend_x = ext_unit_x * extend_len / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
314 extend_y = ext_unit_y * extend_len / FRACTION_ONE; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
315 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
316 arc_x += extend_x; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
317 arc_y += extend_y; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
318 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
319 /* Find range index of slope. */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
320 slope = _small_slope(arc_x, arc_y); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
321 slope_index = _find_slope_index(slope); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
322 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
323 /* Compute shift factor for the ratio of arc to radius */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
324 arc_radius_factor = _get_arc_radius_shift_factor(arc_x, arc_y, radius); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
325 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
326 /* Compute ratio of radius to reference radius */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
327 radius_ref_ratio = radius >> REF_RADIUS_SHIFT; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
328 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
329 /* Compute x/y-shift of center range index according |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
330 * slope_index, radius_ref_ratio and arc_radius_factor. |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
331 */ |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
332 _get_center_ref_shift(arc_x, arc_y, large, sweep, slope_index, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
333 &shift_cx, &shift_cy); |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
334 center_shift_factor = radius_ref_ratio * arc_radius_factor; |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
335 center_shift_factor = center_shift_factor / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
336 shift_cx = shift_cx * center_shift_factor / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
337 shift_cy = shift_cy * center_shift_factor / FRACTION_ONE; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
338 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
339 shift_cx += arc_x / 2; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
340 shift_cy += arc_y / 2; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
341 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
342 /* translate shift_cx/cy back to original coordinate */ |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
343 extend_len = (shift_cx * ext_unit_x + shift_cy * ext_unit_y) / |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
344 FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
345 extend_len = extend_len * (MAX(rx, ry) - MIN(rx, ry)) / MAX(rx, ry); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
346 extend_x = ext_unit_x * extend_len / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
347 extend_y = ext_unit_y * extend_len / FRACTION_ONE; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
348 shift_cx = shift_cx - extend_x; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
349 shift_cy = shift_cy - extend_y; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
350 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
351 /* get center */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
352 *cx = x0 + shift_cx; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
353 *cy = y0 + shift_cy; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
354 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
355 return OK; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
356 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
357 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
358 static int _calc_center(co_aix x0, co_aix y0, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
359 co_aix x, co_aix y, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
360 co_aix rx, co_aix ry, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
361 co_aix x_rotate, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
362 int large, int sweep, |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
363 co_aix *cx, co_aix *cy) { |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
364 int cx_i, cy_i; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
365 int r; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
366 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
367 r = _calc_center_i(x0 * FRACTION_ONE, y0 * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
368 x * FRACTION_ONE, y * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
369 rx * FRACTION_ONE, ry * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
370 x_rotate * FRACTION_ONE, |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
371 large, sweep, &cx_i, &cy_i); |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
372 *cx = (co_aix)cx_i / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
373 *cy = (co_aix)cy_i / FRACTION_ONE; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
374 return r; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
375 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
376 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
377 #else |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
378 /*! \brief Calculate center of the ellipse of an arc. |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
379 * |
269
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
380 * Origin of our coordination is left-top corner, and y-axis are grown |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
381 * to down-side. |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
382 * |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
383 * Space of the arc is transformed to space that correspondent |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
384 * ellipse containing the arc is mapped into an unit circle. |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
385 * - ux0 = x0 / rx |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
386 * - uy0 = y0 / ry |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
387 * - ux = x / rx |
269
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
388 * - uy = y / ry |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
389 * ux0, uy0, ux, uy are got by transforming (x0, y0) and (x, y) into points |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
390 * on the unit circle. The center of unit circle are (ucx, ucy): |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
391 * - umx = (ux0 + ux) / 2 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
392 * - umy = (uy0 + uy) / 2 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
393 * - udcx = ucx - umx |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
394 * - udcy = ucy - umy |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
395 * - udx = ux - umx |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
396 * - udy = uy - umy |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
397 * |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
398 * - udx * udcx + udy * udcy = 0 |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
399 * |
269
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
400 * - udl2 = udx ** 2 + udy ** 2 |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
401 * |
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
402 * For drawing small arc in clockwise |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
403 * - udx * udcy - udy * udcx = sqrt((1 - udl2) * udl2) |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
404 * |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
405 * - udcy = -udcx * udx / udy |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
406 * - -udcx * (udx ** 2) / udy - udy * udcx = sqrt((1 - udl2) * udl2) |
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
407 * - -udcx * ((udx ** 2) / udy + udy) = sqrt((1 - udl2) * udl2) |
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
408 * - udcx = -sqrt((1 - udl2) * udl2) / ((udx ** 2) / udy + udy) |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
409 * or |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
410 * - udcx = -udcy * udy / udx |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
411 * - udx * udcy + udcy * (udy ** 2) / udx = sqrt((1 - udl2) * udl2) |
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
412 * - udcy * (udx + (udy ** 2) / udx) = sqrt((1 - udl2) * udl2) |
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
413 * - udcy = sqrt((1 - udl2) * udl2) / (udx + (udy ** 2) / udx) |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
414 * |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
415 * - cx = rx * ucx |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
416 * - cx = rx * (udcx + umx) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
417 * - cy = ry * ucy |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
418 * - cy = ry * (udcy + umy) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
419 */ |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
420 static int _calc_center(co_aix x0, co_aix y0, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
421 co_aix x, co_aix y, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
422 co_aix rx, co_aix ry, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
423 co_aix x_rotate, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
424 int large, int sweep, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
425 co_aix *cx, co_aix *cy) { |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
426 co_aix br_x, br_y, br_x0, br_y0; /* before-rotated x, y, x0, y0 */ |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
427 co_aix udx, udy, udx2, udy2; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
428 co_aix umx, umy; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
429 co_aix udcx, udcy; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
430 co_aix br_cx, br_cy; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
431 co_aix udl2; |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
432 co_aix rev_rx2, rev_ry2; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
433 float _sin = -sinf(x_rotate); /* rotate to oposite direction */ |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
434 float _cos = cosf(x_rotate); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
435 int reflect; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
436 |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
437 #define X_AFTER_ROTATE(x, y, sin, cos) (x * cos - y * sin) |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
438 #define Y_AFTER_ROTATE(x, y, sin, cos) (x * sin + y * cos) |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
439 |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
440 /* Restore positions to the value before rotation */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
441 br_x = X_AFTER_ROTATE(x, y, _sin, _cos); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
442 br_y = Y_AFTER_ROTATE(x, y, _sin, _cos); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
443 br_x0 = X_AFTER_ROTATE(x0, y0, _sin, _cos); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
444 br_y0 = Y_AFTER_ROTATE(x0, y0, _sin, _cos); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
445 |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
446 /* Resize to be an unit circle */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
447 rev_rx2 = 1.0 / (2 * rx); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
448 rev_ry2 = 1.0 / (2 * ry); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
449 udx = (br_x - br_x0) * rev_rx2; /* ux - umx */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
450 udy = (br_y - br_y0) * rev_ry2; /* uy - umy */ |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
451 umx = (br_x + br_x0) * rev_rx2; |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
452 umy = (br_y + br_y0) * rev_ry2; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
453 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
454 udx2 = udx * udx; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
455 udy2 = udy * udy; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
456 udl2 = udx2 + udy2; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
457 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
458 if(udy != 0) { |
269
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
459 /* center is at left-side of arc */ |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
460 udcx = -sqrtf((1 - udl2) * udl2) / (udy + udx2 / udy); |
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
461 udcy = -udcx * udx / udy; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
462 } else { |
269
c96f38ad4bb6
Fix mis-behavior of translate_path_data() on arc.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
463 /* center is at down-side of arc */ |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
464 udcx = 0; |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
465 udcy = sqrtf((1 - udl2) * udl2) / udx; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
466 } |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
467 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
468 reflect = 0; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
469 if(large) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
470 reflect ^= 1; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
471 if(sweep != 1) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
472 reflect ^= 1; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
473 if(reflect) { |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
474 udcx = -udcx; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
475 udcy = -udcy; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
476 } |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
477 |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
478 br_cx = rx * (udcx + umx); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
479 br_cy = ry * (udcy + umy); |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
480 |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
481 *cx = X_AFTER_ROTATE(br_cx, br_cy, -_sin, _cos); |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
482 *cy = Y_AFTER_ROTATE(br_cx, br_cy, -_sin, _cos); |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
483 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
484 return OK; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
485 } |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
486 #endif |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
487 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
488 static co_aix _angle_rotated_ellipse(co_aix x, co_aix y, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
489 co_aix rx, co_aix ry, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
490 co_aix x_rotate) { |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
491 co_aix nrx, nry; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
492 co_aix _sin, _cos; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
493 co_aix xy_tan; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
494 co_aix angle; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
495 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
496 _sin = sinf(x_rotate); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
497 _cos = cosf(x_rotate); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
498 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
499 nrx = (x * _cos + y * _sin) / rx; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
500 nry = (-x * _sin + y * _cos) / ry; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
501 xy_tan = nry / nrx; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
502 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
503 angle = atan(xy_tan); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
504 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
505 if(nrx < 0) |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
506 angle = PI + angle; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
507 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
508 return angle; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
509 } |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
510 |
459
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
511 static void _rotate(co_aix *x, co_aix *y, co_aix _sin, co_aix _cos) { |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
512 co_aix nx, ny; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
513 |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
514 nx = *x * _cos - *y * _sin; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
515 ny = *x * _sin + *y * _cos; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
516 |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
517 *x = nx; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
518 *y = ny; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
519 } |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
520 |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
521 #define TAKE_NUM(r) do { \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
522 SKIP_SPACE(p); \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
523 old = p; \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
524 SKIP_NUM(p); \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
525 if(p == old) \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
526 return ERR; \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
527 r = atof(old); \ |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
528 } while(0); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
529 |
459
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
530 static int _sh_path_arc_cmd_arg_fill(char cmd, char **cmds_p, |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
531 const char **data_p, |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
532 co_aix **pnts_p, |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
533 co_aix **float_args_p) { |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
534 co_aix rx, ry; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
535 co_aix x_rotate; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
536 int large, sweep; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
537 co_aix x, y, x0, y0, cx, cy; |
459
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
538 co_aix corners[4][2]; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
539 co_aix angle_start, angle_stop; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
540 co_aix *pnts = *pnts_p; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
541 const char *old; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
542 const char *p; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
543 char *cmds; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
544 co_aix *float_args; |
459
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
545 co_aix _sin, _cos; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
546 int i; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
547 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
548 p = *data_p; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
549 cmds = *cmds_p; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
550 float_args = *float_args_p; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
551 while(*p) { |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
552 SKIP_SPACE(p); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
553 old = p; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
554 SKIP_NUM(p); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
555 if(p == old) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
556 break; |
99
4aa1c9673363
Arc in path pass the test in example svg2code_ex.
Thinker K.F. Li <thinker@branda.to>
parents:
98
diff
changeset
|
557 rx = atof(old); |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
558 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
559 TAKE_NUM(ry); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
560 TAKE_NUM(x_rotate); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
561 TAKE_NUM(large); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
562 TAKE_NUM(sweep); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
563 TAKE_NUM(x); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
564 TAKE_NUM(y) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
565 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
566 x0 = *(pnts - 2); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
567 y0 = *(pnts - 1); |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
568 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
569 if(islower(cmd)) { |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
570 x += x0; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
571 y += y0; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
572 } |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
573 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
574 _calc_center(x0, y0, x, y, rx, ry, x_rotate, large, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
575 sweep, &cx, &cy); |
459
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
576 |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
577 /* Compute positions for four corners. |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
578 * These four corners form a bounding box for the arc. |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
579 */ |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
580 _sin = sinf(x_rotate); |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
581 _cos = cosf(x_rotate); |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
582 corners[0][0] = -rx; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
583 corners[0][1] = -ry; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
584 corners[1][0] = rx; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
585 corners[1][1] = -ry; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
586 corners[2][0] = rx; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
587 corners[2][1] = ry; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
588 corners[3][0] = -rx; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
589 corners[3][1] = ry; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
590 for(i = 0; i < 4; i++) { |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
591 _rotate(&corners[i][0], &corners[i][1], _sin, _cos); |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
592 *pnts++ = corners[i][0] + cx; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
593 *pnts++ = corners[i][1] + cy; |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
594 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
595 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
596 *(pnts++) = x; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
597 *(pnts++) = y; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
598 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
599 angle_start = _angle_rotated_ellipse(x0 - cx, y0 - cy, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
600 rx, ry, x_rotate); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
601 angle_stop = _angle_rotated_ellipse(x - cx, y - cy, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
602 rx, ry, x_rotate); |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
603 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
604 if(sweep && angle_start > angle_stop) |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
605 angle_stop += 2 * PI; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
606 else if((!sweep) && angle_start < angle_stop) |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
607 angle_start += 2 * PI; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
608 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
609 *float_args++ = cx; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
610 *float_args++ = cy; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
611 *float_args++ = rx; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
612 *float_args++ = ry; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
613 *float_args++ = angle_start; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
614 *float_args++ = angle_stop; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
615 *float_args++ = x_rotate; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
616 |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
617 *cmds++ = toupper(cmd); |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
618 } |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
619 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
620 *data_p = p; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
621 *pnts_p = pnts; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
622 *cmds_p = cmds; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
623 *float_args_p = float_args; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
624 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
625 return OK; |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
626 } |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
627 |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
628 #define INNER(x1, y1, x2, y2) ((x1) * (x2) + (y1) * (y2)) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
629 #define CROSS(x1, y1, x2, y2) ((x1) * (y2) - (y1) * (x2)) |
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
630 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
631 static co_aix distance_pow2(co_aix x, co_aix y) { |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
632 return x * x + y * y; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
633 } |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
634 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
635 static co_aix angle_diff(co_aix sx, co_aix sy, co_aix dx, co_aix dy) { |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
636 co_aix inner, cross; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
637 co_aix angle; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
638 co_aix rd2, rd; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
639 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
640 rd2 = distance_pow2(dx, dy); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
641 rd = sqrtf(rd2); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
642 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
643 inner = INNER(sx, sy, dx, dy); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
644 cross = CROSS(sx, sy, dx, dy); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
645 angle = acos(inner / rd); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
646 if(cross < 0) |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
647 angle = 2 * PI - angle; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
648 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
649 return angle; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
650 } |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
651 |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
652 /*! \brief Make path for arcs in a path. |
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
653 */ |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
654 void _sh_path_arc_path(mbe_t *cr, sh_path_t *path, const co_aix **pnts_p, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
655 const co_aix **float_args_p) { |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
656 co_aix cx, cy, x0, y0, x, y; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
657 co_aix rx, ry; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
658 co_aix xyratio; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
659 co_aix angle_start, angle_stop; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
660 co_aix x_rotate; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
661 const co_aix *pnts; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
662 const co_aix *float_args; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
663 co_aix matrix[6]; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
664 co_aix dev_matrix[6]; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
665 co_aix *aggr; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
666 co_aix _sin, _cos; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
667 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
668 pnts = *pnts_p; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
669 float_args = *float_args_p; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
670 x0 = *(pnts - 2); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
671 y0 = *(pnts - 1); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
672 pnts += 8; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
673 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
674 y = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
675 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
676 cx = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
677 cy = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
678 rx = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
679 ry = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
680 angle_start = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
681 angle_stop = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
682 x_rotate = *float_args++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
683 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
684 _sin = sinf(x_rotate); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
685 _cos = cosf(x_rotate); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
686 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
687 xyratio = ry / rx; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
688 aggr = sh_get_aggr_matrix((shape_t *)path); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
689 matrix[0] = _cos; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
690 matrix[1] = -_sin * xyratio; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
691 matrix[2] = cx; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
692 matrix[3] = _sin; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
693 matrix[4] = _cos * xyratio; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
694 matrix[5] = cy; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
695 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
696 matrix_mul(aggr, matrix, dev_matrix); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
697 mbe_save(cr); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
698 mbe_transform(cr, dev_matrix); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
699 mbe_arc(cr, 0, 0, rx, angle_start, angle_stop); |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
700 mbe_restore(cr); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
701 |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
702 *pnts_p = pnts; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
703 *float_args_p = float_args; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
704 } |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
705 |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
706 /* ============================================================ */ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
707 |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
708 static void sh_path_free(shape_t *shape) { |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
709 sh_path_t *path = (sh_path_t *)shape; |
770
abd9bbf24545
mb_obj_destroy for sh_path_t
Thinker K.F. Li <thinker@codemud.net>
parents:
711
diff
changeset
|
710 |
abd9bbf24545
mb_obj_destroy for sh_path_t
Thinker K.F. Li <thinker@codemud.net>
parents:
711
diff
changeset
|
711 mb_obj_destroy(path); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
712 if(path->user_data) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
713 free(path->user_data); |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
714 elmpool_elm_free(path->rdman->sh_path_pool, path); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
715 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
716 |
86
7d0580f89468
Fix bug of dealing matrix().
Thinker K.F. Li <thinker@branda.to>
parents:
73
diff
changeset
|
717 /*! \brief Count number of arguments. |
7d0580f89468
Fix bug of dealing matrix().
Thinker K.F. Li <thinker@branda.to>
parents:
73
diff
changeset
|
718 * |
7d0580f89468
Fix bug of dealing matrix().
Thinker K.F. Li <thinker@branda.to>
parents:
73
diff
changeset
|
719 * \todo Notify programmers that syntax or value error of path data. |
7d0580f89468
Fix bug of dealing matrix().
Thinker K.F. Li <thinker@branda.to>
parents:
73
diff
changeset
|
720 */ |
492
e95598916dfb
Make path data constant.
Thinker K.F. Li <thinker@branda.to>
parents:
460
diff
changeset
|
721 static int sh_path_cmd_arg_cnt(const char *data, int *cmd_cntp, int *pnt_cntp, |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
722 int *float_arg_cntp) { |
492
e95598916dfb
Make path data constant.
Thinker K.F. Li <thinker@branda.to>
parents:
460
diff
changeset
|
723 const char *p, *old; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
724 int cmd_cnt, pnt_cnt, float_arg_cnt; |
96 | 725 int i; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
726 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
727 cmd_cnt = pnt_cnt = float_arg_cnt = 0; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
728 p = data; |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
729 SKIP_SPACE(p); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
730 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
731 switch(*p++) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
732 case 'c': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
733 case 'C': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
734 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
735 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
736 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
737 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
738 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
739 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
740 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
741 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
742 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
743 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
744 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
745 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
746 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
747 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
748 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
749 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
750 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
751 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
752 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
753 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
754 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
755 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
756 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
757 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
758 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
759 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
760 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
761 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
762 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
763 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
764 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
765 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
766 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
767 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
768 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
769 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
770 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
771 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
772 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
773 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
774 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
775 pnt_cnt++; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
776 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
777 cmd_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
778 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
779 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
780 case 's': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
781 case 'S': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
782 case 'q': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
783 case 'Q': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
784 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
785 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
786 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
787 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
788 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
789 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
790 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
791 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
792 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
793 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
794 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
795 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
796 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
797 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
798 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
799 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
800 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
801 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
802 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
803 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
804 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
805 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
806 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
807 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
808 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
809 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
810 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
811 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
812 pnt_cnt++; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
813 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
814 cmd_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
815 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
816 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
817 case 'm': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
818 case 'M': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
819 case 'l': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
820 case 'L': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
821 case 't': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
822 case 'T': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
823 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
824 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
825 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
826 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
827 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
828 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
829 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
830 pnt_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
831 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
832 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
833 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
834 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
835 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
836 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
837 pnt_cnt++; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
838 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
839 cmd_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
840 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
841 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
842 case 'h': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
843 case 'H': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
844 case 'v': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
845 case 'V': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
846 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
847 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
848 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
849 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
850 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
851 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
852 pnt_cnt += 2; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
853 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
854 cmd_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
855 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
856 break; |
96 | 857 case 'A': |
858 case 'a': | |
859 while(*p) { | |
860 SKIP_SPACE(p); | |
861 old = p; | |
862 SKIP_NUM(p); | |
863 if(p == old) | |
864 break; | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
865 |
96 | 866 for(i = 0; i < 6; i++) { |
867 SKIP_SPACE(p); | |
868 old = p; | |
869 SKIP_NUM(p); | |
870 if(p == old) | |
871 return ERR; | |
872 } | |
873 | |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
874 pnt_cnt += 10; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
875 float_arg_cnt += 7; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
876 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
877 cmd_cnt++; |
96 | 878 } |
879 break; | |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
880 case 'z': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
881 case 'Z': |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
882 cmd_cnt++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
883 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
884 default: |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
885 return ERR; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
886 } |
96 | 887 /*! \todo cmd_cnt should be increased for each implicit repeating. */ |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
888 SKIP_SPACE(p); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
889 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
890 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
891 *cmd_cntp = cmd_cnt; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
892 *pnt_cntp = pnt_cnt; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
893 *float_arg_cntp = float_arg_cnt; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
894 return OK; |
96 | 895 } |
896 | |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
897 #define TO_ABSX islower(cmd)? x + atof(old): atof(old) |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
898 #define TO_ABSY islower(cmd)? y + atof(old): atof(old) |
10 | 899 |
492
e95598916dfb
Make path data constant.
Thinker K.F. Li <thinker@branda.to>
parents:
460
diff
changeset
|
900 static int sh_path_cmd_arg_fill(const char *data, sh_path_t *path) { |
e95598916dfb
Make path data constant.
Thinker K.F. Li <thinker@branda.to>
parents:
460
diff
changeset
|
901 const char *p, *old; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
902 char *cmds; |
7
569f3168ba53
Clear background & tranform relative pos into absolute ones
Thinker K.F. Li <thinker@branda.to>
parents:
6
diff
changeset
|
903 char cmd; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
904 co_aix *pnts; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
905 co_aix *float_args; |
711
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
906 co_aix sx = 0, sy = 0; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
907 co_aix x, y; |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
908 int r; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
909 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
910 cmds = path->user_data; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
911 pnts = (co_aix *)(cmds + path->cmd_len); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
912 float_args = (co_aix *)(cmds + path->cmd_len + |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
913 path->pnt_len * sizeof(co_aix)); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
914 p = data; |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
915 SKIP_SPACE(p); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
916 while(*p) { |
7
569f3168ba53
Clear background & tranform relative pos into absolute ones
Thinker K.F. Li <thinker@branda.to>
parents:
6
diff
changeset
|
917 /* Transform all relative to absolute, */ |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
918 x = *(pnts - 2); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
919 y = *(pnts - 1); |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
920 |
7
569f3168ba53
Clear background & tranform relative pos into absolute ones
Thinker K.F. Li <thinker@branda.to>
parents:
6
diff
changeset
|
921 switch((cmd = *p++)) { |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
922 case 'c': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
923 case 'C': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
924 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
925 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
926 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
927 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
928 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
929 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
930 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
931 *pnts = TO_ABSX; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
932 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
933 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
934 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
935 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
936 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
937 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
938 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
939 *pnts = TO_ABSY; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
940 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
941 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
942 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
943 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
944 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
945 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
946 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
947 *pnts = TO_ABSX; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
948 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
949 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
950 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
951 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
952 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
953 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
954 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
955 *pnts = TO_ABSY; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
956 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
957 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
958 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
959 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
960 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
961 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
962 *pnts = TO_ABSX; |
707
594827d0f3e5
Fix issue of relative path data.
Thinker K.F. Li <thinker@branda.to>
parents:
492
diff
changeset
|
963 x = *pnts; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
964 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
965 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
966 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
967 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
968 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
969 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
970 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
971 *pnts = TO_ABSY; |
707
594827d0f3e5
Fix issue of relative path data.
Thinker K.F. Li <thinker@branda.to>
parents:
492
diff
changeset
|
972 y = *pnts; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
973 pnts++; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
974 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
975 *cmds++ = toupper(cmd); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
976 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
977 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
978 case 's': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
979 case 'S': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
980 case 'q': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
981 case 'Q': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
982 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
983 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
984 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
985 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
986 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
987 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
988 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
989 *pnts = TO_ABSX; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
990 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
991 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
992 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
993 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
994 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
995 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
996 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
997 *pnts = TO_ABSY; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
998 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
999 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1000 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1001 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1002 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1003 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1004 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1005 *pnts = TO_ABSX; |
707
594827d0f3e5
Fix issue of relative path data.
Thinker K.F. Li <thinker@branda.to>
parents:
492
diff
changeset
|
1006 x = *pnts; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1007 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1008 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1009 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1010 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1011 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1012 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1013 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1014 *pnts = TO_ABSY; |
707
594827d0f3e5
Fix issue of relative path data.
Thinker K.F. Li <thinker@branda.to>
parents:
492
diff
changeset
|
1015 y = *pnts; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1016 pnts++; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1017 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1018 *cmds++ = toupper(cmd); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1019 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1020 break; |
711
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1021 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1022 case 'm': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1023 case 'M': |
711
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1024 while(*p) { |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1025 old = p; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1026 SKIP_SPACE(p); |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1027 old = p; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1028 SKIP_NUM(p); |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1029 if(p == old) |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1030 break; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1031 *pnts = TO_ABSX; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1032 x = *pnts; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1033 pnts++; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1034 |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1035 SKIP_SPACE(p); |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1036 old = p; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1037 SKIP_NUM(p); |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1038 if(p == old) |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1039 return ERR; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1040 *pnts = TO_ABSY; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1041 y = *pnts; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1042 pnts++; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1043 |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1044 *cmds++ = toupper(cmd); |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1045 |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1046 /* save initial point of a subpath */ |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1047 sx = x; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1048 sy = y; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1049 } |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1050 break; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
1051 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1052 case 'l': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1053 case 'L': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1054 case 't': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1055 case 'T': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1056 while(*p) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1057 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1058 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1059 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1060 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1061 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1062 break; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1063 *pnts = TO_ABSX; |
707
594827d0f3e5
Fix issue of relative path data.
Thinker K.F. Li <thinker@branda.to>
parents:
492
diff
changeset
|
1064 x = *pnts; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1065 pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1066 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1067 SKIP_SPACE(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1068 old = p; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1069 SKIP_NUM(p); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1070 if(p == old) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1071 return ERR; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1072 *pnts = TO_ABSY; |
707
594827d0f3e5
Fix issue of relative path data.
Thinker K.F. Li <thinker@branda.to>
parents:
492
diff
changeset
|
1073 y = *pnts; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1074 pnts++; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1075 |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1076 *cmds++ = toupper(cmd); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1077 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1078 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1079 case 'h': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1080 case 'H': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1081 case 'v': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1082 case 'V': |
58 | 1083 /*! \todo implement h, H, v, V comamnds for path. */ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1084 return ERR; |
96 | 1085 |
1086 case 'A': | |
1087 case 'a': | |
459
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
1088 r = _sh_path_arc_cmd_arg_fill(cmd, &cmds, |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
1089 (const char **)&p, &pnts, |
8b155b77fa14
Count positions an arc being for bounding box of the path.
Thinker K.F. Li <thinker@branda.to>
parents:
458
diff
changeset
|
1090 &float_args); |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1091 if(r != OK) |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1092 return ERR; |
96 | 1093 break; |
1094 | |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1095 case 'z': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1096 case 'Z': |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1097 *cmds++ = toupper(cmd); |
711
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1098 /* Go back to initial point of a subpath */ |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1099 x = sx; |
da794f4fe96c
save and restore initial point at m and z commands of path
Thinker K.F. Li <thinker@branda.to>
parents:
709
diff
changeset
|
1100 y = sy; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1101 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1102 default: |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1103 return ERR; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1104 } |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1105 SKIP_SPACE(p); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1106 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1107 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1108 return OK; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1109 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1110 |
9 | 1111 /*! \brief Create a path from value of 'data' of SVG path. |
1112 */ | |
492
e95598916dfb
Make path data constant.
Thinker K.F. Li <thinker@branda.to>
parents:
460
diff
changeset
|
1113 shape_t *rdman_shape_path_new(redraw_man_t *rdman, const char *data) { |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1114 sh_path_t *path; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1115 int cmd_cnt, pnt_cnt, float_arg_cnt; |
98
688f76b8e71c
Implement arc for path, but it is still under testing
Thinker K.F. Li <thinker@branda.to>
parents:
97
diff
changeset
|
1116 int msz; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1117 int r; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1118 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1119 r = sh_path_cmd_arg_cnt(data, &cmd_cnt, &pnt_cnt, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1120 &float_arg_cnt); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1121 if(r == ERR) |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1122 return NULL; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1123 |
8 | 1124 /* Align at 4's boundary and keep 2 unused co_aix space |
1125 * to make logic of transformation from relative to absolute | |
1126 * simple. | |
1127 */ | |
10 | 1128 cmd_cnt += RESERVED_AIXS; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1129 cmd_cnt = (cmd_cnt + 3) & ~0x3; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1130 |
149 | 1131 /*! \todo Use elmpool to manage sh_path_t objects. */ |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1132 path = (sh_path_t *)elmpool_elm_alloc(rdman->sh_path_pool); |
146
e96a584487af
Use elmpool to manage paint_color_t objects.
Thinker K.F. Li <thinker@branda.to>
parents:
145
diff
changeset
|
1133 /*! \todo Remove this memset()? */ |
12 | 1134 memset(&path->shape, 0, sizeof(shape_t)); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
202
diff
changeset
|
1135 mb_obj_init(path, MBO_PATH); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1136 path->cmd_len = cmd_cnt; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1137 path->pnt_len = pnt_cnt; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1138 path->float_arg_len = float_arg_cnt; |
145
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1139 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1140 msz = cmd_cnt + sizeof(co_aix) * pnt_cnt + |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1141 sizeof(co_aix) * float_arg_cnt; |
145
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1142 path->user_data = (char *)malloc(msz * 2); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1143 if(path->user_data == NULL) { |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1144 elmpool_elm_free(rdman->sh_path_pool, path); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1145 return NULL; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1146 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1147 |
145
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1148 path->dev_data = path->user_data + msz; |
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1149 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1150 r = sh_path_cmd_arg_fill(data, path); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1151 if(r == ERR) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1152 free(path->user_data); |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1153 elmpool_elm_free(rdman->sh_path_pool, path); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1154 return NULL; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1155 } |
100
1a1dda98730c
Fix the bug of order of cross & inner product of vectors
Thinker K.F. Li <thinker@branda.to>
parents:
99
diff
changeset
|
1156 memcpy(path->dev_data, path->user_data, msz); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1157 |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1158 path->shape.free = sh_path_free; |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1159 path->rdman = rdman; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1160 |
1062
a8d20bc8ce40
Rename rdman_shape_man() to rdman_man_shape() to mean managing a shape
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
1161 rdman_man_shape(rdman, (shape_t *)path); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
149
diff
changeset
|
1162 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1163 return (shape_t *)path; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1164 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1165 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1166 shape_t *rdman_shape_path_new_from_binary(redraw_man_t *rdman, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1167 char *commands, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1168 co_aix *pnts, int pnt_cnt, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1169 co_aix *float_args, |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1170 int float_arg_cnt) { |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1171 sh_path_t *path; |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1172 int msz; |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1173 int cmd_cnt = strlen(commands); |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1174 |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1175 /*! \todo Use elmpool to manage sh_path_t objects. */ |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1176 path = (sh_path_t *)elmpool_elm_alloc(rdman->sh_path_pool); |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1177 /*! \todo Remove this memset()? */ |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1178 memset(&path->shape, 0, sizeof(shape_t)); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
202
diff
changeset
|
1179 mb_obj_init(path, MBO_PATH); |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1180 cmd_cnt = (cmd_cnt + 3) & ~0x3; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1181 path->cmd_len = cmd_cnt; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1182 path->pnt_len = pnt_cnt; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1183 path->float_arg_len = float_arg_cnt; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1184 msz = cmd_cnt + sizeof(co_aix) * pnt_cnt + |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1185 sizeof(co_aix) * float_arg_cnt; |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1186 path->user_data = (char *)malloc(msz * 2); |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1187 if(path->user_data == NULL) { |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1188 elmpool_elm_free(rdman->sh_path_pool, path); |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1189 return NULL; |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1190 } |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1191 |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1192 path->dev_data = path->user_data + msz; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1193 memcpy(path->user_data, commands, strlen(commands)); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1194 memcpy(path->user_data + cmd_cnt, pnts, sizeof(co_aix) * pnt_cnt); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1195 memcpy(path->user_data + cmd_cnt + pnt_cnt * sizeof(co_aix), |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1196 float_args, sizeof(co_aix) * float_arg_cnt); |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1197 memcpy(path->dev_data, path->user_data, msz); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
1198 |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1199 path->shape.free = sh_path_free; |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1200 path->rdman = rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
770
diff
changeset
|
1201 |
1062
a8d20bc8ce40
Rename rdman_shape_man() to rdman_man_shape() to mean managing a shape
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
1202 rdman_man_shape(rdman, (shape_t *)path); |
197
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1203 |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1204 return (shape_t *)path; |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1205 } |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1206 |
bcad1ccdf45c
Translate the path string into binary array to save the parsing in the runtime. It can reduce the size as well.
wycc@wycc-desktop
parents:
186
diff
changeset
|
1207 |
9 | 1208 /*! \brief Transform a path from user space to device space. |
1209 * | |
1210 */ | |
12 | 1211 void sh_path_transform(shape_t *shape) { |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1212 sh_path_t *path; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1213 co_aix *pnts, *dev_pnts; |
12 | 1214 co_aix (*poses)[2]; |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
22
diff
changeset
|
1215 area_t *area; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1216 int pnt_len; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1217 int i; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1218 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1219 ASSERT(shape->type == SHT_PATH); |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1220 ASSERT((shape->pnt_len & 0x1) == 0); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1221 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1222 path = (sh_path_t *)shape; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1223 pnts = (co_aix *)(path->user_data + path->cmd_len); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1224 dev_pnts = (co_aix *)(path->dev_data + path->cmd_len); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1225 pnt_len = path->pnt_len; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1226 for(i = 0; i < pnt_len; i += 2) { |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1227 dev_pnts[0] = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1228 dev_pnts[1] = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1229 coord_trans_pos(shape->coord, dev_pnts, dev_pnts + 1); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1230 dev_pnts += 2; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1231 } |
12 | 1232 |
1233 if(path->shape.geo) { | |
1234 poses = (co_aix (*)[2])(path->dev_data + path->cmd_len); | |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1235 geo_from_positions(path->shape.geo, pnt_len / 2, poses); |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
22
diff
changeset
|
1236 area = shape->geo->cur_area; |
270
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
269
diff
changeset
|
1237 area->x -= shape->stroke_width / 2 + 0.5; |
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
269
diff
changeset
|
1238 area->y -= shape->stroke_width / 2 + 0.5; |
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
269
diff
changeset
|
1239 area->w += shape->stroke_width + 1; |
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
269
diff
changeset
|
1240 area->h += shape->stroke_width + 1; |
12 | 1241 } |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1242 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1243 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1244 static void sh_path_path(shape_t *shape, mbe_t *cr) { |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1245 sh_path_t *path; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1246 int cmd_len; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1247 char *cmds, cmd; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1248 const co_aix *pnts; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1249 const co_aix *float_args; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1250 co_aix x, y, x1, y1, x2, y2; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1251 int i; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1252 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1253 ASSERT(shape->type == SHT_PATH); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1254 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1255 path = (sh_path_t *)shape; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1256 cmd_len = path->cmd_len; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1257 cmds = path->dev_data; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1258 pnts = (co_aix *)(cmds + cmd_len); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1259 float_args = (co_aix *)(cmds + cmd_len + path->pnt_len * sizeof(co_aix)); |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
12
diff
changeset
|
1260 x = y = x1 = y1 = x2 = y2 = 0; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1261 for(i = 0; i < cmd_len; i++) { |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1262 /* All path commands and arguments are transformed |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1263 * to absoluted form. |
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1264 */ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1265 cmd = *cmds++; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1266 switch(cmd) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1267 case 'M': |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1268 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1269 y = *pnts++; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1270 mbe_move_to(cr, x, y); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1271 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1272 case 'L': |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1273 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1274 y = *pnts++; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1275 mbe_line_to(cr, x, y); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1276 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1277 case 'C': |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1278 x1 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1279 y1 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1280 x2 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1281 y2 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1282 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1283 y = *pnts++; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1284 mbe_curve_to(cr, x1, y1, x2, y2, x, y); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1285 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1286 case 'S': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1287 x1 = x + x - x2; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1288 y1 = y + y - y2; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1289 x2 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1290 y2 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1291 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1292 y = *pnts++; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1293 mbe_curve_to(cr, x1, y1, x2, y2, x, y); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1294 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1295 case 'Q': |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1296 x1 = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1297 y1 = *pnts++; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1298 x2 = x1; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1299 y2 = y1; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1300 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1301 y = *pnts++; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1302 mbe_curve_to(cr, x1, y1, x2, y2, x, y); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1303 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1304 case 'T': |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1305 x1 = x + x - x2; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1306 y1 = y + y - y2; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1307 x2 = x1; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1308 y2 = y1; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1309 x = *pnts++; |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1310 y = *pnts++; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1311 mbe_curve_to(cr, x1, y1, x2, y2, x, y); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1312 break; |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1313 case 'A': |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1314 _sh_path_arc_path(cr, path, &pnts, &float_args); |
97
9453e68092b5
Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
1315 break; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1316 case 'Z': |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1317 mbe_close_path(cr); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1318 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1319 case '\x0': |
8 | 1320 i = cmd_len; /* padding! Skip remain ones. */ |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1321 break; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1322 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1323 } |
22 | 1324 } |
6
772511b8b9be
Cairo specify RGB values in range 0.0 ~ 1.0.
Thinker K.F. Li <thinker@branda.to>
parents:
5
diff
changeset
|
1325 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
1326 void sh_path_draw(shape_t *shape, mbe_t *cr) { |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
26
diff
changeset
|
1327 sh_path_path(shape, cr); |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
26
diff
changeset
|
1328 } |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
26
diff
changeset
|
1329 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1330 #ifdef UNITTEST |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1331 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1332 #include <CUnit/Basic.h> |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1333 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
149
diff
changeset
|
1334 void test_rdman_shape_path_new(void) { |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1335 sh_path_t *path; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1336 co_aix *pnts; |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1337 redraw_man_t rdman; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1338 |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1339 path = (sh_path_t *)rdman_shape_path_new(&rdman, "M 33 25l33 55c 33 87 44 22 55 99L33 77z"); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1340 CU_ASSERT(path != NULL); |
10 | 1341 CU_ASSERT(path->cmd_len == ((5 + RESERVED_AIXS + 3) & ~0x3)); |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1342 CU_ASSERT(path->pnt_len == 12); |
145
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1343 CU_ASSERT(strncmp(path->user_data, "MLCLZ", 5) == 0); |
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1344 CU_ASSERT(strncmp(path->dev_data, "MLCLZ", 5) == 0); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1345 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1346 pnts = (co_aix *)(path->user_data + path->cmd_len); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1347 CU_ASSERT(pnts[0] == 33); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1348 CU_ASSERT(pnts[1] == 25); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1349 CU_ASSERT(pnts[2] == 66); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1350 CU_ASSERT(pnts[3] == 80); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1351 CU_ASSERT(pnts[4] == 99); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1352 CU_ASSERT(pnts[5] == 167); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1353 CU_ASSERT(pnts[6] == 110); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1354 CU_ASSERT(pnts[7] == 102); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1355 CU_ASSERT(pnts[8] == 121); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1356 CU_ASSERT(pnts[9] == 179); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1357 CU_ASSERT(pnts[10] == 33); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1358 CU_ASSERT(pnts[11] == 77); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1359 sh_path_free((shape_t *)path); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1360 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1361 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1362 void test_path_transform(void) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1363 sh_path_t *path; |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1364 co_aix *pnts; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1365 coord_t coord; |
12 | 1366 geo_t geo; |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1367 redraw_man_t rdman; |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1368 |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1369 path = (sh_path_t *)rdman_shape_path_new(&rdman, "M 33 25l33 55C 33 87 44 22 55 99L33 77z"); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1370 CU_ASSERT(path != NULL); |
10 | 1371 CU_ASSERT(path->cmd_len == ((5 + RESERVED_AIXS + 3) & ~0x3)); |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1372 CU_ASSERT(path->pnt_len == 12); |
145
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1373 CU_ASSERT(strncmp(path->user_data, "MLCLZ", 5) == 0); |
609ed47a58f2
Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
112
diff
changeset
|
1374 CU_ASSERT(strncmp(path->dev_data, "MLCLZ", 5) == 0); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1375 |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1376 geo_init(&geo); |
12 | 1377 path->shape.geo = &geo; |
1378 geo.shape = (shape_t *)path; | |
1379 | |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1380 coord.aggr_matrix[0] = 1; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1381 coord.aggr_matrix[1] = 0; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1382 coord.aggr_matrix[2] = 1; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1383 coord.aggr_matrix[3] = 0; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1384 coord.aggr_matrix[4] = 2; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1385 coord.aggr_matrix[5] = 0; |
12 | 1386 path->shape.coord = &coord; |
1387 sh_path_transform((shape_t *)path); | |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1388 |
458
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1389 pnts = (co_aix *)(path->dev_data + path->cmd_len); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1390 CU_ASSERT(pnts[0] == 34); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1391 CU_ASSERT(pnts[1] == 50); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1392 CU_ASSERT(pnts[2] == 67); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1393 CU_ASSERT(pnts[3] == 160); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1394 CU_ASSERT(pnts[4] == 34); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1395 CU_ASSERT(pnts[5] == 174); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1396 CU_ASSERT(pnts[6] == 45); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1397 CU_ASSERT(pnts[7] == 44); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1398 CU_ASSERT(pnts[8] == 56); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1399 CU_ASSERT(pnts[9] == 198); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1400 CU_ASSERT(pnts[10] == 34); |
bb4f651090bf
Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
1401 CU_ASSERT(pnts[11] == 154); |
12 | 1402 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1403 sh_path_free((shape_t *)path); |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1404 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1405 |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1406 void test_small_slope(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1407 co_aix x, y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1408 co_aix slope; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1409 co_aix r; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1410 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1411 x = 135.3; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1412 y = 149.6; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1413 r = (co_aix)_small_slope(x * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1414 y * FRACTION_ONE) / |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1415 FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1416 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1417 slope = MIN(x, y) / MAX(x, y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1418 CU_ASSERT(((r - slope) / slope) < 0.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1419 ((r - slope) / slope) > -0.01); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1420 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1421 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1422 void test_find_slope_index(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1423 co_aix slope; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1424 int idx; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1425 co_aix r; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1426 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1427 slope = 0.754; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1428 idx = _find_slope_index(slope * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1429 r = (co_aix)slope_tab[idx] / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1430 CU_ASSERT((r / slope) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1431 (r / slope) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1432 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1433 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1434 void test_vector_len(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1435 co_aix x, y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1436 co_aix len; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1437 co_aix r; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1438 int rlen; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1439 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1440 x = 397; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1441 y = 449; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1442 len = sqrt(x * x + y * y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1443 rlen = _vector_len(x * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1444 y * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1445 r = (co_aix)rlen / (1 <<FRACTION_SHIFT); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1446 CU_ASSERT((r / len) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1447 (r / len) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1448 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1449 x = 357; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1450 y = 224; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1451 len = sqrt(x * x + y * y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1452 rlen = _vector_len(x * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1453 y * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1454 r = (co_aix)rlen / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1455 CU_ASSERT((r / len) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1456 (r / len) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1457 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1458 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1459 void test_find_arc_radius(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1460 co_aix ratio; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1461 int idx; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1462 co_aix r; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1463 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1464 ratio = 0.732; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1465 idx = _find_arc_radius(ratio * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1466 r = (co_aix)arc_radius_ratio_tab[idx] / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1467 CU_ASSERT((r / ratio) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1468 (r / ratio) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1469 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1470 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1471 void test_get_arc_radius_shift_factor(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1472 co_aix arc_x, arc_y, radius; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1473 co_aix factor; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1474 int rfactor; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1475 co_aix r; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1476 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1477 arc_x = 30.5; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1478 arc_y = 10.3; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1479 radius = 90.3; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1480 factor = sqrt(radius * radius - (arc_x * arc_x + arc_y * arc_y) / 4) / |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1481 radius; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1482 rfactor = _get_arc_radius_shift_factor(arc_x * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1483 arc_y * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1484 radius * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1485 r = (co_aix)rfactor / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1486 CU_ASSERT((r / factor) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1487 (r / factor) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1488 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1489 arc_x = 30.5; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1490 arc_y = 70.3; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1491 radius = 190.3; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1492 factor = sqrt(radius * radius - (arc_x * arc_x + arc_y * arc_y) / 4) / |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1493 radius; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1494 rfactor = _get_arc_radius_shift_factor(arc_x * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1495 arc_y * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1496 radius * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1497 r = (co_aix)rfactor / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1498 CU_ASSERT((r / factor) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1499 (r / factor) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1500 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1501 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1502 void test_compute_extend_unit_vector(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1503 co_aix rx, ry; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1504 co_aix x_rotate; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1505 co_aix unit_x, unit_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1506 co_aix runit_x, runit_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1507 int64_t ext_unit_x, ext_unit_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1508 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1509 rx = 200; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1510 ry = 153; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1511 x_rotate = PI * 30 / 180; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1512 unit_x = cos(PI * 90 / 180 + x_rotate); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1513 unit_y = sin(PI * 90 / 180 + x_rotate); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1514 _compute_extend_unit_vector(rx * FRACTION_ONE, ry * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1515 x_rotate * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1516 &ext_unit_x, &ext_unit_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1517 runit_x = (co_aix)ext_unit_x / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1518 runit_y = (co_aix)ext_unit_y / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1519 CU_ASSERT((runit_x / unit_x) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1520 (runit_x / unit_x) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1521 CU_ASSERT((runit_y / unit_y) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1522 (runit_y / unit_y) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1523 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1524 rx = 200; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1525 ry = 153; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1526 x_rotate = PI * 158 / 180; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1527 unit_x = cos(PI * 90 / 180 + x_rotate); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1528 unit_y = sin(PI * 90 / 180 + x_rotate); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1529 _compute_extend_unit_vector(rx * FRACTION_ONE, ry * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1530 x_rotate * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1531 &ext_unit_x, &ext_unit_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1532 runit_x = (co_aix)ext_unit_x / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1533 runit_y = (co_aix)ext_unit_y / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1534 CU_ASSERT((runit_x / unit_x) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1535 (runit_x / unit_x) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1536 CU_ASSERT((runit_y / unit_y) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1537 (runit_y / unit_y) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1538 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1539 rx = 100; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1540 ry = 153; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1541 x_rotate = PI * 158 / 180; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1542 unit_x = cos(x_rotate); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1543 unit_y = sin(x_rotate); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1544 _compute_extend_unit_vector(rx * FRACTION_ONE, ry * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1545 x_rotate * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1546 &ext_unit_x, &ext_unit_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1547 runit_x = (co_aix)ext_unit_x / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1548 runit_y = (co_aix)ext_unit_y / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1549 CU_ASSERT((runit_x / unit_x) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1550 (runit_x / unit_x) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1551 CU_ASSERT((runit_y / unit_y) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1552 (runit_y / unit_y) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1553 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1554 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1555 void test_get_center_ref_shift(void) { |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1556 co_aix slope; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1557 int slope_index; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1558 co_aix arc_len; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1559 co_aix arc_x, arc_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1560 int large, sweep; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1561 co_aix shift_x, shift_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1562 co_aix r_x, r_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1563 int64_t rshift_x, rshift_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1564 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1565 arc_x = 311; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1566 arc_y = 210; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1567 large = 0; /* small arc */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1568 sweep = 1; /* positive sweep */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1569 arc_len = sqrt(arc_x * arc_x + arc_y * arc_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1570 shift_x = arc_y / arc_len * (1 << REF_RADIUS_SHIFT); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1571 shift_y = arc_x / arc_len * (1 << REF_RADIUS_SHIFT); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1572 if((arc_x < 0) ^ (arc_y < 0)) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1573 /* exactly one of arc_x and arc_y is negative */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1574 shift_y = -shift_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1575 else |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1576 shift_x = -shift_x; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1577 slope = MIN(ABS(arc_x), ABS(arc_y)) / MAX(ABS(arc_x), ABS(arc_y)); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1578 slope_index = _find_slope_index(slope * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1579 _get_center_ref_shift(arc_x * FRACTION_ONE, arc_y * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1580 large, sweep, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1581 slope_index, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1582 &rshift_x, &rshift_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1583 r_x = (co_aix)rshift_x / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1584 r_y = (co_aix)rshift_y / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1585 CU_ASSERT((r_x / shift_x) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1586 (r_x / shift_x) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1587 CU_ASSERT((r_y / shift_y) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1588 (r_y / shift_y) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1589 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1590 arc_x = 311; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1591 arc_y = 210; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1592 large = 1; /* small arc */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1593 sweep = 1; /* positive sweep */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1594 arc_len = sqrt(arc_x * arc_x + arc_y * arc_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1595 shift_x = -arc_y / arc_len * (1 << REF_RADIUS_SHIFT); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1596 shift_y = -arc_x / arc_len * (1 << REF_RADIUS_SHIFT); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1597 if((arc_x < 0) ^ (arc_y < 0)) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1598 /* exactly one of arc_x and arc_y is negative */ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1599 shift_y = -shift_y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1600 else |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1601 shift_x = -shift_x; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1602 slope = MIN(ABS(arc_x), ABS(arc_y)) / MAX(ABS(arc_x), ABS(arc_y)); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1603 slope_index = _find_slope_index(slope * FRACTION_ONE); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1604 _get_center_ref_shift(arc_x * FRACTION_ONE, arc_y * FRACTION_ONE, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1605 large, sweep, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1606 slope_index, |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1607 &rshift_x, &rshift_y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1608 r_x = (co_aix)rshift_x / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1609 r_y = (co_aix)rshift_y / FRACTION_ONE; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1610 CU_ASSERT((r_x / shift_x) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1611 (r_x / shift_x) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1612 CU_ASSERT((r_y / shift_y) < 1.01 && |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1613 (r_y / shift_y) > 0.99); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1614 } |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1615 |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
1616 void test_calc_center(void) { |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1617 co_aix x0, y0, x, y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1618 co_aix rx, ry, x_rotate; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1619 int large, sweep; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1620 co_aix cx, cy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1621 co_aix angle_start, angle_stop; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1622 co_aix rcx, rcy; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1623 co_aix _x, _y; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1624 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1625 #define ELLIPSE_POINT(angle, point_x, point_y) \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1626 do { \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1627 _x = rx * cos(angle); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1628 _y = ry * sin(angle); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1629 point_x = _x * cos(x_rotate) - _y * sin(x_rotate) + cx; \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1630 point_y = _x * sin(x_rotate) + _y * cos(x_rotate) + cy; \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1631 } while(0) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1632 #define CENTER_TEST() \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1633 do { \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1634 _calc_center(x0, y0, x, y, rx, ry, x_rotate, \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1635 0, 1, &rcx, &rcy); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1636 CU_ASSERT((cx - rcx) <= 2 && (cx - rcx) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1637 CU_ASSERT((cy - rcy) <= 2 && (cy - rcy) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1638 _calc_center(x0, y0, x, y, rx, ry, x_rotate, \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1639 1, 0, &rcx, &rcy); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1640 CU_ASSERT((cx - rcx) <= 2 && (cx - rcx) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1641 CU_ASSERT((cy - rcy) <= 2 && (cy - rcy) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1642 _calc_center(x, y, x0, y0, rx, ry, x_rotate, \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1643 0, 0, &rcx, &rcy); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1644 CU_ASSERT((cx - rcx) <= 2 && (cx - rcx) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1645 CU_ASSERT((cy - rcy) <= 2 && (cy - rcy) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1646 _calc_center(x, y, x0, y0, rx, ry, x_rotate, \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1647 1, 1, &rcx, &rcy); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1648 CU_ASSERT((cx - rcx) <= 2 && (cx - rcx) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1649 CU_ASSERT((cy - rcy) <= 2 && (cy - rcy) >= -2); \ |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1650 } while(0) |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1651 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1652 cx = 135; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1653 cy = 254; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1654 rx = 200; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1655 ry = 170; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1656 x_rotate = PI * 20 / 180; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1657 angle_start = PI * 55 / 180; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1658 angle_stop = PI * 97 / 180; |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1659 |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1660 ELLIPSE_POINT(angle_start, x0, y0); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1661 ELLIPSE_POINT(angle_stop, x, y); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1662 CENTER_TEST(); |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
1663 } |
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
1664 |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1665 void test_spaces_head_tail(void) { |
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1666 sh_path_t *path; |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1667 redraw_man_t rdman; |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1668 |
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1669 path = (sh_path_t *) |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
1670 rdman_shape_path_new(&rdman, |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
149
diff
changeset
|
1671 " M 33 25l33 55C 33 87 44 22 55 99L33 77z "); |
11
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1672 CU_ASSERT(path != NULL); |
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1673 sh_path_free((shape_t *)path); |
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1674 } |
128af06c876c
Fix the bug that data of a path end with white spaces would make system down
Thinker K.F. Li <thinker@branda.to>
parents:
10
diff
changeset
|
1675 |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1676 CU_pSuite get_shape_path_suite(void) { |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1677 CU_pSuite suite; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1678 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1679 suite = CU_add_suite("Suite_shape_path", NULL, NULL); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
149
diff
changeset
|
1680 CU_ADD_TEST(suite, test_rdman_shape_path_new); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1681 CU_ADD_TEST(suite, test_path_transform); |
1134
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1682 CU_ADD_TEST(suite, test_small_slope); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1683 CU_ADD_TEST(suite, test_find_slope_index); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1684 CU_ADD_TEST(suite, test_vector_len); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1685 CU_ADD_TEST(suite, test_find_arc_radius); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1686 CU_ADD_TEST(suite, test_get_arc_radius_shift_factor); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1687 CU_ADD_TEST(suite, test_compute_extend_unit_vector); |
bd0cfb8666b8
Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents:
1129
diff
changeset
|
1688 CU_ADD_TEST(suite, test_get_center_ref_shift); |
1129
eca737d33a18
Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents:
1062
diff
changeset
|
1689 CU_ADD_TEST(suite, test_calc_center); |
5
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1690 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1691 return suite; |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1692 } |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1693 |
9c331ec9e210
SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1694 #endif /* UNITTEST */ |