//--------------------------------------------------------------------------- #include #pragma hdrstop #include "YarnRepeat_F.h" #include "common.h" #include "Exception.h" #include "TClrUtil.hpp" #include "YarnDesign_F.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "TPImage" #pragma link "TPSelectImage" #pragma link "TPSpin" #pragma link "TPLayerImage" #pragma link "Rulers" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_YARNREPEATFORM StringTable[0] #define IDS_OK StringTable[1] #define IDS_CANCEL StringTable[2] #define IDS_CHOICECOLOR StringTable[3] #define IDS_PENWIDTH StringTable[4] #define IDS_REDO StringTable[5] #define IDS_PENCOLOR StringTable[6] #define IDS_ERASER StringTable[7] #define IDS_RECT StringTable[8] #define IDS_OFF StringTable[9] #define IDS_CHANGECOLOR StringTable[10] #define IDS_PROPORTION StringTable[11] TYarnRepeatForm *YarnRepeatForm; //--------------------------------------------------------------------------- __fastcall TYarnRepeatForm::TYarnRepeatForm(TComponent* Owner) : TForm(Owner) { //=========================================================== StringTable.Create(BaseDir, Language, "YarnRepeat"); SetSmallFont(Font); Caption = IDS_YARNREPEATFORM; //Label1->Caption = IDS_COMMON_ZOOM; bbOK->Caption = IDS_OK; bbCancel->Caption = IDS_CANCEL; Label3->Caption = IDS_PENWIDTH; sbGrid->Hint = IDS_COMMON_GRID; sbWindow->Hint = IDS_COMMON_WINDOW; sbMove->Hint = IDS_COMMON_MOVE; sbCopy->Hint = IDS_COMMON_COPY; sbUndo->Hint = IDS_COMMON_UNDO; Label2->Caption = IDS_PENCOLOR; sbErase->Hint = IDS_ERASER; sbRect->Caption = IDS_RECT; sbOff->Caption = IDS_OFF; sbChangeColor->Hint = IDS_CHANGECOLOR; cbProportion->Caption = IDS_PROPORTION; //=========================================================== // qe } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::FormCreate(TObject *Sender) { TempBitmap = NULL; TempMask = NULL; Bitmap = NULL; BitmapM = NULL; if ((TempBitmap = new TTexpiaBitmap) == NULL) goto fail; if ((TempMask = new TTexpiaBitmap) == NULL) goto fail; if ((Bitmap = new TTexpiaBitmap) == NULL) goto fail; if ((BitmapM = new TTexpiaBitmap) == NULL) goto fail; if (Image->Bitmap->Create(Image->Width, Image->Height, 24) == false) goto fail; Image->Bitmap->FillRect(Rect(0, 0, Image->Width, Image->Height), clWhite); Image->Color = clWhite; YarnBitmap = Image->Bitmap; if (YarnBitmap->Create(Image->Width, Image->Height, 24) == false) goto fail; YarnBitmap->FillRect(Rect(0, 0, Image->Width, Image->Height), clWhite); Image->AddLayer("Fancy", Image->Width, Image->Height, 24, clWhite); FancyBitmap = Image->Bitmap; FancyMask = Image->LayerMask; Image->Index = 0; Image->Canvas->Brush->Color = clWhite; Image->Canvas->FillRect(Rect(0, 0, Image->Width, Image->Height)); BeforeMask = NULL; BeforeMask = new TTexpiaBitmap; BeforeMask->Create(FancyMask->Width, FancyMask->Height, 1); BeforeMask->FillRect(Rect(0, 0, FancyMask->Width, FancyMask->Height), clWhite); WorkArea = NULL; WorkArea = new TPWorkArea(&FancyBitmap); // added qe WorkArea->undoMax = 0; YarnUndo = new TSimpleUndo; YarnUndo->Set(FancyBitmap, WorkArea); return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- bool __fastcall TYarnRepeatForm::InitForm(TTexpiaBitmap *TB, TTexpiaBitmap *TBM, TTexpiaBitmap *TBB, bool dyed, double propt) { Byte *DP, *SP, *DMP, *SMP; int hx, dx, x, y; Dyed = dyed; if (Dyed){ Shape->Visible = true; shDark->Visible = false; shOriginal->Visible = false; } else { Shape->Visible = false; shDark->Visible = true; shOriginal->Visible = true; } Temp = TB; TempM = TBM; TempBack = TBB; tw = Temp->Width; th = Temp->Height; if (YarnBitmap->Create(tw, th, 24) == false) goto fail; if (FancyBitmap->Create(tw, th, 24) == false) goto fail; if (FancyMask->Create(tw, th, 1) == false) goto fail; if (BeforeMask->Create(tw, th, 1) == false) goto fail; YarnBitmap->FillRect(Rect(0, 0, tw, th), clWhite); FancyBitmap->FillRect(Rect(0, 0, tw, th), clWhite); FancyMask->FillRect(Rect(0, 0, tw, th), clWhite); BeforeMask->FillRect(Rect(0, 0, tw, th), clWhite); repeatZoom = propt; //05.11.14.shin Ruler->Zoom = propt*8; //05.11.14.shin Image->SetZoom(8, 1); ZoomText->Caption = "4"; CurrentZoom = 4; ScrollBarEnabled(); // 8 if (Image->Bitmap->Height * 8 < RepeatPanel->Height){ Image->Top = (RepeatPanel->Height - Image->Bitmap->Height * 8)/2; } else { Image->Top = 0; Image->PositionY = ScrollBarV->Position / 8; } hx = tw / 2; MakeColorGrid(); //05.11.03.shin if (FancyBitmap->StartScanLine() == false) goto fail; if (FancyMask->StartScanLine() == false) goto fail; if (Temp->StartScanLine() == false) goto fail; if (TempM->StartScanLine() == false) goto fail; for (y = 0; y < th; y++) { DP = FancyBitmap->GetScanLine(y); DMP = FancyMask->GetScanLine(y); SP = Temp->GetScanLine(y); SMP = TempM->GetScanLine(y); for (x = 0, dx = hx; x < tw; x++, DP+= 3, dx++) { if (dx == tw) dx = 0; *DP = *(SP + 3 * dx); *(DP + 1) = *(SP + 3 * dx + 1); *(DP + 2) = *(SP + 3 * dx + 2); if (SMP[dx/8] & (0x80 >> (dx%8))) { DMP[x/8] |= (0x80 >> (x%8)); } else { DMP[x/8] &= ~(0x80 >> (x%8)); } } FancyBitmap->PutScanLine(y); FancyMask->PutScanLine(y); } FancyBitmap->StopScanLine(); FancyMask->StopScanLine(); Temp->StopScanLine(); TempM->StopScanLine(); if (YarnBitmap->StartScanLine() == false) goto fail; if (TempBack->StartScanLine() == false) goto fail; for (y = 0; y < th; y++) { DP = YarnBitmap->GetScanLine(y); SP = TempBack->GetScanLine(y); for (x = 0, dx = hx; x < tw; x++, DP += 3, dx++) { if (dx == tw) dx = 0; *DP = *(SP + 3 * dx); *(DP + 1) = *(SP + 3 * dx + 1); *(DP + 2) = *(SP + 3 * dx + 2); } YarnBitmap->PutScanLine(y); } YarnBitmap->StopScanLine(); TempBack->StopScanLine(); Image->Repaint(); pencolor = clWhite; Down = false; return true; fail: YarnBitmap->StopScanLine(); FancyBitmap->StopScanLine(); Temp->StopScanLine(); TempBack->StopScanLine(); return false; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbZoomClick(TObject *Sender) { TSpeedButton *sb = (TSpeedButton *) Sender; if (sb->Tag) { CurrentZoom++; if (CurrentZoom > 4) CurrentZoom = 4; } else { CurrentZoom--; if (CurrentZoom < 1) CurrentZoom = 1; } switch (CurrentZoom) { case 1: Image->SetZoom(1, 1); ZoomText->Caption = "1"; break; case 2: Image->SetZoom(2, 1); ZoomText->Caption = "2"; break; case 3: Image->SetZoom(4, 1); ZoomText->Caption = "3"; break; case 4: Image->SetZoom(8, 1); ZoomText->Caption = "4"; break; } Ruler->Zoom = CurrentZoom*repeatZoom; //05.11.14.shin ScrollBarEnabled(); if (Image->Bitmap->Height * Image->ZoomIn < RepeatPanel->Height){ Image->Top = (RepeatPanel->Height - Image->Bitmap->Height * Image->ZoomIn / Image->ZoomOut)/2; } else { Image->Top = 0; Image->PositionY = ScrollBarV->Position / Image->ZoomIn; } Image->PositionX = ScrollBarH->Position / Image->ZoomIn; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ScrollBarEnabled() { int zw, zh; zw = Image->Bitmap->Width * Image->ZoomIn; zh = Image->Bitmap->Height * Image->ZoomIn; if (Image->Width < zw) { ScrollBarH->Enabled = true; ScrollBarH->Max = zw - Image->Width; } else { ScrollBarH->Enabled = false; } if (Image->Height < zh) { ScrollBarV->Enabled = true; ScrollBarV->Max = zh - Image->Height; ScrollBarV->Position = ScrollBarV->Max /2; } else { ScrollBarV->Enabled = false; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ScrollBarHScroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { Image->PositionX = ScrollBarH->Position / Image->ZoomIn; Ruler->Start = ScrollBarH->Position / (Image->ZoomIn*repeatZoom); //05.11.14.shin if (WorkArea->Mask) WorkAreaDraw(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ScrollBarVScroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { Image->PositionY = ScrollBarV->Position / Image->ZoomIn; if (WorkArea->Mask) WorkAreaDraw(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbGridClick(TObject *Sender) { Image->Grid = sbGrid->Down; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int pw, bx, by; bx = X/Image->ZoomIn+Image->PositionX; by = Y/Image->ZoomIn+Image->PositionY; if (bx < 0 || bx > Image->Bitmap->Width || by < 0 || by > Image->Bitmap->Height) return; switch (menuitem) { case YOff: if (Button == mbMiddle || (Shift.Contains(ssShift) && Button==mbLeft)) { if (Dyed){ COLORREF c = FancyBitmap->GetPixelColor(bx, by); RGBQUAD q; TColor2RGB(TColor(c), q.rgbRed, q.rgbGreen, q.rgbBlue); pencolor = RGBToColor24(q); Shape->Brush->Color = TColor(c); /* for (int i = 0; i < 3; i++){ for (int j = 0; j < 3; j++){ if (bx+i-1 >= 0 && bx+i-1 <= FancyBitmap->Width-1 && by-1+j-1 >= 0 && by-1+j-1 <= FancyBitmap->Height-1) if (FancyBitmap->GetPixelColor(bx+i-1, by-1+j-1-1) != clWhite) nearc[i+j*3] = FancyBitmap->GetPixelColor(bx+i-1, by-1+j-1-1); else nearc[i+j*3] = c; else nearc[i+j*3] = c; } } */ } /*else { //05.11.09.shin ¸·À½. »ç¿ëÇÒ ¼ö ÀÖ´Â »öµé ¹Ì¸® µé¾î°¡ÀÖµµ·Ï ¼öÁ¤. COLORREF c = YarnBitmap->GetPixelColor(bx, by); RGBQUAD q; TColor2RGB(TColor(c), q.rgbRed, q.rgbGreen, q.rgbBlue); if ((q.rgbRed == 0xFF) && (q.rgbGreen == 0xFF) && (q.rgbBlue == 0xFF)) break; SetPenColor(q); } */ } else if (Button == mbLeft) { Down = true; pw = spPenWidth->Value; if (pw == 1) { ls = 0; rs = 1; } else { ls = pw / 2.0; rs = pw - ls; } YarnUndo->Save(Rect(0, 0, FancyBitmap->Width, FancyBitmap->Height)); UndoMask(false); BeforeX = X; BeforeY = Y; DrawLine(X, Y); } return; fail: Down = false; EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); break; case YWin: if (Button == mbLeft) WindowMouseDown(X, Y); break; case YMove: case YCopy: if (cbProportion->Checked && step == 1){ ProportionEnd(); } else { MoveCopyMouseDown(X, Y); } break; case YChangeColor: //05.11.04.shin COLORREF c; RGBQUAD q; TColor brushcolor; if (Button == mbMiddle){ c = YarnBitmap->GetPixelColor(bx, by); TColor2RGB(TColor(c), q.rgbRed, q.rgbGreen, q.rgbBlue); if (((int)q.rgbRed == 255) && ((int)q.rgbGreen == 255) && ((int)q.rgbBlue == 255)){ break; } q = FindColor(q); brushcolor = RGB2TColor(q.rgbRed, q.rgbGreen, q.rgbBlue); } else { c = FancyBitmap->GetPixelColor(bx, by); TColor2RGB(TColor(c), q.rgbRed, q.rgbGreen, q.rgbBlue); if (((int)q.rgbRed == 255) && ((int)q.rgbGreen == 255) && ((int)q.rgbBlue == 255)){ break; } brushcolor = TColor(c); } if (changecolorstep == 0){ SrcColor.rgbRed = q.rgbRed; SrcColor.rgbGreen = q.rgbGreen; SrcColor.rgbBlue = q.rgbBlue; SrcColor.rgbReserved = q.rgbReserved; shSrc->Brush->Color = brushcolor; changecolorstep = 1; } else { DstColor.rgbRed = q.rgbRed; DstColor.rgbGreen = q.rgbGreen; DstColor.rgbBlue = q.rgbBlue; DstColor.rgbReserved = q.rgbReserved; shDst->Brush->Color = brushcolor; RunChangeColor(); changecolorstep = 0; } break; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ImageMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { switch(menuitem){ case YOff: if (Down){ DrawLine(X, Y); Image->Repaint(); } break; case YWin: WindowMouseMove(X, Y); break; case YMove: case YCopy: if (cbProportion->Checked && step == 1){ //05.11.03.shin ProportionMouseMove(X, Y); } else { MoveCopyMouseMove(X, Y); } //MoveCopyMouseMove(X, Y); if (WorkArea->Mask) WorkAreaDraw(); break; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ImageMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (Down) { Image->Repaint(); Down = false; BeforeX = -1; if (WorkArea->Mask) WorkAreaDraw(); } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::bbOKClick(TObject *Sender) { Byte *DP, *SP; int y; if(menuitem == TMove || menuitem == TCopy){ //qe FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); Image->Repaint(); } Temp->Copy(FancyBitmap, SRCCOPY); TempM->Copy(FancyMask, SRCCOPY); // TempBack->Copy(YarnBitmap, SRCCOPY); //05.11.15.shin ½ÇºÎºÐµµ ¹Ýº¹ return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::DrawDot(int X, int Y) { Byte *DP, *DMP, r, g, b; int sx, ex, sy, ey, i, j; X = X/Image->ZoomIn + Image->PositionX; Y = Y/Image->ZoomIn + Image->PositionY; sx = X - ls; ex = X + rs; sy = Y - ls; ey = Y + rs; if (sx < 0) sx = 0; if (ex > FancyBitmap->Width) ex = FancyBitmap->Width; if (sy < 0) sy = 0; if (ey > FancyBitmap->Height) ey = FancyBitmap->Height; FancyBitmap->StartScanLine(); FancyMask->StartScanLine(); for (i = sy; i < ey; i++) { DP = (Byte *)FancyBitmap->GetScanLine(i); DMP = (Byte *)FancyMask->GetScanLine(i); for ( j = sx * 3; j < ex * 3; j += 3) { if (Dyed) { if (pencolor == clWhite){ r = 255; g = 255; b = 255; } else { int i = 0 , mapping[9]; mapping[0] = 0; mapping[1] = 1; mapping[2] = 2; mapping[3] = 5; mapping[4] = 8; mapping[5] = 7; mapping[6] = 6; mapping[7] = 3; mapping[8] = 4; TColor2RGB(TColor(nearc[mapping[((i++) + rand()%2)%9 ]]), r, g, b); i++; if (i == 9) i = 0; } *(DP + j + 2) = r; *(DP + j + 1) = g; *(DP + j) = b; } else { r = GetRValue(pencolor); g = GetGValue(pencolor); b = GetBValue(pencolor); *(DP + j) = r; *(DP + j + 1) = g; *(DP + j + 2) = b; } if (r == 255 && g == 255 && b == 255) { DMP[j/24] |= (0x80 >> ((j/3)%8)); } else { DMP[j/24] &= ~(0x80 >> ((j/3)%8)); } } FancyBitmap->PutScanLine(i); FancyMask->PutScanLine(i); } FancyBitmap->StopScanLine(); FancyMask->StopScanLine(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::DrawLine(int X, int Y){ int start_x, start_y, dx, dy, dx2, dy2, x_inc, y_inc, error, i; if (Down){ if (BeforeX == -1) return; start_x = BeforeX; start_y = BeforeY; dx = X - BeforeX; dy = Y - BeforeY; if(dx >= 0) x_inc = 1; else { x_inc = -1; dx = -dx; } if(dy>=0) y_inc = 1; else { y_inc = -1; dy = -dy; } dx2 = dx << 1; dy2 = dy << 1; if (dx > dy){ error = dy2 - dx; for (i = 0; i <= dx; i++){ DrawDot(start_x, start_y); if (error >= 0){ error -= dx2; start_y += y_inc; } error += dy2; start_x += x_inc; } } else { error = dx2 - dy; for(i = 0; i <= dy; i++){ DrawDot(start_x, start_y); if(error >= 0){ error -= dy2; start_x += x_inc; } error += dx2; start_y += y_inc; } } BeforeX = X; BeforeY = Y; } } //-------------------------------------------------------from this to end ..added by qe void __fastcall TYarnRepeatForm::sbWindowClick(TObject *Sender) { if(menuitem == YMove || menuitem == YCopy) ResetMoveCopyMode(); if(sbWindow->Down){ sbChangeColorExitClick(this); //05.11.04.shin sbMoveCopyExitClick(this); //05.11.04.shin menuitem = YWin; InitWin(); WinPanel->Visible = true; WinPanel->BringToFront(); WinPanel->Left = gbMenu->Left; //05.11.03.shin WinPanel->Top = gbMenu->Top + gbMenu->Height; sbRect->Down =true; }else{ sbWinExitClick(this); } } //-------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbMoveCopyClick(TObject *Sender) { bool tp = false, bt = false, tpm = false, btm = false; TSpeedButton *sp = (TSpeedButton *) Sender; if(menuitem == TMove || menuitem == TCopy){ FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); Image->Repaint(); } // if(menuitem == YMove || menuitem == YCopy) ResetMoveCopyMode(); if(sp->Down){ sbWinExitClick(this); sbChangeColorExitClick(this); //05.11.04.shin if(sp == sbMove){ menuitem = YMove; if (sbMove->Down) ShapeMove->Brush->Color = clBlue; ShapeCopy->Brush->Color = clNavy; } else if (sp == sbCopy) { menuitem = YCopy; ShapeCopy->Brush->Color = clBlue; ShapeMove->Brush->Color = clNavy; } pnMoveCopy->Visible = true; //05.11.03.shin pnMoveCopy->BringToFront(); pnMoveCopy->Left = gbMenu->Left; pnMoveCopy->Top = gbMenu->Top + gbMenu->Height; RECT rc = WorkArea->Range; tp = TempBitmap->Create(rc.right - rc.left, rc.bottom - rc.top, 24); tpm = TempMask->Create(rc.right - rc.left, rc.bottom - rc.top, 1); if (tpm == false) goto fail; if (tp == false) goto fail; TempBitmap->CopyFromRect(FancyBitmap, rc.left, rc.top, SRCCOPY); TempMask->CopyFromRect(FancyMask, rc.left, rc.top, SRCCOPY); bt = Bitmap->Create(FancyBitmap->Width, FancyBitmap->Height, 24); btm = BitmapM->Create(FancyMask->Width, FancyMask->Height, 1); if (bt == false) goto fail; if (btm == false) goto fail; Bitmap->Copy(FancyBitmap, SRCCOPY); BitmapM->Copy(FancyMask, SRCCOPY); } else { menuitem = YOff; ShapeMove->Brush->Color = clNavy; ShapeCopy->Brush->Color = clNavy; pnMoveCopy->Visible = false; //05.11.03.shin } if (WorkArea->Mask) WorkAreaDraw(); step = 1; return; fail: if (bt) Bitmap->Destroy(); if (btm) BitmapM->Destroy(); if (tp) TempBitmap->Destroy(); if (tpm) TempMask->Destroy(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ResetMoveCopyMode() { FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); Image->Repaint(); sbCopy->Down = false; sbMove->Down = false; menuitem = YOff; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::InitWin() { /*WinPanel->BringToFront(); sbRect->Down =true; */ } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::Timer1Timer(TObject *Sender) { Image->OutlineBitmapRgn(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbWinExitClick(TObject *Sender) { sbWindow->Down = false; menuitem = YOff; WinStep = 0; WinPanel->Visible = false; Image->Repaint(); if (WorkArea->Mask) WorkAreaDraw(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::WindowMouseDown(int X, int Y) //added by qe { X = X/Image->ZoomIn + Image->PositionX; Y = (Y)/Image->ZoomIn + Image->PositionY; if (WinStep == 0) { WorkArea->ResetRegion(Image); First = Point(X, Y); First.y = First.y + 1; IsDraw = false; WinStep = 1; } else { if (IsDraw) { WorkAreaDraw(); IsDraw = false; } Second = Point(X, Y); First.y = First.y - 1; //Second.y = Second.y -1; WorkArea->SetShapeRegion(FancyBitmap, First, Second); StatusItem(1); WinStep = 0; } } //---------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::WindowMouseMove(int X, int Y) { X = X/Image->ZoomIn + Image->PositionX; Y = (Y)/Image->ZoomIn + Image->PositionY; if (WinStep > 0) { Image->Repaint(); Second = Point(X, Y); Second.y = Second.y + 1; WorkAreaDraw(); IsDraw = true; } } //---------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::MoveCopyMouseDown(int X, int Y) { int dx, dy, x, y; RECT rc = WorkArea->Range; Byte *DP, *DMP; X = X/Image->ZoomIn + Image->PositionX; Y = Y/Image->ZoomIn + Image->PositionY; FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); YarnUndo->Save(Rect(0, 0, FancyBitmap->Width, FancyBitmap->Height)); UndoMask(false); if (menuitem == YMove) { FancyBitmap->FillRect(rc, clWhite); FancyMask->FillRect(rc, clWhite); } dx = X - TempBitmap->Width / 2; dy = Y - TempBitmap->Height / 2; if (dx < 0) dx = 0; if (dx + TempBitmap->Width > FancyBitmap->Width) dx = FancyBitmap->Width - TempBitmap->Width; if (dy < 0) dy = 0; if (dy + TempBitmap->Height > FancyBitmap->Height) dy = FancyBitmap->Height - TempBitmap->Height; //FancyBitmap->CopyToRect(dx, dy, TempBitmap, SRCCOPY); //FancyMask->CopyToRect(dx, dy, TempMask, SRCCOPY); PasteCopyData(dx, dy); //05.11.03.shin if (menuitem == YMove) { sbMove->Down = false; menuitem = YOff; pnMoveCopy->Visible = false; //05.11.09.shin step = 0; ShapeMove->Brush->Color = clNavy; WorkArea->ResetRegion(Image); WorkArea->SetShapeRegion(FancyBitmap, Point(dx, dy), Point(dx+TempBitmap->Width - 1, dy+TempBitmap->Height - 1)); First = Point(dx, dy); Second = Point(dx+TempBitmap->Width - 1, dy+TempBitmap->Height - 1); } else { Bitmap->Copy(FancyBitmap, SRCCOPY); BitmapM->Copy(FancyMask, SRCCOPY); } Image->Repaint(); WorkAreaDraw(); return; fail: FancyBitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::MoveCopyMouseMove(int X, int Y) { int dx, dy; X = X/Image->ZoomIn + Image->PositionX; Y = Y/Image->ZoomIn + Image->PositionY; FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); dx = X - TempBitmap->Width / 2; dy = Y - TempBitmap->Height / 2; if (dx < 0) dx = 0; if (dx + TempBitmap->Width > FancyBitmap->Width) dx = FancyBitmap->Width - TempBitmap->Width; if (dy < 0) dy = 0; if (dy + TempBitmap->Height > FancyBitmap->Height) dy = FancyBitmap->Height - TempBitmap->Height; //FancyBitmap->CopyToRect(dx, dy, TempBitmap,SRCCOPY); //FancyMask->CopyToRect(dx, dy, TempMask, SRCCOPY); PasteCopyData(dx, dy); //05.11.03.shin Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ProportionMouseMove(int X, int Y) //05.11.03.shin { int tWidth = 0, tHeight = 0; int nx = X/Image->ZoomIn + Image->PositionX;; int ny = Y/Image->ZoomIn + Image->PositionY;; FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); if (First.x - nx > 0){ tWidth = First.x - nx; } else { tWidth = nx - First.x; } if (First.y - ny > 0){ tHeight = First.y - ny; } else { tHeight = ny - First.y; } if (tWidth + First.x > FancyBitmap->Width) tWidth = FancyBitmap->Width - First.x - 1; if (tHeight + First.y > FancyBitmap->Height) tHeight = FancyBitmap->Height - First.y - 1; if (!ProportionTempBitmap){ ProportionTempBitmap = new TTexpiaBitmap; ProportionTempMask = new TTexpiaBitmap; ProportionTempBitmap->Create(TempBitmap->Width, TempBitmap->Height, 24); ProportionTempMask->Create(TempMask->Width, TempMask->Height, 1); ProportionTempBitmap->Copy(TempBitmap, SRCCOPY); ProportionTempMask->Copy(TempMask, SRCCOPY); } TempBitmap->Resize(ProportionTempBitmap->Width, ProportionTempBitmap->Height); TempMask->Resize(ProportionTempMask->Width, ProportionTempMask->Height); TempBitmap->Copy(ProportionTempBitmap, SRCCOPY); TempMask->Copy(ProportionTempMask, SRCCOPY); TempBitmap->ResizeStretch(tWidth, tHeight); TempMask->ResizeStretch(tWidth, tHeight); PasteCopyData(First.x, First.y); Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ProportionEnd() //05.11.04.shin { if (cbProportion->Checked) cbProportion->Checked = false; //step = 0; if (ProportionTempBitmap){ delete ProportionTempBitmap; ProportionTempBitmap = NULL; } if (ProportionTempMask){ delete ProportionTempMask; ProportionTempMask = NULL; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::PasteCopyData(int dx, int dy) //05.11.03.shin { int dstY = dy, dstX = dx; Byte *Dst, *Src; FancyBitmap->StartScanLine(); TempBitmap->StartScanLine(); for (int y = 0; y < TempBitmap->Height; y++){ Dst = FancyBitmap->GetScanLine(dstY); Src = TempBitmap->GetScanLine(y); for (int x = 0; x < TempBitmap->Width; x++, Src+=3, Dst += 3){ if ((*Src != 255) && (*(Src + 1)!= 255) && (*(Src + 2) != 255)){ *(Dst + 3*dx) = *Src; *(Dst + 3*dx + 1) = *(Src + 1); *(Dst + 3*dx + 2) = *(Src + 2); } } FancyBitmap->PutScanLine(dstY); dstY++; } FancyBitmap->StopScanLine(); TempBitmap->StopScanLine(); FancyMask->CopyToRect(dx, dy, TempMask, SRCAND); // ¸¶½ºÅ©´Â AND } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::WorkAreaDraw() { HDC hDC = NULL; HBRUSH hOldBrush; HPEN hOldPen, hPen = NULL; int nDrawMode, fx, fy, sx, sy; COLORREF clOldBk; hDC=Image->Canvas->Handle; clOldBk = SetBkColor(hDC, clWhite); hPen = CreatePen(PS_DOT, 1, clBlack); hOldPen = SelectObject(hDC, hPen); hOldBrush = SelectObject(hDC, GetStockObject(NULL_BRUSH)); fx = (First.x -Image->PositionX)*Image->ZoomIn; fy = (First.y - Image->PositionY)*Image->ZoomIn; sx = (Second.x -Image->PositionX)*Image->ZoomIn; sy = (Second.y - Image->PositionY )*Image->ZoomIn; Rectangle(hDC,min(fx, sx), min(fy, sy)-Image->ZoomIn, max(fx,sx)+Image->ZoomIn, max(fy, sy)); SetBkColor(hDC, clOldBk); SelectObject(hDC, hOldPen); DeleteObject(hPen); SelectObject(hDC, hOldBrush); return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::StatusItem(int i) { sbMove->Enabled = i; sbCopy->Enabled = i; sbOff->Enabled = i; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbOffClick(TObject *Sender) { WorkArea->ResetRegion(Image); ShapeWindow->Brush->Color = clNavy; ShapeMove->Brush->Color = clNavy; ShapeCopy->Brush->Color = clNavy; Image->Repaint(); StatusItem(0); sbWinExitClick(this); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbUndoClick(TObject *Sender) { if(menuitem == YCopy || menuitem == YMove) ResetMoveCopyMode(); if (sbUndo->Tag) { sbUndo->Hint = IDS_REDO; sbUndo->Tag = 0; } else { sbUndo->Hint = IDS_COMMON_UNDO; sbUndo->Tag = 1; } YarnUndo->Read(Rect(0, 0, FancyBitmap->Width, FancyBitmap->Height)); UndoMask(true); Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::FormClose(TObject *Sender, TCloseAction &Action) { if (WorkArea) delete WorkArea; if (YarnUndo) delete YarnUndo; if (TempBitmap) delete TempBitmap; if (TempMask) delete TempMask; if (Bitmap) delete Bitmap; if (BitmapM) delete BitmapM; if (BeforeMask) delete BeforeMask; ClearColorGrid(); //05.11.09.shin } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::UndoMask(bool undo) // true -> undo, false -> save { HDC dcMask, dcBeforeMask, dcTemp; dcMask = FancyMask->CreateDC(); dcBeforeMask = BeforeMask->CreateDC(); if (dcMask == NULL) goto fail; if (dcBeforeMask == NULL) goto fail; if (undo) { TempBefore = new TTexpiaBitmap; TempBefore->Create(FancyMask->Width, FancyMask->Height, 1); TempBefore->FillRect(Rect(0, 0, FancyMask->Width, FancyMask->Height), clWhite); dcTemp = TempBefore->CreateDC(); if (dcTemp == NULL) goto fail; BitBlt(dcTemp, 0, 0, FancyMask->Width, FancyMask->Height, dcMask, 0, 0, SRCCOPY); BitBlt(dcMask, 0, 0, FancyMask->Width, FancyMask->Height, dcBeforeMask, 0, 0, SRCCOPY); BitBlt(dcBeforeMask, 0, 0, FancyMask->Width, FancyMask->Height, dcTemp, 0, 0, SRCCOPY); TempBefore->DeleteDC(dcTemp); delete TempBefore; } else BitBlt(dcBeforeMask, 0, 0, FancyMask->Width, FancyMask->Height, dcMask, 0, 0, SRCCOPY); FancyMask->DeleteDC(dcMask); BeforeMask->DeleteDC(dcBeforeMask); return; fail: FancyMask->DeleteDC(dcMask); BeforeMask->DeleteDC(dcBeforeMask); if (TempBefore) TempBefore->DeleteDC(dcTemp); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- RGBQUAD __fastcall TYarnRepeatForm::FindColor(RGBQUAD src) { Byte sr, sg, sb, fr, fg, fb; double sh, sl, ss, fh, fl, fs; TColor color; RGBQUAD dst; sr = src.rgbRed; sg = src.rgbGreen; sb = src.rgbBlue; if (sr == 0 && sg == 0 && sb == 0){ src.rgbBlue = 0x01; src.rgbGreen = 0x01; src.rgbRed = 0x01; src.rgbReserved = 0x00; } RGB2HLS(sr, sg, sb, sh, sl, ss); for (int j = 0; j < yColors; j++){ RGB2HLS(yColor[j].rgbRed, yColor[j].rgbGreen, yColor[j].rgbBlue, fh, fl, fs); if (IsRange(1, fh, sh) && IsRange(2, fs*100 , ss*100) && IsRange(50, fl*100, sl*100)){ //Shape->Brush->Color = RGB2TColor(yColor[j].rgbRed, yColor[j].rgbGreen, yColor[j].rgbBlue); //pencolor = RGBToColor24(yColor[j]); dst = yColor[j]; dst.rgbReserved = 0x00; } } return dst; } //---------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbEraseClick(TObject *Sender) { if (sbErase->Down){ oldpencolor = pencolor; pencolor = clWhite; ShapeErase->Brush->Color = clBlue; } else { if (pencolor == clWhite) pencolor = oldpencolor; ShapeErase->Brush->Color = clNavy; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::FormResize(TObject *Sender) //05.11.03.shin { if (ClientWidth < 700) ClientWidth = 700; if (ClientHeight < 600) ClientHeight = 600; if (Image->Bitmap->Height * Image->ZoomIn < RepeatPanel->Height){ Image->Top = (RepeatPanel->Height - Image->Bitmap->Height * Image->ZoomIn / Image->ZoomOut)/2; } else { Image->Top = 0; Image->PositionY = ScrollBarV->Position / Image->ZoomIn; } int top = 20; bbOK->Left = ClientWidth - 200; bbOK->Top = 198; bbCancel->Left = bbOK->Left + bbOK->Width; bbCancel->Top = 198; gbZoom->Left = ClientWidth - 200; gbZoom->Top = top; gbPen->Left = 250; gbPen->Top = top; gbMenu->Left = 35; gbMenu->Top = top; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbMoveCopyExitClick(TObject *Sender) //05.11.03.shin { if(menuitem == TMove || menuitem == TCopy){ FancyBitmap->Copy(Bitmap, SRCCOPY); FancyMask->Copy(BitmapM, SRCCOPY); Image->Repaint(); } menuitem = YOff; ShapeMove->Brush->Color = clNavy; ShapeCopy->Brush->Color = clNavy; pnMoveCopy->Visible = false; step = 0; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::MakeColorGrid() //05.11.03.shin { GColors = new TList; GColors->Capacity = yColors; /* cgrid = new TShape(this); cgrid->Parent = sbColorBox; cgrid->Left = yColors < 10 ? 5 : 7; cgrid->Top = 5; cgrid->Width = 23; cgrid->Height = 17; cgrid->Pen->Color = clBlack; cgrid->Pen->Width = 1; cgrid->Brush->Color = clWhite; cgrid->Visible = true; cgrid->OnMouseDown = colorgrid->OnMouseDown; GColors->Add(cgrid); // Áö¿ì±â¿ëÀ¸·Î Èò»ö. rgb(255,255,255) */ for (int i = 0; i < yColors; i++) { cgrid = new TShape(this); cgrid->Parent = sbColorBox; if (yColors < 10){ cgrid->Left = (i%5)*(25+5) + 15; cgrid->Top = (i/5)*(18+7) + 10; } else { cgrid->Left = (i%5)*(25+5) + 10; cgrid->Top = (i/5)*(18+9) + 12; } cgrid->Width = 25; cgrid->Height = 18; cgrid->Pen->Color = clBlack; cgrid->Pen->Width = 1; cgrid->Brush->Color = RGB2TColor(yColor[i].rgbRed, yColor[i].rgbGreen, yColor[i].rgbBlue); cgrid->Visible = true; cgrid->OnMouseDown = colorgrid->OnMouseDown; GColors->Add(cgrid); } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ClearColorGrid() //05.11.03.shin { if (GColors){ for (int i = GColors->Count; i > 0; i--){ cgrid = (TShape *)GColors->Items[i-1]; GColors->Remove(cgrid); delete cgrid; cgrid = NULL; } delete GColors; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::colorgridMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) //05.11.07.shin { RGBQUAD q; int index; // for (int i = 0; i < GColors->Count; i++) // { // cgrid = (TShape *)GColors->Items[i]; //cgrid->Pen->Width = 1; // } index = GColors->IndexOf(Sender); cgrid = (TShape *)GColors->Items[index]; pencolor = cgrid->Brush->Color; //05.11.09.shin ¼öÁ¤ TColor2RGB(TColor(pencolor), q.rgbRed, q.rgbGreen, q.rgbBlue); pencolor = RGBToColor24(q); shOriginal->Brush->Color = cgrid->Brush->Color; double sh = 0, sl = 0, ss = 0; Byte bR, bG, bB; RGBQUAD rgbDark; RGB2HLS(q.rgbRed, q.rgbGreen, q.rgbBlue, sh, sl, ss); sl -= 0.1; if (sl < 0) sl = 0; HLS2RGB(sh, sl, ss, bR, bG, bB); rgbDark.rgbRed = bR; rgbDark.rgbGreen = bG; rgbDark.rgbBlue = bB; rgbDark.rgbReserved = 0x00; shDark->Brush->Color = RGB2TColor(rgbDark.rgbRed, rgbDark.rgbGreen, rgbDark.rgbBlue); shOriginal->Pen->Width = 2; shDark->Pen->Width = 1; /* pencolor = cgrid->Brush->Color; TColor2RGB(TColor(pencolor), q.rgbRed, q.rgbGreen, q.rgbBlue); pencolor = RGBToColor24(q); Shape->Brush->Color = cgrid->Brush->Color; */ } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbLRMirrorClick(TObject *Sender) //05.11.09.shin { TempBitmap->Reverse(); TempMask->Reverse(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbTBMirrorClick(TObject *Sender) //05.11.09.shin { TempBitmap->Flip(); TempMask->Flip(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbTBLRMirrorClick(TObject *Sender) //05.11.09.shin { TempBitmap->Reverse(); TempMask->Reverse(); TempBitmap->Flip(); TempMask->Flip(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbChangeColorClick(TObject *Sender) //05.11.04.shin { sbWinExitClick(this); sbMoveCopyExitClick(this); changecolorstep = 0; if (sbChangeColor->Down){ pnChangeColor->Left = gbMenu->Left; pnChangeColor->Top = gbMenu->Top + gbMenu->Height; pnChangeColor->Visible = true; pnChangeColor->BringToFront(); menuitem = YChangeColor; } else { pnChangeColor->Visible = false; menuitem = YOff; } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbChangeColorExitClick(TObject *Sender) //05.11.04.shin { sbChangeColor->Down = false; pnChangeColor->Visible = false; menuitem = YOff; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::shSrcMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) //05.11.04.shin { if (DstSelected){ shDst->Pen->Width = 1; DstSelected = false; } shSrc->Pen->Width = 2; SrcSelected = true; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::shDstMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) //05.11.04.shin { if (SrcSelected){ shSrc->Pen->Width = 1; SrcSelected = false; } shDst->Pen->Width = 2; DstSelected = true; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbRunClick(TObject *Sender) //05.11.04.shin { YarnUndo->Save(Rect(0, 0, FancyBitmap->Width, FancyBitmap->Height)); UndoMask(false); if (WorkArea->Mask){ RECT rc = WorkArea->Range; ChangeColor(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); } else { ChangeColor(0, 0, FancyBitmap->Width, FancyBitmap->Height); } Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::RunChangeColor() //05.11.09.shin { YarnUndo->Save(Rect(0, 0, FancyBitmap->Width, FancyBitmap->Height)); UndoMask(false); if (WorkArea->Mask){ RECT rc = WorkArea->Range; ChangeColor(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); } else { ChangeColor(0, 0, FancyBitmap->Width, FancyBitmap->Height); } Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::ChangeColor(int startX, int startY, int Width, int Height) //05.11.04.shin { Byte *DS; if (FancyBitmap->StartScanLine()){ for (int y = startY; y < startY + Height; y++){ DS = FancyBitmap->GetScanLine(y); for (int x = startX; x < startX + Width; x++, DS += 3){ if (((int)*(DS + 2 + startX*3) == SrcColor.rgbRed) && ((int)*(DS + 1 + startX*3) == SrcColor.rgbGreen) && ((int)*(DS + startX*3) == SrcColor.rgbBlue)){ *(DS + 2 + startX*3) = DstColor.rgbRed; *(DS + 1 + startX*3) = DstColor.rgbGreen; *(DS + startX*3) = DstColor.rgbBlue; } } FancyBitmap->PutScanLine(y); } FancyBitmap->StopScanLine(); } } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::shDarkMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { RGBQUAD q; TColor2RGB(shDark->Brush->Color, q.rgbRed, q.rgbGreen, q.rgbBlue); pencolor = RGBToColor24(q); shDark->Pen->Width = 2; shOriginal->Pen->Width = 1; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::shOriginalMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { RGBQUAD q; TColor2RGB(shOriginal->Brush->Color, q.rgbRed, q.rgbGreen, q.rgbBlue); pencolor = RGBToColor24(q); shDark->Pen->Width = 1; shOriginal->Pen->Width = 2; } //--------------------------------------------------------------------------- void __fastcall TYarnRepeatForm::sbNormalCopyClick(TObject *Sender) //05.11.09.shin { RECT rc = WorkArea->Range; int tempW, tempH; tempW = TempBitmap->Width; tempH = TempBitmap->Height; TempBitmap->Resize(rc.right - rc.left, rc.bottom - rc.top); TempMask->Resize(rc.right - rc.left, rc.bottom - rc.top); TempBitmap->CopyFromRect(FancyBitmap, rc.left, rc.top, SRCCOPY); TempMask->CopyFromRect(FancyMask, rc.left, rc.top, SRCCOPY); TempBitmap->ResizeStretch(tempW, tempH); TempMask->ResizeStretch(tempW, tempH); } //---------------------------------------------------------------------------