aboutsummaryrefslogtreecommitdiffstats
path: root/docs/psdfile.html
blob: 1c2264b4db22ab28d1867099ba2e5634ba7634bd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!DOCTYPE html>  <html> <head>   <title>psdfile.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 &hellip;         <div id="jump_wrapper">           <div id="jump_page">                                           <a class="source" href="brightnesscontrast.html">                 brightnesscontrast.coffee               </a>                                           <a class="source" href="colorbalance.html">                 colorbalance.coffee               </a>                                           <a class="source" href="curves.html">                 curves.coffee               </a>                                           <a class="source" href="huesaturation.html">                 huesaturation.coffee               </a>                                           <a class="source" href="invert.html">                 invert.coffee               </a>                                           <a class="source" href="layereffect.html">                 layereffect.coffee               </a>                                           <a class="source" href="levels.html">                 levels.coffee               </a>                                           <a class="source" href="posterize.html">                 posterize.coffee               </a>                                           <a class="source" href="selectivecolor.html">                 selectivecolor.coffee               </a>                                           <a class="source" href="threshold.html">                 threshold.coffee               </a>                                           <a class="source" href="typetool.html">                 typetool.coffee               </a>                                           <a class="source" href="log.html">                 log.coffee               </a>                                           <a class="source" href="psd.html">                 psd.coffee               </a>                                           <a class="source" href="psdassert.html">                 psdassert.coffee               </a>                                           <a class="source" href="psdchannelimage.html">                 psdchannelimage.coffee               </a>                                           <a class="source" href="psdcolor.html">                 psdcolor.coffee               </a>                                           <a class="source" href="psddescriptor.html">                 psddescriptor.coffee               </a>                                           <a class="source" href="psdfile.html">                 psdfile.coffee               </a>                                           <a class="source" href="psdheader.html">                 psdheader.coffee               </a>                                           <a class="source" href="psdimage.html">                 psdimage.coffee               </a>                                           <a class="source" href="psdlayer.html">                 psdlayer.coffee               </a>                                           <a class="source" href="psdlayermask.html">                 psdlayermask.coffee               </a>                                           <a class="source" href="psdresource.html">                 psdresource.coffee               </a>                                           <a class="source" href="util.html">                 util.coffee               </a>                        </div>         </div>       </div>          <table cellpadding="0" cellspacing="0">       <thead>         <tr>           <th class="docs">             <h1>               psdfile.coffee             </h1>           </th>           <th class="code">           </th>         </tr>       </thead>       <tbody>                               <tr id="section-1">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-1">&#182;</a>               </div>               <p>Simulation and abstraction of a disk-based file.
Provides methods to read the raw binary file data, which is stored in a 
variable instead of read from disk. A lot of these functions are from C,
but some of them are helper functions to make things a bit easier to
understand.</p>             </td>             <td class="code">               <div class="highlight"><pre><span class="k">class</span> <span class="nx">PSDFile</span>
  <span class="nv">unicodeRegex: </span><span class="sr">/\\u([\d\w]{4})/gi</span>

  <span class="nv">constructor: </span><span class="nf">(@data) -&gt;</span></pre></div>             </td>           </tr>                               <tr id="section-2">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-2">&#182;</a>               </div>               <p>Track our current position in the file data. This is analogous to the
file pointer in C.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="vi">@pos = </span><span class="mi">0</span></pre></div>             </td>           </tr>                               <tr id="section-3">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-3">&#182;</a>               </div>               <p>Get the current position in the file. This is here to parallel the C method</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">tell: </span><span class="o">-&gt;</span> <span class="nx">@pos</span></pre></div>             </td>           </tr>                               <tr id="section-4">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-4">&#182;</a>               </div>               <p>Read one or more bytes from the file. Note that this moves the file pointer
forward the number of bytes specified.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">read: </span><span class="nf">(bytes) -&gt;</span> <span class="p">(</span><span class="nx">@data</span><span class="p">[</span><span class="nx">@pos</span><span class="o">++</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">bytes</span><span class="p">])</span></pre></div>             </td>           </tr>                               <tr id="section-5">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-5">&#182;</a>               </div>               <p>Move the file pointer to a new position. By default, this is done relative
to the current file pointer position. Setting the 2nd argument to false
causes the file pointer to move to the absolute location specified.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">seek: </span><span class="nf">(amount, rel = true) -&gt;</span>
    <span class="k">if</span> <span class="nx">rel</span> <span class="k">then</span> <span class="nx">@pos</span> <span class="o">+=</span> <span class="nx">amount</span> <span class="k">else</span> <span class="vi">@pos = </span><span class="nx">amount</span></pre></div>             </td>           </tr>                               <tr id="section-6">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-6">&#182;</a>               </div>               <p>Helper functions so we don't have to remember the unpack
format codes.</p>             </td>             <td class="code">               <div class="highlight"><pre>  </pre></div>             </td>           </tr>                               <tr id="section-7">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-7">&#182;</a>               </div>               <p>4 bytes / 32-bit</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readInt: </span><span class="o">-&gt;</span>
    <span class="nv">int = </span><span class="nx">@readUInt</span><span class="p">()</span>
    <span class="k">if</span> <span class="nx">int</span> <span class="o">&gt;=</span> <span class="mh">0x80000000</span> <span class="k">then</span> <span class="nx">int</span> <span class="o">-</span> <span class="mh">0x100000000</span> <span class="k">else</span> <span class="nx">int</span>

  <span class="nv">readUInt: </span><span class="o">-&gt;</span>
    <span class="nv">b1 = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span>
    <span class="nv">b2 = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span>
    <span class="nv">b3 = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span>
    <span class="nv">b4 = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="nx">b1</span> <span class="o">|</span> <span class="nx">b2</span> <span class="o">|</span> <span class="nx">b3</span> <span class="o">|</span> <span class="nx">b4</span></pre></div>             </td>           </tr>                               <tr id="section-8">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-8">&#182;</a>               </div>               <p>2 bytes</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readShortInt: </span><span class="o">-&gt;</span>
    <span class="nv">int = </span><span class="nx">@readShortUInt</span><span class="p">()</span>
    <span class="k">if</span> <span class="nx">int</span> <span class="o">&gt;=</span> <span class="mh">0x8000</span> <span class="k">then</span> <span class="nx">int</span> <span class="o">-</span> <span class="mh">0x10000</span> <span class="k">else</span> <span class="nx">int</span>

  <span class="nv">readShortUInt: </span><span class="o">-&gt;</span>
    <span class="nv">b1 = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span>
    <span class="nv">b2 = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="nx">b1</span> <span class="o">|</span> <span class="nx">b2</span></pre></div>             </td>           </tr>                               <tr id="section-9">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-9">&#182;</a>               </div>               <p>4 bytes</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readLongInt: </span><span class="o">-&gt;</span> <span class="nx">@readf</span><span class="p">(</span><span class="s2">&quot;&gt;l&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
  <span class="nv">readLongUInt: </span><span class="o">-&gt;</span> <span class="nx">@readf</span><span class="p">(</span><span class="s2">&quot;&gt;L&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span></pre></div>             </td>           </tr>                               <tr id="section-10">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-10">&#182;</a>               </div>               <p>8 bytes</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readDouble: </span><span class="o">-&gt;</span> <span class="nx">@readf</span><span class="p">(</span><span class="s2">&quot;&gt;d&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span></pre></div>             </td>           </tr>                               <tr id="section-11">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-11">&#182;</a>               </div>               <p>1 byte</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readBoolean: </span><span class="o">-&gt;</span> <span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="mi">0</span></pre></div>             </td>           </tr>                               <tr id="section-12">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-12">&#182;</a>               </div>               <p>Unfortunately Javascript does not support 64-bit integers, so we
have a temporary solution for now. In the future, we can parse and
store the int either as an octet string, or something more useful.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readLongLong: </span><span class="o">-&gt;</span> <span class="nx">@read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
  <span class="nv">readULongLong: </span><span class="o">-&gt;</span> <span class="nx">@read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span></pre></div>             </td>           </tr>                               <tr id="section-13">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-13">&#182;</a>               </div>               <p>Reads a string with the given length. Because some strings are also
null-byte padded, we strip out these null bytes since they are of no
use to us in Javascript.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readString: </span><span class="nf">(length) -&gt;</span>
    <span class="nv">ret = </span><span class="p">[]</span>
    <span class="nx">ret</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</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">length</span><span class="p">]</span>
    <span class="nx">ret</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">).</span><span class="nx">replace</span> <span class="sr">/\u0000/g</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>

  <span class="nv">readUnicodeString: </span><span class="o">-&gt;</span>
    <span class="nv">len = </span><span class="nx">@readInt</span><span class="p">()</span> <span class="o">*</span> <span class="mi">2</span>
    <span class="nv">str = </span><span class="nx">@readf</span><span class="p">(</span><span class="s2">&quot;&gt;#{len}s&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="nv">str = </span><span class="nx">str</span><span class="p">.</span><span class="nx">replace</span> <span class="nx">@unicodeRegex</span><span class="p">,</span> <span class="nf">(match, grp) -&gt;</span>
      <span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">grp</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>

    <span class="nx">str</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\u0000/g</span><span class="p">,</span> <span class="s2">&quot;&quot;</span></pre></div>             </td>           </tr>                               <tr id="section-14">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-14">&#182;</a>               </div>               <p>Used for reading pascal strings, which are strings that have their length 
prepended to the chunk of character bytes. If a length isn't found, a 
string with the default length will be read instead.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readLengthWithString: </span><span class="nf">(defaultLen = 4) -&gt;</span>
    <span class="nv">length = </span><span class="nx">@read</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="k">if</span> <span class="nx">length</span> <span class="o">is</span> <span class="mi">0</span>
      <span class="nv">str = </span><span class="nx">@readString</span> <span class="nx">defaultLen</span>
    <span class="k">else</span>
      <span class="nv">str = </span><span class="nx">@readString</span> <span class="nx">length</span>

    <span class="nx">str</span></pre></div>             </td>           </tr>                               <tr id="section-15">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-15">&#182;</a>               </div>               <p>Reads a byte list</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readBytesList: </span><span class="nf">(size) -&gt;</span> <span class="nx">@read</span> <span class="nx">size</span>

  <span class="nv">readSpaceColor: </span><span class="o">-&gt;</span>
    <span class="nv">colorSpace = </span><span class="nx">@readShortInt</span><span class="p">()</span>

    <span class="nv">colorComponent = </span><span class="p">[]</span>
    <span class="nx">colorComponent</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@readShortInt</span><span class="p">()</span> <span class="o">&gt;&gt;</span> <span class="mi">8</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="mi">4</span><span class="p">]</span>
    <span class="nx">PSDColor</span><span class="p">.</span><span class="nx">colorSpaceToARGB</span><span class="p">(</span><span class="nx">colorSpace</span><span class="p">,</span> <span class="nx">colorComponent</span><span class="p">)</span>
    
  </pre></div>             </td>           </tr>                               <tr id="section-16">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-16">&#182;</a>               </div>               <p>Reads from the file given the unpack format string. Format string codes 
can be easily referenced 
<a href="http://docs.python.org/library/struct.html#format-characters">from the Python docs</a></p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">readf: </span><span class="nf">(format) -&gt;</span> <span class="nx">jspack</span><span class="p">.</span><span class="nx">Unpack</span> <span class="nx">format</span><span class="p">,</span> <span class="nx">@read</span><span class="p">(</span><span class="nx">jspack</span><span class="p">.</span><span class="nx">CalcLength</span><span class="p">(</span><span class="nx">format</span><span class="p">))</span></pre></div>             </td>           </tr>                               <tr id="section-17">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-17">&#182;</a>               </div>               <p>Skips a block, assuming the next byte describes the size of the section.
An optional description is given to explain why we are skipping this block
instead of parsing it.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nv">skipBlock: </span><span class="nf">(desc = &quot;unknown&quot;) -&gt;</span>
    <span class="p">[</span><span class="nx">n</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@readf</span><span class="p">(</span><span class="s1">&#39;&gt;L&#39;</span><span class="p">)</span>
    <span class="nx">@seek</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="k">if</span> <span class="nx">n</span> <span class="c1"># relative</span>

    <span class="nx">Log</span><span class="p">.</span><span class="nx">debug</span> <span class="s2">&quot;Skipped #{desc} with #{n} bytes&quot;</span>

</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html>