annotate src/shape_path.c @ 1524:d46ba9e7f837

Update action list with timeline names of current component.
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 22 Aug 2011 14:53:55 +0800
parents bae104d8d247
children
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
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
12 /*! \brief Implement respective objects for SVG path tag.
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
13 *
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
14 * In user_data or dev_data, 0x00 bytes are padding after commands.
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
15 * No commands other than 0x00 can resident after 0x00 itself.
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
16 * It means command processing code can skip commands after a 0x00.
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
17 *
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
18 * Shapes should check if shape_t::geo is assigned. Once transformation
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
19 * matrics are changed, shape objects should update shape_t::geo if
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
20 * it is assigned.
8
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
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
7cfecdce94cc Remove warning messages
Thinker K.F. Li <thinker@branda.to>
parents: 9
diff changeset
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
920c9e6e4214 Make code clear
Thinker K.F. Li <thinker@branda.to>
parents: 707
diff changeset
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
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 224
diff changeset
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
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 224
diff changeset
75 #endif
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 224
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
857 case 'A':
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
858 case 'a':
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
859 while(*p) {
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
860 SKIP_SPACE(p);
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
861 old = p;
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
862 SKIP_NUM(p);
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
863 if(p == old)
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
866 for(i = 0; i < 6; i++) {
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
867 SKIP_SPACE(p);
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
868 old = p;
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
869 SKIP_NUM(p);
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
870 if(p == old)
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
871 return ERR;
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
872 }
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
878 }
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
895 }
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
7cfecdce94cc Remove warning messages
Thinker K.F. Li <thinker@branda.to>
parents: 9
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 34
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
1085
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
1086 case 'A':
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
1093 break;
Thinker K.F. Li <thinker@branda.to>
parents: 86
diff changeset
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
6eecdd331fe7 Fix bug in testcase
Thinker K.F. Li <thinker@branda.to>
parents: 8
diff changeset
1111 /*! \brief Create a path from value of 'data' of SVG path.
6eecdd331fe7 Fix bug in testcase
Thinker K.F. Li <thinker@branda.to>
parents: 8
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
1124 /* Align at 4's boundary and keep 2 unused co_aix space
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
1125 * to make logic of transformation from relative to absolute
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
1126 * simple.
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
1127 */
10
7cfecdce94cc Remove warning messages
Thinker K.F. Li <thinker@branda.to>
parents: 9
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 146
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
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;
1165
9f2b5a1a0d84 Fix bug of unpredicatible output of tank.
Thinker K.F. Li <thinker@codemud.net>
parents: 1134
diff changeset
1193 memcpy(path->user_data, commands, strlen(commands) + 1);
458
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
1370
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1207 shape_t *
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1208 rdman_shape_path_clone(redraw_man_t *rdman, const shape_t *_src_path) {
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1209 const sh_path_t *src_path = (const sh_path_t *)_src_path;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1210 sh_path_t *new_path;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1211 char *udata;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1212 char *cmds;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1213 co_aix *pnts, *float_args;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1214
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1215 udata = src_path->user_data;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1216 cmds = udata;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1217 pnts = (co_aix *)(udata + src_path->cmd_len);
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1218 float_args = pnts + src_path->pnt_len;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1219 new_path =
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1220 (sh_path_t *)rdman_shape_path_new_from_binary(rdman,
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1221 cmds,
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1222 pnts, src_path->pnt_len,
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1223 float_args,
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1224 src_path->float_arg_len);
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1225 if(new_path == NULL)
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1226 return NULL;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1227
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1228 sh_copy_style(rdman, (shape_t *)src_path, (shape_t *)new_path);
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1229
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1230 return (shape_t *)new_path;
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1231 }
bae104d8d247 Add clone functions for shape types
Thinker K.F. Li <thinker@codemud.net>
parents: 1165
diff changeset
1232
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
1233
9
6eecdd331fe7 Fix bug in testcase
Thinker K.F. Li <thinker@branda.to>
parents: 8
diff changeset
1234 /*! \brief Transform a path from user space to device space.
6eecdd331fe7 Fix bug in testcase
Thinker K.F. Li <thinker@branda.to>
parents: 8
diff changeset
1235 *
6eecdd331fe7 Fix bug in testcase
Thinker K.F. Li <thinker@branda.to>
parents: 8
diff changeset
1236 */
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1237 void sh_path_transform(shape_t *shape) {
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1238 sh_path_t *path;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1239 co_aix *pnts, *dev_pnts;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1240 co_aix (*poses)[2];
26
d50f33040de6 Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents: 22
diff changeset
1241 area_t *area;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1242 int pnt_len;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1243 int i;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1244
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1245 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
1246 ASSERT((shape->pnt_len & 0x1) == 0);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1247
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1248 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
1249 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
1250 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
1251 pnt_len = path->pnt_len;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1252 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
1253 dev_pnts[0] = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1254 dev_pnts[1] = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1255 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
1256 dev_pnts += 2;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1257 }
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1258
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1259 if(path->shape.geo) {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1260 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
1261 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
1262 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
1263 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
1264 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
1265 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
1266 area->h += shape->stroke_width + 1;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1267 }
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1268 }
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1269
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1270 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
1271 sh_path_t *path;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1272 int cmd_len;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1273 char *cmds, cmd;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1274 const co_aix *pnts;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1275 const co_aix *float_args;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1276 co_aix x, y, x1, y1, x2, y2;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1277 int i;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1278
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1279 ASSERT(shape->type == SHT_PATH);
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1280
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1281 path = (sh_path_t *)shape;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1282 cmd_len = path->cmd_len;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1283 cmds = path->dev_data;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1284 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
1285 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
1286 x = y = x1 = y1 = x2 = y2 = 0;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1287 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
1288 /* 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
1289 * to absoluted form.
9453e68092b5 Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents: 96
diff changeset
1290 */
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1291 cmd = *cmds++;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1292 switch(cmd) {
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1293 case 'M':
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1294 x = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1295 y = *pnts++;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1296 mbe_move_to(cr, x, y);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1297 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1298 case 'L':
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1299 x = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1300 y = *pnts++;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1301 mbe_line_to(cr, x, y);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1302 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1303 case 'C':
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1304 x1 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1305 y1 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1306 x2 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1307 y2 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1308 x = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1309 y = *pnts++;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1310 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
1311 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1312 case 'S':
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1313 x1 = x + x - x2;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1314 y1 = y + y - y2;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1315 x2 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1316 y2 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1317 x = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1318 y = *pnts++;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1319 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
1320 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1321 case 'Q':
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1322 x1 = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1323 y1 = *pnts++;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1324 x2 = x1;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1325 y2 = y1;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1326 x = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1327 y = *pnts++;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1328 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
1329 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1330 case 'T':
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1331 x1 = x + x - x2;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1332 y1 = y + y - y2;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1333 x2 = x1;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1334 y2 = y1;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1335 x = *pnts++;
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1336 y = *pnts++;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1337 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
1338 break;
97
9453e68092b5 Fix bug of translation relative to absolute points
Thinker K.F. Li <thinker@branda.to>
parents: 96
diff changeset
1339 case 'A':
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1340 _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
1341 break;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1342 case 'Z':
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1343 mbe_close_path(cr);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1344 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1345 case '\x0':
8
Thinker K.F. Li <thinker@branda.to>
parents: 7
diff changeset
1346 i = cmd_len; /* padding! Skip remain ones. */
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1347 break;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1348 }
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1349 }
22
8fcf2d878ecd shapes with stroke
Thinker K.F. Li <thinker@branda.to>
parents: 20
diff changeset
1350 }
6
772511b8b9be Cairo specify RGB values in range 0.0 ~ 1.0.
Thinker K.F. Li <thinker@branda.to>
parents: 5
diff changeset
1351
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
1352 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
1353 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
1354 }
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
1355
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1356 #ifdef UNITTEST
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1357
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1358 #include <CUnit/Basic.h>
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1359
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
1360 void test_rdman_shape_path_new(void) {
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1361 sh_path_t *path;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1362 co_aix *pnts;
865
48df0f97f09e Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1363 redraw_man_t rdman;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1364
865
48df0f97f09e Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1365 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
1366 CU_ASSERT(path != NULL);
10
7cfecdce94cc Remove warning messages
Thinker K.F. Li <thinker@branda.to>
parents: 9
diff changeset
1367 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
1368 CU_ASSERT(path->pnt_len == 12);
145
609ed47a58f2 Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents: 112
diff changeset
1369 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
1370 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
1371
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1372 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
1373 CU_ASSERT(pnts[0] == 33);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1374 CU_ASSERT(pnts[1] == 25);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1375 CU_ASSERT(pnts[2] == 66);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1376 CU_ASSERT(pnts[3] == 80);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1377 CU_ASSERT(pnts[4] == 99);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1378 CU_ASSERT(pnts[5] == 167);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1379 CU_ASSERT(pnts[6] == 110);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1380 CU_ASSERT(pnts[7] == 102);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1381 CU_ASSERT(pnts[8] == 121);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1382 CU_ASSERT(pnts[9] == 179);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1383 CU_ASSERT(pnts[10] == 33);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1384 CU_ASSERT(pnts[11] == 77);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1385 sh_path_free((shape_t *)path);
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1386 }
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1387
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1388 void test_path_transform(void) {
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1389 sh_path_t *path;
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1390 co_aix *pnts;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1391 coord_t coord;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1392 geo_t geo;
865
48df0f97f09e Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1393 redraw_man_t rdman;
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1394
865
48df0f97f09e Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1395 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
1396 CU_ASSERT(path != NULL);
10
7cfecdce94cc Remove warning messages
Thinker K.F. Li <thinker@branda.to>
parents: 9
diff changeset
1397 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
1398 CU_ASSERT(path->pnt_len == 12);
145
609ed47a58f2 Decrease number of malloc().
Thinker K.F. Li <thinker@branda.to>
parents: 112
diff changeset
1399 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
1400 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
1401
73
9ab15ebc9061 Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents: 58
diff changeset
1402 geo_init(&geo);
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1403 path->shape.geo = &geo;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1404 geo.shape = (shape_t *)path;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1405
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1406 coord.aggr_matrix[0] = 1;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1407 coord.aggr_matrix[1] = 0;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1408 coord.aggr_matrix[2] = 1;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1409 coord.aggr_matrix[3] = 0;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1410 coord.aggr_matrix[4] = 2;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1411 coord.aggr_matrix[5] = 0;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1412 path->shape.coord = &coord;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1413 sh_path_transform((shape_t *)path);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1414
458
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1415 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
1416 CU_ASSERT(pnts[0] == 34);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1417 CU_ASSERT(pnts[1] == 50);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1418 CU_ASSERT(pnts[2] == 67);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1419 CU_ASSERT(pnts[3] == 160);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1420 CU_ASSERT(pnts[4] == 34);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1421 CU_ASSERT(pnts[5] == 174);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1422 CU_ASSERT(pnts[6] == 45);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1423 CU_ASSERT(pnts[7] == 44);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1424 CU_ASSERT(pnts[8] == 56);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1425 CU_ASSERT(pnts[9] == 198);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1426 CU_ASSERT(pnts[10] == 34);
bb4f651090bf Use cairo to transform and draw arc.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
1427 CU_ASSERT(pnts[11] == 154);
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents: 11
diff changeset
1428
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1429 sh_path_free((shape_t *)path);
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1430 }
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1431
1134
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1432 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
1433 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
1434 co_aix slope;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1435 co_aix r;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1436
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1437 x = 135.3;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1438 y = 149.6;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1439 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
1440 y * FRACTION_ONE) /
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1441 FRACTION_ONE;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1442
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1443 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
1444 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
1445 ((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
1446 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1447
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1448 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
1449 co_aix slope;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1450 int idx;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1451 co_aix r;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1452
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1453 slope = 0.754;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1454 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
1455 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
1456 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
1457 (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
1458 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1459
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1460 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
1461 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
1462 co_aix len;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1463 co_aix r;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1464 int rlen;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1465
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1466 x = 397;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1467 y = 449;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1468 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
1469 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
1470 y * FRACTION_ONE);
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1471 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
1472 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
1473 (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
1474
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1475 x = 357;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1476 y = 224;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1477 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
1478 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
1479 y * FRACTION_ONE);
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1480 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
1481 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
1482 (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
1483 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1484
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1485 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
1486 co_aix ratio;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1487 int idx;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1488 co_aix r;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1489
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1490 ratio = 0.732;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1491 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
1492 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
1493 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
1494 (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
1495 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1496
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1497 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
1498 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
1499 co_aix factor;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1500 int rfactor;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1501 co_aix r;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1502
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1503 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
1504 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
1505 radius = 90.3;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1506 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
1507 radius;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1508 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
1509 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
1510 radius * FRACTION_ONE);
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1511 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
1512 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
1513 (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
1514
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1515 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
1516 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
1517 radius = 190.3;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1518 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
1519 radius;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1520 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
1521 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
1522 radius * FRACTION_ONE);
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1523 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
1524 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
1525 (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
1526 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1527
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1528 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
1529 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
1530 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
1531 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
1532 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
1533 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
1534
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1535 rx = 200;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1536 ry = 153;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1537 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
1538 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
1539 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
1540 _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
1541 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
1542 &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
1543 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
1544 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
1545 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
1546 (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
1547 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
1548 (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
1549
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1550 rx = 200;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1551 ry = 153;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1552 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
1553 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
1554 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
1555 _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
1556 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
1557 &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
1558 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
1559 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
1560 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
1561 (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
1562 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
1563 (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
1564
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1565 rx = 100;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1566 ry = 153;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1567 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
1568 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
1569 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
1570 _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
1571 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
1572 &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
1573 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
1574 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
1575 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
1576 (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
1577 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
1578 (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
1579 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1580
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1581 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
1582 co_aix slope;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1583 int slope_index;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1584 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
1585 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
1586 int large, sweep;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1587 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
1588 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
1589 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
1590
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1591 arc_x = 311;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1592 arc_y = 210;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1593 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
1594 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
1595 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
1596 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
1597 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
1598 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
1599 /* 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
1600 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
1601 else
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1602 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
1603 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
1604 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
1605 _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
1606 large, sweep,
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1607 slope_index,
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1608 &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
1609 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
1610 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
1611 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
1612 (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
1613 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
1614 (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
1615
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1616 arc_x = 311;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1617 arc_y = 210;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1618 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
1619 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
1620 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
1621 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
1622 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
1623 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
1624 /* 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
1625 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
1626 else
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1627 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
1628 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
1629 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
1630 _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
1631 large, sweep,
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1632 slope_index,
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1633 &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
1634 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
1635 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
1636 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
1637 (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
1638 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
1639 (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
1640 }
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1641
1129
eca737d33a18 Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents: 1062
diff changeset
1642 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
1643 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
1644 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
1645 int large, sweep;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1646 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
1647 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
1648 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
1649 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
1650
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1651 #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
1652 do { \
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1653 _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
1654 _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
1655 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
1656 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
1657 } while(0)
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1658 #define CENTER_TEST() \
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1659 do { \
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1660 _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
1661 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
1662 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
1663 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
1664 _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
1665 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
1666 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
1667 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
1668 _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
1669 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
1670 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
1671 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
1672 _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
1673 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
1674 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
1675 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
1676 } while(0)
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1677
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1678 cx = 135;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1679 cy = 254;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1680 rx = 200;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1681 ry = 170;
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1682 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
1683 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
1684 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
1685
bd0cfb8666b8 Pass testcases for _calc_center() of shape_path.c.
Thinker K.F. Li <thinker@codemud.net>
parents: 1129
diff changeset
1686 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
1687 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
1688 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
1689 }
eca737d33a18 Improve performance of function to compute center of an arc.
Thinker K.F. Li <thinker@codemud.net>
parents: 1062
diff changeset
1690
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
1691 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
1692 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
1693 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
1694
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
1695 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
1696 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
1697 " 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
1698 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
1699 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
1700 }
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
1701
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1702 CU_pSuite get_shape_path_suite(void) {
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1703 CU_pSuite suite;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1704
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1705 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
1706 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
1707 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
1708 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
1709 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
1710 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
1711 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
1712 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
1713 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
1714 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
1715 CU_ADD_TEST(suite, test_calc_center);
5
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1716
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1717 return suite;
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1718 }
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1719
9c331ec9e210 SVG path is partially supported
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1720 #endif /* UNITTEST */