comparison ios/dw.m @ 2729:f9df10c66353

iOS: Pass thread specific colors through thread safety macros. This allows colors to be correct when rendering on different threads. This was apparent in the new print code, which ran on a different thread.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 12 Dec 2021 12:08:34 +0000
parents 7a15401e73f4
children 74b69da35e91
comparison
equal deleted inserted replaced
2728:850da6b24830 2729:f9df10c66353
37 #define DW_FUNCTION_DEFINITION(func, rettype, ...) void _##func(NSPointerArray *_args); \ 37 #define DW_FUNCTION_DEFINITION(func, rettype, ...) void _##func(NSPointerArray *_args); \
38 rettype API func(__VA_ARGS__) { \ 38 rettype API func(__VA_ARGS__) { \
39 DW_LOCAL_POOL_IN; \ 39 DW_LOCAL_POOL_IN; \
40 NSPointerArray *_args = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsOpaqueMemory]; \ 40 NSPointerArray *_args = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsOpaqueMemory]; \
41 [_args addPointer:(void *)_##func]; 41 [_args addPointer:(void *)_##func];
42 #define DW_FUNCTION_ADD_PARAM1(param1) [_args addPointer:(void *)&param1]; 42 #define DW_FUNCTION_ADD_PARAM1(param1) [_args addPointer:(void *)&param1]; \
43 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
44 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
43 #define DW_FUNCTION_ADD_PARAM2(param1, param2) [_args addPointer:(void *)&param1]; \ 45 #define DW_FUNCTION_ADD_PARAM2(param1, param2) [_args addPointer:(void *)&param1]; \
44 [_args addPointer:(void *)&param2]; 46 [_args addPointer:(void *)&param2]; \
47 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
48 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
45 #define DW_FUNCTION_ADD_PARAM3(param1, param2, param3) [_args addPointer:(void *)&param1]; \ 49 #define DW_FUNCTION_ADD_PARAM3(param1, param2, param3) [_args addPointer:(void *)&param1]; \
46 [_args addPointer:(void *)&param2]; \ 50 [_args addPointer:(void *)&param2]; \
47 [_args addPointer:(void *)&param3]; 51 [_args addPointer:(void *)&param3]; \
52 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
53 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
48 #define DW_FUNCTION_ADD_PARAM4(param1, param2, param3, param4) [_args addPointer:(void *)&param1]; \ 54 #define DW_FUNCTION_ADD_PARAM4(param1, param2, param3, param4) [_args addPointer:(void *)&param1]; \
49 [_args addPointer:(void *)&param2]; \ 55 [_args addPointer:(void *)&param2]; \
50 [_args addPointer:(void *)&param3]; \ 56 [_args addPointer:(void *)&param3]; \
51 [_args addPointer:(void *)&param4]; 57 [_args addPointer:(void *)&param4]; \
58 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
59 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
52 #define DW_FUNCTION_ADD_PARAM5(param1, param2, param3, param4, param5) [_args addPointer:(void *)&param1]; \ 60 #define DW_FUNCTION_ADD_PARAM5(param1, param2, param3, param4, param5) [_args addPointer:(void *)&param1]; \
53 [_args addPointer:(void *)&param2]; \ 61 [_args addPointer:(void *)&param2]; \
54 [_args addPointer:(void *)&param3]; \ 62 [_args addPointer:(void *)&param3]; \
55 [_args addPointer:(void *)&param4]; \ 63 [_args addPointer:(void *)&param4]; \
56 [_args addPointer:(void *)&param5]; 64 [_args addPointer:(void *)&param5]; \
65 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
66 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
57 #define DW_FUNCTION_ADD_PARAM6(param1, param2, param3, param4, param5, param6) \ 67 #define DW_FUNCTION_ADD_PARAM6(param1, param2, param3, param4, param5, param6) \
58 [_args addPointer:(void *)&param1]; \ 68 [_args addPointer:(void *)&param1]; \
59 [_args addPointer:(void *)&param2]; \ 69 [_args addPointer:(void *)&param2]; \
60 [_args addPointer:(void *)&param3]; \ 70 [_args addPointer:(void *)&param3]; \
61 [_args addPointer:(void *)&param4]; \ 71 [_args addPointer:(void *)&param4]; \
62 [_args addPointer:(void *)&param5]; \ 72 [_args addPointer:(void *)&param5]; \
63 [_args addPointer:(void *)&param6]; 73 [_args addPointer:(void *)&param6]; \
74 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
75 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
64 #define DW_FUNCTION_ADD_PARAM7(param1, param2, param3, param4, param5, param6, param7) \ 76 #define DW_FUNCTION_ADD_PARAM7(param1, param2, param3, param4, param5, param6, param7) \
65 [_args addPointer:(void *)&param1]; \ 77 [_args addPointer:(void *)&param1]; \
66 [_args addPointer:(void *)&param2]; \ 78 [_args addPointer:(void *)&param2]; \
67 [_args addPointer:(void *)&param3]; \ 79 [_args addPointer:(void *)&param3]; \
68 [_args addPointer:(void *)&param4]; \ 80 [_args addPointer:(void *)&param4]; \
69 [_args addPointer:(void *)&param5]; \ 81 [_args addPointer:(void *)&param5]; \
70 [_args addPointer:(void *)&param6]; \ 82 [_args addPointer:(void *)&param6]; \
71 [_args addPointer:(void *)&param7]; 83 [_args addPointer:(void *)&param7]; \
84 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
85 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
72 #define DW_FUNCTION_ADD_PARAM8(param1, param2, param3, param4, param5, param6, param7, param8) \ 86 #define DW_FUNCTION_ADD_PARAM8(param1, param2, param3, param4, param5, param6, param7, param8) \
73 [_args addPointer:(void *)&param1]; \ 87 [_args addPointer:(void *)&param1]; \
74 [_args addPointer:(void *)&param2]; \ 88 [_args addPointer:(void *)&param2]; \
75 [_args addPointer:(void *)&param3]; \ 89 [_args addPointer:(void *)&param3]; \
76 [_args addPointer:(void *)&param4]; \ 90 [_args addPointer:(void *)&param4]; \
77 [_args addPointer:(void *)&param5]; \ 91 [_args addPointer:(void *)&param5]; \
78 [_args addPointer:(void *)&param6]; \ 92 [_args addPointer:(void *)&param6]; \
79 [_args addPointer:(void *)&param7]; \ 93 [_args addPointer:(void *)&param7]; \
80 [_args addPointer:(void *)&param8]; 94 [_args addPointer:(void *)&param8]; \
95 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
96 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
81 #define DW_FUNCTION_ADD_PARAM9(param1, param2, param3, param4, param5, param6, param7, param8, param9) \ 97 #define DW_FUNCTION_ADD_PARAM9(param1, param2, param3, param4, param5, param6, param7, param8, param9) \
82 [_args addPointer:(void *)&param1]; \ 98 [_args addPointer:(void *)&param1]; \
83 [_args addPointer:(void *)&param2]; \ 99 [_args addPointer:(void *)&param2]; \
84 [_args addPointer:(void *)&param3]; \ 100 [_args addPointer:(void *)&param3]; \
85 [_args addPointer:(void *)&param4]; \ 101 [_args addPointer:(void *)&param4]; \
86 [_args addPointer:(void *)&param5]; \ 102 [_args addPointer:(void *)&param5]; \
87 [_args addPointer:(void *)&param6]; \ 103 [_args addPointer:(void *)&param6]; \
88 [_args addPointer:(void *)&param7]; \ 104 [_args addPointer:(void *)&param7]; \
89 [_args addPointer:(void *)&param8]; \ 105 [_args addPointer:(void *)&param8]; \
90 [_args addPointer:(void *)&param9]; 106 [_args addPointer:(void *)&param9]; \
91 #define DW_FUNCTION_RESTORE_PARAM1(param1, vartype1) vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); 107 [_args addPointer:(void *)pthread_getspecific(_dw_fg_color_key)]; \
108 [_args addPointer:(void *)pthread_getspecific(_dw_bg_color_key)];
109 #define DW_FUNCTION_RESTORE_PARAM1(param1, vartype1) \
110 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
111 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:2]; \
112 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:3];
92 #define DW_FUNCTION_RESTORE_PARAM2(param1, vartype1, param2, vartype2) \ 113 #define DW_FUNCTION_RESTORE_PARAM2(param1, vartype1, param2, vartype2) \
93 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 114 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
94 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); 115 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
116 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:3]; \
117 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:4];
95 #define DW_FUNCTION_RESTORE_PARAM3(param1, vartype1, param2, vartype2, param3, vartype3) \ 118 #define DW_FUNCTION_RESTORE_PARAM3(param1, vartype1, param2, vartype2, param3, vartype3) \
96 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 119 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
97 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 120 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
98 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); 121 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
122 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:4]; \
123 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:5];
99 #define DW_FUNCTION_RESTORE_PARAM4(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4) \ 124 #define DW_FUNCTION_RESTORE_PARAM4(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4) \
100 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 125 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
101 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 126 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
102 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \ 127 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
103 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); 128 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \
129 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:5]; \
130 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:6];
104 #define DW_FUNCTION_RESTORE_PARAM5(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5) \ 131 #define DW_FUNCTION_RESTORE_PARAM5(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5) \
105 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 132 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
106 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 133 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
107 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \ 134 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
108 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \ 135 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \
109 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); 136 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \
137 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:6]; \
138 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:7];
110 #define DW_FUNCTION_RESTORE_PARAM6(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6) \ 139 #define DW_FUNCTION_RESTORE_PARAM6(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6) \
111 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 140 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
112 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 141 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
113 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \ 142 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
114 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \ 143 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \
115 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \ 144 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \
116 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); 145 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \
146 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:7]; \
147 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:8];
117 #define DW_FUNCTION_RESTORE_PARAM7(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6, param7, vartype7) \ 148 #define DW_FUNCTION_RESTORE_PARAM7(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6, param7, vartype7) \
118 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 149 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
119 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 150 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
120 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \ 151 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
121 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \ 152 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \
122 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \ 153 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \
123 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \ 154 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \
124 vartype7 param7 = *((vartype7 *)[_args pointerAtIndex:7]); 155 vartype7 param7 = *((vartype7 *)[_args pointerAtIndex:7]); \
156 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:8]; \
157 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:9];
125 #define DW_FUNCTION_RESTORE_PARAM8(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6, param7, vartype7, param8, vartype8) \ 158 #define DW_FUNCTION_RESTORE_PARAM8(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6, param7, vartype7, param8, vartype8) \
126 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 159 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
127 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 160 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
128 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \ 161 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
129 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \ 162 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \
130 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \ 163 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \
131 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \ 164 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \
132 vartype7 param7 = *((vartype7 *)[_args pointerAtIndex:7]); \ 165 vartype7 param7 = *((vartype7 *)[_args pointerAtIndex:7]); \
133 vartype8 param8 = *((vartype8 *)[_args pointerAtIndex:8]); 166 vartype8 param8 = *((vartype8 *)[_args pointerAtIndex:8]); \
167 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:9]; \
168 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:10];
134 #define DW_FUNCTION_RESTORE_PARAM9(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6, param7, vartype7, param8, vartype8, param9, vartype9) \ 169 #define DW_FUNCTION_RESTORE_PARAM9(param1, vartype1, param2, vartype2, param3, vartype3, param4, vartype4, param5, vartype5, param6, vartype6, param7, vartype7, param8, vartype8, param9, vartype9) \
135 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \ 170 vartype1 param1 = *((vartype1 *)[_args pointerAtIndex:1]); \
136 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \ 171 vartype2 param2 = *((vartype2 *)[_args pointerAtIndex:2]); \
137 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \ 172 vartype3 param3 = *((vartype3 *)[_args pointerAtIndex:3]); \
138 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \ 173 vartype4 param4 = *((vartype4 *)[_args pointerAtIndex:4]); \
139 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \ 174 vartype5 param5 = *((vartype5 *)[_args pointerAtIndex:5]); \
140 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \ 175 vartype6 param6 = *((vartype6 *)[_args pointerAtIndex:6]); \
141 vartype7 param7 = *((vartype7 *)[_args pointerAtIndex:7]); \ 176 vartype7 param7 = *((vartype7 *)[_args pointerAtIndex:7]); \
142 vartype8 param8 = *((vartype8 *)[_args pointerAtIndex:8]); \ 177 vartype8 param8 = *((vartype8 *)[_args pointerAtIndex:8]); \
143 vartype9 param9 = *((vartype9 *)[_args pointerAtIndex:9]); 178 vartype9 param9 = *((vartype9 *)[_args pointerAtIndex:9]); \
179 UIColor *__attribute__((__unused__))_dw_fg_color = (UIColor *)[_args pointerAtIndex:10]; \
180 UIColor *__attribute__((__unused__))_dw_bg_color = (UIColor *)[_args pointerAtIndex:11];
144 #define DW_FUNCTION_END } 181 #define DW_FUNCTION_END }
145 #define DW_FUNCTION_NO_RETURN(func) [DWObj safeCall:@selector(callBack:) withObject:_args]; \ 182 #define DW_FUNCTION_NO_RETURN(func) [DWObj safeCall:@selector(callBack:) withObject:_args]; \
146 [_args release]; \ 183 [_args release]; \
147 DW_LOCAL_POOL_OUT; } \ 184 DW_LOCAL_POOL_OUT; } \
148 void _##func(NSPointerArray *_args) { 185 void _##func(NSPointerArray *_args) {
964 -(void)setPrint:(HPRINT)input { print = input; } 1001 -(void)setPrint:(HPRINT)input { print = input; }
965 -(void)drawContentForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)contentRect 1002 -(void)drawContentForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)contentRect
966 { 1003 {
967 HPIXMAP pm = dw_pixmap_new(nil, contentRect.size.width, contentRect.size.height, 32); 1004 HPIXMAP pm = dw_pixmap_new(nil, contentRect.size.width, contentRect.size.height, 32);
968 DWImage *image = pm->image; 1005 DWImage *image = pm->image;
1006 CGBlendMode op = kCGBlendModeNormal;
1007
969 drawfunc(print, pm, (int)pageIndex, drawdata); 1008 drawfunc(print, pm, (int)pageIndex, drawdata);
970 [[image image] drawInRect:contentRect]; 1009 [[image image] drawInRect:contentRect blendMode:op alpha:1.0];
971 dw_pixmap_destroy(pm); 1010 dw_pixmap_destroy(pm);
972 } 1011 }
973 -(NSInteger)numberOfPages { return (NSInteger)pages; } 1012 -(NSInteger)numberOfPages { return (NSInteger)pages; }
974 @end 1013 @end
975 1014
5725 5764
5726 if(bi) 5765 if(bi)
5727 { 5766 {
5728 UIBezierPath* aPath = [UIBezierPath bezierPath]; 5767 UIBezierPath* aPath = [UIBezierPath bezierPath];
5729 [aPath setLineWidth: 0.5]; 5768 [aPath setLineWidth: 0.5];
5730 UIColor *color = pthread_getspecific(_dw_fg_color_key); 5769 [_dw_fg_color set];
5731 [color set];
5732 5770
5733 [aPath moveToPoint:CGPointMake(x, y)]; 5771 [aPath moveToPoint:CGPointMake(x, y)];
5734 [aPath stroke]; 5772 [aPath stroke];
5735 } 5773 }
5736 if(context) 5774 if(context)
5760 UIGraphicsPushContext(context); 5798 UIGraphicsPushContext(context);
5761 5799
5762 if(bi) 5800 if(bi)
5763 { 5801 {
5764 UIBezierPath* aPath = [UIBezierPath bezierPath]; 5802 UIBezierPath* aPath = [UIBezierPath bezierPath];
5765 UIColor *color = pthread_getspecific(_dw_fg_color_key); 5803 [_dw_fg_color set];
5766 [color set];
5767 5804
5768 [aPath moveToPoint:CGPointMake(x1 + 0.5, y1 + 0.5)]; 5805 [aPath moveToPoint:CGPointMake(x1 + 0.5, y1 + 0.5)];
5769 [aPath addLineToPoint:CGPointMake(x2 + 0.5, y2 + 0.5)]; 5806 [aPath addLineToPoint:CGPointMake(x2 + 0.5, y2 + 0.5)];
5770 [aPath stroke]; 5807 [aPath stroke];
5771 } 5808 }
5815 CGContextRef context = _dw_draw_context(bi, NO); 5852 CGContextRef context = _dw_draw_context(bi, NO);
5816 5853
5817 if(context) 5854 if(context)
5818 UIGraphicsPushContext(context); 5855 UIGraphicsPushContext(context);
5819 5856
5820 UIColor *fgcolor = pthread_getspecific(_dw_fg_color_key); 5857 NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:_dw_fg_color, NSForegroundColorAttributeName, nil];
5821 UIColor *bgcolor = pthread_getspecific(_dw_bg_color_key); 5858 if(_dw_bg_color)
5822 NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:fgcolor, NSForegroundColorAttributeName, nil]; 5859 [dict setValue:_dw_bg_color forKey:NSBackgroundColorAttributeName];
5823 if(bgcolor)
5824 [dict setValue:bgcolor forKey:NSBackgroundColorAttributeName];
5825 if(font) 5860 if(font)
5826 [dict setValue:font forKey:NSFontAttributeName]; 5861 [dict setValue:font forKey:NSFontAttributeName];
5827 [nstr drawAtPoint:CGPointMake(x, y) withAttributes:dict]; 5862 [nstr drawAtPoint:CGPointMake(x, y) withAttributes:dict];
5828 [dict release]; 5863 [dict release];
5829 if(context) 5864 if(context)
5905 UIGraphicsPushContext(context); 5940 UIGraphicsPushContext(context);
5906 5941
5907 if(bi) 5942 if(bi)
5908 { 5943 {
5909 UIBezierPath* aPath = [UIBezierPath bezierPath]; 5944 UIBezierPath* aPath = [UIBezierPath bezierPath];
5910 UIColor *color = pthread_getspecific(_dw_fg_color_key);
5911 int z; 5945 int z;
5912 5946
5913 [color set]; 5947 [_dw_fg_color set];
5914 5948
5915 [aPath moveToPoint:CGPointMake(*x + 0.5, *y + 0.5)]; 5949 [aPath moveToPoint:CGPointMake(*x + 0.5, *y + 0.5)];
5916 for(z=1;z<npoints;z++) 5950 for(z=1;z<npoints;z++)
5917 { 5951 {
5918 [aPath addLineToPoint:CGPointMake(x[z] + 0.5, y[z] + 0.5)]; 5952 [aPath addLineToPoint:CGPointMake(x[z] + 0.5, y[z] + 0.5)];
5950 if(context) 5984 if(context)
5951 UIGraphicsPushContext(context); 5985 UIGraphicsPushContext(context);
5952 5986
5953 if(bi) 5987 if(bi)
5954 { 5988 {
5955 UIColor *color = pthread_getspecific(_dw_fg_color_key);
5956 UIBezierPath *bp = [UIBezierPath bezierPathWithRect:CGRectMake(x, y, width, height)];; 5989 UIBezierPath *bp = [UIBezierPath bezierPathWithRect:CGRectMake(x, y, width, height)];;
5957 5990
5958 [color set]; 5991 [_dw_fg_color set];
5959 5992
5960 if(flags & DW_DRAW_FILL) 5993 if(flags & DW_DRAW_FILL)
5961 [bp fill]; 5994 [bp fill];
5962 else 5995 else
5963 [bp stroke]; 5996 [bp stroke];
5993 UIGraphicsPushContext(context); 6026 UIGraphicsPushContext(context);
5994 6027
5995 if(bi) 6028 if(bi)
5996 { 6029 {
5997 UIBezierPath* aPath; 6030 UIBezierPath* aPath;
5998 UIColor *color = pthread_getspecific(_dw_fg_color_key); 6031
5999 [color set]; 6032 [_dw_fg_color set];
6000 6033
6001 /* Special case of a full circle/oval */ 6034 /* Special case of a full circle/oval */
6002 if(flags & DW_DRAW_FULL) 6035 if(flags & DW_DRAW_FULL)
6003 aPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x1, y1, x2 - x1, y2 - y1)]; 6036 aPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x1, y1, x2 - x1, y2 - y1)];
6004 else 6037 else
10950 NSMutableArray *pa = [[[NSMutableArray alloc] initWithObjects:pi, renderer, nil] retain]; 10983 NSMutableArray *pa = [[[NSMutableArray alloc] initWithObjects:pi, renderer, nil] retain];
10951 10984
10952 if(!jobname) 10985 if(!jobname)
10953 jobname = "Dynamic Windows Print Job"; 10986 jobname = "Dynamic Windows Print Job";
10954 10987
10955
10956 [pi setOutputType:UIPrintInfoOutputGeneral]; 10988 [pi setOutputType:UIPrintInfoOutputGeneral];
10957 [pi setJobName:[NSString stringWithUTF8String:jobname]]; 10989 [pi setJobName:[NSString stringWithUTF8String:jobname]];
10958 [pi setOrientation:UIPrintInfoOrientationPortrait]; 10990 [pi setOrientation:UIPrintInfoOrientationPortrait];
10959 [renderer setDrawFunc:drawfunc]; 10991 [renderer setDrawFunc:drawfunc];
10960 [renderer setDrawData:drawdata]; 10992 [renderer setDrawData:drawdata];