//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "Style_F.h" #include "Common.h" #include "MainImage.h" #include "Palette.h" #include "Undo.h" #include "UserColor_F.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_STYLEPATTERNCHART StringTable[0] #define IDS_STYLEMAINMENU StringTable[1] #define IDS_COLUMNMENU StringTable[2] #define IDS_CELLMENU StringTable[3] #define IDS_INSERT StringTable[4] #define IDS_OVERWRITE StringTable[5] #define IDS_FIX StringTable[6] #define IDS_IMAGEDEL StringTable[7] //--------------------------------------------------------------------------- TStyleForm *StyleForm; typedef struct tagImgdata { TTexpiaBitmap *sBitmap; RECT rect; // MainImage ¿¡¼­ÀÇ À§Ä¡... bool draw; } TImgdata; //--------------------------------------------------------------------------- __fastcall TStyleForm::TStyleForm(TComponent* Owner) : TForm(Owner) { hWnd = ((TWinControl *)Owner)->Handle; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::FormCreate(TObject *Sender) { Data = NULL; Imgstore = NULL; //============================================================== StringTable.Create(DirectoryItem, Language, "Style"); SetSmallFont(Font); SetSmallFont(stTitle->Font); SetSmallFont(sbMainIns->Font); SetSmallFont(sbMainDel->Font); SetSmallFont(stPara->Font); SetSmallFont(sbHorIns->Font); SetSmallFont(sbHorDel->Font); SetSmallFont(stCell->Font); SetSmallFont(sbVerIns->Font); SetSmallFont(sbVerDel->Font); SetSmallFont(sbVerExchange->Font); SetSmallFont(sbExit->Font); SetSmallFont(StringGrid->Font); Caption = IDS_STYLEPATTERNCHART; stTitle->Caption = IDS_STYLEMAINMENU; sbMainIns->Caption = IDS_INSERT; sbMainDel->Caption = IDS_COMMON_DELETE; stPara->Caption = IDS_COLUMNMENU; sbHorIns->Caption = IDS_INSERT; sbHorDel->Caption = IDS_COMMON_DELETE; stCell->Caption = IDS_CELLMENU; sbVerIns->Caption = IDS_INSERT; sbVerDel->Caption = IDS_COMMON_DELETE; sbVerExchange->Caption = IDS_OVERWRITE; sbFix->Caption = IDS_FIX; sbDelete->Caption = IDS_IMAGEDEL; sbExit->Caption = IDS_COMMON_EXIT; //============================================================== } //--------------------------------------------------------------------------- void __fastcall TStyleForm::FormClose(TObject *Sender, TCloseAction &Action) { PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::FormShow(TObject *Sender) { if (MainImageForm->WorkArea->Mask) { sbVerIns->Enabled = true; sbVerExchange->Enabled = true; } else { sbVerIns->Enabled = false; sbVerExchange->Enabled = false; } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbPreviousClick(TObject *Sender) { if (sbMainIns->Down) sbMainIns->Down = false; if(currentIndex == 0) return; DeleteOldData(currentIndex); currentIndex--; ChangeStyleData(); StringGrid->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbNextClick(TObject *Sender) { if (sbMainIns->Down) sbMainIns->Down = false; if(currentIndex == Data->Count-1) return; DeleteOldData(currentIndex); currentIndex++; ChangeStyleData(); StringGrid->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbInsClick(TObject *Sender) { EditPara->SetFocus(); ChangeButtonState(Sender); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbMainDelClick(TObject *Sender) { TDirectoryInfor *di; ChangeButtonState(Sender); // if (sbMainIns->Down) sbMainIns->Down = false; if (Data->Count > 0) { di = (TDirectoryInfor *) Data->Items[currentIndex]; if (MessageDlg(IDS_MESSAGE_DELETEFILE, mtWarning, TMsgDlgButtons()<InitDirectory + "\\" + di->Name); else return; ComboBox->Items->Delete(currentIndex); DeleteOldData(currentIndex); UpdateData(); if(currentIndex == Data->Count) currentIndex = currentIndex-1; ChangeStyleData(); StringGrid->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::ComboBoxChange(TObject *Sender) { if (sbMainIns->Down) sbMainIns->Down = false; DeleteOldData(currentIndex); currentIndex = ComboBox->ItemIndex; ChangeStyleData(); StringGrid->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::EditParaKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { AnsiString fn; TDirectoryInfor *di; if (Key == VK_RETURN) { if (sbMainIns->Down) { fn = SearchFile->InitDirectory + "\\" + EditPara->Text; //change dir.... CreateDirectory(fn.c_str(), NULL); DeleteOldData(currentIndex); UpdateData(); currentIndex = GetCurrentIndex(EditPara->Text); ChangeStyleData(); sbMainIns->Down = false; } else if (sbHorIns->Down) { di = (TDirectoryInfor *) Data->Items[currentIndex]; //updatedata... fn = SearchFile->InitDirectory + "\\" + di->Name + "\\" + EditPara->Text; CreateDirectory(fn.c_str(), NULL); DeleteOldData(currentIndex); UpdateData(); ChangeStyleData(); sbHorIns->Down = false; } EditPara->Text = ""; StringGrid->SetFocus(); StringGrid->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::StringGridClick(TObject *Sender) { TDirectoryInfor *firdi, *secdi; TFileInfor *fi; int column = StringGrid->Col; int row = StringGrid->Row; AnsiString dn, fn; char *s; if (Data->Count<=0) return; if (column) { if(sbHorDel->Down) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { if (column <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[column-1]; dn = SearchFile->InitDirectory + "\\" + firdi->Name + "\\" + secdi->Name; DeleteFolder(dn); DeleteOldData(currentIndex); UpdateData(); ChangeStyleData(); StringGrid->Repaint(); } } sbHorDel->Down = false; } else if (sbVerIns->Down) { if(row) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { if (column <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[column-1]; dn = SearchFile->InitDirectory + "\\" + firdi->Name + "\\" + secdi->Name; if (InputQuery("Input Box", "Name", fn)) { s = AnsiStrScan(fn.c_str(), '.'); if (s==NULL) fn = fn + ".tex"; fn = dn + "\\" + fn; SaveToFile(fn); DeleteOldData(currentIndex); UpdateData(); ChangeStyleData(); StringGrid->Repaint(); } } } } sbVerIns->Down = false; } else if (sbVerDel->Down) { if(row) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { if (column <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[column-1]; if (secdi->pFileList) { if (row <= secdi->pFileList->Count){ fi = (TFileInfor *) secdi->pFileList->Items[row-1]; dn = SearchFile->InitDirectory + "\\" + fi->Path + "\\" + fi->Name; DeleteFolder(dn); DeleteOldData(currentIndex); UpdateData(); ChangeStyleData(); StringGrid->Repaint(); } } } } } sbVerDel->Down = false; } else if (sbVerExchange->Down) { if(row) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { if (column <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[column-1]; if (secdi->pFileList) { if (row <= secdi->pFileList->Count){ fi = (TFileInfor *) secdi->pFileList->Items[row-1]; dn = SearchFile->InitDirectory + "\\" + fi->Path + "\\" + fi->Name; SaveToFile(dn); DeleteOldData(currentIndex); UpdateData(); ChangeStyleData(); StringGrid->Repaint(); } } } } } sbVerExchange->Down = false; } } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::StringGridDrawCell(TObject *Sender, int Col, int Row, TRect &Rect, TGridDrawState State) { int x, y; AnsiString str; TFileInfor *fi; TDirectoryInfor *firdi, *secdi; TRect r; if (Data->Count>0) firdi = (TDirectoryInfor *) Data->Items[currentIndex]; else return; if (Col){ if (Row) { if (firdi->pDirectoryList) { if (Col <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[Col-1]; if (secdi->pFileList) { if (Row <= secdi->pFileList->Count) { fi = (TFileInfor *) secdi->pFileList->Items[Row-1]; StringGrid->Canvas->Draw(Rect.Left+5, Rect.Top+5, fi->Bitmap); r.Left = Rect.Left+5; r.Top = Rect.Top+110; r.Right = Rect.Left+85; r.Bottom = Rect.Top+130; StringGrid->Canvas->TextRect(r, Rect.Left+5, Rect.Top+115, fi->Name); } } } } } else { if (firdi->pDirectoryList) { if (Col <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[Col-1]; str = secdi->Name; x = ((Rect.Right - Rect.Left) - StringGrid->Canvas->TextWidth(str)) / 2; y = ((Rect.Bottom - Rect.Top) - StringGrid->Canvas->TextHeight(str)) / 2; StringGrid->Canvas->Font->Color = clBlue; StringGrid->Canvas->TextRect(Rect, Rect.Left + x, Rect.Top + y, str); } } } } else { if (Row) { str = AnsiString(Row); x = ((Rect.Right - Rect.Left) - StringGrid->Canvas->TextWidth(str)) / 2; y = ((Rect.Bottom - Rect.Top) - StringGrid->Canvas->TextHeight(str)) / 2; StringGrid->Canvas->TextRect(Rect, Rect.Left + x, Rect.Top + y, str); } } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::StringGridMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { TDirectoryInfor *firdi, *secdi; TFileInfor *fi; TGridCoord grid = StringGrid->MouseCoord(X, Y); if (Button == mbRight) { if (Data->Count > 0) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { if (grid.X && grid.X <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[grid.X-1]; if (secdi->pFileList) { if (grid.Y && grid.Y <= secdi->pFileList->Count) { fi = (TFileInfor*) secdi->pFileList->Items[grid.Y-1]; path = SearchFile->InitDirectory + "\\" + fi->Path + "\\" + fi->Name; loadOk = true; return; } } } } } } loadOk = false; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::StringGridDblClick(TObject *Sender) { TDirectoryInfor *firdi, *secdi; TFileInfor *fi; if (Data->Count > 0) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { if (StringGrid->Col && StringGrid->Col <= firdi->pDirectoryList->Count) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[StringGrid->Col-1]; if (secdi->pFileList) { if (StringGrid->Row && StringGrid->Row <= secdi->pFileList->Count) { fi = (TFileInfor*) secdi->pFileList->Items[StringGrid->Row-1]; path = SearchFile->InitDirectory + "\\" + fi->Path + "\\" + fi->Name; mirror = false; LoadToMainImage(); } } } } } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::MirrorLeftClick(TObject *Sender) { if (loadOk) { mirror = false; LoadToMainImage(); } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::MirrorRightClick(TObject *Sender) { if (loadOk) { mirror = true; LoadToMainImage(); } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbFixClick(TObject *Sender) { TImgdata *id; while (Imgstore->Count>0) { id = (TImgdata *) Imgstore->Last(); Imgstore->Remove(id); delete id->sBitmap; delete id; } MainImageForm->UndoSave(UK_ALL, Rect(0, 0, MainImageForm->iMainImage->Bitmap->Width, MainImageForm->iMainImage->Bitmap->Height)); method = 0; fix = true; sbDelete->Enabled = false; ::RepaintColor(); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbExitClick(TObject *Sender) { ChangeButtonState(Sender); PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); } //--------------------------------------------------------------------------- ///// Private Method ////////////////////////////////////////////////// //--------------------------------------------------------------------------- void __fastcall TStyleForm::DeleteOldData(int Index) { TDirectoryInfor *firdi, *secdi; TFileInfor *fi; int i, j; if (Index == -1) return; if (Data->Count > 0) { firdi = (TDirectoryInfor *) Data->Items[Index]; if (firdi->pDirectoryList) { for (i=0; ipDirectoryList->Count; i++) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[i]; if (secdi->pFileList) { for (j=0; jpFileList->Count; j++) { fi = (TFileInfor *) secdi->pFileList->Items[j]; if(fi->Bitmap) { delete fi->Bitmap; fi->Bitmap = NULL; } } } } } } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::UpdateData() { TDirectoryInfor *di, *tdi; int i, cnt; while(Data->Count>0) { di = (TDirectoryInfor *) Data->Last(); Data->Remove(di); } SearchFile->Create(this); di = (TDirectoryInfor *) SearchFile->RootDirectory(); if (di->pDirectoryList) { cnt = di->pDirectoryList->Count; for (i=0; ipDirectoryList->Items[i]; ComboBox->Items->Strings[i] = tdi->Name; Data->Add(tdi); } } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::ChangeStyleData() { TDirectoryInfor *firdi, *secdi; TFileInfor *fi; HANDLE hFile = INVALID_HANDLE_VALUE; int i, j, x, y; TTexVersion ver; RGBQUAD rgb[2]; Byte *sl; if (currentIndex == -1) return; if (Data->Count > 0) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; ComboBox->Text = firdi->Name; if (firdi->pDirectoryList) { for (i=0; ipDirectoryList->Count; i++) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[i]; if (secdi->pFileList) { for (j=0; jpFileList->Count; j++) { fi = (TFileInfor *) secdi->pFileList->Items[j]; fi->Bitmap = new Graphics::TBitmap; if ((hFile = CreateFile((SearchFile->InitDirectory + "\\" + fi->Path + "\\" + fi->Name).c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { goto fail; } LoadFromTexpiaTag(hFile, fi, &ver); if (ver.Texpia =='P' && ver.Method =='T' && ver.Number >= 210) { rgb[0].rgbRed = 255; rgb[0].rgbGreen = 255; rgb[0].rgbBlue = 255; rgb[1].rgbRed = 0; rgb[1].rgbGreen = 0; rgb[1].rgbBlue = 0; SetDIBColorTable(fi->Bitmap->Canvas->Handle, 0, 2, rgb); for (y = 0; y < 100; y++) { sl = (Byte *)fi->Bitmap->ScanLine[y]; for (x = 0; x< 80; x++) sl[x] = sl[x] - 1; } } CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; } } } } } return; fail : if (hFile!=INVALID_HANDLE_VALUE) CloseHandle(hFile); EXCEPTION_MESSAGE_OK(EC_FILE_NOT_OPEN); } //--------------------------------------------------------------------------- int __fastcall TStyleForm::GetCurrentIndex(AnsiString str) { TDirectoryInfor *tdi; int cnt = Data->Count; if (cnt>0) { for (int i = 0; i < cnt; i++) { tdi = (TDirectoryInfor *) Data->Items[i]; if (tdi->Name == str) { return i; } } } return -1; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::DeleteFolder(AnsiString FolderName) { SHFILEOPSTRUCT shfile; char *ucFrom = NULL; memset(&shfile, 0, sizeof(SHFILEOPSTRUCT)); shfile.hwnd = Handle; shfile.wFunc = FO_DELETE; if ((ucFrom = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FolderName.Length()+2)) == NULL) goto fail; strcpy(ucFrom, FolderName.c_str()); shfile.pFrom = ucFrom; shfile.fFlags = FOF_ALLOWUNDO ; SHFileOperation(&shfile); HeapFree(GetProcessHeap(), 0, ucFrom); return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::SaveToFile(AnsiString fn) { HANDLE hFile = INVALID_HANDLE_VALUE; DWORD dwWrite; TEXPIAFILEHEADER tpfh; TRect src; RGBQUAD rgb[256]; TTexpiaBitmap *tag = NULL; int ec = EC_NONE; if ((hFile = CreateFile(fn.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { ec = EC_FILE_NOT_CREATE; goto fail; } tpfh.Version = TexVersion('P', 'T', 222); tpfh.CanvasInfor = MainImageForm->CanvasInfor; tpfh.BitsPerPixel = 8; tpfh.Compress = cmZLib; src = MainImageForm->WorkArea->Range; tpfh.CanvasInfor.DotsPerInch = tpfh.CanvasInfor.DotsPerInch; tpfh.CanvasInfor.SetSize(cstFree, src.Right-src.Left, src.Bottom-src.Top); MainImageForm->Palette->ToRGBQUAD(rgb, 256); if ((tag = new TTexpiaBitmap) == NULL) { ec = EC_MEMORY_LACK; goto fail; } MakeTexpiaTag(tag, MainImageForm->iMainImage->Bitmap, src, 1); if (MainImageForm->WorkArea && MainImageForm->WorkArea->Mask) { if (!SaveToTexpiaFile(hFile, MainImageForm->Palette, tpfh, tag, MainImageForm->iMainImage->Bitmap, &MainImageForm->WorkArea->Range)) goto fail; } else { if (!SaveToTexpiaFile(hFile, MainImageForm->Palette, tpfh, tag, MainImageForm->iMainImage->Bitmap)) goto fail; } delete tag; CloseHandle(hFile); return; fail: tag->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); if (tag) delete tag; if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (ec == EC_NONE) ec = EC_FILE_NOT_WRITE; EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::LoadToMainImage() { TEXPIAFILEHEADER tpfh; int x, y; TImgdata *id = NULL; RGBQUAD rgb[256]; Byte *sl; TPalette *spalette = NULL; TPException ec = EC_NONE; HANDLE hFile = INVALID_HANDLE_VALUE; if ((id = new TImgdata)==NULL) goto fail; id->sBitmap = NULL; if ((id->sBitmap = new TTexpiaBitmap) == NULL) goto fail; if ((spalette = new TPalette)==NULL) goto fail; if ((hFile = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { ec = EC_FILE_NOT_OPEN; goto fail; } if ((ec = LoadFromTexpiaFile(hFile, spalette, tpfh, id->sBitmap))!=EC_NONE) goto fail; UserColorLibForm->ThisFileHasUserColor(spalette); CloseHandle(hFile); MainImageForm->Palette->ToRGBQUAD(rgb, 256); id->sBitmap->PutColors(0, 256, rgb); if (mirror) { if (L_ReverseBitmap(id->sBitmap->Handle) != SUCCESS) goto fail; } if (!(id->sBitmap->StartScanLine())) goto fail; for (y = 0; y < id->sBitmap->Height; y++) { sl = id->sBitmap->GetScanLine(y); for (x = 0; x < id->sBitmap->Width; x++) { if(sl[x] < 2) { sl[x] = 255; } else { sl[x] = 0; } } id->sBitmap->PutScanLine(y); } id->sBitmap->StopScanLine(); if (!(MainImageForm->iSelectImage->Bitmap->Create(id->sBitmap->Width, id->sBitmap->Height, 8, rgb))) goto fail; MainImageForm->iSelectImageSize(); MainImageForm->iSelectImage->Visible = false; MainImageForm->Center.x = MainImageForm->iSelectImage->Bitmap->Width / 2; MainImageForm->Center.y = MainImageForm->iSelectImage->Bitmap->Height / 2; id->draw = false; Imgstore->Add(id); delete spalette; ImgIndex = Imgstore->Count-1; method = 1; return; fail: if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (spalette) delete spalette; if (id) { if (id->sBitmap) delete id->sBitmap; delete id; } if (ec == EC_NONE) ec = EC_MEMORY_LACK; EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::MergeBitmap(POINT p) { TImgdata *id; if (Imgstore->Count>0) { id = (TImgdata *) Imgstore->Items[ImgIndex]; MainImageForm->iSelectImage->Bitmap->CopyFromRect( MainImageForm->iMainImage->Bitmap, p.x, p.y, SRCCOPY); MainImageForm->iSelectImage->Bitmap->Copy(id->sBitmap, SRCAND); MainImageForm->iMainImage->Repaint(); MainImageForm->iSelectImage->Visible = true; } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::SeparateImage() { TUndoData *ud; TImgdata *id; TCursor cur = Screen->Cursor; Byte *sl, *dl; RGBQUAD rgb[256]; int ec, i, x, y; Screen->Cursor = crHourGlass; if ((ud = Undo->Last)==NULL) { ec = EC_UNDO_NONE; goto fail; } MainImageForm->iMainImage->Bitmap->Copy(ud->Bitmap, SRCCOPY); for (i = 0; i < Imgstore->Count; i++) { if (ImgIndex != i) { id = (TImgdata *) Imgstore->Items[i]; if (id->draw) { if (!(MainImageForm->iMainImage->Bitmap->StartScanLine())) { ec = EC_MEMORY_LACK; goto fail; } if (!(id->sBitmap->StartScanLine())) { ec = EC_MEMORY_LACK; goto fail; } for (y = 0; y < id->sBitmap->Height; y++) { dl = MainImageForm->iMainImage->Bitmap->GetScanLine(y + id->rect.top); sl = id->sBitmap->GetScanLine(y); for (x = 0; x < id->sBitmap->Width; x++) { if (sl[x] == 0) dl[x + id->rect.left] = 2; } MainImageForm->iMainImage->Bitmap->PutScanLine(y + id->rect.top); } id->sBitmap->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); } } } id = (TImgdata *) Imgstore->Items[ImgIndex]; MainImageForm->Palette->ToRGBQUAD(rgb, 256); if (!(MainImageForm->iSelectImage->Bitmap->Create(id->sBitmap->Width, id->sBitmap->Height, 8, rgb))) { ec = EC_MEMORY_LACK; goto fail; } MainImageForm->iSelectImageSize(); MainImageForm->Center.x = MainImageForm->iSelectImage->Bitmap->Width / 2; MainImageForm->Center.y = MainImageForm->iSelectImage->Bitmap->Height / 2; ::RepaintColor(); method = 1; Screen->Cursor = cur; return; fail: id->sBitmap->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); Screen->Cursor = cur; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::DeleteImage() { TUndoData *ud; TImgdata *id; Byte *sl, *dl; TCursor cur = Screen->Cursor; int i, x, y, ec = EC_NONE; Screen->Cursor = crHourGlass; id = (TImgdata *) Imgstore->Items[ImgIndex]; Imgstore->Remove(id); delete id->sBitmap; delete id; if (ImgIndex == Imgstore->Count) ImgIndex = ImgIndex - 1; if (Imgstore->Count == 0) { sbDelete->Enabled = false; fix = true; } if ((ud = Undo->Last)==NULL) { ec = EC_UNDO_NONE; goto fail; } MainImageForm->iMainImage->Bitmap->Copy(ud->Bitmap, SRCCOPY); for (i = 0; i < Imgstore->Count; i++) { id = (TImgdata *) Imgstore->Items[i]; if (id->draw) { if (!(MainImageForm->iMainImage->Bitmap->StartScanLine())) { ec = EC_MEMORY_LACK; goto fail; } if (!(id->sBitmap->StartScanLine())) { ec = EC_MEMORY_LACK; goto fail; } for (y = 0; y < id->sBitmap->Height; y++) { dl = MainImageForm->iMainImage->Bitmap->GetScanLine(y + id->rect.top); sl = id->sBitmap->GetScanLine(y); for (x = 0; x < id->sBitmap->Width; x++) { if (sl[x] == 0) dl[x + id->rect.left] = 2; } MainImageForm->iMainImage->Bitmap->PutScanLine(y + id->rect.top); } id->sBitmap->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); } } ::RepaintColor(); sbDelete->Down = false; method = 2; Screen->Cursor = cur; return; fail: Screen->Cursor = cur; if (id->sBitmap) id->sBitmap->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::ChangeButtonState(TObject *Sender) { TSpeedButton *s = (TSpeedButton *) Sender; if (s != sbMainIns) if(sbMainIns->Down) sbMainIns->Down = false; if (s != sbHorIns) if(sbHorIns->Down) sbHorIns->Down = false; if (s != sbHorDel) if(sbHorDel->Down) sbHorDel->Down = false; if (s != sbVerIns) if(sbVerIns->Down) sbVerIns->Down = false; if (s != sbVerDel) if(sbVerDel->Down) sbVerDel->Down = false; if (s != sbVerExchange) if(sbVerExchange->Down) sbVerExchange->Down = false; if (s != sbDelete) if(sbDelete->Down) sbDelete->Down = false; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::ReadIniFile() { TIniFile *StyleIni = NULL; int l, t; StyleIni = new TIniFile(DirectoryItem + "\\Style.ini"); if (StyleIni) { l = StyleIni->ReadInteger("Form", "Left", (Screen->Width-Width)>>1); t = StyleIni->ReadInteger("Form", "Top", (Screen->Height-Height)>>1); currentIndex = StyleIni->ReadInteger("Image", "Order", 0); if (currentIndex < 0) currentIndex = 0; if (currentIndex > 0) { if (currentIndex >= Data->Count) currentIndex = Data->Count - 1; } delete StyleIni; } if (l < 0) Left = 0; else Left = l; if (t < 0) Top = 0; else Top = t; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::WriteIniFile() { TIniFile *StyleIni = NULL; StyleIni = new TIniFile(DirectoryItem + "\\Style.ini"); if (StyleIni) { StyleIni->WriteInteger("Form", "Left", Left); StyleIni->WriteInteger("Form", "Top", Top); if (currentIndex < 0) currentIndex = 0; StyleIni->WriteInteger("Image", "Order", currentIndex); delete StyleIni; } } //--------------------------------------------------------------------------- ////// Public Method ////////////////////////////////////////////////// //--------------------------------------------------------------------------- void __fastcall TStyleForm::InitForm() { int i, j; SearchFile = new TSearchFile; SearchFile->FileName = "*.tex"; SearchFile->InitDirectory = DirectoryStyle; SearchFile->Make = true; SearchFile->SubDirectory = true; Data = new TList; UpdateData(); ReadIniFile(); // currentIndex = 0; ChangeStyleData(); // Left = Screen->Width - (Width + 20); Top = 30; StringGrid->Align = alClient; StringGrid->ColCount = 20; StringGrid->RowCount = 30; StringGrid->ColWidths[0] = 30; StringGrid->RowHeights[0] = 24; for (i = 1; i < 20; i++) StringGrid->ColWidths[i] = 90; for (j = 1; j < 30; j++) StringGrid->RowHeights[j] = 135; MainImageForm->UndoSave(UK_ALL, Rect(0, 0, MainImageForm->iMainImage->Bitmap->Width, MainImageForm->iMainImage->Bitmap->Height)); TColorData *ColorMap = PaletteForm->DIB256Palette->Palette->ColorData[1]; ColorMap->RGB.rgbRed = 255; ColorMap->RGB.rgbGreen = 255; ColorMap->RGB.rgbBlue = 255; ColorMap = PaletteForm->DIB256Palette->Palette->ColorData[2]; ColorMap->RGB.rgbRed = 0; ColorMap->RGB.rgbGreen = 0; ColorMap->RGB.rgbBlue = 0; ::RepaintColor(); Imgstore = new TList; method = 0; del = false; fix = true; MainImageForm->UndoSave(UK_ALL, Rect(0, 0, MainImageForm->iMainImage->Bitmap->Width, MainImageForm->iMainImage->Bitmap->Height)); Visible = true; BringToFront(); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::ExitForm() { int i, j; TFileInfor *fi; TDirectoryInfor *firdi, *secdi; TImgdata *id; if (fix) Undo->RemoveLast(); WriteIniFile(); if (Data->Count>0) { firdi = (TDirectoryInfor *) Data->Items[currentIndex]; if (firdi->pDirectoryList) { for (i=0; ipDirectoryList->Count; i++) { secdi = (TDirectoryInfor *) firdi->pDirectoryList->Items[i]; if (secdi->pFileList) { for (j=0; jpFileList->Count; j++) { fi = (TFileInfor *) secdi->pFileList->Items[j]; if(fi->Bitmap) { delete fi->Bitmap; fi->Bitmap = NULL; } } } } } } while(Data->Count>0) { firdi = (TDirectoryInfor *) Data->Last(); Data->Remove(firdi); } delete Data; delete SearchFile; while (Imgstore->Count>0) { id = (TImgdata *) Imgstore->Last(); Imgstore->Remove(id); delete id->sBitmap; delete id; } delete Imgstore; MainImageForm->iSelectImage->Bitmap->Destroy(); MainImageForm->iSelectImage->Visible = false; } //--------------------------------------------------------------------------- bool __fastcall TStyleForm::PopupInsert() { if ((method == 2) && (Imgstore->Count>0)) return true; else return false; } //--------------------------------------------------------------------------- void __fastcall TStyleForm::PopupClick(TObject *Sender) { if (del) DeleteImage(); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::iMainImageMouseMove(POINT p) { if (method == 1) { MainImageForm->iSelectImagePosition(p); MergeBitmap(p); } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::iMainImageMouseDown(TMouseButton Button, int X, int Y) { TImgdata *id; int min[2] = {999, 999999999}; int tempsquare; // min[0] ImgIndex; min[1] RectSquare; del = false; if (method == 2) { if (Imgstore->Count>0) { for (int i = 0; i < Imgstore->Count; i++) { id = (TImgdata *) Imgstore->Items[i]; if (PtInRect(&id->rect, Point(X, Y))) { tempsquare = ((id->rect.right - id->rect.left) * (id->rect.bottom - id->rect.top)); if (min[1]>tempsquare) { min[1] = tempsquare; min[0] = i; } } } if (min[0] != 999) { del = true; ImgIndex = min[0]; if (Button == mbLeft) { if (sbDelete->Down) DeleteImage(); else SeparateImage(); } } } } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::iSelectImageMouseMove(int X, int Y) { if (method == 1) { POINT p = MainImageForm->iSelectImagePosition(MainImageForm->iSelectImageConvert(X, Y)); MergeBitmap(p); } } //--------------------------------------------------------------------------- void __fastcall TStyleForm::iSelectImageMouseDown(int X, int Y) { int w, h, x, y; TImgdata *id; POINT p; Byte *sl, *dl; if (Imgstore->Count>0 && method == 1) { p = MainImageForm->iSelectImagePosition(MainImageForm->iSelectImageConvert(X, Y)); id = (TImgdata *) Imgstore->Items[ImgIndex]; w = MainImageForm->iSelectImage->Bitmap->Width; h = MainImageForm->iSelectImage->Bitmap->Height; if (!(MainImageForm->iMainImage->Bitmap->StartScanLine())) goto fail; if (!(MainImageForm->iSelectImage->Bitmap->StartScanLine())) goto fail; for (y = 0; y < h; y++) { dl = MainImageForm->iMainImage->Bitmap->GetScanLine(y + p.y); sl = MainImageForm->iSelectImage->Bitmap->GetScanLine(y); for (x = 0; x < w; x++) { if (sl[x] == 0) { dl[x+p.x] = 2; } else { dl[x+p.x] = sl[x]; } } MainImageForm->iMainImage->Bitmap->PutScanLine(y + p.y); } MainImageForm->iSelectImage->Bitmap->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); MainImageForm->iSelectImage->Bitmap->Destroy(); MainImageForm->iSelectImage->Visible = false; ::RepaintColor(); id->rect = Rect(p.x, p.y, p.x + w, p.y + h); id->draw = true; sbDelete->Enabled = true; method = 2; fix = false; } return; fail: MainImageForm->iSelectImage->Bitmap->StopScanLine(); MainImageForm->iMainImage->Bitmap->StopScanLine(); MainImageForm->iSelectImage->Bitmap->Destroy(); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TStyleForm::sbButtonStateClick(TObject *Sender) { ChangeButtonState(Sender); } //---------------------------------------------------------------------------