APIの使い方をWEBでいちいち探すのは面倒なので、ソースを直接読もうと思います。リファレンスを見れば早い気もしますが、リファレンスって使い方が分かった上で読むもののような気もしますので。
私の環境はapt-get install freeglut3にてインストールしたので、ソースもapt-getで取得しようかと思います。
takk@deb9:~$ sudo apt-get source freeglut3 パッケージリストを読み込んでいます... 完了 'freeglut3' の代わりに 'freeglut' をソースパッケージとして選出しています 注意: 'freeglut' パッケージは以下の場所の 'Git' バージョン制御システムで保守されています: git clone https://anonscm.debian.org/git/collab-maint/freeglut.git ~省略~ takk@deb9:~$ ls freeglut-2.8.1 freeglut_2.8.1-3.dsc freeglut_2.8.1-3.debian.tar.xz freeglut_2.8.1.orig.tar.gz takk@deb9:~$
何故だか2.8.1を取得してしまいました。
apt-get sourceではfreeglut3のソースがとれなさそうなので、以下のサイトから取得します。
http://freeglut.sourceforge.net/
3.0.0をダウンロード後、解凍、ディレクトリを見てみます。
takk@deb9:~$ tar xzf freeglut-3.0.0.tar.gz takk@deb9:~$ cd freeglut-3.0.0 takk@deb9:~/freeglut-3.0.0$ ls AUTHORS README.cygwin_mingw freeglut.pc.in CMakeLists.txt README.mingw_cross freeglut.rc.in COPYING README.win32 include ChangeLog android mingw_cross_toolchain.cmake README android_toolchain.cmake progs README.android blackberry.toolchain.cmake src README.blackberry config.h.in README.cmake doc takk@deb9:~/freeglut-3.0.0$
まだどこに何があるかつかんでないので、とりあえず、glutInitを探してみます。まあたいていsrcの下だと思います。cdしておきましょう。
takk@deb9:~/freeglut-3.0.0$ cd src takk@deb9:~/freeglut-3.0.0/src$ grep -r 'glutInit(' * fg_init.c:void FGAPIENTRY glutInit( int* pargc, char** argv ) fg_init.c: fgError( "illegal glutInit() reinitialization attempt" ); fg_internal.h: * structures. This actually happens when calling glutInit() and when fg_main.c: * of a freeglut session, so that another glutInit() call can happen fg_structure.c: * created between glutInit() and glutMainLoop() return. fg_structure.c: * This function should be called on glutInit(). It will prepare the internal fg_structure.c: * case further use of freeglut should be preceded with a glutInit() call. fg_structure.c: * glutInit()-enforced structure initialization... mswin/fg_window_mswin.c: /* Grab the window class we have registered on glutInit(): */ mswin/fg_init_mswin.c: glutInit(pargc, argv); takk@deb9:~/freeglut-3.0.0/src$
srcディレクトリ直下にすぐ見つかりました。
fg_init.cにあるようです。行末が)で終わってるところが関数の定義っぽいです。
ライセンスも確認するため、ソースのヘッダ部分を見てみます。
takk@deb9:~/freeglut-3.0.0/src$ head -26 fg_init.c /* * fg_init.c * * Various freeglut initialization functions. * * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. * Written by Pawel W. Olszta, <olszta@sourceforge.net> * Creation date: Thu Dec 2 1999 * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ takk@deb9:~/freeglut-3.0.0/src$
ではglutInit関数を抽出してみます。関数の定義終了はC言語ならたいてい行頭が}になってるはずなので、行頭の}を見つけるまでprintするだけです。
takk@deb9:~/freeglut-3.0.0/src$ perl -ne '$s=1 if/Init\(.*\)$/;print if$s==1;$s=0 if/^}/' < fg_init.c | cat -n 1 void FGAPIENTRY glutInit( int* pargc, char** argv ) 2 { 3 char* displayName = NULL; 4 char* geometry = NULL; 5 if( fgState.Initialised ) 6 fgError( "illegal glutInit() reinitialization attempt" ); 7 8 if (pargc && *pargc && argv && *argv && **argv) 9 { 10 fgState.ProgramName = strdup (*argv); 11 12 if( !fgState.ProgramName ) 13 fgError ("Could not allocate space for the program's name."); 14 } 15 16 fgCreateStructure( ); 17 18 fghParseCommandLineArguments ( pargc, argv, &displayName, &geometry ); 19 20 /* 21 * Have the display created now. If there wasn't a "-display" 22 * in the program arguments, we will use the DISPLAY environment 23 * variable for opening the X display (see code above): 24 */ 25 fgPlatformInitialize( displayName ); 26 27 /* 28 * Geometry parsing deferred until here because we may need the screen 29 * size. 30 */ 31 32 if (geometry ) 33 { 34 unsigned int parsedWidth, parsedHeight; 35 int mask = XParseGeometry( geometry, 36 &fgState.Position.X, &fgState.Position.Y, 37 &parsedWidth, &parsedHeight ); 38 /* TODO: Check for overflow? */ 39 fgState.Size.X = parsedWidth; 40 fgState.Size.Y = parsedHeight; 41 42 if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) ) 43 fgState.Size.Use = GL_TRUE; 44 45 if( mask & XNegative ) 46 fgState.Position.X += fgDisplay.ScreenWidth - fgState.Size.X; 47 48 if( mask & YNegative ) 49 fgState.Position.Y += fgDisplay.ScreenHeight - fgState.Size.Y; 50 51 if( (mask & (XValue|YValue)) == (XValue|YValue) ) 52 fgState.Position.Use = GL_TRUE; 53 } 54 } takk@deb9:~/freeglut-3.0.0/src$
コメント