//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "PenManager.h" // by ceelberus #include "MoveCopy_F.h" #include "FullView.h" #include "MainImage.h" #include "Palette.h" #include "Rotation.h" #include "StatusProgress.h" #include "Undo.h" #include "MainMenu.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "RXCtrls" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_ROTATE StringTable[0] #define IDS_BEND StringTable[1] #define IDS_BEFOREDEGREE StringTable[2] #define IDS_ROTATEMIRROR StringTable[3] #define IDS_ROTOTEPREVIEW StringTable[4] #define IDS_EXPANSION StringTable[5] //--------------------------------------------------------------------------- TMoveCopyForm *MoveCopyForm; //--------------------------------------------------------------------------- __fastcall TMoveCopyForm::TMoveCopyForm(TComponent* Owner) : TForm(Owner) { hWnd = ((TWinControl *)Owner)->Handle; //============================================================== StringTable.Create(DirectoryCommon, Language, "MoveCopy"); SetSmallFont(Font); SetSmallFont(Label1->Font); sbCopy->Caption = IDS_COMMON_COPY; sbMove->Caption = IDS_COMMON_MOVE; sbNormal->Caption = IDS_COMMON_NORMAL; sbTBLRMirror->Caption = IDS_COMMON_UPDOWNMIRROR; sbTBMirror->Caption = IDS_COMMON_UPDOWN; sbRotate->Caption = IDS_ROTATE; sbLRMirror->Caption = IDS_COMMON_MIRROR; sbBend->Caption = IDS_BEND; sbRotatingMirror->Caption = IDS_ROTATEMIRROR; Label1->Caption = IDS_COMMON_ANGLE; btnRotateRun->Caption = IDS_COMMON_RUN; sbBeforeDeg->Hint = IDS_BEFOREDEGREE; sbRotatingMirror->Caption = IDS_ROTATEMIRROR; RotatePreView->Caption = IDS_ROTOTEPREVIEW; cbExp->Caption = IDS_EXPANSION; //============================================================== } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::FormCreate(TObject *Sender) /* TODO : FormDestroy´Â ¾ø³ª? */ { MousePointPlace = Center; window.Bitmap = NULL; window.Mask = NULL; waItr = NULL; windowItr = NULL; } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::TypeClick(TObject *Sender) { TSpeedButton *s = 0; TPItemImage *Image = MainImageForm->iMainImage; if (backup) { // rotatebackÀ» ÀúÀåÇßÀ¸¸é.. mcStatus.cancelMCStep(STRotating); BackToBeforeRotate(); mcStatus.setExp(cbExp->Checked); } MainImageForm->ResetDraw(true); IsDraw = false; mpPanel->Visible = true; mpPanel->Top = 171; s = (TSpeedButton *)Sender; if (s == sbNormal) { mcStatus.setMCType(MCNormal); } else if (s == sbTBMirror) { mcStatus.setMCType(MCTBMirror); } else if (s == sbLRMirror) { mcStatus.setMCType(MCLRMirror); } else if (s == sbTBLRMirror) { mcStatus.setMCType(MCTBLRMirror); } else if (s == sbRotate) { mcStatus.setMCType(MCRotate); rgBendType->Visible = false; //by hjs rotate¿¡¼­ ÀÌÀü °¢µµ ±â¾ï mcStatus.setMCStep(STRotating); sw = false; } else if (s == sbRotatingMirror) { mcStatus.setMCType(MCRotatingMirror); rgBendType->Visible = false; //by hjs rotate¿¡¼­ ÀÌÀü °¢µµ ±â¾ï mcStatus.setMCStep(STRotating); sw = false; } else if (s == sbBend) { rgBendType->Visible = true; // mcStatus.setMCType(MCBend); Csx = window.s.x + window.size.x / 2.0; Csy = window.s.y + window.size.y / 2.0; Dsx = Csx; Dsy = Csy; tR = 0; Sign = 0; Theta = 0; mcStatus.setMCStep(STRotating); } if (mcStatus.isRotatingType()) { /* TODO : ¿ø·¡ ȸÀü ŸÀÔ¿¡¼­´Â TMC_NONEÀ¸·Î ¸¸µé¾î³õ°í SetMoveCopyImage ÇÑ ´ÙÀ½ MCItemÀ» ¹Ù²Ù°í ÇÔ¼ö ¸¶Áö¸·ÀÇ SetMoveCopyImage¸¦ ´Ù½Ã È£ÃâÇÏ´Â Æíº±À» »ç¿ëÇß¾ú´Ù */ Image->SubVisible = false; // New ClientHeight = 215; Parent->Height = ParentHeight+ClientHeight; mpPanel->Visible = false; if (s == sbBend) { RotatePanel->Visible = false; rgBendType->Visible = true; } else { rgBendType->Visible = false; RotatePanel->Visible = true; if (cbExp->Checked) { sbBeforeDeg->Enabled = false; cbRotate->Enabled = false; btnRotateRun->Enabled = false; } else { sbBeforeDeg->Enabled = true; cbRotate->Enabled = true; btnRotateRun->Enabled = true; } } repaintsw = false; RotatePreView->Enabled = true; } else { ClientHeight = 280; Parent->Height = ParentHeight + ClientHeight; RotatePreView->Enabled = false; } if (mcStatus.getImgState() != HasOriginal || !mcStatus.hasSameImageInWA() || mcStatus.isSymmetryType()) { if (mcStatus.isRotatingType()) { TMCType oldMCType = mcStatus.getMCType(); mcStatus.setMCType(MCNormal); InitRange(); SetMoveCopyImage(); mcStatus.setMCType(oldMCType); mcStatus.setMCStep(STRotating); } else { InitRange(); SetMoveCopyImage(); } } if (cbExp->Checked) { mcStatus.setExp(true); mcStatus.setMCStep(STExpending); } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::FunctionClick(TObject *Sender) { TSpeedButton *s = 0; /* mcStatus.setExp(cbExp->Checked); if (cbExp->Checked){ sbBeforeDeg->Enabled = false; cbRotate->Enabled = false; btnRotateRun->Enabled = false; } */ // MainImageForm->ResetDraw(true); /* TODO : ResetDraw°¡ ÇÊ¿äÇÑ ÀÌÀ¯?? */ // IsDraw = false; s = (TSpeedButton *)Sender; if (s == sbCopy) { mcStatus.setIsMove(false); } else if (s == sbMove) { mcStatus.setIsMove(true); } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::rgBendTypeClick(TObject *Sender) { TPItemImage *Image = MainImageForm->iMainImage; /* TODO : ¾îµð¼­ ºÒ¸®´ÂÁö ¸ð¸§ */ TypeClick(sbBend); MainImageForm->ResetDraw(true); Csx = window.s.x + window.size.x / 2.0; Csy = window.s.y + window.size.y / 2.0; Dsx = Csx; Dsy = Csy; tR = 0; Sign = 0; Theta = 0; mcStatus.setMCStep(STRotating); IsDraw = false; SetMoveCopyImage(); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::btnRotateRunClick(TObject *Sender) { TCursor OldCursor; /* TODO : Rotate Çϸ鼭 º¸ÀÚ */ TUnionBitmap *Lmp, *Bmp = NULL; // convert by celberus COLORREF C; TPItemImage *Image = MainImageForm->iMainImage; pBITMAPHANDLE bh = MainImageForm->iMainImage->uBitmap->RgnBitmap->Handle; // convert by celberus int cnt = Image->LayerList->Count; cbExp->SetFocus(); OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; if ((0 <= StrToFloat(cbRotate->Text)) && (360 > StrToFloat(cbRotate->Text))) { mcStatus.setMCStep(STRotating); if(mcStatus.getMCType() == MCRotate){ RunData(); } else if(mcStatus.getMCType() == MCRotatingMirror) { RunDataRotatingMirror(); } sbBeforeDeg->Enabled = false; cbRotate->Enabled = false; btnRotateRun->Enabled = false; IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo mcStatus.setMCStep(STPutting); //¿øº» ³Ö±â BackToBeforeRotate(); //¿øº» ³Ö±â } Screen->Cursor = OldCursor; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RunData() { /* TODO : Rotate Çϸ鼭 º¸ÀÚ */ TRotation *Trans = NULL; TPoint Cen; Cen.x = window.s.x + window.size.x / 2; Cen.y = window.s.y + window.size.y / 2; if ((Trans = new TRotation) == NULL) {EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return;} Theta = DegToRad((Extended)StrToFloat(cbRotate->Text)); Trans->translation(-Cen.x, -Cen.y); Trans->rotation(-Theta); Trans->convert(window.s.x, window.s.y, sx[0], sy[0]); sx[0] = sx[0] + Cen.x; sy[0] = sy[0] + Cen.y; Trans->convert(window.s.x, window.e.y, sx[1], sy[1]); sx[1] = sx[1] + Cen.x; sy[1] = sy[1] + Cen.y; Trans->convert(window.e.x, window.s.y, sx[2], sy[2]); sx[2] = sx[2] + Cen.x; sy[2] = sy[2] + Cen.y; Trans->convert(window.e.x, window.e.y, sx[3], sy[3]); sx[3] = sx[3] + Cen.x; sy[3] = sy[3] + Cen.y; max_x = sx[0]; min_x = max_x; max_y = sy[0]; min_y = max_y; delete Trans; Trans = 0; for (int i = 0; i <= 3; i++) { if (min_x >= sx[i]) min_x = sx[i]; else if (max_x <= sx[i]) max_x = sx[i]; if (min_y >= sy[i]) min_y = sy[i]; else if (max_y <= sy[i]) max_y = sy[i]; } RotateArea = Point(max_x-min_x+1, max_y-min_y+1); BeforeDeg = BeforeDeg1; BeforeDeg1 = StrToFloat(cbRotate->Text); MakeRotateImage(); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RunDataRotatingMirror() { TRotation *Trans = NULL; TPoint Cen; /* TODO : Rotate Çϸ鼭 º¸ÀÚ */ double r=sqrt(window.size.x*window.size.x+window.size.y*window.size.y); Cen.x = window.s.x + window.size.x / 2; Cen.y = window.s.y + window.size.y / 2; if ((Trans = new TRotation) == NULL) {EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return;} Theta = DegToRad((Extended)StrToFloat(cbRotate->Text)); Trans->translation(-Cen.x, -Cen.y); Trans->rotation(-2.0*Theta); Trans->convert(window.s.x, window.s.y, sx[0], sy[0]); sx[0] = sx[0] + Cen.x - r*sin(Theta); sy[0] = sy[0] + Cen.y - r*cos(Theta); Trans->convert(window.s.x, window.e.y, sx[1], sy[1]); sx[1] = sx[1] + Cen.x - r*sin(Theta); sy[1] = sy[1] + Cen.y - r*cos(Theta); Trans->convert(window.e.x, window.s.y, sx[2], sy[2]); sx[2] = sx[2] + Cen.x - r*sin(Theta); sy[2] = sy[2] + Cen.y - r*cos(Theta); Trans->convert(window.e.x, window.e.y, sx[3], sy[3]); sx[3] = sx[3] + Cen.x - r*sin(Theta); sy[3] = sy[3] + Cen.y - r*cos(Theta); max_x = sx[0] + r*sin(Theta); min_x = max_x; max_y = sy[0] + r*cos(Theta); min_y = max_y; delete Trans; Trans = 0; for (int i = 0; i <= 3; i++) { if (min_x >= sx[i] + r*sin(Theta)) min_x = sx[i] + r*sin(Theta); else if (max_x <= sx[i] + r*sin(Theta)) max_x = sx[i] + r*sin(Theta); if (min_y >= sy[i] + r*cos(Theta)) min_y = sy[i] + r*cos(Theta); else if (max_y <= sy[i] + r*cos(Theta)) max_y = sy[i] + r*cos(Theta); } RotateArea = Point(max_x-min_x+1, max_y-min_y+1); BeforeDeg = BeforeDeg1; BeforeDeg1 = StrToFloat(cbRotate->Text); MakeRotatingMirrorImage(); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::cbRotateDblClick(TObject *Sender) { TComboBox *s = (TComboBox *)Sender; s->SetFocus(); /* TODO : Rotate Çϸ鼭 º¸ÀÚ */ s->SelectAll(); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::iMainImageKeyDown(int Key){ if (Key == 122){ IsZKeyDown=true; } } void __fastcall TMoveCopyForm::iMainImageKeyUp(int Key){ // if (Key == 122){ if(IsZKeyDown){ if(Key != 229){ IsZKeyDown=false; } } // } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::cbRotateKeyPress(TObject *Sender, char &Key) { TComboBox *s = (TComboBox *)Sender; if (Key == 13) { if ((0 <= StrToFloat(s->Text)) && (360 > StrToFloat(s->Text))) { /* TODO : Rotate Çϸ鼭 º¸ÀÚ */ SelectNext((TWinControl *)Sender, true, true); Key = 0; } } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::sbBeforeDegClick(TObject *Sender) { cbRotate->Text = BeforeDeg; /* TODO : Rotate Çϸ鼭 º¸ÀÚ */ btnRotateRunClick(btnRotateRun); } //--------------------------------------------------------------------------- // Private Function //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::EraseWorkAreaIn() { int i, j; Byte *IP, *WP, *LP, wm; COLORREF color; TPItemImage *Image = MainImageForm->iMainImage; WAItr *waItr = NULL; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); color = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(color); } if (!waItr->startScanLine()) goto fail; StatusProgress->Maximum = window.size.y; for (i=0; iPosition = i; waItr->getScanLine(i); for (j=0; jisInArea(j)) { waItr->erasePixel(j); } } waItr->putScanLine(i); } StatusProgress->End(); waItr->stopScanLine(); Image->InitBackGround(0x02); /* TODO : ÀÌ°Ç ¿ÖÇϴ°ɱî */ if(waItr) delete waItr; return; fail: waItr->stopScanLine(); if(waItr) delete waItr; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SetSymmetryRect(int X, int Y) { TPItemImage *Image = MainImageForm->iMainImage; if (Image->SubRange.left < X) { paintrect.left = Image->SubRange.left; paintrect.right = X + Image->SubBitmap->Width; } else { paintrect.left = X; paintrect.right = Image->SubRange.left + Image->SubBitmap->Width; } if (paintrect.right > Image->uBitmap->Width) paintrect.right = Image->uBitmap->Width; if (Image->SubRange.top < Y) { paintrect.top = Image->SubRange.top; paintrect.bottom = Y + Image->SubBitmap->Height; } else { paintrect.top = Y; paintrect.bottom = Image->SubRange.top + Image->SubBitmap->Height; } if (paintrect.bottom > Image->uBitmap->Height) paintrect.bottom = Image->uBitmap->Height; Image->SubRange.left = X; MoveCopyRect.s.x = X; MoveCopyRect.e.x = MoveCopyRect.s.x + MoveCopyRect.size.x; Image->SubRange.top = Y; MoveCopyRect.s.y = Y; MoveCopyRect.e.y = MoveCopyRect.s.y + MoveCopyRect.size.y; Image->SubVisible = true; } // OK //--------------------------------------------------------------------------- bool __fastcall TMoveCopyForm::SymmetryMouseDown(int X, int Y) { int ww, hh, ec = EC_NONE; bool undoSw = false; RECT dstRect, rc; TPItemImage *Image = MainImageForm->iMainImage; int delta_x,delta_y; if(IsZKeyDown){ delta_x = (X-window.s.x); if(delta_x<0) delta_x = -delta_x; delta_y = (Y-window.s.y); if(delta_y<0) delta_y = -delta_y; if( delta_xAutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) { if(!(undoSw = MainImageForm->UndoSave(UK_ALL, dstRect))) //by linuxjun Undo_Method { ec = EC_MEMORY_LACK; goto fail;} MainImageForm->Undo->SaveData(MainImageForm->AutoRep_UndoRect()); //by linuxjun Undo_Method MainImageForm->Undo->SaveData(MainImageForm->WorkArea->Range); //by linuxjun Undo_Method }else{ if(!(undoSw = MainImageForm->UndoSave(UK_ALL, dstRect))) //by linuxjun Undo_Method { ec = EC_MEMORY_LACK; goto fail;} MainImageForm->Undo->SaveData(MainImageForm->WorkArea->Range); //by linuxjun Undo_Method } } else { dstRect = Rect(MoveCopyRect.s.x, MoveCopyRect.s.y, MoveCopyRect.e.x, MoveCopyRect.e.y); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) { if(!(undoSw = MainImageForm->UndoSave(UK_PATTERN, dstRect))) //zzzzzz { ec = EC_MEMORY_LACK; goto fail;} //zzzzzz MainImageForm->Undo->SaveData(MainImageForm->AutoRep_UndoRect()); //by linuxjun Undo_Method }else{ // if(!(undoSw = MainImageForm->UndoSave(UK_PATTERN, Rect(0,0,0,0) ))) //zzzzzz if(!(undoSw = MainImageForm->UndoSave(UK_PATTERN, dstRect))) //zzzzzz { ec = EC_MEMORY_LACK; goto fail;} //zzzzzz } } if (mcStatus.isMove()) { if(cbExp->Checked){ ExpbackRect1.left = window.s.x; ExpbackRect1.right = window.e.x; ExpbackRect1.top = window.s.y; ExpbackRect1.bottom = window.e.y; window.s.x = ExpbackRect.left; window.e.x = ExpbackRect.right; window.s.y = ExpbackRect.top; window.e.y = ExpbackRect.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; EraseWorkAreaIn(); window.s.x = ExpbackRect1.left; window.e.x = ExpbackRect1.right; window.s.y = ExpbackRect1.top; window.e.y = ExpbackRect1.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; }else { EraseWorkAreaIn(); } if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); if (!SymmetryMouseMove(X, Y)) { ec = EC_MEMORY_LACK; goto fail;} /* TODO : MouseDown¿¡¼­ MouseMove¸¦ ¿Ö ºÎ¸£³Ä±¸ ¿Ö? */ } if (FullViewForm->Super==sOverlap) { FullViewForm->ReadyToOverlapChange(Image->SubBitmap, Rect(MoveCopyRect.s.x, MoveCopyRect.s.y, MoveCopyRect.e.x, MoveCopyRect.e.y), MainImageForm->Palette->UseColor, false, Image->SubMask); } if(mcStatus.isMove()){ switch (mcStatus.getMCType()) { case MCRotate: case MCRotatingMirror: case MCBend: case MCNormal:/*z-keyº¹»ç½Ã ÀÛ¾÷±¸¿ª À̵¿ÀÇ ÀÌ»óÀ» ¼öÁ¤ÇϱâÀ§ÇÔ.*/ rc = Rect(X, Y, X + Image->SubBitmap->Width, Y + Image->SubBitmap->Height); MainImageForm->WorkArea->IrregularRegion(Image->SubMask, rc); MainImageForm->WorkAreaChange(); break; } } if ((ec = CopyToImage(X, Y)) != EC_NONE) goto fail; if (FullViewForm->Super==sOverlap && Image->uBitmap->BitsPerPixel == 8) { MainImageForm->Palette->ToRGBQUAD(rgb, 256); Image->ChangeRGBColors(rgb); window.Bitmap->PutColors(0, 256, rgb); window.Mask->PutColors(0, 256, rgb); } if (!MainImageForm->AutoRepeat) { // maybe problem is here!! MainImageForm->iMainImage->SubVisible = false; // by celberus ::RepaintImage(); } return true; fail: if (undoSw) MainImageForm->Undo->RemoveLast(); //Àӽ÷Π´ÝÀ½ ´Ù½Ã Ç®¾î zzzzzzzz EXCEPTION_MESSAGE_OK(ec); return false; } //--------------------------------------------------------------------------- TPException __fastcall TMoveCopyForm::CopyToImage(int X, int Y) { int i, j, ww, hh; Byte *WP, *WMP, mm; COLORREF color, IC, WC, bgc; TPItemImage *Image = MainImageForm->iMainImage; LineItr *lineItr; ww = Image->uBitmap->Width; hh = Image->uBitmap->Height; switch (Image->IsBackGround()) { case 0: if(MainImageForm->MaskArea) { lineItr = (LineItr *)new LineItr_Mask(Image); } else { lineItr = (LineItr *)new LineItr(Image); } break; case 1: if(MainImageForm->MaskArea) { lineItr = (LineItr *)new LineItr_Layer_Mask(Image); } else { lineItr = (LineItr *)new LineItr_Layer(Image); } break; default: return EC_MEMORY_LACK; } if (Image->uBitmap->BitsPerPixel==8) { lineItr->setColorProtected(MainImageForm->Protect); if (!lineItr->startScanLine()) goto fail; if (!Image->SubBitmap->StartScanLine()) goto fail; if (!Image->SubMask->StartScanLine()) goto fail; if (FullViewForm->Super==sOverlap) { MainImageForm->InitOverlap(); StatusProgress->Maximum = MoveCopyRect.size.y; for (i=0; iPosition = i; if (MoveCopyRect.s.y+i < 0 || MoveCopyRect.s.y+i >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y+i, MoveCopyRect.s.x, MoveCopyRect.size.x); WP = Image->SubBitmap->GetScanLine(i); WMP = Image->SubMask->GetScanLine(i); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; j= ww){ continue; } if (*WMP == 0) { if (lineItr->pickColor(MoveCopyRect.s.x + j) > 1) { color = MainImageForm->Overlap(lineItr->pickColor(MoveCopyRect.s.x + j), *WP); if (color==0xFF) { MainImageForm->ExitOverlap(); lineItr->stopScanLine(); Image->SubBitmap->StopScanLine(); Image->SubMask->StopScanLine(); window.Mask->StopScanLine(); if(lineItr) { delete lineItr; lineItr = NULL; } StatusProgress->End(); FullViewForm->ExitOverlapChange(); // Undo->Read(); //BeConverted by linuxjun Don't Forget!! Undo_Method MainImageForm->Undo->UndoRead(); //BeConverted by linuxjun Don't Forget!! Undo_Method ::RepaintColor(); return EC_COLOR_OVERFLOW; } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 lineItr->setBaseColor(color); lineItr->putPixel(MoveCopyRect.s.x + j); } } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 lineItr->copyPixel(MoveCopyRect.s.x + j, WP); } } } lineItr->putScanLine(MoveCopyRect.s.y+i, StartX+MoveCopyRect.s.x, EndX-StartX+1); } StatusProgress->End(); MainImageForm->ExitOverlap(); } else { StatusProgress->Maximum = MoveCopyRect.size.y; for (i=0; iPosition = i; if (MoveCopyRect.s.y+i < 0 || MoveCopyRect.s.y+i >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y+i, MoveCopyRect.s.x, MoveCopyRect.size.x); WP = Image->SubBitmap->GetScanLine(i); WMP = Image->SubMask->GetScanLine(i); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; j= ww){ continue; } if (*WMP == 0) {//////adsfadsf_Variable_Checked if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 lineItr->copyPixel(MoveCopyRect.s.x + j, WP); } } lineItr->putScanLine(MoveCopyRect.s.y+i, StartX+MoveCopyRect.s.x, EndX-StartX+1); } StatusProgress->End(); } lineItr->stopScanLine(); Image->SubBitmap->StopScanLine(); Image->SubMask->StopScanLine(); } else { bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); if (!lineItr->startScanLine()) goto fail; if (!Image->SubBitmap->StartScanLine()) goto fail; if (!Image->SubMask->StartScanLine()) goto fail; if (FullViewForm->Super==sOverlap) { MainImageForm->InitOverlap(); StatusProgress->Maximum = MoveCopyRect.size.y; for (i=0; iPosition = i; if (MoveCopyRect.s.y+i < 0 || MoveCopyRect.s.y+i >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y+i, MoveCopyRect.s.x, MoveCopyRect.size.x); WP = Image->SubBitmap->GetScanLine(i); WMP = Image->SubMask->GetScanLine(i); mm = 0x80; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; j= ww){ continue; } if ((*WMP&mm) == 0) { IC = lineItr->pickColor(MoveCopyRect.s.x + j); if (IC != bgc) { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 GetPixel24(WP, WC); color = MainImageForm->Overlap(IC, WC); lineItr->setBaseColor(color); lineItr->putPixel(MoveCopyRect.s.x + j); } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 lineItr->copyPixel(MoveCopyRect.s.x + j, WP); } } if (mm == 1) { mm = 0x80; WMP++; } else { mm >>= 1; } } lineItr->putScanLine(MoveCopyRect.s.y+i, StartX+MoveCopyRect.s.x, EndX-StartX+1); ////adsfadsf } StatusProgress->End(); MainImageForm->ExitOverlap(); } else { StatusProgress->Maximum = MoveCopyRect.size.y; for (i=0; iPosition = i; if (MoveCopyRect.s.y+i < 0 || MoveCopyRect.s.y+i >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y+i, MoveCopyRect.s.x, MoveCopyRect.size.x); WP = Image->SubBitmap->GetScanLine(i); WMP = Image->SubMask->GetScanLine(i); mm = 0x80; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; j= ww){ continue; } if ((*WMP&mm) == 0) { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 lineItr->copyPixel(MoveCopyRect.s.x + j, WP); } if (mm == 1) { mm = 0x80; WMP++; } else { mm >>= 1; } } lineItr->putScanLine(MoveCopyRect.s.y+i, StartX+MoveCopyRect.s.x, EndX-StartX+1); ////adsfadsf } StatusProgress->End(); } lineItr->stopScanLine(); Image->SubBitmap->StopScanLine(); Image->SubMask->StopScanLine(); } if(lineItr) { delete lineItr; lineItr = NULL; } return EC_NONE; fail: lineItr->stopScanLine(); Image->SubMask->StopScanLine(); Image->SubBitmap->StopScanLine(); if(lineItr) { delete lineItr; lineItr = NULL; } return EC_MEMORY_LACK; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::DrawLayerMask() { Byte *LP, *WP, mm; int i, j, ww, hh; TPItemImage *Image = MainImageForm->iMainImage; ww = Image->uBitmap->Width; hh = Image->uBitmap->Height; Image->SubMask->StartScanLine(); Image->LayerMask->StartScanLine(); if (Image->uBitmap->BitsPerPixel == 8) { for (i = 0; i < MoveCopyRect.size.y; i++) { if (MoveCopyRect.s.y+i < 0 || MoveCopyRect.s.y+i >= hh) continue; LP = Image->LayerMask->GetScanLine(MoveCopyRect.s.y+i) + MoveCopyRect.s.x; WP = Image->SubMask->GetScanLine(i); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j = 0; j < MoveCopyRect.size.x; j++, LP++, WP++) { //////adsfadsf_for//////adsfadsf_Variable_Checked if (MoveCopyRect.s.x+j < 0 || MoveCopyRect.s.x+j >= ww){ continue; } if (*WP == 0){ if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 *LP = 0;//////adsfadsf_Variable_Checked } } Image->LayerMask->PutScanLine(MoveCopyRect.s.y+i,StartX+ MoveCopyRect.s.x,EndX-StartX+1); ////adsfadsf } } else { for (i = 0; i < MoveCopyRect.size.y; i++) { if (MoveCopyRect.s.y+i < 0 || MoveCopyRect.s.y+i >= hh) continue; LP = Image->LayerMask->GetScanLine(MoveCopyRect.s.y+i); WP = Image->SubMask->GetScanLine(i); mm = 0x80; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j = 0; j < MoveCopyRect.size.x; j++) { //////adsfadsf_for if (MoveCopyRect.s.x+j < 0 || MoveCopyRect.s.x+j >= ww){ continue; } if ((*WP & mm) == 0) { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 LP[(MoveCopyRect.s.x + j) >> 3] &= ~(0x80 >> ((MoveCopyRect.s.x + j) & 7));//////adsfadsf_Variable_Checked } if (mm == 1) { WP++; mm = 0x80; } else { mm >>= 1; } } Image->LayerMask->PutScanLine(MoveCopyRect.s.y+i,StartX+ MoveCopyRect.s.x,EndX-StartX+1); ////adsfadsf } } Image->LayerMask->StopScanLine(); Image->SubMask->StopScanLine(); } //--------------------------------------------------------------------------- bool __fastcall TMoveCopyForm::SymmetryMouseMove(int X, int Y) { int delta_x,delta_y; if(IsZKeyDown){ delta_x = (X-window.s.x); if(delta_x<0) delta_x = -delta_x; delta_y = (Y-window.s.y); if(delta_y<0) delta_y = -delta_y; if( delta_xiMainImage->RectPaint(paintrect); //k3dogs return true; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return false; } //--------------------------------------------------------------------------- bool __fastcall TMoveCopyForm::MakeSubBitmap(int X, int Y, bool superChanged) /* TODO : SubMask¸¸ º¯°æÇØÁÖ´Â ·çƾÀ¸·Î ¹Ù²ã¾ß ÇÑ´Ù. ÇÔ¼ö À̸§µµ º¯°æÇØ¾ß ÇÔ */ { Byte *PP, *MP, *MBP, *DP, *IP, *MMP, mm; int x, y, ww, hh; COLORREF bgc, c; TPItemImage *Image = MainImageForm->iMainImage; LineItr *lineItr; ww = Image->uBitmap->Width; hh = Image->uBitmap->Height; if (!superChanged && !MainImageForm->MaskArea && FullViewForm->Super != sGauze) { if (Image->uBitmap->BitsPerPixel == 24) { return true; } else if (!MainImageForm->Protect) { return true; } } switch (MainImageForm->iMainImage->IsBackGround()) { case 0: if(MainImageForm->MaskArea) { lineItr = (LineItr *)new LineItr_Mask(Image); } else { lineItr = (LineItr *)new LineItr(Image); } break; case 1: if(MainImageForm->MaskArea) { lineItr = (LineItr *)new LineItr_Layer_Mask(Image); } else { lineItr = (LineItr *)new LineItr_Layer(Image); } break; default: return false; } if (Image->uBitmap->BitsPerPixel == 8) { lineItr->setColorProtected(MainImageForm->Protect); if (!lineItr->startScanLine()) goto fail; if (!Image->SubBitmap->StartScanLine()) goto fail; if (!Image->SubMask->StartScanLine()) goto fail; if (!window.Bitmap->StartScanLine()) goto fail; if (!window.Mask->StartScanLine()) goto fail; if (FullViewForm->Super == sGauze) { // StatusProgress->Maximum = MoveCopyRect.size.y; for (y = 0; y < MoveCopyRect.size.y; y++) { // StatusProgress->Position = y; if (MoveCopyRect.s.y + y < 0 || MoveCopyRect.s.y + y >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y + y, MoveCopyRect.s.x, MoveCopyRect.size.x); DP = Image->SubBitmap->GetScanLine(y); MMP = Image->SubMask->GetScanLine(y); PP = window.Bitmap->GetScanLine(y); MP = window.Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x = 0; x < MoveCopyRect.size.x; x++, DP++, MMP++, PP++, MP++) { //////adsfadsf_for//////adsfadsf_Variable_Checked if (MoveCopyRect.s.x + x < 0 || MoveCopyRect.s.x + x >= ww){ continue; } if (!lineItr->isProtected(MoveCopyRect.s.x + x)) { if (*MP) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP = 0xFF;//////adsfadsf_Variable_Checked } else { if (lineItr->pickColor(MoveCopyRect.s.x + x) > 1){ if ((y+x)&1) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *DP = *PP; *MMP = 0; //////adsfadsf_Variable_Checked // *DP = *PP ¿ä°Íµµ ³ªÁß¿¡ Áö¿ìÀÚ } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP = 0xFF; //////adsfadsf_Variable_Checked } } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *DP = *PP; *MMP = 0;//////adsfadsf_Variable_Checked } } } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP = 0xFF;//////adsfadsf_Variable_Checked } } Image->SubMask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf Image->SubBitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } // StatusProgress->End(); } else { // StatusProgress->Maximum = MoveCopyRect.size.y; for (y = 0; y < MoveCopyRect.size.y; y++) { // StatusProgress->Position = y; if (MoveCopyRect.s.y + y < 0 || MoveCopyRect.s.y + y >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y + y, MoveCopyRect.s.x, MoveCopyRect.size.x); DP = Image->SubBitmap->GetScanLine(y); MMP = Image->SubMask->GetScanLine(y); PP = window.Bitmap->GetScanLine(y); MP = window.Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x = 0; x < MoveCopyRect.size.x; x++, DP++, MMP++, PP++, MP++) { //////adsfadsf_for//////adsfadsf_Variable_Checked if (MoveCopyRect.s.x + x < 0 || MoveCopyRect.s.x + x >= ww){ continue; } if (!lineItr->isProtected(MoveCopyRect.s.x + x)) { if (*MP) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP = 0xFF; //////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *DP = *PP; *MMP = 0; //////adsfadsf_Variable_Checked } } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP = 0xFF;//////adsfadsf_Variable_Checked } } Image->SubMask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf Image->SubBitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } // StatusProgress->End(); } lineItr->stopScanLine(); window.Mask->StopScanLine(); window.Bitmap->StopScanLine(); Image->SubMask->StopScanLine(); Image->SubBitmap->StopScanLine(); } else { bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); if (!lineItr->startScanLine()) goto fail; if (!Image->SubBitmap->StartScanLine()) goto fail; if (!Image->SubMask->StartScanLine()) goto fail; if (!window.Bitmap->StartScanLine()) goto fail; if (!window.Mask->StartScanLine()) goto fail; if (FullViewForm->Super == sGauze) { // StatusProgress->Maximum = MoveCopyRect.size.y; for (y = 0; y < MoveCopyRect.size.y; y++) { // StatusProgress->Position = y; if (MoveCopyRect.s.y + y < 0 || MoveCopyRect.s.y + y >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y + y, MoveCopyRect.s.x, MoveCopyRect.size.x); DP = Image->SubBitmap->GetScanLine(y); MMP = Image->SubMask->GetScanLine(y); PP = window.Bitmap->GetScanLine(y); MP = window.Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare x = 0; mm = 0x80; *MMP = 0; while(1) { //////adsfadsf_while if (MoveCopyRect.s.x + x < 0 || MoveCopyRect.s.x + x >= ww) { x++; if (x >= MoveCopyRect.size.x) break; DP+=3; PP+=3; if (mm == 1) { MP++; MMP++; *MMP = 0; mm = 0x80; } else mm >>= 1; continue; } if (!lineItr->isProtected(MoveCopyRect.s.x + x)) { if (*MP & mm) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP |= mm;//////adsfadsf_Variable_Checked } else { c = lineItr->pickColor(MoveCopyRect.s.x + x); if (c!=bgc) { if ((y+x)&1) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(DP, PP);//////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP |= mm;//////adsfadsf_Variable_Checked } if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 } else CopyPixel24(DP, PP);//////adsfadsf_Variable_Checked } } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP |= mm;//////adsfadsf_Variable_Checked } x++; if (x >= MoveCopyRect.size.x) break; IP+=3; DP+=3; PP+=3; if (mm == 1) { MP++; MMP++; *MMP = 0; mm = 0x80; } else mm >>= 1; } Image->SubMask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf Image->SubBitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } // StatusProgress->End(); } else { // StatusProgress->Maximum = MoveCopyRect.size.y; for (y = 0; y < MoveCopyRect.size.y; y++) { // StatusProgress->Position = y; if (MoveCopyRect.s.y + y < 0 || MoveCopyRect.s.y + y >= hh) continue; lineItr->getScanLine(MoveCopyRect.s.y + y, MoveCopyRect.s.x, MoveCopyRect.size.x); DP = Image->SubBitmap->GetScanLine(y); MMP = Image->SubMask->GetScanLine(y); PP = window.Bitmap->GetScanLine(y); MP = window.Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare x = 0; mm = 0x80; *MMP = 0; while(1) { //////adsfadsf_while if (MoveCopyRect.s.x + x < 0 || MoveCopyRect.s.x + x >= ww) { x++; if (x >= MoveCopyRect.size.x) break; DP+=3; PP+=3; if (mm == 1) { MP++; MMP++; *MMP = 0; mm = 0x80; } else mm >>= 1; continue; } if (!lineItr->isProtected(MoveCopyRect.s.x + x)) { if (*MP & mm) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP |= mm;//////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(DP, PP);//////adsfadsf_Variable_Checked } } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MMP |= mm;//////adsfadsf_Variable_Checked } x++; if (x >= MoveCopyRect.size.x) break; DP+=3; PP+=3; if (mm == 1) { MP++; MMP++; *MMP = 0; mm = 0x80; } else mm >>= 1; } Image->SubMask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf Image->SubBitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } // StatusProgress->End(); } lineItr->stopScanLine(); window.Mask->StopScanLine(); window.Bitmap->StopScanLine(); Image->SubMask->StopScanLine(); Image->SubBitmap->StopScanLine(); } if(lineItr) { delete lineItr; lineItr = NULL; } return true; fail: lineItr->stopScanLine(); window.Mask->StopScanLine(); window.Bitmap->StopScanLine(); Image->SubBitmap->StopScanLine(); Image->SubMask->StopScanLine(); if(lineItr) { delete lineItr; lineItr = NULL; } return false; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RotatingMirror_Rect(int X,int Y) { int ArrowXX, ArrowYY, LX, LY; TPoint Cen; LX = window.size.x / 2; LY = window.size.y / 2; Cen.x = window.s.x + LX; Cen.y = window.s.y + LY; ArrowXX = window.size.x / 6; ArrowYY = window.size.y / 6; ArrowX[0] = Cen.x; ArrowX[1] = Cen.x - ArrowXX * 2; ArrowX[2] = Cen.x + ArrowXX * 2; ArrowX[3] = Cen.x; ArrowX[4] = Cen.x; ArrowY[0] = Cen.y - ArrowYY * 2; ArrowY[1] = Cen.y; ArrowY[2] = Cen.y; ArrowY[3] = Cen.y + ArrowYY * 2; ArrowY[4] = Cen.y; POINT origin = Point(ArrowX[4], ArrowY[4]); double r = sqrt((window.size.x*window.size.x+window.size.y*window.size.y)/2.0); Convert_CLTheta(X, Y); POINT left = Point(origin.x-r*sin(Theta+M_PI/4.0),origin.y-r*cos(Theta+M_PI/4.0)); POINT right = Point(origin.x-r*sin(Theta-M_PI/4.0),origin.y-r*cos(Theta-M_PI/4.0)); POINT center = Point((left.x+right.x)/2.0,(left.y+right.y)/2.0); POINT leftcenter = Point((left.x+center.x)/2.0,(left.y+center.y)/2.0); POINT rightcenter = Point((center.x+right.x)/2.0,(center.y+right.y)/2.0); MainImageForm->DrawLineLocate(left,leftcenter,4); MainImageForm->DrawLineLocate(leftcenter,center,4); MainImageForm->DrawLineLocate(center,rightcenter,4); MainImageForm->DrawLineLocate(rightcenter,right,4); Trans_Data_RotatingMirror(X, Y); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::Rotate_Rect(void) { MainImageForm->DrawLineLocate(Point(sx[0], sy[0]), Point(sx[2], sy[2]),8); MainImageForm->DrawLineLocate(Point(sx[2], sy[2]), Point(sx[3], sy[3]),8); MainImageForm->DrawLineLocate(Point(sx[3], sy[3]), Point(sx[1], sy[1]),8); MainImageForm->DrawLineLocate(Point(sx[1], sy[1]), Point(sx[0], sy[0]),8); MainImageForm->DrawLineLocate(Point(ArrowX[0], ArrowY[0]), Point(ArrowX[1], ArrowY[1]),8); MainImageForm->DrawLineLocate(Point(ArrowX[1], ArrowY[1]), Point(ArrowX[2], ArrowY[2]),8); MainImageForm->DrawLineLocate(Point(ArrowX[2], ArrowY[2]), Point(ArrowX[0], ArrowY[0]),8); MainImageForm->DrawLineLocate(Point(ArrowX[3], ArrowY[3]), Point(ArrowX[4], ArrowY[4]),8); } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::Convert_CLTheta(int X, int Y) { int tx, ty, cltheta; /* by k3dogs(20001114) rotate¿¡¼­ makerotateimage()°¡ Çѹø tx = window.s.x - X; ½ÇÇàµÈ ÈÄ¿¡ ȸÀüÀÇ Áß½ÉÀÌ º¯ÇÏ´Â Çö»óÀÌ ³ªÅ¸³ª¼­ ¾Æ·¡ÀÇ ty = window.s.y - Y; °ÍÀ¸·Î ±³Ã¼ÇØ ÁÖ¾ú´Ù. SubBitmap->~~~ ¸¦ makerotateimage()¿¡¼­ */// create()Çϱ⠶§¹®À̶ó°í »ý°¢µÈ´Ù. tx = window.s.x + window.size.x / 2 - X - MainImageForm->iMainImage->SubBitmap->Width / 2; ty = window.s.y + window.size.y / 2 - Y - MainImageForm->iMainImage->SubBitmap->Height / 2; if (ty == 0) { if (tx >= 0) Theta = M_PI / 2.0; else Theta = 1.5 * M_PI; } else { Theta = atan((Extended)tx / ty); if (ty < 0) Theta += M_PI; else if (tx < 0) Theta += 2.0 * M_PI; } } //OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::Trans_Data(int X, int Y) { TRotation *Trans = NULL; TPoint Cen; Cen.x = window.s.x + window.size.x / 2; Cen.y = window.s.y + window.size.y / 2; if ((Trans = new TRotation) == NULL) {EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return;} Convert_CLTheta(X, Y); Trans->translation(-Cen.x, -Cen.y); Trans->rotation(-Theta); Trans->convert(window.s.x, window.s.y, sx[0], sy[0]); sx[0] = sx[0] + Cen.x; sy[0] = sy[0] + Cen.y; Trans->convert(window.s.x, window.e.y, sx[1], sy[1]); sx[1] = sx[1] + Cen.x; sy[1] = sy[1] + Cen.y; Trans->convert(window.e.x, window.s.y, sx[2], sy[2]); sx[2] = sx[2] + Cen.x; sy[2] = sy[2] + Cen.y; Trans->convert(window.e.x, window.e.y, sx[3], sy[3]); sx[3] = sx[3] + Cen.x; sy[3] = sy[3] + Cen.y; Trans->convert(ArrowX[0], ArrowY[0]); ArrowX[0] = ArrowX[0] + Cen.x; ArrowY[0] = ArrowY[0] + Cen.y; Trans->convert(ArrowX[1], ArrowY[1]); ArrowX[1] = ArrowX[1] + Cen.x; ArrowY[1] = ArrowY[1] + Cen.y; Trans->convert(ArrowX[2], ArrowY[2]); ArrowX[2] = ArrowX[2] + Cen.x; ArrowY[2] = ArrowY[2] + Cen.y; Trans->convert(ArrowX[3], ArrowY[3]); ArrowX[3] = ArrowX[3] + Cen.x; ArrowY[3] = ArrowY[3] + Cen.y; max_x = sx[0]; min_x = max_x; max_y = sy[0]; min_y = max_y; delete Trans; Trans = NULL; } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::Trans_Data_RotatingMirror(int X, int Y) { TRotation *Trans = NULL; TPoint Cen; double r=sqrt(window.size.x*window.size.x+window.size.y*window.size.y); Cen.x = window.s.x + window.size.x / 2; Cen.y = window.s.y + window.size.y / 2; if ((Trans = new TRotation) == NULL) {EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return;} Convert_CLTheta(X, Y); Trans->translation(-Cen.x, -Cen.y); Trans->rotation(-2.0*Theta+M_PI); Trans->convert(window.s.x, window.s.y, sx[0], sy[0]); sx[0] = sx[0] + Cen.x - r*sin(Theta); sy[0] = sy[0] + Cen.y - r*cos(Theta); Trans->convert(window.s.x, window.e.y, sx[1], sy[1]); sx[1] = sx[1] + Cen.x - r*sin(Theta); sy[1] = sy[1] + Cen.y - r*cos(Theta); Trans->convert(window.e.x, window.s.y, sx[2], sy[2]); sx[2] = sx[2] + Cen.x - r*sin(Theta); sy[2] = sy[2] + Cen.y - r*cos(Theta); Trans->convert(window.e.x, window.e.y, sx[3], sy[3]); sx[3] = sx[3] + Cen.x - r*sin(Theta); sy[3] = sy[3] + Cen.y - r*cos(Theta); Trans->convert(ArrowX[0], ArrowY[0]); ArrowX[0] = ArrowX[0] + Cen.x - r*sin(Theta); ArrowY[0] = ArrowY[0] + Cen.y - r*cos(Theta); Trans->convert(ArrowX[1], ArrowY[1]); ArrowX[1] = ArrowX[1] + Cen.x - r*sin(Theta); ArrowY[1] = ArrowY[1] + Cen.y - r*cos(Theta); Trans->convert(ArrowX[2], ArrowY[2]); ArrowX[2] = ArrowX[2] + Cen.x - r*sin(Theta); ArrowY[2] = ArrowY[2] + Cen.y - r*cos(Theta); Trans->convert(ArrowX[3], ArrowY[3]); ArrowX[3] = ArrowX[3] + Cen.x - r*sin(Theta); ArrowY[3] = ArrowY[3] + Cen.y - r*cos(Theta); ArrowX[4] = Cen.x - r*sin(Theta); ArrowY[4] = Cen.y - r*cos(Theta); delete Trans; Trans = 0; } //--------------------------------------------------------------------------- #define PixelCenter(v) \ IP2 = IP+3; \ IP3 = IP1+3; \ IPMinX = *IP+diff1*(*IP2-*IP); \ IPMaxX = *IP1+diff1*(*IP3-*IP1); \ v = (Byte)floor(IPMinX+diff*(IPMaxX-IPMinX)); //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeRotatingMirrorImage() { TRotation *Trans = NULL; Extended dx, dy, px, py; TPoint Cen; //a pixel location on screen by k3dogs int LX, LY, xx, yy, i, j; COLORREF bgc; bool mbc = false, wbc = false, wmc = false, wkc = false; //Bitmap ÀÌ »ý¼ºµÇ¾ú´ÂÁö È®ÀÎ. TPItemImage *Image = MainImageForm->iMainImage; //TPImage-TPLayerImage-TPItemImage WAItr *waItr = NULL; WindowItr *windowItr = NULL; if ((Trans = new TRotation) == NULL) goto fail; LX = window.size.x / 2; //TWindowData-window,MoveCopyRect,bendwindow LY = window.size.y / 2; Cen.x = window.s.x + LX; Cen.y = window.s.y + LY; Trans->translation(-Cen.x, -Cen.y); Trans->rotation(2.0*Theta); MoveCopyRect.size = RotateArea; if(!CreateBitmaps(RotateArea.x, RotateArea.y)) goto fail; if (Image->uBitmap->BitsPerPixel==8) { //³×°³ÀÇ BitmapÀÌ »ý¼ºµÇ¾ú´ÂÁö È®ÀÎÇϰí, ±×·¸Áö ¾ÊÀ¸¸é Fail waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } waItr->startScanLine(); windowItr->startScanLine(); switch (FullViewForm->Super) { case sOff: // StatusProgress->Maximum = max_y-min_y; for (i=0; i<=max_y-min_y; i++) { StatusProgress->Position = i; windowItr->getScanLine(i, 0, max_x-min_x + 1); for (j=0; j<=max_x-min_x; j++) { Trans->convert(j+min_x, i+min_y, dx, dy); py = dy+LY; yy = floor(py); if (yy>=0 && yy=0 && xxgetScanLine(window.size.y-1 - yy, xx, 1); if (waItr->isInArea(xx)) { windowItr->copyPixel(j, waItr->getPixelPointer(xx)); } else { // windowItr->copyAndBlank(j, waItr->getPixelPointer(xx)); windowItr->setToBlank(j); } } else { windowItr->setToBlank(j); } } else { windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, max_x-min_x + 1); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = max_y-min_y; for (i=0; i<=max_y-min_y; i++) { StatusProgress->Position = i; windowItr->getScanLine(i, 0, max_x-min_x + 1); for (j=0; j<=max_x-min_x; j++) { Trans->convert(j+min_x, i+min_y, dx, dy); py = dy+LY; yy = floor(py); if (yy>=0 && yy=0 && xxgetScanLine(window.size.y-1 - yy, xx, 1); if (waItr->isInArea(xx)) { if (waItr->isNotBGColor(xx)) { windowItr->copyPixel(j, waItr->getPixelPointer(xx)); } else { windowItr->copyAndBlank(j, waItr->getPixelPointer(xx)); } } } else { windowItr->setToBlank(j); } } else { windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, max_x-min_x + 1); } StatusProgress->End(); break; } waItr->stopScanLine(); windowItr->stopScanLine(); delete Trans; Image->SubBitmap->Copy(window.Bitmap, SRCCOPY); // Image->SubMask->Copy(window.Mask, SRCCOPY); // new mcStatus.setImgState(WasRotated); // by celberus if(waItr) delete waItr; if(windowItr) delete windowItr; return; fail: waItr->stopScanLine(); windowItr->stopScanLine(); if (Trans) delete Trans; if(waItr) delete waItr; if(windowItr) delete windowItr; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeNormalImage() { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(i); for (int j=0; jisInArea(j)) { windowItr->copyPixel(j, waItr->getPixelPointer(j)); } else { // windowItr->copyAndBlank(j, waItr->getPixelPointer(j)); /* TODO : sOff À϶§´Â setToBlank¸¦ »ç¿ëÇØµµ µÈ´Ù */ windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: /* TODO : MouseMove¿¡¼­ overlapµîÀ϶§¸¦ ó¸®ÇϹǷΠ³ªÁß¿¡ Á¦°ÅÇØº¼°Í */ StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(i); for (int j=0; jisInArea(j)) { if (waItr->isNotBGColor(j)) { windowItr->copyPixel(j, waItr->getPixelPointer(j)); } else { windowItr->copyAndBlank(j, waItr->getPixelPointer(j)); } } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeTBMirrorImage() { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(window.size.y - 1 - i); for (int j=0; jisInArea(j)) { windowItr->copyPixel(j, waItr->getPixelPointer(j)); } else { // windowItr->copyAndBlank(j, waItr->getPixelPointer(j)); windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(window.size.y - 1 - i); for (int j=0; jisInArea(j)) { if (waItr->isNotBGColor(j)) { windowItr->copyPixel(j, waItr->getPixelPointer(j)); } else { windowItr->copyAndBlank(j, waItr->getPixelPointer(j)); } } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeLRMirrorImage() { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(i); for (int j=0; jisInArea(window.size.x - j - 1)) { windowItr->copyPixel(j, waItr->getPixelPointer(window.size.x - j - 1)); } else { // windowItr->copyAndBlank(j, waItr->getPixelPointer(window.size.x - j - 1)); windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(i); for (int j=0; jisInArea(window.size.x - j - 1)) { if (waItr->isNotBGColor(window.size.x - j - 1)) { windowItr->copyPixel(j, waItr->getPixelPointer(window.size.x - j - 1)); } else { windowItr->copyAndBlank(j, waItr->getPixelPointer(window.size.x - j - 1)); } } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeTBLRMirrorImage() { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(window.size.y - 1 - i); for (int j=0; jisInArea(window.size.x - j - 1)) { windowItr->copyPixel(j, waItr->getPixelPointer(window.size.x - j - 1)); } else { // windowItr->copyAndBlank(j, waItr->getPixelPointer(window.size.x - j - 1)); windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (int i=0; iPosition = i; windowItr->getScanLine(i, 0, window.size.x); waItr->getScanLine(window.size.y - 1 - i); for (int j=0; jisInArea(window.size.x - j - 1)) { if (waItr->isNotBGColor(window.size.x - j - 1)) { windowItr->copyPixel(j, waItr->getPixelPointer(window.size.x - j - 1)); } else { windowItr->copyAndBlank(j, waItr->getPixelPointer(window.size.x - j - 1)); } } } windowItr->putScanLine(i, 0, window.size.x); } StatusProgress->End(); break; } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeRotateImage() { TRotation *Trans = NULL; Extended dx, dy, px, py; TPoint Cen; //a pixel location on screen by k3dogs int LX, LY, xx, yy, i, j; COLORREF bgc; TPItemImage *Image = MainImageForm->iMainImage; //TPImage-TPLayerImage-TPItemImage WAItr *waItr = NULL; WindowItr *windowItr = NULL; if ((Trans = new TRotation) == NULL) goto fail; LX = window.size.x / 2; //TWindowData-window,MoveCopyRect,bendwindow LY = window.size.y / 2; Cen.x = window.s.x + LX; Cen.y = window.s.y + LY; Trans->translation(-Cen.x, -Cen.y); Trans->rotation(Theta); if(RotateArea.x == 0 || RotateArea.y == 0) { RotateArea.x = window.size.x; RotateArea.y = window.size.y; } // È®/Ãà ȸÀü À̵¿º¹»ç ÇÒ¶§ super¸¦ ¹Ù²Ù¸é RotateAreaÀÇ °ªÀÌ 0,0ÀΠä·Î ÀÌ ·çƾ¿¡ µé¾î¿À°Ô µÈ´Ù. by celberus MoveCopyRect.size = RotateArea; if(!CreateBitmaps(RotateArea.x, RotateArea.y)) goto fail; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } waItr->startScanLine(); windowItr->startScanLine(); switch (FullViewForm->Super) { case sOff: // StatusProgress->Maximum = max_y-min_y; for (i=0; i<=max_y-min_y; i++) { StatusProgress->Position = i; windowItr->getScanLine(i, 0, max_x-min_x + 1); for (j=0; j<=max_x-min_x; j++) { Trans->convert(j+min_x, i+min_y, dx, dy); py = dy+LY; yy = floor(py); if (yy>=0 && yy=0 && xxgetScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { windowItr->copyPixel(j, waItr->getPixelPointer(xx)); } else { // windowItr->copyAndBlank(j, waItr->getPixelPointer(xx)); windowItr->setToBlank(j); } } else { windowItr->setToBlank(j); } } else { windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, max_x-min_x + 1); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = max_y-min_y; for (i=0; i<=max_y-min_y; i++) { StatusProgress->Position = i; windowItr->getScanLine(i, 0, max_x-min_x + 1); for (j=0; j<=max_x-min_x; j++) { Trans->convert(j+min_x, i+min_y, dx, dy); py = dy+LY; yy = floor(py); if (yy>=0 && yy=0 && xxgetScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { if (waItr->isNotBGColor(xx)) { windowItr->copyPixel(j, waItr->getPixelPointer(xx)); } else { windowItr->copyAndBlank(j, waItr->getPixelPointer(xx)); } } } else { windowItr->setToBlank(j); } } else { windowItr->setToBlank(j); } } windowItr->putScanLine(i, 0, max_x-min_x + 1); } StatusProgress->End(); break; } waItr->stopScanLine(); windowItr->stopScanLine(); delete Trans; Image->SubBitmap->Copy(window.Bitmap, SRCCOPY); // Image->SubMask->Copy(window.Mask, SRCCOPY); // new mcStatus.setImgState(WasRotated); // by celberus if(waItr) delete waItr; if(windowItr) delete windowItr; return; fail: waItr->stopScanLine(); windowItr->stopScanLine(); if (Trans) delete Trans; if(waItr) delete waItr; if(windowItr) delete windowItr; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RotateMouseDown(int X, int Y) { bool undoSw = false; if (mcStatus.getMCStep() == STRotating) { if (IsDraw) Rotate_Rect(); // µ¹¾Æ°¡´Â »ç°¢ÇüÀ» ±×¸®´Â ÇÁ·Î½ÃÀú RotateArea = Point(max_x-min_x+1, max_y-min_y+1); float degree = StrToFloat(cbRotate->Text); if (sw) Theta = degree * M_PI / 180.0; else Convert_CLTheta(X, Y); BeforeDeg = degree; BeforeDeg1 = degree; MakeRotateImage(); IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo mcStatus.doneMCStep(STRotating); sbBeforeDeg->Enabled = false; cbRotate->Enabled = false; btnRotateRun->Enabled = false; } else { //m if(cbExp->Checked == true) //m if ((undoSw = MainImageForm->UndoSave(UK_ALL, Rect(0,0,MainImageForm->iMainImage->uBitmap->Width,MainImageForm->iMainImage->uBitmap->Height))) == false) goto fail; if (SymmetryMouseDown(X, Y) && mcStatus.isMove()) { // MainImageForm->WorkAreaReset(); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, true); } return; fail: if (undoSw == false)EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RotateMouseMove(int X, int Y) { int ArrowXX, ArrowYY, LX, LY, i; TPoint Cen; if (mcStatus.getMCStep() == STRotating) { if (IsDraw) Rotate_Rect(); // µ¹¾Æ°¡´Â »ç°¢ÇüÀ» ±×¸®´Â ÇÁ·Î½ÃÀú.. if (repaintsw == true) { //by k3dogs(20001106) SetMoveCopyImage(); repaintsw = false; } LX = window.size.x / 2; LY = window.size.y / 2; Cen.x = window.s.x + LX; Cen.y = window.s.y + LY; ArrowXX = window.size.x / 6; ArrowYY = window.size.y / 6; ArrowX[0] = Cen.x; ArrowX[1] = Cen.x - ArrowXX * 2; ArrowX[2] = Cen.x + ArrowXX * 2; ArrowX[3] = Cen.x; ArrowX[4] = Cen.x; ArrowY[0] = Cen.y - ArrowYY * 2; ArrowY[1] = Cen.y; ArrowY[2] = Cen.y; ArrowY[3] = Cen.y + ArrowYY * 2; ArrowY[4] = Cen.y; Trans_Data(X, Y); for (i = 0; i <= 3; i++) { if (min_x >= sx[i]) min_x = sx[i]; else if (max_x <= sx[i]) max_x = sx[i]; if (min_y >= sy[i]) min_y = sy[i]; else if (max_y <= sy[i]) max_y = sy[i]; } Rotate_Rect(); // µ¹¾Æ°¡´Â »ç°¢ÇüÀ» ±×¸®´Â ÇÁ·Î½ÃÀú.. IsDraw = true; cbRotate->Text = Format("%3.1f", OPENARRAY(TVarRec, (RadToDeg(Theta)))); } else { SymmetryMouseMove(X, Y); } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RotatingMirrorMouseDown(int X, int Y) { bool undoSw = false; if (mcStatus.getMCStep() == STRotating) { // if (IsDraw) RotatingMirror_Rect(); // µ¹¾Æ°¡´Â »ç°¢ÇüÀ» ±×¸®´Â ÇÁ·Î½ÃÀú RotateArea = Point(max_x-min_x+1, max_y-min_y+1); float degree = StrToFloat(cbRotate->Text); if (sw) Theta = degree * M_PI / 180.0; else Convert_CLTheta(X, Y); BeforeDeg = degree; BeforeDeg1 = degree; MakeRotatingMirrorImage(); IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo mcStatus.setMCStep(STPutting); sbBeforeDeg->Enabled = false; cbRotate->Enabled = false; btnRotateRun->Enabled = false; } else { //m if(cbExp->Checked == true) //blocked by linuxjun because of Expansion Case UndoSave //m if ((undoSw = MainImageForm->UndoSave(UK_ALL, Rect(0,0,MainImageForm->iMainImage->uBitmap->Width,MainImageForm->iMainImage->uBitmap->Height))) == false) goto fail; if (SymmetryMouseDown(X, Y) && mcStatus.isMove()) { // MainImageForm->WorkAreaReset(); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, true); } return; fail: if (undoSw == false)EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::RotatingMirrorMouseMove(int X, int Y) { int ArrowXX, ArrowYY, LX, LY, i; TPoint Cen; if (mcStatus.getMCStep() == STRotating) { if (IsDraw) RotatingMirror_Rect(); // µ¹¾Æ°¡´Â »ç°¢ÇüÀ» ±×¸®´Â ÇÁ·Î½ÃÀú.. if (repaintsw == true) { //by k3dogs(20001106) SetMoveCopyImage(); repaintsw = false; } LX = window.size.x / 2; LY = window.size.y / 2; Cen.x = window.s.x + LX; Cen.y = window.s.y + LY; ArrowXX = window.size.x / 6; ArrowYY = window.size.y / 6; ArrowX[0] = Cen.x; ArrowX[1] = Cen.x - ArrowXX * 2; ArrowX[2] = Cen.x + ArrowXX * 2; ArrowX[3] = Cen.x; ArrowX[4] = Cen.x; ArrowY[0] = Cen.y - ArrowYY * 2; ArrowY[1] = Cen.y; ArrowY[2] = Cen.y; ArrowY[3] = Cen.y + ArrowYY * 2; ArrowY[4] = Cen.y; // Trans_Data_RotatingMirror(X, Y); RotatingMirror_Rect(X,Y); // µ¹¾Æ°¡´Â »ç°¢ÇüÀ» ±×¸®´Â ÇÁ·Î½ÃÀú.. double r=sqrt(window.size.x*window.size.x+window.size.y*window.size.y); max_x = sx[0]+ r*sin(Theta); min_x = max_x; max_y = sy[0]+ r*cos(Theta); min_y = max_y; for (i = 0; i <= 3; i++) { if (min_x >= sx[i]+ r*sin(Theta)) min_x = sx[i]+ r*sin(Theta); else if (max_x <= sx[i]+ r*sin(Theta)) max_x = sx[i]+ r*sin(Theta); if (min_y >= sy[i]+ r*cos(Theta)) min_y = sy[i]+ r*cos(Theta); else if (max_y <= sy[i]+ r*cos(Theta)) max_y = sy[i]+ r*cos(Theta); } IsDraw = true; cbRotate->Text = Format("%3.1f", OPENARRAY(TVarRec, (RadToDeg(Theta)))); } else { SymmetryMouseMove(X, Y); } } //--------------------------------------------------------------------------- bool __fastcall TMoveCopyForm::new_mc_buf(TWindowData w) { MoveCopyRect.s = w.s; MoveCopyRect.e = w.e; MoveCopyRect.size = w.size; TPItemImage *Image = MainImageForm->iMainImage; if(!CreateBitmaps(w.size.x, w.size.y)) return false; return true; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::bending_fan(void) { int i,j, cx1, cy1, xx, yy, min_x, min_y, max_x, max_y; double radius, th, lr, sr, Y, X, diffX, diffY; COLORREF bgc; Byte centerColor[3]; TPItemImage *Image = MainImageForm->iMainImage; WAItr *waItr = NULL; WindowItr *windowItr = NULL; if (Dsy>Dsx) { if (tR>=window.size.y/2.0) { sr = tR-window.size.y/2.0; lr = tR+window.size.y/2.0; } else { Theta = 2*(double)window.size.x/window.size.y; sr = 0; lr = window.size.y; } if(Dsy1<0){ cx1 = Csx; cy1 = window.s.y+lr; min_x = cx1-lr*sin(Theta/2); min_y = cy1-lr; max_x = cx1+lr*sin(Theta/2)+1; max_y = cy1-sr*cos(Theta/2); if(Theta>M_PI){ min_x = cx1-lr; max_x = cx1+lr+1; max_y = cy1+lr*sin((Theta-M_PI)/2); } } else { cx1 = Csx; cy1 = window.e.y-lr; min_x = cx1-lr*sin(Theta/2); min_y = cy1+sr*cos(Theta/2); max_x = cx1+lr*sin(Theta/2)+1; max_y = cy1+lr; if(Theta>M_PI){ min_x = cx1-lr; max_x = cx1+lr+1; min_y = cy1-lr*sin((Theta-M_PI)/2); } } bendwindow.size.x = max_x - min_x; bendwindow.size.y = max_y - min_y; if (new_mc_buf(bendwindow) == false) return; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } if (!waItr->startScanLine_VBuff(window.size.y + 1)) goto fail; if (!windowItr->startScanLine()) goto fail; if (Image->uBitmap->BitsPerPixel==8) { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); // window.size.x ¿Í Ʋ¸®´Ù. window.size.x´Â workarea¿¡ ÀÖ´ÂÁö ¾ø´ÂÁö¸¦ ÆÇ´ÜÇÒ ¶§ »ç¿ë. (¿ø·¡ ±×·¯¸é ¾ÈµÇ´Âµ¥..) for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; Y = abs(window.s.y-cy1); } else { if(Dsy1<0){ th = acos((cy1-j)/radius); Y = lr-radius; } else { th = acos((j-cy1)/radius); Y = radius-sr; } } Y = Y+0.5; yy = floor(Y); if(yy >= 0 && yy < window.size.y){ if((i-min_x)>=(max_x-min_x)/2){ X = window.size.x/2*(1+th / (Theta/2)); } else { X = window.size.x/2*(1-th/(Theta/2)); } X = X+0.5; xx = floor(X); if(xx >= 0 && xx < window.size.x){ waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { windowItr->copyPixel(i-min_x, waItr->getPixelPointer(xx)); } else { // windowItr->copyAndBlank(i-min_x, waItr->getPixelPointer(xx)); windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j - min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; Y = abs(window.s.y-cy1); } else { if(Dsy1<0){ th = acos((cy1-j)/radius); Y = lr-radius; } else { th = acos((j-cy1)/radius); Y = radius-sr; } } Y = Y+0.5; yy = floor(Y); if(yy >= 0 && yy < window.size.y){ if((i-min_x)>=(max_x-min_x)/2){ X = window.size.x/2*(1+th / (Theta/2)); } else X = window.size.x/2*(1-th/(Theta/2)); X = X+0.5; xx = floor(X); if(xx >= 0 && xx < window.size.x){ waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { if (waItr->isNotBGColor(xx)) { windowItr->copyPixel(i-min_x, waItr->getPixelPointer(xx)); } else { windowItr->copyAndBlank(i-min_x, waItr->getPixelPointer(xx)); } } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j - min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; } } else { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; Y = abs(window.s.y-cy1); } else { if(Dsy1<0){ th = acos((cy1-j)/radius); Y = lr-radius; } else { th = acos((j-cy1)/radius); Y = radius-sr; } } yy = floor(Y); diffY = Y-yy; if(yy >= 0 && yy < window.size.y){ if((i-min_x)>=(max_x-min_x)/2){ X = window.size.x/2*(1+th / (Theta/2)); } else X = window.size.x/2*(1-th/(Theta/2)); xx = floor(X); diffX = X-xx; if(xx >= 0 && xx < window.size.x){ waItr->pixelCenter(xx, yy, diffX, diffY, centerColor); waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { windowItr->copyPixel(i-min_x, centerColor); } else { // windowItr->copyAndBlank(i-min_x, centerColor); windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j-min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; Y = abs(window.s.y-cy1); } else { if(Dsy1<0){ th = acos((cy1-j)/radius); Y = lr-radius; } else { th = acos((j-cy1)/radius); Y = radius-sr; } } yy = floor(Y); diffY = Y-yy; if(yy >= 0 && yy < window.size.y){ if((i-min_x)>=(max_x-min_x)/2){ X = window.size.x/2*(1+th / (Theta/2)); } else X = window.size.x/2*(1-th/(Theta/2)); xx = floor(X); diffX = X-xx; if(xx >= 0 && xx < window.size.x){ waItr->pixelCenter(xx, yy, diffX, diffY, centerColor); waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { if (waItr->isNotBGColor(xx)) { windowItr->copyPixel(i-min_x, centerColor); } else { windowItr->copyAndBlank(i-min_x, centerColor); } } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j-min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; } } waItr->stopScanLine_VBuff(); windowItr->stopScanLine(); } else { if (tR>=window.size.x/2.0) { sr = tR-window.size.x/2.0; lr = tR+window.size.x/2.0; } else { Theta = 2*(double)window.size.y/window.size.x; sr = 0; lr = window.size.x; } if(Dsx1<0){ cx1 = window.s.x+lr; cy1 = Csy; min_x = cx1-lr; min_y = cy1-lr*sin(Theta/2); max_x = cx1-sr*cos(Theta/2); max_y = cy1+lr*sin(Theta/2)+1; if(Theta>M_PI){ min_y = cy1-lr ; max_y = cy1+lr; max_x = cx1+lr*sin((Theta-M_PI)/2)+1; } } else { cx1 = window.e.x-lr; cy1 = Csy; min_x = cx1+sr*cos(Theta/2); min_y = cy1-lr*sin(Theta/2); max_x = cx1+lr; max_y = cy1+lr*sin(Theta/2)+1; if(Theta>M_PI){ min_y = cy1-lr; max_y = cy1+lr+1; min_x = cx1-lr*sin((Theta-M_PI)/2); } } bendwindow.size.x = max_x - min_x; bendwindow.size.y = max_y - min_y; if (new_mc_buf(bendwindow) == false) return; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } if (!waItr->startScanLine_VBuff(window.size.y + 1)) goto fail; if (!windowItr->startScanLine()) goto fail; if (Image->uBitmap->BitsPerPixel==8) { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i=min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; X = abs(window.s.x-cx1); } else { if(Dsx1<0){ th = acos((cx1-i)/radius); X = lr-radius; } else { th = acos((i-cx1)/radius); X = radius-sr; } } X = X+0.5; xx = floor(X); if(xx >= 0 && xx < window.size.x){ if((j-min_y)>=(max_y-min_y)/2){ Y = window.size.y/2*(1+th / (Theta/2)); } else { Y = window.size.y/2*(1-th/(Theta/2)); } Y = Y+0.5; yy = floor(Y); if(yy >= 0 && yy < window.size.y){ waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { windowItr->copyPixel(i-min_x, waItr->getPixelPointer(xx)); } else { // windowItr->copyAndBlank(i-min_x, waItr->getPixelPointer(xx)); windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j - min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; X = abs(window.s.x-cx1); } else { if(Dsx1<0){ th = acos((cx1-i)/radius); X = lr-radius; } else { th = acos((i-cx1)/radius); X = radius-sr; } } X = X+0.5; xx = floor(X); if(xx >= 0 && xx < window.size.x){ if((j-min_y)>=(max_y-min_y)/2){ Y = window.size.y/2*(1+th / (Theta/2)); } else Y = window.size.y/2*(1-th/(Theta/2)); Y = Y+0.5; yy = floor(Y); if(yy >= 0 && yy < window.size.y){ waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { if (waItr->isNotBGColor(xx)) { windowItr->copyPixel(i-min_x, waItr->getPixelPointer(xx)); } else { windowItr->copyAndBlank(i-min_x, waItr->getPixelPointer(xx)); } } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j - min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; } } else { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; X = abs(window.s.x-cx1); } else { if(Dsx1<0){ th = acos((cx1-i)/radius); X = lr-radius; } else { th = acos((i-cx1)/radius); X = radius-sr; } } xx = floor(X); diffX = X-xx; if(xx >= 0 && xx < window.size.x){ if((j-min_y)>=(max_y-min_y)/2){ Y = window.size.y/2*(1+th / (Theta/2)); } else Y = window.size.y/2*(1-th/(Theta/2)); yy = floor(Y); diffY = Y-yy; if(yy >= 0 && yy < window.size.y){ waItr->pixelCenter(xx, yy, diffX, diffY, centerColor); waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { windowItr->copyPixel(i-min_x, centerColor); } else { // windowItr->copyAndBlank(i-min_x, centerColor); windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j-min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = max_y-min_y; for(j = min_y; j < max_y; j++){ StatusProgress->Position = j-min_y; windowItr->getScanLine(j - min_y, 0, bendwindow.size.x); for (i = min_x; i < max_x; i++) { radius = sqrt((cx1-i)*(cx1-i)+(cy1-j)*(cy1-j)); if(radius == 0){ th = 0; X = abs(window.s.x-cx1); } else { if(Dsx1<0){ th = acos((cx1-i)/radius); X = lr-radius; } else { th = acos((i-cx1)/radius); X = radius-sr; } } xx = floor(X); diffX = X-xx; if(xx >= 0 && xx < window.size.x){ if((j-min_y)>=(max_y-min_y)/2){ Y = window.size.y/2*(1+th / (Theta/2)); } else Y = window.size.y/2*(1-th/(Theta/2)); yy = floor(Y); diffY = Y-yy; if(yy >= 0 && yy < window.size.y){ waItr->pixelCenter(xx, yy, diffX, diffY, centerColor); waItr->getScanLine(yy, xx, 1); if (waItr->isInArea(xx)) { if (waItr->isNotBGColor(xx)) { windowItr->copyPixel(i-min_x, centerColor); } else { windowItr->copyAndBlank(i-min_x, centerColor); } } } else { windowItr->setToBlank(i-min_x); } } else { windowItr->setToBlank(i-min_x); } } windowItr->putScanLine(j-min_y, 0, bendwindow.size.x); } StatusProgress->End(); break; } } waItr->stopScanLine_VBuff(); windowItr->stopScanLine(); } Image->SubBitmap->Copy(window.Bitmap, SRCCOPY); // Image->SubMask->Copy(window.Mask, SRCCOPY); // new mcStatus.setImgState(WasRotated); // by celberus if(waItr) delete waItr; if(windowItr) delete windowItr; return; fail: waItr->stopScanLine(); windowItr->stopScanLine(); if(waItr) delete waItr; if(windowItr) delete windowItr; window.Mask->Destroy(); window.Bitmap->Destroy(); Image->SubBitmap->Destroy(); Image->SubMask->Destroy(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::bending_tube(void) { int i, j, cx, cy, diff_Y, diff_X; COLORREF bgc; double y, x, radius, yy, xx, diff_YY, diff_XX, diffX, diffY; Byte centerColor[3]; WAItr *waItr = NULL; WindowItr *windowItr = NULL; TPItemImage *Image = MainImageForm->iMainImage; bool sw = false; // class attributeÀÇ sw¿Í Çò°¥¸°´Ù. if ((Theta <= 0) || (Theta >= M_PI)) { if (Theta <= 0) Theta = M_PI*0.05; else Theta = M_PI*0.95; } if (Dsy>Dsx) { cx = window.s.x+window.size.x/2.0; if(Dsy1>0){ cy = window.s.y-window.size.x/(4*tan((M_PI-Theta)/2)); if (cy < window.s.y) { y = window.s.y-(cx-window.s.x)*(cx-window.s.x)/(cy-window.s.y); radius = sqrt((cx-window.s.x)*(cx-window.s.x)+(y-window.s.y)*(y-window.s.y)); bendwindow.size.y=window.e.y-(y-radius); sw = true; } } else { cy = window.e.y+window.size.x/(4*tan((M_PI-Theta)/2)); if (cy > window.e.y) { y = window.e.y-(cx-window.e.x)*(cx-window.e.x)/(cy-window.e.y); radius = sqrt((cx-window.e.x)*(cx-window.e.x)+(y-window.e.y)*(y-window.e.y)); bendwindow.size.y=y+radius-window.s.y; sw = true; } } bendwindow.size.x = window.size.x; if (new_mc_buf(bendwindow) == false) return; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } if (!waItr->startScanLine_VBuff(window.size.y + 1)) goto fail; if (!windowItr->startScanLine()) goto fail; if (Image->uBitmap->BitsPerPixel==8) { if (sw) { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = bendwindow.size.y; for (j=0; j < bendwindow.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { if (Dsy1>0){ yy=y-sqrt(fabs(radius*radius-(i+window.s.x-cx)*(i+window.s.x-cx))); if(radius=0 && diff_Y < window.size.y){ waItr->getScanLine(diff_Y, i, 1); if (waItr->isInArea(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { // windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); windowItr->setToBlank(i); } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = bendwindow.size.y; for (j=0; j < bendwindow.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { if (Dsy1>0){ yy=y-sqrt(fabs(radius*radius-(i+window.s.x-cx)*(i+window.s.x-cx))); if(radius=0 && diff_Y < window.size.y){ waItr->getScanLine(diff_Y, i, 1); if (waItr->isInArea(i)) { if (waItr->isNotBGColor(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); } } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } else { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (j=0; j < window.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { // windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { if (waItr->isNotBGColor(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); } } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } } else { diffX=0; if (sw) { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = bendwindow.size.y; for (j=0; j < bendwindow.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { if(Dsy1>0){ yy=y-sqrt(fabs(radius*radius-(i+window.s.x-cx)*(i+window.s.x-cx))); if(radius= 0 && diff_Y < window.size.y){ waItr->pixelCenter(i, diff_Y, diffX, diffY, centerColor); waItr->getScanLine(diff_Y, i, 1); if (waItr->isInArea(i)) { windowItr->copyPixel(i, centerColor); } else { // windowItr->copyAndBlank(i, centerColor); windowItr->setToBlank(i); } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = bendwindow.size.y; for (j=0; j < bendwindow.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { if(Dsy1>0){ yy=y-sqrt(fabs(radius*radius-(i+window.s.x-cx)*(i+window.s.x-cx))); if(radius= 0 && diff_Y < window.size.y){ waItr->pixelCenter(i, diff_Y, diffX, diffY, centerColor); waItr->getScanLine(diff_Y, i, 1); if (waItr->isInArea(i)) { if (waItr->isNotBGColor(i)) { windowItr->copyPixel(i, centerColor); } else { windowItr->copyAndBlank(i, centerColor); } } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } else { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (j=0; j < window.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { // windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (j=0; j < window.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { if (waItr->isNotBGColor(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); } } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } } waItr->stopScanLine_VBuff(); windowItr->stopScanLine(); } else { cy = window.s.y+window.size.y/2.0; if(Dsx1>0){ cx = window.s.x-window.size.y/(4*tan((M_PI-Theta)/2)); if (cx < window.s.x) { x = window.s.x-(cy-window.s.y)*(cy-window.s.y)/(cx-window.s.x); radius = sqrt((cy-window.s.y)*(cy-window.s.y)+(x-window.s.x)*(x-window.s.x)); bendwindow.size.x=window.e.x-(x-radius); sw = true; } } else { cx = window.e.x+window.size.y/(4*tan((M_PI-Theta)/2)); if (cx > window.e.x) { x = window.e.x-(cy-window.e.y)*(cy-window.e.y)/(cx-window.e.x); radius = sqrt((cy-window.e.y)*(cy-window.e.y)+(x-window.e.x)*(x-window.e.x)); bendwindow.size.x=x+radius-window.s.x; sw = true; } } // bendwindow.size.y = window.size.y+1; bendwindow.size.y = window.size.y; // ¿Ö +1À» ÇßÀ»±î... if (new_mc_buf(bendwindow) == false) return; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } if (!waItr->startScanLine_VBuff(window.size.y + 1)) goto fail; if (!windowItr->startScanLine()) goto fail; if (Image->uBitmap->BitsPerPixel==8) { if (sw) { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = bendwindow.size.y; for (j=0; j < bendwindow.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < bendwindow.size.x; i++) { if(Dsx1>0){ xx=x-sqrt(fabs(radius*radius-(j+window.s.y-cy)*(j+window.s.y-cy))); if(radius=0 && diff_X < window.size.x){ waItr->getScanLine(j, diff_X, 1); if(waItr->isInArea(diff_X)){ windowItr->copyPixel(i, waItr->getPixelPointer(diff_X)); } else { // windowItr->copyAndBlank(i, waItr->getPixelPointer(diff_X)); windowItr->setToBlank(i); } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = bendwindow.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < bendwindow.size.x; i++) { if(Dsx1>0){ xx=x-sqrt(fabs(radius*radius-(j+window.s.y-cy)*(j+window.s.y-cy))); if(radius= 0 && diff_X < window.size.x){ waItr->getScanLine(j, diff_X, 1); if (waItr->isInArea(diff_X)) { if (waItr->isNotBGColor(diff_X)) { windowItr->copyPixel(i, waItr->getPixelPointer(diff_X)); } else { windowItr->copyAndBlank(i, waItr->getPixelPointer(diff_X)); } } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } else { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (j=0; j < window.size.y; j++) { StatusProgress->Position = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { // windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { if (waItr->isNotBGColor(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); } } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } } else { diffY=0; if (sw) { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = bendwindow.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < bendwindow.size.x; i++) { if(Dsx1>0){ xx=x-sqrt(fabs(radius*radius-(j+window.s.y-cy)*(j+window.s.y-cy))); if(radius= 0 && diff_X < window.size.x){ waItr->pixelCenter(diff_X, j, diffX, diffY, centerColor); waItr->getScanLine(j, diff_X, 1); if (waItr->isInArea(diff_X)) { windowItr->copyPixel(i, centerColor); } else { // windowItr->copyAndBlank(i, centerColor); windowItr->setToBlank(i); } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = bendwindow.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < bendwindow.size.x; i++) { if(Dsx1>0){ xx=x-sqrt(fabs(radius*radius-(j+window.s.y-cy)*(j+window.s.y-cy))); if(radius= 0 && diff_X < window.size.x){ waItr->pixelCenter(diff_X, j, diffX, diffY, centerColor); waItr->getScanLine(j, diff_X, 1); if (waItr->isInArea(diff_X)) { if (waItr->isNotBGColor(diff_X)) { windowItr->copyPixel(i, centerColor); } else { windowItr->copyAndBlank(i, centerColor); } } } else { windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } else { switch (FullViewForm->Super) { case sOff: StatusProgress->Maximum = window.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { // windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); windowItr->setToBlank(i); } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; case sOverlap: case sNormal: case sGauze: StatusProgress->Maximum = window.size.y; for (j=0;jPosition = j; windowItr->getScanLine(j, 0, bendwindow.size.x); for (i=0; i < window.size.x; i++) { waItr->getScanLine(j, i, 1); if (waItr->isInArea(i)) { if (waItr->isNotBGColor(i)) { windowItr->copyPixel(i, waItr->getPixelPointer(i)); } else { windowItr->copyAndBlank(i, waItr->getPixelPointer(i)); } } } windowItr->putScanLine(j, 0, bendwindow.size.x); } StatusProgress->End(); break; } } } waItr->stopScanLine_VBuff(); windowItr->stopScanLine(); } Image->SubBitmap->Copy(window.Bitmap, SRCCOPY); // Image->SubMask->Copy(window.Mask, SRCCOPY); // new mcStatus.setImgState(WasRotated); // by celberus if(waItr) delete waItr; if(windowItr) delete windowItr; return; fail: waItr->stopScanLine(); windowItr->stopScanLine(); if(waItr) delete waItr; if(windowItr) delete windowItr; window.Mask->Destroy(); window.Bitmap->Destroy(); Image->SubBitmap->Destroy(); Image->SubMask->Destroy(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::bend_locate() { int center, ax, ay, bx, by, cx, cy, dx, dy, e; double x, y, tx1, ty1, tx2, ty2, sr, lr, ct, st, part, angle, cltheta; if (Dsx == Dsy) { tx1 = window.s.x; ty1 = window.s.y; tx2 = window.e.x; ty2 = window.e.y; Lsx = tx1; Lsy = ty1; Lex = tx2; Ley = ty1; MainImageForm->DrawLineLocate(Point(Lsx, Lsy), Point(Lex, Ley),4); Lex = tx1; Ley = ty2; MainImageForm->DrawLineLocate(Point(Lsx, Lsy), Point(Lex, Ley),4); Lsx = tx2; Lsy = ty2; Lex = tx2; Ley = ty1; MainImageForm->DrawLineLocate(Point(Lsx, Lsy), Point(Lex, Ley),4); Lex = tx1; Ley = ty2; MainImageForm->DrawLineLocate(Point(Lsx, Lsy), Point(Lex, Ley),4); } else if (rgBendType->ItemIndex == 0) { if (Dsy > Dsx) { if (tR >= window.size.y / 2.0) { sr = tR - window.size.y / 2.0; lr = tR + window.size.y / 2.0; e = 1; } else { Theta = 2 * (double)window.size.x / window.size.y; sr = 0; lr = window.size.y; e = 0; } if (Sign == 1) { center = Csy - window.size.y / 2.0 + lr + e; MainImageForm->DrawArcLocate(Point(Csx,center),lr, sr, (M_PI-Theta)/2.0,(M_PI+Theta)/2.0, true,true); } else { center = Csy - window.size.y / 2.0 - sr + e; MainImageForm->DrawArcLocate(Point(Csx,center),lr, sr, (3.0*M_PI-Theta)/2.0,(3.0*M_PI+Theta)/2.0, true, true); } } else { if (tR >= window.size.x / 2.0) { sr = tR - window.size.x / 2.0; lr = tR + window.size.x / 2.0; e = 0; e = 1; } else { Theta = 2 * (double)window.size.y / window.size.x; sr = 0; lr = window.size.x; e = 0; } if (Sign == 1) { center = Csx - window.size.x / 2.0 + lr + e; MainImageForm->DrawArcLocate(Point(center,Csy),lr, sr, M_PI-Theta/2.0,M_PI+Theta/2.0,true, true); } else { center = Csx - window.size.x / 2.0 - sr + e; MainImageForm->DrawArcLocate(Point(center,Csy),lr, sr, -Theta/2.0,Theta/2.0, true, true); } } } else { if (Dsy > Dsx) { if(Sign==-1){ if (fabs(tR) > window.size.x/2) { center = Csy - window.size.y / 2.0 - sqrt(fabs(tR * tR - window.size.x * window.size.x / 4.0)) * Sign + 1; if(window.size.x/2.0>tR)return; MainImageForm->DrawArcLocate(Point(Csx,center), tR,window.size.y, acos(window.size.x/2.0/tR),M_PI-acos(window.size.x/2.0/tR), false, true); } else { center = Csy - window.size.y / 2.0 ; MainImageForm->DrawArcLocate(Point(Csx,center), window.size.x/2,window.size.y,0,M_PI, false, true); } } else { if (fabs(tR) > window.size.x/2) { center = Csy - window.size.y / 2.0 - sqrt(fabs(tR * tR - window.size.x * window.size.x / 4.0)) * Sign + 1; if(window.size.x/2.0>tR)return; MainImageForm->DrawArcLocate(Point(Csx,center), tR,window.size.y, acos(window.size.x/2.0/tR)+M_PI,-acos(window.size.x/2.0/tR), false, true); } else { center = Csy - window.size.y / 2.0 ; MainImageForm->DrawArcLocate(Point(Csx,center), window.size.x/2,window.size.y,M_PI,0, false, true); } } } else { if(Sign==-1){ if (fabs(tR) > window.size.y/2) { center = Csx - window.size.x / 2.0 - sqrt(fabs(tR * tR - window.size.y * window.size.y / 4.0)) * Sign + 1; if(window.size.y/2.0>tR)return; MainImageForm->DrawArcLocate(Point(center,Csy), tR , window.size.x, M_PI/2.0+acos(window.size.y/2.0/tR),3.0/2.0*M_PI-acos(window.size.y/2.0/tR), false, true); } else { center = Csx - window.size.x / 2.0; MainImageForm->DrawArcLocate(Point(center,Csy), window.size.y/2,window.size.x,M_PI/2.0,3.0/2.0*M_PI, false, true); } } else { if (fabs(tR) > window.size.y/2) { center = Csx + window.size.x / 2.0 - sqrt(fabs(tR * tR - window.size.y * window.size.y / 4.0)) * Sign + 1; if(window.size.y/2.0>tR)return; MainImageForm->DrawArcLocate(Point(center,Csy), tR , window.size.x, -M_PI/2.0+acos(window.size.y/2.0/tR),M_PI/2.0-acos(window.size.y/2.0/tR), false, true); } else { center = Csx + window.size.x / 2.0; MainImageForm->DrawArcLocate(Point(center,Csy), window.size.y/2,window.size.x,-M_PI/2.0,M_PI/2.0, false, true); } } } } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeBendImage() { TCursor OldCursor; OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; bendwindow.s = window.s; bendwindow.e = window.e; bendwindow.size = window.size; bendwindow.Bitmap = 0; bendwindow.Mask = 0; bendwindow.Back = 0; // Image->SubVisible = false; if (Dsx == Dsy) { SetMoveCopyImage(); } else if (rgBendType->ItemIndex == 0) { bending_fan(); } else { bending_tube(); } mcStatus.setImgState(WasRotated); Screen->Cursor = OldCursor; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::BendMouseDown(int X, int Y) { TCursor OldCursor; bool undoSw = false; if (mcStatus.getMCStep() == STRotating) { bend_locate(); MakeBendImage(); mcStatus.doneMCStep(STRotating); IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } else if (mcStatus.getMCStep() == STPutting) { //m if(cbExp->Checked == true) //m if ((undoSw = MainImageForm->UndoSave(UK_ALL, Rect(0,0,MainImageForm->iMainImage->uBitmap->Width,MainImageForm->iMainImage->uBitmap->Height))) == false) goto fail; if (SymmetryMouseDown(X, Y) && mcStatus.isMove()) { // MainImageForm->WorkAreaReset(); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, true); } return; fail: if (undoSw == false)EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::BendMouseMove(int X1, int Y1, int x, int y) { TPItemImage *Image = MainImageForm->iMainImage; int a; if (mcStatus.getMCStep() == STRotating) { int X = x, Y = y; //20010204 if (MoveCopyRect.size.x >= MoveCopyRect.size.y) a = MoveCopyRect.size.x; //20010204 else a = MoveCopyRect.size.y; //20010204 if (IsDraw) bend_locate(); if (repaintsw == true) { //by k3dogs(20001106) SetMoveCopyImage(); repaintsw = false; } Dsx1 = Csx-X; Dsy1 = Csy-Y; Dsx = abs(Dsx1); Dsy = abs(Dsy1); /* if (Dsy > Dsx) { if (Csy < Y) { Theta = fabs(M_PI * (Y - Csy) / (Image->Height - (Csy - Image->PositionY))); if(Theta > M_PI) Theta = M_PI; Sign = 1; } else { Theta = fabs(M_PI * (Csy - Y) / (Csy - Image->PositionY)); Sign = -1; } if (Theta) tR = M_PI * window.size.x / (2.0 * Theta); else tR = 0; } else { if (Csx < X) { Theta = fabs(M_PI * (X - Csx) / (Image->Width - (Csx - Image->PositionX))); if(Theta > M_PI) Theta = M_PI; Sign = 1; } else { Theta = fabs((M_PI * (Csx - X) / (Csx - Image->PositionX))); Sign = -1; } if (Theta) tR = M_PI * window.size.y / (2.0 * Theta); else tR = 0; } *///////////////////////////////////////////////20010204 if (Dsy > Dsx) { if (Csy < Y) { Theta = fabs(M_PI * (Y - Csy) / (a / 2.0)); if(Theta > M_PI) Theta = M_PI; Sign = 1; } else { Theta = fabs(M_PI * (Csy - Y) / (a / 2.0)); if(Theta > M_PI) Theta = M_PI; Sign = -1; } if (Theta) tR = M_PI * window.size.x / (2.0 * Theta); else tR = 0; } else { if (Csx < X) { Theta = fabs(M_PI * (X - Csx) / (a / 2.0)); if(Theta > M_PI) Theta = M_PI; Sign = 1; } else { Theta = fabs(M_PI * (Csx - X) / (a / 2.0)); if(Theta > M_PI) Theta = M_PI; Sign = -1; } if (Theta) tR = M_PI * window.size.y / (2.0 * Theta); else tR = 0; } /////////////////20010204 if (rgBendType->ItemIndex == 0) { Theta = Theta * 2.0; tR = tR / M_PI; } bend_locate(); IsDraw = true; } else if (mcStatus.getMCStep() == STPutting) { int X = X1, Y = Y1; SymmetryMouseMove(X, Y); } } //--------------------------------------------------------------------------- // Public Function //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::InitRange() { TPItemImage *Image = MainImageForm->iMainImage; window.s.x = MainImageForm->WorkArea->Range.left; window.s.y = MainImageForm->WorkArea->Range.top; window.e.x = MainImageForm->WorkArea->Range.right; window.e.y = MainImageForm->WorkArea->Range.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; MoveCopyRect.s = window.s; MoveCopyRect.e = window.e; MoveCopyRect.size = window.size; MoveCopyRect.Bitmap = 0; MoveCopyRect.Mask = 0; MoveCopyRect.Back = 0; Image->SubRange.left = window.s.x; Image->SubRange.top = window.s.y; source = Rect(window.s.x, window.s.y, window.e.x, window.e.y); // ExpRect = window; // ExpansionRect = window; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::InitForm() { TCursor OldCursor; TPItemImage *Image = MainImageForm->iMainImage; ParentHeight = Parent->Height+15; ClientHeight = 280; mpPanel->Top = 171; Parent->Height = ParentHeight+ClientHeight; OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; Parent->Repaint(); Image->SubEnabled = true; if ((window.Bitmap = new TUnionBitmap) == NULL) goto fail; // convert by celberus if ((window.Mask = new TUnionBitmap) == NULL) goto fail; // convert by celberus if ((window.Back = new TUnionBitmap) == NULL) goto fail; // convert by celberus InitRange(); if (Image->uBitmap->BitsPerPixel==8) { MainImageForm->Palette->ToRGBQUAD(rgb, 256); } backup = false; // expStepMC = 0; // old mcStatus.setExp(false); mcStatus.setImgState(HasNone); mcStatus.setMCStep(STNone); // Mask = NULL; // Rotateback = NULL; Image->InitBackGround(0x02); ReadIni(); SetMoveCopyImage(); // rgBendType->ItemIndex = 0; IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo // Image->Cross = false; // Image->CrossLine = false; by playzzang ( crossline ) Screen->Cursor = OldCursor; DrawMousePoint(MousePointPlace); return; fail: Screen->Cursor = OldCursor; if (window.Bitmap) { delete window.Bitmap; window.Bitmap = 0; } if (window.Mask) { delete window.Mask; window.Mask = 0; } if (window.Back) { delete window.Back; window.Back = 0; } EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::ExitForm(void) { TUnionBitmap *Lmp, *Bmp = NULL; // convert by celberus COLORREF C; TPItemImage *Image = MainImageForm->iMainImage; //¿øº» ³Ö±â BackToBeforeRotate(); //¿øº» ³Ö±â WriteIni(); if (IsDraw) { if (mcStatus.getMCType() == MCRotate) { Rotate_Rect(); } else if (mcStatus.getMCType() == MCBend) { bend_locate(); } } IsDraw = false; Image->OnPaintLocate = NULL;/////////////////by jeegeo Image->Repaint(); Image->ExitBackGround(0x02); if (window.Bitmap) { delete window.Bitmap; window.Bitmap = 0; } if (window.Mask) { delete window.Mask; window.Mask = 0; } if (window.Back) { delete window.Back; window.Back = 0; } if (Rotateback) {delete Rotateback; Rotateback = NULL;} //===================== by playzzang ( crossline ) ======================== // MainImageForm->iMainImage->CrossLine = false; // MainImageForm->iMainImage->Cross = false; Image->setSubPaintType(typeNone); // by celberus Image->SubVisible = false; Image->SubEnabled = false; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::ReadIni() { int type, state; TIniFile *MoveCopyIni = NULL; MoveCopyIni = new TIniFile(DirectoryItem + "\\MoveCopy.ini"); if (MoveCopyIni) { state = MoveCopyIni->ReadInteger("MoveCopy", "State", 0); if (state) { mcStatus.setIsMove(true); sbMove->Down = true; } else { mcStatus.setIsMove(false); sbCopy->Down = true; } type = MoveCopyIni->ReadInteger("MoveCopy", "Type", 0); if (type == 0) { mcStatus.setMCType(MCNormal); sbNormal->Down = true; } else if (type == 1) { mcStatus.setMCType(MCTBMirror); sbTBMirror->Down = true; } else if (type == 2) { mcStatus.setMCType(MCLRMirror); sbLRMirror->Down = true; } else if (type == 3) { mcStatus.setMCType(MCTBLRMirror); sbTBLRMirror->Down = true; } BeforeDeg = MoveCopyIni->ReadInteger("Rotate", "BeforeDeg", 0); delete MoveCopyIni; } } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::WriteIni() { int state, type; TIniFile *MoveCopyIni = NULL; if (!mcStatus.isMove()) state = 0; else state = 1; if (mcStatus.getMCType() == MCTBMirror) type = 1; else if (mcStatus.getMCType() == MCLRMirror) type = 2; else if (mcStatus.getMCType() == MCTBLRMirror) type = 3; else type = 0; MoveCopyIni = new TIniFile(DirectoryItem + "\\MoveCopy.ini"); if (MoveCopyIni) { MoveCopyIni->WriteInteger("MoveCopy", "State", state); MoveCopyIni->WriteInteger("MoveCopy", "Type", type); MoveCopyIni->WriteInteger("Rotate", "BeforeDeg", BeforeDeg); delete MoveCopyIni; } } //OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SetMoveCopyImage(bool sw) /* TODO : SameImageInWorkArea ¸¦ Àß ÇØÁÖ¾î¾ß.. */ { // Ŭ·¡½º º¯¼ö¿¡µµ sw°¡ ÀÖ´Ù. ¤Ñ.¤Ñ TCursor OldCursor; COLORREF bgc; TPItemImage *Image = MainImageForm->iMainImage; OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; // Image->CrossLine = false; Image->SubVisible = false; /* if (MCState == TMC_COPY) { sbCopy->Down = true; } else if (MCState == TMC_MOVE) { sbMove->Down = true; }*/ if (mcStatus.getMCType() == MCRotate) { if (IsDraw) Rotate_Rect(); if (sw) MakeRotateImage(); /* TODO : sw´Â ¶Ç ¹º°¡? */ // sw´Â ÆÄ¸®¹ÌÅÍÀε¥ sw¸¦ true·Î ÇØ¼­ ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â ºÎºÐÀº ÀÌ Å¬·¡½º¿¡´Â ¾ø´Ù. ÇÏÁö¸¸ ÀÌ ¸Þ¼Òµå´Â publicÀÌ´Ù. Á¨Àå } else if (mcStatus.getMCType() == MCRotatingMirror) { if (sw) MakeRotatingMirrorImage(); } else if (mcStatus.getMCType() == MCBend) { if (IsDraw) bend_locate(); if (sw) MakeBendImage(); } else { MoveCopyRect.s = window.s; MoveCopyRect.e = window.e; MoveCopyRect.size = window.size; if(!CreateBitmaps(window.size.x, window.size.y)) goto fail; if (Image->uBitmap->BitsPerPixel==8) { waItr = (WAItr *) new WAItr_8(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_8(&window); } else { waItr = (WAItr *) new WAItr_24(Image->uBitmap, Image->LayerMask, MainImageForm->WorkArea, &window); windowItr = (WindowItr *) new WindowItr_24(&window); bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); waItr->setBGColor(bgc); } if (!windowItr->startScanLine()) goto fail; if (!waItr->startScanLine()) goto fail; if (mcStatus.getMCType() == MCNormal) { MakeNormalImage(); mcStatus.setSameImageInWA(true); } else if (mcStatus.getMCType() == MCTBMirror) { MakeTBMirrorImage(); mcStatus.setSameImageInWA(false); } else if (mcStatus.getMCType() == MCLRMirror) { MakeLRMirrorImage(); mcStatus.setSameImageInWA(false); } else if (mcStatus.getMCType() == MCTBLRMirror) { MakeTBLRMirrorImage(); mcStatus.setSameImageInWA(false); } windowItr->stopScanLine(); waItr->stopScanLine(); mcStatus.setImgState(HasOriginal); // by celberus if(waItr) delete waItr; if(windowItr) delete windowItr; Image->SubBitmap->Copy(window.Bitmap, SRCCOPY); Image->SubMask->Copy(window.Mask, SRCCOPY); // by celberus Èæ¹é À̹ÌÁö ¹®Á¦ } Screen->Cursor = OldCursor; MainMenuForm->showMovecopy = true; return; fail: Screen->Cursor = OldCursor; windowItr->stopScanLine(); waItr->stopScanLine(); if(waItr) delete waItr; if(windowItr) delete windowItr; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MoveCopyMouseDown(int X, int Y) { TCursor OldCursor; TPItemImage *Image = MainImageForm->iMainImage; int ec = EC_NONE; RECT rd, rs1, rs2; RECT rc; bool undoSw = false; if (mcStatus.needExp()) { if(mcStatus.getMCStep() & STExpending){ if(X > window.s.x)X = X - (ExpRect.right - ExpRect.left); if(Y > window.s.y)Y = Y - (ExpRect.bottom - ExpRect.top); ExpansionRect.left = X; ExpansionRect.top = Y; ExpansionRect.right = X + (ExpRect.right - ExpRect.left); ExpansionRect.bottom = Y + (ExpRect.bottom - ExpRect.top); if (ExpansionRect.right > Image->uBitmap->Width) { ExpansionRect.right = Image->uBitmap->Width; } if (ExpansionRect.bottom > Image->uBitmap->Height) { ExpansionRect.bottom = Image->uBitmap->Height; } rs1.left = window.s.x; rs1.top = window.s.y; rs1.right = window.s.x + window.size.x; rs1.bottom = window.s.y + window.size.y; rs2 = ExpansionRect; UnionRect(&rd, &rs1, &rs2); ExpbackRect.left = window.s.x; ExpbackRect.right = window.e.x; ExpbackRect.top = window.s.y; ExpbackRect.bottom = window.e.y; switch (mcStatus.getMCType()) { case MCRotate: case MCRotatingMirror: case MCBend: if ((Rotateback = new TUnionBitmap)==NULL) goto fail; // convert by celberus if ((RotateMaskback = new TUnionBitmap)==NULL) goto fail; // convert by celberus //¿øº» º¹»ç. RotatebackRect = ExpansionRect; BackUpBeforeRotate(); //¿øº» º¹»ç. MainImageForm->iMainImage->SubVisible = false; if(mcStatus.isMove()){ if (MainImageForm->iMainImage->LayerMask) { ExpansionMakeBitmapRotateLayer(); } else { ExpansionMakeBitmapRotate(); } window.s.x = ExpansionRect.left; window.e.x = ExpansionRect.right; window.s.y = ExpansionRect.top; window.e.y = ExpansionRect.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; } else { if (MainImageForm->iMainImage->LayerMask) { ExpansionMakeBitmapRotateLayer(); } else { ExpansionMakeBitmapRotate(); } window.s.x = ExpansionRect.left; window.e.x = ExpansionRect.right; window.s.y = ExpansionRect.top; window.e.y = ExpansionRect.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; } // rc = Rect(X, Y, X + Image->SubBitmap->Width, Y + Image->SubBitmap->Height); old rc = Rect(X, Y, X + window.Mask->Width, Y + window.Mask->Height); // by celberus if (MainImageForm->iMainImage->LayerMask) { First.x = ExpansionRect.left; First.y = ExpansionRect.top; Second.x = ExpansionRect.right; Second.y = ExpansionRect.bottom; // MainImageForm->WorkArea->IrregularRegion(Image->SubMask, rc); // by celberus SetBitmapRegion(); } else { // MainImageForm->WorkArea->IrregularRegion(Image->SubMask, rc); old MainImageForm->WorkArea->IrregularRegion(window.Mask, rc); } MainImageForm->WorkAreaChange(); ::RepaintImage(); // SetMCImage(); /* TODO : À̰ÍÀÌ ÇÊ¿äÇÑ ÀÌÀ¯´Â? */ X = X + (ExpRect.right - ExpRect.left)/2.0; Y = Y + (ExpRect.bottom - ExpRect.top)/2.0; if(mcStatus.getMCType() == MCBend){ Csx = window.s.x + window.size.x / 2.0; Csy = window.s.y + window.size.y / 2.0; Dsx = Csx; Dsy = Csy; tR = 0; Sign = 0; Theta = 0; mcStatus.setMCStep(STRotating); } mcStatus.setExp(false); mcStatus.setImgState(WasExpended); /* TODO : Expended ¿Í Rotated ¸¦ µ¿½Ã¿¡ ¸¸Á·ÇÏ´Â °æ¿ìµµ »ý°¢ÇؾßÇÔ */ mcStatus.doneMCStep(STExpending); Image->setSubPaintType(typeNone); break; default: // ExpMakeBitmap(); /* TODO : À̺κеµ ºÒÇÊ¿äÇØ º¸ÀÓ */ window.Mask->ResizeStretch((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top)); window.Bitmap->ResizeStretch((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top)); Image->SubMask->ResizeStretch((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top)); Image->SubBitmap->ResizeStretch((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top)); if(mcStatus.isMove()){ window.s.x = ExpansionRect.left; window.e.x = ExpansionRect.right; window.s.y = ExpansionRect.top; window.e.y = ExpansionRect.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; MoveCopyRect.s.x = ExpansionRect.left; MoveCopyRect.e.x = ExpansionRect.right; // New MoveCopyRect.s.y = ExpansionRect.top; MoveCopyRect.e.y = ExpansionRect.bottom; MoveCopyRect.size.x = MoveCopyRect.e.x - MoveCopyRect.s.x; MoveCopyRect.size.y = MoveCopyRect.e.y - MoveCopyRect.s.y; }else{ window.s.x = ExpansionRect.left; window.e.x = ExpansionRect.right; window.s.y = ExpansionRect.top; window.e.y = ExpansionRect.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; MoveCopyRect.s.x = ExpansionRect.left; MoveCopyRect.e.x = ExpansionRect.right; // New MoveCopyRect.s.y = ExpansionRect.top; MoveCopyRect.e.y = ExpansionRect.bottom; MoveCopyRect.size.x = MoveCopyRect.e.x - MoveCopyRect.s.x; MoveCopyRect.size.y = MoveCopyRect.e.y - MoveCopyRect.s.y; } mcStatus.setExp(false); mcStatus.setImgState(WasExpended); /* TODO : Expended ¿Í Rotated ¸¦ µ¿½Ã¿¡ ¸¸Á·ÇÏ´Â °æ¿ìµµ »ý°¢ÇؾßÇÔ */ mcStatus.doneMCStep(STExpending); Image->setSubPaintType(typeNone); break; } } sbBeforeDeg->Enabled = true; cbRotate->Enabled = true; btnRotateRun->Enabled = true; }else{ OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; if(mcStatus.getMCType() == MCRotate || mcStatus.getMCType() == MCBend||mcStatus.getMCType() == MCRotatingMirror) { X = X-Image->SubBitmap->Width/2.0; Y = Y-Image->SubBitmap->Height/2.0; } else { if (MousePointPlace == 2) { X = X-Image->SubBitmap->Width; } else if (MousePointPlace == 3) { Y = Y-Image->SubBitmap->Height; } else if (MousePointPlace == 4) { X = X-Image->SubBitmap->Width; Y = Y-Image->SubBitmap->Height; } else if (MousePointPlace == 5) { X = X-Image->SubBitmap->Width/2.0; Y = Y-Image->SubBitmap->Height/2.0; } } if (X<0) X = 0; else if (X>Image->uBitmap->Width-Image->SubBitmap->Width) X = Image->uBitmap->Width-Image->SubBitmap->Width; if (Y<0) Y = 0; else if (Y>Image->uBitmap->Height-Image->SubBitmap->Height) Y = Image->uBitmap->Height-Image->SubBitmap->Height; switch (mcStatus.getMCType()) { case MCRotate: RotateMouseDown(X, Y); break; case MCRotatingMirror: RotatingMirrorMouseDown(X,Y);break; case MCBend: BendMouseDown(X, Y); break; default: //m if(cbExp->Checked == true) //m if ((undoSw = MainImageForm->UndoSave(UK_ALL, Rect(0,0,Image->uBitmap->Width,Image->uBitmap->Height))) == false) goto fail; if (SymmetryMouseDown(X, Y)){ if(mcStatus.isMove()) { // switch (MCItem) { // rc = Rect(X, Y, X + Image->SubBitmap->Width, Y + Image->SubBitmap->Height); // MainImageForm->WorkArea->IrregularRegion(Image->SubMask, rc); // } // MainImageForm->WorkAreaChange(); window.s.x = MainImageForm->WorkArea->Range.left; window.s.y = MainImageForm->WorkArea->Range.top; window.e.x = MainImageForm->WorkArea->Range.right; window.e.y = MainImageForm->WorkArea->Range.bottom; window.size.x = window.e.x - window.s.x; window.size.y = window.e.y - window.s.y; sbNormal->Down = true; mcStatus.setMCType(MCNormal); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } } if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, true); } //¿øº» ³Ö±â BackToBeforeRotate(); //¿øº» ³Ö±â Screen->Cursor = OldCursor; } if (Mask) delete Mask; return; fail: if (Mask) delete Mask; if (Rotateback) {delete Rotateback; Rotateback = NULL;} if (RotateMaskback) {delete RotateMaskback; RotateMaskback = NULL;} if (undoSw == false)EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MoveCopyMouseMove(int X, int Y) { int x = X, y = Y; //k3dogs bend¿¡¼­ ¹ÝÁö¸§°ú °¢µµÀÇ ±âÁØÀÌ ¸ðÈ£ÇØ¼­ windowÀÇ Áß½ÉÀ» ±âÁØÀ¸·Î »ï±â À§ÇØ TPItemImage *Image = MainImageForm->iMainImage; if (mcStatus.needExp()) { if(mcStatus.getMCStep() & STExpending){ MakeExpNMImage(X, Y); } }else{ Image->setSubPaintType(typeNone); // by celberus Image->SetCrossPos(Point(X, Y)); if(mcStatus.getMCType() == MCRotate || mcStatus.getMCType() == MCBend||mcStatus.getMCType() == MCRotatingMirror) { X = X - Image->SubBitmap->Width/2.0; Y = Y - Image->SubBitmap->Height/2.0; MouseStop->Enabled = false; //by k3dogs(20001104)MoveCopy-Rotate,Bend ¿¡¼­ mouseStop MouseStop->Enabled = true; //Timer reSetting } else { if (MousePointPlace == 2) { X = X - Image->SubBitmap->Width; } else if (MousePointPlace == 3) { Y = Y - Image->SubBitmap->Height; } else if (MousePointPlace == 4) { X = X - Image->SubBitmap->Width; Y = Y - Image->SubBitmap->Height; } else if (MousePointPlace == 5) { X = X - Image->SubBitmap->Width/2.0; Y = Y - Image->SubBitmap->Height/2.0; } } if (X<0) X = 0; else if (X > Image->uBitmap->Width - Image->SubBitmap->Width) X = Image->uBitmap->Width - Image->SubBitmap->Width; if (Y<0) Y = 0; if (Y>Image->uBitmap->Height - Image->SubBitmap->Height) Y = Image->uBitmap->Height - Image->SubBitmap->Height; switch (mcStatus.getMCType()) { case MCRotate: RotateMouseMove(X, Y); break; case MCRotatingMirror: RotatingMirrorMouseMove(X,Y);break; case MCBend: BendMouseMove(X, Y, x, y); break; default: { SymmetryMouseMove(X, Y); break; } } } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::iMainImageChange(void) { // MainImageForm->iMainImage->CrossLine = false; if (IsDraw) {IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::mpImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int w, h; w = mpImage->Width; h = mpImage->Height; if ((mcStatus.getMCType() != MCRotate) && (mcStatus.getMCType() != MCBend)&&(mcStatus.getMCType()!=MCRotatingMirror)) { if((X>w/4 && X<=3*w/4) && (Y>h/4 && Y<= 3*h/4)) { //Center MousePointPlace = Center; } else if((X>=0 && X<=w/2) && (Y>=0 && Y<=h/2)) { //Left-Top MousePointPlace = LeftTop; } else if((X>=w/2 && X<=w) && (Y>=0 && Y<=h/2)) { //Right-Top MousePointPlace = RightTop; } else if((X>=0 && X<=w/2) && (Y>h/2 && Y<= h)) { //Left-Bottom MousePointPlace = LeftBottom; } else if((X>w/2 && X<=w) && (Y>h/2 && Y<=h)) { //Right-Bottom MousePointPlace = RightBottom; } DrawMousePoint(MousePointPlace); } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::DrawMousePoint(int mousepoint) { int width, height; TRect canvas; width = mpImage->Width; height = mpImage->Height; canvas = Rect(0,0,width,height); mpImage->Canvas->Brush->Color = clWhite; mpImage->Canvas->FillRect(canvas); //Create New MouseMark mpImage->Canvas->Pen->Color = clBlack; mpImage->Canvas->Pen->Width = 3; mpImage->Canvas->Brush->Color = clWhite; switch(mousepoint) { case 1: mpImage->Canvas->Rectangle(3, 3, 13, 13); break; case 2: mpImage->Canvas->Rectangle(width-13, 3, width-3, 13); break; case 3: mpImage->Canvas->Rectangle(3, height-13, 13, height-3); break; case 4: mpImage->Canvas->Rectangle(width-13, height-13, width-3, height-3); break; default: mpImage->Canvas->Rectangle(width/2-5, height/2-5, width/2+5, height/2+5); break; } } //OK //--------------------------------------------------------------------------- //---------------------------------------------------------------------------by k3dogs(20001106) void __fastcall TMoveCopyForm::MouseStopTimer(TObject *Sender) { if(RotatePreView->Checked == false)return; MouseStop->Enabled = false; repaintsw = true; int px, py; ////////////////////////////////////////////////////////////////////////////////Rotate if ((mcStatus.getMCStep() == STRotating) && (mcStatus.getMCType() == MCRotate)) { TPItemImage *Image = MainImageForm->iMainImage; RotateArea = Point(max_x - min_x+1, max_y - min_y+1); MakeRotateImage(); px = min_x; py = min_y; MainImageForm->iMainImage->OnPaintLocate = NULL; //by jeegeo SymmetryMouseMove(px, py); } ////////////////////////////////////////////////////////////////////////////////RotatingMirror else if ((mcStatus.getMCStep() == STRotating) && (mcStatus.getMCType() == MCRotatingMirror)) { TPItemImage *Image = MainImageForm->iMainImage; RotateArea = Point(max_x - min_x+1, max_y - min_y+1); MakeRotatingMirrorImage(); px = min_x; py = min_y; double r=sqrt(window.size.x*window.size.x+window.size.y*window.size.y); MainImageForm->iMainImage->OnPaintLocate = NULL; //by jeegeo SymmetryMouseMove(px-r*sin(Theta), py-r*cos(Theta)); } ////////////////////////////////////////////////////////////////////////////////bending_fan min_x, min_y¸¦ ±¸ÇÑ´Ù. else if ((mcStatus.getMCStep() == STRotating) && (mcStatus.getMCType() == MCBend)) { TPItemImage *Image = MainImageForm->iMainImage; if (rgBendType->ItemIndex == 0) { int cx1, cy1; double sr, lr; if (Dsy>Dsx) { if (tR>=window.size.y/2.0) { sr = tR-window.size.y/2.0; lr = tR+window.size.y/2.0; } else { Theta = 2*(double)window.size.x/window.size.y; sr = 0; lr = window.size.y; } if(Dsy1<0){ cx1 = Csx; cy1 = window.s.y+lr; min_x = cx1-lr*sin(Theta/2); min_y = cy1-lr; max_x = cx1+lr*sin(Theta/2)+1; max_y = cy1-sr*cos(Theta/2); if(Theta>M_PI){ min_x = cx1-lr; max_x = cx1+lr+1; max_y = cy1+lr*sin((Theta-M_PI)/2); } } else { cx1 = Csx; cy1 = window.e.y-lr; min_x = cx1-lr*sin(Theta/2); min_y = cy1+sr*cos(Theta/2); max_x = cx1+lr*sin(Theta/2)+1; max_y = cy1+lr; if(Theta>M_PI){ min_x = cx1-lr; max_x = cx1+lr+1; min_y = cy1-lr*sin((Theta-M_PI)/2); } } } else { if (tR>=window.size.x/2.0) { sr = tR-window.size.x/2.0; lr = tR+window.size.x/2.0; } else { Theta = 2*(double)window.size.y/window.size.x; sr = 0; lr = window.size.x; } if(Dsx1<0){ cx1 = window.s.x+lr; cy1 = Csy; min_x = cx1-lr; min_y = cy1-lr*sin(Theta/2); max_x = cx1-sr*cos(Theta/2); max_y = cy1+lr*sin(Theta/2)+1; if(Theta>M_PI){ min_y = cy1-lr ; max_y = cy1+lr; max_x = cx1+lr*sin((Theta-M_PI)/2)+1; } } else { cx1 = window.e.x-lr; cy1 = Csy; min_x = cx1+sr*cos(Theta/2); min_y = cy1-lr*sin(Theta/2); max_x = cx1+lr; max_y = cy1+lr*sin(Theta/2)+1; if(Theta>M_PI){ min_y = cy1-lr; max_y = cy1+lr+1; min_x = cx1-lr*sin((Theta-M_PI)/2); } } } px = min_x; py = min_y; ////////////////////////////////////////////////////////////////////////////////bending_tube ¿¡¼­ copy } else if (rgBendType->ItemIndex == 1) { int cx, cy; double y, x, radius; if ((Theta <= 0) || (Theta >= M_PI)) { if (Theta <= 0) Theta = M_PI*0.05; else Theta = M_PI*0.95; } if (Dsy>Dsx) { cx = window.s.x+window.size.x/2.0; if(Dsy1>0){ cy = window.s.y-window.size.x/(4*tan((M_PI-Theta)/2)); if (cy < window.s.y) { y = window.s.y-(cx-window.s.x)*(cx-window.s.x)/(cy-window.s.y); radius = sqrt((cx-window.s.x)*(cx-window.s.x)+(y-window.s.y)*(y-window.s.y)); bendwindow.size.y=window.e.y-(y-radius); } px = window.s.x; py = window.e.y - bendwindow.size.y; } else { cy = window.e.y+window.size.x/(4*tan((M_PI-Theta)/2)); if (cy > window.e.y) { y = window.e.y-(cx-window.e.x)*(cx-window.e.x)/(cy-window.e.y); radius = sqrt((cx-window.e.x)*(cx-window.e.x)+(y-window.e.y)*(y-window.e.y)); bendwindow.size.y=y+radius-window.s.y; } px = window.s.x; py = window.s.y; } } else { cy = window.s.y+window.size.y/2.0; if(Dsx1>0){ cx = window.s.x-window.size.y/(4*tan((M_PI-Theta)/2)); if (cx < window.s.x) { x = window.s.x-(cy-window.s.y)*(cy-window.s.y)/(cx-window.s.x); radius = sqrt((cy-window.s.y)*(cy-window.s.y)+(x-window.s.x)*(x-window.s.x)); bendwindow.size.x=window.e.x-(x-radius); } px = window.e.x - bendwindow.size.x; py = window.s.y; } else { cx = window.e.x+window.size.y/(4*tan((M_PI-Theta)/2)); if (cx > window.e.x) { x = window.e.x-(cy-window.e.y)*(cy-window.e.y)/(cx-window.e.x); radius = sqrt((cy-window.e.y)*(cy-window.e.y)+(x-window.e.x)*(x-window.e.x)); bendwindow.size.x=x+radius-window.s.x; } px = window.s.x; py = window.s.y; } } } MakeBendImage(); if (px<0) px = 0; else if (px > Image->uBitmap->Width - (max_x - min_x)) px = Image->uBitmap->Width - (max_x - min_x); if (py<0) py = 0; else if (py > Image->uBitmap->Height - (max_y - min_y)) py = Image->uBitmap->Height - (max_y - min_y); MainImageForm->iMainImage->OnPaintLocate = NULL; //by jeegeo SymmetryMouseMove(px, py); } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MakeExpNMImage(int X, int Y) { /* TODO : SubPaint¸¦ ¹Ù²ãÁ༭ ¼º´ÉÇâ»óÀ» ²ÒÇÒ ¼ö ÀÖÀ» °Í */ bool crtSw1 = false, crtSw2 = false; RECT r; TPItemImage *Image = MainImageForm->iMainImage; if (X < 0) X = 0; else if (X > Image->uBitmap->Width) X = Image->uBitmap->Width; if (Y < 0) Y = 0; else if (Y > Image->uBitmap->Height) Y = Image->uBitmap->Height; if (squareExp) { if (X < window.s.x) { ExpRect.left = X; ExpRect.right = window.e.x; } else { ExpRect.left = window.s.x; ExpRect.right = X; } if (Y < window.s.y) { ExpRect.top = Y; ExpRect.bottom = window.e.y; } else { ExpRect.top = window.s.y; ExpRect.bottom = Y; } // ExpRect.size.x : ExpRect.size.y = window.size.x : window.size.y int SubX = (ExpRect.bottom - ExpRect.top) * window.size.x / window.size.y; int SubY = (ExpRect.right - ExpRect.left) * window.size.y / window.size.x; if(SubX > (ExpRect.right - ExpRect.left)){ if (Y < window.s.y) { ExpRect.top = window.e.y - SubY; ExpRect.bottom = window.e.y; } else { ExpRect.top = window.s.y; ExpRect.bottom = window.s.y + SubY; } }else if(SubY > (ExpRect.bottom - ExpRect.top)){ if (X < window.s.x) { ExpRect.left = window.e.x - SubX; ExpRect.right = window.e.x; } else { ExpRect.left = window.s.x; ExpRect.right = window.s.x + SubX; } } } // by celberus shift ´©¸£°í È®´ëÃà¼Ò else { if (X < window.s.x) { ExpRect.left = X; ExpRect.right = window.e.x; } else { ExpRect.left = window.s.x; ExpRect.right = X; } if (Y < window.s.y) { ExpRect.top = Y; ExpRect.bottom = window.e.y; } else { ExpRect.top = window.s.y; ExpRect.bottom = Y; } } Image->SubRange = ExpRect; if ((ExpRect.right - ExpRect.left) <= 0 || (ExpRect.bottom - ExpRect.top) <= 0) return; /* if (Image->uBitmap->BitsPerPixel==8) { if ((crtSw1 = Image->SubBitmap->Create((ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), 8, rgb)) == false) goto fail; if ((crtSw2 = Image->SubMask->Create((ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), 8, rgb)) == false) goto fail; } else { if ((crtSw1 = Image->SubBitmap->Create((ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), 24)) == false) goto fail; if ((crtSw2 = Image->SubMask->Create((ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), 1)) == false) goto fail; } Image->SubMask->UnionStretchBlt(0, 0, (ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), window.Mask, 0, 0, window.size.x, window.size.y, SRCCOPY); Image->SubBitmap->UnionStretchBlt(0, 0, (ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), window.Bitmap, 0, 0, window.size.x, window.size.y, SRCCOPY); */ Image->setSubPaintType(typeExpansion); // by celberus Image->setSubPaintRatio((double)(ExpRect.right - ExpRect.left) / window.size.x, (double)(ExpRect.bottom - ExpRect.top) / window.size.y ); // by celberus Image->SubVisible = true; r.left = paintrect.left < Image->SubRange.left ? paintrect.left : Image->SubRange.left; r.top = paintrect.top < Image->SubRange.top ? paintrect.top : Image->SubRange.top; r.right = paintrect.right > Image->SubRange.right ? paintrect.right : Image->SubRange.right; r.bottom = paintrect.bottom > Image->SubRange.bottom ? paintrect.bottom : Image->SubRange.bottom; paintrect = Image->SubRange; Image->RectPaint(r); return; fail: if (crtSw2) Image->SubMask->Destroy(); if (crtSw1) Image->SubBitmap->Destroy(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } // OK //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::cbExpClick(TObject *Sender) { MainImageForm->ResetDraw(true); IsDraw = false; if (backup) { // rotatebackÀ» ÀúÀåÇßÀ¸¸é.. mcStatus.cancelMCStep(STRotating); BackToBeforeRotate(); mcStatus.setExp(cbExp->Checked); } if (cbExp->Checked) { mcStatus.setExp(true); sbBeforeDeg->Enabled = false; cbRotate->Enabled = false; btnRotateRun->Enabled = false; if (mcStatus.getImgState() != HasOriginal) { if (mcStatus.isRotatingType()) { TMCType oldMCType = mcStatus.getMCType(); mcStatus.setMCType(MCNormal); InitRange(); SetMoveCopyImage(); mcStatus.setMCType(oldMCType); mcStatus.setMCStep(STRotating); } else { InitRange(); SetMoveCopyImage(); } } mcStatus.setMCStep(STExpending); } else { mcStatus.setExp(false); mcStatus.cancelMCStep(STExpending); if (mcStatus.getMCStep() == STRotating) { MainImageForm->iMainImage->SubVisible = false; } sbBeforeDeg->Enabled = true; cbRotate->Enabled = true; btnRotateRun->Enabled = true; window.s.x = source.Left; window.s.y = source.Top; window.e.x = source.Right; window.e.y = source.Bottom; window.size.x = source.Right - source.Left; window.size.y = source.Bottom - source.Top; if (mcStatus.getImgState() != HasOriginal) { if (mcStatus.isRotatingType()) { TMCType oldMCType = mcStatus.getMCType(); if (oldMCType == MCBend) { Csx = window.s.x + window.size.x / 2.0; Csy = window.s.y + window.size.y / 2.0; Dsx = Csx; Dsy = Csy; tR = 0; Sign = 0; Theta = 0; // °ãħ (init) } mcStatus.setMCType(MCNormal); InitRange(); SetMoveCopyImage(); mcStatus.setMCType(oldMCType); mcStatus.setMCStep(STRotating); } else { InitRange(); SetMoveCopyImage(); } } } } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::MergeBitmap(POINT sp) { int i, j; Byte *IP, *MP, mm; // HDC MhDC = NULL, ThDC = NULL; convert by celberus COLORREF bgc, fcol; TPItemImage *Image = MainImageForm->iMainImage; if (Image->uBitmap->BitsPerPixel == 8) { // if ((MhDC = Image->uBitmap->CreateDC()) == NULL) goto fail; // if ((ThDC = Image->SubBitmap->CreateDC()) == NULL) goto fail; // SetStretchBltMode(ThDC, COLORONCOLOR); // StretchBlt(ThDC, 0, 0, ExpRect.size.x, ExpRect.size.y, MhDC, source.Left, source.Top, // source.Right - source.Left, source.Bottom - source.Top, SRCCOPY); Image->SubBitmap->UnionStretchBlt(0, 0, (ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), Image->uBitmap, source.Left, source.Top, source.Right - source.Left, source.Bottom - source.Top, SRCCOPY); // convert by celberus // Image->SubBitmap->DeleteDC(ThDC); ThDC = NULL; // Image->uBitmap->DeleteDC(MhDC); MhDC = NULL; if (!(Image->SubBitmap->StartScanLine())) goto fail; if (!(Image->SubMask->StartScanLine())) goto fail; if (FullViewForm->Super == sOff) { for (i=0; iSubBitmap->Height; i++) { IP = Image->SubBitmap->GetScanLine(i); MP = Image->SubMask->GetScanLine(i); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; jSubBitmap->Width; j++, IP++, MP++) { //////adsfadsf_for//////adsfadsf_Variable_Checked if (*IP) { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 *MP = 0;//////adsfadsf_Variable_Checked // if ((j+i) % 3) *MP = 0; // else *MP = 0xFF; } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 *MP = 0xFF;//////adsfadsf_Variable_Checked } } Image->SubMask->PutScanLine(i,StartX,EndX-StartX+1); ////adsfadsf } } else { for (i=0; iSubBitmap->Height; i++) { IP = Image->SubBitmap->GetScanLine(i); MP = Image->SubMask->GetScanLine(i); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; jSubBitmap->Width; j++, IP++, MP++) { //////adsfadsf_for//////adsfadsf_Variable_Checked if (*IP > 1) { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 *MP = 0;//////adsfadsf_Variable_Checked // if ((j+i) % 3) *MP = 0; // else *MP = 0xFF; } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 *MP = 0xFF;//////adsfadsf_Variable_Checked } } Image->SubMask->PutScanLine(i,StartX,EndX-StartX+1); ////adsfadsf } } Image->SubMask->StopScanLine(); Image->SubBitmap->StopScanLine(); } else { #ifndef ACADEMY // if ((ThDC = Image->SubBitmap->CreateDC()) == NULL) goto fail; // if ((MhDC = Image->uBitmap->CreateDC()) == NULL) goto fail; // SetStretchBltMode(ThDC, COLORONCOLOR); // StretchBlt(ThDC, 0, 0, ExpRect.size.x, ExpRect.size.y, MhDC, source.Left, source.Top, // source.Right - source.Left, source.Bottom - source.Top, SRCCOPY); Image->SubBitmap->UnionStretchBlt(0, 0, (ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), Image->uBitmap, source.Left, source.Top, source.Right - source.Left, source.Bottom - source.Top, SRCCOPY); // convert by celberus // Image->SubBitmap->DeleteDC(ThDC); ThDC = NULL; // Image->uBitmap->DeleteDC(MhDC); MhDC = NULL; if (!(Image->SubBitmap->StartScanLine())) goto fail; if (!(Image->SubMask->StartScanLine())) goto fail; if (FullViewForm->Super == sOff) { for (int i=0; i < Image->SubBitmap->Height; i++) { MP = Image->SubMask->GetScanLine(i); *MP = 0; mm = 0x80; int StartX = 0; int EndX = 0; //adsfadsf_for_declare j=0; while(1) { //////adsfadsf_while // if (((j+i) % 3) == 0) { // *MP |= mm; // } j++; if (j >= Image->SubBitmap->Width){ break; } if (mm>1){ mm >>= 1; } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 MP++; *MP = 0; mm = 0x80; //////adsfadsf_Variable_Checked } } Image->SubMask->PutScanLine(i,StartX,EndX-StartX+1); ////adsfadsf } } else { bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); for (int i=0; i < Image->SubBitmap->Height; i++) { IP = Image->SubBitmap->GetScanLine(i); MP = Image->SubMask->GetScanLine(i); *MP = 0; mm = 0x80; int StartX = 0; int EndX = 0; //adsfadsf_for_declare j=0; while(1) { //////adsfadsf_while GetPixel24(IP, fcol); // if (fcol != bgc) { // if (((j+i) % 3) == 0) *MP |= mm; // } else { // *MP |= mm; // } if (fcol == bgc){ if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 *MP |= mm;//////adsfadsf_Variable_Checked } j++; if (j >= Image->SubBitmap->Width){ break; } IP+=3; if (mm>1){ mm >>= 1; } else { if(EndX==0){StartX=j;} EndX=j; //adsfadsf_i_f1 MP++; *MP = 0; mm = 0x80; //////adsfadsf_Variable_Checked } } Image->SubMask->PutScanLine(i,StartX,EndX-StartX+1); ////adsfadsf } } Image->SubMask->StopScanLine(); Image->SubBitmap->StopScanLine(); #endif } return; fail: Image->SubBitmap->StopScanLine(); Image->SubMask->StopScanLine(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::ImageRectPaint() { TPItemImage *Image = MainImageForm->iMainImage; RECT r; Image->SubVisible = true; r.left = paintrect.left < Image->SubRange.left ? paintrect.left : Image->SubRange.left; r.top = paintrect.top < Image->SubRange.top ? paintrect.top : Image->SubRange.top; r.right = paintrect.right > Image->SubRange.right ? paintrect.right : Image->SubRange.right; r.bottom = paintrect.bottom > Image->SubRange.bottom ? paintrect.bottom : Image->SubRange.bottom; paintrect = Image->SubRange; Image->RectPaint(r); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::ExpMakeBitmap() { TPItemImage *Image = MainImageForm->iMainImage; Image->SubMask->UnionStretchBlt(0, 0, (ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), window.Mask, 0, 0, window.size.x, window.size.y, SRCCOPY); Image->SubBitmap->UnionStretchBlt(0, 0, (ExpRect.right - ExpRect.left), (ExpRect.bottom - ExpRect.top), window.Bitmap, 0, 0, window.size.x, window.size.y, SRCCOPY); return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //------------------------------------------------------------------------- bool __fastcall TMoveCopyForm::MakeImage() { TPItemImage *Image = MainImageForm->iMainImage; // HDC /*imageDC = NULL, wbitmapDC = NULL, */wmaskDC = NULL, wbackDC = NULL; // convert by celberus Image->uBitmap->RgnBitmap->RemoveRegion(); // convert by celberus if (Image->uBitmap->BitsPerPixel == 8) { if (!window.Back->Create((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), 8, rgb)) goto fail; } else { if (!window.Back->Create((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), 24)) goto fail; } Image->uBitmap->Copy(ExpansionRect.left, ExpansionRect.top, (ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), window.Mask, 0, 0, SRCAND); window.Back->Copy(0, 0, (ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), window.Mask, 0, 0, NOTSRCCOPY); window.Back->Copy(0, 0, (ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), window.Bitmap, 0, 0, SRCAND); Image->uBitmap->Copy(ExpansionRect.left, ExpansionRect.top, (ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), window.Back, 0, 0, SRCPAINT); if(Image->LayerMask) { Image->LayerMask->Copy(ExpansionRect.left, ExpansionRect.top, (ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top), window.Mask, 0, 0, SRCCOPY); // convert by celberus } return true; fail: if(window.Back) { delete window.Back; window.Back = NULL; } return false; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::ExpansionMakeBitmapRotate() { TPItemImage *Image = MainImageForm->iMainImage; window.Mask->ResizeStretch((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top)); window.Bitmap->ResizeStretch((ExpansionRect.right - ExpansionRect.left), (ExpansionRect.bottom - ExpansionRect.top)); mcStatus.setExp(false); mcStatus.setImgState(WasExpended); /* TODO : Expended ¿Í Rotated ¸¦ µ¿½Ã¿¡ ¸¸Á·ÇÏ´Â °æ¿ìµµ »ý°¢ÇؾßÇÔ */ mcStatus.doneMCStep(STExpending); MakeImage(); return; } //------------------------------------------------------------------------- bool __fastcall TMoveCopyForm::CreateBitmaps(int width, int height) { TCursor OldCursor; TPItemImage *Image = MainImageForm->iMainImage; OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; if (Image->uBitmap->BitsPerPixel==8) { MainImageForm->Palette->ToRGBQUAD(rgb, 256); if (!Image->SubBitmap->Create(width, height, 8, rgb)) goto fail; if (!Image->SubMask->Create(width, height, 8, rgb)) goto fail; if (!window.Bitmap->Create(width, height, 8, rgb)) goto fail; if (!window.Mask->Create(width, height, 8, rgb)) goto fail; window.Bitmap->BackgroundColor = PALETTEINDEX(0x00); window.Mask->BackgroundColor = PALETTEINDEX(0xFF); Image->SubMask->BackgroundColor = PALETTEINDEX(0xFF); } else { if (!Image->SubBitmap->Create(width, height, 24)) goto fail; if (!Image->SubMask->Create(width, height, 1)) goto fail; if (!window.Bitmap->Create(width, height, 24)) goto fail; if (!window.Mask->Create(width, height, 1)) goto fail; window.Bitmap->BackgroundColor = 0; window.Mask->BackgroundColor = 0xFFFFFF; Image->SubMask->BackgroundColor = 0xFFFFFF; } Screen->Cursor = OldCursor; return true; fail: DeleteBitmaps(); Screen->Cursor = OldCursor; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); return false; } //OK //------------------------------------------------------------------------- void __fastcall TMoveCopyForm::DeleteBitmaps() { TPItemImage *Image = MainImageForm->iMainImage; if (window.Bitmap) { delete window.Bitmap; window.Bitmap = NULL; } if (window.Mask) { delete window.Mask; window.Mask = NULL; } if (Image->SubBitmap) { delete Image->SubBitmap; Image->SubBitmap = NULL; } if (Image->SubMask) { delete Image->SubMask; Image->SubMask = NULL; } } //------------------------------------------------------------------------- void __fastcall TMoveCopyForm::InitMC() { InitRange(); CreateBitmaps(window.size.x, window.size.y); // Mask = NULL; DrawMousePoint(MousePointPlace); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::ExpansionMakeBitmapRotateLayer() { ExpansionMakeBitmapRotate(); /* int i, j; int sizewinX, sizewinY; Byte *IP, *WP, mm, *LP; COLORREF c; TPItemImage *Image = MainImageForm->iMainImage; HDC wbitmapDC = NULL, wmaskDC = NULL; window.Mask->ResizeStretch(ExpansionRect.size.x, ExpansionRect.size.y); if (Image->uBitmap->BitsPerPixel==8) { window.Bitmap->ResizeStretch(ExpansionRect.size.x, ExpansionRect.size.y); if (!Image->uBitmap->StartScanLine()) goto fail; if (!MainImageForm->WorkArea->Mask->StartScanLine()) goto fail; if (!Image->LayerMask->StartScanLine()) goto fail; c = PaletteForm->DIB256Palette->GetBGCOLORREF(8); for (i=0; iuBitmap->GetScanLine(window.s.y+i)+window.s.x; WP = MainImageForm->WorkArea->Mask->GetScanLine(i); LP = Image->LayerMask->GetScanLine(window.s.y+i)+window.s.x; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; juBitmap->PutScanLine(window.s.y + i,StartX+window.s.x,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(window.s.y + i,StartX+window.s.x,EndX-StartX+1); ////adsfadsf } Image->LayerMask->StopScanLine(); MainImageForm->WorkArea->Mask->StopScanLine(); Image->uBitmap->StopScanLine(); } else { window.Bitmap->CopyFromRect(Image->uBitmap, window.s.x, window.s.y, SRCCOPY); window.Bitmap->ResizeStretch(ExpansionRect.size.x, ExpansionRect.size.y, true); if((wbitmapDC = window.Bitmap->CreateDC()) == NULL) goto fail; if((wmaskDC = window.Mask->CreateDC()) == NULL) goto fail; BitBlt(wmaskDC, 0, 0, ExpansionRect.size.x, ExpansionRect.size.y, NULL, 0, 0, DSTINVERT); BitBlt(wbitmapDC, 0, 0, ExpansionRect.size.x, ExpansionRect.size.y, wmaskDC, 0, 0, SRCAND); BitBlt(wmaskDC, 0, 0, ExpansionRect.size.x, ExpansionRect.size.y, NULL, 0, 0, DSTINVERT); window.Mask->DeleteDC(wmaskDC); window.Bitmap->DeleteDC(wbitmapDC); if (!Image->uBitmap->StartScanLine()) goto fail; if (!MainImageForm->WorkArea->Mask->StartScanLine()) goto fail; if (!Image->LayerMask->StartScanLine()) goto fail; c = PaletteForm->DIB256Palette->GetBGCOLORREF(24); for (i=0; iuBitmap->GetScanLine(window.s.y+i)+3*window.s.x; WP = MainImageForm->WorkArea->Mask->GetScanLine(i); LP = Image->LayerMask->GetScanLine(window.s.y+i); mm = 0x80; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (j=0; j>3)) |= (0x80 >> ((window.s.x+j)&7));//////adsfadsf_Variable_Checked } } } if (mm==1) { WP++; mm = 0x80; } else { mm >>= 1; } } Image->uBitmap->PutScanLine(window.s.y + i,StartX+window.s.x,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(window.s.y + i,StartX,EndX-StartX+1); ////adsfadsf } Image->LayerMask->StopScanLine(); MainImageForm->WorkArea->Mask->StopScanLine(); Image->uBitmap->StopScanLine(); } MakeImage(); Image->LayerMask->CopyToRect(ExpansionRect.s.x, ExpansionRect.s.y, window.Mask, SRCAND); return; fail: Image->LayerMask->StopScanLine(); MainImageForm->WorkArea->Mask->StopScanLine(); Image->uBitmap->StopScanLine(); return; */ // need-conversion } //------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SetMCImage(void) { int x, y, xx; Byte *WP, *WBP, *MP, mm, *PP, *LP; COLORREF bgc, c; TPItemImage *Image = MainImageForm->iMainImage; Image->SubRange.left = window.s.x; Image->SubRange.top = window.s.y; if (window.size.x > MainImageForm->WorkArea->Mask->Width) window.size.x = MainImageForm->WorkArea->Mask->Width; if (window.size.y > MainImageForm->WorkArea->Mask->Height) window.size.y = MainImageForm->WorkArea->Mask->Height; // layerÀÇ °æ¿ì¿¡´Â window.size º¸´Ù workarea->maskÀÇ Å©±â°¡ ÀÛ´Ù (ƯÈ÷ ±×·ÁÁöÁö ¾ÊÀº ºÎºÐÀÌ Æ÷Ç﵃ °æ¿ì) by celberus if (Image->uBitmap->BitsPerPixel==8) { MainImageForm->Palette->ToRGBQUAD(rgb, 256); if (!CreateBitmaps(window.size.x, window.size.y)) goto fail; if (window.Bitmap->StartScanLine() == false) goto fail; if (window.Mask->StartScanLine() == false) goto fail; if (Image->uBitmap->StartScanLine() == false) goto fail; if (MainImageForm->WorkArea->Mask->StartScanLine() == false) goto fail; if (Image->LayerMask) { if (Image->LayerMask->StartScanLine() == false) goto fail; for (y=0; yGetScanLine(y); MP = window.Mask->GetScanLine(y); PP = Image->uBitmap->GetScanLine(window.s.y+y)+window.s.x; LP = Image->LayerMask->GetScanLine(window.s.y+y)+window.s.x; WP = MainImageForm->WorkArea->Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xPutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf window.Mask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } Image->LayerMask->StopScanLine(); } else { for (y=0; yGetScanLine(y); MP = window.Mask->GetScanLine(y); PP = Image->uBitmap->GetScanLine(window.s.y+y)+window.s.x; WP = MainImageForm->WorkArea->Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xPutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf window.Mask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } } window.Bitmap->StopScanLine(); window.Mask->StopScanLine(); Image->uBitmap->StopScanLine(); MainImageForm->WorkArea->Mask->StopScanLine(); } else { if (!CreateBitmaps(window.size.x, window.size.y)) goto fail; if (window.Bitmap->StartScanLine() == false) goto fail; if (window.Mask->StartScanLine() == false) goto fail; if (Image->uBitmap->StartScanLine() == false) goto fail; if (MainImageForm->WorkArea->Mask->StartScanLine() == false) goto fail; if (Image->LayerMask) { if (Image->LayerMask->StartScanLine() == false) goto fail; for (y=0; yGetScanLine(y); MP = window.Mask->GetScanLine(y); *MP = 0; PP = Image->uBitmap->GetScanLine(window.s.y+y)+3*window.s.x; LP = Image->LayerMask->GetScanLine(window.s.y + y); WP = MainImageForm->WorkArea->Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare x = 0; mm = 0x80; while(1) { //////adsfadsf_while xx = x + window.s.x; if ((*WP&mm) && (*(LP + (xx >> 3)) & (0x80 >> (xx & 7 ))) == 0) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(WBP, PP);//////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 SetPixel24(WBP, 0);//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MP |= mm;//////adsfadsf_Variable_Checked } x++; if(x >= window.size.x){ break; } if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 WBP += 3; PP += 3;//////adsfadsf_Variable_Checked if (mm==1) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 MP++; *MP = 0; WP++; mm = 0x80; //////adsfadsf_Variable_Checked } else { mm >>= 1; } } window.Bitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf window.Mask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } Image->LayerMask->StopScanLine(); } else { for (y=0; yGetScanLine(y); MP = window.Mask->GetScanLine(y); *MP = 0; PP = Image->uBitmap->GetScanLine(window.s.y+y)+3*window.s.x; WP = MainImageForm->WorkArea->Mask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare x=0; mm = 0x80; while(1) { //////adsfadsf_while if (*WP&mm) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(WBP, PP);//////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 SetPixel24(WBP, 0);//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *MP |= mm;//////adsfadsf_Variable_Checked } x++; if(x >= window.size.x){ break; } if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 WBP += 3; PP += 3;//////adsfadsf_Variable_Checked if (mm==1) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 MP++; *MP = 0; WP++; mm = 0x80; //////adsfadsf_Variable_Checked } else { mm >>= 1; } } window.Bitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf window.Mask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } } window.Bitmap->StopScanLine(); window.Mask->StopScanLine(); Image->uBitmap->StopScanLine(); MainImageForm->WorkArea->Mask->StopScanLine(); } Image->SubMask->Copy(window.Mask, SRCCOPY); // by celberus Èæ¹é À̹ÌÁö ¹®Á¦ Image->SubBitmap->Copy(window.Bitmap, SRCCOPY); return; fail : if (Image->LayerMask) Image->LayerMask->StopScanLine(); MainImageForm->WorkArea->Mask->StopScanLine(); Image->uBitmap->StopScanLine(); window.Mask->StopScanLine(); window.Bitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::cbRotateChange(TObject *Sender) { BeforeDeg1 = StrToFloat(cbRotate->Text); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SetBitmapRegion() { TCursor cursor; TPItemImage *Image; pBITMAPHANDLE bh; RGNXFORM XForm; HRGN rgnSrc, rgnDst; HDC dc; TWAPointData *pd; TPoint pt[3]; int i; int diff = abs(First.x-Second.x) - abs(First.y-Second.y); RECT rc; bool sw = false; XFORM xForm; DWORD dwSize; double r, h, l, s; RGBQUAD rgb; cursor = Screen->Cursor; Screen->Cursor = crHourGlass; Image = MainImageForm->iMainImage; bh = Image->uBitmap->RgnBitmap->Handle; // convert by celberus XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; rc.left = min(First.x, Second.x); rc.top = min(First.y, Second.y); rc.right = max(First.x, Second.x)+1; rc.bottom = max(First.y, Second.y)+1; if (L_BitmapHasRgn(bh)) { L_SetBitmapRgnRect(bh, &XForm, &rc, L_RGN_SET); } L_GetBitmapRgnHandle(bh, &XForm, &rgnDst); MainImageForm->WorkArea->SetMask(rgnDst); DeleteObject(rgnDst); Image->OutlineBitmapRgn(MainImageForm->WorkArea->bComplex); Image->Repaint(); Screen->Cursor = cursor; } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::BackToBeforeRotate() /* TODO : È®/Ãà ȸÀü À̵¿/º¹»ç ¶§¹®¿¡ ¾î¿ ¼ö ¾øÀÌ Á¸Àç */ { pBITMAPHANDLE bh = MainImageForm->iMainImage->uBitmap->RgnBitmap->Handle; TPItemImage *Image = MainImageForm->iMainImage; switch (mcStatus.getMCType()) { case MCRotate: case MCRotatingMirror: case MCBend: if(backup){ Image->uBitmap->CopyToRect(RotatebackRect.left, RotatebackRect.top, Rotateback, SRCCOPY); if (MainImageForm->iMainImage->LayerMask) { Image->LayerMask->CopyToRect(RotatebackRect.left, RotatebackRect.top, RotateMaskback, SRCCOPY); } MainImageForm->WorkArea->LoadFromFile(bh, DirectoryItem + "\\MoveCopy"); backup = false; if (Rotateback) {delete Rotateback; Rotateback = NULL;} if (RotateMaskback) {delete RotateMaskback; RotateMaskback = NULL;} } break; } ::RepaintImage(); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::BackUpBeforeRotate() { pBITMAPHANDLE bh = MainImageForm->iMainImage->uBitmap->RgnBitmap->Handle; TPItemImage *Image = MainImageForm->iMainImage; if (Image->uBitmap->BitsPerPixel==8){ Image->uBitmap->GetColors(0, 256, rgb); Rotateback->Create(RotatebackRect.right - RotatebackRect.left, RotatebackRect.bottom - RotatebackRect.top, 8, rgb); RotateMaskback->Create(RotatebackRect.right - RotatebackRect.left, RotatebackRect.bottom - RotatebackRect.top, 8, rgb); }else { Rotateback->Create(RotatebackRect.right - RotatebackRect.left, RotatebackRect.bottom - RotatebackRect.top, 24); RotateMaskback->Create(RotatebackRect.right - RotatebackRect.left, RotatebackRect.bottom - RotatebackRect.top, 1); } Rotateback->CopyFromRect(Image->uBitmap, RotatebackRect.left, RotatebackRect.top, SRCCOPY); if (MainImageForm->iMainImage->LayerMask) { RotateMaskback->CopyFromRect(Image->LayerMask, RotatebackRect.left, RotatebackRect.top, SRCCOPY); } backup = true; MainImageForm->WorkArea->SaveToFile(bh, DirectoryItem + "\\MoveCopy"); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::AddBgInArea(void) { int i, j; COLORREF color; TPItemImage *Image = MainImageForm->iMainImage; WindowItr *windowItr = NULL; if (Image->uBitmap->BitsPerPixel==8) { windowItr = (WindowItr *) new WindowItr_8(&window); } else { windowItr = (WindowItr *) new WindowItr_24(&window); color = PaletteForm->DIB256Palette->GetBGCOLORREF(24); windowItr->setBGColor(color); } if (!windowItr->startScanLine()) goto fail; StatusProgress->Maximum = window.Bitmap->Height; for (i=0; iHeight; i++) { StatusProgress->Position = i; windowItr->getScanLine(i, 0, window.Bitmap->Width); for (j=0; jWidth; j++) { if (windowItr->isBGColor(j)) { windowItr->setToUnBlank_Mask(j); } } windowItr->putScanLine(i, 0, window.Bitmap->Width); } StatusProgress->End(); windowItr->stopScanLine(); if(windowItr) delete windowItr; return; fail: windowItr->stopScanLine(); if(windowItr) delete windowItr; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SubtractBgInArea(void) { int i, j; COLORREF color; TPItemImage *Image = MainImageForm->iMainImage; WindowItr *windowItr = NULL; if (Image->uBitmap->BitsPerPixel==8) { windowItr = (WindowItr *) new WindowItr_8(&window); } else { windowItr = (WindowItr *) new WindowItr_24(&window); color = PaletteForm->DIB256Palette->GetBGCOLORREF(24); windowItr->setBGColor(color); } if (!windowItr->startScanLine()) goto fail; StatusProgress->Maximum = window.Bitmap->Height; for (i=0; iHeight; i++) { StatusProgress->Position = i; windowItr->getScanLine(i, 0, window.Bitmap->Width); for (j=0; jWidth; j++) { if (windowItr->isBGColor(j)) { windowItr->setToBlank_Mask(j); } } windowItr->putScanLine(i, 0, window.Bitmap->Width); } StatusProgress->End(); windowItr->stopScanLine(); if(windowItr) delete windowItr; return; fail: windowItr->stopScanLine(); if(windowItr) delete windowItr; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SuperChange(void) { if (FullViewForm->Super == sNormal) { SubtractBgInArea(); } else if (FullViewForm->Super == sOff) { // MakeSubBitmap¿¡¼­´Â background󸮰¡ ¾ÈµÈ´Ù. AddBgInArea(); } MakeSubBitmap(0, 0, true); } //--------------------------------------------------------------------------- void __fastcall TMoveCopyForm::SetSquareExp(bool value) { squareExp = value; } //--------------------------------------------------------------------------- //-------------------MCStatus by celberus since 03-07-11------------------- MCType __fastcall MCStatus::getMCType() { return _type; } //--------------------------------------------------------------------------- void __fastcall MCStatus::setMCType(MCType value) { _type = value; } //--------------------------------------------------------------------------- void __fastcall MCStatus::setExp(bool value) { _expNeeded = value; } //--------------------------------------------------------------------------- bool __fastcall MCStatus::needExp() { return _expNeeded; } //--------------------------------------------------------------------------- MCImgState __fastcall MCStatus::getImgState() { return _imageState; } //--------------------------------------------------------------------------- void __fastcall MCStatus::setImgState(MCImgState value) { _imageState = value; if (value == WasExpended || value == WasRotated) { setSameImageInWA(false); } } //--------------------------------------------------------------------------- MCStep __fastcall MCStatus::getMCStep() { return _step; } //--------------------------------------------------------------------------- void __fastcall MCStatus::setMCStep(MCStep value) { if((value == STRotating || value == STExpending) && (_step != STPutting)) { _step |= value; } else { _step = value; } } //--------------------------------------------------------------------------- void __fastcall MCStatus::doneMCStep(MCStep value) { if((value == STRotating || value == STExpending) && (_step != STPutting)) { _step &= ~value; if(_step == STNone) { _step = STPutting; } } } //--------------------------------------------------------------------------- void __fastcall MCStatus::cancelMCStep(MCStep value) { if(value == STRotating || value == STExpending) { _step &= ~value; } } //--------------------------------------------------------------------------- void __fastcall MCStatus::setIsMove(int value) { _isMove = value; } //--------------------------------------------------------------------------- bool __fastcall MCStatus::isMove() { return _isMove; } //--------------------------------------------------------------------------- bool __fastcall MCStatus::isRotatingType() { return (_type > 3 && _type < 7); } //--------------------------------------------------------------------------- bool __fastcall MCStatus::isSymmetryType() { return (_type > 0 && _type < 4); } //--------------------------------------------------------------------------- bool __fastcall MCStatus::hasSameImageInWA() { return _sameImgInWA; } //--------------------------------------------------------------------------- void __fastcall MCStatus::setSameImageInWA(bool value) { _sameImgInWA = value; } //--------------------------------------------------------------------------- //-------------------WAItr by celberus 03-07-14---------------------------- __fastcall WAItr::WAItr(TUnionBitmap *Bitmap, TUnionBitmap *LayerMask, TPWorkArea *workArea, TWindowData *windowData) { ImageBitmap = Bitmap; if(LayerMask != NULL) { ImageLayerMask = LayerMask; hasLayerMask = true; } else { hasLayerMask = false; } WA = workArea; WindowData = windowData; } //--------------------------------------------------------------------------- bool __fastcall WAItr::startScanLine() { if(!ImageBitmap->StartScanLine()) goto fail; if(hasLayerMask) { if(!ImageLayerMask->StartScanLine()) goto fail; } if(!WA->Mask->StartScanLine()) goto fail; return true; fail: stopScanLine(); return false; } //--------------------------------------------------------------------------- bool __fastcall WAItr::startScanLineN(int n) { if(!ImageBitmap->StartScanLineN(n)) goto fail; if(hasLayerMask) { if(!ImageLayerMask->StartScanLine()) goto fail; } if(!WA->Mask->StartScanLine()) goto fail; return true; fail: stopScanLine(); return false; } //--------------------------------------------------------------------------- bool __fastcall WAItr::startScanLine_VBuff(int maxHeight) { vBuff = new VerticalBuffer(maxHeight, ImageBitmap->BitsPerPixel); // pixelCenter¿¡¼­ y+1°ªÀ» »ç¿ëÇϱ⠶§¹®¿¡ bufferÀÇ height¿¡ 1À» ´õÇØÁØ´Ù. if(!startScanLine()) { stopScanLine_VBuff(); return false; } return true; } //--------------------------------------------------------------------------- void __fastcall WAItr::stopScanLine() { ImageBitmap->StopScanLine(); if(hasLayerMask)ImageLayerMask->StopScanLine(); WA->Mask->StopScanLine(); } //--------------------------------------------------------------------------- void __fastcall WAItr::stopScanLine_VBuff() { delete vBuff; stopScanLine(); } //--------------------------------------------------------------------------- //-------------------WAItr_8 by celberus 03-07-14-------------------------- void __fastcall WAItr_8::getScanLine(int y) { pBitmap = ImageBitmap->GetScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x) + WindowData->s.x; if (hasLayerMask) pLayerMask = ImageLayerMask->GetScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x) + WindowData->s.x; int yInWA = y + WindowData->s.y - WA->Range.top; if (yInWA < 0 || yInWA >= WA->Mask->Height) pWAMask = NULL; else pWAMask = WA->Mask->GetScanLine(yInWA); } //--------------------------------------------------------------------------- void __fastcall WAItr_8::getScanLine(int y, int startX, int length) { pBitmap = ImageBitmap->GetScanLine(y + WindowData->s.y, WindowData->s.x + startX, length) + WindowData->s.x; if(hasLayerMask) pLayerMask = ImageLayerMask->GetScanLine(y + WindowData->s.y, WindowData->s.x + startX, length) + WindowData->s.x; int yInWA = y + WindowData->s.y - WA->Range.top; if (yInWA < 0 || yInWA >= WA->Mask->Height) pWAMask = NULL; else pWAMask = WA->Mask->GetScanLine(yInWA); } //--------------------------------------------------------------------------- void __fastcall WAItr_8::putScanLine(int y) { ImageBitmap->PutScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x); if(hasLayerMask) ImageLayerMask->PutScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x); } //--------------------------------------------------------------------------- bool __fastcall WAItr_8::isInArea(int x) { int xInWA = x + WindowData->s.x - WA->Range.left; if (pWAMask == NULL || xInWA < 0 || xInWA >= WA->Mask->Width) return false; if(!hasLayerMask) { return pWAMask[xInWA]!=0; } else { return (pWAMask[xInWA]!=0 && pLayerMask[x] == 0); } } //--------------------------------------------------------------------------- Byte * __fastcall WAItr_8::getPixelPointer(int x) // getScanLineÇÒ¶§ ´õÇØÁÖ¾úÀ¸¹Ç·Î ½ÇÁ¦ ³Ñ°ÜÁÖ´Â À§Ä¡´Â WindowData->s.x + x°¡ µÈ´Ù. { return &pBitmap[x]; } //--------------------------------------------------------------------------- void __fastcall WAItr_8::erasePixel(int x) { pBitmap[x] = 1; if(hasLayerMask) { pLayerMask[x] = 0xFF; } } //--------------------------------------------------------------------------- bool __fastcall WAItr_8::isNotBGColor(int x) { return *getPixelPointer(x) > 1; } //--------------------------------------------------------------------------- //-------------------WAItr_24 by celberus 03-07-14------------------------- void __fastcall WAItr_24::getScanLine(int y) { pBitmap = ImageBitmap->GetScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x); if(hasLayerMask) pLayerMask = ImageLayerMask->GetScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x); int yInWA = y + WindowData->s.y - WA->Range.top; if (yInWA < 0 || yInWA >= WA->Mask->Height) pWAMask = NULL; else pWAMask = WA->Mask->GetScanLine(yInWA); } //--------------------------------------------------------------------------- void __fastcall WAItr_24::getScanLine(int y, int startX, int length) { pBitmap = ImageBitmap->GetScanLine(y + WindowData->s.y, WindowData->s.x + startX, length); if(hasLayerMask) pLayerMask = ImageLayerMask->GetScanLine(y + WindowData->s.y, WindowData->s.x + startX, length); int yInWA = y + WindowData->s.y - WA->Range.top; if (yInWA < 0 || yInWA >= WA->Mask->Height) pWAMask = NULL; else pWAMask = WA->Mask->GetScanLine(yInWA); } //--------------------------------------------------------------------------- void __fastcall WAItr_24::putScanLine(int y) { ImageBitmap->PutScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x); if(hasLayerMask) ImageLayerMask->PutScanLine(y + WindowData->s.y, WindowData->s.x, WindowData->size.x); } //--------------------------------------------------------------------------- bool __fastcall WAItr_24::isInArea(int x) { int xInWA = x + WindowData->s.x - WA->Range.left; if (pWAMask == NULL || xInWA < 0 || xInWA >= WA->Mask->Width) return false; if(!hasLayerMask) { return (pWAMask[xInWA >> 3] & (0x80 >> (xInWA & 7))); } else { return ((pWAMask[xInWA >> 3] & (0x80 >> (xInWA & 7))) && (pLayerMask[(WindowData->s.x + x) >> 3] & (0x80 >> ((WindowData->s.x + x)& 7))) == 0); } } //--------------------------------------------------------------------------- Byte * __fastcall WAItr_24::getPixelPointer(int x) { return &pBitmap[(WindowData->s.x + x) * 3]; } //--------------------------------------------------------------------------- void __fastcall WAItr_24::erasePixel(int x) { pBitmap[(WindowData->s.x + x) * 3] = (BGColor >> 16) & 0xFF; pBitmap[(WindowData->s.x + x) * 3 + 1] = (BGColor >> 8 ) & 0xFF; pBitmap[(WindowData->s.x + x) * 3 + 2] = (BGColor ) & 0xFF; if(hasLayerMask) { pLayerMask[(WindowData->s.x + x) >> 3] |= 0x80 >> ((WindowData->s.x + x) & 7); } } //--------------------------------------------------------------------------- void __fastcall WAItr_24::setBGColor(COLORREF bgColor) { BGColor = bgColor; } //--------------------------------------------------------------------------- bool __fastcall WAItr_24::isNotBGColor(int x) { getPixel24(getPixelPointer(x)); return aColor != BGColor; } //--------------------------------------------------------------------------- void __fastcall WAItr_24::getPixel24(Byte *pBitmap) { aColor = (pBitmap[0] << 16) + (pBitmap[1] << 8) + pBitmap[2]; } //--------------------------------------------------------------------------- void __fastcall WAItr_24::pixelCenter(int x, int y, double diffX, double diffY, Byte* centerColor) { memcpy(pixel[0], getPixel_VBuff(x , y ), 3); if (y + 1 == ImageBitmap->Height) { memcpy(pixel[1], getPixel_VBuff(x , y ), 3); } else { memcpy(pixel[1], getPixel_VBuff(x , y + 1), 3); } if (x + 1 == ImageBitmap->Width) { memcpy(pixel[2], getPixel_VBuff(x , y ), 3); if (y + 1 == ImageBitmap->Height) { memcpy(pixel[3], getPixel_VBuff(x , y ), 3); } else { memcpy(pixel[3], getPixel_VBuff(x , y + 1), 3); } } else { memcpy(pixel[2], getPixel_VBuff(x + 1, y ), 3); if (y + 1 == ImageBitmap->Height) { memcpy(pixel[3], getPixel_VBuff(x + 1, y ), 3); } else { memcpy(pixel[3], getPixel_VBuff(x + 1, y + 1), 3); } } for( int i = 0; i < 3; i ++ ) { minX = pixel[0][i] + diffX * (pixel[2][i] - pixel[0][i]); maxX = pixel[1][i] + diffX * (pixel[3][i] - pixel[1][i]); centerColor[i] = (Byte)floor(minX + diffY * (maxX - minX)); } } //--------------------------------------------------------------------------- Byte * __fastcall WAItr_24::getPixel_VBuff(int x, int y) { if (vBuff->isInBuffer(x, y)) { return vBuff->getBufferPointer(x % vBuff->Max_Length, y); } else { int buffStartX = x / vBuff->Max_Length * vBuff->Max_Length; int buffLength = ImageBitmap->Width - buffStartX < vBuff->Max_Length ? ImageBitmap->Width - buffStartX : vBuff->Max_Length; pBitmap = ImageBitmap->GetScanLine(y + WindowData->s.y, WindowData->s.x + buffStartX, buffLength); vBuff->insertBuffer(&pBitmap[(WindowData->s.x + buffStartX) * 3], buffStartX, buffLength, y); return &pBitmap[(WindowData->s.x + x) * 3]; } } //--------------------------------------------------------------------------- //-------------------WindowItr by celberus 03-07-14------------------------ __fastcall WindowItr::WindowItr(TWindowData *windowData) { WindowBitmap = windowData->Bitmap; WindowMask = windowData->Mask; } //--------------------------------------------------------------------------- bool __fastcall WindowItr::startScanLine() { if(!WindowBitmap->StartScanLine()) goto fail; if(!WindowMask->StartScanLine()) goto fail; return true; fail: stopScanLine(); return false; } //--------------------------------------------------------------------------- void __fastcall WindowItr::stopScanLine() { WindowBitmap->StopScanLine(); WindowMask->StopScanLine(); } //--------------------------------------------------------------------------- //-------------------WindowItr_8 by celberus 03-07-14---------------------- void __fastcall WindowItr_8::getScanLine(int y, int startX, int length) { pBitmap = WindowBitmap->GetScanLine(y, startX, length); pMask = WindowMask->GetScanLine(y, startX, length); } //--------------------------------------------------------------------------- void __fastcall WindowItr_8::putScanLine(int y, int startX, int length) { WindowBitmap->PutScanLine(y, startX, length); WindowMask->PutScanLine(y, startX, length); } //--------------------------------------------------------------------------- void __fastcall WindowItr_8::copyPixel(int x, BYTE *pixelPointer) { pBitmap[x] = *pixelPointer; pMask[x] = 0; } //--------------------------------------------------------------------------- void __fastcall WindowItr_8::copyAndBlank(int x, Byte *pixelPointer) { pBitmap[x] = *pixelPointer; pMask[x] = 0xFF; } //--------------------------------------------------------------------------- void __fastcall WindowItr_8::setToBlank(int x) { pBitmap[x] = 0; pMask[x] = 0xFF; } //--------------------------------------------------------------------------- void __fastcall WindowItr_8::setToBlank_Mask(int x) { pMask[x] = 0xFF; } //--------------------------------------------------------------------------- void __fastcall WindowItr_8::setToUnBlank_Mask(int x) { pMask[x] = 0; } //--------------------------------------------------------------------------- bool __fastcall WindowItr_8::isBGColor(int x) { return pBitmap[x] == 1; } //--------------------------------------------------------------------------- //-------------------WindowItr_24 by celberus 03-07-14--------------------- void __fastcall WindowItr_24::getScanLine(int y, int startX, int length) { pBitmap = WindowBitmap->GetScanLine(y, startX, length); pMask = WindowMask->GetScanLine(y, startX, length); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::putScanLine(int y, int startX, int length) { WindowBitmap->PutScanLine(y, startX, length); WindowMask->PutScanLine(y, startX, length); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::copyPixel(int x, BYTE *pixelPointer) { copyPixel24(&pBitmap[x * 3], pixelPointer); pMask[x >> 3] &= ~(0x80 >> (x & 7)); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::copyAndBlank(int x, Byte *pixelPointer) { copyPixel24(&pBitmap[x * 3], pixelPointer); pMask[x >> 3] |= (0x80 >> (x & 7)); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::setToBlank(int x) { pBitmap[x * 3] = (BGColor >> 16) ^ 0xFF; pBitmap[x * 3 + 1] = (BGColor >> 8) ^ 0xFF; pBitmap[x * 3 + 2] = (BGColor) ^ 0xFF; pMask[x >> 3] |= (0x80 >> (x & 7)); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::setToBlank_Mask(int x) { pMask[x >> 3] |= (0x80 >> (x & 7)); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::setToUnBlank_Mask(int x) { pMask[x >> 3] &= ~(0x80 >> (x & 7)); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::copyPixel24(Byte *Dst, Byte *Src) { CopyPixel24(Dst, Src); } //--------------------------------------------------------------------------- void __fastcall WindowItr_24::setBGColor(COLORREF bgColor) { BGColor = bgColor & 0x00FFFFFF; } //--------------------------------------------------------------------------- bool __fastcall WindowItr_24::isBGColor(int x) { return BGColor == ((pBitmap[x * 3] << 16) + (pBitmap[x * 3 + 1] << 8) + pBitmap[x * 3 + 2]); } //--------------------------------------------------------------------------- //-----------------VerticalBuffer by celberus 03-07-26---------------------- __fastcall VerticalBuffer::VerticalBuffer(int maxHeight, int bitsPerPixel) { vBuffer = NULL; pBufferLine = NULL; pBufferTable = NULL; bpp = bitsPerPixel; vBuffer = GlobalAlloc(GMEM_FIXED, maxHeight * (bpp * Max_Length / 8)); if (vBuffer == NULL) return; pBufferLine = (Byte *)GlobalLock(vBuffer); pBufferTable = new Byte*[maxHeight]; indexTable = new int[maxHeight]; for (int i = 0; i < maxHeight; i++ ) { pBufferTable[i] = pBufferLine + i * bpp * Max_Length / 8; indexTable[i] = -1; } } //--------------------------------------------------------------------------- __fastcall VerticalBuffer::~VerticalBuffer() { delete []indexTable; delete []pBufferTable; if (vBuffer) { if (pBufferLine) { GlobalUnlock(vBuffer); pBufferLine = NULL; } GlobalFree(vBuffer); vBuffer = NULL; } } //--------------------------------------------------------------------------- bool __fastcall VerticalBuffer::isInBuffer(int x, int y) { if (pBufferLine == NULL) return false; return indexTable[y] == x / Max_Length; } //--------------------------------------------------------------------------- Byte * __fastcall VerticalBuffer::getBufferPointer(int position, int y) { return pBufferTable[y] + position * bpp / 8; } //--------------------------------------------------------------------------- void __fastcall VerticalBuffer::insertBuffer(Byte *pLine, int startX, int length, int y) { memcpy (pBufferTable[y], pLine, length * bpp / 8); indexTable[y] = startX / Max_Length; if (length != Max_Length) { // x°¡ °æ°è¿¡ µµ´ÞÇßÀ»¶§ x + 1°ªÀ» ÂüÁ¶ÇÏ°Ô µÇ¹Ç·Î ¸Ç µÚ¿¡ ÇÑ Çȼ¿À» ´õ º¹»çÇØÁØ´Ù. memcpy (pBufferTable[y] + length * bpp / 8, pBufferTable[y] + (length - 1) * bpp / 8, length * bpp / 8); } } //---------------------------------------------------------------------------