//--------------------------------------------------------------------------- #include #include "Exception.h" #pragma hdrstop #include "SimpleUndo.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- TSimpleUndo *SimpleUndo; //--------------------------------------------------------------------------- // TSimpleUndoData //--------------------------------------------------------------------------- __fastcall TSimpleUndoData::TSimpleUndoData() { if ((Bitmap = new TTexpiaBitmap) == NULL) { #ifdef TPDEBUG SHOWDEBUG; #endif } Region = NULL; } //--------------------------------------------------------------------------- __fastcall TSimpleUndoData::~TSimpleUndoData() { if (Region) { DeleteObject(Region); Region = NULL; } delete Bitmap; } //--------------------------------------------------------------------------- // TSimpleUndo //--------------------------------------------------------------------------- __fastcall TSimpleUndo::TSimpleUndo() { if ((DataList = new TList) == NULL) { #ifdef TPDEBUG SHOWDEBUG; #endif } } //--------------------------------------------------------------------------- __fastcall TSimpleUndo::~TSimpleUndo() { TSimpleUndoData *data; while (DataList->Count>0) { data = (TSimpleUndoData *)DataList->Last(); DataList->Remove(data); delete data; } delete DataList; } //--------------------------------------------------------------------------- // Private Function //--------------------------------------------------------------------------- TSimpleUndoData *__fastcall TSimpleUndo::GetLast() { if (DataList->Count > 0) return (TSimpleUndoData *)DataList->Last(); return NULL; } //--------------------------------------------------------------------------- void __fastcall TSimpleUndo::SaveData(RECT r) { TSimpleUndoData *data; RGBQUAD rgb[256]; BITMAPHANDLE *bh; RGNXFORM XForm; data = new TSimpleUndoData; if (data) { data->Range = r; if (data->Bitmap->Create(r.right-r.left, r.bottom-r.top, Bitmap->BitsPerPixel)==false) goto fail; Bitmap->GetColors(0, 256, rgb); data->Bitmap->PutColors(0, 256, rgb); data->Bitmap->CopyFromRect(Bitmap, r.left, r.top, SRCCOPY); if (WorkArea) { bh = Bitmap->Handle; if (bh) { if (L_BitmapHasRgn(bh)) { XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; L_GetBitmapRgnHandle(bh, &XForm, &data->Region); } } } DataList->Add(data); } return; fail: if (data) delete data; } //--------------------------------------------------------------------------- // Public Function //--------------------------------------------------------------------------- void __fastcall TSimpleUndo::Set(TTexpiaBitmap *bitmap, TPWorkArea *workarea) { Bitmap = bitmap; WorkArea = workarea; } //--------------------------------------------------------------------------- void __fastcall TSimpleUndo::RemoveAll() { for (int i=0; iCount;) { TSimpleUndoData *data = (TSimpleUndoData *)DataList->Items[i]; DataList->Remove(data); delete data; } } //--------------------------------------------------------------------------- void __fastcall TSimpleUndo::Read(RECT r) { TSimpleUndoData *data = NULL; RGBQUAD rgb[256]; RGNXFORM XForm; SaveData(r); if (DataList->Count == 2) { data = (TSimpleUndoData *)DataList->Items[0]; if (data) { data->Bitmap->GetColors(0, 256, rgb); Bitmap->PutColors(0, 256, rgb); Bitmap->CopyToRect(data->Range.left, data->Range.top, data->Bitmap, SRCCOPY); if (WorkArea) { if (data->Region) { XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; L_SetBitmapRgnHandle(Bitmap->Handle, &XForm, data->Region, L_RGN_SET); WorkArea->SetMask(data->Region); } else { WorkArea->Reset(); } } DataList->Remove(data); delete data; } } } //--------------------------------------------------------------------------- void __fastcall TSimpleUndo::Save(RECT r) { RemoveAll(); SaveData(r); } //---------------------------------------------------------------------------