psd
Version:
A general purpose Photoshop file parser.
173 lines (136 loc) • 35.8 kB
HTML
<html><head><title>descriptor.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 selected"><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>descriptor.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><p>A descriptor is a block of data that describes a complex data structure of some kind.
It was added sometime around Photoshop 5.0 and it superceded a few legacy things such
as layer names and type data. The benefit of the Descriptor is that it is self-contained,
and allows us to dynamically define data of any size. It's always represented by an Object
at the root.</p>
</td><td class="code"><div class="highlight"><pre><span class="nv">module.exports = </span><span class="k">class</span> <span class="nx">Descriptor</span></pre></div></td></tr><tr id="section-2"><td class="docs"><div class="pilwrap"><a href="#section-2" class="pilcrow">¶</a></div><p>Creates a new Descriptor.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">constructor: </span><span class="nf">(@file) -></span></pre></div></td></tr><tr id="section-3"><td class="docs"><div class="pilwrap"><a href="#section-3" class="pilcrow">¶</a></div><p>The object that will store the resulting data.</p>
</td><td class="code"><div class="highlight"><pre> <span class="vi">@data = </span><span class="p">{}</span></pre></div></td></tr><tr id="section-4"><td class="docs"><div class="pilwrap"><a href="#section-4" class="pilcrow">¶</a></div><p>Parses the Descriptor at the current location in the file.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parse: </span><span class="nf">-></span>
<span class="vi">@data.class = </span><span class="nx">@parseClass</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>The descriptor defines the number of items it contains at the root.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">numItems = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</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>Each item consists of a key/value combination, which is why our
descriptor is stored as an object instead of an array at the root.</p>
</td><td class="code"><div class="highlight"><pre> <span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">...</span><span class="nx">numItems</span><span class="p">]</span>
<span class="p">[</span><span class="nx">id</span><span class="p">,</span> <span class="nx">value</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@parseKeyItem</span><span class="p">()</span>
<span class="nx">@data</span><span class="p">[</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span>
<span class="nx">@data</span></pre></div></td></tr><tr id="section-7"><td class="docs"><div class="pilwrap"><a href="#section-7" class="pilcrow">¶</a></div><h2 id="note">Note</h2>
<p>The rest of the methods in this class are considered private. You will never
call any of them from outside this class.</p>
</td><td class="code"><div class="highlight"><pre></pre></div></td></tr><tr id="section-8"><td class="docs"><div class="pilwrap"><a href="#section-8" class="pilcrow">¶</a></div><p>Parses a class representation, which consists of a name and a unique ID.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseClass: </span><span class="nf">-></span>
<span class="nv">name: </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readUnicodeString</span><span class="p">()</span>
<span class="nv">id: </span><span class="nx">@parseId</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>Parses an ID, which is a unique String.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseId: </span><span class="nf">-></span>
<span class="nv">len = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="k">if</span> <span class="nx">len</span> <span class="o">is</span> <span class="mi">0</span> <span class="k">then</span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="nx">len</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>Parses a key/item value, which consists of an ID and an Item of any type.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseKeyItem: </span><span class="nf">-></span>
<span class="nv">id = </span><span class="nx">@parseId</span><span class="p">()</span>
<span class="nv">value = </span><span class="nx">@parseItem</span><span class="p">()</span>
<span class="k">return</span> <span class="p">[</span><span class="nx">id</span><span class="p">,</span> <span class="nx">value</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 an Item, which can be one of many types of data, depending on the key.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseItem: </span><span class="nf">(type = null) -></span>
<span class="nv">type = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="k">unless</span> <span class="nx">type</span><span class="o">?</span>
<span class="k">switch</span> <span class="nx">type</span>
<span class="k">when</span> <span class="s">'bool'</span> <span class="k">then</span> <span class="nx">@parseBoolean</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'type'</span><span class="p">,</span> <span class="s">'GlbC'</span> <span class="k">then</span> <span class="nx">@parseClass</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'Objc'</span><span class="p">,</span> <span class="s">'GlbO'</span> <span class="k">then</span> <span class="k">new</span> <span class="nx">Descriptor</span><span class="p">(</span><span class="nx">@file</span><span class="p">).</span><span class="nx">parse</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'doub'</span> <span class="k">then</span> <span class="nx">@parseDouble</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'enum'</span> <span class="k">then</span> <span class="nx">@parseEnum</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'alis'</span> <span class="k">then</span> <span class="nx">@parseAlias</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'Pth'</span> <span class="k">then</span> <span class="nx">@parseFilePath</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'long'</span> <span class="k">then</span> <span class="nx">@parseInteger</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'comp'</span> <span class="k">then</span> <span class="nx">@parseLargeInteger</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'VlLs'</span> <span class="k">then</span> <span class="nx">@parseList</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'ObAr'</span> <span class="k">then</span> <span class="nx">@parseObjectArray</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'tdta'</span> <span class="k">then</span> <span class="nx">@parseRawData</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'obj '</span> <span class="k">then</span> <span class="nx">@parseReference</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'TEXT'</span> <span class="k">then</span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readUnicodeString</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'UntF'</span> <span class="k">then</span> <span class="nx">@parseUnitDouble</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'UnFl'</span> <span class="k">then</span> <span class="nx">@parseUnitFloat</span><span class="p">()</span>
<span class="nv">parseBoolean: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readBoolean</span><span class="p">()</span>
<span class="nv">parseDouble: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readDouble</span><span class="p">()</span>
<span class="nv">parseInteger: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nv">parseLargeInteger: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readLongLong</span><span class="p">()</span>
<span class="nv">parseIdentifier: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nv">parseIndex: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nv">parseOffset: </span><span class="nf">-></span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</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 a Property, which consists of a class and a unique ID.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseProperty: </span><span class="nf">-></span>
<span class="k">class</span><span class="o">:</span> <span class="nx">@parseClass</span><span class="p">()</span>
<span class="nv">id: </span><span class="nx">@parseId</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 an enumerator, which consists of 2 IDs, one of which is
the type, and the other is the value.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseEnum: </span><span class="nf">-></span>
<span class="nv">type: </span><span class="nx">@parseId</span><span class="p">()</span>
<span class="nv">value: </span><span class="nx">@parseId</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>Parses an enumerator reference, which consists of a class and
2 IDs: a type and value.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseEnumReference: </span><span class="nf">-></span>
<span class="k">class</span><span class="o">:</span> <span class="nx">@parseClass</span><span class="p">()</span>
<span class="nv">type: </span><span class="nx">@parseId</span><span class="p">()</span>
<span class="nv">value: </span><span class="nx">@parseId</span><span class="p">()</span></pre></div></td></tr><tr id="section-15"><td class="docs"><div class="pilwrap"><a href="#section-15" class="pilcrow">¶</a></div><p>Parses an Alias, which is a string of arbitrary length.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseAlias: </span><span class="nf">-></span>
<span class="nv">len = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="nx">len</span><span class="p">)</span></pre></div></td></tr><tr id="section-16"><td class="docs"><div class="pilwrap"><a href="#section-16" class="pilcrow">¶</a></div><p>Parses a file path, which consists of a 4 character signature
and a path.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseFilePath: </span><span class="nf">-></span>
<span class="nv">len = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nv">sig = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span></pre></div></td></tr><tr id="section-17"><td class="docs"><div class="pilwrap"><a href="#section-17" class="pilcrow">¶</a></div><p>Little endian. Who knows.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">pathSize = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="s">'<i'</span><span class="p">)</span>
<span class="nv">numChars = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="s">'<i'</span><span class="p">)</span>
<span class="nv">path = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readUnicodeString</span><span class="p">(</span><span class="nx">numChars</span><span class="p">)</span>
<span class="nv">sig: </span><span class="nx">sig</span>
<span class="nv">path: </span><span class="nx">path</span></pre></div></td></tr><tr id="section-18"><td class="docs"><div class="pilwrap"><a href="#section-18" class="pilcrow">¶</a></div><p>Parses a list/array of Items.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseList: </span><span class="nf">-></span>
<span class="nv">count = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nv">items = </span><span class="p">[]</span>
<span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">...</span><span class="nx">count</span><span class="p">]</span>
<span class="nx">items</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@parseItem</span><span class="p">()</span>
<span class="nx">items</span></pre></div></td></tr><tr id="section-19"><td class="docs"><div class="pilwrap"><a href="#section-19" class="pilcrow">¶</a></div><p>Not documented anywhere and unsure of the data format. Luckily, this
type is extremely rare. In fact, it's so rare, that I've never run into it
among any of my PSDs.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseObjectArray: </span><span class="nf">-></span>
<span class="k">throw</span> <span class="s">"Descriptor object array not implemented yet @ </span><span class="si">#{</span><span class="nx">@file</span><span class="p">.</span><span class="nx">tell</span><span class="p">()</span><span class="si">}</span><span class="s">"</span></pre></div></td></tr><tr id="section-20"><td class="docs"><div class="pilwrap"><a href="#section-20" class="pilcrow">¶</a></div><p>Parses raw byte data of arbitrary length.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseRawData: </span><span class="nf">-></span>
<span class="nv">len = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nx">@file</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">len</span><span class="p">)</span></pre></div></td></tr><tr id="section-21"><td class="docs"><div class="pilwrap"><a href="#section-21" class="pilcrow">¶</a></div><p>Parses a Reference, which is an array of items of multiple types.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseReference: </span><span class="nf">-></span>
<span class="nv">numItems = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readInt</span><span class="p">()</span>
<span class="nv">items = </span><span class="p">[]</span>
<span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">...</span><span class="nx">numItems</span><span class="p">]</span>
<span class="nv">type = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="nv">value = </span><span class="k">switch</span> <span class="nx">type</span>
<span class="k">when</span> <span class="s">'prop'</span> <span class="k">then</span> <span class="nx">@parseProperty</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'Clss'</span> <span class="k">then</span> <span class="nx">@parseClass</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'Enmr'</span> <span class="k">then</span> <span class="nx">@parseEnumReference</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'Idnt'</span> <span class="k">then</span> <span class="nx">@parseIdentifier</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'indx'</span> <span class="k">then</span> <span class="nx">@parseIndex</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'name'</span> <span class="k">then</span> <span class="nx">@file</span><span class="p">.</span><span class="nx">readUnicodeString</span><span class="p">()</span>
<span class="k">when</span> <span class="s">'rele'</span> <span class="k">then</span> <span class="nx">@parseOffset</span><span class="p">()</span>
<span class="nx">items</span><span class="p">.</span><span class="nx">push</span> <span class="nv">type: </span><span class="nx">type</span><span class="p">,</span> <span class="nv">value: </span><span class="nx">value</span>
<span class="nx">items</span></pre></div></td></tr><tr id="section-22"><td class="docs"><div class="pilwrap"><a href="#section-22" class="pilcrow">¶</a></div><p>Parses a double with a unit, such as angle, percent, pixels, etc.
Returns an object with an ID, a unit, and a value.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseUnitDouble: </span><span class="nf">-></span>
<span class="nv">unitId = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="nv">unit = </span><span class="k">switch</span> <span class="nx">unitId</span>
<span class="k">when</span> <span class="s">'#Ang'</span> <span class="k">then</span> <span class="s">'Angle'</span>
<span class="k">when</span> <span class="s">'#Rsl'</span> <span class="k">then</span> <span class="s">'Density'</span>
<span class="k">when</span> <span class="s">'#Rlt'</span> <span class="k">then</span> <span class="s">'Distance'</span>
<span class="k">when</span> <span class="s">'#Nne'</span> <span class="k">then</span> <span class="s">'None'</span>
<span class="k">when</span> <span class="s">'#Prc'</span> <span class="k">then</span> <span class="s">'Percent'</span>
<span class="k">when</span> <span class="s">'#Pxl'</span> <span class="k">then</span> <span class="s">'Pixels'</span>
<span class="k">when</span> <span class="s">'#Mlm'</span> <span class="k">then</span> <span class="s">'Millimeters'</span>
<span class="k">when</span> <span class="s">'#Pnt'</span> <span class="k">then</span> <span class="s">'Points'</span>
<span class="nv">value = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readDouble</span><span class="p">()</span>
<span class="nv">id: </span><span class="nx">unitId</span><span class="p">,</span> <span class="nv">unit: </span><span class="nx">unit</span><span class="p">,</span> <span class="nv">value: </span><span class="nx">value</span></pre></div></td></tr><tr id="section-23"><td class="docs"><div class="pilwrap"><a href="#section-23" class="pilcrow">¶</a></div><p>Parses a float with a unit, such as angle, percent, pixels, etc.
Returns an object with an ID, a unit, and a value.</p>
</td><td class="code"><div class="highlight"><pre> <span class="nv">parseUnitFloat: </span><span class="nf">-></span>
<span class="nv">unitId = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readString</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="nv">unit = </span><span class="k">switch</span> <span class="nx">unitId</span>
<span class="k">when</span> <span class="s">'#Ang'</span> <span class="k">then</span> <span class="s">'Angle'</span>
<span class="k">when</span> <span class="s">'#Rsl'</span> <span class="k">then</span> <span class="s">'Density'</span>
<span class="k">when</span> <span class="s">'#Rlt'</span> <span class="k">then</span> <span class="s">'Distance'</span>
<span class="k">when</span> <span class="s">'#Nne'</span> <span class="k">then</span> <span class="s">'None'</span>
<span class="k">when</span> <span class="s">'#Prc'</span> <span class="k">then</span> <span class="s">'Percent'</span>
<span class="k">when</span> <span class="s">'#Pxl'</span> <span class="k">then</span> <span class="s">'Pixels'</span>
<span class="k">when</span> <span class="s">'#Mlm'</span> <span class="k">then</span> <span class="s">'Millimeters'</span>
<span class="k">when</span> <span class="s">'#Pnt'</span> <span class="k">then</span> <span class="s">'Points'</span>
<span class="nv">value = </span><span class="nx">@file</span><span class="p">.</span><span class="nx">readFloat</span><span class="p">()</span>
<span class="nv">id: </span><span class="nx">unitId</span><span class="p">,</span> <span class="nv">unit: </span><span class="nx">unit</span><span class="p">,</span> <span class="nv">value: </span><span class="nx">value</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>