static void pesWriteEmbOneSection(EmbPattern* pattern, FILE* file) { /* TODO: pointer safety */ int i; int hoopHeight = 1800, hoopWidth = 1300; EmbRect bounds; binaryWriteShort(file, 0x07); /* string length */ binaryWriteBytes(file, "CEmbOne", 7); bounds = embPattern_calcBoundingBox(pattern); binaryWriteShort(file, 0); binaryWriteShort(file, 0); binaryWriteShort(file, 0); binaryWriteShort(file, 0); binaryWriteShort(file, 0); binaryWriteShort(file, 0); binaryWriteShort(file, 0); binaryWriteShort(file, 0); /* AffineTransform */ binaryWriteFloat(file, 1.0f); binaryWriteFloat(file, 0.0f); binaryWriteFloat(file, 0.0f); binaryWriteFloat(file, 1.0f); binaryWriteFloat(file, (float)((embRect_width(bounds) - hoopWidth) / 2)); binaryWriteFloat(file, (float)((embRect_height(bounds) + hoopHeight) / 2)); binaryWriteShort(file, 1); binaryWriteShort(file, 0); /* Translate X */ binaryWriteShort(file, 0); /* Translate Y */ binaryWriteShort(file, (short)embRect_width(bounds)); binaryWriteShort(file, (short)embRect_height(bounds)); for(i = 0; i < 8; i++) { binaryWriteByte(file, 0); } /*WriteSubObjects(br, pes, SubBlocks); */ }
void embPattern_center(EmbPattern* p) { /* TODO: review this. currently not used in anywhere. Also needs to handle various design objects */ int moveLeft, moveTop; EmbRect boundingRect; EmbStitchList* pointer = 0; if(!p) { embLog_error("emb-pattern.c embPattern_center(), p argument is null\n"); return; } boundingRect = embPattern_calcBoundingBox(p); moveLeft = (int)(boundingRect.left - (embRect_width(boundingRect) / 2.0)); moveTop = (int)(boundingRect.top - (embRect_height(boundingRect) / 2.0)); pointer = p->stitchList; while(pointer) { EmbStitch s; s = pointer->stitch; s.xx -= moveLeft; s.yy -= moveTop; } }
void embPattern_center(EmbPattern* p) { /* TODO: pointer safety */ /* TODO: review this. currently not used in anywhere. Also needs to handle various design objects */ int moveLeft, moveTop; EmbRect boundingRect; EmbStitchList* pointer = 0; boundingRect = embPattern_calcBoundingBox(p); moveLeft = (int)(boundingRect.left - (embRect_width(boundingRect) / 2.0)); moveTop = (int)(boundingRect.top - (embRect_height(boundingRect) / 2.0)); pointer = p->stitchList; while(pointer) { EmbStitch s; s = pointer->stitch; s.xx -= moveLeft; s.yy -= moveTop; } }
void writePecStitches(EmbPattern* pattern, EmbFile* file, const char* fileName) { EmbStitchList* tempStitches = 0; EmbRect bounds; unsigned char image[38][48]; int i, flen, currentThreadCount, graphicsOffsetLocation, graphicsOffsetValue, height, width; double xFactor, yFactor; const char* forwardSlashPos = strrchr(fileName, '/'); const char* backSlashPos = strrchr(fileName, '\\'); const char* dotPos = strrchr(fileName, '.'); const char* start = 0; if(!pattern) { embLog_error("format-pec.c writePecStitches(), pattern argument is null\n"); return; } if(!file) { embLog_error("format-pec.c writePecStitches(), file argument is null\n"); return; } if(!fileName) { embLog_error("format-pec.c writePecStitches(), fileName argument is null\n"); return; } if(forwardSlashPos) { start = forwardSlashPos + 1; } if(backSlashPos && backSlashPos > start) { start = backSlashPos + 1; } if(!start) { start = fileName; } binaryWriteBytes(file, "LA:", 3); flen = (int)(dotPos - start); while(start < dotPos) { binaryWriteByte(file, (unsigned char)*start); start++; } for(i = 0; i < (int)(16-flen); i++) { binaryWriteByte(file, (unsigned char)0x20); } binaryWriteByte(file, 0x0D); for(i = 0; i < 12; i++) { binaryWriteByte(file, (unsigned char)0x20); } binaryWriteByte(file, (unsigned char)0xFF); binaryWriteByte(file, (unsigned char)0x00); binaryWriteByte(file, (unsigned char)0x06); binaryWriteByte(file, (unsigned char)0x26); for(i = 0; i < 12; i++) { binaryWriteByte(file, (unsigned char)0x20); } currentThreadCount = embThreadList_count(pattern->threadList); binaryWriteByte(file, (unsigned char)(currentThreadCount-1)); for(i = 0; i < currentThreadCount; i++) { binaryWriteByte(file, (unsigned char)embThread_findNearestColorInArray(embThreadList_getAt(pattern->threadList, i).color, (EmbThread*)pecThreads, pecThreadCount)); } for(i = 0; i < (int)(0x1CF - currentThreadCount); i++) { binaryWriteByte(file, (unsigned char)0x20); } binaryWriteShort(file, (short)0x0000); graphicsOffsetLocation = embFile_tell(file); /* placeholder bytes to be overwritten */ binaryWriteByte(file, (unsigned char)0x00); binaryWriteByte(file, (unsigned char)0x00); binaryWriteByte(file, (unsigned char)0x00); binaryWriteByte(file, (unsigned char)0x31); binaryWriteByte(file, (unsigned char)0xFF); binaryWriteByte(file, (unsigned char)0xF0); bounds = embPattern_calcBoundingBox(pattern); height = roundDouble(embRect_height(bounds)); width = roundDouble(embRect_width(bounds)); /* write 2 byte x size */ binaryWriteShort(file, (short)width); /* write 2 byte y size */ binaryWriteShort(file, (short)height); /* Write 4 miscellaneous int16's */ binaryWriteShort(file, (short)0x1E0); binaryWriteShort(file, (short)0x1B0); binaryWriteUShortBE(file, (unsigned short)(0x9000 | -roundDouble(bounds.left))); binaryWriteUShortBE(file, (unsigned short)(0x9000 | -roundDouble(bounds.top))); pecEncode(file, pattern); graphicsOffsetValue = embFile_tell(file) - graphicsOffsetLocation + 2; embFile_seek(file, graphicsOffsetLocation, SEEK_SET); binaryWriteByte(file, (unsigned char)(graphicsOffsetValue & 0xFF)); binaryWriteByte(file, (unsigned char)((graphicsOffsetValue >> 8) & 0xFF)); binaryWriteByte(file, (unsigned char)((graphicsOffsetValue >> 16) & 0xFF)); embFile_seek(file, 0x00, SEEK_END); /* Writing all colors */ clearImage(image); tempStitches = pattern->stitchList; yFactor = 32.0 / height; xFactor = 42.0 / width; while(tempStitches->next) { int x = roundDouble((tempStitches->stitch.xx - bounds.left) * xFactor) + 3; int y = roundDouble((tempStitches->stitch.yy - bounds.top) * yFactor) + 3; image[y][x] = 1; tempStitches = tempStitches->next; } writeImage(file, image); /* Writing each individual color */ tempStitches = pattern->stitchList; for(i = 0; i < currentThreadCount; i++) { clearImage(image); while(tempStitches->next) { int x = roundDouble((tempStitches->stitch.xx - bounds.left) * xFactor) + 3; int y = roundDouble((tempStitches->stitch.yy - bounds.top) * yFactor) + 3; if(tempStitches->stitch.flags & STOP) { tempStitches = tempStitches->next; break; } image[y][x] = 1; tempStitches = tempStitches->next; } writeImage(file, image); } }
int writeXxx(EmbPattern* pattern, const char* fileName) { FILE* file = 0; int i; EmbRect rect; int endOfStitches; EmbThreadList* colors; int curColor = 0; if(!pattern) { embLog_error("format-xxx.c writeXxx(), pattern argument is null\n"); return 0; } if(!fileName) { embLog_error("format-xxx.c writeXxx(), fileName argument is null\n"); return 0; } embPattern_correctForMaxStitchLength(pattern, 124, 127); file = fopen(fileName, "wb"); if(!file) { embLog_error("format-xxx.c writeXxx(), cannot open %s for writing\n", fileName); return 0; } for(i = 0; i < 0x17; i++) { binaryWriteByte(file, 0x00); } binaryWriteUInt(file, (unsigned int) embStitchList_count(pattern->stitchList)); for(i = 0; i < 0x0C; i++) { binaryWriteByte(file, 0x00); } binaryWriteUShort(file, (unsigned short)embThreadList_count(pattern->threadList)); binaryWriteShort(file, 0x0000); rect = embPattern_calcBoundingBox(pattern); binaryWriteShort(file, (short)(embRect_width(rect) * 10.0)); binaryWriteShort(file, (short)(embRect_height(rect) * 10.0)); binaryWriteShort(file, (short)(embRect_width(rect) / 2.0 * 10)); /*TODO: xEnd from start point x=0 */ binaryWriteShort(file, (short)(embRect_height(rect) / 2.0 * 10)); /*TODO: yEnd from start point y=0 */ binaryWriteShort(file, (short)(embRect_width(rect)/2.0 * 10)); /*TODO: left from start x = 0 */ binaryWriteShort(file, (short)(embRect_height(rect)/2.0 * 10)); /*TODO: bottom from start y = 0 */ for(i = 0; i < 0xC5; i++) { binaryWriteByte(file, 0x00); } binaryWriteInt(file, 0x0000); /* place holder for end of stitches */ xxxEncodeDesign(file, pattern); endOfStitches = ftell(file); fseek(file, 0xFC, SEEK_SET); binaryWriteUInt(file, endOfStitches); fseek(file, 0, SEEK_END); binaryWriteByte(file, 0x7F); /* is this really correct? */ binaryWriteByte(file, 0x7F); binaryWriteByte(file, 0x03); binaryWriteByte(file, 0x14); binaryWriteByte(file, 0x00); binaryWriteByte(file, 0x00); colors = pattern->threadList; while(colors) { binaryWriteByte(file, 0x00); binaryWriteByte(file, colors->thread.color.r); binaryWriteByte(file, colors->thread.color.g); binaryWriteByte(file, colors->thread.color.b); curColor++; colors = colors->next; } for(i = 0; i < (22 - curColor); i++) { binaryWriteUInt(file, 0x01000000); } binaryWriteByte(file, 0x00); binaryWriteByte(file, 0x01); fclose(file); return 1; }
/*! Writes the data from \a pattern to a file with the given \a fileName. * Returns \c true if successful, otherwise returns \c false. */ int writeCsv(EmbPattern* pattern, const char* fileName) { FILE* file = 0; EmbStitchList* sList = 0; EmbThreadList* tList = 0; EmbRect boundingRect; int i = 0; int stitchCount = 0; int threadCount = 0; if(!pattern) { embLog_error("format-csv.c writeCsv(), pattern argument is null\n"); return 0; } if(!fileName) { embLog_error("format-csv.c writeCsv(), fileName argument is null\n"); return 0; } sList = pattern->stitchList; stitchCount = embStitchList_count(sList); tList = pattern->threadList; threadCount = embThreadList_count(tList); boundingRect = embPattern_calcBoundingBox(pattern); if(!stitchCount) { embLog_error("format-csv.c writeCsv(), pattern contains no stitches\n"); return 0; } /* Check for an END stitch and add one if it is not present */ if(pattern->lastStitch->stitch.flags != END) { embPattern_addStitchRel(pattern, 0, 0, END, 1); stitchCount++; } file = fopen(fileName, "w"); if(!file) { embLog_error("format-csv.c writeCsv(), cannot open %s for writing\n", fileName); return 0; } /* write header */ fprintf(file, "\"#\",\"Embroidermodder 2 CSV Embroidery File\"\n"); fprintf(file, "\"#\",\"http://embroidermodder.github.io\"\n"); fprintf(file, "\n"); fprintf(file, "\"#\",\"General Notes:\"\n"); fprintf(file, "\"#\",\"This file can be read by Excel or LibreOffice as CSV (Comma Separated Value) or with a text editor.\"\n"); fprintf(file, "\"#\",\"Lines beginning with # are comments.\"\n"); fprintf(file, "\"#\",\"Lines beginning with > are variables: [VAR_NAME], [VAR_VALUE]\"\n"); fprintf(file, "\"#\",\"Lines beginning with $ are threads: [THREAD_NUMBER], [RED], [GREEN], [BLUE], [DESCRIPTION], [CATALOG_NUMBER]\"\n"); fprintf(file, "\"#\",\"Lines beginning with * are stitch entries: [STITCH_TYPE], [X], [Y]\"\n"); fprintf(file, "\n"); fprintf(file, "\"#\",\"Stitch Entry Notes:\"\n"); fprintf(file, "\"#\",\"STITCH instructs the machine to move to the position [X][Y] and then make a stitch.\"\n"); fprintf(file, "\"#\",\"JUMP instructs the machine to move to the position [X][Y] without making a stitch.\"\n"); fprintf(file, "\"#\",\"TRIM instructs the machine to cut the thread before moving to the position [X][Y] without making a stitch.\"\n"); fprintf(file, "\"#\",\"COLOR instructs the machine to stop temporarily so that the user can change to a different color thread before resuming.\"\n"); fprintf(file, "\"#\",\"END instructs the machine that the design is completed and there are no further instructions.\"\n"); fprintf(file, "\"#\",\"UNKNOWN encompasses instructions that may not be supported currently.\"\n"); fprintf(file, "\"#\",\"[X] and [Y] are absolute coordinates in millimeters (mm).\"\n"); fprintf(file, "\n"); /* write variables */ fprintf(file,"\"#\",\"[VAR_NAME]\",\"[VAR_VALUE]\"\n"); fprintf(file, "\">\",\"STITCH_COUNT:\",\"%u\"\n", (unsigned int)stitchCount); fprintf(file, "\">\",\"THREAD_COUNT:\",\"%u\"\n", (unsigned int)threadCount); fprintf(file, "\">\",\"EXTENTS_LEFT:\",\"%f\"\n", boundingRect.left); fprintf(file, "\">\",\"EXTENTS_TOP:\",\"%f\"\n", boundingRect.top); fprintf(file, "\">\",\"EXTENTS_RIGHT:\",\"%f\"\n", boundingRect.right); fprintf(file, "\">\",\"EXTENTS_BOTTOM:\",\"%f\"\n", boundingRect.bottom); fprintf(file, "\">\",\"EXTENTS_WIDTH:\",\"%f\"\n", embRect_width(boundingRect)); fprintf(file, "\">\",\"EXTENTS_HEIGHT:\",\"%f\"\n", embRect_height(boundingRect)); fprintf(file,"\n"); /* write colors */ fprintf(file, "\"#\",\"[THREAD_NUMBER]\",\"[RED]\",\"[GREEN]\",\"[BLUE]\",\"[DESCRIPTION]\",\"[CATALOG_NUMBER]\"\n"); i = 1; while(tList) { fprintf(file, "\"$\",\"%d\",\"%d\",\"%d\",\"%d\",\"%s\",\"%s\"\n", i, /* TODO: fix segfault that backtraces here when libembroidery-convert from dst to csv. */ (int)tList->thread.color.r, (int)tList->thread.color.g, (int)tList->thread.color.b, tList->thread.description, tList->thread.catalogNumber); i++; tList = tList->next; } fprintf(file, "\n"); /* write stitches */ fprintf(file, "\"#\",\"[STITCH_TYPE]\",\"[X]\",\"[Y]\"\n"); while(sList) { EmbStitch s = sList->stitch; fprintf(file, "\"*\",\"%s\",\"%f\",\"%f\"\n", csvStitchFlagToStr(s.flags), s.xx, s.yy); sList = sList->next; } fclose(file); return 1; }