//--------------------------------------------------------------------------- #include #pragma hdrstop #include "MarkMoveCopy.h" #include "MainImage.h" #include "Palette.h" #include "Undo.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_MCMARK StringTable[0] #define IDS_MCMARK_YARN StringTable[1] //--------------------------------------------------------------------------- TMarkMoveCopyForm *MarkMoveCopyForm; //--------------------------------------------------------------------------- __fastcall TMarkMoveCopyForm::TMarkMoveCopyForm(TComponent* Owner) : TForm(Owner) { hWnd = ((TWinControl *)Owner)->Handle; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::stItemClick(TObject *Sender) { if (Item) { Item = 0; stItem->Caption = IDS_MCMARK; } else { Item = 1; stItem->Caption = IDS_MCMARK_YARN; } SetMoveCopyImage(); if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); IsDraw = false; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::sbMoveCopyClick(TObject *Sender) { TSpeedButton *s = (TSpeedButton *)Sender; SubItem = s->Tag; if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); IsDraw = false; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::sbMCTypeClick(TObject *Sender) { TSpeedButton *sp = (TSpeedButton *)Sender; MCItem = sp->Tag; SetMoveCopyImage(); if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); IsDraw = false; } //--------------------------------------------------------------------------- ///// Private Method //////////////////////////////////////////////////////// //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::SetMoveCopyImage() { MBmp->Create(size.x, size.y, 8); ReadyToTempBitmap(MBmp, &MainImageForm->iMainImage->ArrayBitmap[1], false); if (Item) { YBmp->Create(size.x, size.y, 8); ReadyToTempBitmap(YBmp, &MainImageForm->iMainImage->ArrayBitmap[0], true); } } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::ReadyToTempBitmap(TPBitmap *pbmp, TTexpiaBitmap *tbmp, bool yarn) { Byte *SP, *DP; int x, y; Tdesign_mark Dmark = MainImageForm->Arrange->Dmark; if (!tbmp->StartScanLine()) goto fail; if (pbmp->Lock() == NULL) goto fail; switch (MCItem) { case 0: // Normal for (y = 0; y < size.y; y++) { SP = tbmp->GetScanLine(y + rect.top) + rect.left; DP = pbmp->ScanLine(y); memcpy(DP, SP, size.x*sizeof(Byte)); } break; case 1: // Mirror if (yarn) { for (y = 0; y < size.y; y++) { SP = tbmp->GetScanLine(y + rect.top) + rect.right - 1; DP = pbmp->ScanLine(y); for (x = 0; x < size.x; x++, SP--, DP++) { *DP = *SP; } } } else { for (y = 0; y < size.y; y++) { SP = tbmp->GetScanLine(y + rect.top) + rect.right - 1; DP = pbmp->ScanLine(y); for (x = 0; x < size.x; x++, SP--, DP++) { if ((*SP & 0x3F) > 1) { *DP = (*SP&0x80) ? (*SP&0x7F) : ((*SP&0x7F) | 0x80); } else { *DP = *SP; } if (Dmark.sp[*SP&0x3F]->wale == 1) *DP = *SP; } } } break; case 2: // Up / Down for (y = 0; y < size.y; y++) { SP = tbmp->GetScanLine(rect.bottom - 1 - y) + rect.left; DP = pbmp->ScanLine(y); memcpy(DP, SP, size.x*sizeof(Byte)); } if (!yarn) { for (y=0; yScanLine(y); for (x=0; x 1) && ((*DP & 0x80) == 0) && (Dmark.sp[(*DP & 0x3F)]->wale == 1) && (Dmark.sp[(*DP & 0x3F)]->course > 1)) { for (int dy=0; dycourse; dy++) { DP = pbmp->ScanLine(y-Dmark.sp[(*DP & 0x3F)]->course+1+dy)+x; *DP = (dy) ? ((*DP&0x7F) | 0x80): (*DP&0x7F); } } } } } break; case 3: // UpDown / Mirror if (yarn) { for (y = 0; y < size.y; y++) { SP = tbmp->GetScanLine(rect.bottom - 1 - y) + rect.right - 1; DP = pbmp->ScanLine(y); for (x = 0; x < size.x; x++, SP--, DP++) { *DP = *SP; } } } else { for (y = 0; y < size.y; y++) { SP = tbmp->GetScanLine(rect.bottom - 1 - y) + rect.right - 1; DP = pbmp->ScanLine(y); for (x = 0; x < size.x; x++, SP--, DP++) { if ((*SP & 0x3F) > 1) { *DP = (*SP&0x80) ? (*SP&0x7F) : ((*SP&0x7F) | 0x80); } else { *DP = *SP; } if (Dmark.sp[*SP&0x3F]->wale == 1) *DP = *SP; } } for (y=0; yScanLine(y); for (x=0; x 1) && ((*DP & 0x80) == 0) && (Dmark.sp[(*DP & 0x3F)]->wale == 1) && (Dmark.sp[(*DP & 0x3F)]->course > 1)) { for (int dy=0; dycourse; dy++) { DP = pbmp->ScanLine(y-Dmark.sp[(*DP & 0x3F)]->course+1+dy)+x; *DP = (dy) ? ((*DP&0x7F) | 0x80): (*DP&0x7F); } } } } } break; } pbmp->Unlock(); tbmp->StopScanLine(); // MainImageForm->iMainImage->SetMark(); //??????????????????????????????? return; fail: tbmp->StopScanLine(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::CalculatePosition(int x, int y) { start.x = x - size.x / 2; if (start.x < 0) start.x = 0; if (start.x + size.x > width) start.x = width - size.x; start.y = y - size.y / 2; if (start.y < 0) start.y = 0; if (start.y + size.y > height) start.y = height - size.y; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::DrawImage() { Byte *SP, *DP; int x, y; TTexpiaBitmap *Bitmap; Bitmap = &MainImageForm->iMainImage->ArrayBitmap[1]; if (!Bitmap->StartScanLine()) goto fail; if ((MBmp->Lock()) == NULL) goto fail; for (y = 0; y < size.y; y++) { DP = Bitmap->GetScanLine(start.y + y) + start.x; SP = MBmp->ScanLine(y); memcpy(DP, SP, size.x * sizeof(Byte)); Bitmap->PutScanLine(start.y + y); } MBmp->Unlock(); Bitmap->StopScanLine(); if (Item) { Bitmap = &MainImageForm->iMainImage->ArrayBitmap[0]; if (!Bitmap->StartScanLine()) goto fail; if ((YBmp->Lock()) == NULL) goto fail; for (y = 0; y < size.y; y++) { DP = Bitmap->GetScanLine(start.y + y) + start.x; SP = YBmp->ScanLine(y); memcpy(DP, SP, size.x * sizeof(Byte)); Bitmap->PutScanLine(start.y + y); } YBmp->Unlock(); Bitmap->StopScanLine(); } return; fail: Bitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::ArrangeCrossData() { Byte *IP; int dex, y, xx, yy, i, j, k; TTexpiaBitmap *bmp = &MainImageForm->iMainImage->ArrayBitmap[1]; dex = start.x + size.x - 1; if (!bmp->StartScanLine()) goto fail; for (y = 0; y < size.y; y++) { IP = bmp->GetScanLine(start.y + y) + start.x; if ((*IP & 0x3F) > 1) { if (*IP & 0x80) { xx = MainImageForm->Arrange->Dmark.sp[*IP & 0x3F]->wale; yy = MainImageForm->Arrange->Dmark.sp[*IP & 0x3F]->course; for (i = 1; i < xx; i++) { if ((*(IP - i) & 0x80) == 0) { for (j = 0; j < yy; j++) { IP = bmp->GetScanLine(start.y + y + j) + start.x - i; memset(IP, 0, xx); bmp->PutScanLine(start.y + y); } break; } } } } IP = bmp->GetScanLine(start.y + y) + dex; if ((*IP & 0x3F) > 1) { xx = MainImageForm->Arrange->Dmark.sp[*IP & 0x3F]->wale; yy = MainImageForm->Arrange->Dmark.sp[*IP & 0x3F]->course; for (i = 0; i < xx; i++) { if ((*(IP - i) & 0x80) == 0) { for (j = 0; j < yy; j++) { IP = bmp->GetScanLine(start.y + y + j) + dex - i; memset(IP, 0, xx); bmp->PutScanLine(start.y + y + j); } break; } } } } bmp->StopScanLine(); return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- ///// Public Method //////////////////////////////////////////////////////// //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::InitForm() { ParentHeight = Parent->Height+20; ClientHeight = 107; Parent->Height = ParentHeight+ClientHeight; //================================================================== StringTable.Create(DirectoryItem, Language, "MarkMoveCopy"); SetSmallFont(Font); SetSmallFont(stItem->Font); stItem->Caption = IDS_MCMARK; sbCopy->Caption = IDS_COMMON_COPY; sbMove->Caption = IDS_COMMON_MOVE; sbNormal->Caption = IDS_COMMON_NORMAL; sbUDMirror->Caption = IDS_COMMON_UPDOWNMIRROR; sbUpDown->Caption = IDS_COMMON_UPDOWN; sbMirror->Caption = IDS_COMMON_MIRROR; //================================================================== Item = SubItem = MCItem = 0; rect = MainImageForm->WorkArea->Range; size = Point (rect.right - rect.left, rect.bottom - rect.top); width = MainImageForm->iMainImage->Bitmap->Width; height = MainImageForm->iMainImage->Bitmap->Height; MBmp = new TPBitmap; YBmp = new TPBitmap; IsDraw = false; SetMoveCopyImage(); } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::ExitForm() { if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); ::RepaintImage(); ::doDestroy(YBmp); ::doDestroy(MBmp); } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::MoveCopyMouseDown(int X, int Y) { bool undo = false; RECT rc; if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); IsDraw = false; if (Item) { if (!(undo = MainImageForm->UndoSave(UK_ALL | UK_MARK, Rect(0, 0, width, height), true))) goto fail; } else { if (!(undo = MainImageForm->UndoSave(UK_WORKAREA | UK_MARK, Rect(0, 0, width, height), true))) goto fail; } // ArrangeCrossData(); rc = Rect(start.x, start.y, start.x+size.x, start.y+size.y); MainImageForm->check(start.x, start.y, size.x, size.y, &rc); if (SubItem) { if (Item) MainImageForm->iMainImage->ArrayBitmap[0].FillRect(rect, PaletteForm->DIB256Palette->GetBGCOLORREF(8)); MainImageForm->iMainImage->ArrayBitmap[1].FillRect(rect, 0); MainImageForm->iMainImage->SetMark(rect); } DrawImage(); MainImageForm->iMainImage->SetMark(rc); //7.41 ::RepaintImage(); if (SubItem) { MainImageForm->WorkArea->PushUndo(); MainImageForm->WorkArea->ResetRegion(MainImageForm->iMainImage); MainImageForm->WorkArea->SetShapeRegion(MainImageForm->iMainImage, Point(Temp.left, Temp.top), Point(Temp.right- 1, Temp.bottom - 1), false); ::RepaintImage(); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } return; fail: if (undo) Undo->RemoveLast(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::MoveCopyMouseMove(int X, int Y) { if (IsDraw) { MainImageForm->DrawRectangleLocate(Temp); IsDraw = false; } CalculatePosition(X, Y); Temp.left = start.x; Temp.top = start.y; Temp.right = start.x + size.x; Temp.bottom = start.y + size.y; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::iMainImageChange() { if (IsDraw) IsDraw = false; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::iMainImagePaint() { IsDraw = false; } //--------------------------------------------------------------------------- void __fastcall TMarkMoveCopyForm::iMainImageMouseLeave(){ if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); IsDraw = false; } //---------------------------------------------------------------------------