211 lines
4.8 KiB
C
211 lines
4.8 KiB
C
/*
|
||
* CMWundo.c --
|
||
*
|
||
* Interface to the undo package for the color map editor.
|
||
*
|
||
* *********************************************************************
|
||
* * Copyright (C) 1985, 1990 Regents of the University of California. *
|
||
* * Permission to use, copy, modify, and distribute this *
|
||
* * software and its documentation for any purpose and without *
|
||
* * fee is hereby granted, provided that the above copyright *
|
||
* * notice appear in all copies. The University of California *
|
||
* * makes no representations about the suitability of this *
|
||
* * software for any purpose. It is provided "as is" without *
|
||
* * express or implied warranty. Export of this software outside *
|
||
* * of the United States of America may require an export license. *
|
||
* *********************************************************************
|
||
*/
|
||
|
||
#ifndef lint
|
||
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWundo.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
|
||
#endif /* not lint */
|
||
|
||
#include <stdio.h>
|
||
|
||
#include "utils/magic.h"
|
||
#include "utils/geometry.h"
|
||
#include "graphics/graphics.h"
|
||
#include "windows/windows.h"
|
||
#include "cmwind/cmwind.h"
|
||
#include "utils/undo.h"
|
||
|
||
/*
|
||
* Identifiers for the color map window editing
|
||
* operation.
|
||
*/
|
||
UndoType cmwUndoClientID;
|
||
|
||
/*
|
||
* Functions to play events forward/backward.
|
||
*/
|
||
void cmwUndoForw(), cmwUndoBack();
|
||
void cmwUndoStart(), cmwUndoDone();
|
||
|
||
/*
|
||
* A single undo event for the
|
||
* color map module.
|
||
*/
|
||
typedef struct
|
||
{
|
||
int cue_color; /* Index in color map */
|
||
int old_r, old_g, old_b; /* Old RGB */
|
||
int new_r, new_g, new_b; /* New RGB */
|
||
} colorUE;
|
||
|
||
/*
|
||
* Table of colors that were changed as a result
|
||
* of an undo/redo command.
|
||
*/
|
||
bool cmwColorsChanged[256];
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* CMWundoInit --
|
||
*
|
||
* Initialize the color map editor part of the undo package.
|
||
* Makes the functions contained in here known to the
|
||
* undo module.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Calls the undo package.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
CMWundoInit()
|
||
{
|
||
cmwUndoClientID = UndoAddClient(cmwUndoStart, cmwUndoDone, NULL, NULL,
|
||
cmwUndoForw, cmwUndoBack, "color map");
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* cmwUndoForw --
|
||
* cmwUndoBack --
|
||
*
|
||
* Play forward/backward a colormap undo event.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Modifies the colormap.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
cmwUndoForw(up)
|
||
colorUE *up;
|
||
{
|
||
(void) GrPutColor(up->cue_color, up->new_r, up->new_g, up->new_b);
|
||
cmwColorsChanged[up->cue_color] = TRUE;
|
||
}
|
||
|
||
void
|
||
cmwUndoBack(up)
|
||
colorUE *up;
|
||
{
|
||
(void) GrPutColor(up->cue_color, up->old_r, up->old_g, up->old_b);
|
||
cmwColorsChanged[up->cue_color] = TRUE;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* cmwUndoColor --
|
||
*
|
||
* Record on the undo list a change in a color map entry.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Updates the undo list.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
cmwUndoColor(color, oldr, oldg, oldb, newr, newg, newb)
|
||
int color;
|
||
int oldr, oldg, oldb;
|
||
int newr, newg, newb;
|
||
{
|
||
colorUE *up;
|
||
|
||
up = (colorUE *) UndoNewEvent(cmwUndoClientID, sizeof (colorUE));
|
||
if (up == (colorUE *) NULL)
|
||
return;
|
||
|
||
up->cue_color = color;
|
||
up->old_r = oldr;
|
||
up->old_g = oldg;
|
||
up->old_b = oldb;
|
||
up->new_r = newr;
|
||
up->new_g = newg;
|
||
up->new_b = newb;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* cmwUndoStart --
|
||
*
|
||
* Initialization for undo/redo for the color map editor.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Initializes cmwColorsChanged[].
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
cmwUndoStart()
|
||
{
|
||
int i;
|
||
|
||
for (i = 0; i < 256; i++)
|
||
cmwColorsChanged[i] = FALSE;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* cmwUndoDone --
|
||
*
|
||
* Termination for undo/redo for the color map editor.
|
||
* Forces redisplay of any of the windows containing colors that
|
||
* were changed.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Causes redisplay.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
cmwUndoDone()
|
||
{
|
||
int i;
|
||
extern int cmwRedisplayFunc();
|
||
|
||
for (i = 0; i < 256; i++)
|
||
if (cmwColorsChanged[i])
|
||
(void) WindSearch(CMWclientID, (ClientData) NULL, (Rect *) NULL,
|
||
cmwRedisplayFunc, (ClientData) i);
|
||
}
|