comparison src/event.c @ 822:586e50f82c1f

Unify coding style tag for emacs and vim.
author Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
date Tue, 14 Sep 2010 01:08:39 +0800
parents d2f2ed27b84d
children 7b4e80ab671a
comparison
equal deleted inserted replaced
821:bfdc82bbd6e4 822:586e50f82c1f
1 // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*-
2 // vim: sw=4:ts=8:sts=4
1 /*! \file 3 /*! \file
2 * \brief Convenience functions for event relative work. 4 * \brief Convenience functions for event relative work.
3 */ 5 */
4 #include <stdio.h> 6 #include <stdio.h>
5 #include <stdlib.h> 7 #include <stdlib.h>
137 #define GEF_OV_DRAW 0x1 139 #define GEF_OV_DRAW 0x1
138 #define GEF_NOT_SHOWED 0x20 140 #define GEF_NOT_SHOWED 0x20
139 141
140 struct shape { 142 struct shape {
141 mb_obj_t obj; 143 mb_obj_t obj;
142 144
143 coord_t *coord; 145 coord_t *coord;
144 area_t area; 146 area_t area;
145 shape_t *all_next; 147 shape_t *all_next;
146 shape_t *drawed_next; 148 shape_t *drawed_next;
147 149
148 void *fill, *stroke; 150 void *fill, *stroke;
149 struct shape *sibling; 151 struct shape *sibling;
150 int flags; 152 int flags;
151 153
152 int num_points; 154 int num_points;
153 co_aix points[32][2]; 155 co_aix points[32][2];
154 }; 156 };
155 enum { MBO_DUMMY, 157 enum { MBO_DUMMY,
156 MBO_COORD, 158 MBO_COORD,
177 #define sh_clear_flags(shape, mask) do { (shape)->flags &= ~(mask); } while(0) 179 #define sh_clear_flags(shape, mask) do { (shape)->flags &= ~(mask); } while(0)
178 #define sh_get_area(shape) (&(shape)->area) 180 #define sh_get_area(shape) (&(shape)->area)
179 181
180 struct coord { 182 struct coord {
181 mb_obj_t obj; 183 mb_obj_t obj;
182 184
183 area_t area; 185 area_t area;
184 int flags; 186 int flags;
185 coord_t *parent; 187 coord_t *parent;
186 STAILQ(coord_t) children; 188 STAILQ(coord_t) children;
187 coord_t *sibling; 189 coord_t *sibling;
206 208
207 static 209 static
208 void _areas_merge(area_t *area1, area_t *area2) { 210 void _areas_merge(area_t *area1, area_t *area2) {
209 co_aix lu_x, lu_y; 211 co_aix lu_x, lu_y;
210 co_aix rb_x, rb_y; 212 co_aix rb_x, rb_y;
211 213
212 lu_x = area2->x; 214 lu_x = area2->x;
213 lu_y = area2->y; 215 lu_y = area2->y;
214 rb_x = lu_x + area2->w - 1; 216 rb_x = lu_x + area2->w - 1;
215 rb_y = lu_y + area2->h - 1; 217 rb_y = lu_y + area2->h - 1;
216 area_extent(area1, lu_x, lu_y); 218 area_extent(area1, lu_x, lu_y);
223 shape_t *shape; 225 shape_t *shape;
224 coord_t *child; 226 coord_t *child;
225 area_t *cur_area; 227 area_t *cur_area;
226 228
227 area = coord_get_area(coord); 229 area = coord_get_area(coord);
228 230
229 shape = STAILQ_HEAD(coord->shapes); 231 shape = STAILQ_HEAD(coord->shapes);
230 if(shape != NULL) { 232 if(shape != NULL) {
231 cur_area = sh_get_area(shape); 233 cur_area = sh_get_area(shape);
232 } else { 234 } else {
233 child = STAILQ_HEAD(coord->children); 235 child = STAILQ_HEAD(coord->children);
234 if(child == NULL) 236 if(child == NULL)
235 return; 237 return;
236 cur_area = coord_get_area(child); 238 cur_area = coord_get_area(child);
237 } 239 }
238 memcpy(area, cur_area, sizeof(area_t)); 240 memcpy(area, cur_area, sizeof(area_t));
239 241
240 FOR_COORD_SHAPES(coord, shape) { 242 FOR_COORD_SHAPES(coord, shape) {
241 cur_area = sh_get_area(shape); 243 cur_area = sh_get_area(shape);
242 _areas_merge(area, cur_area); 244 _areas_merge(area, cur_area);
243 } 245 }
244 246
259 261
260 static 262 static
261 coord_t *preorder_coord_subtree(coord_t *root, coord_t *last) { 263 coord_t *preorder_coord_subtree(coord_t *root, coord_t *last) {
262 if(STAILQ_HEAD(last->children) && !(last->flags & COF_SKIP)) 264 if(STAILQ_HEAD(last->children) && !(last->flags & COF_SKIP))
263 return STAILQ_HEAD(last->children); 265 return STAILQ_HEAD(last->children);
264 266
265 last->flags &= ~COF_SKIP; 267 last->flags &= ~COF_SKIP;
266 268
267 if(last == root) 269 if(last == root)
268 return NULL; 270 return NULL;
269 while(STAILQ_NEXT(coord_t, sibling, last) == NULL) { 271 while(STAILQ_NEXT(coord_t, sibling, last) == NULL) {
270 if(last == root) 272 if(last == root)
271 return NULL; 273 return NULL;
280 } 282 }
281 283
282 static 284 static
283 coord_t *postorder_coord_subtree(coord_t *root, coord_t *last) { 285 coord_t *postorder_coord_subtree(coord_t *root, coord_t *last) {
284 coord_t *cur; 286 coord_t *cur;
285 287
286 if(last != NULL) { 288 if(last != NULL) {
287 if(STAILQ_NEXT(coord_t, sibling, last) == NULL) { 289 if(STAILQ_NEXT(coord_t, sibling, last) == NULL) {
288 if(cur == root) 290 if(cur == root)
289 return NULL; 291 return NULL;
290 cur = last->parent; 292 cur = last->parent;
443 445
444 shape = O_ALLOC(shape_t); 446 shape = O_ALLOC(shape_t);
445 memset(shape, 0, sizeof(shape_t)); 447 memset(shape, 0, sizeof(shape_t));
446 MB_OBJ_INIT(&shape->obj, MBO_PATH); 448 MB_OBJ_INIT(&shape->obj, MBO_PATH);
447 STAILQ_INS(rdman->all_shapes, shape_t, all_next, shape); 449 STAILQ_INS(rdman->all_shapes, shape_t, all_next, shape);
448 450
449 return shape; 451 return shape;
450 } 452 }
451 453
452 static 454 static
453 void rdman_shape_free(redraw_man_t *rdman, shape_t *shape) { 455 void rdman_shape_free(redraw_man_t *rdman, shape_t *shape) {
480 shape_t *shape1, *shape2; 482 shape_t *shape1, *shape2;
481 co_aix x1, y1, x2, y2; 483 co_aix x1, y1, x2, y2;
482 int i, j; 484 int i, j;
483 485
484 cr = surf->cr; 486 cr = surf->cr;
485 487
486 STAILQ_FOR_EACH(cr->drawed, shape_t, sibling, shape1) { 488 STAILQ_FOR_EACH(cr->drawed, shape_t, sibling, shape1) {
487 for(i = 0; i < shape1->num_points; i++) { 489 for(i = 0; i < shape1->num_points; i++) {
488 x1 = shape1->points[i][0]; 490 x1 = shape1->points[i][0];
489 y1 = shape1->points[i][1]; 491 y1 = shape1->points[i][1];
490 STAILQ_FOR_EACH(cr->clip_pathes, shape_t, sibling, shape2) { 492 STAILQ_FOR_EACH(cr->clip_pathes, shape_t, sibling, shape2) {
508 510
509 static int _collect_shapes_at_point(redraw_man_t *rdman, 511 static int _collect_shapes_at_point(redraw_man_t *rdman,
510 co_aix x, co_aix y) { 512 co_aix x, co_aix y) {
511 shape_t *shape; 513 shape_t *shape;
512 int r; 514 int r;
513 515
514 r = rdman_force_clean(rdman); 516 r = rdman_force_clean(rdman);
515 if(r != OK) 517 if(r != OK)
516 return ERR; 518 return ERR;
517 519
518 rdman_clear_shape_gl(rdman); 520 rdman_clear_shape_gl(rdman);
674 int w, h; 676 int w, h;
675 677
676 rdman_surface = mbe_get_target(rdman_get_cr(rdman)); 678 rdman_surface = mbe_get_target(rdman_get_cr(rdman));
677 w = mbe_image_surface_get_width(rdman_surface); 679 w = mbe_image_surface_get_width(rdman_surface);
678 h = mbe_image_surface_get_height(rdman_surface); 680 h = mbe_image_surface_get_height(rdman_surface);
679 681
680 surface = mbe_image_surface_create(MB_IFMT_A1, w, h); 682 surface = mbe_image_surface_create(MB_IFMT_A1, w, h);
681 if(surface == NULL) 683 if(surface == NULL)
682 return NULL; 684 return NULL;
683 685
684 cr = mbe_create(surface); 686 cr = mbe_create(surface);
685 if(cr == NULL) 687 if(cr == NULL)
686 mbe_surface_destroy(surface); 688 mbe_surface_destroy(surface);
687 689
688 return cr; 690 return cr;
689 } 691 }
690 692
691 static 693 static
692 void _release_mbe_for_testing(mbe_t *cr) { 694 void _release_mbe_for_testing(mbe_t *cr) {
695 697
696 static 698 static
697 void _draw_to_mask(shape_t *shape, mbe_t *cr) { 699 void _draw_to_mask(shape_t *shape, mbe_t *cr) {
698 if(sh_get_flags(shape, GEF_OV_DRAW)) 700 if(sh_get_flags(shape, GEF_OV_DRAW))
699 return; 701 return;
700 702
701 draw_shape_path(shape, cr); 703 draw_shape_path(shape, cr);
702 mbe_clip(cr); 704 mbe_clip(cr);
703 705
704 sh_set_flags(shape, GEF_OV_DRAW); 706 sh_set_flags(shape, GEF_OV_DRAW);
705 } 707 }
706 708
707 static 709 static
708 int _fill_and_check(shape_t *shape, mbe_t *cr) { 710 int _fill_and_check(shape_t *shape, mbe_t *cr) {
743 area_t *area, *candi_area; 745 area_t *area, *candi_area;
744 coord_t *coord, *candi_coord, *root; 746 coord_t *coord, *candi_coord, *root;
745 shape_t *shape, *candi_shape; 747 shape_t *shape, *candi_shape;
746 int obj_is_shape; 748 int obj_is_shape;
747 int r; 749 int r;
748 750
749 obj_is_shape = IS_MBO_SHAPES(obj); 751 obj_is_shape = IS_MBO_SHAPES(obj);
750 752
751 if(obj_is_shape) { 753 if(obj_is_shape) {
752 shape = (shape_t *)obj; 754 shape = (shape_t *)obj;
753 area = sh_get_area(shape); 755 area = sh_get_area(shape);
754 } else { 756 } else {
755 coord = (coord_t *)obj; 757 coord = (coord_t *)obj;
756 area = coord_get_area(coord); 758 area = coord_get_area(coord);
757 shape = NULL; 759 shape = NULL;
758 } 760 }
759 761
760 if(IS_MBO_SHAPES(others_root)) { 762 if(IS_MBO_SHAPES(others_root)) {
761 candi_shape = (shape_t *)others_root; 763 candi_shape = (shape_t *)others_root;
762 candi_area = sh_get_area(candi_shape); 764 candi_area = sh_get_area(candi_shape);
763 765
764 r = areas_are_overlay(area, candi_area); 766 r = areas_are_overlay(area, candi_area);
765 if(!r) 767 if(!r)
766 return FALSE; 768 return FALSE;
767 769
768 if(!obj_is_shape) 770 if(!obj_is_shape)
769 return TRUE; 771 return TRUE;
770 772
771 _draw_to_mask(candi_shape, cr); 773 _draw_to_mask(candi_shape, cr);
772 r = _fill_and_check(shape, cr); 774 r = _fill_and_check(shape, cr);
773 775
774 return r; 776 return r;
775 } 777 }
776 778
777 ASSERT(IS_MBO_COORD(others_root)); 779 ASSERT(IS_MBO_COORD(others_root));
778 780
779 root = (coord_t *)others_root; 781 root = (coord_t *)others_root;
780 FOR_COORDS_PREORDER(root, candi_coord) { 782 FOR_COORDS_PREORDER(root, candi_coord) {
781 candi_area = coord_get_area(candi_coord); 783 candi_area = coord_get_area(candi_coord);
782 r = areas_are_overlay(area, candi_area); 784 r = areas_are_overlay(area, candi_area);
783 if(!r) { 785 if(!r) {
784 preorder_coord_skip_subtree(candi_coord); 786 preorder_coord_skip_subtree(candi_coord);
785 continue; 787 continue;
786 } 788 }
787 789
788 FOR_COORD_SHAPES(candi_coord, candi_shape) { 790 FOR_COORD_SHAPES(candi_coord, candi_shape) {
789 candi_area = sh_get_area(candi_shape); 791 candi_area = sh_get_area(candi_shape);
790 r = areas_are_overlay(area, candi_area); 792 r = areas_are_overlay(area, candi_area);
791 if(!r) 793 if(!r)
792 continue; 794 continue;
793 795
794 if(!obj_is_shape) 796 if(!obj_is_shape)
795 return TRUE; 797 return TRUE;
796 798
797 _draw_to_mask(candi_shape, cr); 799 _draw_to_mask(candi_shape, cr);
798 r = _fill_and_check(shape, cr); 800 r = _fill_and_check(shape, cr);
799 if(r) 801 if(r)
800 return TRUE; 802 return TRUE;
801 } 803 }
802 } 804 }
803 805
804 return FALSE; 806 return FALSE;
805 } 807 }
806 808
807 static 809 static
808 void _clear_ov_draw(mb_obj_t *obj) { 810 void _clear_ov_draw(mb_obj_t *obj) {
841 if(IS_MBO_SHAPES(obj1)) { 843 if(IS_MBO_SHAPES(obj1)) {
842 shape = (shape_t *)obj1; 844 shape = (shape_t *)obj1;
843 r = _is_obj_objs_overlay(obj1, obj2, cr); 845 r = _is_obj_objs_overlay(obj1, obj2, cr);
844 goto out; 846 goto out;
845 } 847 }
846 848
847 root = (coord_t *)obj1; 849 root = (coord_t *)obj1;
848 FOR_COORDS_PREORDER(root, coord) { 850 FOR_COORDS_PREORDER(root, coord) {
849 area = coord_get_area(coord); 851 area = coord_get_area(coord);
850 r = _is_obj_objs_overlay((mb_obj_t *)coord, obj2, cr); 852 r = _is_obj_objs_overlay((mb_obj_t *)coord, obj2, cr);
851 if(!r) { 853 if(!r) {
858 if(r) 860 if(r)
859 goto out; 861 goto out;
860 } 862 }
861 } 863 }
862 r = FALSE; 864 r = FALSE;
863 865
864 out: 866 out:
865 _clear_ov_draw(obj2); /* marked by _is_obj_objs_overlay() */ 867 _clear_ov_draw(obj2); /* marked by _is_obj_objs_overlay() */
866 _release_mbe_for_testing(cr); 868 _release_mbe_for_testing(cr);
867 return r; 869 return r;
868 } 870 }
879 881
880 surf = mbe_image_surface_create(MB_IFMT_A1, 100, 100); 882 surf = mbe_image_surface_create(MB_IFMT_A1, 100, 100);
881 cr = mbe_create(surf); 883 cr = mbe_create(surf);
882 backend = mbe_create(surf); 884 backend = mbe_create(surf);
883 rdman = redraw_man_new(cr, backend); 885 rdman = redraw_man_new(cr, backend);
884 886
885 return rdman; 887 return rdman;
886 } 888 }
887 889
888 static 890 static
889 void _free_fake_rdman(redraw_man_t *rdman) { 891 void _free_fake_rdman(redraw_man_t *rdman) {
960 rdman_add_shape(rdman, shape3, coord2); 962 rdman_add_shape(rdman, shape3, coord2);
961 963
962 shape_add_point(shape1, 3, 2); 964 shape_add_point(shape1, 3, 2);
963 shape_add_point(shape2, 5, 5); 965 shape_add_point(shape2, 5, 5);
964 shape_add_point(shape3, 4, 3); 966 shape_add_point(shape3, 4, 3);
965 967
966 surf = mbe_image_surface_create(MB_IFMT_A1, 100, 100); 968 surf = mbe_image_surface_create(MB_IFMT_A1, 100, 100);
967 cr = mbe_create(surf); 969 cr = mbe_create(surf);
968 r = _is_obj_objs_overlay((mb_obj_t *)coord1, (mb_obj_t *)coord2, cr); 970 r = _is_obj_objs_overlay((mb_obj_t *)coord1, (mb_obj_t *)coord2, cr);
969 CU_ASSERT(!r); 971 CU_ASSERT(!r);
970 mbe_destroy(cr); 972 mbe_destroy(cr);
1008 r = _is_obj_objs_overlay((mb_obj_t *)coord1, (mb_obj_t *)shape3, cr); 1010 r = _is_obj_objs_overlay((mb_obj_t *)coord1, (mb_obj_t *)shape3, cr);
1009 CU_ASSERT(!r); 1011 CU_ASSERT(!r);
1010 mbe_destroy(cr); 1012 mbe_destroy(cr);
1011 mbe_surface_destroy(surf); 1013 mbe_surface_destroy(surf);
1012 sh_clear_flags(shape3, GEF_OV_DRAW); 1014 sh_clear_flags(shape3, GEF_OV_DRAW);
1013 1015
1014 shape_add_point(shape1, 5, 5); 1016 shape_add_point(shape1, 5, 5);
1015 1017
1016 surf = mbe_image_surface_create(MB_IFMT_A1, 100, 100); 1018 surf = mbe_image_surface_create(MB_IFMT_A1, 100, 100);
1017 cr = mbe_create(surf); 1019 cr = mbe_create(surf);
1018 r = _is_obj_objs_overlay((mb_obj_t *)coord1, (mb_obj_t *)coord2, cr); 1020 r = _is_obj_objs_overlay((mb_obj_t *)coord1, (mb_obj_t *)coord2, cr);
1095 shape_add_point(shape2, 5, 5); 1097 shape_add_point(shape2, 5, 5);
1096 shape_add_point(shape3, 4, 3); 1098 shape_add_point(shape3, 4, 3);
1097 1099
1098 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)coord2); 1100 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)coord2);
1099 CU_ASSERT(!r); 1101 CU_ASSERT(!r);
1100 1102
1101 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)coord2); 1103 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)coord2);
1102 CU_ASSERT(!r); 1104 CU_ASSERT(!r);
1103 1105
1104 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape2); 1106 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape2);
1105 CU_ASSERT(!r); 1107 CU_ASSERT(!r);
1106 1108
1107 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape2); 1109 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape2);
1108 CU_ASSERT(!r); 1110 CU_ASSERT(!r);
1109 1111
1110 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape3); 1112 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape3);
1111 CU_ASSERT(!r); 1113 CU_ASSERT(!r);
1112 1114
1113 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape3); 1115 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape3);
1114 CU_ASSERT(!r); 1116 CU_ASSERT(!r);
1115 1117
1116 shape_add_point(shape1, 5, 5); 1118 shape_add_point(shape1, 5, 5);
1117 1119
1118 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)coord2); 1120 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)coord2);
1119 CU_ASSERT(r); 1121 CU_ASSERT(r);
1120 1122
1121 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)coord2); 1123 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)coord2);
1122 CU_ASSERT(r); 1124 CU_ASSERT(r);
1123 1125
1124 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape2); 1126 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape2);
1125 CU_ASSERT(r); 1127 CU_ASSERT(r);
1126 1128
1127 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape2); 1129 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape2);
1128 CU_ASSERT(r); 1130 CU_ASSERT(r);
1129 1131
1130 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape3); 1132 r = mb_objs_are_overlay(rdman, (mb_obj_t *)shape1, (mb_obj_t *)shape3);
1131 CU_ASSERT(!r); 1133 CU_ASSERT(!r);
1132 1134
1133 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape3); 1135 r = mb_objs_are_overlay(rdman, (mb_obj_t *)coord1, (mb_obj_t *)shape3);
1134 CU_ASSERT(!r); 1136 CU_ASSERT(!r);
1135 1137
1136 _free_fake_rdman(rdman); 1138 _free_fake_rdman(rdman);
1137 } 1139 }