File:  [WindowsNT SDKs] / mstools / samples / sdktools / imagedit / rwpal.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:24:28 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntsdk-nov-1993, ntsdk-jul-1993, HEAD
Microsoft Windows NT Build 511 (SDK Final Release) 07-24-1993

/****************************************************************************/
/*                                                                          */
/*                         Microsoft Confidential                           */
/*                                                                          */
/*                 Copyright (c) Microsoft Corp.  1987, 1991                */
/*                           All Rights Reserved                            */
/*                                                                          */
/****************************************************************************/
/****************************** Module Header *******************************
* Module Name: rwpal.c
*
* Routines for reading and writing color palette files.
*
* History:
*
****************************************************************************/

#include "imagedit.h"

#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <sys\types.h>                      // For fstat() types.
#include <sys\stat.h>                       // For fstat() function.


/*
 * The color palette is saved in a .PAL file.  This file consists
 * of a header followed by the colors.
 *
 * The header has the following format:
 *
 * struct {
 *     CHAR tag;                // Always 'C'.
 *     WORD colors;             // Number of colors.  Always COLORSMAX.
 *     CHAR reserved[47];       // Reserved bytes.
 * }
 *
 * Immediately following this is RGB quads for each of the colors in
 * the palette.
 */


/*
 * Size in bytes of the header of a color palette file.
 */
#define CBCOLORHDR          (sizeof(CHAR) + sizeof(WORD) + 47)

/*
 * Size in bytes of the color information in the color file.
 */
#define CBCOLORINFO         (sizeof(DWORD) * COLORSMAX)

/*
 * Size in bytes of a color palette file.  This includes the
 * size of the header and room for all the colors.
 */
#define CBCOLORFILE         (CBCOLORHDR + CBCOLORINFO)



/************************************************************************
* LoadColorFile
*
*
*
* Arguments:
*
* History:
*
************************************************************************/

VOID LoadColorFile(VOID)
{
    HFILE hf;
    OFSTRUCT OfStruct;
    struct stat FileStatus;
    DWORD argb[COLORSMAX];
    UINT cbRead;
    INT i;
    CHAR tag;
    CHAR szFileName[CCHMAXPATH];

    *szFileName = '\0';
    if (!OpenDlg(szFileName, FT_PALETTE))
        return;

    if ((hf = (HFILE)OpenFile(szFileName, (LPOFSTRUCT)&OfStruct, OF_READ))
            == (HFILE)-1) {
        Message(MSG_CANTOPEN, szFileName);
        return;
    }

    fstat((INT)_open_osfhandle((long)(hf), (int)(O_RDONLY)), &FileStatus);

    if (FileStatus.st_size != CBCOLORFILE) {
        Message(MSG_BADPALFILE, szFileName);
        goto Error1;
    }

    if ((cbRead = _lread((HFILE)hf, &tag, 1)) == -1 || cbRead != 1) {
        Message(MSG_READERROR, szFileName);
        goto Error1;
    }

    if (tag != 'C') {
        Message(MSG_BADPALFILE, szFileName);
        goto Error1;
    }

    SetFilePointer((HANDLE)hf, CBCOLORHDR, NULL, (DWORD)0);
    if ((cbRead = _lread((HFILE)hf, (LPSTR)argb, CBCOLORINFO)) == -1 ||
            cbRead != CBCOLORINFO) {
        Message(MSG_READERROR, szFileName);
        goto Error1;
    }

    for (i = 0; i < COLORSMAX; i++)
        gargbColor[i] = argb[i];

    SetColorPalette(16, giType, TRUE);

Error1:
    _lclose((HFILE)hf);
}



/************************************************************************
* SaveColorFile
*
*
*
* Arguments:
*
* History:
*
************************************************************************/

VOID SaveColorFile(VOID)
{
    INT i;
    HFILE hf;
    OFSTRUCT OfStruct;
    CHAR reserved[47];
    WORD wColors = COLORSMAX;
    CHAR tag = 'C';
    CHAR szFileName[CCHMAXPATH];

    *szFileName = '\0';
    if (!SaveAsDlg(szFileName, FT_PALETTE))
        return;

    if ((hf = (HFILE)OpenFile(szFileName, &OfStruct,
            OF_CREATE | OF_WRITE)) == (HFILE)-1) {
        Message(MSG_CANTCREATE, szFileName);
        return;
    }

    for (i = 0; i < sizeof(reserved); i++)
        reserved[i] = 0;

    if (_lwrite((HFILE)hf, (LPSTR)&tag, sizeof(tag)) != sizeof(tag) ||
            _lwrite((HFILE)hf, (LPSTR)&wColors, sizeof(wColors)) !=
            sizeof(wColors) ||
            _lwrite((HFILE)hf, (LPSTR)reserved, sizeof(reserved)) !=
            sizeof(reserved) ||
            _lwrite((HFILE)hf, (LPSTR)gargbColor, CBCOLORINFO) != CBCOLORINFO) {
        Message(MSG_WRITEERROR, szFileName);
    }

    _lclose((HFILE)hf);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.