|
|
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: rwpal.c ! 11: * ! 12: * Routines for reading and writing color palette files. ! 13: * ! 14: * History: ! 15: * ! 16: ****************************************************************************/ ! 17: ! 18: #include "imagedit.h" ! 19: ! 20: #include <stdio.h> ! 21: #include <fcntl.h> ! 22: #include <io.h> ! 23: #include <sys\types.h> // For fstat() types. ! 24: #include <sys\stat.h> // For fstat() function. ! 25: ! 26: ! 27: /* ! 28: * The color palette is saved in a .PAL file. This file consists ! 29: * of a header followed by the colors. ! 30: * ! 31: * The header has the following format: ! 32: * ! 33: * struct { ! 34: * CHAR tag; // Always 'C'. ! 35: * WORD colors; // Number of colors. Always COLORSMAX. ! 36: * CHAR reserved[47]; // Reserved bytes. ! 37: * } ! 38: * ! 39: * Immediately following this is RGB quads for each of the colors in ! 40: * the palette. ! 41: */ ! 42: ! 43: ! 44: /* ! 45: * Size in bytes of the header of a color palette file. ! 46: */ ! 47: #define CBCOLORHDR (sizeof(CHAR) + sizeof(WORD) + 47) ! 48: ! 49: /* ! 50: * Size in bytes of the color information in the color file. ! 51: */ ! 52: #define CBCOLORINFO (sizeof(DWORD) * COLORSMAX) ! 53: ! 54: /* ! 55: * Size in bytes of a color palette file. This includes the ! 56: * size of the header and room for all the colors. ! 57: */ ! 58: #define CBCOLORFILE (CBCOLORHDR + CBCOLORINFO) ! 59: ! 60: ! 61: ! 62: /************************************************************************ ! 63: * LoadColorFile ! 64: * ! 65: * ! 66: * ! 67: * Arguments: ! 68: * ! 69: * History: ! 70: * ! 71: ************************************************************************/ ! 72: ! 73: VOID LoadColorFile(VOID) ! 74: { ! 75: HFILE hf; ! 76: OFSTRUCT OfStruct; ! 77: struct stat FileStatus; ! 78: DWORD argb[COLORSMAX]; ! 79: UINT cbRead; ! 80: INT i; ! 81: CHAR tag; ! 82: CHAR szFileName[CCHMAXPATH]; ! 83: ! 84: *szFileName = '\0'; ! 85: if (!OpenDlg(szFileName, FT_PALETTE)) ! 86: return; ! 87: ! 88: if ((hf = (HFILE)OpenFile(szFileName, (LPOFSTRUCT)&OfStruct, OF_READ)) ! 89: == (HFILE)-1) { ! 90: Message(MSG_CANTOPEN, szFileName); ! 91: return; ! 92: } ! 93: ! 94: fstat((INT)_open_osfhandle((long)(hf), (int)(O_RDONLY)), &FileStatus); ! 95: ! 96: if (FileStatus.st_size != CBCOLORFILE) { ! 97: Message(MSG_BADPALFILE, szFileName); ! 98: goto Error1; ! 99: } ! 100: ! 101: if ((cbRead = _lread((HFILE)hf, &tag, 1)) == -1 || cbRead != 1) { ! 102: Message(MSG_READERROR, szFileName); ! 103: goto Error1; ! 104: } ! 105: ! 106: if (tag != 'C') { ! 107: Message(MSG_BADPALFILE, szFileName); ! 108: goto Error1; ! 109: } ! 110: ! 111: SetFilePointer((HANDLE)hf, CBCOLORHDR, NULL, (DWORD)0); ! 112: if ((cbRead = _lread((HFILE)hf, (LPSTR)argb, CBCOLORINFO)) == -1 || ! 113: cbRead != CBCOLORINFO) { ! 114: Message(MSG_READERROR, szFileName); ! 115: goto Error1; ! 116: } ! 117: ! 118: for (i = 0; i < COLORSMAX; i++) ! 119: gargbColor[i] = argb[i]; ! 120: ! 121: SetColorPalette(16, giType, TRUE); ! 122: ! 123: Error1: ! 124: _lclose((HFILE)hf); ! 125: } ! 126: ! 127: ! 128: ! 129: /************************************************************************ ! 130: * SaveColorFile ! 131: * ! 132: * ! 133: * ! 134: * Arguments: ! 135: * ! 136: * History: ! 137: * ! 138: ************************************************************************/ ! 139: ! 140: VOID SaveColorFile(VOID) ! 141: { ! 142: INT i; ! 143: HFILE hf; ! 144: OFSTRUCT OfStruct; ! 145: CHAR reserved[47]; ! 146: WORD wColors = COLORSMAX; ! 147: CHAR tag = 'C'; ! 148: CHAR szFileName[CCHMAXPATH]; ! 149: ! 150: *szFileName = '\0'; ! 151: if (!SaveAsDlg(szFileName, FT_PALETTE)) ! 152: return; ! 153: ! 154: if ((hf = (HFILE)OpenFile(szFileName, &OfStruct, ! 155: OF_CREATE | OF_WRITE)) == (HFILE)-1) { ! 156: Message(MSG_CANTCREATE, szFileName); ! 157: return; ! 158: } ! 159: ! 160: for (i = 0; i < sizeof(reserved); i++) ! 161: reserved[i] = 0; ! 162: ! 163: if (_lwrite((HFILE)hf, (LPSTR)&tag, sizeof(tag)) != sizeof(tag) || ! 164: _lwrite((HFILE)hf, (LPSTR)&wColors, sizeof(wColors)) != ! 165: sizeof(wColors) || ! 166: _lwrite((HFILE)hf, (LPSTR)reserved, sizeof(reserved)) != ! 167: sizeof(reserved) || ! 168: _lwrite((HFILE)hf, (LPSTR)gargbColor, CBCOLORINFO) != CBCOLORINFO) { ! 169: Message(MSG_WRITEERROR, szFileName); ! 170: } ! 171: ! 172: _lclose((HFILE)hf); ! 173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.