kopia lustrzana https://github.com/EmbroidePy/pyembroidery
119 wiersze
3.6 KiB
Python
119 wiersze
3.6 KiB
Python
from .EmbThread import EmbThread
|
|
from .ReadHelper import read_int_16be, read_int_8, read_int_32be, read_int_24be, read_signed, read_string_8, \
|
|
read_string_16
|
|
|
|
|
|
def read_vp3_string_16(stream):
|
|
# Reads the header strings which are 16le numbers of size followed by
|
|
# utf-16 text
|
|
string_length = read_int_16be(stream)
|
|
return read_string_16(stream, string_length)
|
|
|
|
|
|
def read_vp3_string_8(stream):
|
|
# Reads the body strings which are 16be numbers followed by utf-8 text
|
|
string_length = read_int_16be(stream)
|
|
return read_string_8(stream, string_length)
|
|
|
|
|
|
def skip_vp3_string(stream):
|
|
string_length = read_int_16be(stream)
|
|
stream.seek(string_length, 1)
|
|
|
|
|
|
def signed32(b):
|
|
b &= 0xFFFFFFFF
|
|
if b > 0x7FFFFFFF:
|
|
return - 0x100000000 + b
|
|
else:
|
|
return b
|
|
|
|
|
|
def signed16(b0, b1):
|
|
b0 &= 0xFF
|
|
b1 &= 0xFF
|
|
b = (b0 << 8) | b1
|
|
if b > 0x7FFF:
|
|
return - 0x10000 + b
|
|
else:
|
|
return b
|
|
|
|
|
|
def read(f, out, settings=None):
|
|
b = f.read(6)
|
|
# magic code: %vsm%\0
|
|
skip_vp3_string(f) # "Produced by Software Ltd"
|
|
f.seek(7, 1)
|
|
skip_vp3_string(f) # "" comments and note string.
|
|
f.seek(32, 1)
|
|
center_x = (signed32(read_int_32be(f)) / 100)
|
|
center_y = -(signed32(read_int_32be(f)) / 100)
|
|
f.seek(27, 1)
|
|
skip_vp3_string(f) # ""
|
|
f.seek(24, 1)
|
|
skip_vp3_string(f) # "Produced by Software Ltd"
|
|
count_colors = read_int_16be(f)
|
|
for i in range(0, count_colors):
|
|
vp3_read_colorblock(f, out, center_x, center_y)
|
|
|
|
|
|
def vp3_read_colorblock(f, read_object, center_x, center_y):
|
|
bytescheck = f.read(3) # \x00\x05\x00
|
|
distance_to_next_block_050 = read_int_32be(f)
|
|
block_end_position = distance_to_next_block_050 + f.tell()
|
|
|
|
start_position_x = (signed32(read_int_32be(f)) / 100)
|
|
start_position_y = -(signed32(read_int_32be(f)) / 100)
|
|
abs_x = start_position_x + center_x
|
|
abs_y = start_position_y + center_y
|
|
if abs_x != 0 and abs_y != 0:
|
|
read_object.move_abs(abs_x, abs_y)
|
|
thread = vp3_read_thread(f)
|
|
read_object.add_thread(thread)
|
|
f.seek(15, 1)
|
|
bytescheck = f.read(3) # \x0A\xF6\x00
|
|
stitch_byte_length = block_end_position - f.tell()
|
|
stitch_bytes = read_signed(f, stitch_byte_length)
|
|
|
|
i = 0
|
|
while i < len(stitch_bytes) - 1:
|
|
x = stitch_bytes[i]
|
|
y = stitch_bytes[i + 1]
|
|
i += 2
|
|
if (x & 0xFF) == 0x80:
|
|
if y == 0x01:
|
|
x = signed16(stitch_bytes[i], stitch_bytes[i + 1])
|
|
i += 2
|
|
y = signed16(stitch_bytes[i], stitch_bytes[i + 1])
|
|
i += 2
|
|
if abs(x) > 255 or abs(y) > 255:
|
|
read_object.trim(0, 0)
|
|
read_object.move(x, y)
|
|
else:
|
|
read_object.stitch(x, y)
|
|
elif y == 0x02:
|
|
pass # ends long stitch mode.
|
|
elif y == 0x03:
|
|
read_object.end(0, 0)
|
|
return
|
|
else:
|
|
read_object.stitch(x, y)
|
|
read_object.trim(0, 0)
|
|
read_object.color_change(0, 0)
|
|
|
|
|
|
def vp3_read_thread(f):
|
|
thread = EmbThread()
|
|
colors = read_int_8(f)
|
|
transition = read_int_8(f)
|
|
for m in range(0, colors):
|
|
thread.color = read_int_24be(f)
|
|
parts = read_int_8(f)
|
|
color_length = read_int_16be(f)
|
|
thread_type = read_int_8(f)
|
|
weight = read_int_8(f)
|
|
thread.catalog_number = read_vp3_string_8(f)
|
|
thread.description = read_vp3_string_8(f)
|
|
thread.brand = read_vp3_string_8(f)
|
|
return thread
|