LPOBJECT ObjGetSelectedObject(LPOBJECTLIST lpObjList, LPOBJECT lpObject, BOOL fBottomUp) /************************************************************************/ { lpObject = ObjGetNextObject(lpObjList, lpObject, fBottomUp); while (lpObject && !lpObject->fSelected) lpObject = ObjGetNextObject(lpObjList, lpObject, fBottomUp); return(lpObject); }
BOOL CImage::DuplicateSelObjects() { LPOBJECT lpDupObject; OBJECTLIST DupList; LPOBJECT lpObject; RECT rUpdate; WORD wGroupID, wOldGroupID, wLastGroupID; if (!ImgEditInit( this, ET_OBJECT, UT_DELETEOBJECTS, GetBase() )) return(FALSE); DupList.lpHead = DupList.lpTail = NULL; lpObject = NULL; while (lpObject = GetSelObject(lpObject)) { if (!(lpDupObject = ObjDuplicateObject(lpObject))) { ObjDeleteObjects(&DupList, ST_ALL); return(FALSE); } ObjAddTail(&DupList, (LPPRIMOBJECT)lpDupObject); } wLastGroupID = wGroupID = GetNextGroupID(); lpDupObject = NULL; while (lpDupObject = (LPOBJECT)ObjGetNextObject(&DupList, (LPPRIMOBJECT)lpDupObject, YES)) { if (!lpDupObject->wGroupID || lpDupObject->wGroupID >= wLastGroupID) continue; wOldGroupID = lpDupObject->wGroupID; lpDupObject->wGroupID = wGroupID; lpObject = lpDupObject; while (lpObject = (LPOBJECT)ObjGetNextObject(&DupList, (LPPRIMOBJECT)lpObject, YES)) { if (lpObject->wGroupID == wOldGroupID) lpObject->wGroupID = wGroupID; } ++wGroupID; } RemoveObjectMarquee(this); ObjDeselectAll(&ObjList); while (lpObject = (LPOBJECT)ObjGetNextObject(&DupList, NULL, YES)) { ObjUnlinkObject(&DupList, (LPPRIMOBJECT)lpObject); ObjSelectObject( (LPPRIMOBJECT)lpObject, YES ); // Select the new object ObjAddTail( &ObjList, (LPPRIMOBJECT)lpObject ); // Add to the image's list lpObject->fUndoDeleted = YES; } ImgEditedObject(this, GetBase(), IDS_UNDODUPLICATE, NULL); GetSelObjectRect(&rUpdate, NO); UpdateImage(this, &rUpdate, YES); SetupMiniViews(NULL, NO); return(TRUE); }
LPOBJECT CImage::GetNextObject(LPOBJECT lpObject, BOOL fBottomUp, BOOL fLoop, BOOL fGetDeletedObjects) { LPOBJECT lpNextObject = NULL; lpNextObject = (LPOBJECT)ObjGetNextObject(&ObjList, (LPPRIMOBJECT)lpObject, fBottomUp); while (lpNextObject && (lpNextObject->ObjectType != OT_FRAME || (lpNextObject->fDeleted && !fGetDeletedObjects))) lpNextObject = (LPOBJECT)ObjGetNextObject(&ObjList, (LPPRIMOBJECT)lpNextObject, fBottomUp); if (fLoop && !lpNextObject) { lpNextObject = (LPOBJECT)ObjGetNextObject(&ObjList, NULL, fBottomUp); while (lpNextObject && (lpNextObject->ObjectType != OT_FRAME || (lpNextObject->fDeleted && !fGetDeletedObjects))) lpNextObject = (LPOBJECT)ObjGetNextObject(&ObjList, (LPPRIMOBJECT)lpNextObject, fBottomUp); } return(lpNextObject); }
BOOL ReadObjData( LPSTR lpFileName, LPOBJECTLIST lpObjList, int outDepth, LPINT lpDataType, LPRECT lpScaleRect, LPINT lpFullFileX, LPINT lpFullFileY, LPINT lpFullResolution) /************************************************************************/ { LPFRAME lpFrame; LPOBJECT lpObject; int ifh; LPLONG lngptr; LPWORD shtptr; int nObjects, i, idFileType, nPasses; WORD wBytes, wByteOrder, wVersion; long lObjSize, lObjStart; LPOBJOFFSETS lpOffsets; OBJECT Obj; LFIXED xrate, yrate; int opix, olin, baseW, baseH; LPRECT lpLoadRect; xrate = yrate = UNITY; lpOffsets = NULL; if ( !lpObjList ) return( FALSE ); lpObjList->lpHead = lpObjList->lpTail = NULL; if ( (ifh = _lopen(lpFileName, OF_READ)) < 0) { Message( IDS_EOPEN, lpFileName ); return( FALSE ); } // Read in header info wBytes = OBJ_HDR_SIZE; if ( _lread(ifh, LineBuffer[0], wBytes) != wBytes ) goto BadRead; shtptr = (LPWORD)LineBuffer[0]; wByteOrder = GetNextWord(&shtptr); /* byte order is LSB,MSB */ if (wByteOrder != TIF_II && wByteOrder != TIF_MM) goto BadRead; wVersion = GetNextWord(&shtptr); /* Version Number */ nObjects = GetNextWord(&shtptr); /* Number of Objects */ lngptr = (LPLONG)shtptr; lObjSize = GetNextLong(&lngptr); /* size of object data */ lObjStart = GetNextLong(&lngptr); /* start of object data */ if (!(lpOffsets = (LPOBJOFFSETS)Alloc(sizeof(OBJOFFSETS)*nObjects))) { Message(IDS_EMEMALLOC); return(FALSE); } _llseek (ifh, lObjStart, 0); wBytes = (WORD)lObjSize; nPasses = 0; for (i = 0; i < nObjects; ++i) { if ( _lread(ifh, LineBuffer[0], wBytes) != wBytes ) goto BadRead; shtptr = (LPWORD)LineBuffer[0]; Obj.ObjectType = (OBJECT_TYPE)GetNextWord(&shtptr); Obj.rObject.left = GetNextWord(&shtptr); Obj.rObject.top = GetNextWord(&shtptr); Obj.rObject.right = GetNextWord(&shtptr); Obj.rObject.bottom = GetNextWord(&shtptr); Obj.Opacity = GetNextWord(&shtptr); Obj.MergeMode = (MERGE_MODE)GetNextWord(&shtptr); Obj.wGroupID = GetNextWord(&shtptr); if (i==0 && lpScaleRect) { opix = RectWidth(lpScaleRect); olin = RectHeight(lpScaleRect); baseW = RectWidth(&Obj.rObject); baseH = RectHeight(&Obj.rObject); xrate = ScaleToFit(&opix, &olin, baseW, baseH); if (opix > baseW || olin > baseH) { // No upsizing allowed opix = baseW; olin = baseH; } xrate = FGET( opix, baseW ); yrate = FGET( olin, baseH ); } // scale the object rect Obj.rObject.left = FMUL(Obj.rObject.left, xrate); Obj.rObject.top = FMUL(Obj.rObject.top, yrate); Obj.rObject.right = FMUL(Obj.rObject.right, xrate); Obj.rObject.bottom = FMUL(Obj.rObject.bottom, yrate); if (!(lpObject = ObjCreateFromFrame(ST_PERMANENT, NULL, NULL, &Obj.rObject, Control.NoUndo))) { Message(IDS_EMEMALLOC); goto BadRead; } idFileType = GetNextWord(&shtptr); lpOffsets[i].bInvert = GetNextWord(&shtptr); lpOffsets[i].rMask.left = GetNextWord(&shtptr); lpOffsets[i].rMask.top = GetNextWord(&shtptr); lpOffsets[i].rMask.right = GetNextWord(&shtptr); lpOffsets[i].rMask.bottom = GetNextWord(&shtptr); // scale the mask rect lpOffsets[i].rMask.left = FMUL(lpOffsets[i].rMask.left, xrate); lpOffsets[i].rMask.top = FMUL(lpOffsets[i].rMask.top, yrate); lpOffsets[i].rMask.right = FMUL(lpOffsets[i].rMask.right, xrate); lpOffsets[i].rMask.bottom = FMUL(lpOffsets[i].rMask.bottom, yrate); lngptr = (LPLONG)shtptr; lpOffsets[i].lDataOffset = GetNextLong(&lngptr); lpOffsets[i].lAlphaOffset = GetNextLong(&lngptr); shtptr = (LPWORD)lngptr; // versions after 1.1 saved selected state if (wVersion == 0x0101) Obj.fSelected = NO; else Obj.fSelected = GetNextWord(&shtptr); if (wVersion < 0x0103 || lObjSize == 41) { Obj.ObjectDataID = OBJECT_DATA_NONE; Obj.dwObjectData = 0; } else { Obj.ObjectDataID = GetNextWord(&shtptr); Obj.dwObjectData = *(LPDWORD)shtptr; shtptr += 2; } lpObject->ObjectType = Obj.ObjectType; lpObject->Opacity = Obj.Opacity; lpObject->MergeMode = Obj.MergeMode; lpObject->wGroupID = Obj.wGroupID; lpObject->fSelected = Obj.fSelected; lpObject->ObjectDataID = Obj.ObjectDataID; lpObject->dwObjectData = Obj.dwObjectData; ObjAddTail(lpObjList, (LPPRIMOBJECT)lpObject); ++nPasses; if (lpOffsets[i].lAlphaOffset) ++nPasses; } ProgressBegin(nPasses, 0); lpObject = NULL; i = 0; while (lpObject = (LPOBJECT)ObjGetNextObject(lpObjList, (LPPRIMOBJECT)lpObject, YES)) { if (lpScaleRect && i!=0) { lpLoadRect = &lpObject->rObject; } else lpLoadRect = lpScaleRect; _llseek (ifh, lpOffsets[i].lDataOffset, 0); lpFrame = ReadTiffData(ifh, lpFileName, outDepth, lpDataType, NO/*bReadOnly*/, lpLoadRect, NO, lpFullFileX, lpFullFileY, lpFullResolution); if (i == 0) { lpDataType = NULL; lpFullFileX = NULL; lpFullFileY = NULL; lpFullResolution = NULL; } if (!lpFrame) goto BadRead; PixmapSetup(&lpObject->Pixmap, lpFrame, Control.NoUndo); if (!lpOffsets[i].lAlphaOffset) { ++i; continue; } _llseek (ifh, lpOffsets[i].lAlphaOffset, 0); lpFrame = ReadTiffData(ifh, lpFileName, outDepth, lpDataType, NO/*bReadOnly*/, lpLoadRect, NO, NULL, NULL, NULL); if (!lpFrame) goto BadRead; lpObject->lpAlpha = MaskCreate(lpFrame, 0, 0, OFF, Control.NoUndo); if (!lpObject->lpAlpha) { Message(IDS_EMEMALLOC); goto BadRead; } lpObject->lpAlpha->bInvert = lpOffsets[i].bInvert; lpObject->lpAlpha->rMask = lpOffsets[i].rMask; ++i; } if ( lpOffsets ) FreeUp( (LPTR)lpOffsets ); _lclose(ifh); ProgressEnd(); return( TRUE ); BadRead: while (lpObject = (LPOBJECT)ObjGetNextObject(lpObjList, NULL, YES)) { ObjUnlinkObject(lpObjList, (LPPRIMOBJECT)lpObject); ObjFreeUp(lpObject); } _lclose(ifh); if ( lpOffsets ) FreeUp( (LPTR)lpOffsets ); if (nPasses) ProgressEnd(); Message( IDS_EREAD, lpFileName ); return( FALSE ); }