<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: rle code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Mon, 06 Oct 2008 05:47:17 GMT</pubDate>
    <description>DZone Snippets: rle code</description>
    <item>
      <title>Reading a 24-bit icon in an mbm file</title>
      <link>http://snippets.dzone.com/posts/show/1476</link>
      <description>Here's an example how I read the icon and display it on canvas&lt;br /&gt;It's a continued part of my previous &lt;a href=http://discussion.forum.nokia.com/forum/showthread.php?t=63608&gt;mbm hack&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; from appuifw import *&lt;br /&gt;&gt;&gt;&gt; from struct import unpack&lt;br /&gt;&gt;&gt;&gt; def readL(f, pos=None):     # helping function&lt;br /&gt;...     if pos is not None:&lt;br /&gt;...         f.seek(pos)&lt;br /&gt;...     return unpack('L', f.read(4))[0]&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; fxmbm = 'E:\\system\\apps\\FExplorer\\FExplorer.mbm'&lt;br /&gt;&gt;&gt;&gt; f = open(fxmbm, 'rb')&lt;br /&gt;&gt;&gt;&gt; trailer = readL(f, 16)&lt;br /&gt;&gt;&gt;&gt; num = readL(f, trailer)   # 19 icons&lt;br /&gt;&gt;&gt;&gt; offset = []&lt;br /&gt;&gt;&gt;&gt; for i in range(num):&lt;br /&gt;...   offset.append(readL(f))&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; offset&lt;br /&gt;[20L, 68L, 116L, 474L, 588L, 1038L, 1228L, 1636L, 1864L, 2277L, 2430L, 3735L, 41&lt;br /&gt;69L, 4569L, 4697L, 5197L, 5370L, 5897L, 6062L]&lt;br /&gt;&gt;&gt;&gt; start = offset[2]  # folder icon&lt;br /&gt;&gt;&gt;&gt; f.seek(start)&lt;br /&gt;&gt;&gt;&gt; length = readL(f) - readL(f)    # length of data section&lt;br /&gt;&gt;&gt;&gt; width, height = readL(f), readL(f)  # 16 x 13&lt;br /&gt;&gt;&gt;&gt; f.seek(start+0x28)  # start of data section&lt;br /&gt;&gt;&gt;&gt; data_enc = f.read(length)   # got the data&lt;br /&gt;&gt;&gt;&gt; def rle24_decode(bytes):&lt;br /&gt;...     out = []&lt;br /&gt;...     i = 0&lt;br /&gt;...     while i &lt; len(bytes):&lt;br /&gt;...         n = ord(bytes[i])&lt;br /&gt;...         i += 1&lt;br /&gt;...         if n &lt; 0x80:&lt;br /&gt;...             out.append( bytes[i:i+3] * (n+1) )&lt;br /&gt;...             i += 3&lt;br /&gt;...         else:&lt;br /&gt;...             n = 0x100 - n&lt;br /&gt;...             out.append( bytes[i:i+3*n] )&lt;br /&gt;...             i += 3*n&lt;br /&gt;...     return ''.join(out)&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; data = rel24_decode(data_enc)&lt;br /&gt;&gt;&gt;&gt; app.body = canvas = Canvas()&lt;br /&gt;&gt;&gt;&gt; for j in range(height):&lt;br /&gt;...     for i in range(width):&lt;br /&gt;...         p = 3*(j*width+i)&lt;br /&gt;...         color = [ord(data[p+k]) for k in (2,1,0)]  # It's BGR&lt;br /&gt;...         canvas.point((i,j), tuple(color))&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt;  # folder icon is drawn on screen&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 14 Feb 2006 12:27:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1476</guid>
      <author>korakot (Korakot Chaovavanich)</author>
    </item>
  </channel>
</rss>
