前回、テキストファイルへの入出力ができるようになった「気がした」ので、応用としてPPM形式のファイル出力を試みました。Linuxではお馴染みのPPM形式はテキストファイルをダラダラと書き出せばカラーグラフィックになるお楽なフォーマットです。以前、Go言語、Rust言語をちょっと練習したときにもお世話になっている形式。
※Pharo関係記事の投稿順Indexは こちら
※Smalltalkの法灯を継ぐモダンな処理系Pharo様を練習してます。今回の動作確認には、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。
PPM形式
Pharo様は強力なグラフィクスを内蔵しているみたいなので、後でじっくり使わせていただくつもりです。しかし、今回から何回か「お手製」のグラフィックス出力を使って過去、他言語でも練習した「例題」的なプログラム(ちっこいアルゴリズム的なやつ)を演習してみるつもりです。
今回は、以下の別シリーズ回のGo言語のソースのPPM出力部分を「パクって」Pharo様上のPPM形式ファイル出力としています。
やっつけな日常(7) スマホでGo! fmt.Printで吉例マンデルブロ集合を描く
もともと「やっつけ」なコードである上に、Go言語のソースを「ほぼほぼ」一対一な感じ、Pharoに載せ替えたので「純粋オブジェクト・オリエンテッド」風味でない感じもします。お惚け老人だし仕方ないか。
テキストファイル出力が「できる気」がしたとは言え、Pharo素人は分からんことが多かったデス。今回中核のPPMファイル形式へのビットマップの書き出しメソッドが以下に。
書き出し用のストリーム作ってクラスの中身を書き出していくのですが、最初改行しようとして赤丸で囲ったnextPutAll:に渡す文字列の中に ‘\n’ みたいことを書いて見事に失敗しました。\nと書いたら本当に字ズラ通りの\nがファイルに出力されてました。あちゃ~。結局 Transcriptウインドウに出力するときのように、cr を送らないとダメみたいです(上の緑で丸したところ)。
また、数値は nextPutAll: ではダメで、print: メソッドにお願いしないとならんかったです。トホホ。。。
作製したクラス2つ
TDDすべしということで、テスト用のクラスを作りはしたのですが、上記の問題に引っかかって、全然TDDしてないです。また今度だな。テスト駆動になってないっす。
今回作成のクラスは以下の2つ。まず MyBitMapクラスが以下に。
widthがビットマップのピクセル幅、heightがビットマップのピクセル高さを保持するクラスです。cmaxはRGB各色の輝度レベルです。現状は各色256段階固定。そして bufなるお名前のArrayが width x heightサイズのビットマップ平面を保持します。ビットマップ平面には以下のMyBitMapColorクラスが「詰まってます」
ありがちな red green blue各色のレベルを保持するものです。
一応、widthとheightを再初期化できるようにはしましたが、練習には上記のデフォルト値くらいで十分かと。
サンプルパターンを描いてみた
ベタな3原色を並べただけのパターンを描いてみました。
| testPPM | testPPM := MyBitMap new. testPPM generateSamplePattern. testPPM writePPM: 'test.ppm'
ファイルの中身をみると単純なテキストファイルなんだが、PPM対応のグラフィックビューワー使えばちゃんと画像にみえるっと。
次回は「吉例」の画像をPharo様に描いてもらえよ。自分。