psd
Version:
A general purpose Photoshop file parser.
94 lines (70 loc) • 23.8 kB
HTML
<html><head><title>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 "><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 selected"><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>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="p">{</span><span class="nx">Module</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s">'coffeescript-module'</span>
<span class="nv">ImageFormat = </span><span class="nx">require</span> <span class="s">'./image_format.coffee'</span>
<span class="nv">ImageMode = </span><span class="nx">require</span> <span class="s">'./image_mode.coffee'</span>
<span class="nv">Export = </span><span class="nx">require</span> <span class="s">'./image_export.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 the full preview image at the end of the PSD document. For this image, the
compression is defined for all channels, and there is no mask data. The width and height
are derived from the PSD header, which is the full size of the PSD document.</p>
</td><td class="code"><div class="highlight"><pre><span class="nv">module.exports = </span><span class="k">class</span> <span class="nx">Image</span> <span class="k">extends</span> <span class="nx">Module</span></pre></div></td></tr><tr id="section-3"><td class="docs"><div class="pilwrap"><a href="#section-3" class="pilcrow">¶</a></div><p>Here we include all of our important mixins.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nx">@includes</span> <span class="nx">ImageFormat</span><span class="p">.</span><span class="nx">RAW</span>
<span class="nx">@includes</span> <span class="nx">ImageFormat</span><span class="p">.</span><span class="nx">RLE</span>
<span class="nx">@includes</span> <span class="nx">ImageMode</span><span class="p">.</span><span class="nx">Greyscale</span>
<span class="nx">@includes</span> <span class="nx">ImageMode</span><span class="p">.</span><span class="nx">RGB</span>
<span class="nx">@includes</span> <span class="nx">ImageMode</span><span class="p">.</span><span class="nx">CMYK</span>
<span class="nx">@includes</span> <span class="nx">Export</span><span class="p">.</span><span class="nx">PNG</span>
</pre></div></td></tr><tr id="section-4"><td class="docs"><div class="pilwrap"><a href="#section-4" class="pilcrow">¶</a></div><p>Images can be 1 of 4 different compression types. RLE is the most prevalent, followed by
RAW. ZIP compression only happens under special circumstances, and is somewhat rare.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">COMPRESSIONS = </span><span class="p">[</span>
<span class="s">'Raw'</span>
<span class="s">'RLE'</span>
<span class="s">'ZIP'</span>
<span class="s">'ZIPPrediction'</span>
<span class="p">]</span>
<span class="nv">constructor: </span><span class="nf">(@file, @header) -></span></pre></div></td></tr><tr id="section-5"><td class="docs"><div class="pilwrap"><a href="#section-5" class="pilcrow">¶</a></div><p>We can easily calculate the number of pixels with the width and height.</p>
</td><td class="code"><div class="highlight"><pre> <span class="vi">@numPixels = </span><span class="nx">@width</span><span class="p">()</span> <span class="o">*</span> <span class="nx">@height</span><span class="p">()</span>
<span class="nx">@numPixels</span> <span class="o">*=</span> <span class="mi">2</span> <span class="k">if</span> <span class="nx">@depth</span><span class="p">()</span> <span class="o">is</span> <span class="mi">16</span>
<span class="nx">@calculateLength</span><span class="p">()</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 resulting array that stores the pixel data, formatted in RGBA format.</p>
</td><td class="code"><div class="highlight"><pre> <span class="vi">@pixelData = </span><span class="p">[]</span></pre></div></td></tr><tr id="section-7"><td class="docs"><div class="pilwrap"><a href="#section-7" class="pilcrow">¶</a></div><p>This temporarily holds the raw channel data after it's been parsed, but not
processed.</p>
</td><td class="code"><div class="highlight"><pre> <span class="vi">@channelData = </span><span class="p">[]</span>
<span class="vi">@opacity = </span><span class="mf">1.0</span>
<span class="vi">@hasMask = </span><span class="kc">false</span>
<span class="vi">@startPos = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">tell</span><span class="p">()</span>
<span class="vi">@endPos = </span><span class="nx">@startPos</span> <span class="o">+</span> <span class="nx">@length</span>
<span class="nx">@setChannelsInfo</span><span class="p">()</span></pre></div></td></tr><tr id="section-8"><td class="docs"><div class="pilwrap"><a href="#section-8" class="pilcrow">¶</a></div><p>Some helper methods that grab data from the PSD header.</p>
</td><td class="code"><div class="highlight"><pre> <span class="k">for</span> <span class="nx">attr</span> <span class="k">in</span> <span class="p">[</span><span class="s">'width'</span><span class="p">,</span> <span class="s">'height'</span><span class="p">,</span> <span class="s">'channels'</span><span class="p">,</span> <span class="s">'depth'</span><span class="p">,</span> <span class="s">'mode'</span><span class="p">]</span> <span class="k">then</span> <span class="nx">do</span> <span class="nf">(attr) =></span>
<span class="nx">@</span><span class="o">::</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nf">-></span> <span class="nx">@header</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span></pre></div></td></tr><tr id="section-9"><td class="docs"><div class="pilwrap"><a href="#section-9" class="pilcrow">¶</a></div><p>Sets the channel info based on the PSD color mode.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">setChannelsInfo: </span><span class="nf">-></span>
<span class="k">switch</span> <span class="nx">@mode</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">@setGreyscaleChannels</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">3</span> <span class="k">then</span> <span class="nx">@setRgbChannels</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">4</span> <span class="k">then</span> <span class="nx">@setCmykChannels</span><span class="p">()</span></pre></div></td></tr><tr id="section-10"><td class="docs"><div class="pilwrap"><a href="#section-10" class="pilcrow">¶</a></div><p>Calculates the length of the image data.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">calculateLength: </span><span class="nf">-></span>
<span class="vi">@length = </span><span class="k">switch</span> <span class="nx">@depth</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">1</span> <span class="k">then</span> <span class="p">(</span><span class="nx">@width</span><span class="p">()</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span> <span class="o">*</span> <span class="nx">@height</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">16</span> <span class="k">then</span> <span class="nx">@width</span><span class="p">()</span> <span class="o">*</span> <span class="nx">@height</span><span class="p">()</span> <span class="o">*</span> <span class="mi">2</span>
<span class="k">else</span> <span class="nx">@width</span><span class="p">()</span> <span class="o">*</span> <span class="nx">@height</span><span class="p">()</span>
<span class="vi">@channelLength = </span><span class="nx">@length</span>
<span class="nx">@length</span> <span class="o">*=</span> <span class="nx">@channels</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>Parses the image and formats the image data.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parse: </span><span class="nf">-></span>
<span class="vi">@compression = </span><span class="nx">@parseCompression</span><span class="p">()</span>
<span class="k">if</span> <span class="nx">@compression</span> <span class="k">in</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="nx">@file</span><span class="p">.</span><span class="nx">seek</span> <span class="nx">@endPos</span>
<span class="k">return</span>
<span class="nx">@parseImageData</span><span class="p">()</span></pre></div></td></tr><tr id="section-12"><td class="docs"><div class="pilwrap"><a href="#section-12" class="pilcrow">¶</a></div><p>Parses the compression mode.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseCompression: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readShort</span><span class="p">()</span>
</pre></div></td></tr><tr id="section-13"><td class="docs"><div class="pilwrap"><a href="#section-13" class="pilcrow">¶</a></div><p>Parses the image data based on the compression mode.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseImageData: </span><span class="nf">-></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>
<span class="nx">@processImageData</span><span class="p">()</span></pre></div></td></tr><tr id="section-14"><td class="docs"><div class="pilwrap"><a href="#section-14" class="pilcrow">¶</a></div><p>Processes the parsed image data based on the color mode.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">processImageData: </span><span class="nf">-></span>
<span class="k">switch</span> <span class="nx">@mode</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">@combineGreyscaleChannel</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">3</span> <span class="k">then</span> <span class="nx">@combineRgbChannel</span><span class="p">()</span>
<span class="k">when</span> <span class="mi">4</span> <span class="k">then</span> <span class="nx">@combineCmykChannel</span><span class="p">()</span>
<span class="vi">@channelData = </span><span class="kc">null</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>