TextField の余白(3)
2009/04/07 20:48 - AS3.0
TextField を BitmapData に draw するときに余白を断ち切りたい話の続き。
TextField クラスで取得できるサイズ系プロパティでは余白の計算はできないことを前回見ました。
仕方ないので、やはりここは愚直な手法を採りますかねぇ。
まずは今までどおり、2pixel の縁取りを取り除いた形で TextFiled を BitmapData に draw します。 このときの BitmapData のインスタンスは bmd1 とします。
次にこの bmd1 に対して実に泥臭い手間をかけますよ。
bmd1 の天地左右の透明具合を行または列単位で 1pixel ずつ確認します。
天なら地に向かって、地なら天に向かって1行単位で、左なら右に向かって、右なら左に向かって1列単位で確認していくわけです。




なお、ループ条件の w1、h1 というのは、bmd1 の width と height です。
各断ち切り検出は二重ループになっています。 内側のループで透明でないピクセルが検出されたら break で二重ループを抜け、外側のループでカウントアップされた数値を待避させます。
この待避させた数値がそれぞれ断ち切る値になるわけですね。
断ち切るべき値が分かればあとは簡単明瞭。 ここで BitmapData.draw をもう一度発動します。
あらたな BitmapData を用意し、これを bmd2 とします。 width と height は bmd1 の width と height から、断ち切り値を差し引いた値。
ドローソースは bmd1、第二引数の Matrix には天と左の断ち切り値を反映させれば、裁ち切り一丁上がり!
上記に則ってできた swf が↓
- ソース(Pixelizer クラス関連が大変動しています)
黒い部分が下地。赤と青が TextField を draw した BitmapData の領域で、青が透明部分、赤が非透明部分。
まぁ何とも鈍くさいコードですが、目的は達せられました。
でももっとスマートな記述にできないもんですかねぇ。
FlashPlayer 10 から導入された flash.text.engine パッケージ使うとプロパティで余白の値が求められたりするのだろうか。 折を見て調べてみますかね。