WinWorkstat.st
changeset 2666 95aea895f5b1
parent 2665 4b88034ccb36
child 2667 f35e2d76acc3
equal deleted inserted replaced
2665:4b88034ccb36 2666:95aea895f5b1
    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
   457 #ifndef __rootDC
   457 #ifndef __rootDC
   458  static HDC __rootDC;
   458  static HDC __rootDC;
   459 #endif
   459 #endif
   460 
   460 
   461 #ifdef NUM_PEN_CACHED
   461 #ifdef NUM_PEN_CACHED
   462 struc __penCache {
   462 struct __penCache {
   463      HPEN           pen;
   463      HPEN           pen;
   464      int            clr;
   464      int            clr;
   465 } __penCache[NUM_PEN_CACHED];
   465 } __penCache[NUM_PEN_CACHED];
   466 #endif
   466 #endif
   467 
   467 
   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
   961     }
   973     }
   962     gcData->_hDC = 0;
   974     gcData->_hDC = 0;
   963 
   975 
   964 #ifdef CACHE_LAST_PEN
   976 #ifdef CACHE_LAST_PEN
   965     if (gcData->hPen) {
   977     if (gcData->hPen) {
   966 	_DeletePen(gcData->hPen, __LINE__);
   978 	_DeletePenIfNotInPenCache(gcData->hPen, __LINE__);
   967 	gcData->hPen = 0;
   979 	gcData->hPen = 0;
   968     }
   980     }
   969 #endif
   981 #endif
   970 #ifdef CACHE_LAST_BRUSH
   982 #ifdef CACHE_LAST_BRUSH
   971     if (gcData->hBrush) {
   983     if (gcData->hBrush) {
  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
 11889 ! !
 11947 ! !
 11890 
 11948 
 11891 !WinWorkstation class methodsFor:'documentation'!
 11949 !WinWorkstation class methodsFor:'documentation'!
 11892 
 11950 
 11893 version
 11951 version
 11894     ^ '$Header: /cvs/stx/stx/libview/Attic/WinWorkstat.st,v 1.122 1999-05-12 07:04:45 cg Exp $'
 11952     ^ '$Header: /cvs/stx/stx/libview/Attic/WinWorkstat.st,v 1.123 1999-05-14 21:36:54 cg Exp $'
 11895 ! !
 11953 ! !
 11896 WinWorkstation initialize!
 11954 WinWorkstation initialize!