あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

Perlでフレームバッファ (2013.10.29)

発端

Perlでちょっとした画像処理をしたくて、動作中の表示がそのまま画面に表示されるとデバッグがしやすい訳です。
画面が表示されて、ピクセル単位にRGB値で読み書きできる最小限のパッケージを作りました。

ベースはPerl/TkのPhoto

既設のパッケージ「Tk」を利用して、その中のPhotoをベースにしてあります。 言語上の継承はできませんでした。けれどPhotoだと思って使うことができるよう工夫してあります。 単にTkを使おうとするとMainWindow、Image、Photoで協調させなくてはなりません。 その辺りの面倒を見るパッケージになっています。 このパッケージを利用する人はPhotoのオブジェクトを1個生成してピクセル値を書き込むコードを用意すると それが収まるウィンドウに書き込んだピクセル値が反映されます。

サンプルプログラム

#!/usr/bin/perl -w

use strict;
use utf8;
use MyFramebuffer;

binmode STDOUT, ":encoding(cp932)";

# 経過表示用にバッファ処理なし
$| = 1;

test_myframebuffer();

# 終了待ち
print "終了待ち(ウィンドウを閉じると終了)\n";
MainLoop();

sub test_myframebuffer
{
	my $photo = MyFramebuffer->new(
		-title => "フレームバッファのサンプル",
		-width => 500,
		-height => 500
	);

	my $cx = 250;
	my $cy = 250;
	for (my $y = 0; $y < $photo->height(); $y++) {
		for (my $x = 0; $x < $photo->width(); $x++) {
			if (int(sqrt(($y - $cy) ** 2 + ($x - $cx) ** 2)) == 200) {
				$photo->put('#ff0000', -to => ($x, $y));
			}
		}

		# 1段毎に画面全体を更新
		$photo->update();

		# 処理経過
		print "行:$y\r";
	}

	# 処理経過の改行
	print "\n";

	my $count = 0;
	for (my $y = 0; $y < $photo->height(); $y++) {
		for (my $x = 0; $x < $photo->width(); $x++) {
			my @pixel = $photo->get($x, $y);
			if ($pixel[0]) {
				$count++;
			}
			printf "get(%3d, %3d) == %3d %3d %3d, count == %3d\r", $x, $y, @pixel, $count;
		}
	}

	# 処理経過の改行
	print "\n";
}

パッケージMyFramebuffer

sample_myframebuffer.pl (1,183 バイトをVPSから 00:05 で)
myframebuffer.pm (3,002 バイトをVPSから 00:05 で)