<?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 &#187; BitmapData</title>
	<atom:link href="http://ferv.jp/blog/tag/bitmapdata/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>getColorBoundsRect()のバグへの対処</title>
		<link>http://ferv.jp/blog/2009/05/23/fix_bug_getcolorboundsrect/</link>
		<comments>http://ferv.jp/blog/2009/05/23/fix_bug_getcolorboundsrect/#comments</comments>
		<pubDate>Fri, 22 May 2009 17:44:15 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[BitmapData]]></category>

		<guid isPermaLink="false">http://flabo.org/?p=742</guid>
		<description><![CDATA[getColorBoundsRect()のバグ？でバグかなと思ってた部分がとっくの昔にAdobeに報告されてて未だに放置プレイの現状。getColorBoundsRect() 自体は便利なのでどうしても（バグの不安なく） [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ferv.jp/blog/2009/04/07/bug_getcolorboundsrect/">getColorBoundsRect()のバグ？</a>でバグかなと思ってた部分が<a href="https://bugs.adobe.com/jira/browse/FP-734">とっくの昔にAdobeに報告されてて</a>未だに放置プレイの現状。getColorBoundsRect() 自体は便利なのでどうしても（バグの不安なく）使いたいからこんなことしてみた。けど、こんな方法でいいのかイマイチ自信ない。</p>
<h2>バグの内容</h2>
<p>BitmapData の {x = 0, y = 0, width = 1, height = 1} に孤立した（周りが別の色の）塗りデータがある場合、 getColorBoundsRect() が {x = 0, y = 0, width = 1, height = 1} を判定してくれない。<br />
（左上の1pxだけ周りと別の色っていうシチュエーション自体が稀と思いきや、このバグに悩まされるのが人生の中で二回目だったという事実。）</p>
<h2>バグの検証用SWFの使い方</h2>
<p><a rel="shadowbox;width=600;height=400;" href="http://ferv.jp/blog/wp-content/uploads/2009/05/testclass_bitmapdatautil.swf">TestClass_BitmapDataUtil.swf</a><p>
<ul>
<li>12px * 8px の 33ffff00 で塗った Bitmap が拡大して貼ってある。方眼１マスが 1px * 1px と思えばおｋ。</li>
<li>Bitmap をクリックすると、クリックしたピクセルを ffff0000 で塗る。</li>
<li>Test ボタンで BitmapData クラスの getColorBoundsRect() と、自作 BitmapDataUtil クラスの getColorBoundsRect() を実行する。</li>
<li>getColorBoundsRect() の引数は、 Test ボタンの上の3つの TextInput から変えられる。</li>
<li>実行結果は Test ボタンの下に表示され、その結果を視覚化した枠が表示される。 BitmapData クラスの getColorBoundsRect() の実行結果は緑の枠で、自作 BitmapDataUtil クラスの getColorBoundsRect() の実行結果は青の枠。</li>
</ul>
<h2>バグの検証手順</h2>
<p>下の1～5の手順で引数を {mask = ffffffff, color: ffff0000, findColor: true} と {mask = ffffffff, color: 33ffff00, findColor: false} の二通りで検証する。</p>
<ol>
<li>左上以外の1pxをクリックして赤くしてみる。</li>
<li>Testボタンを押して実行。 width/height 共に 1 でちゃんと取得できてることを確認する。</li>
<li>Resetボタンを押して、塗りをリセットする。</li>
<li>左上の1pxをクリックして赤くしてみる。</li>
<li>Testボタンを押して実行。BitmapData クラスは width/height 共に 0 でちゃんと取得できない。</li>
</ol>
<h2>BitmapDataUtil クラスの getColorBoundsRect() の実装</h2>
<p>まずはASDocながめる。</p>
<blockquote cite="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/BitmapData.html#getColorBoundsRect()">例えば、あるソースイメージで、0 以外のアルファチャンネルを含むイメージの矩形を判別するには、パラメータとして {mask: 0xFF000000, color: 0x00000000} を渡します。findColor パラメータが true に設定されている場合、(value & mask) == color であるピクセルの境界を見つけるためにイメージ全体が検索されます（value はピクセルのカラー値）。 findColor パラメータが false に設定されている場合、(value & mask) != color であるピクセルの境界を見つけるためにイメージ全体が検索されます（value はピクセルのカラー値）。 イメージの周囲の空白を判別するには、空白以外のピクセルの境界を見つけるために、{mask: 0xFFFFFFFF, color: 0xFFFFFFFF} を渡してください。
<p class="via"><a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/BitmapData.html#getColorBoundsRect()">getColorBoundsRect() メソッド</a></p></blockquote>
<p>左上の1pxだけ BitmapData.getPixel32()する。取得した色と mask の論理積だして color と比較して、 BitmapData.getColorBoundsRect() で出てきた Rectangle と 左上の1pxの Rectangle の和集合出したら終わり。<br />
と思ったら論理積のところに罠があった。</p>
<blockquote cite="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/operators.html#bitwise_AND">結果は 32 ビットの 2 の補数として解釈されるため、-2147483648 ～ 2147483647 の範囲の整数になります。
<p class="via"><a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/operators.html#bitwise_AND">& bitwise AND 演算子</a></p></blockquote>
<p>-2147483648 ～ 2147483647 は16進数で、 -7fffffff ～ 7fffffff てことで、アルファが 7f 超えるとなんかマイナス戻ってくる・・・<br />
しょうがなく ARGB を A と RGB に分けてそれぞれ論理積だして、足して ARGB に戻して color と比較。<br />
findColor が true で論理積の ARGB と color が同値なら、左上の1pxを足す。findColor が false で論理積の ARGB と color が同値でなければ、左上の1pxを足す。<br />
これで、「左上の1pxだけ塗った場合」と「左上以外の1pxを塗った場合」の挙動が同じになる。気がする。</p>
	<ul class="syntax_hilite_header">		<li class="language">ActionScript</li>		<li class="filename">BitmapDataUtil.as</li>	<li class="source"><a href="#actionscript-2_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="actionscript-2_plane"><pre>package {
	import flash.display.BitmapData;
	import flash.geom.Rectangle;

	/**
	 * BitmapData のユーティリティクラスです.
	 *
	 * @langversion ActionScript 3.0
	 * @playerversion Flash 9.0
	 *
	 * @author dsk
	 * @since 2009/05/20
	 */
	public class BitmapDataUtil {

		/**
		 * （findColor パラメータが true に設定されている場合）ビットマップイメージ内の指定された色のすべてのピクセルを完全に囲む矩形領域を判別します。または、（findColor パラメータが false に設定されている場合）指定された色ではないすべてのピクセルを完全に囲む矩形領域を判別します。
		 *
		 * @param	bitmapData	ビットマップデータです。
		 * @param	mask		対象となる ARGB カラーのビットを指定する 16 進数値です。カラー値は、&（ビット単位の論理積（AND））演算子を使用して、この 16 進数値と組み合わせられます。
		 * @param	color		16 進数値です。（findColor が true に設定されている場合は）一致すべき ARGB カラー、一致すべきでない ARGB カラー（findColor が false に設定されている場合）をそれぞれ指定します。
		 * @param	findColor	値が true に設定された場合、イメージ内のカラー値の境界を返します。 値が false に設定された場合、イメージ内の指定されたカラーが存在しない領域の境界を返します。
		 * @return
		 */
		public static function getColorBoundsRect(bitmapData:BitmapData, mask:uint = 0x00000000, color:uint = 0xff000000, findColor:Boolean = true):Rectangle {
			var rectangle:Rectangle = bitmapData.getColorBoundsRect(mask, color, findColor);

			var maskA:uint = mask >> 24 & 0xff;
			var maskRGB:uint = mask & 0xffffff;
			var leftTopARGB:uint = bitmapData.getPixel32(0, 0);
			var leftTopA:uint = leftTopARGB >> 24 & 0xff;
			var leftTopRGB:uint = leftTopARGB & 0xffffff;

			var resultA:uint = leftTopA & maskA;
			var resultRGB:uint = leftTopRGB & maskRGB
			var resultARGB:uint = (resultA << 24) + resultRGB;

			if (findColor) {
				if (resultARGB == color) {
					rectangle = rectangle.union(new Rectangle(0, 0, 1, 1));
				}
			} else {
				if (resultARGB != color) {
					rectangle = rectangle.union(new Rectangle(0, 0, 1, 1));
				}
			}

			return rectangle;
		}


	}

}</pre></div><div class="syntax_hilite">
<div id="actionscript-2">
<div class="actionscript actionscript" style="font-family:monospace;"><ol><li class="li1"><div class="de1">package <span class="br0">&#123;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">BitmapData</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">geom</span>.<span class="me1">Rectangle</span>;</div></li>
<li class="li2"><div class="de2">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* BitmapData のユーティリティクラスです.</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @langversion ActionScript 3.0</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @playerversion Flash 9.0</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @author dsk</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @since 2009/05/20</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> BitmapDataUtil <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* （findColor パラメータが true に設定されている場合）ビットマップイメージ内の指定された色のすべてのピクセルを完全に囲む矩形領域を判別します。または、（findColor パラメータが false に設定されている場合）指定された色ではないすべてのピクセルを完全に囲む矩形領域を判別します。</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param &nbsp; bitmapData&nbsp; ビットマップデータです。</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param &nbsp; mask&nbsp; &nbsp; &nbsp; &nbsp; 対象となる ARGB カラーのビットを指定する 16 進数値です。カラー値は、&amp;（ビット単位の論理積（AND））演算子を使用して、この 16 進数値と組み合わせられます。</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param &nbsp; color &nbsp; &nbsp; &nbsp; 16 進数値です。（findColor が true に設定されている場合は）一致すべき ARGB カラー、一致すべきでない ARGB カラー（findColor が false に設定されている場合）をそれぞれ指定します。</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param &nbsp; findColor &nbsp; 値が true に設定された場合、イメージ内のカラー値の境界を返します。 値が false に設定された場合、イメージ内の指定されたカラーが存在しない領域の境界を返します。</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> getColorBoundsRect<span class="br0">&#40;</span>bitmapData:BitmapData, mask:uint = 0x00000000, <span class="kw3">color</span>:uint = 0xff000000, findColor:<span class="kw3">Boolean</span> = <span class="kw2">true</span><span class="br0">&#41;</span>:Rectangle <span class="br0">&#123;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> rectangle:Rectangle = bitmapData.<span class="me1">getColorBoundsRect</span><span class="br0">&#40;</span>mask, <span class="kw3">color</span>, findColor<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> maskA:uint = mask <span class="sy0">&gt;&gt;</span> <span class="nu0">24</span> <span class="sy0">&amp;</span> 0xff;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> maskRGB:uint = mask <span class="sy0">&amp;</span> 0xffffff;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> leftTopARGB:uint = bitmapData.<span class="me1">getPixel32</span><span class="br0">&#40;</span>0, 0<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> leftTopA:uint = leftTopARGB <span class="sy0">&gt;&gt;</span> <span class="nu0">24</span> <span class="sy0">&amp;</span> 0xff;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> leftTopRGB:uint = leftTopARGB <span class="sy0">&amp;</span> 0xffffff;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> resultA:uint = leftTopA <span class="sy0">&amp;</span> maskA;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> resultRGB:uint = leftTopRGB <span class="sy0">&amp;</span> maskRGB</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> resultARGB:uint = <span class="br0">&#40;</span>resultA <span class="sy0">&lt;&lt;</span> <span class="nu0">24</span><span class="br0">&#41;</span> + resultRGB;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>findColor<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>resultARGB == <span class="kw3">color</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rectangle = rectangle.<span class="me1">union</span><span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, 0, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>resultARGB <span class="sy0">!</span>= <span class="kw3">color</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rectangle = rectangle.<span class="me1">union</span><span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, 0, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> rectangle;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li2"><div class="de2">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2"><span class="br0">&#125;</span></div></li>
</ol></div>
</div></div><br />
<p>右に1pxずらした BitmapData を新しく作って、getColorBoundsRect() して取得した Rectangle を左に1px戻すってのでもいいかもしんないけど、なんか気持ち悪い。Adobe先生お願いします。</p>]]></content:encoded>
			<wfw:commentRss>http://ferv.jp/blog/2009/05/23/fix_bug_getcolorboundsrect/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>getColorBoundsRect()のバグ？</title>
		<link>http://ferv.jp/blog/2009/04/07/bug_getcolorboundsrect/</link>
		<comments>http://ferv.jp/blog/2009/04/07/bug_getcolorboundsrect/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 09:47:48 +0000</pubDate>
		<dc:creator>dsk</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[BitmapData]]></category>

		<guid isPermaLink="false">http://flabo.org/?p=448</guid>
		<description><![CDATA[09/05/23追記 getColorBoundsRect()のバグへの対処 で対処方法考えてみた。
09/05/20追記 BitmapData.getColorBoundsRect() fails on a sing [...]]]></description>
			<content:encoded><![CDATA[<p><strong>09/05/23追記</strong> <a href="http://ferv.jp/blog/2009/05/23/fix_bug_getcolorboundsrect/">getColorBoundsRect()のバグへの対処</a> で対処方法考えてみた。</p>
<p><strong>09/05/20追記</strong> <a href="https://bugs.adobe.com/jira/browse/FP-734">BitmapData.getColorBoundsRect() fails on a single pixel</a> Adobe Bug Systemには報告済みの模様。</p>
<p>ビットマップデータ内の特定色の矩形領域を取得するメソッドgetColorBoundsRect()で(0, 0)に1px*1pxで描いた色が判定できなかった。</p>
<p><a href="http://www.voidelement.com/presen/tyouzetsu_070929.swf" rel="shadowbox[post-448];width=640;height=385;" target="_blank">画像処理で高速化</a><span class="at"><a href="http://void.heteml.jp/blog/">void element</a></span>を読んで、「全ピクセル走査は最後の手段」ってことで、禁じ手のgetPixel32()をgetColorBoundsRect()に置き換えてみようとしたんだけど・・・</p>
<p>作ってるモノが(0,0)に1px*1pxなBitmapDataも対象にしてるクラスだったんで今回は使えなかったけど、上のリンクはその名に恥じない超絶技巧なので勉強になります。</p>
<p>以下は色んなところに赤いBitmapDataを作ってgetColorBoundsRect()で取得できるかの(小さくて見づらい)サンプル。主に(0,0)近辺に小さなBitmapDataを作ってテストしてます。結果としては、(0,0)かつ1px*1px以外のものは大丈夫そう。</p>
<p><a rel="shadowbox;width=560;height=550;options={flashParams:{bgcolor:'#FFFFFF'}};" href='http://ferv.jp/blog/wp-content/uploads/2009/04/testbug_bitmapdata.swf'>testbug_bitmapdata.swf</a></p>
	<ul class="syntax_hilite_header">		<li class="language">ActionScript</li>		<li class="filename"></li>	<li class="source"><a href="#actionscript-4_plane" rel="shadowbox;">Source</a></li></ul><div class="syntax_hilite_planecode" id="actionscript-4_plane"><pre>package  {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;

	public class TestBug_BitmapData extends Sprite {

		private var _counter:int;

		public function TestBug_BitmapData() {
			_counter = 0;

			test(new Rectangle(0, 0, 1, 1));
			test(new Rectangle(29, 0, 1, 1));
			test(new Rectangle(29, 29, 1, 1));
			test(new Rectangle(0, 29, 1, 1));
			test(new Rectangle(0, 1, 1, 1));
			test(new Rectangle(1, 0, 1, 1));
			test(new Rectangle(1, 1, 1, 1));
			test(new Rectangle(0, 0, 1, 2));
			test(new Rectangle(0, 0, 2, 1));
		}

		private function test(rectangle:Rectangle):void {
			_counter ++;

			var id:int = _counter;
			var bitmapData:BitmapData = new BitmapData(30, 30, false, 0xCCCCCC);
			bitmapData.fillRect(rectangle, 0xFF0000);

			var bitmap:Bitmap = new Bitmap(bitmapData);
			bitmap.x = 50;
			bitmap.y = 50 * id;
			addChild(bitmap);

			var textFormat:TextFormat = new TextFormat();
			textFormat.font = '_等幅';
			var textField:TextField = new TextField();
			textField.autoSize = TextFieldAutoSize.LEFT;
			textField.appendText('test' + id.toString() + '\n');
			textField.appendText(bitmapData.getColorBoundsRect(0xFF0000, 0xFF0000, true).toString());
			textField.setTextFormat(textFormat);
			textField.x = 100;
			textField.y = 50 * id;
			addChild(textField);
		}

	}

}</pre></div><div class="syntax_hilite">
<div id="actionscript-4">
<div class="actionscript actionscript" style="font-family:monospace;"><ol><li class="li1"><div class="de1">package &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">Bitmap</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">BitmapData</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">Sprite</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">geom</span>.<span class="me1">Rectangle</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="kw3">TextField</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="me1">TextFieldAutoSize</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="kw3">TextFormat</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> TestBug_BitmapData <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _counter:<span class="kw3">int</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TestBug_BitmapData<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; &nbsp; &nbsp; _counter = 0;</div></li>
<li class="li2"><div class="de2">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, 0, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">29</span>, 0, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">29</span>, <span class="nu0">29</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, <span class="nu0">29</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, <span class="nu0">1</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">1</span>, 0, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">1</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, 0, <span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test<span class="br0">&#40;</span><span class="kw2">new</span> Rectangle<span class="br0">&#40;</span>0, 0, <span class="nu0">2</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</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;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> test<span class="br0">&#40;</span>rectangle:Rectangle<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _counter ++;</div></li>
<li class="li2"><div class="de2">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> id:<span class="kw3">int</span> = _counter;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> bitmapData:BitmapData = <span class="kw2">new</span> BitmapData<span class="br0">&#40;</span><span class="nu0">30</span>, <span class="nu0">30</span>, <span class="kw2">false</span>, 0xCCCCCC<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitmapData.<span class="me1">fillRect</span><span class="br0">&#40;</span>rectangle, 0xFF0000<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> bitmap:Bitmap = <span class="kw2">new</span> Bitmap<span class="br0">&#40;</span>bitmapData<span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitmap.<span class="me1">x</span> = <span class="nu0">50</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bitmap.<span class="me1">y</span> = <span class="nu0">50</span> <span class="sy0">*</span> id;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>bitmap<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="kw3">textFormat</span>:<span class="kw3">TextFormat</span> = <span class="kw2">new</span> <span class="kw3">TextFormat</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textFormat</span>.<span class="kw3">font</span> = <span class="st0">'_等幅'</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="kw3">textField</span>:<span class="kw3">TextField</span> = <span class="kw2">new</span> <span class="kw3">TextField</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textField</span>.<span class="kw3">autoSize</span> = TextFieldAutoSize.<span class="kw3">LEFT</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textField</span>.<span class="me1">appendText</span><span class="br0">&#40;</span><span class="st0">'test'</span> + id.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">'<span class="es0">\n</span>'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textField</span>.<span class="me1">appendText</span><span class="br0">&#40;</span>bitmapData.<span class="me1">getColorBoundsRect</span><span class="br0">&#40;</span>0xFF0000, 0xFF0000, <span class="kw2">true</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textField</span>.<span class="kw3">setTextFormat</span><span class="br0">&#40;</span><span class="kw3">textFormat</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textField</span>.<span class="me1">x</span> = <span class="nu0">100</span>;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">textField</span>.<span class="me1">y</span> = <span class="nu0">50</span> <span class="sy0">*</span> id;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span><span class="kw3">textField</span><span class="br0">&#41;</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;</div></li>
<li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</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/2009/04/07/bug_getcolorboundsrect/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

