ShellScript(Bash)でのx$VER=xyesを使ったテクニック

configure.acは、m4マクロとシェルスクリプトが書けます。libsixelのconfigure.acを元にautotoolsの勉強をしていたら、以下のように、x$varname = xyesというシェルスクリプトを見つけました。

はじめは、唐突にxが出てくるのかが分からなくて、autoscanやm4マクロの決まった仕組みと思っていましたが、シェルスクリプトのテクニックでした。

上記で、have_gl=yesの場合は以下に置換されます。

例えば、have_gl=のように空の場合は、以下に置換されます。この場合、文字xが残っているので、シェルスクリプトの文法として問題ありません。

 

上記のように、もし、testの引数が”$have_gl”で、$have_gl=のように、値がからの場合は、変数の置換のみが起こり、testの引数が以下のように足りなくなってしまいます。つまり、変数の値が空の時に、シェルが動かなくなります。そのためtestを使うときに、xとxyesを使ったテクニックがあるようです。

 

http://stackoverflow.com/questions/174119/why-do-shell-script-comparisons-often-use-xvar-xyes

https://github.com/saitoha/libsixel/blob/master/examples/opengl/configure.ac

libsixelのOpenGLのデモを調べるためOpenGLとXlibでアニメーション

https://www.khronos.org/opengl/wiki/Programming_OpenGL_in_Linux:_Programming_Animations_with_GLX_and_Xlib を参考に、FPSの計算などを無視してとりあえず、count += 0.01のようにしてOpenGLのアニメーションをしてみました。

このプログラムを書いてみて、Xlibはselect関数を使ったりするのかと思っていたのですが、単純なOpenGLプログラムの場合は、ループ文とusleepでよいようです。

libsixelのOpenGLのselect

https://github.com/saitoha/libsixel/blob/master/examples/opengl/main.c

改めてソースコードを確認すると、selectは、端末エミュレータのカーソル位置に関係して使っているようです。もしかするとこのサンプルはXlibの依存をなくすことができるのかもしれません。

 

libsixelのソースコードを読むために、glxとXlibのサンプルプログラムを書いてみる。

最近のシェーダーを使ったOpenGL3ではなく、それ以前のOpenGLを使う場合は、glutなどでウィンドウ作成などを行いますが、libsixelのOpenGLのサンプルがXlibを使ったものなので、同じように実装してみます。

いくつか検索した中で、openglのサイトが小さいチュートリアルでよくまとまっていました。(https://www.khronos.org/opengl/wiki/Category:Linux)

 

 

まずは、コンテキストにOpenGLを使い四角形を描画しました。このコードではXlibのXNextEventで、イベント駆動のアプリケーションになっているため、ゲームのようにループをする必要があります。ですが、OpenGL公式サイトにちょうど、https://www.khronos.org/opengl/wiki/Programming_OpenGL_in_Linux:_Programming_Animations_with_GLX_and_Xlib があるので、次回はこれをやってみます。

Xlib単体の日本語チュートリアル

Xlibプログラミング入門 http://www43.atpages.jp/opicon69/xlib/

まとめ

数日前はデモを動かすだけでしたが、少しづつ自分でもOpenGLを使ってlibsixelで端末エミュレータに実装できそうな気がしてきました。やっぱりやってみたいことだと捗ります。

 

libsixelのopenglデモのソースコードを見てみる。

lixsixelのOpenGLのデモ を見てみるとmain.cにOpenGLで描画しているだけなので、頑張れば自分でもこれを元に修正できそうな感じだったのでいろいろ調べてみました。

まずMesa 3Dは、LinuxのOpenGLの実装で、libosmesaでGPUがない環境でもCPUでOpenGLを描画する機能があることが分かりました。

libosmesa6-devがインストールされている場合は、GL/osmesa.hをインクルードします。Linuxの場合はUSE_GLXでX11,OpenGLのヘッダーを読み込みます。OSXの場合は、USE_CGLになります。

このサンプルを整理すると以下が複合されています。

  1. LinuxのOpenGLのサンプルプログラム
  2. LinuxでGPUがない場合のosmesa.hをつかうサンプル
  3. libsixelのプログラム
  4. selectのポーリング
  5. termios.hによるCANONICALモードなど端末制御

読み解くのが難しい場合は、各問題を分けて小さなプログラムを書いたりして学習後にもう一度読むと無理なく読めます。LinuxのOpenGLについては、このサンプルプログラムの元になったMesaのサンプルプログラムhttps://cgit.freedesktop.org/mesa/demos/tree/src/xdemos/glxpbdemo.cを見てみることにしました。

https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXCreatePbuffer.xml

このソースコードを見ると、OpenGLの設定や、作成する3Dオブジェクトや、ファイル書き込みでの作業がいろいろありますが、基本的には、glXCreatePBufferで描画領域(メモリー)を確保してOpenCLのコンテキストと結び付けて、3Dオブジェクトを書き込み、それをglReadPixelsとしてピクセルを読んでファイルに出力している基本的なプログラムでした。

このソースコードはLinuxでのOpenGLのpixel bufferと出力方法なのでこの部分を独立して理解することができました。その後、libsixelに付属しているデモのソースコードを読んだら、OSXとLinuxのOpenGLの部分を比較的簡単になったので、多くの部分を読み解くことができました。

output_sixelが、pbufferと標準出力と、sixelフォーマットを結びつけているところで、この部分の詳細は、実際にlibsixelのサンプルを書いてみようと思います。

 

 

LibsixelのOpenGLデモをWindows10 RLogin+Ubuntu16で動かす

昨日は、コンソールで動画再生や画像表示ができるlibsixelを使ってみる で仮想環境上のUbuntu16.04をRLogin端末エミュレーターで画像を表示してみました。SDLに挑戦しましたが結局表示することができませんでした。

今日は試しに、libsixel内にあるOpenGLのデモが動作するか確認しました。無事にOpenGLとお絵かきアプリが動作したので、OpenGLができれば、processing.jsのようなことができそうです。以下gif動画は、gifで粗くなっているのではなくこのような感じで表示されています。そもそもSIXELは1988年ごろのマニュアルがあるように、かなり昔の規格だそうです。

ビルドは、README.mdに書かれているように、libosmesa6-devパッケージをインストールすることで問題なくビルドができました。

コンソールで動画再生や画像表示ができるlibsixelを使ってみる

Windows10上のBash on Windowsでもできそうですが、ひとまず仮想環境上のUbuntu16と端末エミュレーターのRLoginを使って、libsixelでコンソールに画像を表示してみます。

libsixelはパッケージで簡単にインストール

Ubuntu16には、libxsixelのパッケージがあるので、libsixel-binパッケージをインストールすれば、libsixel-config,sixel2png,img2sixelコマンドが使えるようになります。開発をする場合は、libsixel-devをインストールすればよいようです。

 

img2sixelで画像ファイルをSIXELフォーマットに変換

ニコニコ動画で人気のけものフレンズのサーバルを表示してみました。(元画像:http://i.imgur.com/nxGNhs8.jpg)

ゲームもSDLで作れるようです。

https://github.com/saitoha/SDL1.2-SIXEL

 

Ubuntu16上で表示するには

xtermの初期設定でsixelに対応しているようなので起動時に上記オプションを設定すればよいです。xtermの初期設定に登録する場合は、ホームディレクトリーの.Xresourcesに上記コマンドで入力したオプションを指定すればよいです。これで次回からxtermを起動したときに、SIXELフォーマットの画像が表示できます。

 

Ubuntu16で、SDL1.2-SIXELのビルドを通す方法

SDLの最新メジャーバージョンは2で、SDLバージョン1.xはパッチ最新のLinuxなどの場合X11の関数プロトタイプと一致していないためパッチをあてる必要があるようです。

https://github.com/saitoha/SDL1.2-SIXEL

Makeコマンドを実行すると、archlinux(https://bugs.archlinux.org/task/36179)がバグフィックスした症状と同じなので、このサイトからパッチファイルsdl_x11sym.patchを入手して、SDL1.2-SIXELのディレクトリーに配置して、コマンドを適用します。オプションは-p0なので注意しましょう。

これで、makeコマンドをもう一度実行すると問題なくビルドできます。

今後は、SDL1とSXIELの連携を調べていこう。

 

http://qiita.com/arakiken/items/3e4bc9a6e43af0198e46