Lines Matching refs:stroker

27 #include "stroker.h"
522 static INLINE enum line_join_mode stroker_join_mode(struct stroker *s)
536 static INLINE enum line_join_mode stroker_cap_mode(struct stroker *s)
550 void stroker_emit_move_to(struct stroker *stroker, VGfloat x, VGfloat y)
557 stroker->back2_x = stroker->back1_x;
558 stroker->back2_y = stroker->back1_y;
559 stroker->back1_x = x;
560 stroker->back1_y = y;
562 path_append_data(stroker->path,
567 void stroker_emit_line_to(struct stroker *stroker, VGfloat x, VGfloat y)
574 stroker->back2_x = stroker->back1_x;
575 stroker->back2_y = stroker->back1_y;
576 stroker->back1_x = x;
577 stroker->back1_y = y;
578 path_append_data(stroker->path,
583 void stroker_emit_curve_to(struct stroker *stroker, VGfloat px1, VGfloat py1,
596 stroker->back2_x = stroker->back1_x;
597 stroker->back2_y = stroker->back1_y;
599 stroker->back2_x = px1;
600 stroker->back2_y = py1;
603 stroker->back2_x = px2;
604 stroker->back2_y = py2;
606 stroker->back1_x = x;
607 stroker->back1_y = y;
609 path_append_data(stroker->path,
614 static INLINE void create_round_join(struct stroker *stroker,
624 /*stroker_emit_line_to(stroker, nx, ny);*/
628 arc_stroker_emit(&arc, stroker, &matrix);
632 static void create_joins(struct stroker *stroker,
642 if (floatsEqual(stroker->back1_x, next_line[0]) &&
643 floatsEqual(stroker->back1_y, next_line[1]))
647 stroker_emit_line_to(stroker, next_line[0], next_line[1]);
649 VGfloat prev_line[] = {stroker->back2_x, stroker->back2_y,
650 stroker->back1_x, stroker->back1_y};
656 VGfloat offset = stroker->stroke_width / 2;
672 stroker_emit_line_to(stroker, l1[2], l1[3]);
673 stroker_emit_line_to(stroker, l2[2], l2[3]);
674 stroker_emit_line_to(stroker, l2[0], l2[1]);
676 VGfloat offset = stroker->stroke_width / 2;
683 stroker_emit_line_to(stroker, next_line[0], next_line[1]);
686 create_round_join(stroker, prev_line[2], prev_line[3],
690 stroker_emit_line_to(stroker, next_line[0], next_line[1]);
692 VGfloat offset = stroker->stroke_width / 2;
705 stroker_emit_curve_to(stroker, l1[2], l1[3],
716 stroker_emit_curve_to(stroker,
721 VGfloat miter_line[4] = {stroker->back1_x, stroker->back1_y,
723 VGfloat sl = (stroker->stroke_width * stroker->miter_limit);
734 stroker_emit_line_to(stroker, next_line[0], next_line[1]);
739 stroker_emit_line_to(stroker, next_line[0], next_line[1]);
741 stroker_emit_line_to(stroker, isect[0], isect[1]);
742 stroker_emit_line_to(stroker, next_line[0], next_line[1]);
750 static void stroker_add_segment(struct stroker *stroker,
756 if (stroker->segments->num_elements &&
757 stroker->last_cmd == cmd) {
758 VGfloat *data = stroker->control_points->data;
759 data += stroker->control_points->num_elements;
784 } else if (stroker->last_cmd == VG_CUBIC_TO_ABS &&
786 VGfloat *data = stroker->control_points->data;
787 data += stroker->control_points->num_elements;
793 stroker->last_cmd = cmd;
794 array_append_data(stroker->segments, &cmd, 1);
795 array_append_data(stroker->control_points, coords, num_coords);
798 void stroker_move_to(struct stroker *stroker, VGfloat x, VGfloat y)
805 if (stroker->segments->num_elements > 0)
806 stroker->process_subpath(stroker);
808 array_reset(stroker->segments);
809 array_reset(stroker->control_points);
811 stroker_add_segment(stroker, VG_MOVE_TO_ABS, coords, 2);
814 void stroker_line_to(struct stroker *stroker, VGfloat x, VGfloat y)
821 if (!stroker->segments->num_elements)
822 stroker_add_segment(stroker, VG_MOVE_TO_ABS, zero_coords, 2);
824 stroker_add_segment(stroker, VG_LINE_TO_ABS, coords, 2);
827 void stroker_curve_to(struct stroker *stroker, VGfloat px1, VGfloat py1,
838 if (!stroker->segments->num_elements)
839 stroker_add_segment(stroker, VG_MOVE_TO_ABS, zero_coords, 2);
841 stroker_add_segment(stroker, VG_CUBIC_TO_ABS, coords, 6);
869 struct stroker *stroker,
882 stroker_emit_move_to(stroker, 0.f, 0.f);
896 offset = stroker->stroke_width / 2;
926 create_joins(stroker, prev[0], prev[1], line,
927 stroker_cap_mode(stroker));
929 stroker_emit_move_to(stroker, line[0], line[1]);
934 create_joins(stroker, prev[0], prev[1], line,
935 stroker_join_mode(stroker));
939 stroker_emit_line_to(stroker, line[2], line[3]);
975 create_joins(stroker, prev[0], prev[1], tangent,
976 stroker_cap_mode(stroker));
978 stroker_emit_move_to(stroker, pt[0], pt[1]);
986 create_joins(stroker, prev[0], prev[1], tangent,
987 stroker_join_mode(stroker));
993 stroker_emit_curve_to(stroker,
1009 debug_printf("\n stroker: closed subpath\n");
1011 create_joins(stroker, prev[0], prev[1], start_tangent,
1012 stroker_join_mode(stroker));
1016 debug_printf("\n stroker: open subpath\n");
1023 static void stroker_process_subpath(struct stroker *stroker)
1029 debug_assert(stroker->segments->num_elements > 0);
1036 stroke_forward_iterator(&fwit, stroker->segments,
1037 stroker->control_points);
1038 stroke_backward_iterator(&bwit, stroker->segments,
1039 stroker->control_points);
1043 fwclosed = vg_stroke_outline(&fwit, stroker, VG_FALSE, fw_start_tangent);
1044 bwclosed = vg_stroke_outline(&bwit, stroker, !fwclosed, bw_start_tangent);
1047 create_joins(stroker,
1049 stroker_cap_mode(stroker));
1054 if (stroker->segments->num_elements <= 3) {
1059 stroke_forward_iterator(it, stroker->segments,
1060 stroker->control_points);
1079 if (stroker->cap_style == VG_CAP_SQUARE) {
1080 VGfloat offset = stroker->stroke_width / 2;
1081 stroker_emit_move_to(stroker, data[0] - offset,
1083 stroker_emit_line_to(stroker, data[0] + offset,
1085 stroker_emit_line_to(stroker, data[0] + offset,
1087 stroker_emit_line_to(stroker, data[0] - offset,
1089 stroker_emit_line_to(stroker, data[0] - offset,
1091 } else if (stroker->cap_style == VG_CAP_ROUND) {
1092 VGfloat offset = stroker->stroke_width / 2;
1099 stroker_emit_move_to(stroker, cx + offset, cy);
1104 arc_stroker_emit(&arc, stroker, &matrix);
1109 arc_stroker_emit(&arc, stroker, &matrix);
1116 static INLINE VGfloat dash_pattern(struct dash_stroker *stroker,
1119 if (stroker->dash_pattern[idx] < 0)
1121 return stroker->dash_pattern[idx];
1124 static void dash_stroker_process_subpath(struct stroker *str)
1126 struct dash_stroker *stroker = (struct dash_stroker *)str;
1132 VGfloat doffset = stroker->dash_phase;
1143 stroke_flat_iterator(&it, stroker->base.segments,
1144 stroker->base.control_points);
1150 debug_assert(stroker->dash_pattern_num > 0);
1152 for (i = 0; i < stroker->dash_pattern_num; ++i) {
1153 sum_length += dash_pattern(stroker, i);
1162 while (!floatIsZero(doffset) && doffset >= dash_pattern(stroker, idash)) {
1163 doffset -= dash_pattern(stroker, idash);
1164 idash = (idash + 1) % stroker->dash_pattern_num;
1192 VGfloat dpos = pos + dash_pattern(stroker, idash) - doffset - estart;
1197 doffset = dash_pattern(stroker, idash) - (dpos - elen);
1215 stroker_move_to(&stroker->stroker, move_to_pos[0], move_to_pos[1]);
1218 stroker_line_to(&stroker->stroker, line_to_pos[0], line_to_pos[1]);
1224 idash = (idash + idash_incr) % stroker->dash_pattern_num;
1237 stroker->base.path = stroker->stroker.path;
1240 static void default_begin(struct stroker *stroker)
1242 array_reset(stroker->segments);
1243 array_reset(stroker->control_points);
1246 static void default_end(struct stroker *stroker)
1248 if (stroker->segments->num_elements > 0)
1249 stroker->process_subpath(stroker);
1253 static void dash_stroker_begin(struct stroker *stroker)
1256 (struct dash_stroker *)stroker;
1258 default_begin(&dasher->stroker);
1259 default_begin(stroker);
1262 static void dash_stroker_end(struct stroker *stroker)
1265 (struct dash_stroker *)stroker;
1267 default_end(stroker);
1268 default_end(&dasher->stroker);
1271 void stroker_init(struct stroker *stroker,
1274 stroker->stroke_width = state->stroke.line_width.f;
1275 stroker->miter_limit = state->stroke.miter_limit.f;
1276 stroker->cap_style = state->stroke.cap_style;
1277 stroker->join_style = state->stroke.join_style;
1279 stroker->begin = default_begin;
1280 stroker->process_subpath = stroker_process_subpath;
1281 stroker->end = default_end;
1283 stroker->segments = array_create(sizeof(VGubyte));
1284 stroker->control_points = array_create(sizeof(VGfloat));
1286 stroker->back1_x = 0;
1287 stroker->back1_y = 0;
1288 stroker->back2_x = 0;
1289 stroker->back2_y = 0;
1291 stroker->path = path_create(VG_PATH_DATATYPE_F, 1.0f, 0.0f,
1295 stroker->last_cmd = (VGPathCommand)0;
1298 void dash_stroker_init(struct stroker *str,
1301 struct dash_stroker *stroker = (struct dash_stroker *)str;
1305 stroker_init(&stroker->stroker, state);
1312 stroker->dash_pattern[i] = state->stroke.dash_pattern[i].f;
1313 stroker->dash_pattern_num = real_num;
1316 stroker->dash_phase = state->stroke.dash_phase.f;
1317 stroker->dash_phase_reset = state->stroke.dash_phase_reset;
1319 stroker->base.begin = dash_stroker_begin;
1320 stroker->base.process_subpath = dash_stroker_process_subpath;
1321 stroker->base.end = dash_stroker_end;
1322 path_destroy(stroker->base.path);
1323 stroker->base.path = NULL;
1326 void stroker_begin(struct stroker *stroker)
1328 stroker->begin(stroker);
1331 void stroker_end(struct stroker *stroker)
1333 stroker->end(stroker);
1336 void stroker_cleanup(struct stroker *stroker)
1338 array_destroy(stroker->segments);
1339 array_destroy(stroker->control_points);
1342 void dash_stroker_cleanup(struct dash_stroker *stroker)
1344 /* if stroker->base.path is null means we never
1347 if (!stroker->base.path)
1348 path_destroy(stroker->stroker.path);
1349 stroker_cleanup(&stroker->stroker);
1350 stroker_cleanup((struct stroker*)stroker);