<?xml version="1.0" encoding="utf-8" ?>
<!-- generator="FEEDCREATOR_VERSION" -->
<rss version="2.0" xmlns:sns="http://blog.sina.com.cn/sns">
    <channel>
        <title>成都游戏学院程序老师的博</title>
        <description></description>
        <link>http://blog.sina.com.cn/haoaiqiudebook</link>
        <lastBuildDate>Mon, 16 Nov 2009 11:41:11 GMT+8</lastBuildDate>
        <generator>FEEDCREATOR_VERSION</generator>
        <language>zh-cn</language>
        <copyright>Copyright 1996 - 2009 SINA Inc. All Rights Reserved.</copyright>
        <pubDate>Mon, 16 Nov 2009 03:41:11 GMT+8</pubDate>
        <item>
            <title>使用JavaME以流形式播放Web服务器上的音乐文件</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100aw64.html</link>
            <description><![CDATA[<div>成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115&nbsp;</DIV>
<div>
<p><font SIZE="2">本文介绍如何使用Java ME在SonyEricsson Java
平台6或者更新的电话上，例如W550,W900等，以流形式播放Web服务器上的音乐文件。当然，音乐文件可以使用实时流媒体协议播放，但是这里使用的是输入流。</FONT></P>
<p><font SIZE="2">首先，我们需要和服务器端的音乐文件建立流连接，然后把音乐文件存储在在手机的文件系统上。由于JP6平台的电话支持渐进播放音乐文件，因此我们不必等到所有文件都下载完成后才开始播放。</FONT></P>
<p><font SIZE="2">有两方面的问题需要我们考虑好：</FONT></P>
<p><font SIZE="2">1）下载的速度，程序需要建立一个缓冲区。</FONT></P>
<p><font SIZE="2">2）媒体时间，程序需要跟踪媒体时间，如果下载的速度比媒体播放速度慢，当播放器到达文件终点的时候，我们需要重新创建一个缓冲区然后设置正确的媒体时间开始播放。</FONT></P>
<p><font SIZE="2">下面的程序可以在电话的文件系统上创建一个文件并打开输出流。</FONT></P>
<p><span CLASS="code"><font SIZE="2">fConn =
(FileConnection)Connector.open("</FONT><a TARGET="_blank"><u><font COLOR="#0000FF" SIZE="2">file:///c:/other/mymusic.mp3</FONT></U></A><font SIZE="2">");<br/>
fConn.create();<br/>
outputStream = fConn.openOutputStream();</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">接下来把从输入流的数据写入到输出流中。</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">HttpConnection conn =
(HttpConnection)Connector.open(url);<br/>
InputStream is = conn.openInputStream();</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">int chunkSize = 512;<br/>
byte []data = new byte[chunkSize];<br/>
int length = 0;<br/>
do{<br/>
&nbsp;&nbsp;&nbsp; length =
is.read(data, 0, chunkSize);<br/>
&nbsp;&nbsp;&nbsp; progress +=
length;</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">&nbsp;&nbsp;&nbsp;
if(length != -1){<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
outputStream.write(data, 0, length);<br/>
&nbsp;&nbsp;&nbsp;
}&nbsp;&nbsp;&nbsp;</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">}while(length != -1);<br/>
当下载的缓冲区就绪之后，我们就可以播放文件了。</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">final String file =
"</FONT><a HREF="file:///c:/other/mymusic.mp3" TARGET="_blank"><font SIZE="2">file:///c:/other/mymusic.mp3</FONT></A><font SIZE="2">";</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">player =
Manager.createPlayer(file);<br/>
player.addPlayerListener(this);<br/>
player.realize();<br/>
player.setMediaTime(startTime);<br/></FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">记得记录媒体时间，当我们重新播放音乐的时候用得着。</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">Player应该实现PlayerListener接口，这样可以跟踪媒体的播放状态，如下所示：</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">public void
playerUpdate(javax.microedition.media.Player player, String str,
Object obj) {<br/>
&nbsp;&nbsp;&nbsp; if(str ==
PlayerListener.END_OF_MEDIA){<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
playerBufferAdd();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
player.close();<br/>
&nbsp;&nbsp;&nbsp; }<br/>
}</FONT></SPAN></P>
<p><span CLASS="code"><font SIZE="2">在playerUpdate()方法中我们跟踪是否播放器到达了文件的终点，如果是的话，创建一个新的缓冲区和新的播放器，把前面的播放器关闭，然后继续播放。</FONT></SPAN></P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100aw64.html#comment</comments>
            <pubDate>Tue, 16 Sep 2008 01:03:14 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100aw64.html</guid>
        </item>
        <item>
            <title>关于手机的IMEI号问题的一些总结</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100aw62.html</link>
            <description><![CDATA[<div>成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115&nbsp;</DIV>
<div>
一些网友问一些关于IMEI的问题，现在我把我所知道的IMEI的相关知识进行了一次小结，同时把各个智能手机论坛的IMEI相关信息进行了总结，希望能够为广大J2ME开发人员在进行IMEI开发过程中带来便利。&nbsp;&nbsp;&nbsp;&nbsp;</DIV>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
IMEI码是"International Mobile Equipment
Identity"的缩写，中文的意思是“国际移动设备识别码”，也俗称俗称＂串号＂存储在手机的EEPROM（俗称码片）里，每一个移动设备都对应一个唯一的IMEI。其组成结构为TAC（6位数字）+FAC（两位数字）+
SNR（6位数字）+SP
（1位数字）。TAC（设备型号核准号码），由欧洲型号认证中心分配。（和我们网卡的MAC地址很相似）　　<br/>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1.TAC：为设备型号核准号码，代表了手机的型号。各个手机品牌如诺基亚、爱立信或阿尔卡特，只要是同一型号的手机,TAC码一定是一样的，比如说笔者所见的几款阿尔卡特OT301的TAC码就都是332157。现在有不法商贩从广东那里买来旧机拆了机芯装换个壳子当新机卖，我们可以从TAC的差别中寻到其蛛丝马迹，只要你知道该型号手机的正确TAC编码一比较就知道了，因为旧机的型号一般都比较老了不会和现在比较流行的型号一样。　　</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2.FAC：为最后装配号码，代表了手机最后完成装配时是在什么地方，也就是最后装配的工厂在哪个国家或地区，一般不会具体的到哪个厂家，所以这并不是哪个国家制造的代号。不过，我们一般都将最后装配工序完成的工厂所在地当作手机产地,因此，FAC码也可以认为是手机产地的代号。现在各大手机厂商在国内都有自己的生产基地，生产中低档型号是没有问题的，所以你如果在国内买到这些品牌在国外的生产基地生产出来的中低档产品，那么这时候你就要当心一点了。因为国内还没有什么品牌的某款产品出现销售情况俏销至国内来不及生产要进口的状况。为防万一最好将将入网证放在验钞机下进行验证，如果入网证上显示出红色的“CMII”的图案和一个不是很清晰的数字，则为正规入网证，否则可以肯定的判定为是水货的。　　&nbsp;&nbsp;&nbsp;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3.SEN：为出厂序列号，代表了手机在手机的在工厂的编号。和其它产品的出厂序号一样，是为厂家的内部管理服务的，对我们一般用户并无多大意义。但是同一个牌子且同一型号的SN是不可能一样的,如果你发现有二支手机的SN是一模一样的话,那么其中一个至少有一个是假货了。<br/>

　　4.SPN：为备用号码，一般这个数字是零，当然也不都是，笔者的阿尔卡特OT301就是“4”，而像爱立
信T18SC、T28SC以近的机型在IMEI码最后还加上了两位版本号码，这其实也是正常的，只要前面三个号码没问题这个就可以不管它了。
应用实例。下面列出常见品牌产地代码数值及代表地区(摘自3G365智能手机网S60论坛)　　</P>
<p>
诺基亚：48、60、62、80、81、92、93－中国；06、07、08、20－法国；19、40、41、44－英国；10－芬兰；18－新加坡；30－韩国；67、68－美国；（10，70(改版?)：芬兰；20：德国；30：韩国；40：北京；60：东莞。
　　</P>
<p>摩托罗拉：
07、08－德国；18－新加坡；40、41－苏格兰；44－英国；48－香港、东南亚改装机；67－美国；80、81、92、93－中国；68－美洲；06(部分),07,08：德国；17：马来西亚(杭州?)；18：新加坡；40，41：苏格兰；44：英国；47：香港，东南亚改装机；48：大陆改装机；67：美国；68，美洲生产线；80，81，82：天津；92，93：杭州东信。　　</P>
<p>爱立信
19－英国；51－瑞典；61－香港；62－中国；19：英国；42：爱沙尼亚；51：瑞典(南京?)；61：香港；62：北京；71：马来西亚。　　</P>
<p>其他品牌：西门子 37：上海；51：德国；松 下 62：北京；三星
89、90、92：韩国:飞利浦 69：深圳&nbsp;</P>
<p>下面是在J2ME中获得IMEI的方法：<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1、&nbsp;
MOTO系列的手机可以通过读取系统的IMEI属性获得，代码如下：String imei
= System.getProperty("IMEI");<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2、&nbsp;
SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得，代码如下：String
imei = System.getProperty("com.siemens.IMEI");&nbsp;
在涉及到具体开发时，建议大家参考厂家具体的开发文档。</P>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100aw62.html#comment</comments>
            <pubDate>Tue, 16 Sep 2008 01:03:14 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100aw62.html</guid>
        </item>
        <item>
            <title>MIDP2.1规范的新特性</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100ak5w.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>MIDP
2.1规范最终定稿于2006年5月26日，是对MIDP2.0规范的补充。和MIDP
2.0规范相比，主要增加了下列新特性：<br/>
<br/>
1、
一个TextField或一个TextBox的最小尺寸（存储容量）不能少于1000个字符<br/>

<br/>
2、 LCDUI布局指令必须被遵循<br/>
<br/>
3、
LayoutManager.insert()方法的行为必须依照以下的描述：insert(Layer,int)<br/>

<br/>
描述：<br/>
<br/>
Public void insert(javax.microedition.lcdui.game.Layer l,int
index)<br/>
<br/>
插入一个新的Layer对象到LayoutManager在指定的索引值<br/>
<br/>
描述：<br/>
<br/>
插入一个已经被添加到这个LayoutManager的Layer对象等于先使用LayoutManager.remove()方法删除它，再用insert()方法添加到特定的索引。在LayoutManager.remove()方法被调用前，抛出IndexOutOfBoundsException的情况被检查<br/>

<br/>
参数：<br/>
<br/>
L：被插入的Layer对象<br/>
<br/>
Index：在被添加的新的Layer对象的索引值<br/>
<br/>
抛出：<br/>
<br/>
NullPointerException：如果Layer对象为null<br/>
<br/>
IndexOutOfBoundsException：如果索引值小于0。如果索引值大于已经被添加到LayoutManager中的Layer对象的数量且Layer对象不能被添加到这个LayoutManager中。如果索引值大于已经被添加到LayoutManager中的Layer对象的数量且Layer对象已经被添加到这个LayoutManager中<br/>

<br/>
4、 一个带有item
Command对象且表示模式是Item.PLAIN的StringTtem对象必须总是被作为添加了Command对象且表示模式是Item.HYPERLINK的StringTtem对象的方式显示<br/>

<br/>
5、 许多的MIDP
LUDUI图像组件能包含文本（换句话说，一个字母数字字符），那被显示给用户。这些组件的例子是List,
TextBox , Alert , StringItem
,Form和Item。一个实现常常需要截断这些可见的文本因为不能适合被给的UI组件的指定空间。在这种情况下，一个实现必须使用一个适当的可视化指示（例如一个省略符号）来指示用户，文本被截断。实际的符号或被用来显示截断的文本的符号以来于当前设备选择的区域设置。然而，可视化指示应该和用在设备本地的UI的指示一致。<br/>

<br/>
6、 Canvas的触摸事件必须被支持，如果<a TARGET="_blank"><u><strong><font COLOR="#0000FF">基础</FONT></STRONG></U></A>硬件支持这个特色。在这种情况下，Canvas.hasPointerEvents()方法应该总是返回true。<br/>

<br/>
7、
Canvas的触摸拖曳事件必须被支持，如果基础硬件支持这个特色。在这种情况下，Canvas.hasPointerEvents()方法应该总是返回true。<br/>

<br/>
8、
Canvas的重复事件必须被支持。在这种情况下，Canvas.hasRepeatEvents()方法应该总是返回true。<br/>

<br/>
9、
双缓冲图像必须被支持。在这种情况下，Canvas.isDoubleBuffered()方法应该总是返回true。<br/>

<br/>
10、
不同的文本输入模式的可用性（例如：预言输入和仅仅是数字的输入）应该和<a TARGET="_blank"><u><strong><font COLOR="#0000FF">Java</FONT></STRONG></U></A>和本地的应用程序相一致。这意味着，例如，如果预言输入文本模式在本地应用程序中可用，那也应该在Java应用程序中可用。<br/>

<br/>
11、
Image对象的创建（不管格式）必须至少支持：尺寸等于（屏幕宽度）乘以（屏幕高度）乘以（以字节为单位的颜色深度）或262144比特（128×128×16比特＝32KB），无论哪一个更大。注意，一个Image对象的内在表现应该保持至少每个象素16字节的颜色/透明度数据<br/>

<br/>
12、
每一个包括在字符串值的通过System.getProperty(“microedition.commports”)方法返回的串行端口名字必须可获取通过javax.microedition.io.CommConnection接口<br/>

<br/>
12、
在每个协议，AllowedSender域必须匹配适当的输入事件的地址域。地址域的使用和语法和语意以来于协议。然而，地址和过滤器必须被比较通过精确的字符串匹配，在那里，字符串被一个接着一个字符的比较，字符需要正确地匹配通过两个通配符<br/>

<br/>
13、 以下地网络通信协议必须被支持，提供了以下Java
ME接口的实现：javax.microedition.io.SockerConnection ,
javax.microedition.io.SecureConnection,
javax.microedition.io.HttpsConnection<br/>
<br/>
14、
javax.microedition.io.HttpsConnection和javax.microedition.io.SecureConnection必须支持SSLv3协议，其它的，例如TLS,WTLS也许被支持。<br/>

<br/>
15、 应用程序描述符应该包含MIDlet-Permissions<br/>
<br/>
16、
以下的JAD/manifest文件属性被定义来支持指定预期的运行时执行环境：Runtime-Execution-Environment：这是一个可选的属性，指出了应用程序必须的运行时执行环境。这个属性也许有值MIDP.CLDC.如果MIDlet
suite不指定属性，隐含的默认值是MIDP.CLDC。当值是MIDP.CLDC，实现的行为必须坚持在以下显示的更多的细节描述。这个属性值的附加值被在将来定义。手机实现必须支持这个属性。当值是MIDP.CLDC，实现的行为必须坚持以下要求：1、支持API和API行为，以及基础虚拟机，必须顺从CLDC1.1规范。2、手机实现也许二选一地使用Java
ME的CDC规范。然而，如果CDC被用作基础配置，运行在这个平台顶端的应用程序必须看见一个语义学和功能上等于CLDC1.1平台的环境。CDC特定的API或者CDC特定行为必须不能被暴露给应用程序或应用程序开发者。3、当一个应用程序定义了Runtime-Execution-Environment属性值，应用程序必须也定义一个CLDC平台在MicroEdition-Configuration属性值中。4、如果一个应用程序定义了不被实现支持的Runtime-Execution-Environment属性值或MicroEdition-Configuration属性值，应用程序不能被安装。所有的手机实现必须支持MIDP.CLDC值对于Runtime-Execution-Environment属性。<br/>

<br/>
17、 用户使用OTA下载安装之后，实现必须提示用户是否启动MIDlet<br/>
<br/>
18、 实现必须允许MIDlet创建最小为10个的线程<br/>
<br/>
19、 支持至少512个属性<br/>
<br/>
20、 支持MIDlet suite包含1到5个MIDlet<br/>
<br/>
21、 每个MIDlet
suite的RMS至少保证64K的空间，在内存足够的情况下<br/>
<br/>
22、 每个MIDlet suite至少可以创建10个独立记录存储<br/>
<br/>
23、 MIDP的MMAPI的子集必须遵守MMAPI1.1或以后版本<br/>
<br/>
24、
MicroEdition.profiles系统属性不能包含相同profile的不同的版本<br/>
<br/>
25、 Image对象中ISO/IEC JPEG和JFIF被支持<br/>
<br/>
26、 支持载入深度为1、2、4、8、16和32位的PNG格式<br/>
<br/>
27、
TextBox和TextField的约束TextField.EMAILDDR和TextField.URL必须允许相同的字符被输入如同被允许输入在TextField.ANY约束下<br/>

<br/>
28、
适合的设备必须实现基于时间的推注册，如果没有其它的安全机制基于时间的推注册不需要被显式的用户的许可<br/>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100ak5w.html#comment</comments>
            <pubDate>Fri, 05 Sep 2008 06:08:00 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100ak5w.html</guid>
        </item>
        <item>
            <title>WinCE中telnet,FTP及网络共享的使用方法</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100ak5t.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>&nbsp;</DIV>
<div>
WinCE为我们提供了强大的网络功能，只要在编译WinCE的时候，选择适当的组件，我们就可以在WinCE运行以后通过telnet或者FTP访问WinCE的文件系统，而且还可以相互共享文件夹，现在进入主题：
<p>1. 在WinCE6.0中，打开“Catalog
Items&nbsp;View”，然后依次选择“Core
OS”-&gt;"CEBASE"-&gt;"Communication Services and
Networking"-&gt;"Servers"，然后我们会看到“FTP Server”和“Telnet
Server”，选中这两项就可以了，接下来就是重新编译工程了。</P>
<p>2.
这里补充一句，我们的BSP里面要支持网络驱动，你的网络可以是基于以太网的网卡，或者基于USB的设备(比如RNDIS)，或者其它能支持网络的设备。你可以在注册表里为这个设备设定一个固定的IP地址，也可以使用DHCP(如果你的网络里有DHCP服务器的话)。</P>
<p>3.
脑子有点乱，这里还要补充一下，我们使用telnet和ftp每次登录都输入用户名和密码比较麻烦，把下面的注册表配置信息加入到platform.reg里面就可以匿名登录了：</P>
<p>[HKEY_LOCAL_MACHINE\COMM\TELNETD]<br/>
&nbsp;"UseAuthentication"=dword:0</P>
<p>[HKEY_LOCAL_MACHINE\COMM\FTPD]<br/>
&nbsp;"AllowAnonymous"=dword:1<br/>
&nbsp;"AllowAnonymousUpload"=dword:1<br/>
&nbsp;"AllowAnonymousVroots"=dword:1<br/>
&nbsp;"DefaultDir"="\\"<br/>
&nbsp;"IsEnabled"=dword:1<br/>
&nbsp;"UseAuthentication"=dword:0</P>
<p>4.
WinCE启动以后，假如WinCE的IP地址是192.168.0.86，当然PC要和WinCE的板子在同一个网段，这个属于网络基础知识，呵呵。通过telnet登录就输入：telnet
192.168.0.86，就应该能够登录到板子上了。如果通过FTP登录，就在PC上面打开Explorer，然后在地址栏输入：<a HREF="ftp://192.168.0.86/" TARGET="_blank"><font COLOR="#336699">ftp://192.168.0.86</FONT></A>&nbsp;
就可以了。</P>
<p>
上面介绍的应该比较简单。总之，只要你的BSP里面有网卡驱动，在WinCE中选择telnet和FTP就可以了。</P>
<p>
<strong>下面介绍一下如何在WinCE这边访问PC的共享文件夹：</STRONG></P>
<p>实现这个功能，我们要在“Catalog Items
View”中添加一个组件，依次“Core
OS”-&gt;"CEBASE"-&gt;"Communication Services and
Networking"-&gt;"Networking-General"-&gt;"Windows Networking
API/Redirector"，然后重新编译就可以了。</P>
<p>
在WinCE启动以后，在PC端打开命令行窗口，然后通过telnet登录到WinCE系统上(比如：telnet
192.168.0.86)，然后输入dir命令，就能看到WinCE里面的文件目录了，你会看到一个文件夹叫“network”。这时，使用net
use命令将PC端的共享文件夹映射到"network"文件夹下面。举例如下：</P>
<p ALIGN="left"><font FACE="Arial" SIZE="2">net use a <a TITLE="file://\\dell-01\\share" TARGET="_blank"><font COLOR="#336699">\\dell-01\\share</FONT></A> /user:guest</FONT></P>
<p ALIGN="left">net
use是命令；a是映射到本地的“network”文件夹下面的文件夹的名字；dell-01是计算机名；share是计算机上面的共享文件夹的名字；；/user:guest表示登录用户</P>
<p ALIGN="left">
这样，我们就能在“\network\a”下面看到PC端所共享的"Share"文件夹下面的所有文件了。</P>
<p ALIGN="left">&nbsp;</P>
<p ALIGN="left">
总结一下，上面介绍了telnet和ftp的使用，这个对于那些没有键盘鼠标和显示的WinCE系统是非常有用的，通过在WinCE上面使用net
use命令可以将PC的共享文件夹映射到本地并进行操作。</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100ak5t.html#comment</comments>
            <pubDate>Fri, 05 Sep 2008 06:08:00 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100ak5t.html</guid>
        </item>
        <item>
            <title>Mozilla开发未来浏览器Aurora</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100acq9.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>
据国外媒体报道，Mozilla基金会近日邀请各界人士共同参与网络技术的未来畅想计划，其中包括浏览器和用户界面的创新。</P>
<p>
　　未来十年Web将变成什么样子？人们还是像当前这样利用浏览器来访问Web，或者还是有新界面产生？人们还是利用PC接入互联网，还是已经换成手机？</P>
<p>
　　针对上述问题，Mozilla近日启动了共同参与网络技术的未来畅想计划。作为该计划的一部分，Mozilla实验室将与Adaptive
Path合作，共同开发Aurora浏览器，该浏览器将向世人展示未来的浏览器发展趋势。</P>
<p>　　Adaptive
Path是一家创建用户体验和设计的咨询公司，负责MySpace社交网站的最近改版工作。Aurora把数据和页面这两个概念整合之后，按照信息的类别加以细分。</P>
<p>
　　这种方式不仅可以使相似的信息成为一个整体，用户也能在此基础上对各种信息实时加以比较，找出自己最需要的信息。Aurora还拥有一个即时通话系统，可让用户在浏览网页的同时彼此交谈。</P>
<p>
　　Mozilla实验室副总裁克里斯·比尔德在博客中称，Mozilla希望各行各业的人们都能为网络的未来设计出谋划策。</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100acq9.html#comment</comments>
            <pubDate>Sun, 17 Aug 2008 03:55:54 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100acq9.html</guid>
        </item>
        <item>
            <title>苹果市值首次超过谷歌市值</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100acq8.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>
北京时间8月14日消息，苹果在美国东部时间本周三超越互联网巨头谷歌成为硅谷最有价值公司。</P>
<p>
自从谷歌在2004年IPO上市以来，苹果市值在本周三第一次超过谷歌市值。以周三的收盘价计算，苹果的总市值为1588亿美元，略高于谷歌的总市值1572亿美元。
但是这就足以将谷歌从硅谷最有价值公司的宝座上拉下来了。</P>
<p>这对于苹果来说是一个里程碑式的成就。</P>
<p>Piper Jaffray的分析师Gene
Munster说：“两家公司都不错，但是苹果略胜一筹。”</P>
<p>
他说，这是一个关于公司发展预期的问题。谷歌股东担心经济衰退会对在线广告产生较大不利影响。</P>
<p>
尽管苹果在7月份时预计未来几个季度的成本可能会较高，但是它的业绩仍超出了分析师的预期。</P>
<p>Creative Strategies的总裁Tim
Bajarin指出，除了谷歌首席执行官施密特担任着苹果董事以及两家公司的总部分别位于相邻的Cupertino和山景市之外，这两家公司没有太多的共同点。</P>
<p>他说：“这是两家旗鼓相当的公司。”</P>
<p>
苹果是一家硬件、软件和服务公司，优势和重点放在精巧的便携式设备上。谷歌是一家在线服务公司，优势和重点在于其搜索服务。</P>
<p>Bajarin说：“它们的业务很不一样，这是一个很重要的转折点。”</P>
<p>苹果在7月份刚刚推出的3G版iPhone越来越受到投资者的好评。</P>
<p>
Munster说：“从来没有一家规模象苹果那样大的公司能够象它那样保持着快速的增长。苹果保持快速增长的关键在于iPhone。”</P>
<p>
美国最大的电子产品零售商百思买在周三宣布，它将从9月份起开始销售苹果iPhone。那意味着美国消费者将可以从1000多家连锁店买到iPhone，它也是除了苹果和AT&amp;T之外的美国第三家销售iPhone的公司。百思买的许多连锁店里已经在销售苹果的笔记本电脑和台式机电脑了。</P>
<p>
Munster说：“iPhone在美国的销售点将增加大约50％。但是在长假购物旺季来临之前，百思买不会有太多的iPhone现货。”</P>
<p>
Munster说，市场对iPhone的需求一直就没有减弱过。据其研究认为，苹果通过其188家零售店平均每天可售出95部iPhone，而去年它推出第一版iPhone时的销售速度为平均每天售出21部iPhone。</P>
<p>
苹果股票在周三报收于每股179.30美元，涨幅为1.5％；当天谷歌股票报收于每股500.03美元，涨幅为0.5％</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100acq8.html#comment</comments>
            <pubDate>Sun, 17 Aug 2008 03:55:54 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100acq8.html</guid>
        </item>
        <item>
            <title>J2ME中的GIF处理类(下)</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100aaje.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115]</DIV>
<div>
<div STYLE="OVERFLOW: hidden" ALIGN="left">
<p>
&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp; protected
void readContents() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// read GIF file content blocks<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
boolean done = false;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (!(done || err())) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int code = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (code) {</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x2C: // image separator<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readImage();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x21: // extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (code) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0xf9: // graphics control extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readGraphicControlExt();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0xff: // application extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String app = "";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; 11; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
app += (char) block[i];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (app.equals("NETSCAPE2.0")) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readNetscapeExt();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skip(); // don't care<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default: // uninteresting extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skip();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x3b: // terminator<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
done = true;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x00: // bad byte, but keep going and see what happens<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readGraphicControlExt() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
read(); // block size<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int packed = read(); // packed fields<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dispose = (packed &amp; 0x1c) &gt;&gt; 2; // disposal method<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (dispose == 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dispose = 1; // elect to keep old image if discretionary<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
transparency = (packed &amp; 1) != 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = readShort() * 10; // delay in milliseconds<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
transIndex = read(); // transparent color index<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
read(); // block terminator<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readHeader() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String id = "";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; 6; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
id += (char) read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!id.startsWith("GIF")) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readLSD();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (gctFlag &amp;&amp; !err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gct = readColorTable(gctSize);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bgColor = gct[bgIndex];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readImage() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ix = readShort(); // (sub)image position &amp; size<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iy = readShort();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iw = readShort();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ih = readShort();</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int packed = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lctFlag = (packed &amp; 0x80) != 0; // 1 - local color table
flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
interlace = (packed &amp; 0x40) != 0; // 2 - interlace flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 3 - sort flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 4-5 - reserved<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lctSize = 2 &lt;&lt; (packed &amp; 7); // 6-8 - local color table
size</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lctFlag) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lct = readColorTable(lctSize); // read table<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act = lct; // make local table active<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act = gct; // make global table active<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (bgIndex == transIndex) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bgColor = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int save = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (transparency) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
save = act[transIndex];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act[transIndex] = 0; // set transparent color if specified<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (act == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR; // no color table defined<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
decodeImageData(); // decode pixel data<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skip();</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frameCount++;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// create new image to receive frame data<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
image = Image.createImage(width, height);</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
setPixels(); // transfer pixel data to image</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frames.addElement(new GifFrame(image, delay)); // add image to
frame<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// list</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (transparency) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act[transIndex] = save;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
resetFrame();</P>
<p>&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readLSD() {</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// logical screen size<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
width = readShort();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
height = readShort();</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// packed fields<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int packed = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gctFlag = (packed &amp; 0x80) != 0; // 1 : global color table
flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 2-4 : color resolution<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 5 : gct sort flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gctSize = 2 &lt;&lt; (packed &amp; 7); // 6-8 : gct size</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bgIndex = read(); // background color index<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelAspect = read(); // pixel aspect ratio<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readNetscapeExt() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
do {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (block[0] == 1) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// loop count sub-block<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int b1 = ((int) block[1]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int b2 = ((int) block[2]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
loopCount = (b2 &lt;&lt; 8) | b1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} while ((blockSize &gt; 0) &amp;&amp; !err());<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int readShort() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// read 16-bit value, LSB first<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return read() | (read() &lt;&lt; 8);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void resetFrame() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastDispose = dispose;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lrx = ix;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lry = iy;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lrw = iw;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lrh = ih;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage = image;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastBgColor = bgColor;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dispose = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
transparency = false;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lct = null;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void skip() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
do {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} while ((blockSize &gt; 0) &amp;&amp; !err());<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>}<br/></P>
</DIV>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100aaje.html#comment</comments>
            <pubDate>Mon, 11 Aug 2008 00:45:08 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100aaje.html</guid>
        </item>
        <item>
            <title>J2ME中的GIF处理类(中)</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100aajc.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115]</DIV>
<div>
<div STYLE="OVERFLOW: hidden" ALIGN="left">
<p>&nbsp;&nbsp;&nbsp;protected
void decodeImageData() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int NullCode = -1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int npix = iw * ih;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int available, clear, code_mask, code_size, end_of_information,
in_code, old_code, bits, code, count, i, datum, data_size, first,
top, bi, pi;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((pixels == null) || (pixels.length &lt; npix)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixels = new byte[npix];&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (prefix == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prefix = new short[MaxStackSize];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (suffix == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
suffix = new byte[MaxStackSize];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (pixelStack == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack = new byte[MaxStackSize + 1];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
data_size = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
clear = 1 &lt;&lt; data_size;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
end_of_information = clear + 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
available = clear + 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = NullCode;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_size = data_size + 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_mask = (1 &lt;&lt; code_size) - 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (code = 0; code &lt; clear; code++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prefix[code] = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
suffix[code] = (byte) code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
datum = bits = count = first = top = pi = bi = 0;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (i = 0; i &lt; npix; ) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (top == 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (bits &lt; code_size) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (count == 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
count = readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (count &lt;= 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bi = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
datum += (((int) block[bi]) &amp; 0xff) &lt;&lt; bits;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bits += 8;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bi++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
count--;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = datum &amp; code_mask;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
datum &gt;&gt;= code_size;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bits -= code_size;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((code &gt; available) || (code == end_of_information)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (code == clear) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_size = data_size + 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_mask = (1 &lt;&lt; code_size) - 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
available = clear + 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = NullCode;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (old_code == NullCode) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = suffix[code];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
first = code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
in_code = code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (code == available) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = (byte) first;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = old_code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} while (code &gt; clear) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = suffix[code];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = prefix[code];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
first = ((int) suffix[code]) &amp; 0xff;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (available &gt;= MaxStackSize) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = (byte) first;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prefix[available] = (short) old_code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
suffix[available] = (byte) first;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
available++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (((available &amp; code_mask) == 0)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&amp;&amp; (available &lt; MaxStackSize)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_size++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_mask += available;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = in_code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>&nbsp;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
top--;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixels[pi++] = pixelStack[top];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
i++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (i = pi; i &lt; npix; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixels[i] = 0;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
boolean err() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return status != STATUS_OK;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>protected void init() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_OK;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frameCount = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frames = new Vector();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gct = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lct = null;<br/>
&nbsp;&nbsp;&nbsp;
}&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int read() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int curByte = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
curByte = in.read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return curByte;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int readBlock() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
blockSize = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (blockSize &gt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int count = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (n &lt; blockSize) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
count = in.read(block, n, blockSize - n);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (count == -1) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
n += count;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (n &lt; blockSize) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return n;<br/>
&nbsp;&nbsp;&nbsp; }<br/>
&nbsp;&nbsp;&nbsp; protected
int[] readColorTable(int ncolors) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int nbytes = 3 * ncolors;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int[] tab = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
byte[] c = new byte[nbytes];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
n = in.read(c);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (n &lt; nbytes) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tab = new int[256];&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int i = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int j = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (i &lt; ncolors) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int r = ((int) c[j++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int g = ((int) c[j++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int b = ((int) c[j++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tab[i++] = 0xff000000 | (r &lt;&lt; 16) | (g &lt;&lt; 8) | b;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return tab;<br/>
&nbsp;&nbsp;&nbsp; }</P>
</DIV>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100aajc.html#comment</comments>
            <pubDate>Mon, 11 Aug 2008 00:45:08 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100aajc.html</guid>
        </item>
        <item>
            <title>J2ME中的GIF处理类(上)</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100aaj9.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115]</DIV>
<div>
<div STYLE="OVERFLOW: hidden" ALIGN="left">
<p>发一个GIF处理的类，可以减少图片资源，不需要太多的png了</P>
<p>用法如下：</P>
<p>private GIFDecode gifd;<br/>
&nbsp;private int ind;<br/>
&nbsp;private int gifCount;<br/>
&nbsp;private Image frame;</P>
<p>&nbsp;void initGIF() {<br/>
&nbsp;&nbsp;gifd = new GIFDecode();<br/>
&nbsp;&nbsp;gifd.read(this.getClass().getResourceAsStream("/ar.gif"));//载入gif图片<br/>

&nbsp;&nbsp;ind = 0;<br/>
&nbsp;&nbsp;gifCount =
gifd.getFrameCount();//获得帧数<br/>
&nbsp;&nbsp;System.out.println("gifCount="+gifCount);<br/>

&nbsp;}</P>
<p>&nbsp;void drawProgressBar(Graphics g, int xpos, int
ypos, int anchor) {<br/>
&nbsp;&nbsp;frame =
gifd.getFrame(ind);<br/>
&nbsp;&nbsp;ind++;<br/>
&nbsp;&nbsp;if (ind &gt;= gifCount) {<br/>
&nbsp;&nbsp;&nbsp;ind =
0;<br/>
&nbsp;&nbsp;}<br/>
&nbsp;&nbsp;g.drawImage(frame, xpos, ypos,
anchor);//循环绘图<br/>
&nbsp;}</P>
<p>&nbsp;</P>
<p>import java.util.Vector;<br/>
import java.io.InputStream;<br/>
import javax.microedition.lcdui.Image;</P>
<p>public class GIFDecode {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;
public static final int STATUS_OK = 0;<br/>
&nbsp;&nbsp;&nbsp; public
static final int STATUS_FORMAT_ERROR = 1;<br/>
&nbsp;&nbsp;&nbsp; public
static final int STATUS_OPEN_ERROR = 2;</P>
<p>&nbsp;&nbsp;&nbsp; protected
InputStream in;<br/>
&nbsp;&nbsp;&nbsp; protected
int status;</P>
<p>&nbsp;&nbsp;&nbsp; protected
int width; // full image width<br/>
&nbsp;&nbsp;&nbsp; protected
int height; // full image height<br/>
&nbsp;&nbsp;&nbsp; protected
boolean gctFlag; // global color table used<br/>
&nbsp;&nbsp;&nbsp; protected
int gctSize; // size of global color table<br/>
&nbsp;&nbsp;&nbsp; protected
int loopCount = 1; // iterations; 0 = repeat forever</P>
<p>&nbsp;&nbsp;&nbsp; protected
int[] gct; // global color table<br/>
&nbsp;&nbsp;&nbsp; protected
int[] lct; // local color table<br/>
&nbsp;&nbsp;&nbsp; protected
int[] act; // active color table</P>
<p>&nbsp;&nbsp;&nbsp; protected
int bgIndex; // background color index<br/>
&nbsp;&nbsp;&nbsp; protected
int bgColor; // background color<br/>
&nbsp;&nbsp;&nbsp; protected
int lastBgColor; // previous bg color<br/>
&nbsp;&nbsp;&nbsp; protected
int pixelAspect; // pixel aspect ratio</P>
<p>&nbsp;&nbsp;&nbsp; protected
boolean lctFlag; // local color table flag<br/>
&nbsp;&nbsp;&nbsp; protected
boolean interlace; // interlace flag<br/>
&nbsp;&nbsp;&nbsp; protected
int lctSize; // local color table size</P>
<p>&nbsp;&nbsp;&nbsp; protected
int ix, iy, iw, ih; // current image rectangle<br/>
&nbsp;&nbsp;&nbsp; protected
int lrx, lry, lrw, lrh;<br/>
&nbsp;&nbsp;&nbsp; protected
Image image; // current frame<br/>
&nbsp;&nbsp;&nbsp; protected
Image lastImage; // previous frame</P>
<p>&nbsp;&nbsp;&nbsp; protected
byte[] block = new byte[256]; // current data block<br/>
&nbsp;&nbsp;&nbsp; protected
int blockSize = 0; // block size</P>
<p>&nbsp;&nbsp;&nbsp; // last
graphic control extension info<br/>
&nbsp;&nbsp;&nbsp; protected
int dispose = 0;<br/>
<br/>
&nbsp;&nbsp;&nbsp; protected
int lastDispose = 0;<br/>
&nbsp;&nbsp;&nbsp; protected
boolean transparency = false;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int delay = 0;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int transIndex;</P>
<p>&nbsp;&nbsp;&nbsp; protected
static final int MaxStackSize = 4096;<br/>
<br/>
&nbsp;&nbsp;&nbsp; protected
short[] prefix;<br/>
&nbsp;&nbsp;&nbsp; protected
byte[] suffix;<br/>
&nbsp;&nbsp;&nbsp; protected
byte[] pixelStack;<br/>
&nbsp;&nbsp;&nbsp; protected
byte[] pixels;</P>
<p>&nbsp;&nbsp;&nbsp; protected
Vector frames;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int frameCount;</P>
<p>&nbsp;&nbsp;&nbsp; static
class GifFrame {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public GifFrame(Image im, int del) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
image = im;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = del;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public Image image;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public int delay;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p><br/>
&nbsp;&nbsp;&nbsp; public int
getDelay(int n) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = -1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((n &gt;= 0) &amp;&amp; (n &lt; frameCount)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = ((GifFrame) frames.elementAt(n)).delay;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return delay;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p><br/>
&nbsp;&nbsp;&nbsp; public int
getFrameCount() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return frameCount;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public Image
getImage() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return getFrame(0);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public int
getLoopCount() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return loopCount;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;<br/>

&nbsp;&nbsp;&nbsp; protected
void setPixels() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// expose destination image's pixels as int array<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int[] dest = new int[width * height];</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// fill in starting image contents based on last image's dispose
code<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastDispose &gt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastDispose == 3) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// use image before last<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n = frameCount - 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (n &gt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage = getFrame(n - 1);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastImage != null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage.getRGB(dest, 0, width, 0, 0, width, height);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// copy pixels</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastDispose == 2) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// fill last image rect area with background color<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int c = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!transparency) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c = lastBgColor;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; lrh; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n1 = (lry + i) * width + lrx;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n2 = n1 + lrw;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int k = n1; k &lt; n2; k++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dest[k] = c;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int pass = 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int inc = 8;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int iline = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; ih; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int line = i;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (interlace) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (iline &gt;= ih) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pass++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (pass) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 2:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline = 4;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 3:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline = 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inc = 4;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 4:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline = 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inc = 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
line = iline;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline += inc;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
line += iy;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (line &lt; height) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int k = line * width;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int dx = k + ix; // start of line in dest<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int dlim = dx + iw; // end of dest line<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((k + width) &lt; dlim) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dlim = k + width; // past dest edge<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int sx = i * iw; // start of line in source<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (dx &lt; dlim) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// map color and insert in destination<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int index = ((int) pixels[sx++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int c = act[index];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (c != 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dest[dx] = c;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dx++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
image = Image.createRGBImage(dest, width, height, false);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public Image
getFrame(int n) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Image im = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((n &gt;= 0) &amp;&amp; (n &lt; frameCount)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
im = ((GifFrame) frames.elementAt(n)).image;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return im;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public int
read(InputStream is) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
init();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (is != null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
in = is;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readHeader();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readContents();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (frameCount &lt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_OPEN_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
is.close();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return status;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;<br/>
</P>
</DIV>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100aaj9.html#comment</comments>
            <pubDate>Mon, 11 Aug 2008 00:45:08 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100aaj9.html</guid>
        </item>
        <item>
            <title>MobileMe仓促推出 未达“苹果标准”</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100aaj8.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115]</DIV>
<div>苹果首席执行官史蒂夫·乔布斯(Steve
Jobs)周一晚在发给苹果员工的内部电子邮件中承认,苹果上月推出的MobileMe互联网服务在时间上过于仓促,导致该服务没能达到该公司多年来坚持的“苹果标准”.<br/>

<br/>
今年7月中旬,苹果推出3G版iPhone智能手机后,紧接着又推出了MobileMe服务.通过这项服务,用户可把MobileMe服务器上的邮件、通讯录和日历发送到iPhone、iPod
Touch、Mac和PC终端之中.但MobileMe上线后不久,曾多次发生服务故障,不少苹果“粉丝”对此大为不满.<br/>

<br/>
乔布斯在周一的电子邮件中表示,MobileMe确实发生了故障;但这些失误应首先在测试工作加以解决,然后才能正式推出服务.总而言之,MobileMe服务犯了“欲速则不达”的错误.<br/>

<br/>
乔布斯在邮件中写道:“3G版iPhone发布时,我们还推出了iPhone 2.0及App
Store,这时MobileMe就不应该再来凑热闹.一下子推出这么多服务,使得我们手忙脚乱.如果MobileMe稍微晚些推出,也就不会出现那么多的问题了.”对于MobileMe服务故障,苹果认为问题根源在于管理混乱,因此此前已更换了该团队主管.<br/>

<br/>
乔布斯接着写道:“MobileMe服务故障一事表明,我们在互联网服务领域还有很多东西需要学习.也只有通过不断学习,才能使包括MobileMe在内的苹果互联网服务更上层楼.”<br/>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100aaj8.html#comment</comments>
            <pubDate>Mon, 11 Aug 2008 00:45:08 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100aaj8.html</guid>
        </item>
        <item>
            <title>微软下一代操作系统Midori曝光 应对互联网时代新挑战</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100a7v8.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>
近日曝光的微软内部文件显示，微软正在开发一款名为Midori的非Windows操作系统。该操作系统将采用全新的架构，以应对目前互联网时代出现的新挑战。</P>
<p>
　　微软内部文件已经给出了Midori的设计框架，该操作系统将以互联网为中心，强调系统的互联。Midori是微软研发部门此前设计的Singularity操作系统的一个分支，该系统将直接运行在现有的硬件上，包括x86、x64和ARM。</P>
<p>　　有报道显示，微软技术策略高级副总裁埃里克-卢德（Eric
Rudder）正领导该系统的开发。卢德是比尔-盖茨所倚重的高级技术人员之一，在2005年之前曾主管微软的服务器业务。微软发言人拒绝对此消息置评。</P>
<p>　研究机构Directions on Microsoft主管罗博-赫姆（Rob
Helm）表示：“这一消息是有可能的。有传言称卢德正在进行一个操作系统项目。”他指出，微软这一项目是探索性的，不过已经比微软研发部门所做的工作更进一步。</P>
<p>
　　对于Midori操作系统，微软目前所做的工作包括如何使该系统应用程序与Windows程序实现共存和互操作，并提供程序移植的方法。</P>
<p>
　　微软此前在设计Windows操作系统时，互联网还没有被广泛使用。计算机是当时用户的唯一设备，而关于并发性的问题当时还处于研究阶段。目前，用户已经拥有更多的设备，并且需要远程共享资源。因此，Midori将更多的关注并发性，包括分布式应用程序和本地应用程序等。</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100a7v8.html#comment</comments>
            <pubDate>Mon, 04 Aug 2008 05:25:39 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100a7v8.html</guid>
        </item>
        <item>
            <title>中移动限量手机游戏：上线数缩水2/3</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100a7v5.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
“最近中国移动出了第二个通知，手机游戏新规的正式实施时间推迟到9月1日。”7月30日，某手机游戏公司程军(化名)告诉记者，虽然晚一个月实施，但新规定仍将会对它们产生很大影响，“近期内部正在讨论应对方案。”
<p>
　　7月上旬，来自中国移动的一份通知发到了程军手中，该通知提醒，移动梦网旗下的游戏频道和百宝箱将从今年8月1日开始屏蔽超过数量限制的单机游戏，并要求各SP在7月31日前对游戏业务数量进行梳理。</P>
<p>
　　按通知规定，移动将对各SP上线的游戏数量大幅削减，其中普通级SP能上线的游戏数由60个骤降为6个。“我们公司就是普通级的，这样的大幅削减短期内肯定影响我们的收入。”程军说。</P>
<p>
　　尽管如此，对于中国移动此举，业界普遍持支持态度，并认为这将有利于行业环境和水平的提升。格锐数码总经理陈刚向记者表示，游戏数量太多，好的游戏很容易被淹没其中，“中国移动的新政策对有研发实力和服务意识，愿意做长久的公司是件好事。”</P>
<p>
　　这同时也意味着，对于一些没有核心实力没有好产品的小公司，可能将面临洗牌出局的命运。</P>
<p>　　<strong>缩水2/3</STRONG></P>
<p>
　　据记者了解，调整后，百宝箱线上业务数量的上限将变为：A级40个，B级30个，C级20个，普通级6个，信用不足的只能有2个；相比之前基本都减少了2/3以上。</P>
<p>
　　据悉，中国移动以前对SP上线游戏的数量限制为：A级130个，B级100个，C级80个，普通级60个，信用不足的SP也有30个。</P>
<p>
　　根据计划，移动将在7月18日至8月15日接受SP申报游戏业务在线计划；8月15日至31日进行业务沟通确认；9月1日起正式执行。</P>
<p>
　　陈刚认为，此次中国移动的调整，主要是为了提高百宝箱中手机游戏的品质，走精品路线，“能上线的游戏名额少了，就会迫使各SP拿出最好的游戏。”</P>
<p>
　　据程军估算，现在中国移动百宝箱上大概有两三百家SP，“按平均每家60个计算，已达上万款。这么多游戏难免参差不齐，用户如果下到几款烂游戏，很可能就不会再来这个平台了。”</P>
<p>
　　据易观国际近期发布《2008年第2季度中国手机游戏市场季度监测》显示，中国移动第二季度仅JAVA游戏市场规模就达1.89亿元，环比增长7.31%，同比增长46.84%。</P>
<p>
　　不过，程军向记者透露，百宝箱很早之前就开始了面临老用户大量流失的问题，“在线的游戏数量太多，对数量和质量几乎没什么限制。”</P>
<p>
　　事实上，中国移动对手机游戏的调整一直在进行。除百宝箱平台，中国移动此前还推出了精品游戏社区、网游平台，开放了新的计费平台，并做了游戏打包等推广活动，这些调整给中国移动的手机游戏业务带来了增长。</P>
<p>
　　而上线数量的缩减可能只是移动手机游戏战略的第一步，程军说，“现在是过渡期，移动可能从明年1月1日开始将百宝箱中所有的游戏内容转到统一的游戏频道中。”<strong>海外取经</STRONG></P>
<p>
　　陈刚告诉记者，手机游戏企业主要有四项业务来源——单机游戏、网游、帮海外公司代工、与手机厂商直接合作做内置游戏，“但无论是单机还是网游，运营商平台仍然是主要收入来源。”</P>
<p>
　　易观国际数据显示，掌中米格在中国移动JAVA业务SP信息费方面仅今年第二季度就获得了2505.86万元的收入，市场占比达17.3%。</P>
<p>
　　尽管有部分游戏厂商表示，与独立WAP站点合作的收入已经与从百宝箱中得到的收入基本相当，但程军表示，手机游戏厂商的主要收入还是离不开运营商渠道，因此运营商的每次政策变化都会引起业界格局的调整。</P>
<p>
　　程军告诉记者，之前做手机游戏相对容易，因为相对于PC游戏来说开发难度要低很多，CP可以在短时间内出很多款游戏，然后分给SP上线，“只要占据了好的位置，加上有好名称，就能吸引用户下载并实现收入。”</P>
<p>
　　“这次调整对纯游戏CP来说将更难做。”程军说，一方面上线的渠道更难了，这样能卖出去的游戏就更少；同时研发的成本会提高，要花更多的精力做出好游戏，然后还要经过SP的分成。</P>
<p>
　　陈刚表示，自己公司的部分手机游戏将会直接卖到韩国和欧洲等地，“在国外，很多运营商早就开始采用这样的做法了。”</P>
<p>
　　有业界人士表示，正是由于中国移动的相关领导去欧洲考察，发现那边的游戏少而精，回来后决定走精品路线。</P>
<p>
　　陈刚表示，移动近年的政策调整流程越来越透明，对SP的要求也越来越严，对产品品质的要求也越来越高，“中国移动的这些新政策会加速行业的优胜劣汰，这对整个行业是好事。”</P>
<p>　　<strong>付费模式</STRONG></P>
<p>
　　除了近期对游戏的数量和质量的限制，百宝箱的下载付费模式也成为业界议论的话题。</P>
<p>
　　许多独立WAP网站人士认为，现在手机游戏已由传统的单机版模式转向互联网模式，传统的下载付费型式将难以适应现在的环境。</P>
<p>
　　事实上，从去年底开始，众多CP已经开始尝试后付费模式，在独立WAP站点上提供免费下载，用户可以先试玩，体验好后再付钱。</P>
<p>
　　有观点认为，后付费的模式更符合消费者的心理，而且这种模式对游戏的品质要求提高，只有精品的游戏才能得到消费者的青睐。</P>
<p>
　　但程军则认为，对于单机游戏而言，下载付费更直接更简单，如果移动在第一关就做好了精品游戏的筛选，采用下载付费也未尝不可。</P>
<p>
　　程介绍说，之前很多游戏厂商的后付费模式其实是打了擦边球，“比如玩到一半通过发短信付费，因为短信SP和百宝箱SP是完全分开的，中间可能会有很多操作移动不好监控，这样做，在中国移动看来其实是违规行为。”</P>
<p>
　　据悉，今年3月，中国移动推出了新的游戏平台，开放手机游戏代收费接口，通过新的游戏平台，SP可以直接收费，不过限制一款游戏最多5处收费，并且有最高限额。</P>
<p>
　　“不管采取何种模式，未来对游戏厂商而言，提升游戏品质才是硬道理。”程军说。</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100a7v5.html#comment</comments>
            <pubDate>Mon, 04 Aug 2008 05:25:39 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100a7v5.html</guid>
        </item>
        <item>
            <title>Java手机机型对应表</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100a3tp.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>Java手机机型对应表<br/>
Motorola-L7系列：包含机型：Motorola-L7 U6 V360 V3i L7i</P>
<p>Motorola-A668系列：包含机型：Motorola-A668</P>
<p>Motorola-E680系列：包含机型：Motorola-E680i E680 A780
A1200<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
388C E680g&nbsp;&nbsp; E6</P>
<p>Motorola-L6系列：包含机型：Motorola-L6 L2 L6i L6g</P>
<p>Motorola-V600系列：包含机型：Motorola-V600 V501 V500 V303<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
V300 V400</P>
<p>Motorola-V878系列：包含机型：Motorola-V878 V872 V690 V860<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
V868</P>
<p>Motorola-E398系列：包含机型：Motorola-V3 E375 V80 V635<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
V600i E398 A835 V975 V8 V925<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
E390 E550 C975 A630 A890 E770</P>
<p>Motorola-E2系列：包含机型：Motorola-E2</P>
<p>Motorola-C650系列：包含机型：Motorola-V220 V226 V180 V188<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
C650 C381</P>
<p>Motorola-A760系列：包含机型：Motorola-A768i A768 A760i
A728<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
A760</P>
<p>Nokia-7610系列：包含机型：Nokia-3230 6260 6600 6630 6670<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6680 6681 6682 7610 N70 N72</P>
<p>Nokia-7370系列：包含机型：Nokia-7370 6131 6270 6280 6300<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7373 7390 6233 6234 5300 6275<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6268 7710 9210 9300 9300i 9500</P>
<p>Nokia-7260系列：包含机型：Nokia-3220 6020 6165 6230 6265i<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7260 7280</P>
<p>Nokia-6708系列：包含机型：Nokia-6708</P>
<p>Nokia-6230i系列：包含机型：Nokia-6230i 8800 5500</P>
<p>Nokia-6101系列：包含机型：Nokia-2855 3152 3155 3155i 6060<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6101 6100 6152 6155 6155i 6170<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6255 7270 7360<br/>
Nokia-6111系列:包含机型：Nokia-6111 6125 6151 5200 6085<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2865</P>
<p>Nokia-5500系列：包含机型：Nokia-5500</P>
<p>Nokia-N73系列：包含机型：Nokia-N73 N71 N93 E50</P>
<p>sonyericsson-K300系列：包含机型：sonyericsson-K300C J300C</P>
<p>sonyericsson-K506系列：包含机型：sonyericsson-K508C K508i<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
K506C K500i K500C Z600 Z608C Z520C<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
F500 Z500 Z500c</P>
<p>sonyericsson-S700系列：包含机型：sonyericsson-S700C K790C<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
W830c</P>
<p>sonyericsson-K700系列：包含机型：sonyericsson-K758c K750c<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
K700c W530C&nbsp; W550c W600C<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
K600c W810c Z550c W700c<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
K750 W550 W800</P>
<p>sonyericsson-P908系列：包含机型：sonyericsson-P910c
P908&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
P900 P802 P800</P>
<p>sonyericsson-W958C系列：包含机型：sonyericsson-M608c W958c</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100a3tp.html#comment</comments>
            <pubDate>Sat, 26 Jul 2008 03:25:57 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100a3tp.html</guid>
        </item>
        <item>
            <title>iPhone发现安全漏洞</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100a3to.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>
7月25消息，安全研究人员日前称，iPhone的电子邮件和Safari浏览器应用程序容易受到URL欺骗，可能使iPhone用户遭到钓鱼攻击。</P>
<p><br/>
这个警告是在人们意料之中的。在iPhone于7月11日发布之前，Raff等安全人员就指出他们发现了iPhone的安全漏洞。但是，他们要等待iPhone
2.0最终发布之后再说。</P>
<p><br/>
Raff说，通过创建一个特别设计的URL，攻击者能够创建一个在iPhone电子邮件程序显示出来的表面上看是来自于可信赖的站点的电子邮件链接。点击这个链接，Safari浏览器就会访问一个钓鱼攻击网站。这个问题影响到iPhone
1.1.4和2.0用户。</P>
<p><br/>
Raff已经把这个安全漏洞通知了苹果，并且在博客中说他在苹果发布补丁之前不会在博客中披露这个安全漏洞的细节。</P>
<p><br/>
Raff建议用户在苹果发布安全补丁之前不要点击电子邮件应用程序中指向可信赖网站的链接。用户应该在Safari浏览器中手工输入网站的URL地址。&nbsp;</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100a3to.html#comment</comments>
            <pubDate>Sat, 26 Jul 2008 03:25:57 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100a3to.html</guid>
        </item>
        <item>
            <title>byte[]与其他转换</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100a1ue.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>public class ByteUtil {</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public
static void main(String[] args) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
short s = -20;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
byte[] b = new byte[2];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
putShort(b, s, 0);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ByteBuffer buf = ByteBuffer.allocate(2);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.put(b);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.flip();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(getShort(b, 0));<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(buf.getShort());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println("***************************");<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int i = -40;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
b = new byte[4];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
putInt(b, i, 0);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf = ByteBuffer.allocate(4);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.put(b);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.flip();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(getInt(b, 0));<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(buf.getInt());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println("***************************");<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
long l = -40;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
b = new byte[8];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
putLong(b, l, 0);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf = ByteBuffer.allocate(8);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.put(b);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.flip();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(getLong(b, 0));<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(buf.getLong());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println("***************************");<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp; public
static void putShort(byte b[], short s, int index) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
b[index] = (byte) (s &gt;&gt; 8);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
b[index + 1] = (byte) (s &gt;&gt; 0);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp; public
static short getShort(byte[] b, int index) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return (short) (((b[index] &lt;&lt; 8) | b[index + 1] &amp;
0xff));<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp; //
///////////////////////////////////////////////////////<br/>
&nbsp;&nbsp;&nbsp; public
static void putInt(byte[] bb, int x, int index) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 0] = (byte) (x &gt;&gt; 24);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 1] = (byte) (x &gt;&gt; 16);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 2] = (byte) (x &gt;&gt; 8);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 3] = (byte) (x &gt;&gt; 0);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp; public
static int getInt(byte[] bb, int index) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return (int) ((((bb[index + 0] &amp; 0xff) &lt;&lt; 24)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| ((bb[index + 1] &amp; 0xff) &lt;&lt; 16)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| ((bb[index + 2] &amp; 0xff) &lt;&lt; 8) | ((bb[index + 3] &amp;
0xff) &lt;&lt; 0)));<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp; //
/////////////////////////////////////////////////////////<br/>
&nbsp;&nbsp;&nbsp; public
static void putLong(byte[] bb, long x, int index) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 0] = (byte) (x &gt;&gt; 56);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 1] = (byte) (x &gt;&gt; 48);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 2] = (byte) (x &gt;&gt; 40);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 3] = (byte) (x &gt;&gt; 32);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 4] = (byte) (x &gt;&gt; 24);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 5] = (byte) (x &gt;&gt; 16);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 6] = (byte) (x &gt;&gt; 8);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bb[index + 7] = (byte) (x &gt;&gt; 0);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp; public
static long getLong(byte[] bb, int index) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return ((((long) bb[index + 0] &amp; 0xff) &lt;&lt; 56)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| (((long) bb[index + 1] &amp; 0xff) &lt;&lt; 48)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| (((long) bb[index + 2] &amp; 0xff) &lt;&lt; 40)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| (((long) bb[index + 3] &amp; 0xff) &lt;&lt; 32)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| (((long) bb[index + 4] &amp; 0xff) &lt;&lt; 24)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| (((long) bb[index + 5] &amp; 0xff) &lt;&lt; 16)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
| (((long) bb[index + 6] &amp; 0xff) &lt;&lt; 8) | (((long)
bb[index + 7] &amp; 0xff) &lt;&lt; 0));<br/>
&nbsp;&nbsp;&nbsp; }</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100a1ue.html#comment</comments>
            <pubDate>Mon, 21 Jul 2008 07:03:21 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100a1ue.html</guid>
        </item>
        <item>
            <title>访问android平台的通话记录CallLog</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a0100a1ub.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115</DIV>
<div>
<p>
Android平台开放程度的确很厉害，你几乎可以调用任何底层的接口，甚至拦截到短信或者呼入电话。这些是J2ME平台无法比拟的。本文介绍一下如何访问android的通话记录。</P>
<p>android平台上的通话记录是以Content
Provider的形式存储在手机上的，因此你需要使用ContentResolver来查询通话记录，返回Cursor接口。如下所示：</P>
<p>package com.me;</P>
<p>import android.app.ListActivity;<br/>
import android.database.Cursor;<br/>
import android.os.Bundle;<br/>
import android.provider.CallLog;<br/>
import android.widget.SimpleAdapter;<br/>
import android.widget.SimpleCursorAdapter;</P>
<p>public class CallLogActivity extends ListActivity {</P>
<p>&nbsp;@Override<br/>
&nbsp;protected void onCreate(Bundle arg0) {<br/>
&nbsp;&nbsp;super.onCreate(arg0);<br/>
&nbsp;&nbsp;setContentView(R.layout.main);<br/>

&nbsp;&nbsp;Cursor cursor =
getContentResolver().query(CallLog.Calls.CONTENT_URI,<br/>
&nbsp;&nbsp;&nbsp;&nbsp;null,
null, null, CallLog.Calls.DEFAULT_SORT_ORDER);<br/>
&nbsp;&nbsp;startManagingCursor(cursor);<br/>

&nbsp;&nbsp;SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this,<br/>
&nbsp;&nbsp;&nbsp;&nbsp;android.R.layout.simple_list_item_1,
cursor,<br/>
&nbsp;&nbsp;&nbsp;&nbsp;new
String[] { CallLog.Calls.NUMBER },<br/>
&nbsp;&nbsp;&nbsp;&nbsp;new
int[] { android.R.id.text1 });</P>
<p>
&nbsp;&nbsp;setListAdapter(adapter);<br/>
&nbsp;}</P>
<p>}<br/></P>
<p>
获得了Cursor之后便可以构建一个Adapter然后调用setListAdapter()来把通话记录显示在屏幕上。CallLog类中定义了Calls类，在android中可以看到大量的内部类的设计。Calls定义了很多常量，方便你来访问通话记录，主要包括两个URI和多个字段定义，比如我们在这里用到的NUMBER。更多内容请参考Andorid
doc。</P>
<p>下面是/res/layout/main.xml</P>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br/>
&lt;LinearLayout xmlns:android="<a HREF="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</A>"<br/>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
android:layout_width="fill_parent"<br/>
&nbsp;&nbsp;&nbsp;
&nbsp;android:layout_height="fill_parent"&gt;<br/>
&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; &lt;ListView
android:id="@+id/android:list"<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
android:layout_width="fill_parent"<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;android:layout_height="fill_parent"/&gt;<br/>
&nbsp; &nbsp;&lt;TextView
android:id="@+id/android:empty"<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
android:layout_width="fill_parent"<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;android:layout_height="fill_parent"<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;android:text="No Notes!"/&gt;<br/>
&lt;/LinearLayout&gt;<br/></P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a0100a1ub.html#comment</comments>
            <pubDate>Mon, 21 Jul 2008 07:03:21 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a0100a1ub.html</guid>
        </item>
        <item>
            <title>GIF处理的类，可以减少图片资源，不需要太多的png了(下)</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a01009y5e.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115
<p><br/>
&nbsp;&nbsp;&nbsp; protected
int[] readColorTable(int ncolors) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int nbytes = 3 * ncolors;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int[] tab = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
byte[] c = new byte[nbytes];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
n = in.read(c);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (n &lt; nbytes) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tab = new int[256]; // max size to avoid bounds checks<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int i = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int j = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (i &lt; ncolors) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int r = ((int) c[j++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int g = ((int) c[j++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int b = ((int) c[j++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tab[i++] = 0xff000000 | (r &lt;&lt; 16) | (g &lt;&lt; 8) | b;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return tab;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readContents() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// read GIF file content blocks<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
boolean done = false;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (!(done || err())) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int code = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (code) {</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x2C: // image separator<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readImage();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x21: // extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (code) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0xf9: // graphics control extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readGraphicControlExt();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0xff: // application extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String app = "";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; 11; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
app += (char) block[i];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (app.equals("NETSCAPE2.0")) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readNetscapeExt();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skip(); // don't care<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default: // uninteresting extension<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skip();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x3b: // terminator<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
done = true;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 0x00: // bad byte, but keep going and see what happens<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readGraphicControlExt() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
read(); // block size<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int packed = read(); // packed fields<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dispose = (packed &amp; 0x1c) &gt;&gt; 2; // disposal method<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (dispose == 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dispose = 1; // elect to keep old image if discretionary<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
transparency = (packed &amp; 1) != 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = readShort() * 10; // delay in milliseconds<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
transIndex = read(); // transparent color index<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
read(); // block terminator<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readHeader() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String id = "";<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; 6; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
id += (char) read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!id.startsWith("GIF")) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readLSD();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (gctFlag &amp;&amp; !err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gct = readColorTable(gctSize);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bgColor = gct[bgIndex];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readImage() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ix = readShort(); // (sub)image position &amp; size<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iy = readShort();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iw = readShort();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ih = readShort();</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int packed = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lctFlag = (packed &amp; 0x80) != 0; // 1 - local color table
flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
interlace = (packed &amp; 0x40) != 0; // 2 - interlace flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 3 - sort flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 4-5 - reserved<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lctSize = 2 &lt;&lt; (packed &amp; 7); // 6-8 - local color table
size</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lctFlag) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lct = readColorTable(lctSize); // read table<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act = lct; // make local table active<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act = gct; // make global table active<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (bgIndex == transIndex) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bgColor = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int save = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (transparency) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
save = act[transIndex];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act[transIndex] = 0; // set transparent color if specified<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (act == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR; // no color table defined<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
decodeImageData(); // decode pixel data<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
skip();</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frameCount++;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// create new image to receive frame data<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
image = Image.createImage(width, height);</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
setPixels(); // transfer pixel data to image</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frames.addElement(new GifFrame(image, delay)); // add image to
frame<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// list</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (transparency) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
act[transIndex] = save;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
resetFrame();</P>
<p>&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readLSD() {</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// logical screen size<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
width = readShort();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
height = readShort();</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// packed fields<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int packed = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gctFlag = (packed &amp; 0x80) != 0; // 1 : global color table
flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 2-4 : color resolution<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// 5 : gct sort flag<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gctSize = 2 &lt;&lt; (packed &amp; 7); // 6-8 : gct size</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bgIndex = read(); // background color index<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelAspect = read(); // pixel aspect ratio<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void readNetscapeExt() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
do {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (block[0] == 1) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// loop count sub-block<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int b1 = ((int) block[1]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int b2 = ((int) block[2]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
loopCount = (b2 &lt;&lt; 8) | b1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} while ((blockSize &gt; 0) &amp;&amp; !err());<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int readShort() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// read 16-bit value, LSB first<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return read() | (read() &lt;&lt; 8);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void resetFrame() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastDispose = dispose;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lrx = ix;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lry = iy;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lrw = iw;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lrh = ih;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage = image;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastBgColor = bgColor;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dispose = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
transparency = false;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lct = null;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void skip() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
do {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} while ((blockSize &gt; 0) &amp;&amp; !err());<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>}<br/></P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a01009y5e.html#comment</comments>
            <pubDate>Sat, 12 Jul 2008 03:08:29 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a01009y5e.html</guid>
        </item>
        <item>
            <title>GIF处理的类，可以减少图片资源，不需要太多的png了(中)</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a01009y5c.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115
<p><br/>
&nbsp;&nbsp;&nbsp; protected
void decodeImageData() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int NullCode = -1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int npix = iw * ih;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int available, clear, code_mask, code_size, end_of_information,
in_code, old_code, bits, code, count, i, datum, data_size, first,
top, bi, pi;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((pixels == null) || (pixels.length &lt; npix)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixels = new byte[npix]; // allocate new pixel array<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (prefix == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prefix = new short[MaxStackSize];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (suffix == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
suffix = new byte[MaxStackSize];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (pixelStack == null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack = new byte[MaxStackSize + 1];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Initialize GIF data stream decoder.</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
data_size = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
clear = 1 &lt;&lt; data_size;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
end_of_information = clear + 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
available = clear + 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = NullCode;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_size = data_size + 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_mask = (1 &lt;&lt; code_size) - 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (code = 0; code &lt; clear; code++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prefix[code] = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
suffix[code] = (byte) code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Decode GIF pixel stream.</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
datum = bits = count = first = top = pi = bi = 0;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (i = 0; i &lt; npix; ) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (top == 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (bits &lt; code_size) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Load bytes until there are enough bits for a code.<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (count == 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Read a new data block.<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
count = readBlock();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (count &lt;= 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bi = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
datum += (((int) block[bi]) &amp; 0xff) &lt;&lt; bits;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bits += 8;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bi++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
count--;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Get the next code.</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = datum &amp; code_mask;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
datum &gt;&gt;= code_size;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
bits -= code_size;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Interpret the code</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((code &gt; available) || (code == end_of_information)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (code == clear) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Reset decoder.<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_size = data_size + 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_mask = (1 &lt;&lt; code_size) - 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
available = clear + 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = NullCode;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (old_code == NullCode) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = suffix[code];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
first = code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
in_code = code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (code == available) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = (byte) first;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = old_code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} while (code &gt; clear) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = suffix[code];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code = prefix[code];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
first = ((int) suffix[code]) &amp; 0xff;</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Add a new string to the string table,</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (available &gt;= MaxStackSize) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixelStack[top++] = (byte) first;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prefix[available] = (short) old_code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
suffix[available] = (byte) first;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
available++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (((available &amp; code_mask) == 0)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&amp;&amp; (available &lt; MaxStackSize)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_size++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
code_mask += available;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
old_code = in_code;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Pop a pixel off the pixel stack.</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
top--;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixels[pi++] = pixelStack[top];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
i++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (i = pi; i &lt; npix; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pixels[i] = 0; // clear missing pixels<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
boolean err() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return status != STATUS_OK;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void init() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_OK;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frameCount = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
frames = new Vector();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gct = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lct = null;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int read() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int curByte = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
curByte = in.read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return curByte;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
int readBlock() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
blockSize = read();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (blockSize &gt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int count = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (n &lt; blockSize) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
count = in.read(block, n, blockSize - n);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (count == -1) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
n += count;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (n &lt; blockSize) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return n;<br/>
&nbsp;&nbsp;&nbsp; }</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a01009y5c.html#comment</comments>
            <pubDate>Sat, 12 Jul 2008 03:08:29 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a01009y5c.html</guid>
        </item>
        <item>
            <title>GIF处理的类，可以减少图片资源，不需要太多的png了(上)</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a01009y5b.html</link>
            <description><![CDATA[<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115
<p>private GIFDecode gifd;<br/>
&nbsp;private int ind;<br/>
&nbsp;private int gifCount;<br/>
&nbsp;private Image frame;</P>
<p>&nbsp;void initGIF() {<br/>
&nbsp;&nbsp;gifd = new GIFDecode();<br/>
&nbsp;&nbsp;gifd.read(this.getClass().getResourceAsStream("/ar.gif"));//载入gif图片<br/>

&nbsp;&nbsp;ind = 0;<br/>
&nbsp;&nbsp;gifCount =
gifd.getFrameCount();//获得帧数<br/>
&nbsp;&nbsp;System.out.println("gifCount="+gifCount);<br/>

&nbsp;}</P>
<p>&nbsp;void drawProgressBar(Graphics g, int xpos, int
ypos, int anchor) {<br/>
&nbsp;&nbsp;frame =
gifd.getFrame(ind);<br/>
&nbsp;&nbsp;ind++;<br/>
&nbsp;&nbsp;if (ind &gt;= gifCount) {<br/>
&nbsp;&nbsp;&nbsp;ind =
0;<br/>
&nbsp;&nbsp;}<br/>
&nbsp;&nbsp;g.drawImage(frame, xpos, ypos,
anchor);//循环绘图<br/>
&nbsp;}</P>
<p>
//////////////////////////////////////////////////////////////////////////////////</P>
<p>import java.util.Vector;<br/>
import java.io.InputStream;<br/>
import javax.microedition.lcdui.Image;</P>
<p>public class GIFDecode {<br/>
&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public
static final int STATUS_OK = 0;</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public
static final int STATUS_FORMAT_ERROR = 1;</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public
static final int STATUS_OPEN_ERROR = 2;</P>
<p>&nbsp;&nbsp;&nbsp; protected
InputStream in;<br/>
&nbsp;&nbsp;&nbsp; protected
int status;</P>
<p>&nbsp;&nbsp;&nbsp; protected
int width; // full image width<br/>
&nbsp;&nbsp;&nbsp; protected
int height; // full image height<br/>
&nbsp;&nbsp;&nbsp; protected
boolean gctFlag; // global color table used<br/>
&nbsp;&nbsp;&nbsp; protected
int gctSize; // size of global color table<br/>
&nbsp;&nbsp;&nbsp; protected
int loopCount = 1; // iterations; 0 = repeat forever</P>
<p>&nbsp;&nbsp;&nbsp; protected
int[] gct; // global color table<br/>
&nbsp;&nbsp;&nbsp; protected
int[] lct; // local color table<br/>
&nbsp;&nbsp;&nbsp; protected
int[] act; // active color table</P>
<p>&nbsp;&nbsp;&nbsp; protected
int bgIndex; // background color index<br/>
&nbsp;&nbsp;&nbsp; protected
int bgColor; // background color<br/>
&nbsp;&nbsp;&nbsp; protected
int lastBgColor; // previous bg color<br/>
&nbsp;&nbsp;&nbsp; protected
int pixelAspect; // pixel aspect ratio</P>
<p>&nbsp;&nbsp;&nbsp; protected
boolean lctFlag; // local color table flag<br/>
&nbsp;&nbsp;&nbsp; protected
boolean interlace; // interlace flag<br/>
&nbsp;&nbsp;&nbsp; protected
int lctSize; // local color table size</P>
<p>&nbsp;&nbsp;&nbsp; protected
int ix, iy, iw, ih; // current image rectangle<br/>
&nbsp;&nbsp;&nbsp; protected
int lrx, lry, lrw, lrh;<br/>
&nbsp;&nbsp;&nbsp; protected
Image image; // current frame<br/>
&nbsp;&nbsp;&nbsp; protected
Image lastImage; // previous frame</P>
<p>&nbsp;&nbsp;&nbsp; protected
byte[] block = new byte[256]; // current data block<br/>
&nbsp;&nbsp;&nbsp; protected
int blockSize = 0; // block size</P>
<p>&nbsp;&nbsp;&nbsp; // last
graphic control extension info<br/>
&nbsp;&nbsp;&nbsp; protected
int dispose = 0;<br/>
&nbsp;&nbsp;&nbsp; // 0=no
action; 1=leave in place; 2=restore to bg; 3=restore to prev<br/>
&nbsp;&nbsp;&nbsp; protected
int lastDispose = 0;<br/>
&nbsp;&nbsp;&nbsp; protected
boolean transparency = false; // use transparent color<br/>
&nbsp;&nbsp;&nbsp; protected
int delay = 0; // delay in milliseconds<br/>
&nbsp;&nbsp;&nbsp; protected
int transIndex; // transparent color index</P>
<p>&nbsp;&nbsp;&nbsp; protected
static final int MaxStackSize = 4096;<br/>
&nbsp;&nbsp;&nbsp; // max
decoder pixel stack size</P>
<p>&nbsp;&nbsp;&nbsp; // LZW
decoder working arrays<br/>
&nbsp;&nbsp;&nbsp; protected
short[] prefix;<br/>
&nbsp;&nbsp;&nbsp; protected
byte[] suffix;<br/>
&nbsp;&nbsp;&nbsp; protected
byte[] pixelStack;<br/>
&nbsp;&nbsp;&nbsp; protected
byte[] pixels;</P>
<p>&nbsp;&nbsp;&nbsp; protected
Vector frames; // frames read from current file<br/>
&nbsp;&nbsp;&nbsp; protected
int frameCount;</P>
<p>&nbsp;&nbsp;&nbsp; static
class GifFrame {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public GifFrame(Image im, int del) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
image = im;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = del;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public Image image;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public int delay;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public int
getDelay(int n) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = -1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((n &gt;= 0) &amp;&amp; (n &lt; frameCount)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay = ((GifFrame) frames.elementAt(n)).delay;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return delay;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public int
getFrameCount() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return frameCount;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public Image
getImage() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return getFrame(0);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public int
getLoopCount() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return loopCount;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; protected
void setPixels() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// expose destination image's pixels as int array<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int[] dest = new int[width * height];</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// fill in starting image contents based on last image's dispose
code<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastDispose &gt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastDispose == 3) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// use image before last<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n = frameCount - 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (n &gt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage = getFrame(n - 1);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastImage != null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lastImage.getRGB(dest, 0, width, 0, 0, width, height);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// copy pixels</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (lastDispose == 2) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// fill last image rect area with background color<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int c = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!transparency) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c = lastBgColor;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; lrh; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n1 = (lry + i) * width + lrx;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int n2 = n1 + lrw;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int k = n1; k &lt; n2; k++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dest[k] = c;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</P>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// copy each source line to the appropriate place in the
destination<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int pass = 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int inc = 8;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int iline = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (int i = 0; i &lt; ih; i++) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int line = i;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (interlace) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (iline &gt;= ih) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pass++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (pass) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 2:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline = 4;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 3:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline = 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inc = 4;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case 4:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline = 1;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inc = 2;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
line = iline;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iline += inc;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
line += iy;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (line &lt; height) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int k = line * width;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int dx = k + ix; // start of line in dest<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int dlim = dx + iw; // end of dest line<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((k + width) &lt; dlim) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dlim = k + width; // past dest edge<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int sx = i * iw; // start of line in source<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (dx &lt; dlim) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// map color and insert in destination<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int index = ((int) pixels[sx++]) &amp; 0xff;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int c = act[index];<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (c != 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dest[dx] = c;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dx++;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
image = Image.createRGBImage(dest, width, height, false);<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public Image
getFrame(int n) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Image im = null;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((n &gt;= 0) &amp;&amp; (n &lt; frameCount)) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
im = ((GifFrame) frames.elementAt(n)).image;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return im;<br/>
&nbsp;&nbsp;&nbsp; }</P>
<p>&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp; public int
read(InputStream is) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
init();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (is != null) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
in = is;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readHeader();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!err()) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
readContents();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (frameCount &lt; 0) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_FORMAT_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
status = STATUS_OPEN_ERROR;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
try {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
is.close();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} catch (Exception e) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return status;<br/>
&nbsp;&nbsp;&nbsp; }</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a01009y5b.html#comment</comments>
            <pubDate>Sat, 12 Jul 2008 03:08:29 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a01009y5b.html</guid>
        </item>
        <item>
            <title>手机操作系统进入联盟交锋时代</title>
            <link>http://blog.sina.com.cn/s/blog_511f804a01009tek.html</link>
            <description><![CDATA[<style TYPE="text/css">
/**/
.pb{}
.pb textarea{font-size:14px; margin:10px; font-family:"宋体"; background:#FFFFEE; color:#000066}
.pb_t{line-height:30px; font-size:14px; color:#000; text-align:center;}


.pagebox{overflow:hidden; zoom:1; font-size:12px; font-family:"宋体",sans-serif;}
.pagebox span{float:left; margin-right:2px; overflow:hidden; text-align:center; background:#fff;}
.pagebox span a{display:block; overflow:hidden; zoom:1; _float:left;}
.pagebox span.pagebox_pre_nolink{border:1px #ddd solid; width:53px; height:21px; *height:23px; line-height:21px; text-align:center; color:#999; cursor:default;}
.pagebox span.pagebox_pre{color:#3568b9; height:23px;}
.pagebox span.pagebox_pre a,.pagebox span.pagebox_pre a:visited,.pagebox span.pagebox_next a,.pagebox span.pagebox_next a:visited{border:1px #9aafe5 solid; color:#3568b9; text-decoration:none; text-align:center; width:53px; cursor:pointer; height:21px; *height:23px; line-height:21px;}
.pagebox span.pagebox_pre a:hover,.pagebox span.pagebox_pre a:active,.pagebox span.pagebox_next a:hover,.pagebox span.pagebox_next a:active{color:#363636; border:1px #2e6ab1 solid;}
.pagebox span.pagebox_num_nonce{padding:0 8px; height:23px; line-height:23px; color:#fff; cursor:default; background:#296cb3; font-weight:bold;}
.pagebox span.pagebox_num{color:#3568b9; height:23px;}
.pagebox span.pagebox_num a,.pagebox span.pagebox_num a:visited{border:1px #9aafe5 solid; color:#3568b9; text-decoration:none; padding:0 8px; cursor:pointer; height:21px; *height:23px; line-height:21px;}
.pagebox span.pagebox_num a:hover,.pagebox span.pagebox_num a:active{border:1px #2e6ab1 solid;color:#363636;}
.pagebox span.pagebox_num_ellipsis{color:#393733; width:22px; background:none; line-height:23px;}
.pagebox span.pagebox_next_nolink{border:1px #ddd solid; width:53px; height:21px; *height:23px; line-height:21px; text-align:center; color:#999; cursor:default;}
/**/
</STYLE>
<div>&nbsp;成都游戏学院 http://www.cdgamecollege.org
电话：028-85586115
<p>
手机硬件制造利润江河日下，一泻千里，手机软件市场的重要性突然释放。围绕手机操作系统的市场竞争也逐渐进入白热化。6月24日下午，诺基亚宣布斥资2.64亿欧元收购Symbian公司剩余的52%股份，从而实现全资控股。同时，诺基亚、索尼爱立信、摩托罗拉、NTT
DoCoMo、AT&amp;T、LG电子、三星电子、意法半导体、德州仪器(TI)和沃达丰(Vodafone)等将共同建立Symbian联盟，以扩大统一的软件平台影响力。</P>
<p>
　　联盟，手机操作平台又见联盟。早在2007年11月6日，Google携手中国移动、NTT
DoCoMo、T-Mobile、英特尔、TI、高通、三星、摩托罗拉等业界巨头成立开放手机联盟，携手开发手机操作平台Android。</P>
<p>
　　不可否认，手机操作平台的两大联盟正面交锋已经开始。手机操作系统将会呈现两巨头PK？
文/记者 李光焱</P>
<p><strong>　　对立：诺基亚推开放性平台</STRONG>
<strong>谷歌建开放手机联盟</STRONG></P>
<p>
　　诺基亚宣布购买Symbian(塞班)公司股份当天，诺基亚同时联合AT&amp;T、LG电子、摩托罗拉、NTT
DoCoMo、三星、索尼爱立信、意法半导体、德州仪器(TI)和沃达丰共同宣布建立Symbian
联合组织。诺基亚拟将Symbian和S60软件完全纳入联合组织。索尼爱立信和摩托罗拉也表示将UIQ技术纳入联合组织的意向，同时，NTT
DoCoMo也表示愿意将其MOAP(S)资源纳入联合组织。基于各方贡献，该联合组织将提供基于统一平台的通用用户界面架构。</P>
<p>
　　分析人士指出，诺基亚收购Symbian并联手建立Symbian联合组织，是针对谷歌即将正式商用的手机操作平台Android。2007年11月6日，在互联网搜索领域大展宏图的Google携手中国移动、NTT
DoCoMo、T-Mobile、英特尔、TI、高通、三星、摩托罗拉等业界巨头成立开放手机联盟，携手开发手机操作平台Android。</P>
<p>
　　据称，Android是一个完全整合的移动软件系统，包括一个操作系统、中间件、便于用户使用的界面以及各类应用操作。手机厂商和移动运营商可以自由定制Android，预计基于Android平台的第一部手机将于2008年下半年正式推出。</P>
<p><strong>　　比较：Symbian横扫智能市场</STRONG>
<strong>Android业务讲求融合</STRONG></P>
<p>
　　据市场调查机构Canalys的数据，2008年第一季度，基于Symbian操作系统的移动终端拥有融合性移动终端市场的60%份额。目前，全球已有超过235种型号、8家生产厂商、由250余家移动通信网络支持的超过2亿部基于Symbian操作系统的移动终端投放市场。</P>
<p>
　　“从市场表现上看，Symbian联盟的表现远胜于Android，毕竟后者现在还没有正式进入商用。”手机业观察人士程先生告诉记者。他表示，Android操作平台的发布毕竟才半年，市场成熟度不及已创建10年的Symbian平台实属正常。</P>
<p>
“但是以互联网搜索起家的谷歌操作系统联盟，在移动互联网业务融合方面具有优势。”程先生表示，拥有着Google
Earth和YouTube的谷歌，必然将这些内容加入Android操作平台，从而建立移动“数字王国”。从内容到网络再到终端，谷歌阵营正在谋划通吃整个手机产业的上下游，这将让整个业界发生巨大变化。另一方面，谷歌全球副总裁、大中华区总裁李开复表示，Android是免费的，可以节省手机成本。如果Symbian不改变需要认证、收费策略，Android奋起直追的征途将更为平坦。</P>
<p>
　　不过，谷歌阵营必须尽快将Android推向市场。据《华尔街日报》报道，Google称采用Android操作系统的手机最快也要到今年第四季度才能推出市场，移动网络供应商T-Mobile表示其Android手机需延迟到2009年才能推出。</P>
<p><strong>　　发展：Symbian、谷歌、微软三足鼎立</STRONG>
<strong>苹果、Palm徐图自强</STRONG></P>
<p>
　　以诺基亚为首的Symbian平台和以谷歌为首的Android平台将瓜分江湖，大树底下寸草不生？未必！在Android平台推出之前，Symbian操作系统占据了手机智能平台市场的大半江山，而紧随其后的就应该是Windows
Mobile系统。该系统背靠微软公司，具有与电脑上的微软操作系统可以无缝连接、多媒体处理能力强的优势。并且，在微软公司的强力推动下，已经有摩托罗拉和宏达电等越来越多手机厂商使用Windows
Mobile系统。</P>
<p>
　　“可以预见，Symbian、谷歌、微软三者的操作系统将使未来的手机操作平台领域形成三强分立的格局。但是，不要忽视新兴力量——苹果手机操作系统以及Linux系统和Palm操作系统。”微软移动部门的人士曾向记者表示。</P>
<p>　　的确，使用苹果Mac
OS的iPhone手机热卖，足见该系统并非等闲之辈。但是，由于苹果公司尚未开放第三方应用支持，能支持该系统的软件较少。因此，苹果Mac
OS系统难免有小众化的趋势。</P>
<p>
　　“在硬件制造成本上升，利润下降严重的情况下，手机软件的竞争就开始热闹起来。毕竟移动互联时代，能创造利润的是内容和服务。”在诺基亚开发者论坛上，一位合作伙伴表示。该人士表示，手机操作系统只有应用到手机上才有生命力。各手机巨头纷纷加入不同阵营，甚至是同时加入多个阵营，采用多个操作系统，对手机用户而言，是个利好。</P>
</DIV>
]]></description>
            <author>老师</author>
            <comments>http://blog.sina.com.cn/s/blog_511f804a01009tek.html#comment</comments>
            <pubDate>Fri, 04 Jul 2008 09:39:09 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_511f804a01009tek.html</guid>
        </item>
    </channel>
</rss>
