/****************************************************************************/
/* */
/* Copyright (C) 1987-1996 Microsoft Corp. */
/* All Rights Reserved */
/* */
/****************************************************************************/
/****************************** Module Header *******************************
* Module Name: imaglink.c
*
* Contains routines for managing the linked list of images.
*
* History:
*
****************************************************************************/
#include "imagedit.h"
/************************************************************************
* ImageLinkAlloc
*
* Allocates an image link. This is a node in the linked list of
* images for the current file. This link will be added to the
* current linked list of images.
*
* Arguments:
* PDEVICE pDevice - Pointer to the device structure.
* INT cx - Width of the image.
* INT cy - Height of the image.
* INT xHotSpot - X location of the hotspot (cursors only).
* INT yHotSpot - Y location of the hotspot (cursors only).
* INT nColors - Number of colors (2 or 16).
*
* History:
*
************************************************************************/
PIMAGEINFO ImageLinkAlloc(
PDEVICE pDevice,
INT cx,
INT cy,
INT xHotSpot,
INT yHotSpot,
INT nColors)
{
PIMAGEINFO pImage;
PIMAGEINFO pImageT;
if (!(pImage = (PIMAGEINFO)MyAlloc(sizeof(IMAGEINFO))))
return NULL;
pImage->pDevice = pDevice;
pImage->cx = cx;
pImage->cy = cy;
pImage->iHotspotX = xHotSpot;
pImage->iHotspotY = yHotSpot;
pImage->nColors = nColors;
pImage->DIBSize = 0;
pImage->DIBhandle = NULL;
pImage->DIBPtr = NULL;
pImage->pImageNext = NULL;
/*
* Insert the link in the list.
*/
if (!gpImageHead) {
/*
* This is the first one. Start the list.
*/
gpImageHead = pImage;
}
else {
/*
* Find the end of the list and tack on the new link.
*/
for (pImageT = gpImageHead; pImageT->pImageNext;
pImageT = pImageT->pImageNext)
;
pImageT->pImageNext = pImage;
}
return pImage;
}
/************************************************************************
* ImageLinkFree
*
* Free's the specified image link and closes up the hole
* in the linked list.
*
* Arguments:
* PIMAGEINFO pImageFree - The image link to free.
*
* History:
*
************************************************************************/
VOID ImageLinkFree(
PIMAGEINFO pImageFree)
{
PIMAGEINFO pImage;
PIMAGEINFO pImagePrev;
/*
* Find the existing link and get it's previous link.
*/
for (pImage = gpImageHead, pImagePrev = NULL;
pImage && pImage != pImageFree;
pImagePrev = pImage, pImage = pImage->pImageNext)
;
/*
* Was the image link found?
*/
if (pImage) {
/*
* Close up the linked list.
*/
if (pImagePrev)
pImagePrev->pImageNext = pImageFree->pImageNext;
else
gpImageHead = pImageFree->pImageNext;
/*
* Unlock and free the allocated DIB image.
*/
if (pImageFree->DIBhandle) {
GlobalUnlock(pImageFree->DIBhandle);
GlobalFree(pImageFree->DIBhandle);
}
/*
* Free the link itself.
*/
MyFree(pImageFree);
}
}
/************************************************************************
* ImageLinkFreeList
*
* Free's all the nodes in the current image list (if there is one).
*
* Arguments:
*
* History:
*
************************************************************************/
VOID ImageLinkFreeList(VOID)
{
while (gpImageHead)
ImageLinkFree(gpImageHead);
}
/************************************************************************
* ImageDelete
*
* Deletes the current image (for icons/cursors). If there are other images,
* the first one is opened. If the last image was just deleted, the
* entire editor will be reset (if the file was untitled) or if there
* is currently a file opened, some other things will happen, such as
* hiding the workspace and view windows, etc.
*
* History:
*
************************************************************************/
VOID ImageDelete(VOID)
{
PIMAGEINFO pImage;
ImageDCDelete();
ImageLinkFree(gpImageCur);
gpImageCur = NULL;
fFileDirty = TRUE;
fImageDirty = FALSE;
gnImages--;
/*
* Look for the first remaining image that has a valid device
* (which means it is editable).
*/
for (pImage = gpImageHead; pImage && !pImage->pDevice;
pImage = pImage->pImageNext)
;
/*
* If there are other editable images, open the first one.
* Otherwise, clear out some more things.
*/
if (pImage) {
ImageOpen2(pImage);
}
else {
/*
* Is this a file off of disk?
*/
if (gpszFileName) {
/*
* Hide the Workspace and View windows.
*/
ShowWindow(ghwndWork, SW_HIDE);
ViewShow(FALSE);
/*
* Update the properties bar (refill the images combo).
*/
PropBarUpdate();
}
else {
/*
* Since this file was opened new and they deleted the
* last image present in it, just reset everything.
*/
ClearResource();
}
}
}