旧 #temanote

Linux大好き。だけど進捗ありません。

紬ちゃんマスコット SDL2.0編

ちょくちょく調べながら進んでおりましたがようやく進捗が出たのでまとめます。



そもそも

グラフィクス周りのAPIとウィンドウ周りのAPIの違いを知らなかった。

グラフィックAPI(OpenGL,DirectX

  • 描画を担当(自明
  • アプリケーションとしてのウィンドウの生成などには無関係


ウィンドウ周り(GUIツールキットとかその辺りのライブラリとか

  • ウィンドウの生成、イベントの管理etcを担当
  • グラフィックAPIを利用して画像の表示等を行う


つまりOpenGLだけでアプリケーションを作るというのは間違いで、OpenGLを利用したGUIツールキットを利用してアプリケーションを作るというのが正しいらしい。
他にもいろいろ調べたおかげでX11周りとか描画処理とかについて知見が貯まったので楽しかった。

これを踏まえたうえで何を使うかを決めなければならない


本編

まだ「OpenGLでゴリゴリ作るぞ」とか言ってた時代にOpenGLチュートリアル(英語)を必死で読んでました。
割と序盤に"OpenGL context creation"なる項目がありまして、以下。
Related toolkits and APIs - OpenGL.org

Context/Window Toolkitsにすごい見知った名前がいろいろ有るじゃないですか。
Freeglut,GLUT,SDL,Qt,wxWidgets

ここでやっと「OpenGLだけでやるもんじゃないんだな」ってわかりました(遅い


というわけで、この中で一番確実に非矩形ウィンドウ作れそうなのがSDL
MigrationGuide - SDL Wiki'

"Shaped Window"としっかり記載されている。

そしてここ
qiita.com

D言語ではあるけど、リファレンスに乗ってない関数2つの名前は載せてくれている。
しかも関数自体はCなのでソースもそのまま参考にできる。強い。

リファレンスがないので実装を見に行った
SDL: include/SDL_shape.h@e12c38730512
実装というよりヘッダファイルがそのままリファレンス。

あとSDLの基礎が分かってないとどうしようも無いのでこちらも頑張る。
SDL1.2ではなく2.0なので注意。

TwinklebearDev SDL 2.0 Tutorial Index
SDL2.0のチュートリアル。CではなくC++

SDLの入れ方に依るが

#include <SDL/SDL.h>
#include <SDL2/SDL.h>

のどっちかは/usr/include/以下あたりを実際に見て確認するべし。
チュートリアルでは上だったが、ArchにpacmanでSDL2.0を導入した場合には下だった。

SDL2.0でPNG画像と文字列を表示 - Narrow Escape
SDL_imageを利用してpng画像を表示させるサンプルコードが載ってるのでありがたく写経。


そして出来上がったのがこちら

夢のLinux上で動くデスクトップマスコットができました。


改善点

Archで作ってたのにUbuntuでスクショ撮ったのは訳がありまして。

Xmonadだと何故か背景が完全透過せずに半透過する。
Xmonad側が原因かと思ってたけど透明ウィンドウは(間違って)ちょくちょく出してたので違うっぽい。
もうちょっとSDL調べてみる。

あと、SDLで作ってあるのでSDLランタイムがないと動かないっていうのもちょっと。
でもクロスプラットフォームってランタイムあるからこそだよなぁ…
まぁ仕方ないか。

さらっとまとめたけどここまで来るのにすごい時間かかった。
Twitterに張り付いてばっかりいるからね、仕方ないね。

頑張ろう。