#include #include #pragma hdrstop #include "define.h"//gabriel #include "YarnArrange_F.h" //#include "MainImage.h" #include "Palette.h" //#include "YarnAccount_F.h" //#include "YarnTable_F.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PColorGrid" #pragma link "PHLS" #pragma link "RXSpin" #pragma link "PCMY" #pragma link "TPSpin" #pragma link "RzEdit" #pragma link "RzSpnEdt" #pragma link "RzPanel" #pragma link "RzButton" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IM_YARNS 0 #define IM_LENGTH 1 #define IDS_YARNARRANGE StringTable[0] #define IDS_YARNDYE StringTable[1] #define IDS_TABLEVIEW StringTable[2] #define IDS_WARP StringTable[3] #define IDS_WEFT StringTable[4] #define IDS_YARNS StringTable[5] #define IDS_ACCOUNT StringTable[6] #define IDS_INSERT StringTable[7] #define IDS_DENSITY StringTable[8] #define IDS_ASWARP StringTable[9] #define IDS_TOTAL StringTable[10] #define IDS_CODE StringTable[11] #define IDS_NEW StringTable[12] #define IDS_MESSAGE StringTable[13] #define IDS_CHANGE StringTable[14] #define IDS_MESSAGE_CHANGE StringTable[15] TYarnArrangeForm *YarnArrangeForm;//YarnColorChange Form //--------------------------------------------------------------------------- __fastcall TYarnArrangeForm::TYarnArrangeForm(TComponent* Owner, LPVOID image, int size) : TForm(Owner) { //===================================================== /* StringTable.Create(DirectoryItem, Language, "YarnArrange"); SetSmallFont(Font); SetSmallFont(StaticText1->Font); SetSmallFont(StaticText2->Font); SetSmallFont(rbYarns->Font); SetSmallFont(rbLength->Font); Caption = IDS_YARNARRANGE; StatusBar->Panels->Items[0]->Text = IDS_TOTAL; */ //===================================================== RzPanel3->Visible = false; PHLS_index = 1; is_HLS = true; RECT rect = {0,0,size/YARNIMAGEHEIGHT/3,YARNIMAGEHEIGHT}; copiedbitmap = new TTexpiaBitmap; copiedbitmap->Create(size/YARNIMAGEHEIGHT/3,YARNIMAGEHEIGHT,24); copiedbitmap->LoadFromMemory((BYTE*)image, size/YARNIMAGEHEIGHT, rect); originalbitmap = new TTexpiaBitmap; originalbitmap->Create(size/YARNIMAGEHEIGHT/3,YARNIMAGEHEIGHT,24); originalbitmap->LoadFromMemory((BYTE*)image, size/YARNIMAGEHEIGHT, rect); InitSetHLS(); HDC tDC; tDC = originalbitmap->CreateDC(); BitBlt(Image2->Canvas->Handle, 0, 0, originalbitmap->Width, originalbitmap->Height ,tDC , 0, 0, SRCCOPY); originalbitmap->DeleteDC(tDC); TRect TheRect = Rect(0,0,Image2->Width ,Image2->Height); Image2->Canvas->Brush->Color = clBlack; Image2->Canvas->FrameRect(TheRect); Image2->Refresh(); } //--------------------------------------------------------------------------- __fastcall TYarnArrangeForm::~TYarnArrangeForm() { if (copiedbitmap) delete copiedbitmap; copiedbitmap = NULL; if (originalbitmap) delete originalbitmap; originalbitmap = NULL; } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::FormCreate(TObject *Sender) { /* TIniFile *IniFile = new TIniFile(DirectoryItem + "\\Main.ini"); if (IniFile) { Left = IniFile->ReadInteger("YanrArrangeForm", "FormLeft", 2); Top = IniFile->ReadInteger("YanrArrangeForm", "FormTop", 489); Width = IniFile->ReadInteger("YanrArrangeForm", "FormWidth", 965); Height = IniFile->ReadInteger("YanrArrangeForm", "FormHeight", 422); m = IniFile->ReadInteger("YarnArray", "InputMode", 0); delete IniFile; }*/ } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::FormDestroy(TObject *Sender) { /* TIniFile *IniFile = new TIniFile(DirectoryItem + "\\Main.ini"); if (IniFile) { if (Left<0) Left = 10; if (Top<0) Top = 10; IniFile->WriteInteger("YanrArrangeForm", "FormLeft", Left); IniFile->WriteInteger("YanrArrangeForm", "FormTop", Top); IniFile->WriteInteger("YanrArrangeForm", "FormWidth", Width); IniFile->WriteInteger("YanrArrangeForm", "FormHeight", Height); //IniFile->WriteInteger("YarnArray", "FormLeft", Left); //IniFile->WriteInteger("YarnArray", "FormTop", Top); IniFile->WriteInteger("YarnArray", "InputMode", InputMode); delete IniFile; } */ } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::InitSetHLS() { Byte *ptr; RGBQUAD temp; Byte rgbRed, rgbGreen, rgbBlue; int cnt = 0; int r = 0, g = 0, b = 0; copiedbitmap->StartScanLine(); for(int j=0;jHeight;j++){ if(j<0||j>=copiedbitmap->Height) continue; ptr = copiedbitmap->GetScanLine(j); for(int i=0;iWidth;i++, ptr+=3){ if(i<0||i>=copiedbitmap->Width) continue; rgbBlue = *ptr; rgbGreen = *(ptr+1); rgbRed = *(ptr+2); if (rgbRed!=255 || rgbGreen!=255 || rgbBlue!=255) { r += rgbRed; g += rgbGreen; b += rgbBlue; cnt++; } } } copiedbitmap->StopScanLine(); Basic_index_rgbRed = r / cnt; Basic_index_rgbGreen = g / cnt; Basic_index_rgbBlue = b / cnt; TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Color = (TColor)RGB(Basic_index_rgbRed, Basic_index_rgbGreen, Basic_index_rgbBlue); RxseHue->OnChange = NULL; RxseLightness->OnChange = NULL; RxseSaturation->OnChange = NULL; RxseHue->Value = hls->Hue; RxseLightness->Value = hls->Lig; RxseSaturation->Value = hls->Sat; RxseHue->OnChange = RxseHueChange; RxseLightness->OnChange = RxseLightnessChange; RxseSaturation->OnChange = RxseSaturationChange; //CMY init PCMY1->OnCyanChange = NULL; PCMY1->OnMagentaChange = NULL; PCMY1->OnYellowChange = NULL; seCyan->Value = 255-Basic_index_rgbRed; seMagenta->Value = 255-Basic_index_rgbGreen; seYellow->Value = 255-Basic_index_rgbBlue; PCMY1->OnCyanChange = PCMY1CyanChange; PCMY1->OnMagentaChange = PCMY1MagentaChange; PCMY1->OnYellowChange = PCMY1YellowChange; return; } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::PHLSColorChange(TObject *Sender) { //all color changes call this function Byte r, g, b; short rc, gc, bc; TPHLS *hls = (TPHLS *) Sender; TColor2RGB(hls->Color, r, g, b); rc = Basic_index_rgbRed - r; gc = Basic_index_rgbGreen - g; bc = Basic_index_rgbBlue - b; RxseHue->OnChange = NULL; RxseLightness->OnChange = NULL; RxseSaturation->OnChange = NULL; RxseHue->Value = hls->Hue; RxseLightness->Value = hls->Lig; RxseSaturation->Value = hls->Sat; RxseHue->OnChange = RxseHueChange; RxseLightness->OnChange = RxseLightnessChange; RxseSaturation->OnChange = RxseSaturationChange; ChangeBitmap(rc,gc,bc); showChangedBitmap(); //CMY change PCMY1->OnCyanChange = NULL; PCMY1->OnMagentaChange = NULL; PCMY1->OnYellowChange = NULL; seCyan->Value = 255-r; seMagenta->Value = 255-g; seYellow->Value = 255-b; PCMY1->OnCyanChange = PCMY1CyanChange; PCMY1->OnMagentaChange = PCMY1MagentaChange; PCMY1->OnYellowChange = PCMY1YellowChange; avgTColor = RGB2TColor(r,g,b); } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::sbOKbuttonClick(TObject *Sender) { ModalResult = mrOk; } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::showChangedBitmap() { HDC tDC; tDC = copiedbitmap->CreateDC(); BitBlt(Image1->Canvas->Handle, 0, 0, copiedbitmap->Width, copiedbitmap->Height ,tDC , 0, 0, SRCCOPY); copiedbitmap->DeleteDC(tDC); TRect TheRect = Rect(0,0,Image1->Width ,Image1->Height); Image1->Canvas->Brush->Color = clBlack; Image1->Canvas->FrameRect(TheRect); Image1->Refresh(); } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::ChangeBitmap(short rc, short gc, short bc) { RGBQUAD temp; copiedbitmap->StartScanLine(); Byte *ptr; short rr, gg, bb; for(int j=0;jHeight;j++){ if(j<0||j>=copiedbitmap->Height) continue; ptr = copiedbitmap->GetScanLine(j); for(int i=0;iWidth;i++, ptr+=3){ if(i<0||i>=copiedbitmap->Width) continue; COLORREF c = originalbitmap->GetPixelColor(i, j);//original color RGBQUAD q; TColor2RGB(TColor(c), q.rgbRed, q.rgbGreen, q.rgbBlue); temp.rgbBlue = q.rgbBlue; temp.rgbGreen = q.rgbGreen; temp.rgbRed = q.rgbRed; if (temp.rgbRed!=255 || temp.rgbGreen!=255 || temp.rgbBlue!=255) {//original color check rr = temp.rgbRed - rc; gg = temp.rgbGreen - gc; bb = temp.rgbBlue - bc; if (rr < 0) temp.rgbRed = 0; else if (rr > 255) temp.rgbRed = 255; else temp.rgbRed = rr; if (gg < 0) temp.rgbGreen = 0; else if (gg > 255) temp.rgbGreen = 255; else temp.rgbGreen = gg; if (bb < 0) temp.rgbBlue = 0; else if (bb > 255) temp.rgbBlue = 255; else temp.rgbBlue = bb; *ptr = temp.rgbBlue; *(ptr+1) = temp.rgbGreen; *(ptr+2) = temp.rgbRed; } } copiedbitmap->PutScanLine(j); } copiedbitmap->StopScanLine(); } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::RxseHueChange(TObject *Sender) { if (RxseHue->Text.Length()>0) { if (RxseHue->Value > RxseHue->Max) RxseHue->Value = RxseHue->Max; if (RxseHue->Value < RxseHue->Min) RxseHue->Value = RxseHue->Min; TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Hue = RxseHue->Value; } } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::RxseLightnessChange(TObject *Sender) { if (RxseLightness->Text.Length()>0) { if (RxseLightness->Value > RxseLightness->Max) RxseLightness->Value = RxseLightness->Max; if (RxseLightness->Value < RxseLightness->Min) RxseLightness->Value = RxseLightness->Min; TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Lig = RxseLightness->Value; } } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::RxseSaturationChange(TObject *Sender) { if (RxseHue->Text.Length()>0) { if (RxseSaturation->Value > RxseSaturation->Max) RxseSaturation->Value = RxseSaturation->Max; if (RxseSaturation->Value < RxseSaturation->Min) RxseSaturation->Value = RxseSaturation->Min; TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Sat = RxseSaturation->Value; } } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::Image2Click(TObject *Sender) { //restore original image TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Color = (TColor)RGB(Basic_index_rgbRed, Basic_index_rgbGreen, Basic_index_rgbBlue); RxseHue->OnChange = NULL; RxseLightness->OnChange = NULL; RxseSaturation->OnChange = NULL; RxseHue->Value = hls->Hue; RxseLightness->Value = hls->Lig; RxseSaturation->Value = hls->Sat; RxseHue->OnChange = RxseHueChange; RxseLightness->OnChange = RxseLightnessChange; RxseSaturation->OnChange = RxseSaturationChange; ChangeBitmap(0,0,0); showChangedBitmap(); } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::Label7Click(TObject *Sender) { is_HLS = !is_HLS; if (is_HLS) { RzPanel3->Visible = false; Label7->Caption = "HLS"; } else { RzPanel3->Visible = true; Label7->Caption = "CMY"; } } //--------------------------------------------------------------------------- //----------------- CMY color change ---------------------------------------- void __fastcall TYarnArrangeForm::seCyanChange(TObject *Sender) { if (seCyan->Text.Length()>0) { if (seCyan->Value > seCyan->Max) seCyan->Value = seCyan->Max; if (seCyan->Value < seCyan->Min) seCyan->Value = seCyan->Min; PCMY1->Cyan = seCyan->Value; } } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::seMagentaChange(TObject *Sender) { if (seMagenta->Text.Length()>0) { if (seMagenta->Value > seMagenta->Max) seMagenta->Value = seMagenta->Max; if (seMagenta->Value < seMagenta->Min) seMagenta->Value = seMagenta->Min; PCMY1->Magenta = seMagenta->Value; } } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::seYellowChange(TObject *Sender) { if (seYellow->Text.Length()>0) { if (seYellow->Value > seYellow->Max) seYellow->Value = seYellow->Max; if (seYellow->Value < seYellow->Min) seYellow->Value = seYellow->Min; PCMY1->Yellow = seYellow->Value; } } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::PCMY1CyanChange(TObject *Sender) { seCyan->Value = PCMY1->Cyan; //call HLS color change TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Color = (TColor)RGB(255-PCMY1->Cyan, 255-PCMY1->Magenta, 255-PCMY1->Yellow); } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::PCMY1MagentaChange(TObject *Sender) { seMagenta->Value = PCMY1->Magenta; TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Color = (TColor)RGB(255-PCMY1->Cyan, 255-PCMY1->Magenta, 255-PCMY1->Yellow); } //--------------------------------------------------------------------------- void __fastcall TYarnArrangeForm::PCMY1YellowChange(TObject *Sender) { seYellow->Value = PCMY1->Yellow; TPHLS *hls = (TPHLS *) FindComponent("PHLS" + AnsiString(PHLS_index+1)); hls->Color = (TColor)RGB(255-PCMY1->Cyan, 255-PCMY1->Magenta, 255-PCMY1->Yellow); } //--------------------------------------------------------------------------- TColor TYarnArrangeForm::GetAvgTColor_fromImage(const LPVOID image, const int size) { RECT rect = {0,0,size/YARNIMAGEHEIGHT/3,YARNIMAGEHEIGHT}; TTexpiaBitmap *tempbitmap = new TTexpiaBitmap; tempbitmap->Create(size/YARNIMAGEHEIGHT/3,YARNIMAGEHEIGHT,24); tempbitmap->LoadFromMemory((BYTE*)image, size/YARNIMAGEHEIGHT, rect); Byte *ptr; RGBQUAD temp; Byte rgbRed, rgbGreen, rgbBlue; int cnt = 0; int r = 0, g = 0, b = 0; tempbitmap->StartScanLine(); for(int j=0;jHeight;j++){ if(j<0||j>=tempbitmap->Height) continue; ptr = tempbitmap->GetScanLine(j); for(int i=0;iWidth;i++, ptr+=3){ if(i<0||i>=tempbitmap->Width) continue; rgbBlue = *ptr; rgbGreen = *(ptr+1); rgbRed = *(ptr+2); if (rgbRed!=255 || rgbGreen!=255 || rgbBlue!=255) { r += rgbRed; g += rgbGreen; b += rgbBlue; cnt++; } } } tempbitmap->StopScanLine(); return RGB2TColor(r/cnt, g/cnt, b/cnt); } //---------------------------------------------------------------------------