1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#include "format-max.h"
#include "format-pcd.h"
#include "emb-file.h"
#include "emb-logging.h"
#include "helpers-binary.h"
#include "helpers-misc.h"
/* Pfaff MAX embroidery file format */
static double maxDecode(unsigned char a1, unsigned char a2, unsigned char a3)
{
int res = a1 + (a2 << 8) + (a3 << 16);
if(res > 0x7FFFFF)
{
return (-((~(res) & 0x7FFFFF) - 1));
}
return res;
}
static void maxEncode(EmbFile* file, int x, int y)
{
if(!file) { embLog_error("format-max.c maxEncode(), file argument is null\n"); return; }
binaryWriteByte(file, (unsigned char)0);
binaryWriteByte(file, (unsigned char)(x & 0xFF));
binaryWriteByte(file, (unsigned char)((x >> 8) & 0xFF));
binaryWriteByte(file, (unsigned char)((x >> 16) & 0xFF));
binaryWriteByte(file, (unsigned char)0);
binaryWriteByte(file, (unsigned char)(y & 0xFF));
binaryWriteByte(file, (unsigned char)((y >> 8) & 0xFF));
binaryWriteByte(file, (unsigned char)((y >> 16) & 0xFF));
}
/*! Reads a file with the given \a fileName and loads the data into \a pattern.
* Returns \c true if successful, otherwise returns \c false. */
int readMax(EmbPattern* pattern, const char* fileName)
{
int i = 0;
unsigned char b[8];
double dx = 0, dy = 0;
int flags = 0;
int stitchCount;
EmbFile* file = 0;
if(!pattern) { embLog_error("format-max.c readMax(), pattern argument is null\n"); return 0; }
if(!fileName) { embLog_error("format-max.c readMax(), fileName argument is null\n"); return 0; }
file = embFile_open(fileName, "rb");
if(!file)
{
embLog_error("format-max.c readMax(), cannot open %s for reading\n", fileName);
return 0;
}
embFile_seek(file, 0xD5, SEEK_SET);
stitchCount = binaryReadUInt32(file);
/* READ STITCH RECORDS */
for(i = 0; i < stitchCount; i++)
{
flags = NORMAL;
if(embFile_read(b, 1, 8, file) != 8)
break;
dx = maxDecode(b[0], b[1], b[2]);
dy = maxDecode(b[4], b[5], b[6]);
embPattern_addStitchAbs(pattern, dx / 10.0, dy / 10.0, flags, 1);
}
embFile_close(file);
/* 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);
embPattern_flipVertical(pattern);
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 writeMax(EmbPattern* pattern, const char* fileName)
{
EmbFile* file = 0;
EmbStitchList* pointer = 0;
char header[] = {
0x56,0x43,0x53,0x4D,0xFC,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0xF6,0x25,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,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,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,0x00,0x00,0x00,0x00,0x00,0x31,0x33,0x37,0x38,
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,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x61,0x64,0x65,0x69,0x72,0x61,0x20,
0x52,0x61,0x79,0x6F,0x6E,0x20,0x34,0x30,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,0x38,0x09,0x31,0x33,0x30,0x2F,0x37,0x30,0x35,0x20,0x48,0xFA,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00 };
if(!pattern) { embLog_error("format-max.c writeMax(), pattern argument is null\n"); return 0; }
if(!fileName) { embLog_error("format-max.c writeMax(), fileName argument is null\n"); return 0; }
if(!embStitchList_count(pattern->stitchList))
{
embLog_error("format-max.c writeMax(), 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);
file = embFile_open(fileName, "wb");
if(!file)
{
embLog_error("format-max.c writeMax(), cannot open %s for writing\n", fileName);
return 0;
}
binaryWriteBytes(file, header, 0xD5);
pointer = pattern->stitchList;
while(pointer)
{
maxEncode(file, roundDouble(pointer->stitch.xx * 10.0), roundDouble(pointer->stitch.yy * 10.0));
pointer = pointer->next;
}
embFile_close(file);
return 1;
}
/* kate: bom off; indent-mode cstyle; indent-width 4; replace-trailing-space-save on; */
|