9. NS Basic Ver.3.1.0 〜唐突でごめんなさい〜



かなり間が空いてしまいました上に、前回の続きではありません…
いやはや、初手からお詫びになって申し訳ないですが、それと引き換えにしても、NS BasicのVer.3.1.0の情報をお届けしたいと思いましたので、今回取り上げてみることにしました。
本バージョンで、新たに搭載された機能は色々あるのですが、皆さんが最も興味があると思われる「ハイレゾ」について説明したいと思います。
特に、細かな点は別にして、ひとまずNS Basicでハイレゾを使うのに困らない程度の内容でお送りしますので、肩を張らずに読んでください。
尚、Ver.3.1.0時点での内容であること、予めご了承ください。


●ハイレゾとは?

今回のバージョンアップで「Coordinate System」という聞き慣れない単語が登場しました。これは直訳すれば「座標系」になります。
バージョンアップの説明によれば、この座標系というものを取得する関数が「SysInfo(7)」で、戻り値が 72か144になり、この値が 72だとローレゾ、144だとハイレゾ、と書かれています。
説明は難しくないのですが、座標系というものが1や2といった簡単な数字でないところに、おやっ?と思われたんじゃないでしょうか。
実は、この不可解な値を「座標系」ではなく「解像度」と理解すれば、それほど不可解でもないことがわかります。
通常、dpiという単位で表される解像度ですが、これは、1インチあたり何ドット、というドットの大きさを表します。
例えば、72dpiは1インチあたり72個のドットが、144dpiは144個のドットがあるわけで、後者の方がより細かい画面であることを表しています。

この値を実機に当てはめてみましょう。
ハイレゾ(320x320)のTungsten|Tの画面は、1インチを2.54cmとすると、以下の計算によって5.64cmになることがわかります。

  320dot ÷ 144dot/inch = 2.222 inch = 5.64cm

実際に測ってみると、液晶のサイズが約5.6cmで、実表示部分はだいたい5.3cmくらいですから、それなりの数字だといえるでしょう。
このようなドットの細かさを表す解像度ですが、NS Basicで画面モードを切り替える場合は、このdpiを直接指定すると覚えておけばよいでしょう。

  SysInfoSet("CoordinateSystem",x)

ここで、 xに 72を指定すればローレゾに、144を指定すればハイレゾになります。
それ以外の値を指定してもエラーにはなりませんが、動作は保証されないとの事です。
しかし、将来的に320x320を超えるハイレゾ(4倍ハイレゾ?)のようなデバイスが登場しても、この解像度の概念があればそのまま対応できますね。ちょっと賢いなぁ、と思いました。

では、実際に、線を引いて見ましょう。
今後の色々なテストを考えて、次のような仕組みを作ってみました。


【LoRes】
  Sub object1004()
    SysInfoSet("CoordinateSystem",72)
  End Sub

【HiRes】
  Sub object1004()
    SysInfoSet("CoordinateSystem",144)
  End Sub

【Clearボタン】
  Sub object1006()
    If SysInfo(7)<=72 Then
      FillRectangle 0,40,160,120,0,nsbInverted
    Else
      FillRectangle 0,80,320,240,0,nsbInverted
    End If
  End Sub

画面上部のセレクターによって、ハイレゾとローレゾを切り替えてられるようになっています。

まずは、ここにボタンを貼り付けて、DrawLineで線を引いてみます。



【Lineボタン】
  Dim i as Integer

  For i=80 to 140 Step 10
    DrawLine 20,i,140,i
  Next

両者を比べてみると、確かにハイレゾですね。
今までになかった細かい線を引くことが出来ましたし、線の引き始めの位置も、高解像度の位置らしくなっています。
(ついでに、スクリーンショットが大きくなりましたねぇ…)

続いて、DrawRectangleを使って四角を描いてみました。



【Boxボタン】
  Dim i as Integer

  For i=10 to 60 Step 10
    DrawRectangle 20,90,i,i,0
  Next

うーん、描画の位置は、確かに指定した画面モードに従っているようですが、線の太さは変わっていませんね。
バージョンアップの説明にもあるのですが、今回のハイレゾでは、DrawLineで引いた線だけが細くなり、その他の描画系コマンドでは線の太さは変わらないと書かれていますから、もし、細い線の四角形が欲しい場合は、線を引くしかないようです。
ただ、お気づきかと思いますが、画面モードを変更しても、リセットがかかったり、画面全体が再描画されたりといったダイナミックな変化は一切なく、あっけなく切り替わりますので、この点はちょっと驚かされます。


●ビットマップを表示

さて、線の描画には制約があったようですが、ビットマップの表示はどうでしょうか?
ひとまず、画像を用意します。
NS Basicのパッケージ画像を拝借してきましたが、この画像サイズ150x182 ピクセルで、ローレゾデバイスなら、一発で画面からはみ出す大きさです。


  

これをこのまま組み込むと、サイズ的に苦しいので256色に原色して扱うことにしました。

IDE画面でビットマップの追加を実行すると、今までと違うハイレゾ画像のパスを指定するプロパティが追加されていることに気づきます。
専門的には「ファミリー」というらしいのですが、第一印象は「長くなったなぁ〜」でした(笑)。まぁ、しかし、ここに必要なパスを設定することは、今までと同じです。
まず、用意した画像を以下のよう設定して表示してみました。





【1009ボタン】
  DrawBitmap 1009,10,85

いかがでしょうか?
解像度の違いによって位置がずれているものの、どちらもハイレゾで画像が表示されています。
確かにNS Basicでもハイレゾ画像が表示できるようになりましたが、ここで、幾つか疑問も浮かびます。

まず、第一に互換性が気になるところです。
早速、同じプログラムをPalmOS 4のPalm m500で動作させてみましたが、画面のモードに関係なくローレゾの大きな画像が表示されました。


※HiResもLoResも結果は同じ

したがって、今までのデバイスでも特にコードの変更もなく表示できることが予想されます。
しかし、当たり前ですが、表示される大きさが異なります。
これは、ローレゾだから、当たり前に画像が大きくなったんでしょうか?
ただ、Tungsten|Tでは、画面がローレゾモードでも、高解像度の画像が表示されていることに注目してください。
これらから、表示される画像の大きさは、画面のモードとは関係なく、実行するデバイスの解像度に合わせて自動的に表示されていることがわかります。
つまり、画面モードを指定することで変化するのは座標の位置だけということになりますが、このことを考えると「Coordinate System(座標系)」としている理由がわからなくもありません。

一方で、ハイレゾデバイスであっても、高解像度の画像は不要で、ローレゾだけで構わない場合もあるでしょう。
そういう場合は、ローレゾの画像パスだけを指定すれば良いようです。





【1011ボタン】
  DrawBitmap 1011,10,85

座標系の指定により、位置が変わることを除けば、表示される画像はローレゾです。

その逆、ローレゾデバイスで、ハイレゾ画像を表示してみますと、こちらは、何も変化がありません。



【1013ボタン】
  DrawBitmap 1013,10,85

これらを総称すると、ローレゾ用のアプリを作ろうと思えばローレゾ画像だけを、ハイレゾ専用にするならハイレゾ画像だけを、両方に対応させるなら両方を用意する必要があるという当たり前のような結論に達します。
わかってみれば、単純ですね。

ところで、SysInfo(7)で得られる解像度、PalmOS 5では72か144が返されますが、それ以前のデバイスではどうなるのでしょうか?
結論から言えば、ゼロ、が返ります。
PalmOS 5以前では、解像度の概念が存在しませんので値がない、というのが正しいでしょうか。
これを利用すれば、画面のモードによって処理を変えたいときは、次のような条件式で判断できることがわかります。

  If SysInfo(7)<=72 Then
    'LoRes

  Else
    'HiRes

  End If

これだと、PalmOS 5以前のデバイスがゼロを返しても問題なく処理が出来ます。
ちなみに(残念ながら)PalmOS 5未満のCLIEも、SysInfo(7)はゼロを返します。これは、SONY独自の方法でハイレゾ化しているためと説明されていますが、もし、そこが対応できたら、日本におけるPalm事情を加味すると、もっとNS Basicのユーザーが増えるかもしれませんね。


●その他、制約事項など

PalmOS 5のデバイスでは、SysInfoSetのCoordinate Systemに指定した解像度に意味を持ちますが、それ以前のデバイスでは、エラーにもならず無視されますので、OSのバージョンによって処理を分ける必要はあまり感じません。
しかし、あえてOSのバージョンが取得したい場合、新たにSysInfo(6)で、OSのバージョンを取得することが出来るようになりました。

 

【OSボタン】
  MsgBox "OS:" + Str(SysInfo(6))

カラーの方がTungsten|T、モノクロのほうがm500です(念のため)

本バージョンをリリースするにあたって、慎重にテストが重ねられましたが、それでも、まだ若干の、不具合が残っているようです。
私が気がついている点は、ハイレゾモード時にメッセージボックス(MsgBox)を表示させると、その表示位置がずれてしまうという現象です。
これを回避するために、MsgBoxなどを使う場合、次のようなコードを書いて画面モードを調整した方が無難です。

【回避策の例】
  Dim R as Integer

  R = SysInfo(7)
  SysInfoSet("CoordinateSystem",72)

  MsgBox "OS:" + Str(SysInfo(6))

  SysInfoSet("CoordinateSystem",R)

簡単ですが、Ver.3.1.0のハイレゾ機能を紹介しました。
バージョンアップに関する説明では、ハイレゾ化されるのは、表示座標系とDrawLineによる線、及び、ビットマップで、その他は変わらないと書かれています。
したがって、各オブジェクト類や、表示されるテキストはローレゾのままです。
(正確にはローレゾフォントではなく、スモールフォントですね。)
このように、ユーザーが「ハイレゾ」という言葉からイメージする機能を完全に満たしているとは言い切れない部分もありますが、従来バージョンとの互換を考えると、むしろ妥当な範囲での機能拡充とも言えるのではないでしょうか。

今回は講座というより紹介になってしまいましたが、これらのスクリーンショットを眺めている限り、ハイレゾというものの情報量の多さを実感できます。
ありがたいことに、ランタイムが対応できればOSのバージョンを超えて使えるBASIC、ハイレゾに対応したことによって、より魅力的になった気がします。



copyright(C)2002 Hacker Dude-san all rights reserved.