mieki256's diary



2023/12/30() [n年前の日記]

#1 [prog] MinGWのSourceForge版を再インストールした

先日、Windows10 x64 22H2上で、OSDN配布版の MinGW をインストールしたのだけど。その後やっぱり OSDN が不安定過ぎて必要なパッケージがDLできない状態に遭遇してしまった。さすがにコレは厳しい。

そんなわけで、SourceForge で配布されてる MinGW をインストールし直すことにした。

SourceForge配布版の MinGW はサクサクとDLできて、スンナリとインストールできた。ただ、OSDN版に比べると、各パッケージのバージョンが古い。例えば、Cコンパイラの gcc も以下のような違いがある。
もっとも、フツーに使うなら今時は MSYS2 を選択するだろうし…。自分の場合、スクリーンセーバ用ライブラリを使いたいから MinGW を選んでる感じなので…。MSYS2 でもスクリーンセーバ用ライブラリ (libscrnsave.a, libscrnsavw.a) が使えるなら助かるのだけど…。

#2 [prog] MinGW上でzlibやlibpngをビルドしてみた

Windows10 x64 22H2 + MnGW (gcc 6.3.0) 上で、zlib と libpng をビルドしてみた。

OpenGL には画像ファイルを読み込む機能が無い。だから、png画像ファイルをテクスチャとして利用したい際は、何かしらの画像読み込みライブラリを持ってきてどうにかすることになる。そこで libpng を使って読み込む事例が多いように見えたので、そのあたりを使えるようにしておこうかなと…。

以下のページを参考にして作業させてもらった。ありがたや。

_zlib-1.2.7をMinGWでビルドする - 新・日々録 by TRASH BOX@Eel
_libpng-1.2.49、libpng-1.5.10をMinGWでビルドする - 新・日々録 by TRASH BOX@Eel

zlib のソースと libpng のソースを、以下から入手。

_zlib Home Site
_Index of /fossils
_libpng Home Page
_LIBPNG: PNG reference library - Browse Files at SourceForge.net

今回は、以下の2つのファイルを入手した。それぞれ解凍。
zlib13.zip
libpng-1.6.40.tar.xz

zlibをビルド :

libpng は zlib を使って処理をするので、まず最初に zlib をビルドする必要がある。

解凍したフォルダ内をカレントディレクトリにして、make を実行。MinGW用の Makefile は無いけれど、gcc 用のソレが利用できるらしい。
make -f win32/Makefile.gcc

以下のファイルができるので、MinGW をインストールしたフォルダにコピーする。
zlib1.dll
zconf.h
zlib.h
libz.a
libz.dll.a

それぞれを以下のディレクトリにコピーすればいい。たぶん。
  • .dll は bin/ に。
  • .h は include/ に。
  • .a は lib/ に。

libz.dll.a があるとそちらを優先して使われて動的リンクになるという話を見かけたので、libz.dll.a を libz.dll.a.esc にリネームしておいた。

libpngをビルド :

これも解凍したフォルダの中で make を走らせる。
make -f scripts/makefile.gcc

以下のファイルができるので、MinGW のフォルダにコピー。.h は include/ に。.a は lib/ に。
png.h
pngconf.h
pngdebug.h
pnginfo.h
pnglibconf.h
pngpriv.h
pngstruct.h
libpng.a

ちなみに、gcc で libpng を使ったプログラムをビルドしたい時は、オプションとして -lpng -lz をつけてリンカに指示してやるらしい。-lxxxx と指定すると、自動で頭に lib をつけて、libxxxx をリンクしてくれるそうで。つまり、-lpng -lz は、libpng、libz をリンクせよという指示になる。

zlib自体はパッケージがある :

MinGW の場合、libpng は無いけれど、zlib 自体はパッケージが存在しているっぽい。libz、もしくは zlib という名前で、dev がついているのがソレ。
libz-1.2.11-1-mingw32-dev.tar.xz
zlib-1.2.8-1-mingw32-dev.tar.lzma

ただ、バージョンが古い。一応セキュリティホール云々の話もありそうなので、MinGWインストールフォルダ内の、公式パッケージ版の各ファイルをリネームして、今回ビルドしたファイルをコピーして使うことにした。

libpngを使ったプログラムをビルドできるかテスト :

以下で紹介されているプログラムをコピペさせてもらって、MinGW (gcc 6.3.0)上で libpng を使ったプログラムをビルドできるのか試してみた。

_【C言語】libpngのインストールと使用方法・使用例 | だえうホームページ

_main.c
_input.png

Makefile は以下のような感じ。

_Makefile
png.exe: main.c
    gcc main.c -o png.exe -static -lpng -lz

.PHONY: clean
clean:
    rm -f png.exe
  • main.c から png.exe を作ってる。
  • -lpng -lz を指定して、libpng と libz をリンクせよと指定している。
  • -static をつけて、静的リンク(static link)をしている。
ちなみに Makefile は、行頭のスペースがTAB文字じゃないと動作しないので注意。

make と打ってビルド。png.exe が生成された。

png.exe input.png と打ち込んだら、グレー画像になった _output.png が得られた。今回ビルドした libpng は、それらしく動作してるっぽい。

余談。MSYS2でlibpngをインストール :

MSYS2なら、zlib も libpng もパッケージとして用意されているので、pacman でインストールできる。
pacman -S mingw-w64-x86_64-zlib
pacman -S mingw-w64-i686-zlib

pacman -S mingw-w64-x86_64-libpng
pacman -S mingw-w64-i686-libpng

2023/12/30時点では以下がインストールされた。
mingw64/mingw-w64-x86_64-zlib 1.3-1
mingw32/mingw-w64-i686-zlib 1.3-1 

mingw64/mingw-w64-x86_64-libpng 1.6.40-1
mingw32/mingw-w64-i686-libpng 1.6.40-1

#3 [prog] libpngを使ってOpenGLのテクスチャを用意できるか試した

Windows10 x64 22H2 + MinGW (gcc 6.3.0) 上で、OpenGL を使ってテクスチャを表示したい。OpenGL には画像を読み込む機能が無いので、libpng を使ってpng画像を読み込んで、OpenGL のテクスチャにできるのか試してみた。

以下のページがとても参考になった。ありがたや。

_PNGファイルをOpenGLで扱う話

紹介されてるサンプルプログラムをほとんどそのままコピペさせてもらって、MinGW (gcc 6.3.0) 上でもビルドして動かせるか試してみた。

必要なライブラリ :

今回試すプログラムのビルドには、freeglut、zlib、libpng が必要。

MinGW に freeglut を導入する手順は、以前メモしてあった。

_mieki256's diary - MinGWでfreeglutを使ってみた


zlib と libpng の導入手順は以下。

_mieki256's diary - MinGW上でzlibやlibpngをビルドしてみた

ソース :

ソースと利用画像は以下。前述の参考ページで紹介されてるサンプルとほとんど同じだけど…。

_01_loadpng_draw.c
_texture.png

Makefile の内容は以下。

_Makefile
01_loadpng_draw.exe: 01_loadpng_draw.c Makefile
    gcc 01_loadpng_draw.c -o 01_loadpng_draw.exe -D FREEGLUT_STATIC -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lpng -lz

.PHONY: clean
clean:
    rm -f *.exe
    rm -f *.o
  • 01_loadpng_draw.c から 01_loadpng_draw.exe を作る。
  • -D FREEGLUT_STATIC -lfreeglut_static と指定して、freeglut を静的リンクする。
  • -lopengl32 -lwinmm -lgdi32 を指定して、opengl32、winmm、gdi32 をリンク。
  • -lpng -lz を指定して、libpng を利用。

実行結果は以下。

ss_01_loadpng_draw.png

ポリゴン(GL_QUADS)にテクスチャ画像を貼り付けることができている。

たしかに、libpng を使って、png画像を読み込んで OpenGL用のテクスチャに変換することができると分かった。

課題 :

ストレージ上に存在するpng画像ファイルを読み込んで、OpenGL でテクスチャ画像として利用することはできる、と分かったけれど。exeファイルにpng画像をバイナリとして含めておいて、それを OpenGL のテクスチャとして利用する、その方法が分からない…。

リソースファイルなるものにpng画像を含めるように記述しておいて、exeファイル中のリソース(png画像)のポインタ(メモリアドレス?)とバイナリサイズを得ることはできそうなのだけど…。libpng は、メモリ上に置いてあるpng画像のバイナリを読み込むことができるのだろうか…?

以上、1 日分です。

過去ログ表示

Prev - 2023/12 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project