37 #define CACHE_LAST_DC /* remember DC in gcData */ |
37 #define CACHE_LAST_DC /* remember DC in gcData */ |
38 #define CACHE_LAST_PEN /* remember pen in gcData */ |
38 #define CACHE_LAST_PEN /* remember pen in gcData */ |
39 #define CACHE_LAST_BRUSH /* remember brush in gcData */ |
39 #define CACHE_LAST_BRUSH /* remember brush in gcData */ |
40 #define CACHE_LAST_WM_PAINT_BRUSH /* remember last viewBackground brush */ |
40 #define CACHE_LAST_WM_PAINT_BRUSH /* remember last viewBackground brush */ |
41 #define CACHE_LAST_WM_PAINT_DC /* remember last viewBackground paints dc */ |
41 #define CACHE_LAST_WM_PAINT_DC /* remember last viewBackground paints dc */ |
42 #define xxNUM_PEN_CACHED 5 |
42 #define NUM_PEN_CACHED 8 |
43 |
43 |
44 #undef INT |
44 #undef INT |
45 #define INT WIN_INT |
45 #define INT WIN_INT |
46 #undef Array |
46 #undef Array |
47 #define Array WIN_Array |
47 #define Array WIN_Array |
855 return r; |
855 return r; |
856 } |
856 } |
857 return 1; |
857 return 1; |
858 } |
858 } |
859 |
859 |
|
860 #ifdef NUM_PEN_CACHED |
|
861 |
|
862 static int |
|
863 _DeletePenIfNotInPenCache(p, lineNr) |
|
864 HPEN p; |
|
865 { |
|
866 int i, r; |
|
867 |
|
868 for (i=0; i<NUM_PEN_CACHED;i++) { |
|
869 if (__penCache[i].pen == p) { |
|
870 return 1; /* not deleted, but OK */ |
|
871 } |
|
872 } |
|
873 if ((p == __whitePen) |
|
874 || (p == __blackPen)) { |
|
875 return 1; /* not deleted, but OK */ |
|
876 } |
|
877 r = DeleteObject(p); |
|
878 |
|
879 if (r == 0) |
|
880 fprintf(stderr, "WinWorkstation: ERROR in DeletePen2 %x [%d]\n", p, lineNr); |
|
881 return r; |
|
882 } |
|
883 |
|
884 #else |
|
885 # define _DeletePenIfNotInPenCache(p, lineNr) _DeletePen(p, lineNr) |
|
886 #endif |
|
887 |
860 static struct gcData * |
888 static struct gcData * |
861 newGcData() { |
889 newGcData() { |
862 struct gcData *gcData = (struct gcData *)malloc(sizeof(struct gcData)); |
890 struct gcData *gcData = (struct gcData *)malloc(sizeof(struct gcData)); |
863 |
891 |
864 if (! gcData) { |
892 if (! gcData) { |
886 } |
914 } |
887 #else |
915 #else |
888 # define FLUSH_CACHED_DC(x) /* */ |
916 # define FLUSH_CACHED_DC(x) /* */ |
889 #endif |
917 #endif |
890 |
918 |
891 #ifdef NUM_PEN_CACHED |
|
892 # define FLUSH_MULTIPEN_CACHE(__gcData__) \ |
|
893 { \ |
|
894 int i; \ |
|
895 for (i=0; i<NUM_PEN_CACHED;i++) { \ |
|
896 if (__penCache[i].gcData == __gcData__) { \ |
|
897 _DeleteObject(__penCache[i].pen, __LINE__); \ |
|
898 __penCache[i].pen = 0; \ |
|
899 break; \ |
|
900 } \ |
|
901 } \ |
|
902 } |
|
903 #else |
|
904 # define FLUSH_MULTIPEN_CACHE(__gcData__) /* NOTHING */ |
|
905 #endif |
|
906 |
|
907 #ifdef CACHE_LAST_PEN |
919 #ifdef CACHE_LAST_PEN |
908 # define FLUSH_CACHED_PEN(__gcData__) \ |
920 # define FLUSH_CACHED_PEN(__gcData__) \ |
909 if (__gcData__->hPen) { \ |
921 if (__gcData__->hPen) { \ |
910 if (__gcData__->save_hPen) { \ |
922 if (__gcData__->save_hPen) { \ |
911 SelectObject(__gcData__->_hDC, __gcData__->save_hPen); \ |
923 SelectObject(__gcData__->_hDC, __gcData__->save_hPen); \ |
912 __gcData__->save_hPen = 0; \ |
924 __gcData__->save_hPen = 0; \ |
913 } \ |
925 } \ |
914 _DeletePen(__gcData__->hPen, __LINE__); \ |
926 _DeletePenIfNotInPenCache(__gcData__->hPen, __LINE__); \ |
915 __gcData__->hPen = 0; \ |
927 __gcData__->hPen = 0; \ |
916 } |
928 } |
917 #else |
929 #else |
918 # define FLUSH_CACHED_PEN(x) /* */ |
930 # define FLUSH_CACHED_PEN(x) /* */ |
919 #endif |
931 #endif |
1158 gcData->save_hPen = prevPen; |
1170 gcData->save_hPen = prevPen; |
1159 } |
1171 } |
1160 #endif |
1172 #endif |
1161 return __whitePen; |
1173 return __whitePen; |
1162 } |
1174 } |
|
1175 |
1163 #ifdef NUM_PEN_CACHED |
1176 #ifdef NUM_PEN_CACHED |
1164 for (i=0; i<NUM_PEN_CACHED; i++) { |
1177 { |
1165 if (__penCache[i].clr == gcData->fgColor) { |
1178 int i; |
1166 hPen = __penCache[i].pen; |
1179 |
1167 prevPen = SelectObject(hDC, hPen); |
1180 for (i=0; i<NUM_PEN_CACHED; i++) { |
1168 if (! gcData->save_hPen) { |
1181 if (__penCache[i].clr == gcData->fgColor) { |
1169 gcData->save_hPen = prevPen; |
1182 hPen = __penCache[i].pen; |
|
1183 /* |
|
1184 * move it up in the cache |
|
1185 */ |
|
1186 if (i > 0) { |
|
1187 HPEN t = __penCache[i-1].pen; |
|
1188 int c = __penCache[i-1].clr; |
|
1189 |
|
1190 __penCache[i-1].pen = hPen; |
|
1191 __penCache[i-1].clr = gcData->fgColor; |
|
1192 __penCache[i].pen = t; |
|
1193 __penCache[i].clr = c; |
|
1194 } |
|
1195 #ifdef CACHE_LAST_PEN |
|
1196 prevPen = SelectObject(hDC, hPen); |
|
1197 if (! gcData->save_hPen) { |
|
1198 gcData->save_hPen = prevPen; |
|
1199 } |
|
1200 gcData->hPen = hPen; |
|
1201 #endif |
|
1202 return hPen; |
1170 } |
1203 } |
1171 gcData->hPen = hPen; |
|
1172 return hPen; |
|
1173 } |
1204 } |
1174 } |
1205 } |
1175 #endif |
1206 #endif |
1176 } |
1207 } |
1177 |
1208 |
1267 prevPen = SelectObject(hDC, hPen); |
1298 prevPen = SelectObject(hDC, hPen); |
1268 if (! gcData->save_hPen) { |
1299 if (! gcData->save_hPen) { |
1269 gcData->save_hPen = prevPen; |
1300 gcData->save_hPen = prevPen; |
1270 } |
1301 } |
1271 |
1302 |
|
1303 #ifdef NUM_PEN_CACHED |
|
1304 /* |
|
1305 * remember in penCache |
|
1306 */ |
|
1307 if (((gcData->lStyle & PS_STYLE_MASK) == PS_SOLID) |
|
1308 && (gcData->hMask == 0) |
|
1309 && (gcData->lineWidth <= 1)) { |
|
1310 int i; |
|
1311 |
|
1312 for (i=0; i<NUM_PEN_CACHED; i++) { |
|
1313 if (__penCache[i].pen == 0) { |
|
1314 __penCache[i].clr = gcData->fgColor; |
|
1315 __penCache[i].pen = hPen; |
|
1316 break; |
|
1317 } |
|
1318 } |
|
1319 if (i == NUM_PEN_CACHED) { |
|
1320 /* replace last in penCache */ |
|
1321 HPEN t = __penCache[NUM_PEN_CACHED - 1].pen; |
|
1322 |
|
1323 __penCache[NUM_PEN_CACHED - 1].pen = hPen; |
|
1324 __penCache[NUM_PEN_CACHED - 1].clr = gcData->fgColor; |
|
1325 _DeletePen(t, __LINE__); |
|
1326 } |
|
1327 } |
|
1328 #endif |
|
1329 |
1272 return hPen; |
1330 return hPen; |
1273 } |
1331 } |
1274 |
1332 |
1275 #ifdef CACHE_LAST_PEN |
1333 #ifdef CACHE_LAST_PEN |
1276 # define GcDataReleasePen(hDC, gcData) /* nothing*/ |
1334 # define GcDataReleasePen(hDC, gcData) /* nothing*/ |
1285 if (gcData->save_hPen) { |
1343 if (gcData->save_hPen) { |
1286 SelectObject(hDC, gcData->save_hPen); |
1344 SelectObject(hDC, gcData->save_hPen); |
1287 gcData->save_hPen = NULL; |
1345 gcData->save_hPen = NULL; |
1288 } |
1346 } |
1289 hPen = gcData->hPen; |
1347 hPen = gcData->hPen; |
1290 _DeletePen(hPen, __LINE__); |
1348 _DeletePenIfNotInPenCache(hPen, __LINE__); |
1291 gcData->hPen = 0; |
1349 gcData->hPen = 0; |
1292 } |
1350 } |
1293 #endif /* CACHE_LAST_PEN */ |
1351 #endif /* CACHE_LAST_PEN */ |
1294 |
1352 |
1295 static int |
1353 static int |