<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jp.ferv.blog</title>
	<atom:link href="http://ferv.jp/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://ferv.jp/blog</link>
	<description>「ActionScriptは素晴らしい。コンパイルする価値がある。」って偉い人が言ってた。</description>
	<lastBuildDate>Sun, 15 Aug 2010 00:42:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>最速 PNGEncoder を教えてもらったよ</title>
		<link>http://ferv.jp/blog/2010/08/15/fastest-pngencoder/</link>
		<comments>http://ferv.jp/blog/2010/08/15/fastest-pngencoder/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 17:13:44 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[FileFormat]]></category>
		<category><![CDATA[PNGEncoder]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1416</guid>
		<description><![CDATA[Quick tip: Fastest ActionScript PNGEncoder at Jozef Chúťka&#8217;s blog で PNGEncoder の処理速度比較してます。Optimized PNG [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.yoz.sk/2010/06/quick-tip-fastest-actionscript-pngencoder/">Quick tip: Fastest ActionScript PNGEncoder at Jozef Chúťka&#8217;s blog</a> で PNGEncoder の処理速度比較してます。<a href="http://ferv.jp/blog/2010/01/08/optimized-pngencoder-with-filters/">Optimized PNGEncoder with filters</a> で最適化を試してたコードが dsk.PNGEncoder ってのでエントリしてます。</p>
<p>結果は by.blooddy.crypto.image.PNG24Encoder が圧倒的に最速！！
エントリ内からのリンクが切れてるので、使ってみたい方は <a href="http://www.blooddy.by/en/">BlooDHounD&#8217;s workspace</a> の blooddy_crypto.swc からダウンロードして下さい。</p>
<p>透明・不透明共に速い速い！Alchemy 使ってるのか気になるところです。</p>
]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/08/15/fastest-pngencoder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>初期値を与えてからトランジション</title>
		<link>http://ferv.jp/blog/2010/08/14/default-value/</link>
		<comments>http://ferv.jp/blog/2010/08/14/default-value/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 07:04:20 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[iOSSafari]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1410</guid>
		<description><![CDATA[jp.ferv.blog » Blog Archive » iOS Safari Examples の補足その２
setTimeout を使わなかった場合
			JavaScript		DefaultValueExa [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ferv.jp/blog/2010/08/09/ios-safari-examples/">jp.ferv.blog » Blog Archive » iOS Safari Examples</a> の補足その２</p>
<h2><a href='http://ferv.jp/example/iOSSafariExamples/DefaultValueExample0.html'>setTimeout を使わなかった場合</a></h2>
	<ul class="syntax_hilite_header">		<li class="language">JavaScript</li>		<li class="filename">DefaultValueExample0.js</li>	<li class="source"><a href="#javascript-3_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="javascript-3_plane"><pre>function _onTouchStart(e)
{
	// 初期値を設定
	_box.style.webkitTransitionProperty = '';
	_box.style.webkitTransitionDuration = '';
	_box.style.backgroundColor = 'rgba(255, 0, 0, 1)';
	
	// トランジションを設定
	_box.style.webkitTransitionProperty = 'background-color';
	_box.style.webkitTransitionDuration = '1s';
	_box.style.backgroundColor = 'rgba(0, 0, 255, 1)';
}</pre></div><div class="syntax_hilite">
<div id="javascript-3">
<div class="javascript javascript" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw2">function</span> _onTouchStart<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// 初期値を設定</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionProperty</span> <span class="sy0">=</span> <span class="st0">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionDuration</span> <span class="sy0">=</span> <span class="st0">''</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">backgroundColor</span> <span class="sy0">=</span> <span class="st0">'rgba(255, 0, 0, 1)'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="co1">// トランジションを設定</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionProperty</span> <span class="sy0">=</span> <span class="st0">'background-color'</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionDuration</span> <span class="sy0">=</span> <span class="st0">'1s'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">backgroundColor</span> <span class="sy0">=</span> <span class="st0">'rgba(0, 0, 255, 1)'</span>;</div></li>
<li class="li2"><div class="de2"><span class="br0">&#125;</span></div></li>
</ol></div>
</div></div><br />
<p>青色のままで何も変化しません。</p>
<h2><a href='http://ferv.jp/example/iOSSafariExamples/DefaultValueExample1.html'>setTimeout を使った場合</a></h2>
<p>初期値を与えてからトランジションに入る場合、</p>
	<ul class="syntax_hilite_header">		<li class="language">JavaScript</li>		<li class="filename">DefaultValueExample1.js</li>	<li class="source"><a href="#javascript-4_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="javascript-4_plane"><pre>function _onTouchStart(e)
{
	// 初期値を設定
	_box.style.webkitTransitionProperty = '';
	_box.style.webkitTransitionDuration = '';
	_box.style.backgroundColor = 'rgba(255, 0, 0, 1)';
	
	window.setTimeout(function () {
		// トランジションを設定
		_box.style.webkitTransitionProperty = 'background-color';
		_box.style.webkitTransitionDuration = '1s';
		_box.style.backgroundColor = 'rgba(0, 0, 255, 1)';
	}, 0);
}</pre></div><div class="syntax_hilite">
<div id="javascript-4">
<div class="javascript javascript" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw2">function</span> _onTouchStart<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// 初期値を設定</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionProperty</span> <span class="sy0">=</span> <span class="st0">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionDuration</span> <span class="sy0">=</span> <span class="st0">''</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">backgroundColor</span> <span class="sy0">=</span> <span class="st0">'rgba(255, 0, 0, 1)'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; window.<span class="me1">setTimeout</span><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// トランジションを設定</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionProperty</span> <span class="sy0">=</span> <span class="st0">'background-color'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">webkitTransitionDuration</span> <span class="sy0">=</span> <span class="st0">'1s'</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; _box.<span class="me1">style</span>.<span class="me1">backgroundColor</span> <span class="sy0">=</span> <span class="st0">'rgba(0, 0, 255, 1)'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span> 0<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2"><span class="br0">&#125;</span></div></li>
</ol></div>
</div></div><br />
<p>setTimeout を使うと、初期値が反映された後トランジションが実行されます。</p>
<p>初期値とトランジションを同期的に実行してしまうと、プロパティに初期値を与えてすぐにトランジション用の値で上書きされてしまうので、非同期に（といっても wait は 0ms で大丈夫ぽい）実行しましょうということのようです。</p>
<p>ガイドではアニメーションを再実行する例が挙げられています。<a href="http://developer.apple.com/safari/library/documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Animations/Animations.html#//apple_ref/doc/uid/TP40008032-CH6-SW19">Safari CSS Visual Effects Guide: Animations » Listing 6  Restarting an animation</a></p>]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/08/14/default-value/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Touch オブジェクトの注意点</title>
		<link>http://ferv.jp/blog/2010/08/10/touch-object/</link>
		<comments>http://ferv.jp/blog/2010/08/10/touch-object/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 05:28:26 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[iOSSafari]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1355</guid>
		<description><![CDATA[jp.ferv.blog » Blog Archive » iOS Safari Examples の補足
Touch オブジェクトの参照を保存した場合
touchmove イベントで Touch オブジェクトの参照を変数に格納してしまうと、
次の touchmove イベントで格納していた Touch オブジェクトのプロパティが上書きされてしまい位置の差分を計算すること]]></description>
			<content:encoded><![CDATA[<p><a href="http://ferv.jp/blog/2010/08/09/ios-safari-examples/">jp.ferv.blog » Blog Archive » iOS Safari Examples</a> の補足</p>
<h2><a href="http://ferv.jp/example/iOSSafariExamples/TouchEventExample0.html">Touch オブジェクトの参照を保存した場合</a></h2>
touchmove イベントで Touch オブジェクトの参照を変数に格納してしまうと、
次の touchmove イベントで格納していた Touch オブジェクトのプロパティが上書きされてしまい位置の差分を計算することができません。
	<ul class="syntax_hilite_header">		<li class="language">JavaScript</li>		<li class="filename">TouchEventExample0.js</li>	<li class="source"><a href="#javascript-7_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="javascript-7_plane"><pre>var TouchEventExample0 = (function()
{
	var _viewport, _prevTouch;
	
	window.addEventListener("load", _onLoadWindow);
	
	function _onLoadWindow(e)
	{
		window.removeEventListener("load", _onLoadWindow);
		
		_viewport = document.getElementById("viewport");
		_viewport.addEventListener("touchmove", _onTouchMove);
	}
	
	function _onTouchMove(e)
	{
		e.preventDefault();
		
		var touch = e.touches[0];
		if (_prevTouch)
			console.log([_prevTouch == touch, '(' + _prevTouch.pageX.toString(), _prevTouch.pageY.toString() + ')', '(' + touch.pageX.toString(), touch.pageY.toString() + ')']);
		_prevTouch = touch;
	}
})();</pre></div><div class="syntax_hilite">
<div id="javascript-7">
<div class="javascript javascript" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw2">var</span> TouchEventExample0 <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> _viewport<span class="sy0">,</span> _prevTouch;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;load&quot;</span><span class="sy0">,</span> _onLoadWindow<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> _onLoadWindow<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">removeEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;load&quot;</span><span class="sy0">,</span> _onLoadWindow<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _viewport <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;viewport&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; _viewport.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;touchmove&quot;</span><span class="sy0">,</span> _onTouchMove<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> _onTouchMove<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> touch <span class="sy0">=</span> e.<span class="me1">touches</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>_prevTouch<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="br0">&#91;</span>_prevTouch <span class="sy0">==</span> touch<span class="sy0">,</span> <span class="st0">'('</span> <span class="sy0">+</span> _prevTouch.<span class="me1">pageX</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> _prevTouch.<span class="me1">pageY</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">')'</span><span class="sy0">,</span> <span class="st0">'('</span> <span class="sy0">+</span> touch.<span class="me1">pageX</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> touch.<span class="me1">pageY</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">')'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; _prevTouch <span class="sy0">=</span> touch;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
</ol></div>
</div></div><br />
<pre>:::OUTPUT:::
true,(120,262),(120,262)
true,(138,244),(138,244)
true,(156,226),(156,226)
true,(176,204),(176,204)
true,(192,184),(192,184)</pre>
<h2><a href="http://ferv.jp/example/iOSSafariExamples/TouchEventExample1.html">Touch オブジェクトのプロパティの値を保存した場合</a></h2>
<p>内部的に Touch オブジェクトのプロパティを書き換えつつ使いまわしてるぽいから、
Touch オブジェクトの参照ではなく Touch オブジェクトのとっておきたいプロパティの値を変数に格納するようにします。</p>
	<ul class="syntax_hilite_header">		<li class="language">JavaScript</li>		<li class="filename">TouchEventExample1.js</li>	<li class="source"><a href="#javascript-8_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="javascript-8_plane"><pre>var TouchEventExample1 = (function()
{
	var _viewport, _prevPoint;
	
	window.addEventListener("load", _onLoadWindow);
	
	function _onLoadWindow(e)
	{
		window.removeEventListener("load", _onLoadWindow);
		
		_viewport = document.getElementById("viewport");
		_viewport.addEventListener("touchmove", _onTouchMove);
	}
	
	function _onTouchMove(e)
	{
		e.preventDefault();
		
		var point = {
			x: e.touches[0].pageX,
			y: e.touches[0].pageY
		};
		if (_prevPoint)
			console.log([_prevPoint == point, '(' + _prevPoint.x.toString(), _prevPoint.y.toString() + ')', '(' + point.x.toString(), point.y.toString() + ')']);
		_prevPoint = point;
	}
})();</pre></div><div class="syntax_hilite">
<div id="javascript-8">
<div class="javascript javascript" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw2">var</span> TouchEventExample1 <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> _viewport<span class="sy0">,</span> _prevPoint;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;load&quot;</span><span class="sy0">,</span> _onLoadWindow<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> _onLoadWindow<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">removeEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;load&quot;</span><span class="sy0">,</span> _onLoadWindow<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _viewport <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;viewport&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; _viewport.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;touchmove&quot;</span><span class="sy0">,</span> _onTouchMove<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> _onTouchMove<span class="br0">&#40;</span>e<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> point <span class="sy0">=</span> <span class="br0">&#123;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x<span class="sy0">:</span> e.<span class="me1">touches</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">pageX</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y<span class="sy0">:</span> e.<span class="me1">touches</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">pageY</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>_prevPoint<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="br0">&#91;</span>_prevPoint <span class="sy0">==</span> point<span class="sy0">,</span> <span class="st0">'('</span> <span class="sy0">+</span> _prevPoint.<span class="me1">x</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> _prevPoint.<span class="me1">y</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">')'</span><span class="sy0">,</span> <span class="st0">'('</span> <span class="sy0">+</span> point.<span class="me1">x</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> point.<span class="me1">y</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">')'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _prevPoint <span class="sy0">=</span> point;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
</ol></div>
</div></div><br />
<pre>:::OUTPUT:::
false,(142,428),(146,416)
false,(146,416),(154,400)
false,(154,400),(164,382)
false,(164,382),(176,356)
false,(176,356),(186,332)</pre>
<p>このようにして、前回位置との比較とか差分とかを計算します。</p>
]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/08/10/touch-object/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS Safari Examples</title>
		<link>http://ferv.jp/blog/2010/08/09/ios-safari-examples/</link>
		<comments>http://ferv.jp/blog/2010/08/09/ios-safari-examples/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 09:24:39 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[iOSSafari]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1345</guid>
		<description><![CDATA[Safari の拡張 CSS と iOS Safari の TouchEvent のサンプルを作ったので、 Flasher 目線で気づいたこと、コーディングの際に気をつけることをピックアップします。
文字じゃ伝わらない [...]]]></description>
			<content:encoded><![CDATA[<p>Safari の拡張 CSS と iOS Safari の TouchEvent のサンプルを作ったので、 Flasher 目線で気づいたこと、コーディングの際に気をつけることをピックアップします。
文字じゃ伝わらない箇所については、後ほどコードベースな別エントリを書くつもりです。
サンプルは TouchEvent 起点で動くので iOS Safari じゃないと意味不明だと思います。
一部のサンプルで <a href="http://www.flickr.com/services/api/">Flickr API</a> のレスポンスを Native JSON でデコードしているため、iOS4 以上が必要です。

<h2>サンプルの概要</h2>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/">Index</a></h3>
<p>ナビゲーションです。QR コードを貼っておきます。（<a href="http://itunes.apple.com/app/optiscan-qr-code-scanner-generator/id304099767">Optiscan</a> にて動作確認済み）</p>
<p><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/Optiscan_QR_Code.png" alt="iOS Safari Example" title="iOS Safari Example" width="160" height="160" class="alignnone size-full wp-image-1367" /></p>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/Gesture.html">Gesture</a></h3>
<a href="http://ferv.jp/example/iOSSafariExamples/Gesture.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/gesture.jpg" alt="Gesture" title="Gesture" /></a>
<p>iOS Safari の表示オブジェクトは 'touchstart', 'touchmove', 'touchend', 'gesturestart', 'gesturechange', 'gestureend' というタッチスクリーンデバイス特有のイベントを発行します。
touch 系の pageX, pageY といったタッチしている位置情報を表すプロパティを利用して、画像をタッチしたままドラッグします。
gesture 系の rotation, scale といったピンチの状態を表すプロパティを利用して、画像を回転・拡大縮小します。</p>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/Rotation.html">Rotation</a></h3>
<a href="http://ferv.jp/example/iOSSafariExamples/Rotation.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/rotation.jpg" alt="Rotation" title="Rotation" /></a>
<p>スワイプして円形に配置した画像を回転させるサンプルです。
回転させる表示オブジェクトを親として、その子に10枚の画像を円形に配置します。</p>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/CoverFlow.html">Cover Flow</a></h3>
<a href="http://ferv.jp/example/iOSSafariExamples/CoverFlow.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/cover_flow.jpg" alt="Cover Flow" title="Cover Flow" /></a>
<p>スワイプしてカバーフローサンプル。10 枚セットでロードして次のセットをロードします。
Rotation と違い、入力イベントから変形処理行う対象の表示オブジェクトは複数で、且つ表示オブジェクトが増えていくので、全オブジェクトに変形処理を掛けると 50 枚を超えた辺りからレンダリングがついてこなくなります。
このサンプルでは、中央にあるオブジェクトの左右 10 枚のオブジェクトのみに変形処理を行い、それより外にあるオブジェクトは <code>visibility: hidden;</code> として表示自体を切って余計なレンダリングをしないようにしています。</p>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/Multitouch.html">Multitouch</a></h3>
<a href="http://ferv.jp/example/iOSSafariExamples/Multitouch.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/multitouch.jpg" alt="Multitouch" title="Multitouch" /></a>
<p>touchstart, touchmove, touchend 時にタッチしている位置を取得・描画するサンプルです。</p>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/SingletouchDrawing.html">Singletouch Drawing</a></h3>
<a href="http://ferv.jp/example/iOSSafariExamples/SingletouchDrawing.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/singletouch_drawing.jpg" alt="Singletouch Drawing" title="Singletouch Drawing" /></a>
<p>1 本の指でタッチして、動かす速度に応じて太さの異なる線を canvas に描くサンプルです。</p>
<h3><a href="http://ferv.jp/example/iOSSafariExamples/MultitouchDrawing.html">Multitouch Drawing</a></h3>
<a href="http://ferv.jp/example/iOSSafariExamples/MultitouchDrawing.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/08/multitouch_drawing.jpg" alt="Multitouch Drawing" title="Multitouch Drawing" /></a>
<p>複数本の指でタッチして、複数のタッチを繋ぐ多角形を canvas に描くサンプルです。</p>

<h2>気づいたこと・注意点</h2>
<ul>
<li>iOS Safari / Mac Safari / Win Safari はそれぞれレンダリングが微妙に違うぽいので、
対象の Safari 以外でのレンダリングは参考程度にとどめておいた方が良いかもしれません。
Chrome も WebKit を使っていますが、実装していないプロパティ満載なので確認にはおすすめしません。</li>
<li>3D 変形した子エレメントを持っている親エレメントを 3D 変形させる際、子エレメントを 3D として回転させるには、
親エレメントに <code>-webkit-transform-style: preserve-3d;</code> を設定しておく必要があります。</li>
<li><code>-webkit-box-reflect: hoge;</code> と <code>posistion: absolute;</code> を併用すると、
<code>-webkit-box-reflect: hoge;</code> がレンダリングに反映されません。</li>
<li>Touch オブジェクトは内部的にプロパティを書き換えながら使いまわされているぽいので、
前回値をとっておくためには Touch オブジェクトの参照をとっておくのではなく、
とっておきたいプロパティの値自体を取得して変数等に格納しておく必要があります。（<a href="http://ferv.jp/blog/2010/08/10/touch-object/">jp.ferv.blog  &raquo; Blog Archive   &raquo; Touch オブジェクトの注意点</a>参照）</li>
<li>3D 変形したオブジェクトのヒットエリアがずれることがある。
（このサンプルでは、 3D 変形したオブジェクトへの click イベントや touch イベントではなく、
幅と高さが 100% なエレメントへの touch イベントを使うことで回避しています。）</li>
<li>初期値を与えてからトランジションを開始する場合は、トランジションのプロパティの書き込みは非同期に実行します。（<a href='http://ferv.jp/blog/2010/08/14/default-value/'>jp.ferv.blog  &raquo; Blog Archive   &raquo; 初期値を与えてからトランジション</a>参照）</li>
<li>iOS4 以上の Safari は JSON のエンコード・デコードをサポートしています。
（Native JSON をサポートしているブラウザは、<a href="http://en.wikipedia.org/wiki/JSON#Native_JSON">JSON - Wikipedia, the free encyclopedia » Native JSON</a> を参照。
可能ならば Native JSON を使用する JS ライブラリもリストアップされています。）</li>
</ul>

<h2>雑感</h2>
<p>"HTML5(video, audio, canvas) + CSS3(transform, transition, animation) + JavaScript" が主要ブラウザで動く未来があるなら、
今回のサンプルの様なコンテンツなら Flash から置き換わっていくかもしれないなと。
でも未来すぎるかもしれん・・・今のところ使えるとしたら iOS 専用コンテンツくらいだし。</p>

<h2>ガイドやリファレンス</h2>
<ul>
<li><a href="http://developer.apple.com/safari/library/documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Introduction/Introduction.html">Safari Visual Effects Guide</a> : グラデーション・マスク・リフレクション・トランジション・アニメーション・タッチイベント・ジェスチャイベントとかの使い方</li>
<li><a href="http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariJSRef/index.html#//apple_ref/doc/uid/TP40001482">Safari DOM Extensions Reference</a> : Safari の拡張 DOM リファレンス</li>
<li><a href="http://tuvix.apple.com/safari/library/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html">Safari CSS Reference: Supported CSS Properties</a> : Safari の CSS リファレンスのプロパティのページ</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/08/09/ios-safari-examples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Player10.0 でも purePDF で日本語PDFを作る</title>
		<link>http://ferv.jp/blog/2010/05/10/player10-0_purepdf_japanese/</link>
		<comments>http://ferv.jp/blog/2010/05/10/player10-0_purepdf_japanese/#comments</comments>
		<pubDate>Mon, 10 May 2010 07:59:11 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[ByteArray]]></category>
		<category><![CDATA[FlashPlayer]]></category>
		<category><![CDATA[purePDF]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1274</guid>
		<description><![CDATA[purePDF とは
PDF を FlashPlayer 内で作成する為のライブラリです。
Java の iText ライブラリを AS3 移植とのことです。
チャプタ・セクション・パラグラフ・フレーズ・イメージな [...]]]></description>
			<content:encoded><![CDATA[<h2>purePDF とは</h2>
<p>PDF を FlashPlayer 内で作成する為のライブラリです。
Java の iText ライブラリを AS3 移植とのことです。
チャプタ・セクション・パラグラフ・フレーズ・イメージなどの基本要素と、カラム・リスト・テーブル・セルなどのレイアウト要素を用い自由にレイアウトした PDF を作成することができます。
また、 AS の GraphicsAPI のようなベクターグラフィックスやグラデーション塗りにも対応した多機能なライブラリです。</p>
<p>purePDF についての情報は下記リンクをご覧下さい。</p>
<ul>
<li><a href="http://www.sephiroth.it/weblog/archives/2010/02/purepdf_a_complete_actionscript_pdf_l.php">purePDF, a complete actionscript PDF library - sephiroth.it - flash world</a></li>
<li><a href="http://code.google.com/p/purepdf/">purepdf - Project Hosting on Google Code</a></li>
<li><a href="http://www.noridon.net/weblogs/archives/2010/05/purepdfpdf.html">purepdfを使って日本語フォントを指定したpdfを作る - nod::ぶろぐ:RIA::Flex/AIR/Flash</a></li>
</ul>
<h2>問題点</h2>
<p>日本語などの 2 バイト文字が特定の環境下で正常に出力できません。
これはライブラリのバグではなく、 FlashPlayer 10.0 のバグです。
FlashPlayer 10.1 (10/05/10 時点では RC4) だとバグフィックスされているので、バグ対応することなく日本語の使用が可能です。（<a href="http://www.noridon.net/weblogs/">nod</a> さんからTwitter で教えて頂きました。ありがとうございます。）
Windows FlashPlayer 10.0 では日本語が全て文字化けして出力されます。
Macintosh FlashPlayer 10.0 では 2 バイト文字中に 1 バイト文字が入ると同要素内の以降の文字が出力されません。
Linux FlashPlayer 10.0 では何も出力されません。</p>
<h2>原因</h2>
<p>環境によって問題の現象が異なりますが、原因は同じ関数のバグによるものです。
<code>ByteArray.writeMultiByte(hoge, 'unicodeFFFE')</code>が FlashPlayer10.0 で
正常に動作していないことが直接の原因です。</p>
<h2>対処法</h2>
<p>FlashPlayer10.0 で encoding が 'UnicodeBigUnmarked' の場合、文字列を走査し、キャラクタコードを書き込みます。
<a href="http://ferv.jp/blog/2010/05/10/bytearray_unicodefffe_bug/">jp.ferv.blog » Blog Archive » ByteArray に ‘unicodeFFFE’ を書き込む際のバグ</a> に諸環境下でのバグの症状と対応策の詳細を書きましたので、合わせてご覧下さい。</p>
<h2>バグFIX済み purePDF によるプレビュー</h2>
<p>ローマ字・半角カナ・第一水準漢字・第二水準漢字を書き込んだ PDF を FlashPlayer 内で作成します。</p>
<p><a rel="shadowbox;width=465;height=465;" href='http://ferv.jp/blog/wp-content/uploads/2010/05/Japanese.swf'><img src="http://ferv.jp/blog/wp-content/uploads/2010/05/purePDF_jp.gif" alt="purePDF_jp" title="purePDF_jp" width="465" height="150" class="alignnone size-full wp-image-1034" /></a></p>
この SWF から各環境下で作成した PDF です。
<ul>
<li><a href="http://ferv.jp/blog/wp-content/uploads/2010/05/Japanese_WIN10.0.45.2_plug-in.pdf">Windows FlashPlayer 10.0.45.2 plug-in</a></li>
<li><a href="http://ferv.jp/blog/wp-content/uploads/2010/05/Japanese_WIN10.0.45.2_activeX.pdf">Windows FlashPlayer 10.0.45.2 activeX</a></li>
<li><a href="http://ferv.jp/blog/wp-content/uploads/2010/05/Japanese_MAC10.0.45.2.pdf">Macintosh FlashPlayer 10.0.45.2 plug-in</a></li>
<li><a href="http://ferv.jp/blog/wp-content/uploads/2010/05/Japanese_LNX10.0.45.2.pdf">Linux FlashPlayer 10.0.45.2 plug-in</a></li>
</ul>
<h2>対応済み purePDF のソース・swc と Expample 用の as ファイルのダウンロード</h2>
<p><a href="http://ferv.jp/blog/wp-content/uploads/2010/05/purePDF_jp.zip">purePDF_jp.zip</a></p>
<p>purePDF のライセンスは LGPL なので、継承して LGPL ライセンスでの配布となります。</p>
<h2>変更箇所</h2>
<p>バグのある関数をコールしている箇所を、
ByteArrayUtils クラス内のバグ対応用の関数をコールするように変更します。</p>
	<ul class="syntax_hilite_header">		<li class="language">ActionScript</li>		<li class="filename">PdfEncodings.as</li>	<li class="source"><a href="#actionscript-13_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="actionscript-13_plane"><pre>//byte.buffer.writeMultiByte( text, ByteArrayUtils.getEncoding( encoding ) );
ByteArrayUtils.writeMultiByte( byte.buffer, text, ByteArrayUtils.getEncoding( encoding ) ); // modified by dsk(http://ferv.jp)</pre></div><div class="syntax_hilite">
<div id="actionscript-13">
<div class="actionscript actionscript" style="font-family:monospace;"><ol start="283"><li class="li1"><div class="de1"><span class="co1">//byte.buffer.writeMultiByte( text, ByteArrayUtils.getEncoding( encoding ) );</span></div></li>
<li class="li2"><div class="de2">ByteArrayUtils.<span class="me1">writeMultiByte</span><span class="br0">&#40;</span> byte.<span class="me1">buffer</span>, <span class="kw3">text</span>, ByteArrayUtils.<span class="me1">getEncoding</span><span class="br0">&#40;</span> encoding <span class="br0">&#41;</span> <span class="br0">&#41;</span>; <span class="co1">// modified by dsk(http://ferv.jp)</span></div></li>
</ol></div>
</div></div><br />
<p>バグ対応用の関数です。
まず <code>Capabilities.version</code> から FlashPlayer のバージョンを判定します。
問題のないバージョンの場合は文字列を走査せず、
そのまま <code>writeMultiByte()</code> で書き込みます。
問題のあるバージョンの場合は文字列を走査しつつキャラクタコードを取得し、
2 バイトに収まるキャラクタコードの場合は <code>writeShort()</code> で書き込み、
収まらない場合は 4 バイトとして <code>writeUnsignedInt()</code> で書き込みます。</p>
	<ul class="syntax_hilite_header">		<li class="language">ActionScript</li>		<li class="filename">ByteArrayUtils.as</li>	<li class="source"><a href="#actionscript-14_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="actionscript-14_plane"><pre>import flash.system.Capabilities;</pre></div><div class="syntax_hilite">
<div id="actionscript-14">
<div class="actionscript actionscript" style="font-family:monospace;"><ol start="48"><li class="li1"><div class="de1"><span class="kw3">import</span> flash.<span class="kw3">system</span>.<span class="kw3">Capabilities</span>;</div></li>
</ol></div>
</div></div><br />
	<ul class="syntax_hilite_header">		<li class="language">ActionScript</li>		<li class="filename">ByteArrayUtils.as</li>	<li class="source"><a href="#actionscript-15_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="actionscript-15_plane"><pre>/**
 * @author dsk (http://ferv.jp)
 */
private static var _specifiedVersion:Boolean = false;

/**
 * @author dsk (http://ferv.jp)
 */
private static var _isUnder10_1:Boolean;</pre></div><div class="syntax_hilite">
<div id="actionscript-15">
<div class="actionscript actionscript" style="font-family:monospace;"><ol start="57"><li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;* @author dsk (http://ferv.jp)</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li2"><div class="de2"><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> _specifiedVersion:<span class="kw3">Boolean</span> = <span class="kw2">false</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2"><span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @author dsk (http://ferv.jp)</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> _isUnder10_1:<span class="kw3">Boolean</span>;</div></li>
</ol></div>
</div></div><br />
	<ul class="syntax_hilite_header">		<li class="language">ActionScript</li>		<li class="filename">ByteArrayUtils.as</li>	<li class="source"><a href="#actionscript-16_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="actionscript-16_plane"><pre>/**
 * bug fix : fail to work "buffer.writeMultiByte( value, 'unicodeFFFE' )" at FP10.0;
 * @author dsk (http://ferv.jp)
 */
public static function writeMultiByte( buffer: ByteArray, value: String, charSet: String ):void
{
	if (!_specifiedVersion)
		_specifyVersion();
	
	if (!(_isUnder10_1 && charSet = 'unicodeFFFE'))
		buffer.writeMultiByte( value, charSet );
	else
		_writeUnicodeFFFEByte( buffer, value );
	
	buffer.position = 0;
}

/**
 * emulate writing utf-16 BE
 * bug fix : fail to work "buffer.writeMultiByte( value, 'unicodeFFFE' )" at FP10.0
 * @author dsk (http://ferv.jp)
 */
private static function _writeUnicodeFFFEByte( buffer: ByteArray, value: String ):void
{
	var len:int = value.length;
	var i:int, code:uint;
	for (i = 0; i < len; i ++)
	{
		code = value.charCodeAt(i);
		if (code < 0x10000)
			buffer.writeShort(code);
		else
			buffer.writeUnsignedInt(code);
	}
}

/**
 * specify the Flash Player platform and version
 * @author dsk (http://ferv.jp)
 */
private static function _specifyVersion():void
{
	var info:Array = Capabilities.version.split(' ');
	var versions:Array = info[1].split(',');
	var majorMinor:Number = parseFloat(versions[0] + '.' + versions[1]);
	_isUnder10_1 = (majorMinor < 10.1);
	trace('ByteArrayUtils.specifyVersion. to be implemented :', 'isUnder10_1 =', _isUnder10_1);
	
	_specifiedVersion = true;
}</pre></div><div class="syntax_hilite">
<div id="actionscript-16">
<div class="actionscript actionscript" style="font-family:monospace;"><ol start="112"><li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;* bug fix : fail to work &quot;buffer.writeMultiByte( value, 'unicodeFFFE' )&quot; at FP10.0;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @author dsk (http://ferv.jp)</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> writeMultiByte<span class="br0">&#40;</span> buffer: ByteArray, value: <span class="kw3">String</span>, charSet: <span class="kw3">String</span> <span class="br0">&#41;</span>:<span class="kw3">void</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>_specifiedVersion<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; _specifyVersion<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span>_isUnder10_1 <span class="sy0">&amp;&amp;</span> charSet = <span class="st0">'unicodeFFFE'</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; buffer.<span class="me1">writeMultiByte</span><span class="br0">&#40;</span> value, charSet <span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _writeUnicodeFFFEByte<span class="br0">&#40;</span> buffer, value <span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; buffer.<span class="kw3">position</span> = 0;</div></li>
<li class="li2"><div class="de2"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2"><span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* emulate writing utf-16 BE</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;* bug fix : fail to work &quot;buffer.writeMultiByte( value, 'unicodeFFFE' )&quot; at FP10.0</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @author dsk (http://ferv.jp)</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> _writeUnicodeFFFEByte<span class="br0">&#40;</span> buffer: ByteArray, value: <span class="kw3">String</span> <span class="br0">&#41;</span>:<span class="kw3">void</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> len:<span class="kw3">int</span> = value.<span class="kw3">length</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw2">var</span> i:<span class="kw3">int</span>, code:uint;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i = 0; i <span class="sy0">&lt;</span> len; i ++<span class="br0">&#41;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; code = value.<span class="kw3">charCodeAt</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>code <span class="sy0">&lt;</span> 0x10000<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buffer.<span class="me1">writeShort</span><span class="br0">&#40;</span>code<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buffer.<span class="me1">writeUnsignedInt</span><span class="br0">&#40;</span>code<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;* specify the Flash Player platform and version</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @author dsk (http://ferv.jp)</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> _specifyVersion<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div></li>
<li class="li2"><div class="de2"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> info:<span class="kw3">Array</span> = <span class="kw3">Capabilities</span>.<span class="kw3">version</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">' '</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw2">var</span> versions:<span class="kw3">Array</span> = info<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">','</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> majorMinor:<span class="kw3">Number</span> = <span class="kw3">parseFloat</span><span class="br0">&#40;</span>versions<span class="br0">&#91;</span>0<span class="br0">&#93;</span> + <span class="st0">'.'</span> + versions<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; _isUnder10_1 = <span class="br0">&#40;</span>majorMinor <span class="sy0">&lt;</span> <span class="nu0">10.1</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span><span class="st0">'ByteArrayUtils.specifyVersion. to be implemented :'</span>, <span class="st0">'isUnder10_1 ='</span>, _isUnder10_1<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _specifiedVersion = <span class="kw2">true</span>;</div></li>
<li class="li2"><div class="de2"><span class="br0">&#125;</span></div></li>
</ol></div>
</div></div><br />
]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/05/10/player10-0_purepdf_japanese/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ByteArray に &#039;unicodeFFFE&#039; を書き込む際のバグ</title>
		<link>http://ferv.jp/blog/2010/05/10/bytearray_unicodefffe_bug/</link>
		<comments>http://ferv.jp/blog/2010/05/10/bytearray_unicodefffe_bug/#comments</comments>
		<pubDate>Sun, 09 May 2010 23:39:44 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[ByteArray]]></category>
		<category><![CDATA[FlashPlayer]]></category>
		<category><![CDATA[purePDF]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1282</guid>
		<description><![CDATA[10/05/10 追記 10/05/10 現在の最新 version FlashPlayer 10.0.45.2 でのバグで、10.1 RC4 では FIX されています。
ByteArray.writeMultiBy [...]]]></description>
			<content:encoded><![CDATA[<p><strong>10/05/10 追記</strong> 10/05/10 現在の最新 version FlashPlayer 10.0.45.2 でのバグで、10.1 RC4 では FIX されています。</p>
<p><code>ByteArray.writeMultiByte()</code> メソッドには 2 バイト文字の
処理に不具合があります。
utf-16 BE (BigEndian) を書き込んだ際の諸環境で起こるバグの症状の確認の為の
サンプルを wonderfl で書いてみました。
また、バグ対応のコードも合わせて確認します。</p>
<div style="text-align:center;width:465px;"><iframe title="ByteArray に 'unicodeFFFE' を書き込む際のバグ - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/5ar3" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/5ar3" title="ByteArray に 'unicodeFFFE' を書き込む際のバグ - wonderfl build flash online">ByteArray に 'unicodeFFFE' を書き込む際のバグ - wonderfl build flash online</a></div>
<h2>Windows FlashPlayer 10.0.45.2 plug-in/activeX</h2>
<img src="http://ferv.jp/blog/wp-content/uploads/2010/05/UnicodeFFFE_windows_10.0.gif" />
<p>unicodeFFFE を指定したにもかかわらず
shif_jis のキャラクタコードで書き込まれます。</p>
<h2>Macintosh FlashPlayer 10.0.45.2 plug-in</h2>
<img src="http://ferv.jp/blog/wp-content/uploads/2010/05/UnicodeFFFE_macintosh_10.0.gif" />
<p>2 バイト文字のみの間は utf-16 BE のキャラクタコードが正常に書き込まれますが、
1 バイト文字が混在すると以降のキャラクタコードが書き込まれません。</p>
<h2>Linux FlashPlayer 10.0.45.2 plug-in</h2>
<img src="http://ferv.jp/blog/wp-content/uploads/2010/05/UnicodeFFFE_linux_10.0.gif" />
<p>何も書き込まれません。</p>
<h2>バグの対処法の解説</h2>
<p>unicodeFFFE とは、utf-16 BE (BigEndian) なので
<code>String.charCodeAt(index);</code>で一文字ずつですが取得可能です。
utf-16 では 1 文字を 2 バイトもしくは 4 バイトで定義しています。
つまり、文字列を一文字ずつ走査し、
<code>charCodeAt()</code> メソッドでキャラクタコードを取得し、
0x0000 〜 0xFFFF の範囲なら <code>writeShort()</code> メソッドで
2 バイトとして書き込み、
0x00010000 〜 0xFFFFFFFF の範囲なら <code>writeUnsignedInt()</code> メソッドで
4 バイトとして ByteArray に書き込めばよいことになります。<br />
// ただし、日本語の場合は第二水準漢字まで含めても 2 バイト内に収まります。</p>
]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/05/10/bytearray_unicodefffe_bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stratus2 でチャットアプリ</title>
		<link>http://ferv.jp/blog/2010/03/13/chatonstratus2/</link>
		<comments>http://ferv.jp/blog/2010/03/13/chatonstratus2/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 00:18:22 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Stratus]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1256</guid>
		<description><![CDATA[
	


	Stratus2
	で、どんなコードで何ができるのかを調べる（特に NetStatusEvent 周り）ついでにチャットアプリ作ってみた。
	ソースは右クリックの「ソースを表示」から。重要な部分だ [...]]]></description>
			<content:encoded><![CDATA[<p>
	<a href="http://ferv.jp/app/chatonstratus2/ChatOnStratus2.html"><img src="http://ferv.jp/blog/wp-content/uploads/2010/03/ChatOnStratus2.png" alt="ChatOnStratus2" title="ChatOnStratus2" width="465" height="150" class="alignnone size-full wp-image-1258" /></a>
</p>
<p>
	<a href="http://labs.adobe.com/technologies/stratus/">Stratus2</a>
	で、どんなコードで何ができるのかを調べる（特に NetStatusEvent 周り）ついでにチャットアプリ作ってみた。
	ソースは右クリックの「ソースを表示」から。重要な部分だけコメント付き。
	<br/>
	要 Flash Player 10.1 - <a href="http://labs.adobe.com/downloads/flashplayer10.html">Adobe Labs - Downloads: Flash Player 10.1</a>
</p>
<p>
	Stratus って何？な人と Stratus1 は触ったけど Stratus2 って何？な人は <a href="http://cuaoar.jp/2010/03/flash-player-101-rtmfp-3.html">Flash Player 10.1 と RTMFP （ピアアシストネットワーク） - akihiro kamijo</a>
	に分かりやすく機能説明してある。
	要するに、 FlashPlayer10.0 から 1Peer to 1Peer できるようになったけど、 10.1 ではさらに nPeer のグループを作ってその中で Peer to Peer できるってことみたい。
</p>
<p>
	Stratus2 には、
	<ul>
		<li>
			マルチキャスト (Application-Level Multicast)
		</li>
		<li>
			オブジェクト複製 (Object Replication)
		</li>
		<li>
			ポスト (Posting)
		</li>
		<li>
			ダイレクトルーティング (Direct Routing)
		</li>
	</ul>
	の4通りのデータ配信の方法があって、それぞれに特徴があるらしい。（詳細は上のリンクから上条さんの記事を参照）
	今回のチャットアプリではグループ全体と喋る Say 機能と、
	グループ内の特定の相手と喋る Tell 機能と、
	自分が参加する前の過去ログを取得する機能を実装した。
	<ul>
		<li>
			Say 機能 → 「大量の送り手が時々ポストする」 → ポスト！
		</li>
		<li>
			Tell 機能 → 「誰にメッセージを送るかを指定する」 → ダイレクトルーティング！
		</li>
		<li>
			過去ログ取得 → 「どのオブジェクトを持っているか或いは欲しいかという情報をグループ内に通知」 → オブジェクト複製！
		</li>
	</ul>
	みたいな感じに、別々のデータの配信方法を使っている。
</p>
<p>
	Stratus2 関連のリンク
	<ul>
		<li>
			<a href="http://cuaoar.jp/2010/03/flash-player-101-rtmfp-3.html">Flash Player 10.1 と RTMFP （ピアアシストネットワーク） - akihiro kamijo</a>
			: 上条さんによる Stratus2 の説明。
		</li>
		<li>
			<a href="http://www.flashrealtime.com/simple-chat-p2p-netgroup-rtmfp/">Simple chat with P2P NetGroup in FP 10.1 — FlashRealtime.com</a>
			: 開発環境のセットアップとサンプルコード。
		</li>
		<li>
			<a href="http://labs.adobe.com/technologies/stratus/">Adobe Labs - Stratus</a>
			: AdobeLabs の Stratus トップ。"Signup for a Stratus beta developer key" からディベロッパキーを取得。
		</li>
		<li>
			<a href="http://www.adobe.com/devnet/flashmediaserver/articles/p2p_rtmfp_groups.html">Peer-assisted networking using RTMFP groups in Flash Player 10.1 | Adobe Developer Connection</a>
			: コードと解説。
		</li>
		<li>
			<a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/flash/net/NetGroup.html">NetGroup - BETA ActionScript 3.0 Reference for the Adobe Flash Platform</a>
			: NetGroup クラスの ASDoc。
		</li>
		<li>
			<a href="http://cuaoar.jp/2010/03/flash-player-101-rtmfp.html">Flash Player 10.1 と RTMFP - akihiro kamijo</a>
			: RTMFP とは。
		</li>
		<li>
			<a href="http://cuaoar.jp/2010/03/flash-player-101-rtmfp-2.html">Flash Player 10.1 と RTMFP （Stratus と接続性について） - akihiro kamijo</a>
			: RTMFP の仕組みとできないこと。
		</li>
	</ul>
</p>
]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/03/13/chatonstratus2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitterを今更はじめました</title>
		<link>http://ferv.jp/blog/2010/02/23/twitter%e3%82%92%e4%bb%8a%e6%9b%b4%e3%81%af%e3%81%98%e3%82%81%e3%81%be%e3%81%97%e3%81%9f/</link>
		<comments>http://ferv.jp/blog/2010/02/23/twitter%e3%82%92%e4%bb%8a%e6%9b%b4%e3%81%af%e3%81%98%e3%82%81%e3%81%be%e3%81%97%e3%81%9f/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 12:30:33 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1238</guid>
		<description><![CDATA[つぶやくことねーやと思ってたらリアルで結構な頻度でつぶやいてることに気づいて、Twitterするしかねぇと思いました。ふぉろーみー→]]></description>
			<content:encoded><![CDATA[<p>つぶやくことねーやと思ってたらリアルで結構な頻度でつぶやいてることに気づいて、Twitterするしかねぇと思いました。ふぉろーみー→</p>]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/02/23/twitter%e3%82%92%e4%bb%8a%e6%9b%b4%e3%81%af%e3%81%98%e3%82%81%e3%81%be%e3%81%97%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alchemy PNG encoder のデモ</title>
		<link>http://ferv.jp/blog/2010/02/04/alchemy-png-encoder-demo/</link>
		<comments>http://ferv.jp/blog/2010/02/04/alchemy-png-encoder-demo/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 20:55:11 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Alchemy]]></category>
		<category><![CDATA[FileReference]]></category>
		<category><![CDATA[PNGEncoder]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1214</guid>
		<description><![CDATA[dsk/PNG - Spark project の /src/sample にある二種類デモをパブリッシュした swf を張っておきます。
同期処理でエンコード

zlib 圧縮率を 1 で、不透明な画像と透明な画 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.libspark.org/wiki/dsk/PNG">dsk/PNG - Spark project</a> の /src/sample にある二種類デモをパブリッシュした swf を張っておきます。</p>
<h2>同期処理でエンコード</h2>
<p><a rel="shadowbox;width=500;height=400;" href='http://ferv.jp/blog/wp-content/uploads/2010/02/PNGEncodeSync.swf'><img src="http://ferv.jp/blog/wp-content/uploads/2010/02/PNGEncodeSync.png" title="PNGEncodeSync" width="465" height="150" class="alignnone size-full wp-image-1034" /></a></p>
<p>zlib 圧縮率を 1 で、不透明な画像と透明な画像に対してフィルタの種類を変えてエンコードしてみる。</p>
<h2>非同期処理でエンコード</h2>
<p><a rel="shadowbox;width=500;height=400;" href='http://ferv.jp/blog/wp-content/uploads/2010/02/PNGEncodeAsync.swf'><img src="http://ferv.jp/blog/wp-content/uploads/2010/02/PNGEncodeAsync.png" alt="PNGEncodeAsync" title="PNGEncodeAsync" width="465" height="150" class="alignnone size-full wp-image-1034" /></a></p>
<p>非同期処理の注目点は、この例だと 12 回一気にコールしてるんだけど最後にコールしたところから順々に実行され、一個処理が終わると次の処理って感じにお行儀よく処理されていく。
これは Alchemy の機能だと思うんだけどコールしたのと逆順なのはなんか理由があるのかな・・・</p>
<p>あと、こっちはエンコード終了時に toXML() メソッドでちょっとだけデコードして情報を抜き出した XML を trace() してるから Firefox で FlashTracer 入れてる人は開いてみるといいかも。</p>]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/02/04/alchemy-png-encoder-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alchemy PNG encoder を Spark</title>
		<link>http://ferv.jp/blog/2010/02/03/alchemy-png-encoder-spark/</link>
		<comments>http://ferv.jp/blog/2010/02/03/alchemy-png-encoder-spark/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 11:29:07 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Alchemy]]></category>
		<category><![CDATA[FileFormat]]></category>
		<category><![CDATA[PNGEncoder]]></category>

		<guid isPermaLink="false">http://ferv.jp/blog/?p=1206</guid>
		<description><![CDATA[高速化に繋がらなくて一度は捨てかけた Alchemy + libpng + zlib の PNG エンコーダを Spark した。
使い方とか svn の URL は dsk/PNG - Spark project か [...]]]></description>
			<content:encoded><![CDATA[<p>高速化に繋がらなくて一度は捨てかけた Alchemy + libpng + zlib の PNG エンコーダを Spark した。
使い方とか svn の URL は <a href="http://www.libspark.org/wiki/dsk/PNG">dsk/PNG - Spark project</a> から。</p>
<p>拾った理由は、こんな感じ。
AS3 では ByteArray.compress() メソッドを叩くと、 deflate 圧縮して zlib 形式にフォーマットしてくれるんだけど、
冗長性のない ByteArray の圧縮は高速に処理できるけど、 PNG フォーマットに定義されているフィルタ処理で冗長化してから compress() すると処理にやたらと時間がかかる。
フィルタリングする前提だと、 zlib 圧縮率を低めにすれば十分高速に処理でき、 zlib 圧縮率よりもフィルタリングの有無の方がファイルサイズ縮小のメリットが大きいけど、 compress() メソッドでは zlib 圧縮率を設定できない。
あとは、 Alchemy だと非同期に処理するコードも簡単に書けるから、大きなサイズの BitmapData をエンコードする場合などもメリットありそうだし。</p>
<p>Alchemy の非同期処理は進捗とかを関数の参照渡しで C から AS の関数をコールして通知するんだけど、これって AS3 ライクじゃないんでイベントを発行する形にラップしてある。
あと、デバッグ用にちょっとだけデコードしてチャンクの情報とかを XML にして返す関数も実装。</p>

]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2010/02/03/alchemy-png-encoder-spark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

