"""
Color mode data structure.
"""
from __future__ import absolute_import, unicode_literals
import logging
import attr
from psd_tools.psd.base import ValueElement
from psd_tools.utils import read_length_block, write_bytes, write_length_block
logger = logging.getLogger(__name__)
[docs]
@attr.s(repr=False, slots=True)
class ColorModeData(ValueElement):
"""
Color mode data section of the PSD file.
For indexed color images the data is the color table for the image in a
non-interleaved order.
Duotone images also have this data, but the data format is undocumented.
"""
value = attr.ib(default=b"", type=bytes)
@classmethod
def read(cls, fp):
value = read_length_block(fp)
logger.debug("reading color mode data, len=%d" % (len(value)))
# TODO: Parse color table.
return cls(value)
def write(self, fp):
def writer(f):
return write_bytes(f, self.value)
logger.debug("writing color mode data, len=%d" % (len(self.value)))
return write_length_block(fp, writer)
[docs]
def interleave(self):
"""
Returns interleaved color table in bytes.
"""
import array
if bytes == str:
return b"".join(
array.array(
"B",
[
ord(self.value[i]),
ord(self.value[i + 256]),
ord(self.value[i + 512]),
],
).tostring()
for i in range(256)
)
else:
return b"".join(
array.array(
"B", [(self.value[i]), (self.value[i + 256]), (self.value[i + 512])]
).tobytes()
for i in range(256)
)