//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "KnitData.h" #include "common.h" #include "Exception.h" #include "File.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- mark_stitch Smark[MS_CNT+1] = { { {"FRONT", true, 1, 3}, NULL }, { {"BACK", true, 1, 3}, NULL }, { {"MISS", true, 1, 3}, NULL }, { {"CIRCLE", true, 1, 3}, NULL } }; mark_chart Cmark; //--------------------------------------------------------------------------- /* __fastcall smd::smd() { } //--------------------------------------------------------------------------- __fastcall smd::~smd() { ::doDestroy(mname); ::doDestroy(micon); ::doDestroy(move); ::doDestroy(fix); for (int i=0; i<8; i++) ::doDestroy(bent[i]); } */ //--------------------------------------------------------------------------- void __fastcall smd::Delete() { if (mname) delete mname; if (micon) delete micon; if (move) delete move; if (fix) delete fix; if (bent) for (int i=0; i<8; i++) delete bent[i]; } //--------------------------------------------------------------------------- bool __fastcall smd::SaveToFile(HANDLE fh) { // } //--------------------------------------------------------------------------- bool __fastcall smd::SaveToFile(AnsiString fn, bool bname) { char *m; short i, j, ssize[2]; int k, s, ec = EC_NONE; FILE *ofp = NULL; AnsiString dn; RGBQUAD rgb[256]; Byte *IP, *DP, mm, temp; TTexpiaBitmap *Bitmap = micon->Bitmap; ofp = fopen(fn.c_str(), "wb"); if (ofp == NULL) { ec = EC_FILE_NOT_OPEN; goto fail; } if (bname) fwrite(mname, 20, 1, ofp); fwrite(&wale, 2, 1, ofp); fwrite(&course, 2, 1, ofp); fwrite(move, wale*course, sizeof(Axis), ofp); ssize[0] = wale*16-1; ssize[1] = course*16-1; k = ((ssize[0]>>3)+1)*ssize[1]; if (!Bitmap->StartScanLine()) goto fail; for (int y = 0; y < Bitmap->Height; y++) { IP = Bitmap->GetScanLine(y); mm = 0x80; temp = 0x00; for (int x = 0; x < Bitmap->Width; x++, IP++) { if (*IP == 255) { temp |= mm; } else if (*IP == 0) { temp &= ~mm; } if (mm == 1) { fwrite(&temp, 1, 1, ofp); mm = 0x80; temp = 0x00; } else { mm >>= 1; } } fwrite(&temp, 1, 1, ofp); Bitmap->PutScanLine(y); } Bitmap->StopScanLine(); fwrite(&size, 2, 2, ofp); fwrite(&start, 2, 2, ofp); k = size.x*size.y; fwrite(fix, k, 1, ofp); for (j=0; j<8; j++) { fwrite(bent[j], sizeof(double), k, ofp); } fclose(ofp); ofp = NULL; return true; fail: if (ofp) fclose(ofp); EXCEPTION_MESSAGE_OK(ec); return false; } //--------------------------------------------------------------------------- bool __fastcall smd::LoadFromFile(HANDLE fh) { // } //--------------------------------------------------------------------------- bool __fastcall smd::LoadFromFile(AnsiString fn, bool bname) { char *m; short i, j, ssize[2]; int k, s, ec = EC_NONE; FILE *ifp = NULL; AnsiString dn; RGBQUAD rgb[256]; Byte *IP, *DP, mm, temp; rgb[0].rgbRed = rgb[0].rgbGreen = rgb[0].rgbBlue = 0; rgb[255].rgbRed = rgb[255].rgbGreen = rgb[255].rgbBlue = 255; ifp = fopen(fn.c_str(), "rb"); if (ifp == NULL) { ec = EC_FILE_NOT_OPEN; goto fail; } mname = new char[20]; if (bname) fread(mname, 20, 1, ifp); mname[StrLen(mname)-1] = 0; use = false; fread(&wale, 2, 1, ifp); fread(&course, 2, 1, ifp); move = new Axis[wale*course]; fread(move, wale*course, sizeof(Axis), ifp); ssize[0] = wale*16-1; ssize[1] = course*16-1; k = ((ssize[0]>>3)+1)*ssize[1]; m = new char[k]; fread(m, k, 1, ifp); if ((micon = new TPStitchData) == NULL) { ec = EC_MEMORY_LACK; goto fail; }; if ((micon->Create(ssize[0], ssize[1], 8, rgb)) == false) { ec = EC_MEMORY_LACK; goto fail; }; // Cmark.data[i].micon->Create(size[0], size[1], 1); micon->DrawMark(m); delete m; fread(&size, 2, 2, ifp); fread(&start, 2, 2, ifp); k = size.x*size.y; fix = new char[k]; fread(fix, k, 1, ifp); for (j=0; j<8; j++) { bent[j] = new double[k]; fread(bent[j], sizeof(double), k, ifp); } fclose(ifp); ifp = NULL; return true; fail: if (ifp) fclose(ifp); EXCEPTION_MESSAGE_OK(ec); return false; } //--------------------------------------------------------------------------- bool __fastcall read_stitch_data() { HANDLE hFile = INVALID_HANDLE_VALUE; DWORD dwRead; int i, ec = EC_NONE, y; AnsiString fn; Byte *tp = NULL, *p; TEXPIAFILEHEADER tpfh; TPalette *pPalette = new TPalette; TTexpiaBitmap *pYarn = new TTexpiaBitmap; BYTE *Src, *Dst; /* for (i = 0; i < 2; i++) { fn = DirectoryStitch + Format("\\%s.sth", OPENARRAY(TVarRec, (Smark[i].data.mname))); if ((hFile = CreateFile(fn.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { ec = EC_FILE_NOT_OPEN; goto fail; } if ((Smark[i].stitch = new TTexpiaBitmap) == NULL) { ec = EC_MEMORY_LACK; goto fail; } if (Smark[i].stitch->Create(40, 40, 8) == false) { ec = EC_MEMORY_LACK; goto fail; } if ((tp = (Byte *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 40*40))==NULL) { ec = EC_MEMORY_LACK; goto fail; } if (!ReadFile(hFile, tp, 40 * 40, &dwRead, NULL)) goto fail; Smark[i].stitch->LoadFromMemory(tp, 40); HeapFree(GetProcessHeap(), 0, tp); tp = NULL; CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; } */ /* TODO -o k3dogs -c Knit 7.41 : ÄÚ À̹ÌÁö º¯°æ */ for (i = 0; i < 4; i++) { if (i==2) continue; fn = DirectoryStitch + Format("\\%s.sti", OPENARRAY(TVarRec, (Smark[i].data.mname))); if ((hFile = CreateFile(fn.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, pPalette, tpfh, pYarn)) != EC_NONE) goto fail; if ((Smark[i].stitch = new TTexpiaBitmap) == NULL) { ec = EC_MEMORY_LACK; goto fail; } if (Smark[i].stitch->Create(40, 40, 8) == false) { ec = EC_MEMORY_LACK; goto fail; } Smark[i].stitch->StartScanLine(); pYarn->StartScanLine(); for (int y=0; y<40; y++) { Src = pYarn->GetScanLine(39-y); Dst = Smark[i].stitch->GetScanLine(y); for (int x=0; x<40; x++, Src++, Dst++) { *Dst = *Src - 2; } Smark[i].stitch->PutScanLine(y); } Smark[i].stitch->StopScanLine(); pYarn->StopScanLine(); /* pYarn->StartScanLine(); Smark[i].stitch->LoadFromMemory(pYarn->GetScanLine(0), 40, true); pYarn->StopScanLine(); Smark[i].stitch->StartScanLine(); for (int y=0; y<40; y++) { Dst = Smark[i].stitch->GetScanLine(y); for (int x=0; x<40; x++, Dst++) { *Dst = *Dst - 2; } Smark[i].stitch->PutScanLine(y); } Smark[i].stitch->StopScanLine(); */ HeapFree(GetProcessHeap(), 0, tp); tp = NULL; CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; } if (pYarn) delete pYarn; return true; fail: for (i = 0; i < 4; i++) ::doDestroy(Smark[i].stitch); if (pYarn) delete pYarn; if (tp) HeapFree(GetProcessHeap(), 0, tp); if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); EXCEPTION_MESSAGE_OK(ec); if (ec == EC_NONE) ec = EC_FILE_NOT_READ; return false; } //--------------------------------------------------------------------------- bool __fastcall save_stitch_data(char i) { HANDLE hFile = INVALID_HANDLE_VALUE; DWORD dwWrite; int ec = EC_NONE, size; Byte *tp = NULL; AnsiString fn; fn = DirectoryStitch + Format("\\%s.sth", OPENARRAY(TVarRec, (Smark[i].data.mname))); 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; } size = Smark[i].stitch->Width * Smark[i].stitch->Height; if ((tp = (Byte *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size)) == NULL) { ec = EC_MEMORY_LACK; goto fail; } Smark[i].stitch->SaveToMemory(tp, Smark[i].stitch->Width); if (!WriteFile(hFile, tp, size, &dwWrite, NULL)) goto fail; HeapFree(GetProcessHeap(), 0, tp); CloseHandle(hFile); return true; fail: if (tp) HeapFree(GetProcessHeap(), 0, tp); if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (ec == EC_NONE) ec = EC_FILE_NOT_WRITE; EXCEPTION_MESSAGE_OK(ec); return false; } //--------------------------------------------------------------------------- void __fastcall exit_stitch_data() { for (int i = 0; i < MS_CNT+1; i++) ::doDestroy(Smark[i].stitch); } //---------------------------- Mark ------------------------------------ bool __fastcall create_mark() { char *m; char mark[3][2*15] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; short i, j, size[2]; int k, s, ec = EC_NONE; FILE *fip = NULL, *fdp = NULL; AnsiString dn, fn; RGBQUAD rgb[256]; TPMemory *temp; rgb[0].rgbRed = rgb[0].rgbGreen = rgb[0].rgbBlue = 0; rgb[255].rgbRed = rgb[255].rgbGreen = rgb[255].rgbBlue = 255; if ((Smark[MS_MISS].data.micon = new TPStitchData) == NULL) { ec = EC_MEMORY_LACK; goto fail; } if ((Smark[MS_MISS].data.micon->Create(15, 15, 8, rgb)) == false) { ec = EC_MEMORY_LACK; goto fail; } Smark[MS_MISS].data.micon->DrawMark(mark[0]); if ((Smark[MS_FRONT].data.micon = new TPStitchData) == NULL) { ec = EC_MEMORY_LACK; goto fail; } if ((Smark[MS_FRONT].data.micon->Create(15, 15, 8, rgb)) == false) { ec = EC_MEMORY_LACK; goto fail; } Smark[MS_FRONT].data.micon->DrawMark(mark[1]); if ((Smark[MS_BACK].data.micon = new TPStitchData) == NULL) { ec = EC_MEMORY_LACK; goto fail; } if ((Smark[MS_BACK].data.micon->Create(15, 15, 8, rgb)) == false) { ec = EC_MEMORY_LACK; goto fail; } Smark[MS_BACK].data.micon->DrawMark(mark[2]); fn = DirectoryStitch + "\\cross.inf"; fip = fopen(fn.c_str(), "r"); if (fip == NULL) { ec = EC_FILE_NOT_OPEN; goto fail; } fscanf(fip, "%d\n", &Cmark.cnt); Cmark.data = new smd[Cmark.cnt]; for (i = 0; i < Cmark.cnt; i++) { Cmark.data[i].mname = new char[20]; fgets(Cmark.data[i].mname, 20, fip); Cmark.data[i].mname[StrLen(Cmark.data[i].mname)-1] = 0; Cmark.data[i].use = false; fn = DirectoryStitch + Format("\\cross.%d", OPENARRAY(TVarRec, (i))); fdp = fopen(fn.c_str(), "rb"); if (fdp == NULL) { ec = EC_FILE_NOT_OPEN; goto fail; } fread(&Cmark.data[i].wale, 2, 1, fdp); fread(&Cmark.data[i].course, 2, 1, fdp); Cmark.data[i].move = new Axis[Cmark.data[i].wale*Cmark.data[i].course]; fread(Cmark.data[i].move, Cmark.data[i].wale*Cmark.data[i].course, sizeof(Axis), fdp); size[0] = Cmark.data[i].wale*16-1; size[1] = Cmark.data[i].course*16-1; k = ((size[0]>>3)+1)*size[1]; m = new char[k]; fread(m, k, 1, fdp); if ((Cmark.data[i].micon = new TPStitchData) == NULL) { ec = EC_MEMORY_LACK; goto fail; }; if ((Cmark.data[i].micon->Create(size[0], size[1], 8, rgb)) == false) { ec = EC_MEMORY_LACK; goto fail; }; // Cmark.data[i].micon->Create(size[0], size[1], 1); Cmark.data[i].micon->DrawMark(m); delete m; fread(&Cmark.data[i].size, 2, 2, fdp); fread(&Cmark.data[i].start, 2, 2, fdp); k = Cmark.data[i].size.x*Cmark.data[i].size.y; Cmark.data[i].fix = new char[k]; fread(Cmark.data[i].fix, k, 1, fdp); for (j=0; j<8; j++) { Cmark.data[i].bent[j] = new double[k]; fread(Cmark.data[i].bent[j], sizeof(double), k, fdp); } fclose(fdp); fdp = NULL; } fclose(fip); fip = NULL; return true; fail: ::doDestroy(Smark[MS_MISS].data.micon); ::doDestroy(Smark[MS_FRONT].data.micon); ::doDestroy(Smark[MS_BACK].data.micon); if (fdp) fclose(fdp); if (fip) fclose(fip); EXCEPTION_MESSAGE_OK(ec); return false; } //--------------------------------------------------------------------------- void __fastcall delete_mark() { short i, j; for (i = 0; i < MS_CNT+1; i++) { ::doDestroy(Smark[i].data.micon); } for (i=0; i