Mercurial > dwindows
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 *)¶m1]; | 42 #define DW_FUNCTION_ADD_PARAM1(param1) [_args addPointer:(void *)¶m1]; \ |
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 *)¶m1]; \ | 45 #define DW_FUNCTION_ADD_PARAM2(param1, param2) [_args addPointer:(void *)¶m1]; \ |
44 [_args addPointer:(void *)¶m2]; | 46 [_args addPointer:(void *)¶m2]; \ |
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 *)¶m1]; \ | 49 #define DW_FUNCTION_ADD_PARAM3(param1, param2, param3) [_args addPointer:(void *)¶m1]; \ |
46 [_args addPointer:(void *)¶m2]; \ | 50 [_args addPointer:(void *)¶m2]; \ |
47 [_args addPointer:(void *)¶m3]; | 51 [_args addPointer:(void *)¶m3]; \ |
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 *)¶m1]; \ | 54 #define DW_FUNCTION_ADD_PARAM4(param1, param2, param3, param4) [_args addPointer:(void *)¶m1]; \ |
49 [_args addPointer:(void *)¶m2]; \ | 55 [_args addPointer:(void *)¶m2]; \ |
50 [_args addPointer:(void *)¶m3]; \ | 56 [_args addPointer:(void *)¶m3]; \ |
51 [_args addPointer:(void *)¶m4]; | 57 [_args addPointer:(void *)¶m4]; \ |
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 *)¶m1]; \ | 60 #define DW_FUNCTION_ADD_PARAM5(param1, param2, param3, param4, param5) [_args addPointer:(void *)¶m1]; \ |
53 [_args addPointer:(void *)¶m2]; \ | 61 [_args addPointer:(void *)¶m2]; \ |
54 [_args addPointer:(void *)¶m3]; \ | 62 [_args addPointer:(void *)¶m3]; \ |
55 [_args addPointer:(void *)¶m4]; \ | 63 [_args addPointer:(void *)¶m4]; \ |
56 [_args addPointer:(void *)¶m5]; | 64 [_args addPointer:(void *)¶m5]; \ |
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 *)¶m1]; \ | 68 [_args addPointer:(void *)¶m1]; \ |
59 [_args addPointer:(void *)¶m2]; \ | 69 [_args addPointer:(void *)¶m2]; \ |
60 [_args addPointer:(void *)¶m3]; \ | 70 [_args addPointer:(void *)¶m3]; \ |
61 [_args addPointer:(void *)¶m4]; \ | 71 [_args addPointer:(void *)¶m4]; \ |
62 [_args addPointer:(void *)¶m5]; \ | 72 [_args addPointer:(void *)¶m5]; \ |
63 [_args addPointer:(void *)¶m6]; | 73 [_args addPointer:(void *)¶m6]; \ |
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 *)¶m1]; \ | 77 [_args addPointer:(void *)¶m1]; \ |
66 [_args addPointer:(void *)¶m2]; \ | 78 [_args addPointer:(void *)¶m2]; \ |
67 [_args addPointer:(void *)¶m3]; \ | 79 [_args addPointer:(void *)¶m3]; \ |
68 [_args addPointer:(void *)¶m4]; \ | 80 [_args addPointer:(void *)¶m4]; \ |
69 [_args addPointer:(void *)¶m5]; \ | 81 [_args addPointer:(void *)¶m5]; \ |
70 [_args addPointer:(void *)¶m6]; \ | 82 [_args addPointer:(void *)¶m6]; \ |
71 [_args addPointer:(void *)¶m7]; | 83 [_args addPointer:(void *)¶m7]; \ |
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 *)¶m1]; \ | 87 [_args addPointer:(void *)¶m1]; \ |
74 [_args addPointer:(void *)¶m2]; \ | 88 [_args addPointer:(void *)¶m2]; \ |
75 [_args addPointer:(void *)¶m3]; \ | 89 [_args addPointer:(void *)¶m3]; \ |
76 [_args addPointer:(void *)¶m4]; \ | 90 [_args addPointer:(void *)¶m4]; \ |
77 [_args addPointer:(void *)¶m5]; \ | 91 [_args addPointer:(void *)¶m5]; \ |
78 [_args addPointer:(void *)¶m6]; \ | 92 [_args addPointer:(void *)¶m6]; \ |
79 [_args addPointer:(void *)¶m7]; \ | 93 [_args addPointer:(void *)¶m7]; \ |
80 [_args addPointer:(void *)¶m8]; | 94 [_args addPointer:(void *)¶m8]; \ |
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 *)¶m1]; \ | 98 [_args addPointer:(void *)¶m1]; \ |
83 [_args addPointer:(void *)¶m2]; \ | 99 [_args addPointer:(void *)¶m2]; \ |
84 [_args addPointer:(void *)¶m3]; \ | 100 [_args addPointer:(void *)¶m3]; \ |
85 [_args addPointer:(void *)¶m4]; \ | 101 [_args addPointer:(void *)¶m4]; \ |
86 [_args addPointer:(void *)¶m5]; \ | 102 [_args addPointer:(void *)¶m5]; \ |
87 [_args addPointer:(void *)¶m6]; \ | 103 [_args addPointer:(void *)¶m6]; \ |
88 [_args addPointer:(void *)¶m7]; \ | 104 [_args addPointer:(void *)¶m7]; \ |
89 [_args addPointer:(void *)¶m8]; \ | 105 [_args addPointer:(void *)¶m8]; \ |
90 [_args addPointer:(void *)¶m9]; | 106 [_args addPointer:(void *)¶m9]; \ |
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]; |