ホーム : 実験室 : TestPicSize

TestPicSize(2007/11/27)

 大きな画像サイズをテストするためのプログラムです。AppleにBugReport しようかと作ったプログラムなのですが、あちこちで不具合がでるので無駄 だなとやめました。
 画像の幅が32768ピクセルを超えると実行の都度違った場所でダウンした り、表示が不正だったりします。Quartz2Dの中のあちこちにshort変数によ る縛りがあるようです。今回のプログラムでは使用していませんが、 QuickTimeで画像を保存しようとしたときにも、画像の幅が32768を超えると 不具合が出ます。JPEG変換は時間をかけて実行しているのに、保存したファ イルはサイズがゼロだったりします。
 ということでSimpleDEMViewerで、32767 ピクセルまでの制限を残します。(現在は16384になっていますが)
 このプログラムは自由に改変して利用してください。

プログラムの概要

  • 起動直後、およびファイルメニューのNewを実行することにより、指定した大きさの画像を作りウインドウに表示します。画像は単純に全体を黄色で 塗りつぶし、色違いの斜めの線を引くだけです。
  • 画像は CreatePicture() ルーチンで指定された大きさの CGBitmapContext を作成し、描画した後 CGImageRef を作成します。
  • スクロールバーにより画像のスクロールができ、現在の表示範囲をフロー トウインドウにCGRect情報(origin,size)として表示します。

不具合箇所

 サイズが32768以下の時は問題なく動きますが、それを超えるとあちこちで問題が出ます。

  • CreatePicture() の中で、端から端までの線を引くときにダウンしたりしなかったり。
  • CGBitamapContextをCGImageRefに変換するときに、現在コメントアウトしてある CGBitmapContextCreateImage() を使用すると描画時に100%落ちる。
  • 巧い具合に描画まで行ったとして、ウインドウ左端の画像位置が32768を超えると描画ができず真っ白になる。例えば左端が32760ならウインドウの右端まで正常に描画されるので、CGImageRefは正しく作成できているはず。さらに画像の右端から32768ピクセル以上左側も描画できないですね。
  • SetWindowResizeLimits() で最大サイズを32768以上に指定すると、ズームや、ドラッグリサイズができなくなる。今回は最大4000で制限している。( HandleNew() 内)

使用しているテクニック(Carbon入門者のための参考)

  • オフライン描画領域CGBitamapContextの作成。(QuickDrawの オフラインGWorld相当)
    CreateBitmapContext()
  • Quartz2DによるCGBitamapContextへの描画。CreatePicture()
  • ユーザーペインへコントロールの描画。DrawUserPane()
    (注)現在は画像が上下逆転して描画されているので、文字を含むときは変更要。
  • ダイアログからテキスト入力。AcceptPictureSize(), PicSizeWindowEventHandler(), CheckInput()
  • 画像のスクロール。スクロールバーのActionProc。DoScrollActions()

 プロジェクトはXcode 2.5で作成しています。

 ダウンロード testPicSize.zip(44kB)

(C)Copyright 2007, Yoshiaki Katayanagi.