BOOL CImage::ObjEditInit(LPOBJECT lpObject, UNDO_TYPE UndoType) { LPALPHA lpAlpha; LPOBJECT lpNext; BOOL fBase, fDataInit, fAlphaInit; LPCOLORMAP lpColorMap; // See if this objects the base, and get alpha channel of object fBase = (lpObject == GetBase()); lpAlpha = lpObject->lpAlpha; // // HANDLE INITIALIZATION OF OBJECT DATA // fDataInit = (UndoType & UT_DATAUNDO) != 0; if (fDataInit && !(Control.NoUndo || fDisableUndos)) { // Apply any changes that have been made if in auto apply mode // or if in manual apply mode and changes have been undone // the init flag is set only if we are doing an edit in place change // to the data so we get rid of any useless undo's if (!Control.UseApply || ( Control.UseApply && !lpObject->DataUndoNotRedo ) ) ObjEditApply(lpObject, YES, !fBase, (UndoType & UT_DATA) != 0); // Save undo information for the specific type of operation if (UndoType & UT_UNDOTEXTDATA && !(lpObject->DataUndoType & UT_UNDOTEXTDATA)) lpObject->lpUndoText = new CTextObject(*lpObject->lpText); if (UndoType & UT_OBJECTRECT && !(lpObject->DataUndoType & UT_OBJECTRECT)) lpObject->rUndoObject = lpObject->rObject; if (UndoType & UT_RESOLUTION && !(lpObject->DataUndoType & UT_RESOLUTION)) lpObject->UndoResolution = FrameResolution(ObjGetEditFrame(lpObject)); if (UndoType & UT_COLORMAP && !(lpObject->DataUndoType & UT_COLORMAP)) { if (lpColorMap = FrameGetColorMap(ObjGetEditFrame(lpObject))) lpObject->UndoColorMap = FrameCopyColorMap(lpColorMap); else lpObject->UndoColorMap = NULL; } if (UndoType & UT_SELECTION && !(lpObject->DataUndoType & UT_SELECTION)) lpObject->fUndoSelected = lpObject->fSelected; // Size base is a special case for the base and base only if (UndoType & UT_DATA) { // init the data pixmap for editing if (!lpObject->Pixmap.UndoFrame) if (!PixmapInitUndo(&lpObject->Pixmap)) return(FALSE); } if (UndoType & UT_NEWDATA) { if (fBase) UndoDataType = DataType; } if (fBase && UndoType & UT_MOVEOBJECTS && !(lpObject->DataUndoType & UT_MOVEOBJECTS)) { lpNext = lpObject; while (lpNext = GetNextObject(lpNext, YES, NO, NO)) { ObjEditApply(lpNext, TRUE, TRUE, FALSE); lpNext->rUndoObject = lpNext->rObject; } } // Delete objects is a special case for the base and base only if (fBase && UndoType & UT_DELETEOBJECTS && !(lpObject->DataUndoType & UT_DELETEOBJECTS)) { lpNext = lpObject; while (lpNext = GetNextObject(lpNext, YES, NO, YES)) lpNext->fUndoDeleted = NO; } if (UndoType & UT_GROUPOBJECTS && !(lpObject->DataUndoType & UT_GROUPOBJECTS)) lpObject->UndoGroupID = lpObject->wGroupID; if (UndoType & UT_LOCKOBJECTS && !(lpObject->DataUndoType & UT_LOCKOBJECTS)) lpObject->bUndoLocked = lpObject->bLocked; } // now that we have successfully initialized everything set UndoTypes if (fDataInit) { lpObject->DataUndoNotRedo = YES; lpObject->DataUndoType |= (UndoType & UT_DATAUNDO); } // // HANDLE INITIALIZATION OF OBJECT ALPHA // fAlphaInit = (UndoType & UT_ALPHAUNDO) != 0; if (fAlphaInit && !(Control.NoUndo || fDisableUndos) && (!fBase || Control.UndoMasks)) { // Apply any changes that have been made if in auto apply mode // or if in manual apply mode and changes have been undone or // apply any changes only to the mask // or if it is a change to both data and mask and // both were not dirty before // Initialize the data undo if the object is not the base and we didn't // already do a data init // the init flag is set only if we are doing an edit in place change // to the alpha so we get rid of any useless undo's if (!Control.UseApply || (Control.UseApply && !lpObject->AlphaUndoNotRedo) || (fBase && (!fDataInit || !lpObject->fBothDirty))) ObjEditApply(lpObject, fDataInit ? NO : !fBase, YES, (UndoType & UT_ALPHA) != 0); // Save undo information for the specific type of operation if (lpAlpha) { if (!lpObject->AlphaUndoType) { if (UndoType & UT_ALPHA) { // init the data pixmap for editing if (!lpAlpha->Pixmap.UndoFrame) if (!PixmapInitUndo(&lpAlpha->Pixmap)) return(FALSE); lpAlpha->rUndoMask = lpAlpha->rMask; } if (UndoType & UT_NEWALPHA) lpAlpha->rUndoMask = lpAlpha->rMask; if (fBase && UndoType & UT_CREATEMASK) lpObject->lpUndoAlpha = NULL; if (fBase && UndoType & UT_DELETEMASK) lpObject->lpUndoAlpha = lpAlpha; if (UndoType & UT_ALPHAUNDO) { lpObject->AlphaUndoNotRedo = YES; lpObject->AlphaUndoType |= (UndoType & UT_ALPHAUNDO); } } } } return(TRUE); }
void CImage::ObjEditUndo(LPOBJECT lpObject, BOOL fUndoData, BOOL fUndoAlpha) { RECT rTemp; BOOL fSelected, Resolution, fDeleted, fBase, bLocked; LPALPHA lpAlpha, lpTemp; LPOBJECT lpNext; int XSize, YSize; int tempDataType; LPCOLORMAP lpColorMap; int GroupID; lpAlpha = lpObject->lpAlpha; fBase = lpObject == GetBase(); if (fUndoData && lpObject->DataDirty) { if (lpObject->DataUndoType & UT_RESOLUTION) Resolution = FrameResolution(lpObject->Pixmap.EditFrame); if (lpObject->DataUndoType & UT_COLORMAP) { if (lpColorMap = FrameGetColorMap(ObjGetEditFrame(lpObject))) lpColorMap = FrameCopyColorMap(lpColorMap); else lpColorMap = NULL; } if (lpObject->DataUndoType & (UT_DATA|UT_NEWDATA)) { PixmapEditUndo(&lpObject->Pixmap); if (fBase) { npix = FrameXSize(ObjGetEditFrame(lpObject)); nlin = FrameYSize(ObjGetEditFrame(lpObject)); if (lpObject->DataUndoType & UT_NEWDATA) { tempDataType = DataType; DataType = UndoDataType; UndoDataType = tempDataType; } } } if (lpObject->DataUndoType & UT_OBJECTRECT) { rTemp = lpObject->rObject; lpObject->rObject = lpObject->rUndoObject; lpObject->rUndoObject = rTemp; } if (lpObject->DataUndoType & UT_RESOLUTION) { FrameSetResolution( lpObject->Pixmap.EditFrame, lpObject->UndoResolution); lpObject->UndoResolution = Resolution; } if (lpObject->DataUndoType & UT_UNDOTEXTDATA) { if (lpObject->lpUndoText) { CTextObject *pTmp = lpObject->lpUndoText; lpObject->lpUndoText = lpObject->lpText; lpObject->lpText = pTmp; } } if (lpObject->DataUndoType & UT_COLORMAP) { if (lpObject->UndoColorMap) { FrameSetColorMap( ObjGetEditFrame(lpObject), lpObject->UndoColorMap); FrameDestroyColorMap(lpObject->UndoColorMap); } lpObject->UndoColorMap = lpColorMap; } if (lpObject->DataUndoType & UT_SELECTION) { fSelected = lpObject->fSelected; lpObject->fSelected = lpObject->fUndoSelected; lpObject->fUndoSelected = fSelected; } if (lpObject->DataUndoType & UT_LOCKOBJECTS) { bLocked = lpObject->bLocked; lpObject->bLocked = lpObject->bUndoLocked; lpObject->bUndoLocked = bLocked; } if (lpObject->DataUndoType & UT_GROUPOBJECTS) { GroupID = lpObject->wGroupID; lpObject->wGroupID = lpObject->UndoGroupID; lpObject->UndoGroupID = GroupID; } if (lpObject->DataUndoType & UT_DELETEOBJECTS) { lpNext = lpObject; while (lpNext = GetNextObject(lpNext, YES, NO, YES)) { if (lpNext->fUndoDeleted || lpNext->fDeleted) { fDeleted = lpNext->fDeleted; lpNext->fDeleted = lpNext->fUndoDeleted; lpNext->fUndoDeleted = fDeleted; } } } if (fBase && lpObject->DataUndoType & UT_MOVEOBJECTS) { lpNext = lpObject; while (lpNext = GetNextObject(lpNext, YES, NO, NO)) { rTemp = lpNext->rObject; lpNext->rObject = lpNext->rUndoObject; lpNext->rUndoObject = rTemp; } } lpObject->DataUndoNotRedo = !lpObject->DataUndoNotRedo; if (!fUndoAlpha) fUndoAlpha = lpObject->fBothDirty; } else if (fUndoAlpha && lpObject->fBothDirty) fUndoAlpha = NO; if (fUndoAlpha && lpObject->AlphaDirty) { if (lpAlpha) { if (lpObject->AlphaUndoType & (UT_ALPHA|UT_NEWALPHA)) { PixmapEditUndo(&lpAlpha->Pixmap); rTemp = lpAlpha->rMask; lpAlpha->rMask = lpAlpha->rUndoMask; lpAlpha->rUndoMask = rTemp; } } if (lpObject->AlphaUndoType & (UT_CREATEMASK|UT_DELETEMASK)) { lpTemp = lpObject->lpAlpha; lpObject->lpAlpha = lpObject->lpUndoAlpha; lpObject->lpUndoAlpha = lpTemp; } lpObject->AlphaUndoNotRedo = !lpObject->AlphaUndoNotRedo; } lpAlpha = lpObject->lpAlpha; // check to make sure the mask is still the same size if (fUndoData && fBase && lpObject->Pixmap.fNewFrame) { // we just undid to a different size frame bag mask delete undo if (lpObject->lpUndoAlpha && !lpObject->fBothDirty) ObjEditApply(lpObject, NO, YES, NO); if (lpAlpha) { XSize = FrameXSize(lpAlpha->Pixmap.EditFrame); YSize = FrameYSize(lpAlpha->Pixmap.EditFrame); if (XSize != FrameXSize(lpObject->Pixmap.EditFrame) || YSize != FrameYSize(lpObject->Pixmap.EditFrame)) { ObjEditInit(lpObject, UT_DELETEMASK); // dont free mask if it was stored for later undo/redo if (!lpObject->lpUndoAlpha) MaskClose(lpObject->lpAlpha); lpObject->fBothDirty = YES; lpObject->AlphaDirty = lpObject->DataDirty; lpObject->lpAlpha = NULL; } } } }
//************************************************************************ LOCAL STATUS_CODE ApplyCalibration( LPIMAGE lpImage, ITEMID dirty, LPSTR lpScanMap, LPSTR lpPrintMap, LPRECT lpUpdateRect, LPUPDATE_TYPE lpUpdateType) //************************************************************************ { FNAME szFileName; ENGINE Engine; LPCALMAPS lpMaps; BOOL fScanMap, fPrintMap; FRMTYPEINFO TypeInfo; LPCOLORMAP lpColorMap; STATUS_CODE StatusCode; int i; ASSERT(lpImage); AstralSetRectEmpty(lpUpdateRect); *lpUpdateType = UT_NONE; ImgGetTypeInfo(lpImage, &TypeInfo); lpMaps = (LPCALMAPS)Alloc(sizeof(CALMAPS)); if (!lpMaps) { Message(IDS_EMEMALLOC); return(SC_MEMERROR); } for (i = 0; i < CALSCAN_MAPS; ++i) ResetMap( &lpMaps->ScanMap[i], CALPOINTS, NO ); if (fScanMap = (lstrlen(lpScanMap) != 0)) { if ( LookupExtFileN( lpScanMap, szFileName, IDN_SCANMAP, NO ) ) { // Remember that the maps load in XRGB order if (!LoadMap( &lpMaps->ScanMap[CALSCAN_GRAY], &lpMaps->ScanMap[CALSCAN_RED], &lpMaps->ScanMap[CALSCAN_GREEN], &lpMaps->ScanMap[CALSCAN_BLUE], szFileName )) { FreeUp(lpMaps); return(SC_READERROR); } if (TypeInfo.DataType == FDT_CMYKCOLOR) { // make maps work on cmyk for (i = 0; i < CALSCAN_MAPS; ++i) ReverseMap(&lpMaps->ScanMap[i], FALSE); } } else { fScanMap = NO; } } for (i = 0; i < CAL_MAPS; ++i) ResetMap( &lpMaps->PrintMap[i], CALPOINTS, NO ); if (fPrintMap = (lstrlen(lpPrintMap) != 0)) { if ( LookupExtFileN( lpPrintMap, szFileName, IDN_CALMAP, NO ) ) { // Remember that the maps load in MCMYK order if (!LoadCalMap( &lpMaps->PrintMap[CAL_MASTER], &lpMaps->PrintMap[CAL_CYAN], &lpMaps->PrintMap[CAL_MAGENTA], &lpMaps->PrintMap[CAL_YELLOW], &lpMaps->PrintMap[CAL_BLACK], szFileName )) { FreeUp(lpMaps); return(SC_READERROR); } if (TypeInfo.DataType != FDT_CMYKCOLOR) { // make maps work on rgb for (i = 0; i < CAL_MAPS; ++i) ReverseMap(&lpMaps->PrintMap[i], FALSE); } } else { fPrintMap = NO; lpPrintMap = NULL; } } if (!fScanMap && !fPrintMap) { FreeUp(lpMaps); return(SC_SUCCESS); // user selected no maps??? } switch (TypeInfo.DataType) { case FDT_LINEART: case FDT_GRAYSCALE: MakeFloatMap(&lpMaps->ScanMap[CALSCAN_GRAY], lpMaps->CalPnts); MakeFloatMap(&lpMaps->PrintMap[CAL_BLACK], lpMaps->TmpPnts); MapCombine(lpMaps->CalPnts, lpMaps->TmpPnts); MapCreateLut(lpMaps->CalPnts, lpMaps->Lut[0]); break; case FDT_CMYKCOLOR: for (i = 0; i < 4; ++i) { if (i == 3) // black MakeFloatMap(&lpMaps->ScanMap[CALSCAN_GRAY], lpMaps->CalPnts); else MakeFloatMap(&lpMaps->ScanMap[CALSCAN_RED+i], lpMaps->CalPnts); MakeFloatMap(&lpMaps->PrintMap[CAL_MASTER], lpMaps->TmpPnts); MapCombine(lpMaps->CalPnts, lpMaps->TmpPnts); MakeFloatMap(&lpMaps->PrintMap[CAL_CYAN+i], lpMaps->TmpPnts); MapCombine(lpMaps->CalPnts, lpMaps->TmpPnts); MapCreateLut(lpMaps->CalPnts, lpMaps->Lut[i]); } break; default: case FDT_RGBCOLOR: case FDT_PALETTECOLOR: for (i = 0; i < 3; ++i) { MakeFloatMap(&lpMaps->ScanMap[CALSCAN_RED+i], lpMaps->CalPnts); MakeFloatMap(&lpMaps->PrintMap[CAL_MASTER], lpMaps->TmpPnts); MapCombine(lpMaps->CalPnts, lpMaps->TmpPnts); MakeFloatMap(&lpMaps->PrintMap[CAL_CYAN+i], lpMaps->TmpPnts); MapCombine(lpMaps->CalPnts, lpMaps->TmpPnts); MapCreateLut(lpMaps->CalPnts, lpMaps->Lut[i]); } break; } ImgGetTypeInfo(lpImage, &TypeInfo); if (TypeInfo.DataType == FDT_PALETTECOLOR) { lpColorMap = FrameCopyColorMap(TypeInfo.ColorMap); if (!lpColorMap) { Message(IDS_EMEMALLOC); return(SC_MEMERROR); } LineCalMapProc(0, 0, lpColorMap->NumEntries-1, (LPTR)lpColorMap->RGBData, (LPTR)lpColorMap->RGBData, 3, lpMaps); StatusCode = ApplyColorMap(lpImage, lpColorMap, FALSE, DT_NONE, dirty); FrameDestroyColorMap(lpColorMap); if (StatusCode == SC_SUCCESS) *lpUpdateType = UT_DATATYPE; } else { SetEngineDef(&Engine); Engine.lpDataProc = (LPDATAPROC)LineCalMapProc; Engine.lpParam = lpMaps; StatusCode = LineEngineSelObj(lpImage, &Engine, dirty); if (!AstralIsRectEmpty(&Engine.rUpdate)) { *lpUpdateRect = Engine.rUpdate; *lpUpdateType = UT_AREA; } } FreeUp(lpMaps); return(StatusCode); }