Mercurial > MadButterfly
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 } |