//--------------------------------------------------------------------------- #include #pragma hdrstop #include "ImageVectorizer_F.h" #include "MainImage.h" #include "MainMenu.h" #include "LogData.h" //--------------------------------------------------------------------------- // (R*G*B)/8 = (256*256*256)/8 = 2097152 ºñÆ®·Î Ä÷¯ üũ - by monkman (2009.07.30) #define RGB_COUNT 2097152 //--------------------------------------------------------------------------- #define IDS_COLORCONTROLBELOW256BUTAPPLYALL StringTable[15] //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "RzButton" #pragma link "RzEdit" #pragma link "RzTrkBar" #pragma link "RzSpnEdt" #pragma link "RzButton" #pragma link "RzRadChk" #pragma link "RzPanel" #pragma link "Selector" #pragma link "RzSpnEdt" #pragma link "RzBckgnd" #pragma resource "*.dfm" #define IDS_FORMCAPTION StringTable[0] #define IDS_LINE StringTable[1] #define IDS_SURFACE StringTable[2] #define IDS_NUMBEROFOBJECTS StringTable[3] #define IDS_RUN StringTable[4] TImageVectorizerForm *ImageVectorizerForm; //--------------------------------------------------------------------------- __fastcall TImageVectorizerForm::TImageVectorizerForm(TComponent* Owner) : TForm(Owner) { BEGIN_LOG(""); StringTable.Create(DirectoryItem, Language, "ImageVectorizer_F"); Caption = IDS_FORMCAPTION; LineRadioBtn->Caption = IDS_LINE; SurfaceRadioBtn->Caption = IDS_SURFACE; lbObjectSize->Caption = IDS_NUMBEROFOBJECTS; VectorPlayBtn->Caption = IDS_RUN; if (MainImageForm) ColorSelector->SetPalette(MainImageForm->Palette); IsDraw = false; step = 0; // 24 Bit Color¿¡¼­ ColorSelector¸¦ ÀÌ¿ëÇϱâ À§ÇÔ - by monkman (2009.07.30) FullColorPalette = NULL; RGBSet = NULL; FullColorPalette = new TPalette; RGBSet = (BYTE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, RGB_COUNT); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::cbObjectSizeClick(TObject *Sender) { BEGIN_LOG(""); lbObjectSize->Enabled = cbObjectSize->Checked; rzneObjectSize->Enabled = cbObjectSize->Checked; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::FormClose(TObject *Sender, TCloseAction &Action) { BEGIN_LOG(""); LineColorSearch->Checked = false; SurfaceColorSearch->Checked = false; if (pColorList) { for ( int cnt = 0; cnt < pColorList->Count ; cnt++){ int* color_temp = (int*)pColorList->Items[cnt]; delete color_temp; } pColorList->Clear(); delete pColorList; pColorList = NULL; } if (step>0 && MainImageForm) MainImageForm->DrawRectangleLocate(Temp); ColorSelector->SaveToFile(AppDataItem + "\\Main.ini", "VectorizerColor"); ColorSelector->Initial(); IsDraw = false; step = 0; // 24 Bit Color¿¡¼­ ColorSelector¸¦ ÀÌ¿ëÇϱâ À§ÇÔ - by monkman (2009.07.30) if (FullColorPalette) doDestroy(FullColorPalette); FullColorPalette = NULL; if (RGBSet) HeapFree(GetProcessHeap(), 0, RGBSet); RGBSet = NULL; ///////////////////////////////////////////////////////////////////// WriteIni(); PostMessage(MainMenuForm->Handle, TPM_EXITFUNCTION, 0, 0); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::ReadIni() { TIniFile *ImageVectorIni = new TIniFile(AppDataItem + "\\ImageVectorizer.ini"); if (ImageVectorIni) { LineRadioBtn->Checked = ImageVectorIni->ReadBool("ImageVectorIni", "LineChecked", true); SurfaceRadioBtn->Checked = ImageVectorIni->ReadBool("ImageVectorIni", "SurfaceChecked", false); rzneObjectSize->Value = ImageVectorIni->ReadInteger("ImageVectorIni", "rzneObjectSize", 30); delete ImageVectorIni; ImageVectorIni = NULL; } else { LineRadioBtn->Checked = false; SurfaceRadioBtn->Checked = false; } } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::WriteIni() { TIniFile *ImageVectorIni = new TIniFile(AppDataItem + "\\ImageVectorizer.ini"); if (ImageVectorIni) { ImageVectorIni->WriteBool("ImageVectorIni", "LineChecked", LineRadioBtn->Checked); ImageVectorIni->WriteBool("ImageVectorIni", "SurfaceChecked", SurfaceRadioBtn->Checked); ImageVectorIni->WriteInteger("ImageVectorIni", "rzneObjectSize", rzneObjectSize->Value); delete ImageVectorIni; } } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::LineRadioBtnClick(TObject *Sender) { BEGIN_LOG(""); PanelProtect->Visible = false; VectorPlayBtn->Top = 40; //cbObjectSize->Enabled = false; //lbObjectSize->Enabled = false; //rzneObjectSize->Enabled = false; ImageVectorizerForm->ClientHeight = 72; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::SurfaceRadioBtnClick(TObject *Sender) { BEGIN_LOG(""); PanelProtect->Visible = true; VectorPlayBtn->Top = 190; //cbObjectSize->Enabled = true; //lbObjectSize->Enabled = true; //rzneObjectSize->Enabled = true; ImageVectorizerForm->ClientHeight = 220; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::SpeedButtonProtectAllClick( TObject *Sender) { BEGIN_LOG(""); TCursor cursor; TUnionBitmap *tb, *lm; // convert by celberus Byte *bp, *mp, *lp; int x, y, ww, hh; bool undoSw; RECT rt; cursor = Screen->Cursor; Screen->Cursor = crHourGlass; if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) { MainImageForm->SearchWholeColor(ColorSelector->ChoiceColor); } else { // 24 Bit Color¿¡¼­ ColorSelector¸¦ ÀÌ¿ëÇϱâ À§ÇÔ - by monkman (2009.07.30) int nColorIndex = 0; tb = MainImageForm->iMainImage->uBitmap; lm = MainImageForm->iMainImage->LayerMask; if (RGBSet) { // ¼±Åÿµ¿ª¾ÈÀÇ ºñÆ®¸ÊÀÇ »ö»óÀ» üũ tb->StartScanLine(); if (lm) { lm->StartScanLine(); for (int y=0; yHeight; y++) { bp = tb->GetScanLine(y);//+wa->Range.left*3; if (lm) lm->StartScanLine(); for (int x=0; xWidth; x++, bp+=3) { // ÁÖÀÇ!! bp Æ÷ÀÎÅÍ Áõ°¡½ÃÅ´ if ((lp[x >> 3] & (0x80 >> (x & 7))) == 0) { nColorIndex = ((*bp & 0xFF) << 16) + ((*(bp+1) & 0xFF) << 8) + (*(bp+2) & 0xFF); RGBSet[nColorIndex >> 3] |= (0x80 >> (nColorIndex & 7)); } } } lm->StopScanLine(); } else { for (int y=0; yHeight; y++) { bp = tb->GetScanLine(y);//+wa->Range.left*3; for (int x=0; xWidth; x++, bp+=3) { // ÁÖÀÇ!! bp Æ÷ÀÎÅÍ Áõ°¡½ÃÅ´ nColorIndex = ((*bp & 0xFF) << 16) + ((*(bp+1) & 0xFF) << 8) + (*(bp+2) & 0xFF); RGBSet[nColorIndex >> 3] |= (0x80 >> (nColorIndex & 7)); } } } tb->StopScanLine(); // ¼±ÅÃµÈ »ö»óÀ» FullColorPalette¿¡ ´ã°í, csMulti¿¡ ¹Ý¿µÇÑ´Ù - by monkman (2009.07.30) FullColorSetToColorSelector(ColorSelector); } } ColorSelector->Invalid(); Screen->Cursor = cursor; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::SpeedButtonProtectNewClick( TObject *Sender) { BEGIN_LOG(""); ColorSelector->Initial(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::SpeedButtonOneClick( TObject *Sender) { if (SpeedButtonOne->Down) SpeedButtonOne->Hint = IDS_COMMON_ONECOLOR; else SpeedButtonOne->Hint = IDS_COMMON_BLOCKCOLOR; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::SpeedButtonDeleteClick( TObject *Sender) { if (SpeedButtonDelete->Down) SpeedButtonDelete->Hint = IDS_COMMON_DELETECOLOR; else SpeedButtonDelete->Hint = IDS_COMMON_INSERTCOLOR; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::SpeedButtonProtectBeforeClick( TObject *Sender) { ColorSelector->LoadFromFile(AppDataItem + "\\Main.ini", "VectorizerColor"); } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::iMainImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (LineRadioBtn->Checked) return; if (!ImageVectorizerForm->Visible) return; BEGIN_LOG(""); #if defined(TEXSTYLIST) TRect r; Byte *scan; int ix, iy; TPException ec = EC_NONE; if (Button==mbMiddle || (Shift.Contains(ssShift) && Button==mbLeft)) { if (SpeedButtonOne->Down) { if (SpeedButtonDelete->Down) { ColorSelector->DeleteColor(MainImageForm->iMainImage->uBitmap->GetPixelColor(X, Y)); } else { int jj = MainImageForm->iMainImage->uBitmap->GetPixelColor(X, Y); ColorSelector->AddColor(MainImageForm->iMainImage->uBitmap->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 (!MainImageForm->iMainImage->uBitmap->StartScanLine()) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (SpeedButtonDelete->Down) { if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) { for (Y=r.Top; YiMainImage->uBitmap->GetScanLine(Y); for (X=r.Left; XDeleteColor(*(scan+X)); } } } else {//241bit int nColorIndex = 0; if (RGBSet) { // ¼±Åÿµ¿ª¾ÈÀÇ ºñÆ®¸ÊÀÇ »ö»óÀ» üũ for (iy=r.top; iyiMainImage->uBitmap->GetScanLine(iy); for (ix=r.left*3; ix> 3] &= ~(0x80 >> (nColorIndex & 7)); } } // ¼±ÅÃµÈ »ö»óÀ» FullColorPalette¿¡ ´ã°í, csMulti¿¡ ¹Ý¿µÇÑ´Ù - by monkman (2009.07.30) FullColorSetToColorSelector(ColorSelector); } } } else { if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) { for (Y=r.Top; YiMainImage->uBitmap->GetScanLine(Y); for (X=r.Left; XAddColor(*(scan+X)); } } } else { //24bit int nColorIndex = 0, nPaletteIndex = 0; if (RGBSet) { // ¼±Åÿµ¿ª¾ÈÀÇ ºñÆ®¸ÊÀÇ »ö»óÀ» üũ for (iy=r.top; iyiMainImage->uBitmap->GetScanLine(iy); for (ix=r.left*3; ix> 3] |= (0x80 >> (nColorIndex & 7)); } } // ¼±ÅÃµÈ »ö»óÀ» FullColorPalette¿¡ ´ã°í, csMulti¿¡ ¹Ý¿µÇÑ´Ù - by monkman (2009.07.30) FullColorSetToColorSelector(ColorSelector); } } } MainImageForm->iMainImage->uBitmap->StopScanLine(); step = 0; IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } else { Temp.left = X; Temp.top = Y; Temp.bottom = Temp.top; Temp.right = Temp.left; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; step = 11; } } } END_LOG; return; fail: MainImageForm->iMainImage->uBitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); #endif END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::iMainImageMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (LineRadioBtn->Checked) return; if (!ImageVectorizerForm->Visible) return; BEGIN_LOG(""); #if defined(TEXSTYLIST) if (SpeedButtonOne->Down==false) { if (step>0) { if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); Temp.right = X; Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; } } #endif END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::iMainImagePaint() { IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::FormShow(TObject *Sender) { BEGIN_LOG(""); if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) Selected_Color = 1; // Àӽ÷Π¹è°æ°ª Á¤Çϱâ else if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 24) Selected_Color = 16777215; //ImageVectorizerForm->ClientHeight = 143; //cbObjectSize->Enabled = false; //lbObjectSize->Enabled = false; //rzneObjectSize->Enabled = false; ReadIni(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::rzneObjectSizeClick(TObject *Sender) { rzneObjectSize->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::VectorPlayBtnClick(TObject *Sender) { BEGIN_LOG(""); TCloseAction caCloseAction; if (LineRadioBtn->Checked){ if(MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8){ image_vectorizer = new ImageVectorizer8(); } else{ image_vectorizer = new ImageVectorizer24(); } image_vectorizer->PutBgdColor(Selected_Color); ImageVectorizerForm->Visible = false; //image_vectorizer->Thinning(); /* ProgressFormÀÇ Progress°¡ image_vectorizer->Thinning()¸¦ ½ÇÇà Çϸ鼭 Áõ°¡µÇ°í ProgressFormÀº Modal·Î ¶ç¿ö¾ß ´ÜÃàŰ¿Í ´Ù¸¥ ±â´ÉÀÇ »ç¿ëÀ» ¸·À» ¼ö ÀÖ´Ù. ±×·¡¼­ ¾Æ·¡¿Í °°ÀÌ Ã³¸®Çß´Ù. by david ShowModalÀ» Çϸé ProgressFormÀÇ Show()ÇÔ¼ö¿¡¼­ Message¸¦ ¸¸µé¾î ProgressFormÀÌ Visible µÈ ÈÄ¿¡ AlgorithmÀÌ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï Çß´Ù. */ if (ProgressForm) delete ProgressForm; ProgressForm = new TProgressForm((TComponent*)NULL); ProgressForm->kind = 0; //kind:0 - lind ó¸® ProgressForm->ShowModal(); delete ProgressForm; ProgressForm = NULL; } else if (SurfaceRadioBtn->Checked){ if(MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8){ image_vectorizer = new ImageVectorizer8(); } else{ image_vectorizer = new ImageVectorizer24(); } if (ColorSelector->Count > 0){ GetBgdColor(Sender); image_vectorizer->PutBgdColorList(pColorList); } ImageVectorizerForm->Visible = false; if (ProgressForm) delete ProgressForm; ProgressForm = new TProgressForm((TComponent*)NULL); ProgressForm->kind = 1; //kind:1 - surface ó¸® if(cbObjectSize->Checked) { //image_vectorizer->MakeContour(rzneObjectSize->Value); ProgressForm->min_point = rzneObjectSize->Value; } else { //image_vectorizer->MakeContour(1); ProgressForm->min_point = 1; } ProgressForm->ShowModal(); delete ProgressForm; ProgressForm = NULL; } delete image_vectorizer; image_vectorizer = NULL; caCloseAction = caFree; ImageVectorizerForm->FormClose(Sender, caCloseAction); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::GetBgdColor(TObject *Sender) { BEGIN_LOG(""); TChoiceColor* ChoiceColor = new TChoiceColor; if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) { MainImageForm->SearchWholeColor(ChoiceColor); pColorList = new TList; for ( int cnt = 0 ; cnt < ChoiceColor->Count ; cnt++ ) { if (ColorSelector->Count == 0) { int TempBgdColor = ChoiceColor->Code[cnt]; // »ç½Ç °¹¼ö°¡ Çϳªµµ ¾ø´Ù¸é ¹«ÀÇ¹Ì ÀÏ´Ü ³ªÁßÀ» À§ÇØ int* bgdColor = new int; *bgdColor = TempBgdColor; pColorList->Add(bgdColor); } else { for ( int cnt_2 = 0 ; cnt_2 < ColorSelector->Count ; cnt_2++) { if (ChoiceColor->Code[cnt] == ColorSelector->Code[cnt_2]) break; if (cnt_2 == ColorSelector->Count-1){ int TempBgdColor = ChoiceColor->Code[cnt]; int* bgdColor = new int; *bgdColor = TempBgdColor; pColorList->Add(bgdColor); } } } } } else if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 24) { pColorList = new TList; for ( int cnt = 0 ; cnt < FullColorPalette->UseColor ; cnt++ ) { if (ColorSelector->Count == 0){ int TempBgdColor = FullColorPalette->Color[cnt]; // »ç½Ç °¹¼ö°¡ Çϳªµµ ¾ø´Ù¸é ¹«ÀÇ¹Ì ÀÏ´Ü ³ªÁßÀ» À§ÇØ int* bgdColor = new int; *bgdColor = TempBgdColor; pColorList->Add(bgdColor); } else { for ( int cnt_2 = 0 ; cnt_2 < ColorSelector->Count ; cnt_2++) { if (cnt == ColorSelector->Code[cnt_2]) break; if (cnt_2 == ColorSelector->Count-1){ int TempBgdColor = FullColorPalette->Color[cnt]; int TempBgdColor2 = ((TempBgdColor << 16) & 0x00FF0000) | (TempBgdColor & 0x0000FF00) | ((TempBgdColor >> 16) & 0x000000FF); int* bgdColor = new int; *bgdColor = TempBgdColor2; pColorList->Add(bgdColor); } } } } } if (ChoiceColor) delete ChoiceColor; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TImageVectorizerForm::FullColorSetToColorSelector(TColorSelector *cs) { BEGIN_LOG(""); RGBQUAD rgb; int nColorIndex = 0, nPaletteIndex = 0; bool bOverPaletteRange = false; for (int i = 0; i < RGB_COUNT; i++) { if (RGBSet[i]) { for (int j = 0; j < 8; j++) { if (RGBSet[i] & (0x80 >> j)) { nColorIndex = i*8+j; rgb.rgbRed = nColorIndex & 0xFF; rgb.rgbGreen = (nColorIndex >> 8) & 0xFF; rgb.rgbBlue = (nColorIndex >> 16) & 0xFF; if (nPaletteIndex < 255) { FullColorPalette->SetNormal(nPaletteIndex, rgb.rgbRed, rgb.rgbGreen, rgb.rgbBlue); } else { bOverPaletteRange = true; } nPaletteIndex++; } } } } if (nPaletteIndex < 255) { FullColorPalette->UseColor = nPaletteIndex; cs->Initial(); cs->SetPalette(FullColorPalette); for (int i = 0; i < nPaletteIndex; i++) { cs->AddColor(i); } } else { FullColorPalette->UseColor = 255; cs->Initial(); cs->SetPalette(FullColorPalette); for (int i = 0; i < 255; i++) { cs->AddColor(i); } bOverPaletteRange = true; } // ColorSelector¿¡ º¸¿©Áö´Â Ä÷¯ÀÇ ÃÖ´ë °³¼ö´Â 255°³ÀÌ´Ù. // ÇÏÁö¸¸, ¼±ÅÃµÈ »ö»ó ¸ðµÎ°¡ »öº¯°æÀÌ ÀÌ·ç¾îÁø´Ù. // ¸Þ½ÃÁö : 255°³ ÀÌÇÏÀÇ Ä÷¯¸¸ µî·ÏµÇÁö¸¸ »ö ¹Ù²Ù±â´Â Àû¿ëµË´Ï´Ù. if (bOverPaletteRange) { MessageDlg(IDS_COLORCONTROLBELOW256BUTAPPLYALL, mtWarning, TMsgDlgButtons()<