freeglut3のソース

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$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA