forked from Embroidermodder/libembroidery
-
Notifications
You must be signed in to change notification settings - Fork 0
/
format-pcs.c
135 lines (119 loc) · 4.15 KB
/
format-pcs.c
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
static double pcsDecode(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 pcsEncode(EmbFile* file, int dx, int dy, int flags)
{
unsigned char flagsToWrite = 0;
if (!file) {
embLog("ERROR: format-pcs.c pcsEncode(), file argument is null\n");
return;
}
binaryWriteByte(file, (unsigned char)0);
binaryWriteByte(file, (unsigned char)(dx & 0xFF));
binaryWriteByte(file, (unsigned char)((dx >> 8) & 0xFF));
binaryWriteByte(file, (unsigned char)((dx >> 16) & 0xFF));
binaryWriteByte(file, (unsigned char)0);
binaryWriteByte(file, (unsigned char)(dy & 0xFF));
binaryWriteByte(file, (unsigned char)((dy >> 8) & 0xFF));
binaryWriteByte(file, (unsigned char)((dy >> 16) & 0xFF));
if (flags & STOP) {
flagsToWrite |= 0x01;
}
if (flags & TRIM) {
flagsToWrite |= 0x04;
}
binaryWriteByte(file, flagsToWrite);
}
/*! Reads a file with the given \a fileName and loads the data into \a pattern.
* Returns \c true if successful, otherwise returns \c false. */
static int readPcs(EmbPattern* pattern, EmbFile* file, const char* fileName)
{
char allZeroColor = 1;
int i = 0;
unsigned char b[9];
double dx = 0, dy = 0;
int flags = 0, st = 0;
unsigned char version, hoopSize;
unsigned short colorCount;
version = binaryReadByte(file);
hoopSize = binaryReadByte(file); /* 0 for PCD, 1 for PCQ (MAXI), 2 for PCS with small hoop(80x80), */
/* and 3 for PCS with large hoop (115x120) */
switch (hoopSize) {
case 2:
pattern->hoop.width = 80.0;
pattern->hoop.height = 80.0;
break;
case 3:
pattern->hoop.width = 115;
pattern->hoop.height = 120.0;
break;
}
colorCount = binaryReadUInt16(file);
for (i = 0; i < colorCount; i++) {
EmbThread t;
t.color.r = binaryReadByte(file);
t.color.g = binaryReadByte(file);
t.color.b = binaryReadByte(file);
t.catalogNumber = "";
t.description = "";
if (t.color.r || t.color.g || t.color.b) {
allZeroColor = 0;
}
embPattern_addThread(pattern, t);
binaryReadByte(file);
}
if (allZeroColor)
embPattern_loadExternalColorFile(pattern, fileName);
st = binaryReadUInt16(file);
/* READ STITCH RECORDS */
for (i = 0; i < st; i++) {
flags = NORMAL;
if (embFile_read(b, 1, 9, file) != 9)
break;
if (b[8] & 0x01) {
flags = STOP;
} else if (b[8] & 0x04) {
flags = TRIM;
} else if (b[8] != 0) {
/* TODO: ONLY INTERESTED IN THIS CASE TO LEARN MORE ABOUT THE FORMAT */
}
dx = pcsDecode(b[1], b[2], b[3]);
dy = pcsDecode(b[5], b[6], b[7]);
embPattern_addStitchAbs(pattern, dx / 10.0, dy / 10.0, flags, 1);
}
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. */
static int writePcs(EmbPattern* pattern, EmbFile* file, const char* fileName)
{
EmbStitch st;
int i = 0;
unsigned char colorCount = 0;
binaryWriteByte(file, (unsigned char)'2');
binaryWriteByte(file, 3); /* TODO: select hoop size defaulting to Large PCS hoop */
colorCount = (unsigned char)pattern->threads->count;
binaryWriteUShort(file, (unsigned short)colorCount);
for (i = 0; i < colorCount; i++) {
EmbColor color = pattern->threads->thread[i].color;
binaryWriteByte(file, color.r);
binaryWriteByte(file, color.g);
binaryWriteByte(file, color.b);
binaryWriteByte(file, 0);
}
for (; i < 16; i++) {
binaryWriteUInt(file, 0); /* write remaining colors to reach 16 */
}
binaryWriteUShort(file, (unsigned short)pattern->stitchList->count);
/* write stitches */
for (i = 0; i < pattern->stitchList->count; i++) {
st = pattern->stitchList->stitch[i];
pcsEncode(file, roundDouble(st.x * 10.0), roundDouble(st.y * 10.0), st.flags);
}
return 1;
}