//--------------------------------------------------------------------------- #include "lzw.hpp" // ÀÎŬ·çµå ¼ø¼­¸¦ Àý´ë·Î ¹Ù²ÙÁö ¸¶½Ã¿À #include #include #include #include "Palettes.hpp" #include "TPMemory.h" #include "Exception.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "ltdis_bc.lib" #pragma link "ltkrn_bc.lib" #pragma link "ltfil_bc.lib" #pragma hdrstop #include "Main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "ToolEdit" #pragma link "ToolEdit" #pragma link "ToolEdit" #pragma resource "*.dfm" TMain_F *Main_F; //--------------------------------------------------------------------------- AnsiString __fastcall FullPathName(AnsiString dn, AnsiString fn) { char *str = dn.c_str(); if (str[dn.Length()-1] == '\\') return dn + fn; return dn + "\\" + fn; } //--------------------------------------------------------------------------- void __fastcall TPCanvasInfor::SetSize(TPCanvasSizeType st, int w, int h) { SizeType = st; if (st==cstFree) { Width = w; Height = h; } else { Width = GetWidth(); Height = GetHeight(); } } //--------------------------------------------------------------------------- int __fastcall TPCanvasInfor::GetWidth() { if (SizeType==cstFree) return Width; if (Orientation==coPortrait) { switch (SizeType) { case cstTabloid: return 10.3 * DotsPerInch; case cstLetter: return 8.0 * DotsPerInch; //k3dogs letter case cstLegal: return 8.0 * DotsPerInch; case cstA0: return 31.2 * DotsPerInch; case cstA1: return 22.0 * DotsPerInch; case cstA2: return 15.6 * DotsPerInch; case cstA3: return 11.0 * DotsPerInch; default: return 7.8 * DotsPerInch; } } else { switch (SizeType) { case cstTabloid: return 16.0 * DotsPerInch; case cstLetter: return 10.3 * DotsPerInch; //k3dogs letter case cstLegal: return 13.2 * DotsPerInch; case cstA0: return 44.0 * DotsPerInch; case cstA1: return 31.2 * DotsPerInch; case cstA2: return 22.0 * DotsPerInch; case cstA3: return 15.6 * DotsPerInch; default: return 11.0 * DotsPerInch; } } } //--------------------------------------------------------------------------- int __fastcall TPCanvasInfor::GetHeight() { if (SizeType==cstFree) return Height; if (Orientation==coPortrait) { switch (SizeType) { case cstTabloid: return 16.0 * DotsPerInch; case cstLetter: return 10.3 * DotsPerInch; //k3dogs letter case cstLegal: return 13.2 * DotsPerInch; case cstA0: return 44.0 * DotsPerInch; case cstA1: return 31.2 * DotsPerInch; case cstA2: return 22.0 * DotsPerInch; case cstA3: return 15.6 * DotsPerInch; default: return 11.0 * DotsPerInch; } } else { switch (SizeType) { case cstTabloid: return 10.3 * DotsPerInch; case cstLetter: return 8.0 * DotsPerInch; //k3dogs letter case cstLegal: return 8.0 * DotsPerInch; case cstA0: return 31.2 * DotsPerInch; case cstA1: return 22.0 * DotsPerInch; case cstA2: return 15.6 * DotsPerInch; case cstA3: return 11.0 * DotsPerInch; default: return 7.8 * DotsPerInch; } } } //--------------------------------------------------------------------------- void __fastcall TPCanvasInfor::SetExtFileOption() { EXTFILEOPTION ExtFileOption; L_GetExtFileOption(&ExtFileOption); ExtFileOption.XResolution = DotsPerInch; ExtFileOption.YResolution = DotsPerInch; L_SetExtFileOption(&ExtFileOption); } //--------------------------------------------------------------------------- AnsiString __fastcall TPCanvasInfor::Name(TUnit Unit, int w, int h) { switch (SizeType) { case cstA4: return "A4"; case cstA3: return "A3"; case cstA2: return "A2"; case cstA1: return "A1"; case cstA0: return "A0"; case cstLetter: return "Letter"; //k3dogs letter case cstLegal: return "Legal"; case cstTabloid: return "Tabloid"; default: /*if(w == 1247 && h == 1760) return "A4"; //qe »çÀÌÁî°¡ ±Ô°Ý »çÀÌÁî¶û ¶È°°À¸¸é »çÀÌÁîÀÇ Å©±â¸¦ if(w == 1760 && h == 2496) return "A3"; //º¸¿©ÁÖ´Â°Í ´ë½Å¿¡ »çÀÌÁîÀ̸§À» º¸¿©ÁÖ°Ô Çß´Ù..(½ÃÄѼ­..) if(w == 2496 && h == 3520) return "A2"; //´Ù½Ã ¸·¾Ò´Ù...»çÀÌÁîÀÇ Å©±â°¡ ÀÏÁ¤ÇÏÁö ¾Ê´Ù...ÇѵµÆ®Á¤µµ Â÷À̰¡ ³­´Ù. if(w == 3520 && h == 4992) return "A1"; if(w == 4992 && h == 7040) return "A0"; if(w == 1280 && h == 1648) return "Letter"; if(w == 1280 && h == 2112) return "Legal"; */ if (Unit == uDot) { return Format("%d x %d", OPENARRAY(TVarRec, (w, h))); } else if (Unit == uInch) { return Format("%f x %f", OPENARRAY(TVarRec, ((double)w/DotsPerInch, (double)h/DotsPerInch))); } else if (Unit == uCm) { return Format("%f x %f", OPENARRAY(TVarRec, (2.54*w/DotsPerInch, 2.54*h/DotsPerInch))); } break; } return ""; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TMain_F::TMain_F(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TMain_F::s_count(AnsiString curDir, int FileFormat, TFunction func, bool sub) { WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile((curDir+"\\*.*").c_str(),&fd); bool bRet=true; while(hFind!=INVALID_HANDLE_VALUE&&bRet) { if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && fd.cFileName[0] != '.') { if(sub) s_count(curDir+"\\"+ExtractFileName(AnsiString(fd.cFileName)), FileFormat, func, sub); } else { if(func==fnT2X){ if(AnsiString(".tex") == ExtractFileExt(fd.cFileName).LowerCase() ||AnsiString(".tfc") == ExtractFileExt(fd.cFileName).LowerCase()){ StatusBar->Panels->Items[1]->Text=IntToStr(Count++); StatusBar->Repaint(); } } else { AnsiString str; switch(FileFormat){ case FILE_PCX: str=".pcx"; break; case FILE_TIF: str=".tif"; break; case FILE_TGA: str=".tga"; break; case FILE_BMP: str=".bmp"; break; case FILE_JFIF: str=".jpg"; break; /*case FILE_EPS: str=".eps"; break; case FILE_RAS: str=".ras"; break;*/ case FILE_PCT: str=".pct"; break; case FILE_PNG: str=".png"; break; case FILE_PSD: str=".psd"; break; default: str=""; break; } if(str == ExtractFileExt(fd.cFileName).LowerCase()){ StatusBar->Panels->Items[1]->Text=IntToStr(Count++); StatusBar->Repaint(); } } } bRet=FindNextFile(hFind, &fd); } FindClose(hFind); } //--------------------------------------------------------------------------- void __fastcall TMain_F::s_convert(AnsiString curDir, int FileFormat, TFunction func, bool sub, bool to256) { WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile((curDir+"\\*.*").c_str(),&fd); bool bRet=true; while(hFind!=INVALID_HANDLE_VALUE&&bRet) { if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && fd.cFileName[0] != '.') { if(sub) s_convert(curDir+"\\"+ExtractFileName(AnsiString(fd.cFileName)), FileFormat, func, sub, to256); } else { if(func==fnT2X){ if(AnsiString(".tex") == ExtractFileExt(fd.cFileName).LowerCase() ||AnsiString(".tfc") == ExtractFileExt(fd.cFileName).LowerCase()){ convert(curDir+"\\"+ExtractFileName(AnsiString(fd.cFileName)), FileFormat, func, to256); StatusBar->Panels->Items[1]->Text=IntToStr(Count++)+"/"+Total; StatusBar->Repaint(); } } else { AnsiString str; switch(FileFormat){ case FILE_PCX: str=".pcx"; break; case FILE_TIF: str=".tif"; break; case FILE_TGA: str=".tga"; break; case FILE_BMP: str=".bmp"; break; case FILE_JFIF: str=".jpg"; break; /*case FILE_EPS: str=".eps"; break; case FILE_RAS: str=".ras"; break;*/ case FILE_PCT: str=".pct"; break; case FILE_PNG: str=".png"; break; case FILE_PSD: str=".psd"; break; default: str=""; break; } if(str == ExtractFileExt(fd.cFileName).LowerCase()){ convert(curDir+"\\"+ExtractFileName(AnsiString(fd.cFileName)), FileFormat, func, to256); StatusBar->Panels->Items[1]->Text=IntToStr(Count++)+"/"+Total; StatusBar->Repaint(); } } } bRet=FindNextFile(hFind, &fd); } FindClose(hFind); StatusBar->Panels->Items[0]->Text="OK."; } //--------------------------------------------------------------------------- void __fastcall TMain_F::convert(AnsiString fn, int FileFormat, TFunction func, bool to256) { if(func==fnT2X){ RGBQUAD rgb[256]; HANDLE hFile = INVALID_HANDLE_VALUE; TEXPIAFILEHEADER tpfh; AnsiString odn, fne, ofe; char strofn[256]; odn = ExtractFileDir(fn); ofe = ExtractFileExt(fn); fne = ExtractFileName(fn); hFile = CreateFile(fn.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); LoadFromTexpiaFile(hFile, pal, tpfh, bm); CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; if(to256){ bm->ColorResolution(8, CRF_OPTIMIZEDPALETTE, NULL, 250); } if(bm->Handle!=NULL) { strcpy(strofn,fne.c_str()); int len=strlen(strofn); for(int i=0;iPanels->Items[0]->Text=fn+ " => " +odn+"\\"+strofn; SaveBitmap(AnsiString(odn+"\\"+strofn), bm, FileFormat); } else { StatusBar->Panels->Items[0]->Text="error"; } } else if(func==fnX2T){ AnsiString oldfn=fn; LoadBitmap(fn, bm); if(to256){ bm->ColorResolution(8, CRF_OPTIMIZEDPALETTE, NULL, 250); } if(bm->BitsPerPixel==8) StrMove(StrPos(fn.c_str(), "."), ".tex", 4);//fnÀÇ È®ÀåÀÚ°¡ ¹Ù²ï´Ù else StrMove(StrPos(fn.c_str(), "."), ".tfc", 4);//fnÀÇ È®ÀåÀÚ°¡ ¹Ù²ï´Ù StatusBar->Panels->Items[0]->Text=oldfn+ " => " +fn; SaveToFile(fn); } Update(); } //--------------------------------------------------------------------------- TPException __fastcall TMain_F::SaveToFile(AnsiString fn, TCompressMethod cm) { HANDLE hFile = INVALID_HANDLE_VALUE; TEXPIAFILEHEADER tpfh; TRect src; RGBQUAD rgb[256]; Byte c[256], *sp; TTexpiaBitmap *tag = NULL, *tb = NULL; DWORD dwWrite; WORD bpp; TPException ec = EC_NONE; TPCanvasInfor ci; ci.Orientation = coPortrait; ci.DotsPerInch = bm->DotsPerInch; // By GreenFish ci.SetSize(cstFree, bm->Width, bm->Height); if (bm->BitsPerPixel==8) {//À̰úÁ¤Àº ´Ù¸¥ ºñÆ®¸Ê Æ÷¸Ë¿¡¼­ tex Æ÷¸äÀ¸·Î º¯°æÇÒ ¶§ ¾²ÀÌ´Â ÄÚµå bm->GetColors(0, 256, rgb); pal->SetNormal(0, 0, 0, 0); for (int x = 0; x < 250; x++) { pal->SetNormal(x+2, rgb[x].rgbRed, rgb[x].rgbGreen, rgb[x].rgbBlue); } pal->SetNormal(255, 255, 255, 255); pal->ToRGBQUAD(rgb, 256); bm->PutColors(0, 256, rgb); memset(c, 0, 256); bm->StartScanLine(); for (int y=0; yHeight; y++) { sp = bm->GetScanLine(y); for (int x=0; xWidth; x++, sp++) { *sp=*sp+2; c[*sp] = 1; } bm->PutScanLine(y); } bm->StopScanLine(); for (int x=251; x>=1; x--) { if (c[x]==1) { pal->UseColor = x; break; } } } 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 = ci; tpfh.BitsPerPixel = bm->BitsPerPixel; tpfh.Compress = cm; src.Left = 0; src.Top = 0; src.Right = bm->Width; src.Bottom = bm->Height; if ((tag = new TTexpiaBitmap) == NULL) { ec = EC_MEMORY_LACK; goto fail; } MakeTexpiaTag(tag, bm, src, 0); if (!SaveToTexpiaFile(hFile, pal, tpfh, tag, bm)) goto fail; CloseHandle(hFile); delete tag; return ec; fail: if (tb) delete tb; if (tag) delete tag; if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (ec == EC_NONE) ec = EC_FILE_NOT_WRITE; return ec; } //--------------------------------------------------------------------------- bool __fastcall TMain_F::SaveBitmap(AnsiString FileName, TTexpiaBitmap *bm, int FileFormat) { bool ret=true; if(FILE_JFIF==FileFormat){ ret=bm->SaveToFile(FileName, FileFormat, 2);//2´Â ¹«¼Õ½Ç } else { ret=bm->SaveToFile(FileName, FileFormat); } if (!ret) StatusBar->Panels->Items[0]->Text="an error! while saving the file " +FileName; return ret; } //--------------------------------------------------------------------------- bool __fastcall TMain_F::LoadBitmap(AnsiString FileName, TTexpiaBitmap *bm) { return bm->LoadFromFile(FileName); } //--------------------------------------------------------------------------- void __fastcall TMain_F::FormCreate(TObject *Sender) { bm = new TTexpiaBitmap; pal = new TPalette; } //--------------------------------------------------------------------------- void __fastcall TMain_F::FormDestroy(TObject *Sender) { delete pal; delete bm; } //--------------------------------------------------------------------------- void __fastcall TMain_F::sbt2oClick(TObject *Sender) { int format=3; switch(rgFormat->ItemIndex){ case 0: format=1; break; //PCX, = 1 { ZSoft PCX } case 1: format=3; break; //TIF, = 3 { Tagged Image File Format } case 2: format=4; break; //TGA, = 4 { Targa } case 3: format=6; break; //BMP, = 6 { Windows BMP } case 4: format=10; break; //JPG, = 10 { Jpeg File Interchange Format } case 5: format=56; break; //PCT, = 56 { Macintosh PICT } case 6: format=75; break; //PNG, = 75 { Portable Network Graphic } case 7: format=76; break; //PSD, = 76 { Photoshop } //case 8: format=16; break; //EPS, = 16 { Encapsulated Post Script } //¾ÈµÇ´Â µí.. //case 9: format=55; break; //RAS, = 55 { SUN Raster } //È­ÀÏÀÌ ±úÁü } Count = 0; s_count(DirectoryEdit->Text, format, fnT2X, cbSubDirectory->Checked); Total = IntToStr(Count); Count = 0; s_convert(DirectoryEdit->Text, format, fnT2X, cbSubDirectory->Checked, cbAlways256->Checked); Beep(0x0FFF, 500); } //--------------------------------------------------------------------------- void __fastcall TMain_F::sbo2tClick(TObject *Sender) { int format=3; switch(rgFormat->ItemIndex){ case 0: format=1; break; //PCX, = 1 { ZSoft PCX } case 1: format=3; break; //TIF, = 3 { Tagged Image File Format } case 2: format=4; break; //TGA, = 4 { Targa } case 3: format=6; break; //BMP, = 6 { Windows BMP } case 4: format=10; break; //JPG, = 10 { Jpeg File Interchange Format } case 5: format=56; break; //PCT, = 56 { Macintosh PICT } case 6: format=75; break; //PNG, = 75 { Portable Network Graphic } case 7: format=76; break; //PSD, = 76 { Photoshop } //case 8: format=16; break; //EPS, = 16 { Encapsulated Post Script } //¾ÈµÇ´Â µí.. //case 9: format=55; break; //RAS, = 55 { SUN Raster } //È­ÀÏÀÌ ±úÁü } Count = 0; s_count(DirectoryEdit->Text, format, fnX2T, cbSubDirectory->Checked); Total = IntToStr(Count); Count = 0; s_convert(DirectoryEdit->Text, format, fnX2T, cbSubDirectory->Checked, cbAlways256->Checked); Beep(0x0FFF, 500); } //---------------------------------------------------------------------------