|
|
1.1 ! root 1: /****************************************************************************/ ! 2: /* */ ! 3: /* Microsoft Confidential */ ! 4: /* */ ! 5: /* Copyright (c) Microsoft Corp. 1987, 1991 */ ! 6: /* All Rights Reserved */ ! 7: /* */ ! 8: /****************************************************************************/ ! 9: /****************************** Module Header ******************************* ! 10: * Module Name: devinfo.c ! 11: * ! 12: * Contains routines for manipulating the linked list of known target ! 13: * devices for icons and cursors. ! 14: * ! 15: * History: ! 16: * ! 17: ****************************************************************************/ ! 18: ! 19: #include "imagedit.h" ! 20: ! 21: #include <stdio.h> ! 22: #include <stdlib.h> ! 23: #include <string.h> ! 24: ! 25: ! 26: STATICFN VOID ProcessDeviceSection(INT iType); ! 27: STATICFN BOOL ParseDeviceLine(PSTR pszLine, PINT pnColors, PINT pcx, ! 28: PINT pcy); ! 29: ! 30: ! 31: ! 32: /************************************************************************ ! 33: * InitDeviceList ! 34: * ! 35: * ! 36: * ! 37: * Arguments: ! 38: * ! 39: * History: ! 40: * ! 41: ************************************************************************/ ! 42: ! 43: VOID InitDeviceList(VOID) ! 44: { ! 45: /* ! 46: * Allocate the standard icon devices. ! 47: */ ! 48: DeviceLinkAlloc(FT_ICON, ids(IDS_ICONDEVNAMEEGAVGA), 16, 32, 32); ! 49: DeviceLinkAlloc(FT_ICON, ids(IDS_ICONDEVNAMEMONO), 2, 32, 32); ! 50: DeviceLinkAlloc(FT_ICON, ids(IDS_ICONDEVNAMECGA), 2, 32, 16); ! 51: ! 52: ProcessDeviceSection(FT_ICON); ! 53: ! 54: /* ! 55: * Allocate the standard cursor devices. ! 56: */ ! 57: DeviceLinkAlloc(FT_CURSOR, ids(IDS_CURDEVNAMEVGAMONO), 2, 32, 32); ! 58: DeviceLinkAlloc(FT_CURSOR, ids(IDS_CURDEVNAMEVGACOLOR), 16, 32, 32); ! 59: ! 60: ProcessDeviceSection(FT_CURSOR); ! 61: } ! 62: ! 63: ! 64: ! 65: /************************************************************************ ! 66: * ProcessDeviceSection ! 67: * ! 68: * ! 69: * ! 70: * Arguments: ! 71: * ! 72: * History: ! 73: * ! 74: ************************************************************************/ ! 75: ! 76: STATICFN VOID ProcessDeviceSection( ! 77: INT iType) ! 78: { ! 79: PSTR pszSectionName; ! 80: CHAR szValueBuf[CCHTEXTMAX]; ! 81: CHAR szKeyNameBuf[CCHTEXTMAX]; ! 82: PSTR pszKeyName; ! 83: INT nColors; ! 84: INT cx; ! 85: INT cy; ! 86: ! 87: if (iType == FT_ICON) { ! 88: pszSectionName = ids(IDS_ICONINISECTION); ! 89: } ! 90: else { ! 91: pszSectionName = ids(IDS_CURSORINISECTION); ! 92: } ! 93: ! 94: if (!GetPrivateProfileString(pszSectionName, NULL, "", ! 95: szKeyNameBuf, sizeof(szKeyNameBuf), ids(IDS_IMAGEDITINI))) ! 96: return; ! 97: ! 98: pszKeyName = szKeyNameBuf; ! 99: while (*pszKeyName) { ! 100: if (GetPrivateProfileString(pszSectionName, pszKeyName, "", ! 101: szValueBuf, sizeof(szValueBuf), ids(IDS_IMAGEDITINI))) { ! 102: if (ParseDeviceLine(szValueBuf, &nColors, &cx, &cy)) ! 103: DeviceLinkAlloc(iType, pszKeyName, nColors, cx, cy); ! 104: } ! 105: ! 106: pszKeyName += strlen(pszKeyName) + 1; ! 107: } ! 108: } ! 109: ! 110: ! 111: ! 112: /************************************************************************ ! 113: * ParseDeviceLine ! 114: * ! 115: * ! 116: * ! 117: * Arguments: ! 118: * ! 119: * History: ! 120: * ! 121: ************************************************************************/ ! 122: ! 123: STATICFN BOOL ParseDeviceLine( ! 124: PSTR pszLine, ! 125: PINT pnColors, ! 126: PINT pcx, ! 127: PINT pcy) ! 128: { ! 129: static CHAR szSep[] = " ,"; ! 130: PSTR pstr; ! 131: ! 132: if (!(pstr = strtok(pszLine, szSep))) ! 133: return FALSE; ! 134: ! 135: *pnColors = atoi(pstr); ! 136: ! 137: if (!(pstr = strtok(NULL, szSep))) ! 138: return FALSE; ! 139: ! 140: *pcx = atoi(pstr); ! 141: ! 142: if (!(pstr = strtok(NULL, szSep))) ! 143: return FALSE; ! 144: ! 145: *pcy = atoi(pstr); ! 146: ! 147: return TRUE; ! 148: } ! 149: ! 150: ! 151: ! 152: /************************************************************************ ! 153: * DeviceLinkAlloc ! 154: * ! 155: * Allocates a DEVICE structure, initializes it with the given values ! 156: * and adds it to the appropriate linked list. Because these are ! 157: * specified only at init time, there is no need to ever free them. ! 158: * ! 159: * There is a special case if the image type is FT_BITMAP. Because ! 160: * there is only one type of bitmap image device at any one time, ! 161: * this routine does not really allocate a link for these. Instead, ! 162: * it uses a static structure for bitmaps. It will be set to the ! 163: * given values and a pointer to it will be returned. This means ! 164: * that for bitmaps, this function must be called every time that ! 165: * the current bitmap image changes to set up the proper values in ! 166: * the structure. ! 167: * ! 168: * Arguments: ! 169: * INT iType - Type of image. FT_* constant. ! 170: * PSTR pszName - Device name ("VGA", for example). ! 171: * INT nColors - Number of colors. ! 172: * INT cx - Width of image. ! 173: * INT cy - Height of image. ! 174: * ! 175: * History: ! 176: * ! 177: ************************************************************************/ ! 178: ! 179: PDEVICE DeviceLinkAlloc( ! 180: INT iType, ! 181: PSTR pszName, ! 182: INT nColors, ! 183: INT cx, ! 184: INT cy) ! 185: { ! 186: static DEVICE DeviceBitmap; // Device structure for bitmaps. ! 187: PDEVICE pDevice; ! 188: PDEVICE pDeviceT; ! 189: PDEVICE *ppDeviceHead; ! 190: ! 191: /* ! 192: * Currently we only support 1 and 4 plane devices. ! 193: */ ! 194: if (nColors != 2 && nColors != 16) { ! 195: Message(MSG_BADDEVICECOLORS); ! 196: return NULL; ! 197: } ! 198: ! 199: /* ! 200: * There is a limit to the size of image we will edit. For icons ! 201: * and cursors, the field that carries the dimensions is a byte, ! 202: * so the size cannot be greater than 256. This is also what ! 203: * we limit bitmaps to. ! 204: */ ! 205: if (cx < 1 || cx > MAXIMAGEDIM || cy < 1 || cy > MAXIMAGEDIM) { ! 206: Message(MSG_BADDEVICESIZE, MAXIMAGEDIM); ! 207: return NULL; ! 208: } ! 209: ! 210: /* ! 211: * For bitmaps, don't really allocate a link, just reuse the ! 212: * static DEVICE structure used for bitmaps. ! 213: */ ! 214: if (iType == FT_BITMAP) { ! 215: pDevice = &DeviceBitmap; ! 216: } ! 217: else { ! 218: if (!(pDevice = (PDEVICE)MyAlloc(sizeof(DEVICE)))) ! 219: return NULL; ! 220: ! 221: switch (iType) { ! 222: case FT_ICON: ! 223: ppDeviceHead = &gpIconDeviceHead; ! 224: gnIconDevices++; ! 225: break; ! 226: ! 227: case FT_CURSOR: ! 228: ppDeviceHead = &gpCursorDeviceHead; ! 229: gnCursorDevices++; ! 230: break; ! 231: } ! 232: } ! 233: ! 234: pDevice->pDeviceNext = NULL; ! 235: pDevice->iType = iType; ! 236: pDevice->nColors = nColors; ! 237: pDevice->cx = cx; ! 238: pDevice->cy = cy; ! 239: ! 240: if (pszName) { ! 241: strcpy(pDevice->szName, pszName); ! 242: wsprintf(pDevice->szDesc, "%s %d-Color %dx%d", // hardcoded strings! ! 243: (LPSTR)pszName, nColors, cx, cy); ! 244: } ! 245: else { ! 246: *pDevice->szName = '\0'; ! 247: wsprintf(pDevice->szDesc, "%d-Color %dx%d", nColors, cx, cy); ! 248: } ! 249: ! 250: /* ! 251: * Because there is only one bitmap link, there is no need ! 252: * for a list for these, only icons and cursors. ! 253: */ ! 254: if (iType != FT_BITMAP) { ! 255: /* ! 256: * Insert the link in the specified list. ! 257: */ ! 258: if (!(*ppDeviceHead)) { ! 259: /* ! 260: * This is the first one. Start the list. ! 261: */ ! 262: *ppDeviceHead = pDevice; ! 263: } ! 264: else { ! 265: /* ! 266: * Find the end of the list and tack on the new link. ! 267: */ ! 268: for (pDeviceT = *ppDeviceHead; pDeviceT->pDeviceNext; ! 269: pDeviceT = pDeviceT->pDeviceNext) ! 270: ; ! 271: ! 272: pDeviceT->pDeviceNext = pDevice; ! 273: } ! 274: } ! 275: ! 276: return pDevice; ! 277: } ! 278: ! 279: ! 280: ! 281: /************************************************************************ ! 282: * DeviceLinkFind ! 283: * ! 284: * ! 285: * ! 286: * Arguments: ! 287: * ! 288: * History: ! 289: * ! 290: ************************************************************************/ ! 291: ! 292: PDEVICE DeviceLinkFind( ! 293: PDEVICE pDeviceHead, ! 294: INT nColors, ! 295: INT cx, ! 296: INT cy) ! 297: { ! 298: PDEVICE pDevice; ! 299: ! 300: /* ! 301: * Search the specified list. ! 302: */ ! 303: for (pDevice = pDeviceHead; pDevice; pDevice = pDevice->pDeviceNext) { ! 304: /* ! 305: * Is this a match? ! 306: */ ! 307: if (pDevice->nColors == nColors && pDevice->cx == cx && ! 308: pDevice->cy == cy) ! 309: break; ! 310: } ! 311: ! 312: return pDevice; ! 313: } ! 314: ! 315: ! 316: ! 317: /************************************************************************ ! 318: * DeviceLinkUsed ! 319: * ! 320: * This function returns TRUE if the specified device is used in ! 321: * the current image list. ! 322: * ! 323: * Arguments: ! 324: * PDEVICE pDevice - Device to look for. ! 325: * ! 326: * History: ! 327: * ! 328: ************************************************************************/ ! 329: ! 330: BOOL DeviceLinkUsed( ! 331: PDEVICE pDevice) ! 332: { ! 333: PIMAGEINFO pImage; ! 334: ! 335: for (pImage = gpImageHead; pImage; pImage = pImage->pImageNext) { ! 336: if (pImage->pDevice == pDevice) ! 337: return TRUE; ! 338: } ! 339: ! 340: return FALSE; ! 341: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.