psd
Version:
A general purpose Photoshop file parser.
81 lines (60 loc) • 22 kB
HTML
<html><head><title>channel_image.coffee</title><meta http-equiv="Content-Type" content="text/html" charset="UTF-8"><link rel="stylesheet" media="all" href="../../docco.css"></head><body><div id="container"><div id="background"></div><div id="jump_to">Jump To …<div id="jump_wrapper"><div id="jump_page"><a href="../../index.html" class="source"><span class="file_name">README</span></a><a href="../../lib/psd/blend_mode.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">blend_mode.coffee</span></a><a href="../../lib/psd/channel_image.coffee.html" class="source selected"><span class="base_path">lib / psd / </span><span class="file_name">channel_image.coffee</span></a><a href="../../lib/psd/color.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">color.coffee</span></a><a href="../../lib/psd/descriptor.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">descriptor.coffee</span></a><a href="../../lib/psd/file.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">file.coffee</span></a><a href="../../lib/psd/header.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">header.coffee</span></a><a href="../../lib/psd/image.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">image.coffee</span></a><a href="../../lib/psd/image_export.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">image_export.coffee</span></a><a href="../../lib/psd/image_exports/png.coffee.html" class="source "><span class="base_path">lib / psd / image_exports / </span><span class="file_name">png.coffee</span></a><a href="../../lib/psd/image_format.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">image_format.coffee</span></a><a href="../../lib/psd/image_formats/layer_raw.coffee.html" class="source "><span class="base_path">lib / psd / image_formats / </span><span class="file_name">layer_raw.coffee</span></a><a href="../../lib/psd/image_formats/layer_rle.coffee.html" class="source "><span class="base_path">lib / psd / image_formats / </span><span class="file_name">layer_rle.coffee</span></a><a href="../../lib/psd/image_formats/raw.coffee.html" class="source "><span class="base_path">lib / psd / image_formats / </span><span class="file_name">raw.coffee</span></a><a href="../../lib/psd/image_formats/rle.coffee.html" class="source "><span class="base_path">lib / psd / image_formats / </span><span class="file_name">rle.coffee</span></a><a href="../../lib/psd/image_mode.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">image_mode.coffee</span></a><a href="../../lib/psd/image_modes/cmyk.coffee.html" class="source "><span class="base_path">lib / psd / image_modes / </span><span class="file_name">cmyk.coffee</span></a><a href="../../lib/psd/image_modes/greyscale.coffee.html" class="source "><span class="base_path">lib / psd / image_modes / </span><span class="file_name">greyscale.coffee</span></a><a href="../../lib/psd/image_modes/rgb.coffee.html" class="source "><span class="base_path">lib / psd / image_modes / </span><span class="file_name">rgb.coffee</span></a><a href="../../lib/psd/init.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">init.coffee</span></a><a href="../../lib/psd/layer/blend_modes.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">blend_modes.coffee</span></a><a href="../../lib/psd/layer/blending_ranges.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">blending_ranges.coffee</span></a><a href="../../lib/psd/layer/channel_image.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">channel_image.coffee</span></a><a href="../../lib/psd/layer/helpers.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">helpers.coffee</span></a><a href="../../lib/psd/layer/info.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">info.coffee</span></a><a href="../../lib/psd/layer/mask.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">mask.coffee</span></a><a href="../../lib/psd/layer/name.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">name.coffee</span></a><a href="../../lib/psd/layer/position_channels.coffee.html" class="source "><span class="base_path">lib / psd / layer / </span><span class="file_name">position_channels.coffee</span></a><a href="../../lib/psd/layer.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">layer.coffee</span></a><a href="../../lib/psd/layer_info/blend_clipping_elements.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">blend_clipping_elements.coffee</span></a><a href="../../lib/psd/layer_info/blend_interior_elements.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">blend_interior_elements.coffee</span></a><a href="../../lib/psd/layer_info/fill_opacity.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">fill_opacity.coffee</span></a><a href="../../lib/psd/layer_info/gradient_fill.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">gradient_fill.coffee</span></a><a href="../../lib/psd/layer_info/layer_id.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">layer_id.coffee</span></a><a href="../../lib/psd/layer_info/layer_name_source.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">layer_name_source.coffee</span></a><a href="../../lib/psd/layer_info/legacy_typetool.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">legacy_typetool.coffee</span></a><a href="../../lib/psd/layer_info/locked.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">locked.coffee</span></a><a href="../../lib/psd/layer_info/metadata.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">metadata.coffee</span></a><a href="../../lib/psd/layer_info/nested_section_divider.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">nested_section_divider.coffee</span></a><a href="../../lib/psd/layer_info/object_effects.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">object_effects.coffee</span></a><a href="../../lib/psd/layer_info/section_divider.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">section_divider.coffee</span></a><a href="../../lib/psd/layer_info/solid_color.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">solid_color.coffee</span></a><a href="../../lib/psd/layer_info/typetool.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">typetool.coffee</span></a><a href="../../lib/psd/layer_info/unicode_name.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">unicode_name.coffee</span></a><a href="../../lib/psd/layer_info/vector_mask.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">vector_mask.coffee</span></a><a href="../../lib/psd/layer_info/vector_origination.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">vector_origination.coffee</span></a><a href="../../lib/psd/layer_info/vector_stroke.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">vector_stroke.coffee</span></a><a href="../../lib/psd/layer_info/vector_stroke_content.coffee.html" class="source "><span class="base_path">lib / psd / layer_info / </span><span class="file_name">vector_stroke_content.coffee</span></a><a href="../../lib/psd/layer_info.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">layer_info.coffee</span></a><a href="../../lib/psd/layer_mask.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">layer_mask.coffee</span></a><a href="../../lib/psd/lazy_execute.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">lazy_execute.coffee</span></a><a href="../../lib/psd/mask.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">mask.coffee</span></a><a href="../../lib/psd/node.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">node.coffee</span></a><a href="../../lib/psd/nodes/ancestry.coffee.html" class="source "><span class="base_path">lib / psd / nodes / </span><span class="file_name">ancestry.coffee</span></a><a href="../../lib/psd/nodes/build_preview.coffee.html" class="source "><span class="base_path">lib / psd / nodes / </span><span class="file_name">build_preview.coffee</span></a><a href="../../lib/psd/nodes/group.coffee.html" class="source "><span class="base_path">lib / psd / nodes / </span><span class="file_name">group.coffee</span></a><a href="../../lib/psd/nodes/layer.coffee.html" class="source "><span class="base_path">lib / psd / nodes / </span><span class="file_name">layer.coffee</span></a><a href="../../lib/psd/nodes/root.coffee.html" class="source "><span class="base_path">lib / psd / nodes / </span><span class="file_name">root.coffee</span></a><a href="../../lib/psd/nodes/search.coffee.html" class="source "><span class="base_path">lib / psd / nodes / </span><span class="file_name">search.coffee</span></a><a href="../../lib/psd/path_record.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">path_record.coffee</span></a><a href="../../lib/psd/resource.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">resource.coffee</span></a><a href="../../lib/psd/resource_section.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">resource_section.coffee</span></a><a href="../../lib/psd/resources/layer_comps.coffee.html" class="source "><span class="base_path">lib / psd / resources / </span><span class="file_name">layer_comps.coffee</span></a><a href="../../lib/psd/resources.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">resources.coffee</span></a><a href="../../lib/psd/util.coffee.html" class="source "><span class="base_path">lib / psd / </span><span class="file_name">util.coffee</span></a><a href="../../lib/psd.coffee.html" class="source "><span class="base_path">lib / </span><span class="file_name">psd.coffee</span></a><a href="../../shims/init.coffee.html" class="source "><span class="base_path">shims / </span><span class="file_name">init.coffee</span></a><a href="../../shims/png.coffee.html" class="source "><span class="base_path">shims / </span><span class="file_name">png.coffee</span></a></div></div></div><table cellpadding="0" cellspacing="0"><thead><tr><th class="docs"><h1>channel_image.coffee</h1><div class="filepath">lib/psd/</div></th><th class="code"></th></tr></thead><tbody><tr id="section-1"><td class="docs"><div class="pilwrap"><a href="#section-1" class="pilcrow">¶</a></div>
</td><td class="code"><div class="highlight"><pre><span class="nv">_ = </span><span class="nx">require</span> <span class="s">'lodash'</span>
<span class="nv">Image = </span><span class="nx">require</span> <span class="s">'./image.coffee'</span>
<span class="nv">ImageFormat = </span><span class="nx">require</span> <span class="s">'./image_format.coffee'</span></pre></div></td></tr><tr id="section-2"><td class="docs"><div class="pilwrap"><a href="#section-2" class="pilcrow">¶</a></div><p>Represents an image for a single layer, which differs slightly in format from
the full size preview image.</p>
<p>The full preview at the end of the PSD document has the same compression for all
channels, whereas layer images define the compression per color channel. The
dimensions can also differ per channel if we're parsing mask data (channel ID < -1).</p>
</td><td class="code"><div class="highlight"><pre><span class="nv">module.exports = </span><span class="k">class</span> <span class="nx">ChannelImage</span> <span class="k">extends</span> <span class="nx">Image</span>
<span class="nx">@includes</span> <span class="nx">ImageFormat</span><span class="p">.</span><span class="nx">LayerRAW</span>
<span class="nx">@includes</span> <span class="nx">ImageFormat</span><span class="p">.</span><span class="nx">LayerRLE</span></pre></div></td></tr><tr id="section-3"><td class="docs"><div class="pilwrap"><a href="#section-3" class="pilcrow">¶</a></div><p>Creates a new ChannelImage.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">constructor: </span><span class="nf">(file, header, @layer) -></span></pre></div></td></tr><tr id="section-4"><td class="docs"><div class="pilwrap"><a href="#section-4" class="pilcrow">¶</a></div><p>We copy the layer's width and height to private variables because, as you'll see below,
the dimensions can change if we're parsing a mask channel.</p>
</td><td class="code"><div class="highlight"><pre> <span class="vi">@_width = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">width</span>
<span class="vi">@_height = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">height</span>
<span class="k">super</span><span class="p">(</span><span class="nx">file</span><span class="p">,</span> <span class="nx">header</span><span class="p">)</span>
<span class="vi">@channelsInfo = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">channelsInfo</span>
<span class="vi">@hasMask = </span><span class="nx">_</span><span class="p">.</span><span class="nx">any</span> <span class="nx">@channelsInfo</span><span class="p">,</span> <span class="nf">(c) -></span> <span class="nx">c</span><span class="p">.</span><span class="nx">id</span> <span class="o"><</span> <span class="o">-</span><span class="mi">1</span>
<span class="vi">@opacity = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">opacity</span> <span class="o">/</span> <span class="mf">255.0</span>
<span class="vi">@maskData = </span><span class="p">[]</span></pre></div></td></tr><tr id="section-5"><td class="docs"><div class="pilwrap"><a href="#section-5" class="pilcrow">¶</a></div><p>Skip parsing this image by jumping to the end of the data.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">skip: </span><span class="nf">-></span>
<span class="k">for</span> <span class="nx">chan</span> <span class="k">in</span> <span class="nx">@channelsInfo</span>
<span class="nx">@file</span><span class="p">.</span><span class="nx">seek</span> <span class="nx">chan</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="kc">true</span></pre></div></td></tr><tr id="section-6"><td class="docs"><div class="pilwrap"><a href="#section-6" class="pilcrow">¶</a></div><p>The width of the image.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">width: </span><span class="nf">-></span> <span class="nx">@_width</span></pre></div></td></tr><tr id="section-7"><td class="docs"><div class="pilwrap"><a href="#section-7" class="pilcrow">¶</a></div><p>The height of the image.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">height: </span><span class="nf">-></span> <span class="nx">@_height</span></pre></div></td></tr><tr id="section-8"><td class="docs"><div class="pilwrap"><a href="#section-8" class="pilcrow">¶</a></div><p>The number of color channels in the image.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">channels: </span><span class="nf">-></span> <span class="nx">@layer</span><span class="p">.</span><span class="nx">channels</span></pre></div></td></tr><tr id="section-9"><td class="docs"><div class="pilwrap"><a href="#section-9" class="pilcrow">¶</a></div><p>Parse the image data. The resulting image data will be formatted to match the Javascript
Canvas color format, e.g. <code>[R, G, B, A, R, G, B, A]</code>.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parse: </span><span class="nf">-></span>
<span class="vi">@chanPos = </span><span class="mi">0</span>
<span class="k">for</span> <span class="nx">chan</span> <span class="k">in</span> <span class="nx">@channelsInfo</span>
<span class="k">if</span> <span class="nx">chan</span><span class="p">.</span><span class="nx">length</span> <span class="o"><=</span> <span class="mi">0</span>
<span class="nx">@parseCompression</span><span class="p">()</span>
<span class="k">continue</span>
<span class="vi">@chan = </span><span class="nx">chan</span></pre></div></td></tr><tr id="section-10"><td class="docs"><div class="pilwrap"><a href="#section-10" class="pilcrow">¶</a></div><p>If we're working with a mask channel, then the mask can define it's own dimensions separate
from the image dimensions. We grab these dimensions from the layer's mask data.</p>
</td><td class="code"><div class="highlight"><pre> <span class="k">if</span> <span class="nx">chan</span><span class="p">.</span><span class="nx">id</span> <span class="o"><</span> <span class="o">-</span><span class="mi">1</span>
<span class="vi">@_width = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">mask</span><span class="p">.</span><span class="nx">width</span>
<span class="vi">@_height = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">mask</span><span class="p">.</span><span class="nx">height</span>
<span class="k">else</span>
<span class="vi">@_width = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">width</span>
<span class="vi">@_height = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">height</span>
<span class="vi">@length = </span><span class="nx">@_width</span> <span class="o">*</span> <span class="nx">@_height</span>
<span class="nv">start = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">tell</span><span class="p">()</span>
<span class="nx">@parseImageData</span><span class="p">()</span>
<span class="nv">finish = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">tell</span><span class="p">()</span>
<span class="k">if</span> <span class="nx">finish</span> <span class="o">isnt</span> <span class="nx">start</span> <span class="o">+</span> <span class="nx">@chan</span><span class="p">.</span><span class="nx">length</span>
<span class="nx">@file</span><span class="p">.</span><span class="nx">seek</span><span class="p">(</span><span class="nx">start</span> <span class="o">+</span> <span class="nx">@chan</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span>
<span class="vi">@_width = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">width</span>
<span class="vi">@_height = </span><span class="nx">@layer</span><span class="p">.</span><span class="nx">height</span>
<span class="nx">@processImageData</span><span class="p">()</span></pre></div></td></tr><tr id="section-11"><td class="docs"><div class="pilwrap"><a href="#section-11" class="pilcrow">¶</a></div><p>Initiates parsing of the image data, which is based on the compression type of the channel. Every
channel defines it's own compression type, unlike the full PSD preview, which has a single compression
type for the entire image.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseImageData: </span><span class="nf">-></span>
<span class="vi">@compression = </span><span class="nx">@parseCompression</span><span class="p">()</span>
<span class="k">switch</span> <span class="nx">@compression</span>
<span class="k">when</span> <span class="mi">0</span> <span class="k">then</span> <span class="nx">@parseRaw</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">@parseRLE</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span> <span class="k">then</span> <span class="nx">@parseZip</span><span class="p">()</span>
<span class="k">else</span> <span class="nx">@file</span><span class="p">.</span><span class="nx">seek</span><span class="p">(</span><span class="nx">@endPos</span><span class="p">)</span>
</pre></div></td></tr></tbody></table><div id="generated">generated Tue May 12 2015 11:08:10 GMT-0400 (EDT) </div></div></body></html>