//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "Window.h" #include "MainImage.h" #include "Main.h" //2001.4.3. by lhskys ÀÛ¾÷±¸¿ª save //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "Selector" #pragma link "TPSpin" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_SHAPE StringTable[0] #define IDS_FULL StringTable[1] #define IDS_IRREGULAR StringTable[2] #define IDS_OFF StringTable[3] #define IDS_SET StringTable[4] #define IDS_ADDITION StringTable[5] #define IDS_SUBTRACTION StringTable[6] #define IDS_DELETEPT StringTable[7] #define IDS_CLOSE StringTable[8] #define IDS_SURFACEMULTI StringTable[9] #define IDS_BORDER StringTable[10] #define IDS_SURFACESINGLE StringTable[11] #define IDS_MAGIC StringTable[12] #define IDS_SURFACE StringTable[13] #define IDS_MULTISURFACEFILL StringTable[14] #define IDS_BORDERFILL StringTable[15] #define IDS_SINGLESURFACEFILL StringTable[16] #define IDS_STACK StringTable[17] #define IDS_SWAP StringTable[18] //--------------------------------------------------------------------------- TWindowForm *WindowForm; //--------------------------------------------------------------------------- __fastcall TWindowForm::TWindowForm(TComponent* Owner) : TForm(Owner) { pressZ = 0; //lhskys zŰ Á÷°¢Ç¥½Ã ÃʱâÈ­(=0) hWnd = ((TWinControl *)Owner)->Handle; //=============================== 2001.3.27 lhskys FormCreate(TObject *Sender)³»¿ë ¿Å±è //===================================================================== StringTable.Create(DirectoryBin, Language, "Window"); SetSmallFont(Font); sbShape->Caption = IDS_SHAPE; sbFull->Caption = IDS_FULL; sbIrregular->Caption = IDS_IRREGULAR; sbOff->Caption = IDS_OFF; sbOutline->Caption = IDS_COMMON_OUTLINE; sbUndo->Caption = IDS_COMMON_UNDO; rbSet->Caption = IDS_SET; rbAddition->Caption = IDS_ADDITION; rbSubtraction->Caption = IDS_SUBTRACTION; lbShape->Caption = IDS_COMMON_SIZE; sbShapeRectangle->Caption = IDS_COMMON_RECTANGLE; sbShapeEllipse->Caption = IDS_COMMON_ELLIPSE; sbShapeCircle->Caption = IDS_COMMON_CIRCLE; sbShapeSquare->Caption = IDS_COMMON_SQUARE; cbIrreCurve->Caption = IDS_COMMON_CURVE; sbIrreDelete->Caption = IDS_DELETEPT; sbIrreClose->Caption = IDS_CLOSE; sbOutlineSurfaceMulti->Caption = IDS_SURFACEMULTI; sbOutlineBorder->Caption = IDS_BORDER; sbOutlineSurfaceSingle->Caption = IDS_SURFACESINGLE; gbSurfaceMulti->Caption = IDS_SURFACEMULTI; cbSurfaceMulti->Caption = IDS_COMMON_POSITION; sbSurfaceMultiNew->Hint = IDS_COMMON_NEW; sbSurfaceMultiAll->Hint = IDS_COMMON_ALL; sbSurfaceMultiOne->Hint = IDS_COMMON_BLOCKCOLOR; sbSurfaceMultiDelete->Hint = IDS_COMMON_INSERTCOLOR; sbSurfaceMultiBefore->Hint = IDS_COMMON_BEFORECOLOR; sbOutlineBorder->Hint = IDS_BORDERFILL; rbSwap->Caption = IDS_SWAP; rbStack->Caption = IDS_STACK; //===================================================================== pnUndo->Top = Panel->Height; ClientHeight = pnUndo->Top+pnUndo->Height; pnUndo->Visible = true; maneupdate = true; //================================================== } //--------------------------------------------------------------------------- void __fastcall TWindowForm::FormCreate(TObject *Sender) { // } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbShapeClick(TObject *Sender) { ExitItem(); InitItem(WI_SHAPE); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbIrregularClick(TObject *Sender) { ExitItem(); InitItem(WI_IRREGULAR); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineClick(TObject *Sender) { ExitItem(); InitItem(WI_OUTLINE); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbFullClick(TObject *Sender) { TCursor cursor; TPItemImage *Image; pBITMAPHANDLE bh; RGNXFORM XForm; RECT rc; HRGN rgn; cursor = Screen->Cursor; Screen->Cursor = crHourGlass; if (WindowForm) ExitItem(); Image = MainImageForm->iMainImage; bh = Image->Bitmap->Handle; MainImageForm->WorkArea->PushUndo(); ResetBitmapRegion(); XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; rc.left = 0; rc.top = 0; rc.right = Image->Bitmap->Width; rc.bottom = Image->Bitmap->Height; L_SetBitmapRgnRect(bh, &XForm, &rc, L_RGN_SET); L_GetBitmapRgnHandle(bh, &XForm, &rgn); MainImageForm->WorkArea->SetMask(rgn); DeleteObject(rgn); Image->OutlineBitmapRgn(); Image->Repaint(); if (WindowForm) StatusItem(); MainImageForm->WorkAreaChange(); Screen->Cursor = cursor; if (WindowForm) PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOffClick(TObject *Sender) { if (WindowForm) ExitItem(); // À©µµ¿ì ÆûÀÌ ÀÖ¾î¾ß¸¸ Ŭ·Î¿ìÁî MainImageForm->WorkArea->PushUndo(); ResetBitmapRegion(); MainImageForm->WorkAreaChange(); if (WindowForm) PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); MainMenuForm->showWindow = false; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbUndoClick(TObject *Sender) { int dx, dy; AnsiString str, un; un = MainImageForm->UnitName(); if (MainImageForm->WorkArea->StatusUndo()) { if (MainImageForm->WorkArea->Mask) rbSwap->Enabled = true; } else { ExitItem(); InitItem(WI_SHAPE); } if (rbStack->Checked) { MainImageForm->WorkArea->PopUndo(); MainImageForm->iMainImage->OutlineBitmapRgn(MainImageForm->WorkArea->bComplex); MainImageForm->iMainImage->Repaint(); StatusItem(); MainImageForm->WorkAreaChange(); } else if (rbSwap->Checked) { MainImageForm->WorkArea->SwapUndo(); MainImageForm->iMainImage->OutlineBitmapRgn(MainImageForm->WorkArea->bComplex); MainImageForm->iMainImage->Repaint(); StatusItem(); MainImageForm->WorkAreaChange(); } dx = MainImageForm->WorkArea->Range.left - MainImageForm->WorkArea->Range.right + 1; dy = MainImageForm->WorkArea->Range.top - MainImageForm->WorkArea->Range.bottom + 1; str = returnSize(dx, dy); lbShape->Caption = AnsiString(IDS_COMMON_SIZE) + " : " + str + un; MainImageForm->TempLabel->Caption = str; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbShapeSquareClick(TObject *Sender) { SubItem = WSI_SQUARE; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbShapeCircleClick(TObject *Sender) { SubItem = WSI_CIRCLE; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbShapeRectangleClick(TObject *Sender) { SubItem = WSI_RECTANGLE; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbShapeEllipseClick(TObject *Sender) { SubItem = WSI_ELLIPSE; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbIrreDeleteClick(TObject *Sender) { DeleteClick = 1; //lhskys delete ¹öưÀ» ´­·¶À»¶§ if (Step==23) { //°ªÀ» ÁöÁ¤ z۸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï WADraw(-4); Step = 21; } else if (Step==22) { WADraw(-2); Step = 21; } else { WADraw(-1); } PopPointList(); if (PointList->Count>0) WADraw(-1); else Step = 0; StatusIrregular(); MainImageForm->iMainImage->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbIrreCloseClick(TObject *Sender) { WADraw(-2); SetBitmapRegion(); ResetPointList(); cbIrreCurve->Checked = false; cbIrreCurve->Enabled = false; Step = 0; StatusItem(); MainImageForm->WorkAreaChange(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineSurfaceMultiClick(TObject *Sender) { SubItem = WSI_SURFACEMULTI; StatusOutline(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineSurfaceSingleClick(TObject *Sender) { SubItem = WSI_SURFACESINGLE; StatusOutline(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineBorderClick(TObject *Sender) { SubItem = WSI_BORDER; StatusOutline(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::cbOutlinePositionClick(TObject *Sender) { StatusOutline(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineNewClick(TObject *Sender) { csSurfaceMulti->Initial(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineAllClick(TObject *Sender) { TCursor cursor; cursor = Screen->Cursor; Screen->Cursor = crHourGlass; //dog MainImageForm->SearchWholeColor(csSurfaceMulti->ChoiceColor); csSurfaceMulti->Invalid(); Screen->Cursor = cursor; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineOneClick(TObject *Sender) { if (sbSurfaceMultiOne->Down) sbSurfaceMultiOne->Hint = IDS_COMMON_ONECOLOR; else sbSurfaceMultiOne->Hint = IDS_COMMON_BLOCKCOLOR; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineDeleteClick(TObject *Sender) { if (sbSurfaceMultiDelete->Down) sbSurfaceMultiDelete->Hint = IDS_COMMON_DELETECOLOR; else sbSurfaceMultiDelete->Hint = IDS_COMMON_INSERTCOLOR; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::sbOutlineBeforeClick(TObject *Sender) { csSurfaceMulti->LoadFromFile(DirectoryItem+"\\Window.Ini", "ColorSelector(Outline)"); } //--------------------------------------------------------------------------- // Private Method //--------------------------------------------------------------------------- void __fastcall TWindowForm::InitItem(TWindowItem i) { Item = i; switch (Item) { case WI_SHAPE: MainImageForm->iMainImage->OnPaintZoom = PaintZoomRectangle; pnShape->Top = Panel->Height+pnUndo->Height+4; ClientHeight = pnShape->Top+pnShape->Height; Parent->Height = ParentHeight+ClientHeight; pnShape->Enabled = true; pnShape->Visible = true; if(sbShapeRectangle->Down)SubItem = WSI_RECTANGLE; if(sbShapeEllipse->Down)SubItem = WSI_ELLIPSE; if(sbShapeSquare->Down)SubItem = WSI_SQUARE; if(sbShapeCircle->Down)SubItem = WSI_CIRCLE; sbShape->Down = true; break; case WI_IRREGULAR: MainImageForm->iMainImage->OnPaintZoom = PaintZoomIrregular; pnIrregular->Top = Panel->Height+pnUndo->Height+4; ClientHeight = pnIrregular->Top+pnIrregular->Height; Parent->Height = ParentHeight+ClientHeight; pnIrregular->Enabled = true; pnIrregular->Visible = true; StatusIrregular(); sbIrregular->Down = true; break; case WI_OUTLINE: pnOutline->Top = Panel->Height+pnUndo->Height+4; ClientHeight = pnOutline->Top+pnOutline->Height; Parent->Height = ParentHeight+ClientHeight; pnOutline->Enabled = true; pnOutline->Visible = true; if (MainImageForm->iMainImage->Bitmap->BitsPerPixel==8) { sbOutlineSurfaceMulti->Caption = IDS_SURFACEMULTI; sbOutlineSurfaceSingle->Caption = IDS_SURFACESINGLE; sbOutlineSurfaceMulti->Hint = IDS_MULTISURFACEFILL; sbOutlineSurfaceSingle->Hint = IDS_SINGLESURFACEFILL; pnSurfaceMulti->Visible = true; pnMagic->Visible = false; } else { sbOutlineSurfaceMulti->Caption = IDS_MAGIC; sbOutlineSurfaceSingle->Caption = IDS_SURFACE; sbOutlineSurfaceMulti->Hint = IDS_MAGIC; sbOutlineSurfaceSingle->Hint = IDS_SURFACE; pnSurfaceMulti->Visible = false; pnMagic->Visible = true; cbMagic->ItemIndex = 0; bMagicPosition = false; } if (sbOutlineSurfaceMulti->Down) SubItem = WSI_SURFACEMULTI; else if (sbOutlineSurfaceSingle->Down) SubItem = WSI_SURFACESINGLE; else if (sbOutlineBorder->Down) SubItem = WSI_BORDER; StatusOutline(); sbOutline->Down = true; //========================== 2001.7.13 lhskys Autorepeat ¿¡¼­ ÀÛ¾÷±¸¿ª ¿Ü°û¼± °¡´ÉÇϰÔ... /* if (MainImageForm->AutoRepeat){ sbOutlineSurfaceMulti->Enabled = false; sbOutlineSurfaceSingle->Enabled = false; gbSurfaceMulti->Enabled = false; pnMagic->Visible = false; pnSurfaceMulti->Visible = false; sbOutlineBorder->Down = true; pnOutline->BevelInner = bvNone; pnOutline->BevelOuter = bvNone; pnOutline->Height -= 126; Parent->Height -= 125; pnOutline->BevelInner = bvLowered; pnOutline->BevelOuter = bvRaised; SubItem = WSI_BORDER; StatusOutline(); }*/ //========================== break; default: ClientHeight = Panel->Height; Parent->Height = ParentHeight+ClientHeight; break; } StatusItem(); Show(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::ExitItem() { switch (Item) { case WI_SHAPE: MainImageForm->iMainImage->OnPaintZoom = NULL; MainImageForm->TempLabel->Visible = false; if (Step>0) Step = 0; pnShape->Enabled = false; pnShape->Visible = false; break; case WI_IRREGULAR: MainImageForm->iMainImage->OnPaintZoom = NULL; if (Step>0) { ResetPointList(); Step = 0; } cbIrreCurve->Checked = false; cbIrreCurve->Enabled = false; pnIrregular->Enabled = false; pnIrregular->Visible = false; break; case WI_OUTLINE: pnOutline->Enabled = false; pnOutline->Visible = false; break; } /* #ifdef TEXTILE if (MainImageForm->AutoRepeat) MainImageForm->iMainImage->OnPaintZoom = MainImageForm->DrawARepeatArea; #endif */ MainImageForm->iMainImage->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::StatusItem() { sbOff->Enabled = false; if (MainImageForm->WorkArea->Mask) sbOff->Enabled = true; if (MainImageForm->WorkArea->StatusUndo()) { sbUndo->Enabled = true; rbSwap->Enabled = true; rbStack->Enabled = true; } else { sbUndo->Enabled = false; rbSwap->Enabled = false; rbStack->Enabled = false; } rbAddition->Enabled = Number>0; rbSubtraction->Enabled = Number>0; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::PaintZoomRectangle(TObject *Sender, HDC dc) { TPItemImage *Image = (TPItemImage *)Sender; RECT rr; int diff = abs(First.x-Second.x) - abs(First.y-Second.y); HBRUSH hOldBrush; COLORREF clOldBk; HPEN hPen, hOldPen; if (Step>0) { if (SubItem==WSI_CIRCLE||SubItem==WSI_SQUARE){ //by jeegeo if (diff > 0) { if (First.x>Second.x) { Second.x+=diff; } else { Second.x-=diff; } } else { if (First.y>Second.y) { Second.y-=diff; } else { Second.y+=diff; } } } rr.left = min(First.x, Second.x); rr.top = min(First.y, Second.y); rr.right = max(First.x, Second.x)+1; rr.bottom = max(First.y, Second.y)+1; rr.left = Image->BitmapToCanvasX(rr.left); rr.top = Image->BitmapToCanvasY(rr.top)-Image->MarginY; rr.right = Image->BitmapToCanvasX(rr.right); rr.bottom = Image->BitmapToCanvasY(rr.bottom)-Image->MarginY; hOldBrush = SelectObject(dc, GetStockObject(NULL_BRUSH)); clOldBk = SetBkColor(dc, clNone); hPen = CreatePen(PS_DOT, 1, clBlack); hOldPen = SelectObject(dc, hPen); if (SubItem==WSI_ELLIPSE||SubItem==WSI_CIRCLE) { Ellipse(dc, rr.left, rr.top, rr.right, rr.bottom); } if (SubItem==WSI_RECTANGLE||SubItem==WSI_SQUARE) { Rectangle(dc, rr.left, rr.top, rr.right, rr.bottom); } SelectObject(dc, hOldPen); DeleteObject(hPen); SetBkColor(dc, clOldBk); SelectObject(dc, hOldBrush); } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::PaintZoomIrregular(TObject *Sender, HDC dc) { TPItemImage *Image = (TPItemImage *)Sender; HBRUSH hOldBrush; COLORREF clOldBk; HPEN hPen, hOldPen; RECT rr; int i; TWAPointData *pd; TPoint pt[3]; double length; //lhskys ±æÀ̸¦ ÀÌ¿ëÇϱâ À§Çؼ­ double dx,dy,lx,ly; //lhskys x,yÀÇ º¯È­·® if (Step>0) { hOldBrush = SelectObject(dc, GetStockObject(NULL_BRUSH)); clOldBk = SetBkColor(dc, clWhite); hPen = CreatePen(PS_DOT, 1, clBlack); hOldPen = SelectObject(dc, hPen); if (Method<0) { pd = (TWAPointData *)PointList->First(); pt[2].x = Image->BitmapToCanvasX(pd->Pos.x); pt[2].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; MoveToEx(dc, pt[2].x, pt[2].y, NULL); if (PointList->Count>1) { for (i=1; i<=PointList->Count-1; i++) { pd = (TWAPointData *)PointList->Items[i]; pt[2].x = Image->BitmapToCanvasX(pd->Pos.x); pt[2].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; if (pd->Curve) { pt[0].x = Image->BitmapToCanvasX(pd->Apex.x); pt[0].y = Image->BitmapToCanvasY(pd->Apex.y)-Image->MarginY; pt[1] = pt[0]; PolyBezierTo(dc, pt, 3); } else { LineTo(dc, pt[2].x, pt[2].y); } } } switch (Method) { case -2: if(Item==WI_IRREGULAR && pressZ==1){ //lhskys zŰ Á÷°¢Ç¥½Ã Second=pd->Pos; //lhskys ¹þ¾î³ª´ÂÁ¡À» Àç À§Ä¡·Î... if(DeleteClick==1)Second=pt[2]; //lhskys ÇÑÁ¡µÚ·Î ÇßÀ»¶§ Á¡°ªÀ» ´Ù½Ã ÀÔ·Â int x1,x2,y1,y2; // °¢µµ üũ x1=First.x; // ¹× x2=Second.x; // ±×¸®±â y1=First.y; y2=Second.y; if((y2-y1>=x2-x1)&&(y2-y1>=x1-x2)){ First.x=Second.x; pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y); LineTo(dc,pt[2].x,pt[2].y); } if((y2-y1>=x2-x1)&&(y2-y1<=x1-x2)){ First.y=Second.y; // y = x ±âÁØÀ¸·Î pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y); LineTo(dc,pt[2].x,pt[2].y); } if((y2-y1<=x2-x1)&&(y2-y1>=x1-x2)){ First.y=Second.y; pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y); LineTo(dc,pt[2].x,pt[2].y); } if((y2-y1<=x2-x1)&&(y2-y1<=x1-x2)){ First.x=Second.x; pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y); LineTo(dc,pt[2].x,pt[2].y); } DeleteClick = 0; break; } //¿ä±â±îÁö pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y)-Image->MarginY; LineTo(dc, pt[2].x, pt[2].y); break; case -3: pd = (TWAPointData *)PointList->First(); pt[2].x = Image->BitmapToCanvasX(pd->Pos.x); pt[2].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; LineTo(dc, pt[2].x, pt[2].y); break; case -4: pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y)-Image->MarginY; pt[0].x = Image->BitmapToCanvasX(Second.x); pt[0].y = Image->BitmapToCanvasY(Second.y)-Image->MarginY; pt[1] = pt[0]; PolyBezierTo(dc, pt, 3); break; } } else { if (Method==0) { pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y)-Image->MarginY; MoveToEx(dc, pt[2].x, pt[2].y, NULL); } else { pd = (TWAPointData *)PointList->First(); pt[2].x = Image->BitmapToCanvasX(pd->Pos.x); pt[2].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; MoveToEx(dc, pt[2].x, pt[2].y, NULL); } if (PointList->Count>1) { for (i=1; i<=PointList->Count-1; i++) { pd = (TWAPointData *)PointList->Items[i]; if (pd->Curve) { pt[2].x = Image->BitmapToCanvasX(pd->Apex.x); pt[2].y = Image->BitmapToCanvasY(pd->Apex.y)-Image->MarginY; if (Method==i) { pt[0].x = Image->BitmapToCanvasX(First.x); pt[0].y = Image->BitmapToCanvasY(First.y)-Image->MarginY; pt[1] = pt[0]; PolyBezierTo(dc, pt, 3); } else { pt[0].x = Image->BitmapToCanvasX(pd->Pos.x); pt[0].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; pt[1] = pt[0]; PolyBezierTo(dc, pt, 3); } } else { if (Method==i) { pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y)-Image->MarginY; LineTo(dc, pt[2].x, pt[2].y); } else { pt[2].x = Image->BitmapToCanvasX(pd->Pos.x); pt[2].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; LineTo(dc, pt[2].x, pt[2].y); } } } } if (Method==0) { pt[2].x = Image->BitmapToCanvasX(First.x); pt[2].y = Image->BitmapToCanvasY(First.y)-Image->MarginY; LineTo(dc, pt[2].x, pt[2].y); } else { pd = (TWAPointData *)PointList->First(); pt[2].x = Image->BitmapToCanvasX(pd->Pos.x); pt[2].y = Image->BitmapToCanvasY(pd->Pos.y)-Image->MarginY; LineTo(dc, pt[2].x, pt[2].y); } } SelectObject(dc, hOldPen); DeleteObject(hPen); SetBkColor(dc, clOldBk); SelectObject(dc, hOldBrush); } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::WADraw(int m) { if (Item==WI_IRREGULAR) Method = m; #if defined(TEXTILE) #if defined(CARPET) MainImageForm->iMainImage->Invalidate(); #else TPItemImage *Image=MainImageForm->iMainImage; double ratio=Image->ZoomOut/Image->ZoomIn; int minx,miny,maxx,maxy; TWAPointData *pd; minx=maxx=Second.x; miny=maxy=Second.y; for (int i=0; iCount; i++) { pd = (TWAPointData *)PointList->Items[i]; //=================== 2001.3.27. lhskys C++Builder 5 ¿¡¼­ int Ãß°¡... minx=min(minx,(int)pd->Pos.x); maxx=max(maxx,(int)pd->Pos.x); miny=min(miny,(int)pd->Pos.y); maxy=max(maxy,(int)pd->Pos.y); minx=min(minx,(int)pd->Apex.x); maxx=max(maxx,(int)pd->Apex.x); miny=min(miny,(int)pd->Apex.y); maxy=max(maxy,(int)pd->Apex.y); } minx=min(minx,(int)First.x); maxx=max(maxx,(int)First.x); miny=min(miny,(int)First.y); maxy=max(maxy,(int)First.y); //============================================== static RECT oldrc=Rect(minx-ratio*1-1,miny-ratio*1-1,maxx+ratio*1+1,maxy+ratio*1+1); MainImageForm->iMainImage->RectPaint(oldrc, true); oldrc=Rect(minx-ratio*1-1,miny-ratio*1-1,maxx+ratio*1+1,maxy+ratio*1+1); #endif #elif defined(KNIT) MainImageForm->iMainImage->Invalidate(); #else MainImageForm->iMainImage->Invalidate(); #endif } //--------------------------------------------------------------------------- void __fastcall TWindowForm::RectangleMouseDown(TMouseButton Button, int X, int Y) { if (Button==mbLeft) { if (Step>0) { Second = Point(X, Y); SetBitmapRegion(); MainImageForm->iMainImage->Invalidate(); MainImageForm->WorkAreaChange(); MainImageForm->TempLabel->Visible = false; Step = 0; } else { MainImageForm->WorkArea->PushUndo(); if (rbSet->Checked) ResetBitmapRegion(); First = Point(X, Y); Second = First; MainImageForm->TempLabel->Visible = true; Step = 11; } } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::RectangleMouseMove(int X, int Y) { AnsiString str; int lx, ly, sx, sy, dx, dy; TSize size; if (Step>0) { Second = Point(X, Y); dx = First.x - Second.x; dy = First.y - Second.y; str = returnSize(dx, dy); lbShape->Caption = AnsiString(IDS_COMMON_SIZE) + " : " + str + MainImageForm->UnitName(); MainImageForm->TempLabel->Caption = str; lx = Second.x-First.x; ly = Second.y-First.y; size.cx = MainImageForm->TempLabel->Width; size.cy = MainImageForm->TempLabel->Height; sx = MainImageForm->iMainImage->BitmapToCanvasX(Second.x); sy = MainImageForm->iMainImage->BitmapToCanvasY(Second.y); if (ly>0) { sy = sy-5-size.cy; if (lx>0) sx = sx-5-size.cx; else sx = sx+5; } else { sy = sy+5; if (lx>0) sx = sx-5-size.cx; else sx = sx+5; } MainImageForm->TempLabel->Left = sx; MainImageForm->TempLabel->Top = sy; //MainImageForm->TempLabel->Update(); WADraw(0); } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::ResetPointList() { TWAPointData *pd; while (PointList->Count>0) { pd = (TWAPointData *)PointList->Last(); PointList->Remove(pd); delete pd; } sbIrreClose->Enabled = false; sbIrreDelete->Enabled = false; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::PushPointList(bool curve, TPoint pos, TPoint apex) { TWAPointData *pd; if ((pd = new TWAPointData)==NULL) return false; pd->Curve = curve; pd->Pos = pos; pd->Apex = apex; PointList->Add(pd); return true; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::PopPointList() { TWAPointData *pd; pd = (TWAPointData *)PointList->Last(); PointList->Remove(pd); delete pd; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::StatusIrregular() { if (Item==WI_IRREGULAR) { sbIrreDelete->Enabled = PointList->Count>0; sbIrreClose->Enabled = PointList->Count>2; } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::IrregularMouseDown(TMouseButton Button, int X, int Y) { TRect r; double length; //lhskys ±æÀ̸¦ ÀÌ¿ëÇϱâ À§Çؼ­ double dx,dy,lx,ly; //lhskys x,yÀÇ º¯È­·® if (Button==mbLeft) { if (Step>0) { if (cbIrreCurve->Checked) { if (Step==23) { Second = Point(X, Y); PushPointList(true, First, Second); cbIrreCurve->Enabled = true; Step = 22; Second=First; //lhskys °î¼±¿¡¼­ first ¿Í second ÀÇ ÀÚ¸®¹Ù²Þ } else { First = Point(X, Y); cbIrreCurve->Enabled = false; Step = 23; } } else { if(Item==WI_IRREGULAR && pressZ==1){ //lhskys zŰ Ŭ¸¯ int x1,x2,y1,y2; // °¢µµ üũ x1=X; // ¹× x2=Second.x; // ±×¸®±â y1=Y; y2=Second.y; if((y2-y1>=x2-x1)&&(y2-y1>=x1-x2)) X=Second.x; if((y2-y1>=x2-x1)&&(y2-y1<=x1-x2)) Y=Second.y; if((y2-y1<=x2-x1)&&(y2-y1>=x1-x2)) // y = x ±âÁØÀ¸·Î Y=Second.y; if((y2-y1<=x2-x1)&&(y2-y1<=x1-x2)) X=Second.x; pressZ=0; } First = Point(X, Y); Second = First; PushPointList(false, First, Second); Step = 21; } } else { MainImageForm->WorkArea->PushUndo(); if (rbSet->Checked) ResetBitmapRegion(); First = Point(X, Y); Second = First; StatusItem(); PushPointList(false, First, Second); cbIrreCurve->Enabled = true; Step = 21; } StatusIrregular(); } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::IrregularMouseMove(TShiftState Shift, int X, int Y) { if (Step>0) { if (Shift.Contains(ssLeft)) { if (cbIrreCurve->Checked==false) { First = Point(X,Y); //lhskys // Second = Point(X, Y); //¿ä°ÍÀ̶û À§ÀǰÍÀ̶û ¹Ù²Þ if ((abs(First.x-Second.x)+ abs(First.y-Second.y)>6) && pressZ != 1) { PushPointList(false, Second, First); //lhskys Second, FirstÀ§Ä¡±³È¯ WADraw(-1); StatusIrregular(); Second = First; } } } else { if (Step==23) { Second = Point(X, Y); //°î¼± WADraw(-4); } else { First = Point(X, Y); WADraw(-2); } if (Step==21) Step = 22; } } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::IrregularMouseUp(TShiftState Shift, int X, int Y) { } //--------------------------------------------------------------------------- void __fastcall TWindowForm::StatusOutline() { bool b; if (Item==WI_OUTLINE && SubItem==WSI_SURFACEMULTI) { cbSurfaceMulti->Enabled = true; b = cbSurfaceMulti->Checked==false; if (MainImageForm->iMainImage->Bitmap->BitsPerPixel!=8) { bnRun->Enabled = bMagicPosition; if (bMagicPosition) { switch (MainImageForm->CurrentUnit) { case uDot: lbMagic->Caption = Format("Position : %d x %d", OPENARRAY(TVarRec, ((int)First.x, (int)First.y))); break; case uInch: lbMagic->Caption = Format("Position : %.2f x %.2f", OPENARRAY(TVarRec, ((double)First.x/MainImageForm->CanvasInfor.DotsPerInch, (double)First.y/MainImageForm->CanvasInfor.DotsPerInch))); break; case uCm: lbMagic->Caption = Format("Position : %.2f x %.2f", OPENARRAY(TVarRec, (2.54*First.x/MainImageForm->CanvasInfor.DotsPerInch, 2.54*First.y/MainImageForm->CanvasInfor.DotsPerInch))); break; } spMagic->Brush->Color = (TColor) FillColor; } } } else { cbSurfaceMulti->Enabled = false; b = false; } csSurfaceMulti->Enabled = b; sbSurfaceMultiNew->Enabled = b; sbSurfaceMultiAll->Enabled = b; sbSurfaceMultiOne->Enabled = b; sbSurfaceMultiDelete->Enabled = b; sbSurfaceMultiBefore->Enabled = b; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::OutlineMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) { RECT r; int ix, iy; TTexpiaBitmap *tb; Byte *bp; switch (SubItem) { case WSI_SURFACEMULTI: if (MainImageForm->iMainImage->Bitmap->BitsPerPixel==24 || cbSurfaceMulti->Checked) { if (Button==mbLeft) { MainImageForm->WorkArea->PushUndo(); if (rbSet->Checked) ResetBitmapRegion(); First.x = X; First.y = Y; SetBitmapRegion(); MainImageForm->WorkAreaChange(); } } else { if (Button==mbMiddle || (Shift.Contains(ssShift) && Button==mbLeft)) { tb = MainImageForm->iMainImage->Bitmap; if (sbSurfaceMultiOne->Down) { if (sbSurfaceMultiDelete->Down) { csSurfaceMulti->DeleteColor(tb->GetPixelColor(X, Y)); } else { csSurfaceMulti->AddColor(tb->GetPixelColor(X, Y)); } } else { if (Step>0) { Temp.right = X; Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); if (Temp.left>Temp.right) { r.left = Temp.right; r.right = Temp.left; } else { r.left = Temp.left; r.right = Temp.right; } if (Temp.top>Temp.bottom) { r.top = Temp.bottom; r.bottom = Temp.top; } else { r.top = Temp.top; r.bottom = Temp.bottom; } if (tb->StartScanLine()) { if (sbSurfaceMultiDelete->Down) { for (iy=r.top; iyGetScanLine(iy); for (ix=r.left; ixDeleteColor(*(bp+ix)); } } } else { for (iy=r.top; iyGetScanLine(iy); for (ix=r.left; ixAddColor(*(bp+ix)); } } } tb->StopScanLine(); } else { EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return;} Step = 0; isDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } else { Temp.left = Temp.top = X; Temp.top = Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); isDraw = true; Step = 11; } } } } break; case WSI_SURFACESINGLE: if (Button==mbLeft) { MainImageForm->WorkArea->PushUndo(); if (rbSet->Checked) ResetBitmapRegion(); First.x = X; First.y = Y; SetBitmapRegion(); MainImageForm->WorkAreaChange(); } break; case WSI_BORDER: if (Button==mbLeft) { if (Step>0) { maneupdate = true; MainImageForm->WorkArea->PushUndo(); if (rbSet->Checked) ResetBitmapRegion(); Second.x = X; Second.y = Y; SetBitmapRegion(); MainImageForm->WorkAreaChange(); Step = 0; } else { if(rbSet->Checked)ResetBitmapRegion(); First.x = X; First.y = Y; Step = 1; maneupdate = false; } } break; } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::OutlineMouseMove(TShiftState Shift, int X, int Y) { switch (SubItem) { case WSI_SURFACEMULTI: if (sbSurfaceMultiOne->Down==false) { if (Step>0) { if (isDraw) MainImageForm->DrawRectangleLocate(Temp); Temp.right = X; Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); isDraw = true; } } break; } } //--------------------------------------------------------------------------- COLORREF __fastcall TWindowForm::SearchColor(RGBQUAD *rgb, int n) { COLORREF nColor; int i; while (true) { nColor = rand()&0xFFFFFF; if (nColor==0) continue; for (i=0; i<256; i++) { if (nColor==RGB(rgb[i].rgbRed, rgb[i].rgbGreen, rgb[i].rgbBlue)) break; } if (i>=256) { rgb[n].rgbRed = GetRValue(nColor); rgb[n].rgbGreen = GetGValue(nColor); rgb[n].rgbBlue = GetBValue(nColor); break; } } return nColor; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::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->Bitmap->Handle; XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; switch (Item) { case WI_SHAPE: if (SubItem==WSI_CIRCLE||SubItem==WSI_SQUARE){ //by jeegeo if (diff > 0) { if (First.x>Second.x) { Second.x+=diff; } else { Second.x-=diff; } } else { if (First.y>Second.y) { Second.y-=diff; } else { Second.y+=diff; } } } 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 (SubItem==WSI_ELLIPSE||SubItem==WSI_CIRCLE) { //by jeegeo if (L_BitmapHasRgn(bh)) { if (rbSubtraction->Checked) { L_SetBitmapRgnEllipse(bh, &XForm, &rc, L_RGN_ANDNOTRGN); } else { L_SetBitmapRgnEllipse(bh, &XForm, &rc, L_RGN_OR); } } else { L_SetBitmapRgnEllipse(bh, &XForm, &rc, L_RGN_SET); } } else { if (L_BitmapHasRgn(bh)) { if (rbSubtraction->Checked) { L_SetBitmapRgnRect(bh, &XForm, &rc, L_RGN_ANDNOTRGN); } else { L_SetBitmapRgnRect(bh, &XForm, &rc, L_RGN_OR); } } else { L_SetBitmapRgnRect(bh, &XForm, &rc, L_RGN_SET); } } sw = true; break; case WI_IRREGULAR: dc = GetDC(0); if (dc) { BeginPath(dc); pd = (TWAPointData *)PointList->First(); pt[2].x = pd->Pos.x; pt[2].y = pd->Pos.y; MoveToEx(dc, pt[2].x, pt[2].y, NULL); if (PointList->Count>1) { for (i=1; i<=PointList->Count-1; i++) { pd = (TWAPointData *)PointList->Items[i]; pt[2].x = pd->Pos.x; pt[2].y = pd->Pos.y; if (pd->Curve) { pt[0].x = pd->Apex.x; pt[0].y = pd->Apex.y; pt[1] = pt[0]; PolyBezierTo(dc, pt, 3); } else { LineTo(dc, pt[2].x, pt[2].y); } } } CloseFigure(dc); EndPath(dc); rgnSrc = PathToRegion(dc); ReleaseDC(0, dc); if (L_BitmapHasRgn(bh)) { if (rbSubtraction->Checked) { L_SetBitmapRgnHandle(bh, &XForm, rgnSrc, L_RGN_ANDNOTRGN); } else { L_SetBitmapRgnHandle(bh, &XForm, rgnSrc, L_RGN_OR); } } else { L_SetBitmapRgnHandle(bh, &XForm, rgnSrc, L_RGN_SET); } DeleteObject(rgnSrc); sw = true; } break; case WI_OUTLINE: xForm.eM11 = 1.0F; xForm.eM12 = 0.0F; xForm.eM21 = 0.0F; xForm.eM22 = 1.0F; xForm.eDx = 0.0F; xForm.eDy = 0.0F; switch (SubItem) { case WSI_SURFACEMULTI: if (Image->Bitmap->BitsPerPixel==8) { rgnDst = Fill(Image, First, SurfaceFillRead8Multi); } else { FillColor = Image->Bitmap->GetPixelColor(First.x, First.y); bMagicPosition = true; StatusOutline(); if (cbMagic->ItemIndex) { TColor2HLS((TColor)FillColor, h, l, s); r = 360*tbMagic->Position/200.0; FillHue[0] = h-r; FillHue[1] = h+r; r = tbMagic->Position/200.0; FillLig[0] = l-r; FillLig[1] = l+r; if (FillLig[0]<0) { FillLig[0] = 0.0; FillLig[1] = tbMagic->Position/100.0; } else if (FillLig[1]>1.0) { FillLig[0] = (100-tbMagic->Position)/100.0; FillLig[1] = 1.0; } FillSat[0] = s-r; FillSat[1] = s+r; if (FillSat[0]<0) { FillSat[0] = 0.0; FillSat[1] = tbMagic->Position/100.0; } else if (FillSat[1]>1.0) { FillSat[0] = (100-tbMagic->Position)/100.0; FillSat[1] = 1.0; } #if defined(TEXTILE) && !defined(CARPET) if (Image->LayerMask) { rgnDst = FillLayer(Image, First, MagicFillRead24HLSLayer); } else { rgnDst = Fill(Image, First, MagicFillRead24HLS); } #else rgnDst = Fill(Image, First, MagicFillRead24HLS); #endif } else { rgb = TColorToRGB((TColor)FillColor); r = 255*tbMagic->Position/200; if (rgb.rgbRed-r<0) { FillRGB[0].rgbRed = 0; FillRGB[1].rgbRed = 255*tbMagic->Position/100; } else if (rgb.rgbRed+r>255) { FillRGB[0].rgbRed = 255*(100-tbMagic->Position)/100; FillRGB[1].rgbRed = 255; } else { FillRGB[0].rgbRed = rgb.rgbRed-r; FillRGB[1].rgbRed = rgb.rgbRed+r; } if (rgb.rgbGreen-r<0) { FillRGB[0].rgbGreen = 0; FillRGB[1].rgbGreen = 255*tbMagic->Position/100; } else if (rgb.rgbGreen+r>255) { FillRGB[0].rgbGreen = 255*(100-tbMagic->Position)/100; FillRGB[1].rgbGreen = 255; } else { FillRGB[0].rgbGreen = rgb.rgbGreen-r; FillRGB[1].rgbGreen = rgb.rgbGreen+r; } if (rgb.rgbBlue-r<0) { FillRGB[0].rgbBlue = 0; FillRGB[1].rgbBlue = 255*tbMagic->Position/100; } else if (rgb.rgbBlue+r>255) { FillRGB[0].rgbBlue = 255*(100-tbMagic->Position)/100; FillRGB[1].rgbBlue = 255; } else { FillRGB[0].rgbBlue = rgb.rgbBlue-r; FillRGB[1].rgbBlue = rgb.rgbBlue+r; } #if defined(TEXTILE) && !defined(CARPET) if (Image->LayerMask) { rgnDst = FillLayer(Image, First, MagicFillRead24RGBLayer); } else { rgnDst = Fill(Image, First, MagicFillRead24RGB); } #else rgnDst = Fill(Image, First, MagicFillRead24RGB); #endif } } break; case WSI_SURFACESINGLE: FillColor = Image->Bitmap->GetPixelColor(First.x, First.y); if (Image->Bitmap->BitsPerPixel==8) { rgnDst = Fill(Image, First, SurfaceFillRead8Single); } else { #if defined(TEXTILE) && !defined(CARPET) if (Image->LayerMask) { rgnDst = FillLayer(Image, First, SurfaceFillRead24Layer); } else { rgnDst = Fill(Image, First, SurfaceFillRead24); } #else rgnDst = Fill(Image, First, SurfaceFillRead24); #endif } break; case WSI_BORDER: FillColor = Image->Bitmap->GetPixelColor(Second.x, Second.y); if (Image->Bitmap->BitsPerPixel==8) { rgnDst = Fill(Image, First, BorderFillRead8); } else { rgnDst = Fill(Image, First, BorderFillRead24); // layer check°¡ ÇÊ¿ä¾øÀ» °Í °°½À´Ï´Ù.. } break; } if (L_BitmapHasRgn(bh)) { if (rbSubtraction->Checked) { L_SetBitmapRgnHandle(bh, &XForm, rgnDst, L_RGN_ANDNOTRGN); } else { L_SetBitmapRgnHandle(bh, &XForm, rgnDst, L_RGN_OR); } } else { L_SetBitmapRgnHandle(bh, &XForm, rgnDst, L_RGN_SET); } DeleteObject(rgnDst); sw = true; break; } if (sw) { L_GetBitmapRgnHandle(bh, &XForm, &rgnDst); MainImageForm->WorkArea->SetMask(rgnDst); DeleteObject(rgnDst); Image->OutlineBitmapRgn(MainImageForm->WorkArea->bComplex); Image->Repaint(); if (rbSet->Checked==false) { Number++; if (Number>=9) { MessageDlg(IDS_MESSAGE_NOSETWINDOW, mtInformation, TMsgDlgButtons() << mbYes, 0); rbSet->Checked = true; Number = 0; } } else { Number = 1; } StatusItem(); } Screen->Cursor = cursor; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::ResetBitmapRegion() { pBITMAPHANDLE bh; RGNXFORM XForm; RECT rc; bh = MainImageForm->iMainImage->Bitmap->Handle; if (L_BitmapHasRgn(bh)) { XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; L_GetBitmapRgnBounds(bh, &XForm, &rc); L_FreeBitmapRgn(bh); MainImageForm->WorkArea->SetMask(NULL); InvalidateRect(MainImageForm->iMainImage->Parent->Handle, &rc, false); } } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::SurfaceFillRead8Single(Byte *p, int x) { return *(p+x)==(Byte)FillColor; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::SurfaceFillRead8Multi(Byte *p, int x) { return csSurfaceMulti->Number[*(p+x)]Count; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::BorderFillRead8(Byte *p, int x) { return *(p+x)!=(Byte)FillColor; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::MagicFillRead24RGB(Byte *p, int x) { COLORREF c; RGBQUAD rgb; p += 3*x; GetPixel24(p, c); rgb = TColorToRGB((TColor)c); if (rgb.rgbRedFillRGB[1].rgbRed) return false; if (rgb.rgbGreenFillRGB[1].rgbGreen) return false; if (rgb.rgbBlueFillRGB[1].rgbBlue) return false; return true; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::MagicFillRead24HLS(Byte *p, int x) { COLORREF c; THLS hls; p += 3*x; GetPixel24(p, c); TColor2HLS((TColor)c, hls.Hue, hls.Lig, hls.Sat); if (hls.Sat>0.0) { if (FillHue[0]<0) { if (hls.HueFillHue[1]) return false; } else if (FillHue[1]>=360) { if (hls.HueFillHue[1]-360) return false; } else { if (hls.HueFillHue[1]) return false; } } if (hls.LigFillLig[1]) return false; if (hls.SatFillSat[1]) return false; return true; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::SurfaceFillRead24(Byte *p, int x) { COLORREF c; p += 3*x; GetPixel24(p, c); return c==FillColor; } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::BorderFillRead24(Byte *p, int x) { COLORREF c; p += 3*x; GetPixel24(p, c); return c!=FillColor; } //--------------------------------------------------------------------------- HRGN __fastcall TWindowForm::Fill(TPItemImage *Image, const TPoint start, TWindowFillRead read) { HRGN hRgn = NULL; TPBitmap *FillMask = NULL; int x, y, savex, savey, xr, xl, i, j; TPoint size, now, *sp; TList *stack = NULL, *rcList = NULL; RECT rcTemp, *lpRect; Byte *p, *m; size.x = Image->Bitmap->Width; size.y = Image->Bitmap->Height; if ((rcList = new TList)==NULL) goto fail; if ((stack = new TList)==NULL) goto fail; stack->Add(new TPoint(start)); if ((FillMask = new TPBitmap)==NULL) goto fail; if (!FillMask->Create(size.x, size.y, 1)) goto fail; #ifdef TPDEBUG if (!FillMask->Lock()) SHOWDEBUG; #else FillMask->Lock(); #endif FillMask->Fill(0); if (!Image->Bitmap->StartScanLine()) goto fail; while (stack->Count) { sp = (TPoint *)stack->Last(); stack->Remove(sp); x = sp->x; y = sp->y; delete sp; p = Image->Bitmap->GetScanLine(y); m = FillMask->ScanLine(y); *(m+(x>>3)) |= 0x80>>(x&7); savex = x; while (1) { x++; if (x>3))&(0x80>>(x&7)))==0 && read(p, x)) *(m+(x>>3)) |= 0x80>>(x&7); else break; } xr = x-1; x = savex; while (1) { x--; if (x>=0 && (*(m+(x>>3))&(0x80>>(x&7)))==0 && read(p, x)) *(m+(x>>3)) |= 0x80>>(x&7); else break; } xl = x+1; rcTemp = Rect(xl, y, xr+1, y+1); for (j=0; jCount; j++) { lpRect = (RECT *)rcList->Items[j]; if (lpRect->top==rcTemp.bottom) { if (lpRect->left==rcTemp.left && lpRect->right==rcTemp.right) { lpRect->top = rcTemp.top; break; } } else if (lpRect->bottom==rcTemp.top) { if (lpRect->left==rcTemp.left && lpRect->right==rcTemp.right) { lpRect->bottom = rcTemp.bottom; break; } } if (lpRect->left==rcTemp.right) { if (lpRect->top==rcTemp.top && lpRect->bottom==rcTemp.bottom) { lpRect->left = rcTemp.left; break; } } else if (lpRect->right==rcTemp.left) { if (lpRect->top==rcTemp.top && lpRect->bottom==rcTemp.bottom) { lpRect->right = rcTemp.right; break; } } } if (j>=rcList->Count) { rcList->Add(new TRect(rcTemp)); } x = xl; savey = y; y++; if (yBitmap->GetScanLine(y); m = FillMask->ScanLine(y); if (y>3))&(0x80>>(x&7))) || read(p, x)==false) x++; else { while (1) { if (x<=xr) { if ((*(m+(x>>3))&(0x80>>(x&7)))==0 && read(p, x)) x++; else { now.x = x-1; x++; break; } } else { now.x = x-1; break; } } now.y = y; stack->Add(new TPoint(now)); } } } x = xl; } y = savey; y--; if (y>=0) { p = Image->Bitmap->GetScanLine(y); m = FillMask->ScanLine(y); if (y>=0) { while (x<=xr) { if ((*(m+(x>>3))&(0x80>>(x&7))) || read(p, x)==false) x++; else { while (1) { if (x<=xr) { if ((*(m+(x>>3))&(0x80>>(x&7)))==0 && read(p, x)) x++; else { now.x = x-1; x++; break; } } else { now.x = x-1; break; } } now.y = y; stack->Add(new TPoint(now)); } } } } } Image->Bitmap->StopScanLine(); delete FillMask; FillMask = NULL; delete stack; stack = NULL; while (rcList->Count>0) { lpRect = (RECT *)rcList->First(); if (!MergeRegion(hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom)) goto fail; rcList->Remove(lpRect); delete lpRect; } delete rcList; return hRgn; fail: if (FillMask) delete FillMask; if (stack) delete stack; if (hRgn) DeleteObject(hRgn); if (rcList) { while (rcList->Count>0) { lpRect = (RECT *)rcList->First(); rcList->Remove(lpRect); delete lpRect; } delete rcList; } EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return NULL; } #if defined(TEXTILE) && !defined(CARPET) //--------------------------------------------------------------------------- bool __fastcall TWindowForm::MagicFillRead24RGBLayer(Byte *p, Byte *lm, int x) { COLORREF c; RGBQUAD rgb; if (*(lm + (x >> 3)) & (0x80 >> (x & 7))) return false; else { p += 3*x; GetPixel24(p, c); rgb = TColorToRGB((TColor)c); if (rgb.rgbRedFillRGB[1].rgbRed) return false; if (rgb.rgbGreenFillRGB[1].rgbGreen) return false; if (rgb.rgbBlueFillRGB[1].rgbBlue) return false; return true; } } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::MagicFillRead24HLSLayer(Byte *p, Byte *lm, int x) { COLORREF c; THLS hls; if (*(lm + (x >> 3)) & (0x80 >> (x & 7))) return false; else { p += 3*x; GetPixel24(p, c); TColor2HLS((TColor)c, hls.Hue, hls.Lig, hls.Sat); if (hls.Sat>0.0) { if (FillHue[0]<0) { if (hls.HueFillHue[1]) return false; } else if (FillHue[1]>=360) { if (hls.HueFillHue[1]-360) return false; } else { if (hls.HueFillHue[1]) return false; } } if (hls.LigFillLig[1]) return false; if (hls.SatFillSat[1]) return false; return true; } } //--------------------------------------------------------------------------- bool __fastcall TWindowForm::SurfaceFillRead24Layer(Byte *p, Byte *lm, int x) { COLORREF c; if (*(lm + (x >> 3)) & (0x80 >> (x & 7))) return false; else { p += 3*x; GetPixel24(p, c); return c==FillColor; } } //--------------------------------------------------------------------------- HRGN __fastcall TWindowForm::FillLayer(TPItemImage *Image, const TPoint start, TWindowFillReadLayer read) { HRGN hRgn = NULL; TPBitmap *FillMask = NULL; int x, y, savex, savey, xr, xl, i, j; TPoint size, now, *sp; TList *stack = NULL, *rcList = NULL; RECT rcTemp, *lpRect; Byte *p, *m, *lm; size.x = Image->Bitmap->Width; size.y = Image->Bitmap->Height; if ((rcList = new TList)==NULL) goto fail; if ((stack = new TList)==NULL) goto fail; stack->Add(new TPoint(start)); if ((FillMask = new TPBitmap)==NULL) goto fail; if (!FillMask->Create(size.x, size.y, 1)) goto fail; #ifdef TPDEBUG if (!FillMask->Lock()) SHOWDEBUG; #else FillMask->Lock(); #endif FillMask->Fill(0); if (!Image->Bitmap->StartScanLine()) goto fail; if (!Image->LayerMask->StartScanLine()) goto fail; while (stack->Count) { sp = (TPoint *)stack->Last(); stack->Remove(sp); x = sp->x; y = sp->y; delete sp; p = Image->Bitmap->GetScanLine(y); lm = Image->LayerMask->GetScanLine(y); m = FillMask->ScanLine(y); *(m+(x>>3)) |= 0x80>>(x&7); savex = x; while (1) { x++; if (x>3))&(0x80>>(x&7)))==0 && read(p, lm, x)) *(m+(x>>3)) |= 0x80>>(x&7); else break; } xr = x-1; x = savex; while (1) { x--; if (x>=0 && (*(m+(x>>3))&(0x80>>(x&7)))==0 && read(p, lm, x)) *(m+(x>>3)) |= 0x80>>(x&7); else break; } xl = x+1; rcTemp = Rect(xl, y, xr+1, y+1); for (j=0; jCount; j++) { lpRect = (RECT *)rcList->Items[j]; if (lpRect->top==rcTemp.bottom) { if (lpRect->left==rcTemp.left && lpRect->right==rcTemp.right) { lpRect->top = rcTemp.top; break; } } else if (lpRect->bottom==rcTemp.top) { if (lpRect->left==rcTemp.left && lpRect->right==rcTemp.right) { lpRect->bottom = rcTemp.bottom; break; } } if (lpRect->left==rcTemp.right) { if (lpRect->top==rcTemp.top && lpRect->bottom==rcTemp.bottom) { lpRect->left = rcTemp.left; break; } } else if (lpRect->right==rcTemp.left) { if (lpRect->top==rcTemp.top && lpRect->bottom==rcTemp.bottom) { lpRect->right = rcTemp.right; break; } } } if (j>=rcList->Count) { rcList->Add(new TRect(rcTemp)); } x = xl; savey = y; y++; if (yBitmap->GetScanLine(y); lm = Image->LayerMask->GetScanLine(y); m = FillMask->ScanLine(y); if (y>3))&(0x80>>(x&7))) || read(p, lm, x)==false) x++; else { while (1) { if (x<=xr) { if ((*(m+(x>>3))&(0x80>>(x&7)))==0 && read(p, lm, x)) x++; else { now.x = x-1; x++; break; } } else { now.x = x-1; break; } } now.y = y; stack->Add(new TPoint(now)); } } } x = xl; } y = savey; y--; if (y>=0) { p = Image->Bitmap->GetScanLine(y); lm = Image->LayerMask->GetScanLine(y); m = FillMask->ScanLine(y); if (y>=0) { while (x<=xr) { if ((*(m+(x>>3))&(0x80>>(x&7))) || read(p, lm, x)==false) x++; else { while (1) { if (x<=xr) { if ((*(m+(x>>3))&(0x80>>(x&7)))==0 && read(p, lm, x)) x++; else { now.x = x-1; x++; break; } } else { now.x = x-1; break; } } now.y = y; stack->Add(new TPoint(now)); } } } } } Image->LayerMask->StopScanLine(); Image->Bitmap->StopScanLine(); delete FillMask; FillMask = NULL; delete stack; stack = NULL; while (rcList->Count>0) { lpRect = (RECT *)rcList->First(); if (!MergeRegion(hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom)) goto fail; rcList->Remove(lpRect); delete lpRect; } delete rcList; return hRgn; fail: if (FillMask) delete FillMask; if (stack) delete stack; if (hRgn) DeleteObject(hRgn); if (rcList) { while (rcList->Count>0) { lpRect = (RECT *)rcList->First(); rcList->Remove(lpRect); delete lpRect; } delete rcList; } EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return NULL; } #endif //--------------------------------------------------------------------------- // Public Method //--------------------------------------------------------------------------- void __fastcall TWindowForm::InitForm() { ParentHeight = Parent->Height+20; PointList = new TList; csSurfaceMulti->SetPalette(MainImageForm->Palette); sbShape->Down = true; sbShapeRectangle->Down = true; #if defined(TEXTILE) && !defined(CARPET) // if (MainImageForm->AutoRepeat) sbOutline->Enabled = false; //2001.7.13 lhskys Autorepeat ¿¡¼­ ÀÛ¾÷±¸¿ª ¿Ü°û¼± °¡´ÉÇϰÔ... #endif TIniFile* WinIni = new TIniFile(DirectoryItem+"\\window.ini"); Number = WinIni->ReadInteger("Window", "Number", 0); delete WinIni; InitItem(WI_SHAPE); Step = 0; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::ExitForm() { #ifndef dogtest if(MainForm->WReopenMove){ TCursor OldCursor; MainImageForm->iMainImage->SubVisible = false; if(MainImageForm->WorkArea->StatusUndo())sbUndoClick(this); else{ ResetBitmapRegion(); Step = 0; MainImageForm->iMainImage->Repaint(); } MainForm->WReopenMove = false; Screen->Cursor = OldCursor; } #endif if (Step>0) { if (Step==11) MainImageForm->TempLabel->Visible = false; ResetBitmapRegion(); Step = 0; MainImageForm->iMainImage->Repaint(); } ExitItem(); TIniFile* WinIni = new TIniFile(DirectoryItem+"\\window.ini"); WinIni->WriteInteger("Window", "Number", Number); delete WinIni; csSurfaceMulti->SaveToFile(DirectoryItem+"\\Window.Ini", "ColorSelector(Outline)"); ResetPointList(); delete PointList; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImageChange() { } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImageMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) { switch (Item) { case WI_SHAPE: RectangleMouseDown(Button, X, Y); break; case WI_IRREGULAR: IrregularMouseDown(Button, X, Y); break; case WI_OUTLINE: OutlineMouseDown(Button, Shift, X, Y); break; } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImageMouseMove(TShiftState Shift, int X, int Y) { TPItemImage *Image = MainImageForm->iMainImage; switch (Item) { case WI_SHAPE: RectangleMouseMove(X, Y); break; case WI_IRREGULAR: IrregularMouseMove(Shift, X, Y); break; case WI_OUTLINE: OutlineMouseMove(Shift, X, Y); break; } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImageMouseUp(TShiftState Shift, int X, int Y) { switch (Item) { case WI_IRREGULAR: IrregularMouseUp(Shift, X, Y); break; } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImagePaint() { isDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } //--------------------------------------------------------------------------- void __fastcall TWindowForm::tbMagicChange(TObject *Sender) { seMagic->Value = tbMagic->Position; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::bnRunClick(TObject *Sender) { if (rbSet->Checked) ResetBitmapRegion(); SetBitmapRegion(); } //--------------------------------------------------------------------------- void __fastcall TWindowForm::seMagicChange(TObject *Sender) { if (seMagic->Text.Length()>0) { tbMagic->Position = seMagic->Value; } } //--------------------------------------------------------------------------- AnsiString __fastcall TWindowForm::returnSize(int dx, int dy) { AnsiString str; if (SubItem==WSI_CIRCLE||SubItem==WSI_SQUARE) dx=dy=min(dx,dy); //by jeegeo if (MainImageForm->CurrentUnit==uInch) { str = Format("%f x %f", OPENARRAY(TVarRec, (fabs(dx)/MainImageForm->CanvasInfor.DotsPerInch, fabs(dy)/MainImageForm->CanvasInfor.DotsPerInch))); } else if (MainImageForm->CurrentUnit==uCm) { str = Format("%f x %f", OPENARRAY(TVarRec, (2.54*fabs(dx)/MainImageForm->CanvasInfor.DotsPerInch, 2.54*fabs(dy)/MainImageForm->CanvasInfor.DotsPerInch))); } else { str = Format("%d x %d", OPENARRAY(TVarRec, (abs(dx)+1, abs(dy)+1))); } return str; } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImageKeyDown(int Key)//lhskys x,yȰ¿ë ºÒ±ÔÄ¢¿¡¼­ { if (Key == 120 || Key == 88){ // 120: x 88: X down , 122 : z 90: Z down if(Item==WI_IRREGULAR){ if (PointList->Count>2)sbIrreCloseClick(this); } } else if (Key == 122 || Key == 90) { if(Item==WI_IRREGULAR){ if (cbIrreCurve->Checked==false) { First=Second; } pressZ=1; } } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::iMainImageKeyUp(int Key) //lhskys z۸¦ ´­·¶´Ù°¡ ³õ¾ÒÀ»¶§ { if (Key == 122 || Key == 90) { // 88 : x 90 : z if (Item==WI_IRREGULAR) { pressZ = 0; } } } //--------------------------------------------------------------------------- void __fastcall TWindowForm::Full() { TCursor cursor; TPItemImage *Image; pBITMAPHANDLE bh; RGNXFORM XForm; RECT rc; HRGN rgn; cursor = Screen->Cursor; Screen->Cursor = crHourGlass; ExitItem(); Image = MainImageForm->iMainImage; bh = Image->Bitmap->Handle; MainImageForm->WorkArea->PushUndo(); ResetBitmapRegion(); XForm.uViewPerspective = TOP_LEFT; XForm.nXScalarNum = 1; XForm.nXScalarDen = 1; XForm.nYScalarNum = 1; XForm.nYScalarDen = 1; XForm.nXOffset = 0; XForm.nYOffset = 0; rc.left = 0; rc.top = 0; rc.right = Image->Bitmap->Width; rc.bottom = Image->Bitmap->Height; L_SetBitmapRgnRect(bh, &XForm, &rc, L_RGN_SET); L_GetBitmapRgnHandle(bh, &XForm, &rgn); MainImageForm->WorkArea->SetMask(rgn); DeleteObject(rgn); Image->OutlineBitmapRgn(); Image->Repaint(); StatusItem(); MainImageForm->WorkAreaChange(); Screen->Cursor = cursor; PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); sbFull->Down = true; } //---------------------------------------------------------------------------