Squeakあれこれ

Squeak関連情報など

[Squeak]サムネイルとプロジェクトファイル(3)

2005-05-28 | squeakあれこれ
ひさびさの更新です。Yaxoとかの解析とかしててblogから遠のいてました。

前回はWorkspaceから操作する方法であったが,Projectメニューの'手元のディスクにだけプロジェクトを保存する'で保存できるようにProject>>writeFileNamed:fromDirectory:toServer:を下記のように変更した。これでメニューから保存できるようになった。だが、読込はどうしようか?やはりProjectメニューの'プロジェクトをファイルから読込…'にいれるべきかな。読み込みも出来て、ある程度テストしたらチェンジセットにまとめて公開します。
	| local resp gifFileName f project writer projectFile |

	projectFile := localDirectory oldFileNamed: localFileName.
	gifFileName _ self name,'.png'.
	localDirectory deleteFileNamed: gifFileName ifAbsent: [].
	local _ localDirectory fileNamed: gifFileName.
	thumbnail ifNil: [
		(thumbnail _ Form extent: 100@80) fillColor: Color orange
	] ifNotNil: [
		thumbnail unhibernate.
	].
	f _ thumbnail colorReduced.  "minimize depth"
	f depth > 8 ifTrue: [
		f _ thumbnail asFormOfDepth: 8
	].
	project := FileStream readOnlyFileNamed: projectFile fullName.
	project binary.
	writer := PNGSqeuakObject on: local.
	[ writer nextPutImage: f interlace: 0 filter: 0 Object: project contents]	
		ensure: [local close. project close. projectFile close.].
	[local _ StandardFileStream readOnlyFileNamed: (localDirectory fullNameFor: gifFileName).
	(primaryServerDirectory isKindOf: FileDirectory)
		ifTrue: [primaryServerDirectory deleteFileNamed: gifFileName ifAbsent: []].
	resp _ primaryServerDirectory putFile: local named: gifFileName retry: false.
	] on: Error do: [:ex |].
	local close.

	primaryServerDirectory updateProjectInfoFor: self.
	primaryServerDirectory sleep.	"if ftp, close the connection"

[Squeak]サムネイルとプロジェクトファイル(2)

2005-05-18 | squeakあれこれ
 とりあえず使い方とソース。クラス名などへぼへぼですが、PNGのチャンクの操作方法のサンプルということで。
プロジェクトファイル(名無し2.001.pr)とそのサムネイル画像(名無し2.gif)からプロジェクトファイルを埋め込んだPNG画像(002.png)生成:
| writer image project newName  |
project := FileStream readOnlyFileNamed: '名無し2.001.pr'.
project binary.
newName := '002'.
image := ImageReadWriter formFromFileNamed: '名無し2.gif'.
writer := PNGSqeuakObject on: (FileStream newFileNamed: newName, '.png').
[ writer nextPutImage: image interlace: 0 filter: 0 Object: project contents]	
	ensure: [writer close. project close]

上記PNG画像からプロジェクト読込:
| reader |
reader := PNGSqeuakObject on: (FileStream readOnlyFileNamed: '002.png').
reader nextImage

ソースプログラム:
PNGSqeuakObject.st

[Squeak]サムネイルとプロジェクトファイル(1)

2005-05-17 | squeakあれこれ
 プロジェクトをファイル保存するとサムネイル画像(gif)とプロジェクトファイルを圧縮したファイルができるが、どうもうまく管理するのが難しい。そこでサムネイル画像側のリソースにプロジェクトファイルを埋め込むことを思いつく。
 画像にリソースを埋め込める画像形式としてTIFFやPNGがあるが、TIFFはSqueakで正式サポートされていない。というわけでPNG画像に独自のプライベートチャンクを付加してそこにプロジェクトファイルを埋め込んでみた。プライベートチャンクならば通常の画像表示時には無視される。コーディングはProjectLoadingクラスの#openName:stream:fromDirectory:withProjectView:を参考にPNGReaderWriterクラスを継承したクラスに実装した。このメソッドはかなり込み入っているので、ここ2,3日費やしてしまった。現在の実装は予め保存したプロジェクトファイルとサムネイル画像(gif)からプロジェクトを埋め込んだPNG画像を生成する。PNG画像読込時に該当するプライベートチャンクがあれば、プロジェクト読込処理を行うようにした。
 ソースなどはもう少しチェックしてから公開します(といっても、利用する人はいないだろうが)。