Changeset 14 for branches

Show
Ignore:
Timestamp:
02/29/08 12:30:38 (4 years ago)
Author:
mirko
Message:

Changed persp matrix for zooming.

Location:
branches/pdfcube-0.0.3
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • branches/pdfcube-0.0.3/Makefile

    r10 r14  
    7070distuninstallcheck_listfiles = find . -type f -print 
    7171distcleancheck_listfiles = find . -type f -print 
    72 ACLOCAL = ${SHELL} /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/missing --run aclocal-1.9 
     72ACLOCAL = ${SHELL} /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/missing --run aclocal-1.9 
    7373AMDEP_FALSE = # 
    7474AMDEP_TRUE =  
    75 AMTAR = ${SHELL} /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/missing --run tar 
     75AMTAR = ${SHELL} /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/missing --run tar 
    7676AR = ar 
    77 AUTOCONF = ${SHELL} /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/missing --run autoconf 
    78 AUTOHEADER = ${SHELL} /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/missing --run autoheader 
    79 AUTOMAKE = ${SHELL} /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/missing --run automake-1.9 
     77AUTOCONF = ${SHELL} /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/missing --run autoconf 
     78AUTOHEADER = ${SHELL} /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/missing --run autoheader 
     79AUTOMAKE = ${SHELL} /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/missing --run automake-1.9 
    8080AWK = gawk 
    8181CC = gcc 
     
    9797EGREP = /bin/grep -E 
    9898EXEEXT =  
    99 F77 =  
    100 FFLAGS =  
     99F77 = g77 
     100FFLAGS = -g -O2 
    101101GREP = /bin/grep 
    102102INSTALL_DATA = ${INSTALL} -m 644 
     
    110110LN_S = ln -s 
    111111LTLIBOBJS =  
    112 MAKEINFO = ${SHELL} /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/missing --run makeinfo 
     112MAKEINFO = ${SHELL} /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/missing --run makeinfo 
    113113OBJEXT = o 
    114114PACKAGE = pdfcube 
     
    127127ac_ct_CC = gcc 
    128128ac_ct_CXX = g++ 
    129 ac_ct_F77 =  
     129ac_ct_F77 = g77 
    130130am__fastdepCC_FALSE = # 
    131131am__fastdepCC_TRUE =  
     
    151151glib_LIBS = -lglib-2.0   
    152152gtk_CFLAGS = -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12   
    153 gtk_LIBS = -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   
    154 gtkglext_CFLAGS = -I/usr/local/include/gtkglext-1.0 -I/usr/local/lib/gtkglext-1.0/include -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/cairo -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/atk-1.0   
    155 gtkglext_LIBS = -Wl,--export-dynamic -L/usr/local/lib -lgtkglext-x11-1.0 -lgdkglext-x11-1.0 -lGLU -lGL -lXmu -lXt -lSM -lICE -lgtk-x11-2.0 -lpangox-1.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   
     153gtk_LIBS = -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   
     154gtkglext_CFLAGS = -I/usr/include/gtkglext-1.0 -I/usr/lib/gtkglext-1.0/include -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/cairo -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/atk-1.0   
     155gtkglext_LIBS = -Wl,--export-dynamic -lgtkglext-x11-1.0 -lgdkglext-x11-1.0 -lGLU -lGL -lXmu -lXt -lSM -lICE -lgtk-x11-2.0 -lpangox-1.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   
    156156host = i686-pc-linux-gnu 
    157157host_alias =  
     
    162162includedir = ${prefix}/include 
    163163infodir = ${datarootdir}/info 
    164 install_sh = /home/mirko/oss/pdfcube/branches/pdfcube-0.0.3/install-sh 
     164install_sh = /home/mirko/dev/pdfcube/branches/pdfcube-0.0.3/install-sh 
    165165libdir = ${exec_prefix}/lib 
    166166libexecdir = ${exec_prefix}/libexec 
     
    173173poppler_CFLAGS = -I/usr/include/poppler   
    174174poppler_LIBS = -lpoppler   
    175 poppler_glib_CFLAGS = -I/usr/include/poppler/glib -I/usr/include/poppler -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/libpng12   
    176 poppler_glib_LIBS = -lpoppler-glib -lgdk-x11-2.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   
     175poppler_glib_CFLAGS = -I/usr/include/poppler/glib -I/usr/include/poppler -I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   
     176poppler_glib_LIBS = -lpoppler-glib -lpoppler -lgdk_pixbuf-2.0 -lm -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   
    177177prefix = /usr/local 
    178178program_transform_name = s,x,x, 
  • branches/pdfcube-0.0.3/src/pdfcube.cc

    r13 r14  
    4545// Macros 
    4646 
    47 //#define DEBUG_MODE 
    48 //#define DEBUG_MODE_ASSERT 
    49 #ifdef DEBUG_MODE_ASSERT 
    5047#include <cassert> 
    51 #endif 
    5248 
    5349#define DEFAULT_WIDTH 640 
     
    6157 
    6258enum animation { ANIM_NONE, 
    63         CUBE_NEXT, CUBE_PREV, 
    64         ZOOM0, ZOOM1, ZOOM2, ZOOM3, ZOOM4, ZOOMC, 
    65         SWITCH_FW, SWITCH_BW 
     59                 CUBE_NEXT, CUBE_PREV, 
     60                 ZOOM0, ZOOM1, ZOOM2, ZOOM3, ZOOM4, ZOOMC, 
     61                 SWITCH_FW, SWITCH_BW 
    6662}; 
    6763 
     
    9288sleeping() 
    9389{ 
    94         return !animating && active_animation == ANIM_NONE; 
     90  return !animating && active_animation == ANIM_NONE; 
    9591} 
    9692 
     
    104100// 
    105101class pdfcube { 
    106       public: 
    107         pdfcube(PopplerDocument * d) 
    108         :doc(d), 
    109             current_page(0), 
    110             current_face(0), 
    111             total_pages(poppler_document_get_n_pages(d)), 
    112             frame(0), 
    113             lookposx(0.0), lookposy(0.0), lookposz(3.48), 
    114             atx(0.0), aty(0.0), atz(0.0), persp(44.0), angle(0.0), pixmap(0) { 
    115                 texmap[0] = 0; 
    116                 texmap[1] = 1; 
    117                 texmap[2] = 2; 
    118                 pixmap = 
    119                     gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, tex_width, 
    120                                    tex_height); 
    121                 steps = new GLfloat[N_FRAMES]; 
    122                 xsteps = new double[N_FRAMES]; 
    123                  zsteps = new double[N_FRAMES]; 
    124                  zoomsteps = new double[N_FRAMES]; 
    125                  perspsteps = new double[N_FRAMES]; 
    126                  perspstepsc = new double[N_FRAMES]; 
    127         } ~pdfcube() { 
    128                 delete[]steps; 
    129                 delete[]xsteps; 
    130                 delete[]zsteps; 
    131                 delete[]zoomsteps; 
    132                 delete[]perspsteps; 
    133                 delete[]perspstepsc; 
     102public: 
     103  pdfcube(PopplerDocument * d) 
     104    :doc(d), 
     105     current_page(0), 
     106     current_face(0), 
     107     total_pages(poppler_document_get_n_pages(d)), 
     108     frame(0), 
     109     lookposx(0.0), lookposy(0.0), lookposz(3.48), 
     110     atx(0.0), aty(0.0), atz(0.0), persp(44.0), angle(0.0), pixmap(0) { 
     111    texmap[0] = 0; 
     112    texmap[1] = 1; 
     113    texmap[2] = 2; 
     114    pixmap = 
     115      gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, tex_width, 
     116                     tex_height); 
     117    steps = new GLfloat[N_FRAMES]; 
     118    xsteps = new double[N_FRAMES]; 
     119    zsteps = new double[N_FRAMES]; 
     120    zoomsteps = new double[N_FRAMES]; 
     121    perspsteps = new double[N_FRAMES]; 
     122    perspstepsc = new double[N_FRAMES]; 
     123  } ~pdfcube() { 
     124    delete[]steps; 
     125    delete[]xsteps; 
     126    delete[]zsteps; 
     127    delete[]zoomsteps; 
     128    delete[]perspsteps; 
     129    delete[]perspstepsc; 
     130  } 
     131 
     132  int page() { 
     133    return current_page; 
     134  } 
     135 
     136  int pages() { 
     137    return total_pages; 
     138  } 
     139  // Cube Normals 
     140  static GLfloat n[6][3]; 
     141  // Cube Faces 
     142  static GLint faces[6][4]; 
     143  // Cube vertex (filled in pdfcube->initialize()) 
     144  GLfloat v[8][3]; 
     145  // Cube texture mapping 
     146  static GLfloat mapping[6][8]; 
     147  // Cube Rotation Animation steps (17 frames) 
     148  // Cube rotation at each frame 
     149 
     150  GLfloat *steps; 
     151  // x camera movement  
     152  double *xsteps; 
     153  // z camera movement 
     154  double *zsteps; 
     155  double *zoomsteps; 
     156  double *perspsteps; 
     157  double *perspstepsc; 
     158 
     159  void restart(GtkWidget * widget) { 
     160    current_page = 0; 
     161    update_textures(widget); 
     162  } 
     163 
     164  void go_to(GtkWidget * widget, int page) { 
     165    if (page >= 0 && page < total_pages) { 
     166      current_page = page; 
     167      update_textures(widget); 
     168    } 
     169  } 
     170 
     171  void section(GtkWidget * widget, int section) { 
     172#ifndef NDEBUG 
     173    cerr << "Section: " << section << " total pages: " << 
     174      total_pages << endl; 
     175#endif 
     176    int ii; 
     177    for (ii = 0; ii < total_pages; ++ii) { 
     178      if (page_transition[ii]) 
     179        section--; 
     180      if (section == 0) 
     181        break; 
     182    } 
     183#ifndef NDEBUG 
     184    cerr << "Page: " << ii << endl; 
     185#endif 
     186    if (ii < total_pages) { 
     187      current_page = ii; 
     188      update_textures(widget); 
     189    } 
     190  } 
     191 
     192  void 
     193  initialize(GtkWidget * widget) { 
     194    GLfloat position[] = { 1.0, 1.0, 0.0, 1.0 }; 
     195    GLfloat local_view[] = { 0.0 }; 
     196 
     197    glShadeModel(GL_SMOOTH); 
     198    glEnable(GL_TEXTURE_RECTANGLE_ARB); 
     199 
     200    GLfloat mat_ambient[] = { 0.0, 0.0, 0.0, 1.00 }; 
     201    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.00 }; 
     202    GLfloat mat_shininess[] = { 15.0 }; 
     203 
     204    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 
     205    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
     206    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
     207 
     208    glEnable(GL_LIGHTING); 
     209    glEnable(GL_LIGHT0); 
     210    glEnable(GL_BLEND); 
     211    glEnable(GL_CULL_FACE); 
     212    glEnable(GL_POLYGON_SMOOTH); 
     213    glPolygonMode(GL_FRONT, GL_FILL); 
     214    glEdgeFlag(GL_FALSE); 
     215 
     216    glClearColor(0.0, 0.0, 0.0, 0.5); 
     217    glCullFace(GL_FRONT); 
     218    glDisable(GL_DEPTH_TEST); 
     219 
     220    glEnable(GL_DEPTH_TEST); 
     221    glDepthFunc(GL_LEQUAL); 
     222    glLightfv(GL_LIGHT0, GL_POSITION, position); 
     223    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); 
     224 
     225    glFrontFace(GL_CCW); 
     226    glEnable(GL_LIGHTING); 
     227    glEnable(GL_LIGHT0); 
     228    glEnable(GL_AUTO_NORMAL); 
     229    glEnable(GL_NORMALIZE); 
     230    glEnable(GL_FOG); 
     231    { 
     232      GLfloat fogColor[4] = { 0.6, 0.6, 0.6, 0.5 }; 
     233 
     234      glFogi(GL_FOG_MODE, GL_EXP2); 
     235      glFogf(GL_FOG_START, 0.99); 
     236      glFogf(GL_FOG_END, 1.0); 
     237      glFogfv(GL_FOG_COLOR, fogColor); 
     238      glFogf(GL_FOG_DENSITY, 0.25); 
     239      glHint(GL_FOG_HINT, GL_DONT_CARE); 
     240      glClearColor(fogColor[0], fogColor[1],  
     241                   fogColor[2], fogColor[3]); 
     242    } 
     243 
     244    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
     245 
     246    glGenTextures(3, textures); 
     247 
     248    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
     249    glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, 
     250                    GL_CLAMP_TO_EDGE); 
     251    glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, 
     252                    GL_CLAMP_TO_EDGE); 
     253 
     254    glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, 
     255                    GL_LINEAR_MIPMAP_LINEAR); 
     256    glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, 
     257                    GL_LINEAR); 
     258 
     259    update_textures(widget); 
     260 
     261    GLint size; 
     262    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size); 
     263#ifndef NDEBUG 
     264    printf("%u\n", size); 
     265#endif 
     266    assert(size >= 512); 
     267    assert(glIsTexture(textures[0])); 
     268    // Cube vertex 
     269    v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1; 
     270    v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1; 
     271    v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1; 
     272    v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1; 
     273    v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1; 
     274    v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1; 
     275 
     276    glMatrixMode(GL_PROJECTION); 
     277    gluPerspective(persp, 1.0, 0.5, 10.0); 
     278 
     279    glMatrixMode(GL_MODELVIEW); 
     280  
     281    // up is in positive Y direction  
     282    gluLookAt(lookposx, lookposy, lookposz, atx, aty, atz, 0.0, 1.0, 0.0);       
     283 
     284    matrix_setup(); 
     285  } 
     286 
     287  void 
     288  redraw(GtkWidget * widget) { 
     289 
     290    double yoffset = 0.1; 
     291    if (animating) { 
     292      switch (active_animation) { 
     293      case ANIM_NONE: 
     294 
     295#ifndef NDEBUG 
     296        cerr << "No animation... stopping right now." << 
     297          endl; 
     298#endif 
     299        frame = 0; 
     300        stop_animation(widget); 
     301        break; 
     302      case CUBE_NEXT: 
     303#ifndef NDEBUG 
     304        cerr << "cube " << frame << endl; 
     305#endif 
     306        if (frame == N_FRAMES) { 
     307          frame = 0; 
     308          stop_animation(widget); 
     309          quick_reset(widget); 
     310        } else { 
     311          glClear(GL_COLOR_BUFFER_BIT | 
     312                  GL_DEPTH_BUFFER_BIT); 
     313          glMatrixMode(GL_MODELVIEW); 
     314          glLoadIdentity(); 
     315          lookposz -= zsteps[frame] * 4; 
     316          lookposy = 6 * xsteps[frame]; 
     317          gluLookAt(lookposx, lookposy, lookposz, 
     318                    atx, aty, atz, 0, 1, 0); 
     319          angle -= steps[frame]; 
     320          glRotatef(angle, 0.0, 1.0, 0.0); 
     321          drawCube(); 
     322          frame++; 
    134323        } 
    135  
    136         int page() { 
    137                 return current_page; 
     324        break; 
     325      case CUBE_PREV: 
     326#ifndef NDEBUG 
     327        cerr << "cube " << frame << endl; 
     328#endif 
     329        if (frame == N_FRAMES) { 
     330          frame = 0; 
     331          stop_animation(widget); 
     332          quick_reset(widget); 
     333        } else { 
     334          glClear(GL_COLOR_BUFFER_BIT | 
     335                  GL_DEPTH_BUFFER_BIT); 
     336          glMatrixMode(GL_MODELVIEW); 
     337          glLoadIdentity(); 
     338          lookposz -= zsteps[frame] * 4; 
     339          lookposy = 6 * xsteps[frame]; 
     340          gluLookAt(lookposx, lookposy, lookposz, 
     341                    atx, aty, atz, 0, 1, 0); 
     342          angle -= steps[frame]; 
     343          glRotatef(angle, 0.0, -1.0, 0.0); 
     344          drawCube(); 
     345          frame++; 
    138346        } 
    139  
    140         int pages() { 
    141                 return total_pages; 
     347        break; 
     348      case ZOOM0: 
     349 
     350#ifndef NDEBUG 
     351        cerr << "zoom0 " << frame << endl; 
     352#endif 
     353        if (frame == N_FRAMES) { 
     354          frame = 0; 
     355          stop_animation(widget); 
     356          quick_reset(widget); 
     357        } else { 
     358          glClear(GL_COLOR_BUFFER_BIT | 
     359                  GL_DEPTH_BUFFER_BIT); 
     360          switch (previous_animation) { 
     361          case ZOOM1: 
     362            persp = 
     363              perspsteps[(N_FRAMES - 1) - 
     364                         frame]; 
     365            atx = lookposx = 
     366              -(1.3 * 
     367                zoomsteps[(N_FRAMES - 1) - 
     368                          frame]); 
     369            aty = lookposy = 
     370              zoomsteps[(N_FRAMES - 1) - 
     371                        frame] - 
     372              yoffset / N_FRAMES * 
     373              ((N_FRAMES - 1) - frame); 
     374            break; 
     375          case ZOOM2: 
     376            persp = 
     377              perspsteps[(N_FRAMES - 1) - 
     378                         frame]; 
     379            atx = lookposx = 
     380              1.3 * 
     381              zoomsteps[(N_FRAMES - 1) - 
     382                        frame]; 
     383            aty = lookposy = 
     384              zoomsteps[(N_FRAMES - 1) - 
     385                        frame] - 
     386              yoffset / N_FRAMES * 
     387              ((N_FRAMES - 1) - frame); 
     388            break; 
     389          case ZOOM3: 
     390            persp = 
     391              perspsteps[(N_FRAMES - 1) - 
     392                         frame]; 
     393            atx = lookposx = 
     394              -1.3 * 
     395              zoomsteps[(N_FRAMES - 1) - 
     396                        frame]; 
     397            aty = lookposy = 
     398              -zoomsteps[(N_FRAMES - 1) - 
     399                         frame] - 
     400              yoffset / N_FRAMES * 
     401              ((N_FRAMES - 1) - frame); 
     402            break; 
     403          case ZOOM4: 
     404            persp = 
     405              perspsteps[(N_FRAMES - 1) - 
     406                         frame]; 
     407            atx = lookposx = 
     408              1.3 * 
     409              zoomsteps[(N_FRAMES - 1) - 
     410                        frame]; 
     411            aty = lookposy = 
     412              -zoomsteps[(N_FRAMES - 1) - 
     413                         frame] - 
     414              yoffset / N_FRAMES * 
     415              ((N_FRAMES - 1) - frame); 
     416            break; 
     417          case ZOOMC: 
     418            persp = 
     419              perspstepsc[(N_FRAMES - 1) - 
     420                          frame]; 
     421            aty = lookposy = 
     422              -zoomsteps[(N_FRAMES - 1) - 
     423                         frame] * 0.38; 
     424            break; 
     425          default: 
     426 
     427#ifndef NDEBUG 
     428            cerr << "Should not reach" << 
     429              endl; 
     430#endif 
     431            break; 
     432          } 
     433          glMatrixMode(GL_PROJECTION); 
     434          glLoadIdentity(); 
     435          gluPerspective(persp, 1.0, 0.5, 10.0); 
     436          glMatrixMode(GL_MODELVIEW); 
     437          glLoadIdentity(); 
     438          gluLookAt(lookposx, lookposy, lookposz, 
     439                    atx, aty, atz, 0, 1, 0); 
     440          glRotatef(angle, 0.0, 1.0, 0.0); 
     441          drawCube(); 
     442          frame++; 
    142443        } 
    143         // Cube Normals 
    144         static GLfloat n[6][3]; 
    145         // Cube Faces 
    146         static GLint faces[6][4]; 
    147         // Cube vertex (filled in pdfcube->initialize()) 
    148         GLfloat v[8][3]; 
    149         // Cube texture mapping 
    150         static GLfloat mapping[6][8]; 
    151         // Cube Rotation Animation steps (17 frames) 
    152         // Cube rotation at each frame 
    153  
    154         GLfloat *steps; 
    155         // x camera movement  
    156         double *xsteps; 
    157         // z camera movement 
    158         double *zsteps; 
    159         double *zoomsteps; 
    160         double *perspsteps; 
    161         double *perspstepsc; 
    162  
    163         void restart(GtkWidget * widget) { 
    164                 current_page = 0; 
    165                 update_textures(widget); 
     444        break; 
     445      case ZOOM1: 
     446#ifndef NDEBUG 
     447        cerr << "zoom1 " << frame << endl; 
     448#endif 
     449        if (frame == N_FRAMES) { 
     450          frame = 0; 
     451          stop_animation(widget); 
     452        } else { 
     453          glClear(GL_COLOR_BUFFER_BIT | 
     454                  GL_DEPTH_BUFFER_BIT); 
     455          glMatrixMode(GL_PROJECTION); 
     456          glLoadIdentity(); 
     457          persp = perspsteps[frame]; 
     458          gluPerspective(persp, 1.0, 0.5, 10.0); 
     459          glMatrixMode(GL_MODELVIEW); 
     460          glLoadIdentity(); 
     461          atx = lookposx = 
     462            -1.3 * zoomsteps[frame]; 
     463          aty = lookposy = 
     464            zoomsteps[frame] - 
     465            yoffset / N_FRAMES * (frame); 
     466          gluLookAt(lookposx, lookposy, lookposz, 
     467                    atx, aty, atz, 0, 1, 0); 
     468          glRotatef(angle, 0.0, 1.0, 0.0); 
     469          drawCube(); 
     470          frame++; 
    166471        } 
    167  
    168         void go_to(GtkWidget * widget, int page) { 
    169                 if (page >= 0 && page < total_pages) { 
    170                         current_page = page; 
    171                         update_textures(widget); 
    172                 } 
     472        break; 
     473      case ZOOM2: 
     474#ifndef NDEBUG 
     475        cerr << "zoom1 " << frame << endl; 
     476#endif 
     477        if (frame == N_FRAMES) { 
     478          frame = 0; 
     479          stop_animation(widget); 
     480        } else { 
     481          glClear(GL_COLOR_BUFFER_BIT | 
     482                  GL_DEPTH_BUFFER_BIT); 
     483          glMatrixMode(GL_PROJECTION); 
     484          glLoadIdentity(); 
     485          persp = perspsteps[frame]; 
     486          gluPerspective(persp, 1.0, 0.5, 10.0); 
     487          glMatrixMode(GL_MODELVIEW); 
     488          glLoadIdentity(); 
     489          atx = lookposx = 1.3 * zoomsteps[frame]; 
     490          aty = lookposy = 
     491            zoomsteps[frame] - 
     492            yoffset / N_FRAMES * (frame); 
     493          gluLookAt(lookposx, lookposy, lookposz, 
     494                    atx, aty, atz, 0, 1, 0); 
     495          glRotatef(angle, 0.0, 1.0, 0.0); 
     496          drawCube(); 
     497          frame++; 
    173498        } 
    174  
    175         void section(GtkWidget * widget, int section) { 
    176 #ifdef DEBUG_MODE 
    177                 cerr << "Section: " << section << " total pages: " << 
    178                     total_pages << endl; 
    179 #endif 
    180                 int ii; 
    181                 for (ii = 0; ii < total_pages; ++ii) { 
    182                         if (page_transition[ii]) 
    183                                 section--; 
    184                         if (section == 0) 
    185                                 break; 
    186                 } 
    187 #ifdef DEBUG_MODE 
    188                 cerr << "Page: " << ii << endl; 
    189 #endif 
    190                 if (ii < total_pages) { 
    191                         current_page = ii; 
    192                         update_textures(widget); 
    193                 } 
     499        break; 
     500      case ZOOM3: 
     501#ifndef NDEBUG 
     502        cerr << "zoom1 " << frame << endl; 
     503#endif 
     504        if (frame == N_FRAMES) { 
     505          frame = 0; 
     506          stop_animation(widget); 
     507        } else { 
     508          glClear(GL_COLOR_BUFFER_BIT | 
     509                  GL_DEPTH_BUFFER_BIT); 
     510          glMatrixMode(GL_PROJECTION); 
     511          glLoadIdentity(); 
     512          persp = perspsteps[frame]; 
     513          gluPerspective(persp, 1.0, 0.5, 10.0); 
     514          glMatrixMode(GL_MODELVIEW); 
     515          glLoadIdentity(); 
     516          atx = lookposx = 
     517            -1.3 * zoomsteps[frame]; 
     518          aty = lookposy = 
     519            -zoomsteps[frame] - 
     520            yoffset / N_FRAMES * (frame); 
     521          gluLookAt(lookposx, lookposy, lookposz, 
     522                    atx, aty, atz, 0, 1, 0); 
     523          glRotatef(angle, 0.0, 1.0, 0.0); 
     524          drawCube(); 
     525          frame++; 
    194526        } 
    195  
    196         void 
    197          initialize(GtkWidget * widget) { 
    198                 GLfloat position[] = { 1.0, 1.0, 0.0, 1.0 }; 
    199                 GLfloat local_view[] = { 0.0 }; 
    200  
    201                 glShadeModel(GL_SMOOTH); 
    202                 glEnable(GL_TEXTURE_RECTANGLE_ARB); 
    203  
    204                 GLfloat mat_ambient[] = { 0.0, 0.0, 0.0, 1.00 }; 
    205                 GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.00 }; 
    206                 GLfloat mat_shininess[] = { 15.0 }; 
    207  
    208                 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 
    209                 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    210                 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
    211  
    212                 glEnable(GL_LIGHTING); 
    213                 glEnable(GL_LIGHT0); 
    214                 glEnable(GL_BLEND); 
    215                 glEnable(GL_CULL_FACE); 
    216                 glEnable(GL_POLYGON_SMOOTH); 
    217                 glPolygonMode(GL_FRONT, GL_FILL); 
    218                 glEdgeFlag(GL_FALSE); 
    219  
    220                 glClearColor(0.0, 0.0, 0.0, 0.5); 
    221                 glCullFace(GL_FRONT); 
    222                 glDisable(GL_DEPTH_TEST); 
    223  
    224                 glEnable(GL_DEPTH_TEST); 
    225                 glDepthFunc(GL_LEQUAL); 
    226                 glLightfv(GL_LIGHT0, GL_POSITION, position); 
    227                 glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); 
    228  
    229                 glFrontFace(GL_CCW); 
    230                 glEnable(GL_LIGHTING); 
    231                 glEnable(GL_LIGHT0); 
    232                 glEnable(GL_AUTO_NORMAL); 
    233                 glEnable(GL_NORMALIZE); 
    234                 glEnable(GL_FOG); 
    235                 { 
    236                         GLfloat fogColor[4] = { 0.5, 0.5, 0.5, 0.5 }; 
    237  
    238                         glFogi(GL_FOG_MODE, GL_EXP); 
    239                         glFogi(GL_FOG_START, 0.0); 
    240                         glFogi(GL_FOG_END, 5.0); 
    241                         glFogfv(GL_FOG_COLOR, fogColor); 
    242                         glFogf(GL_FOG_DENSITY, 0.35); 
    243                         glHint(GL_FOG_HINT, GL_DONT_CARE); 
    244                         glClearColor(fogColor[0], fogColor[1], fogColor[2], 
    245                                      fogColor[3]); 
    246                 } 
    247  
    248                 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    249  
    250                 glGenTextures(3, textures); 
    251  
    252                 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
    253                 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, 
    254                                 GL_CLAMP_TO_EDGE); 
    255                 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, 
    256                                 GL_CLAMP_TO_EDGE); 
    257  
    258                 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, 
    259                                 GL_LINEAR_MIPMAP_LINEAR); 
    260                 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, 
    261                                 GL_LINEAR); 
    262  
    263                 update_textures(widget); 
    264  
    265                 GLint size; 
    266                 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size); 
    267 #ifdef DEBUG_MODE_ASSERT 
    268                 printf("%u\n", size); 
    269                 assert(size >= 512); 
    270                 assert(glIsTexture(textures[0])); 
    271 #endif 
    272                 // Cube vertex 
    273                 v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1; 
    274                 v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1; 
    275                 v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1; 
    276                 v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1; 
    277                 v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1; 
    278                 v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1; 
    279  
    280                 glMatrixMode(GL_PROJECTION); 
    281                 gluPerspective(persp, 1.0, 0.5, 10.0); 
    282  
    283                 glMatrixMode(GL_MODELVIEW); 
    284  
    285                 gluLookAt(lookposx, lookposy, lookposz, atx, aty, atz, 0.0, 1.0, 0.0);  // up is in positive Y direction  
    286  
    287                 matrix_setup(); 
     527        break; 
     528      case ZOOM4: 
     529#ifndef NDEBUG 
     530        cerr << "zoom1 " << frame << endl; 
     531#endif 
     532        if (frame == N_FRAMES) { 
     533          frame = 0; 
     534          stop_animation(widget); 
     535        } else { 
     536          glClear(GL_COLOR_BUFFER_BIT | 
     537                  GL_DEPTH_BUFFER_BIT); 
     538          glMatrixMode(GL_PROJECTION); 
     539          glLoadIdentity(); 
     540          persp = perspsteps[frame]; 
     541          gluPerspective(persp, 1.0, 0.5, 10.0); 
     542          glMatrixMode(GL_MODELVIEW); 
     543          glLoadIdentity(); 
     544          atx = lookposx = 1.3 * zoomsteps[frame]; 
     545          aty = lookposy = 
     546            -zoomsteps[frame] - 
     547            yoffset / N_FRAMES * (frame); 
     548          gluLookAt(lookposx, lookposy, lookposz, 
     549                    atx, aty, atz, 0, 1, 0); 
     550          glRotatef(angle, 0.0, 1.0, 0.0); 
     551          drawCube(); 
     552          frame++; 
    288553        } 
    289  
    290         void 
    291          redraw(GtkWidget * widget) { 
    292  
    293                 double yoffset = 0.1; 
    294                 if (animating) { 
    295                         switch (active_animation) { 
    296                         case ANIM_NONE: 
    297  
    298 #ifdef DEBUG_MODE 
    299                                 cerr << "No animation... stopping right now." << 
    300                                     endl; 
    301 #endif 
    302                                 frame = 0; 
    303                                 stop_animation(widget); 
    304                                 break; 
    305                         case CUBE_NEXT: 
    306 #ifdef DEBUG_MODE 
    307                                 cerr << "cube " << frame << endl; 
    308 #endif 
    309                                 if (frame == N_FRAMES) { 
    310                                         frame = 0; 
    311                                         stop_animation(widget); 
    312                                         quick_reset(widget); 
    313                                 } else { 
    314                                         glClear(GL_COLOR_BUFFER_BIT | 
    315                                                 GL_DEPTH_BUFFER_BIT); 
    316                                         glMatrixMode(GL_MODELVIEW); 
    317                                         glLoadIdentity(); 
    318                                         lookposz -= zsteps[frame] * 4; 
    319                                         lookposy = 6 * xsteps[frame]; 
    320                                         gluLookAt(lookposx, lookposy, lookposz, 
    321                                                   atx, aty, atz, 0, 1, 0); 
    322                                         angle -= steps[frame]; 
    323                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    324                                         drawCube(); 
    325                                         frame++; 
    326                                 } 
    327                                 break; 
    328                         case CUBE_PREV: 
    329 #ifdef DEBUG_MODE 
    330                                 cerr << "cube " << frame << endl; 
    331 #endif 
    332                                 if (frame == N_FRAMES) { 
    333                                         frame = 0; 
    334                                         stop_animation(widget); 
    335                                         quick_reset(widget); 
    336                                 } else { 
    337                                         glClear(GL_COLOR_BUFFER_BIT | 
    338                                                 GL_DEPTH_BUFFER_BIT); 
    339                                         glMatrixMode(GL_MODELVIEW); 
    340                                         glLoadIdentity(); 
    341                                         lookposz -= zsteps[frame] * 4; 
    342                                         lookposy = 6 * xsteps[frame]; 
    343                                         gluLookAt(lookposx, lookposy, lookposz, 
    344                                                   atx, aty, atz, 0, 1, 0); 
    345                                         angle -= steps[frame]; 
    346                                         glRotatef(angle, 0.0, -1.0, 0.0); 
    347                                         drawCube(); 
    348                                         frame++; 
    349                                 } 
    350                                 break; 
    351                         case ZOOM0: 
    352  
    353 #ifdef DEBUG_MODE 
    354                                 cerr << "zoom0 " << frame << endl; 
    355 #endif 
    356                                 if (frame == N_FRAMES) { 
    357                                         frame = 0; 
    358                                         stop_animation(widget); 
    359                                         quick_reset(widget); 
    360                                 } else { 
    361                                         glClear(GL_COLOR_BUFFER_BIT | 
    362                                                 GL_DEPTH_BUFFER_BIT); 
    363                                         switch (previous_animation) { 
    364                                         case ZOOM1: 
    365                                                 persp = 
    366                                                     perspsteps[(N_FRAMES - 1) - 
    367                                                                frame]; 
    368                                                 atx = lookposx = 
    369                                                     -(1.3 * 
    370                                                       zoomsteps[(N_FRAMES - 1) - 
    371                                                                 frame]); 
    372                                                 aty = lookposy = 
    373                                                     zoomsteps[(N_FRAMES - 1) - 
    374                                                               frame] - 
    375                                                     yoffset / N_FRAMES * 
    376                                                     ((N_FRAMES - 1) - frame); 
    377                                                 break; 
    378                                         case ZOOM2: 
    379                                                 persp = 
    380                                                     perspsteps[(N_FRAMES - 1) - 
    381                                                                frame]; 
    382                                                 atx = lookposx = 
    383                                                     1.3 * 
    384                                                     zoomsteps[(N_FRAMES - 1) - 
    385                                                               frame]; 
    386                                                 aty = lookposy = 
    387                                                     zoomsteps[(N_FRAMES - 1) - 
    388                                                               frame] - 
    389                                                     yoffset / N_FRAMES * 
    390                                                     ((N_FRAMES - 1) - frame); 
    391                                                 break; 
    392                                         case ZOOM3: 
    393                                                 persp = 
    394                                                     perspsteps[(N_FRAMES - 1) - 
    395                                                                frame]; 
    396                                                 atx = lookposx = 
    397                                                     -1.3 * 
    398                                                     zoomsteps[(N_FRAMES - 1) - 
    399                                                               frame]; 
    400                                                 aty = lookposy = 
    401                                                     -zoomsteps[(N_FRAMES - 1) - 
    402                                                                frame] - 
    403                                                     yoffset / N_FRAMES * 
    404                                                     ((N_FRAMES - 1) - frame); 
    405                                                 break; 
    406                                         case ZOOM4: 
    407                                                 persp = 
    408                                                     perspsteps[(N_FRAMES - 1) - 
    409                                                                frame]; 
    410                                                 atx = lookposx = 
    411                                                     1.3 * 
    412                                                     zoomsteps[(N_FRAMES - 1) - 
    413                                                               frame]; 
    414                                                 aty = lookposy = 
    415                                                     -zoomsteps[(N_FRAMES - 1) - 
    416                                                                frame] - 
    417                                                     yoffset / N_FRAMES * 
    418                                                     ((N_FRAMES - 1) - frame); 
    419                                                 break; 
    420                                         case ZOOMC: 
    421                                                 persp = 
    422                                                     perspstepsc[(N_FRAMES - 1) - 
    423                                                                 frame]; 
    424                                                 aty = lookposy = 
    425                                                     -zoomsteps[(N_FRAMES - 1) - 
    426                                                                frame] * 0.38; 
    427                                                 break; 
    428                                         default: 
    429  
    430 #ifdef DEBUG_MODE 
    431                                                 cerr << "Should not reach" << 
    432                                                     endl; 
    433 #endif 
    434                                                 break; 
    435                                         } 
    436                                         glMatrixMode(GL_PROJECTION); 
    437                                         glLoadIdentity(); 
    438                                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    439                                         glMatrixMode(GL_MODELVIEW); 
    440                                         glLoadIdentity(); 
    441                                         gluLookAt(lookposx, lookposy, lookposz, 
    442                                                   atx, aty, atz, 0, 1, 0); 
    443                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    444                                         drawCube(); 
    445                                         frame++; 
    446                                 } 
    447                                 break; 
    448                         case ZOOM1: 
    449 #ifdef DEBUG_MODE 
    450                                 cerr << "zoom1 " << frame << endl; 
    451 #endif 
    452                                 if (frame == N_FRAMES) { 
    453                                         frame = 0; 
    454                                         stop_animation(widget); 
    455                                 } else { 
    456                                         glClear(GL_COLOR_BUFFER_BIT | 
    457                                                 GL_DEPTH_BUFFER_BIT); 
    458                                         glMatrixMode(GL_PROJECTION); 
    459                                         glLoadIdentity(); 
    460                                         persp = perspsteps[frame]; 
    461                                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    462                                         glMatrixMode(GL_MODELVIEW); 
    463                                         glLoadIdentity(); 
    464                                         atx = lookposx = 
    465                                             -1.3 * zoomsteps[frame]; 
    466                                         aty = lookposy = 
    467                                             zoomsteps[frame] - 
    468                                             yoffset / N_FRAMES * (frame); 
    469                                         gluLookAt(lookposx, lookposy, lookposz, 
    470                                                   atx, aty, atz, 0, 1, 0); 
    471                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    472                                         drawCube(); 
    473                                         frame++; 
    474                                 } 
    475                                 break; 
    476                         case ZOOM2: 
    477 #ifdef DEBUG_MODE 
    478                                 cerr << "zoom1 " << frame << endl; 
    479 #endif 
    480                                 if (frame == N_FRAMES) { 
    481                                         frame = 0; 
    482                                         stop_animation(widget); 
    483                                 } else { 
    484                                         glClear(GL_COLOR_BUFFER_BIT | 
    485                                                 GL_DEPTH_BUFFER_BIT); 
    486                                         glMatrixMode(GL_PROJECTION); 
    487                                         glLoadIdentity(); 
    488                                         persp = perspsteps[frame]; 
    489                                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    490                                         glMatrixMode(GL_MODELVIEW); 
    491                                         glLoadIdentity(); 
    492                                         atx = lookposx = 1.3 * zoomsteps[frame]; 
    493                                         aty = lookposy = 
    494                                             zoomsteps[frame] - 
    495                                             yoffset / N_FRAMES * (frame); 
    496                                         gluLookAt(lookposx, lookposy, lookposz, 
    497                                                   atx, aty, atz, 0, 1, 0); 
    498                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    499                                         drawCube(); 
    500                                         frame++; 
    501                                 } 
    502                                 break; 
    503                         case ZOOM3: 
    504 #ifdef DEBUG_MODE 
    505                                 cerr << "zoom1 " << frame << endl; 
    506 #endif 
    507                                 if (frame == N_FRAMES) { 
    508                                         frame = 0; 
    509                                         stop_animation(widget); 
    510                                 } else { 
    511                                         glClear(GL_COLOR_BUFFER_BIT | 
    512                                                 GL_DEPTH_BUFFER_BIT); 
    513                                         glMatrixMode(GL_PROJECTION); 
    514                                         glLoadIdentity(); 
    515                                         persp = perspsteps[frame]; 
    516                                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    517                                         glMatrixMode(GL_MODELVIEW); 
    518                                         glLoadIdentity(); 
    519                                         atx = lookposx = 
    520                                             -1.3 * zoomsteps[frame]; 
    521                                         aty = lookposy = 
    522                                             -zoomsteps[frame] - 
    523                                             yoffset / N_FRAMES * (frame); 
    524                                         gluLookAt(lookposx, lookposy, lookposz, 
    525                                                   atx, aty, atz, 0, 1, 0); 
    526                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    527                                         drawCube(); 
    528                                         frame++; 
    529                                 } 
    530                                 break; 
    531                         case ZOOM4: 
    532 #ifdef DEBUG_MODE 
    533                                 cerr << "zoom1 " << frame << endl; 
    534 #endif 
    535                                 if (frame == N_FRAMES) { 
    536                                         frame = 0; 
    537                                         stop_animation(widget); 
    538                                 } else { 
    539                                         glClear(GL_COLOR_BUFFER_BIT | 
    540                                                 GL_DEPTH_BUFFER_BIT); 
    541                                         glMatrixMode(GL_PROJECTION); 
    542                                         glLoadIdentity(); 
    543                                         persp = perspsteps[frame]; 
    544                                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    545                                         glMatrixMode(GL_MODELVIEW); 
    546                                         glLoadIdentity(); 
    547                                         atx = lookposx = 1.3 * zoomsteps[frame]; 
    548                                         aty = lookposy = 
    549                                             -zoomsteps[frame] - 
    550                                             yoffset / N_FRAMES * (frame); 
    551                                         gluLookAt(lookposx, lookposy, lookposz, 
    552                                                   atx, aty, atz, 0, 1, 0); 
    553                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    554                                         drawCube(); 
    555                                         frame++; 
    556                                 } 
    557                                 break; 
    558                         case ZOOMC: 
    559 #ifdef DEBUG_MODE 
    560                                 cerr << "zoomc " << frame << endl; 
    561 #endif 
    562                                 if (frame == N_FRAMES) { 
    563                                         frame = 0; 
    564                                         stop_animation(widget); 
    565                                 } else { 
    566                                         glClear(GL_COLOR_BUFFER_BIT | 
    567                                                 GL_DEPTH_BUFFER_BIT); 
    568                                         persp = perspstepsc[frame]; 
    569                                         aty = lookposy = 
    570                                             -zoomsteps[frame] * 0.38; 
    571                                         glMatrixMode(GL_PROJECTION); 
    572                                         glLoadIdentity(); 
    573                                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    574                                         glMatrixMode(GL_MODELVIEW); 
    575                                         glLoadIdentity(); 
    576                                         gluLookAt(lookposx, lookposy, lookposz, 
    577                                                   atx, aty, atz, 0, 1, 0); 
    578                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    579                                         drawCube(); 
    580                                         frame++; 
    581                                 } 
    582                                 break; 
    583                         case SWITCH_FW: 
    584 #ifdef DEBUG_MODE 
    585                                 cerr << "fw " << frame << endl; 
    586 #endif 
    587                                 if (frame == 1) { 
    588                                         frame = 0; 
    589                                         stop_animation(widget); 
    590                                 } else { 
    591                                         glClear(GL_COLOR_BUFFER_BIT | 
    592                                                 GL_DEPTH_BUFFER_BIT); 
    593                                         glMatrixMode(GL_MODELVIEW); 
    594                                         glLoadIdentity(); 
    595                                         gluLookAt(lookposx, lookposy, lookposz, 
    596                                                   atx, aty, atz, 0, 1, 0); 
    597                                         angle -= 90; 
    598                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    599                                         drawCube(); 
    600                                         frame++; 
    601                                 } 
    602                                 break; 
    603                         case SWITCH_BW: 
    604 #ifdef DEBUG_MODE 
    605                                 cerr << "bw " << frame << endl; 
    606 #endif 
    607                                 if (frame == 1) { 
    608                                         frame = 0; 
    609                                         stop_animation(widget); 
    610                                 } else { 
    611                                         glClear(GL_COLOR_BUFFER_BIT | 
    612                                                 GL_DEPTH_BUFFER_BIT); 
    613                                         glMatrixMode(GL_MODELVIEW); 
    614                                         glLoadIdentity(); 
    615                                         gluLookAt(lookposx, lookposy, lookposz, 
    616                                                   atx, aty, atz, 0, 1, 0); 
    617                                         angle += 90; 
    618                                         glRotatef(angle, 0.0, 1.0, 0.0); 
    619                                         drawCube(); 
    620                                         frame++; 
    621                                 } 
    622                                 break; 
    623                         } 
    624                 } else { 
    625                         switch (active_animation) { 
    626                         case ANIM_NONE: 
    627 #ifdef DEBUG_MODE 
    628                                 cerr << "Redrawing" << endl; 
    629 #endif 
    630                                 break; 
    631                         case CUBE_NEXT: 
    632 #ifdef DEBUG_MODE 
    633                                 cerr << "cube stop" << endl; 
    634 #endif 
    635                                 forward(widget); 
    636                                 current_face = next_face(); 
    637 //          quick_reset(widget); 
    638                                 break; 
    639                         case CUBE_PREV: 
    640 #ifdef DEBUG_MODE 
    641                                 cerr << "cube stop" << endl; 
    642 #endif 
    643                                 backward(widget); 
    644                                 current_face = prev_face(); 
    645 //          quick_reset(widget); 
    646                                 break; 
    647                         case SWITCH_FW: 
    648 #ifdef DEBUG_MODE 
    649                                 cerr << "fw stop" << endl; 
    650 #endif 
    651                                 forward(widget); 
    652                                 current_face = next_face(); 
    653                                 break; 
    654                         case SWITCH_BW: 
    655 #ifdef DEBUG_MODE 
    656                                 cerr << "bw stop" << endl; 
    657 #endif 
    658                                 backward(widget); 
    659                                 current_face = prev_face(); 
    660                                 break; 
    661                         case ZOOM0: 
    662                         case ZOOM1: 
    663                         case ZOOM2: 
    664                         case ZOOM3: 
    665                         case ZOOM4: 
    666                         case ZOOMC: 
    667                         default: 
    668 #ifdef DEBUG_MODE 
    669                                 cerr << "default stop" << endl; 
    670 #endif 
    671                                 break; 
    672  
    673                         } 
    674  
    675                         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    676 //      glClear(GL_COLOR_BUFFER_BIT); 
    677                         glMatrixMode(GL_PROJECTION); 
    678                         glLoadIdentity(); 
    679                         gluPerspective(persp, 1.0, 0.5, 10.0); 
    680                         glMatrixMode(GL_MODELVIEW); 
    681                         glLoadIdentity(); 
    682                         gluLookAt(lookposx, lookposy, lookposz, atx, aty, atz, 
    683                                   0, 1, 0); 
    684                         glRotatef(angle, 0.0, 1.0, 0.0); 
    685                         drawCube(); 
    686  
    687                         glRasterPos3f(0, -1.4, 0); 
    688                         GLuint rcube[] = { 
    689                                 0, 0, 0, 127 
    690                         }; 
    691                         glDrawPixels(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, rcube); 
    692  
    693                         active_animation = ANIM_NONE; 
    694  
    695 #ifdef DEBUG_MODE 
    696                         cerr << "Ok!" << endl; 
    697 #endif 
    698                         glFlush(); 
    699                 } 
     554        break; 
     555      case ZOOMC: 
     556#ifndef NDEBUG 
     557        cerr << "zoomc " << frame << endl; 
     558#endif 
     559        if (frame == N_FRAMES) { 
     560          frame = 0; 
     561          stop_animation(widget); 
     562        } else { 
     563          glClear(GL_COLOR_BUFFER_BIT | 
     564                  GL_DEPTH_BUFFER_BIT); 
     565          persp = perspstepsc[frame]; 
     566          aty = lookposy = 
     567            -zoomsteps[frame] * 0.38; 
     568          glMatrixMode(GL_PROJECTION); 
     569          glLoadIdentity(); 
     570          gluPerspective(persp, 1.0, 0.5, 10.0); 
     571          glMatrixMode(GL_MODELVIEW); 
     572          glLoadIdentity(); 
     573          gluLookAt(lookposx, lookposy, lookposz, 
     574                    atx, aty, atz, 0, 1, 0); 
     575          glRotatef(angle, 0.0, 1.0, 0.0); 
     576          drawCube(); 
     577          frame++; 
    700578        } 
    701  
    702         int prev_face() { 
    703                 if (current_face - 1 < 0) 
    704                         return 3; 
    705                 else 
    706                         return current_face - 1; 
     579        break; 
     580      case SWITCH_FW: 
     581#ifndef NDEBUG 
     582        cerr << "fw " << frame << endl; 
     583#endif 
     584        if (frame == 1) { 
     585          frame = 0; 
     586          stop_animation(widget); 
     587        } else { 
     588          glClear(GL_COLOR_BUFFER_BIT | 
     589                  GL_DEPTH_BUFFER_BIT); 
     590          glMatrixMode(GL_MODELVIEW); 
     591          glLoadIdentity(); 
     592          gluLookAt(lookposx, lookposy, lookposz, 
     593                    atx, aty, atz, 0, 1, 0); 
     594          angle -= 90; 
     595          glRotatef(angle, 0.0, 1.0, 0.0); 
     596          drawCube(); 
     597          frame++; 
    707598        } 
    708  
    709         int next_face() { 
    710                 if (current_face + 1 > 3) 
    711                         return 0; 
    712                 else 
    713                         return current_face + 1; 
     599        break; 
     600      case SWITCH_BW: 
     601#ifndef NDEBUG 
     602        cerr << "bw " << frame << endl; 
     603#endif 
     604        if (frame == 1) { 
     605          frame = 0; 
     606          stop_animation(widget); 
     607        } else { 
     608          glClear(GL_COLOR_BUFFER_BIT | 
     609                  GL_DEPTH_BUFFER_BIT); 
     610          glMatrixMode(GL_MODELVIEW); 
     611          glLoadIdentity(); 
     612          gluLookAt(lookposx, lookposy, lookposz, 
     613                    atx, aty, atz, 0, 1, 0); 
     614          angle += 90; 
     615          glRotatef(angle, 0.0, 1.0, 0.0); 
     616          drawCube(); 
     617          frame++; 
    714618        } 
    715  
    716         int prev_page() { 
    717 #ifdef DEBUG_MODE_ASSERT 
    718                 assert(current_page >= 0); 
    719 #endif 
    720                 if (current_page == 0) 
    721                         return total_pages - 1; 
    722                 else 
    723                         return current_page - 1; 
    724         } 
    725  
    726         int next_page() { 
    727 #ifdef DEBUG_MODE_ASSERT 
    728                 assert(current_page < total_pages); 
    729 #endif 
    730                 if (current_page == total_pages - 1) 
    731                         return 0; 
    732                 else 
    733                         return current_page + 1; 
    734         } 
    735  
    736         void 
    737          forward(GtkWidget * widget) { 
    738                 update_textures_dir(widget, true); 
    739 #ifdef DEBUG_MODE 
    740                 cerr << "Current page: " << current_page << endl; 
    741 #endif 
    742         } 
    743  
    744         void matrix_setup() { 
    745 /*GLfloat pdfcube::steps[N_FRAMES] =  
    746   {  2.0,   2.5,   3,     4,     5,     6,     8,     10,    
    747      14,   10,   8,    6,    4,    3,    2.5,   2.0, 0.0  };*/ 
    748  
    749                 float step_factor = 0.2 * N_FRAMES;     //this is little buggy 
    750                 float step = (step_factor) / double (N_FRAMES / 2); 
    751                 int i = 0; 
    752                 for (i = 0; i < N_FRAMES / 2; i++) { 
    753                         steps[i] = i * step; 
    754                         if (steps[i] > step_factor) 
    755                                 steps[i] = step_factor; 
    756                 } 
    757                 for (i = N_FRAMES / 2; i < N_FRAMES; i++) { 
    758                         steps[i] = step_factor - (i - N_FRAMES / 2) * step; 
    759                         if (steps[i] < 0) 
    760                                 steps[i] = 0; 
    761                 } 
    762                 steps[N_FRAMES - 1] = 0; 
    763 #ifdef DEBUG_MODE 
    764                 cout << "Step " << step << endl; 
    765                 cout << "Matrix "; 
    766                 for (i = 0; i < N_FRAMES; i++) 
    767                         cout << steps[i] << " "; 
    768                 cout << endl; 
    769 #endif 
    770 /*double pdfcube::xsteps[N_FRAMES] =  
    771   {  0.01,  0.03,  0.07,  0.12,  0.16,  0.18,  0.20,  0.21,  
    772      0.21, 0.20, 0.18, 0.16, 0.12, 0.07, 0.03, 0.01, 0.00 };*/ 
    773  
    774                 float xstep_ratio = 0.4; 
    775                 float xstep = 
    776                     double (xstep_ratio - 0.01) / double (N_FRAMES / 2); 
    777                 for (i = 0; i < N_FRAMES / 2; i++) { 
    778                         xsteps[i] = i * xstep; 
    779                         if (xsteps[i] > xstep_ratio) 
    780                                 xsteps[i] = xstep_ratio; 
    781                 } 
    782                 for (i = N_FRAMES / 2; i < N_FRAMES; i++) { 
    783                         xsteps[i] = xstep_ratio - (i - N_FRAMES / 2) * xstep; 
    784                         if (xsteps[i] < 0.01) 
    785                                 xsteps[i] = 0; 
    786                 } 
    787                 xsteps[N_FRAMES - 1] = 0; 
    788  
    789 #ifdef DEBUG_MODE 
    790                 cout << "Step x " << xstep << endl; 
    791                 cout << "Matrix2 "; 
    792                 for (i = 0; i < N_FRAMES; i++) 
    793                         cout << xsteps[i] << " "; 
    794                 cout << endl; 
    795 #endif 
    796 /*double pdfcube::zsteps[N_FRAMES] =  
    797   { -0.01, -0.02, -0.04, -0.05, -0.04, -0.02, -0.02, -0.01,  
    798     0.01, 0.02, 0.02, 0.04, 0.05, 0.04, 0.02, 0.01, 0.00 };*/ 
    799  
    800                 float granular = 0.07; 
    801                 float zstep = granular / double (N_FRAMES / 4); 
    802                 for (i = 0; i < N_FRAMES / 4; i++) { 
    803                         zsteps[i] = -i * zstep; 
    804                 } 
    805                 for (i = N_FRAMES / 4; i < N_FRAMES / 2; i++) { 
    806                         zsteps[i] = -granular + (i - N_FRAMES / 4) * zstep; 
    807                 } 
    808                 for (i = N_FRAMES / 2; i < N_FRAMES; i++) { 
    809                         zsteps[i] = -zsteps[i - N_FRAMES / 2]; 
    810                 } 
    811                 zsteps[N_FRAMES - 1] = 0; 
    812  
    813 #ifdef DEBUG_MODE 
    814                 cout << "Step z " << zstep << endl; 
    815                 cout << "Matrix3 "; 
    816                 for (i = 0; i < N_FRAMES; i++) 
    817                         cout << zsteps[i] << " "; 
    818                 cout << endl; 
    819 #endif 
    820 /*double pdfcube::zoomsteps[N_FRAMES] = 
    821   { 0.00, 0.01, 0.02, 0.03, 0.05, 0.07, 0.10, 0.13, 0.17,  
    822     0.21, 0.25, 0.29, 0.32, 0.35, 0.37, 0.38, 0.38 };*/ 
    823  
    824                 float zoomstop = 0.38; 
    825                 float zoomstep = (zoomstop / double (N_FRAMES)); 
    826                 for (i = 0; i < N_FRAMES; i++) { 
    827                         zoomsteps[i] = i * zoomstep; 
    828                 } 
    829                 zoomsteps[N_FRAMES - 1] = zoomstop; 
    830  
    831 #ifdef DEBUG_MODE 
    832                 cout << "Step zoom " << zoomstep << endl; 
    833                 cout << "Matrix4 "; 
    834                 for (i = 0; i < N_FRAMES; i++) 
    835                         cout << zoomsteps[i] << " "; 
    836                 cout << endl; 
    837 #endif 
    838 /*double pdfcube::perspsteps[N_FRAMES] = 
    839   { 44.0, 44.0, 44.0, 44.00, 44.00, 43.00, 42.00, 40.00,  
    840     38.00, 36.00, 33.00, 30.00, 27.00, 24.00, 22.00, 21.00, 21.00 };*/ 
    841  
    842                 float perspstart = 44.00; 
    843                 float perspstop = 21.00; 
    844                 float perspstep = (perspstart - perspstop) / double (N_FRAMES); 
    845                 for (i = 0; i < N_FRAMES; i++) { 
    846                         perspsteps[i] = perspstart - i * perspstep; 
    847                 } 
    848                 perspsteps[0] = perspstart; 
    849                 perspsteps[N_FRAMES - 1] = perspstop; 
    850  
    851 #ifdef DEBUG_MODE 
    852                 cout << "Step persp " << perspstep << endl; 
    853                 cout << "Matrix5 "; 
    854                 for (i = 0; i < N_FRAMES; i++) 
    855                         cout << perspsteps[i] << " "; 
    856                 cout << endl; 
    857 #endif 
    858  
    859 /*double pdfcube::perspstepsc[N_FRAMES] = 
    860     { 44.0, 44.0, 44.0, 44.00, 44.00, 43.00, 42.00, 40.00,  
    861     38.00, 36.00, 34.00, 32.00, 31.00, 30.00, 30.00, 30.00, 30.00 };*/ 
    862                 float perspcstart = 44.00; 
    863                 float perspcstop = 30.00; 
    864                 float perspcstep = 
    865                     (perspcstart - perspcstop) / double (N_FRAMES / 2); 
    866                 for (i = 0; i < N_FRAMES / 4; i++) 
    867                         perspstepsc[i] = perspcstart; 
    868  
    869                 for (i = N_FRAMES / 4; i < 3 * (N_FRAMES / 4); i++) { 
    870                         perspstepsc[i] = perspcstart - i * perspcstep; 
    871                 } 
    872                 for (i = 3 * (N_FRAMES / 4); i < N_FRAMES; i++) 
    873                         perspstepsc[i] = perspcstop; 
    874  
    875 #ifdef DEBUG_MODE 
    876                 cout << "Step perspc " << perspcstep << endl; 
    877                 cout << "Matrix6 "; 
    878                 for (i = 0; i < N_FRAMES; i++) 
    879                         cout << perspstepsc[i] << " "; 
    880                 cout << endl; 
    881 #endif 
    882         } 
    883  
    884         void 
    885          backward(GtkWidget * widget) { 
    886                 update_textures_dir(widget, false); 
    887 #ifdef DEBUG_MODE 
    888                 cerr << "Current page: " << current_page << endl; 
    889 #endif 
    890         } 
    891  
    892         void 
    893          reset(GtkWidget * widget) { 
    894                 animating = FALSE; 
    895                 frame = 0; 
    896                 lookposx = 0.0; 
    897                 lookposy = 0.0; 
    898                 lookposz = 3.48; 
    899                 atx = 0.0; 
    900                 aty = 0.0; 
    901                 atz = 0.0; 
    902                 persp = 44.0; 
    903                 angle = 0.0; 
    904                 current_face = 0; 
    905                 active_animation = ANIM_NONE; 
    906                 previous_animation = ANIM_NONE; 
    907                 last_animation = ANIM_NONE; 
    908                 update_textures(widget); 
    909         } 
    910  
    911         void 
    912          quick_reset(GtkWidget * widget) { 
    913                 animating = FALSE; 
    914                 frame = 0; 
    915                 lookposx = 0.0; 
    916                 lookposy = 0.0; 
    917                 lookposz = 3.48; 
    918                 atx = 0.0; 
    919                 aty = 0.0; 
    920                 atz = 0.0; 
    921                 persp = 44.0; 
    922                 angle = 0.0; 
    923                 current_face = 0; 
    924                 active_animation = ANIM_NONE; 
    925                 previous_animation = ANIM_NONE; 
    926                 last_animation = ANIM_NONE; 
    927 //    update_textures(widget); 
    928         } 
    929  
    930         // shift old textures and render the new page 
    931         // texmap[0] -> current page 
    932         // texmap[1] -> prev page 
    933         // texmap[2] -> next page 
    934         void update_textures_dir(GtkWidget * widget, bool forward) { 
    935 #ifdef DEBUG_MODE_ASSERT 
    936                 assert(current_page >= 0); 
    937                 assert(current_page < total_pages); 
    938 #endif 
    939                 if (forward) { 
    940                         current_page = next_page(); 
    941                         int tmp = texmap[2]; 
    942                         texmap[2] = texmap[1]; 
    943                         texmap[1] = texmap[0]; 
    944                         texmap[0] = tmp; 
    945                         render_page(pixmap, next_page(), tex_width, tex_height); 
    946                 } else { 
    947                         current_page = prev_page(); 
    948                         int tmp = texmap[0]; 
    949                         texmap[0] = texmap[1]; 
    950                         texmap[1] = texmap[2]; 
    951                         texmap[2] = tmp; 
    952                         render_page(pixmap, prev_page(), tex_width, tex_height); 
    953                 } 
    954  
    955                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
    956                               textures[texmap[forward ? 2 : 1]]); 
    957                 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
    958                              0, 
    959                              GL_RGBA, 
    960                              tex_width, 
    961                              tex_height, 
    962                              0, 
    963                              GL_RGBA, 
    964                              GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
    965  
    966                 gdk_window_invalidate_rect(widget->window, &widget->allocation, 
    967                                            FALSE); 
    968  
    969         } 
    970  
    971         // render all (3) textures 
    972         void update_textures(GtkWidget * widget) { 
    973  
    974 #ifdef DEBUG_MODE_ASSERT 
    975                 assert(current_page >= 0); 
    976                 assert(current_page < total_pages); 
    977 #endif 
    978                 render_page(pixmap, current_page, tex_width, tex_height); 
    979                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[texmap[0]]); 
    980                 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
    981                              0, 
    982                              GL_RGBA, 
    983                              tex_width, 
    984                              tex_height, 
    985                              0, 
    986                              GL_RGBA, 
    987                              GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
    988  
    989                 render_page(pixmap, prev_page(), tex_width, tex_height); 
    990                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[texmap[1]]); 
    991                 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
    992                              0, 
    993                              GL_RGBA, 
    994                              tex_width, 
    995                              tex_height, 
    996                              0, 
    997                              GL_RGBA, 
    998                              GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
    999  
    1000                 render_page(pixmap, next_page(), tex_width, tex_height); 
    1001                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[texmap[2]]); 
    1002                 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
    1003                              0, 
    1004                              GL_RGBA, 
    1005                              tex_width, 
    1006                              tex_height, 
    1007                              0, 
    1008                              GL_RGBA, 
    1009                              GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
    1010  
    1011                 gdk_window_invalidate_rect(widget->window, &widget->allocation, 
    1012                                            FALSE); 
    1013  
    1014         } 
    1015  
    1016       protected: 
    1017         PopplerDocument * doc; 
    1018         int current_page; 
    1019         int current_face; 
    1020         const int total_pages; 
    1021         int frame; 
    1022         double lookposx, lookposy, lookposz; 
    1023         double atx, aty, atz; 
    1024         double persp, angle; 
    1025         GdkPixbuf *pixmap; 
    1026         int texmap[3]; 
    1027  
    1028         // OpenGL Textures 
    1029         GLuint textures[3]; 
    1030  
    1031         // Width and Height of the rendered pixmap (aspect 
    1032         // ratio is fixed, should instead depend on the  
    1033         // aspect ratio of the pdf page) 
    1034         static const gint tex_width = (gint) (3 * 1024 / 2); 
    1035         static const gint tex_height = (gint) (3 * 768 / 2); 
    1036  
    1037         void 
    1038          render_page(GdkPixbuf * pm, int i, gint iWidth, gint iHeight) { 
    1039                 PopplerPage *page; 
    1040                 page = poppler_document_get_page(doc, i); 
    1041                 double w, h; 
    1042                 poppler_page_get_size(page, &w, &h); 
    1043                 poppler_page_render_to_pixbuf(page, 0, 0, iWidth, iHeight, 
    1044                                               1.0 * iWidth / w, 0, pm); 
    1045         } 
    1046  
    1047         void 
    1048          drawCube(void) { 
    1049                 int i; 
    1050  
    1051                 for (i = 0; i < 6; i++) { 
    1052                         if (i == current_face) { 
    1053                                 glEnable(GL_TEXTURE_RECTANGLE_ARB); 
    1054                                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
    1055                                               textures[texmap[0]]); 
    1056                         } else if (i == prev_face()) { 
    1057                                 glEnable(GL_TEXTURE_RECTANGLE_ARB); 
    1058                                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
    1059                                               textures[texmap[1]]); 
    1060                         } else if (i == next_face()) { 
    1061                                 glEnable(GL_TEXTURE_RECTANGLE_ARB); 
    1062                                 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
    1063                                               textures[texmap[2]]); 
    1064                         } else if (i <= 3) { 
    1065                                 glDisable(GL_TEXTURE_RECTANGLE_ARB); 
    1066                                 glColor4f(0.4, 0.0, 0.0, 1.0); 
    1067                         } else { 
    1068                                 glDisable(GL_TEXTURE_RECTANGLE_ARB); 
    1069                                 glColor4f(1.0, 1.0, 1.0, 1.0); 
    1070                         } 
    1071                         glPolygonMode(GL_FRONT, GL_FILL); 
    1072                         glBegin(GL_QUADS); 
    1073 //      glNormal3fv(&n[i][0]); 
    1074                         glTexCoord2f((1.0 - mapping[i][4]) * tex_width, 
    1075                                      mapping[i][5] * tex_height); 
    1076                         glVertex3fv(&v[faces[i][0]][0]); 
    1077  
    1078                         glTexCoord2f((1.0 - mapping[i][6]) * tex_width, 
    1079                                      mapping[i][7] * tex_height); 
    1080                         glVertex3fv(&v[faces[i][1]][0]); 
    1081  
    1082                         glTexCoord2f((1.0 - mapping[i][0]) * tex_width, 
    1083                                      mapping[i][1] * tex_height); 
    1084                         glVertex3fv(&v[faces[i][2]][0]); 
    1085  
    1086                         glTexCoord2f((1.0 - mapping[i][2]) * tex_width, 
    1087                                      mapping[i][3] * tex_height); 
    1088                         glVertex3fv(&v[faces[i][3]][0]); 
    1089  
    1090                         glEnd(); 
    1091                 } 
    1092         } 
     619        break; 
     620      } 
     621    } else { 
     622      switch (active_animation) { 
     623      case ANIM_NONE: 
     624#ifndef NDEBUG 
     625        cerr << "Redrawing" << endl; 
     626#endif 
     627        break; 
     628      case CUBE_NEXT: 
     629#ifndef NDEBUG 
     630        cerr << "cube stop" << endl; 
     631#endif 
     632        forward(widget); 
     633        current_face = next_face(); 
     634        //          quick_reset(widget); 
     635        break; 
     636      case CUBE_PREV: 
     637#ifndef NDEBUG 
     638        cerr << "cube stop" << endl; 
     639#endif 
     640        backward(widget); 
     641        current_face = prev_face(); 
     642        //          quick_reset(widget); 
     643        break; 
     644      case SWITCH_FW: 
     645#ifndef NDEBUG 
     646        cerr << "fw stop" << endl; 
     647#endif 
     648        forward(widget); 
     649        current_face = next_face(); 
     650        break; 
     651      case SWITCH_BW: 
     652#ifndef NDEBUG 
     653        cerr << "bw stop" << endl; 
     654#endif 
     655        backward(widget); 
     656        current_face = prev_face(); 
     657        break; 
     658      case ZOOM0: 
     659      case ZOOM1: 
     660      case ZOOM2: 
     661      case ZOOM3: 
     662      case ZOOM4: 
     663      case ZOOMC: 
     664      default: 
     665#ifndef NDEBUG 
     666        cerr << "default stop" << endl; 
     667#endif 
     668        break; 
     669 
     670      } 
     671 
     672      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     673      //      glClear(GL_COLOR_BUFFER_BIT); 
     674      glMatrixMode(GL_PROJECTION); 
     675      glLoadIdentity(); 
     676      gluPerspective(persp, 1.0, 0.5, 10.0); 
     677      glMatrixMode(GL_MODELVIEW); 
     678      glLoadIdentity(); 
     679      gluLookAt(lookposx, lookposy, lookposz, atx, aty, atz, 
     680                0, 1, 0); 
     681      glRotatef(angle, 0.0, 1.0, 0.0); 
     682      drawCube(); 
     683 
     684      glRasterPos3f(0, -1.4, 0); 
     685      GLuint rcube[] = { 
     686        0, 0, 0, 127 
     687      }; 
     688      glDrawPixels(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, rcube); 
     689 
     690      active_animation = ANIM_NONE; 
     691 
     692#ifndef NDEBUG 
     693      cerr << "Ok!" << endl; 
     694#endif 
     695      glFlush(); 
     696    } 
     697  } 
     698 
     699  int prev_face() { 
     700    if (current_face - 1 < 0) 
     701      return 3; 
     702    else 
     703      return current_face - 1; 
     704  } 
     705 
     706  int next_face() { 
     707    if (current_face + 1 > 3) 
     708      return 0; 
     709    else 
     710      return current_face + 1; 
     711  } 
     712 
     713  int prev_page() { 
     714    assert(current_page >= 0); 
     715    if (current_page == 0) 
     716      return total_pages - 1; 
     717    else 
     718      return current_page - 1; 
     719  } 
     720 
     721  int next_page() { 
     722    assert(current_page < total_pages); 
     723    if (current_page == total_pages - 1) 
     724      return 0; 
     725    else 
     726      return current_page + 1; 
     727  } 
     728 
     729  void 
     730  forward(GtkWidget * widget) { 
     731    update_textures_dir(widget, true); 
     732#ifndef NDEBUG 
     733    cerr << "Current page: " << current_page << endl; 
     734#endif 
     735  } 
     736 
     737  void matrix_setup() { 
     738    /*GLfloat pdfcube::steps[N_FRAMES] =  
     739      {  2.0,   2.5,   3,     4,     5,     6,     8,     10,    
     740      14,   10,   8,    6,    4,    3,    2.5,   2.0, 0.0  };*/ 
     741 
     742    float step_factor = 0.2 * N_FRAMES; //this is little buggy 
     743    float step = (step_factor) / double (N_FRAMES / 2); 
     744    int i = 0; 
     745    for (i = 0; i < N_FRAMES / 2; i++) { 
     746      steps[i] = i * step; 
     747      if (steps[i] > step_factor) 
     748        steps[i] = step_factor; 
     749    } 
     750    for (i = N_FRAMES / 2; i < N_FRAMES; i++) { 
     751      steps[i] = step_factor - (i - N_FRAMES / 2) * step; 
     752      if (steps[i] < 0) 
     753        steps[i] = 0; 
     754    } 
     755    steps[N_FRAMES - 1] = 0; 
     756#ifndef NDEBUG 
     757    cout << "Step " << step << endl; 
     758    cout << "Matrix "; 
     759    for (i = 0; i < N_FRAMES; i++) 
     760      cout << steps[i] << " "; 
     761    cout << endl; 
     762#endif 
     763    /*double pdfcube::xsteps[N_FRAMES] =  
     764      {  0.01,  0.03,  0.07,  0.12,  0.16,  0.18,  0.20,  0.21,  
     765      0.21, 0.20, 0.18, 0.16, 0.12, 0.07, 0.03, 0.01, 0.00 };*/ 
     766 
     767    float xstep_ratio = 0.4; 
     768    float xstep = 
     769      double (xstep_ratio - 0.01) / double (N_FRAMES / 2); 
     770    for (i = 0; i < N_FRAMES / 2; i++) { 
     771      xsteps[i] = i * xstep; 
     772      if (xsteps[i] > xstep_ratio) 
     773        xsteps[i] = xstep_ratio; 
     774    } 
     775    for (i = N_FRAMES / 2; i < N_FRAMES; i++) { 
     776      xsteps[i] = xstep_ratio - (i - N_FRAMES / 2) * xstep; 
     777      if (xsteps[i] < 0.01) 
     778        xsteps[i] = 0; 
     779    } 
     780    xsteps[N_FRAMES - 1] = 0; 
     781 
     782#ifndef NDEBUG 
     783    cout << "Step x " << xstep << endl; 
     784    cout << "Matrix2 "; 
     785    for (i = 0; i < N_FRAMES; i++) 
     786      cout << xsteps[i] << " "; 
     787    cout << endl; 
     788#endif 
     789    /*double pdfcube::zsteps[N_FRAMES] =  
     790      { -0.01, -0.02, -0.04, -0.05, -0.04, -0.02, -0.02, -0.01,  
     791      0.01, 0.02, 0.02, 0.04, 0.05, 0.04, 0.02, 0.01, 0.00 };*/ 
     792 
     793    float granular = 0.07; 
     794    float zstep = granular / double (N_FRAMES / 4); 
     795    for (i = 0; i < N_FRAMES / 4; i++) { 
     796      zsteps[i] = -i * zstep; 
     797    } 
     798    for (i = N_FRAMES / 4; i < N_FRAMES / 2; i++) { 
     799      zsteps[i] = -granular + (i - N_FRAMES / 4) * zstep; 
     800    } 
     801    for (i = N_FRAMES / 2; i < N_FRAMES; i++) { 
     802      zsteps[i] = -zsteps[i - N_FRAMES / 2]; 
     803    } 
     804    zsteps[N_FRAMES - 1] = 0; 
     805 
     806#ifndef NDEBUG 
     807    cout << "Step z " << zstep << endl; 
     808    cout << "Matrix3 "; 
     809    for (i = 0; i < N_FRAMES; i++) 
     810      cout << zsteps[i] << " "; 
     811    cout << endl; 
     812#endif 
     813    /*double pdfcube::zoomsteps[N_FRAMES] = 
     814      { 0.00, 0.01, 0.02, 0.03, 0.05, 0.07, 0.10, 0.13, 0.17,  
     815      0.21, 0.25, 0.29, 0.32, 0.35, 0.37, 0.38, 0.38 };*/ 
     816 
     817    float zoomstop = 0.38; 
     818    float zoomstep = (zoomstop / double (N_FRAMES)); 
     819    for (i = 0; i < N_FRAMES; i++) { 
     820      zoomsteps[i] = i * zoomstep; 
     821    } 
     822    zoomsteps[N_FRAMES - 1] = zoomstop; 
     823 
     824#ifndef NDEBUG 
     825    cout << "Step zoom " << zoomstep << endl; 
     826    cout << "Matrix4 "; 
     827    for (i = 0; i < N_FRAMES; i++) 
     828      cout << zoomsteps[i] << " "; 
     829    cout << endl; 
     830#endif 
     831    /*double pdfcube::perspsteps[N_FRAMES] = 
     832      { 44.0, 44.0, 44.0, 44.00, 44.00, 43.00, 42.00, 40.00,  
     833      38.00, 36.00, 33.00, 30.00, 27.00, 24.00, 22.00, 21.00, 21.00 };*/ 
     834    float perspstart = 44.00; 
     835    float perspstop = 21.00; 
     836    for (i = 0; i < N_FRAMES; i++) { 
     837      perspsteps[i] = (cos(i*M_PI/(N_FRAMES*2)))*(perspstart - perspstop)+perspstop; 
     838    } 
     839#ifndef NDEBUG 
     840    // cout << "Step persp " << perspstep << endl; 
     841    cout << "Matrix5 "; 
     842    for (i = 0; i < N_FRAMES; i++) 
     843      cout << perspsteps[i] << " "; 
     844    cout << endl; 
     845#endif 
     846 
     847    /*double pdfcube::perspstepsc[N_FRAMES] = 
     848      { 44.0, 44.0, 44.0, 44.00, 44.00, 43.00, 42.00, 40.00,  
     849      38.00, 36.00, 34.00, 32.00, 31.00, 30.00, 30.00, 30.00, 30.00 };*/ 
     850    float perspcstart = 44.00; 
     851    float perspcstop = 30.00; 
     852    for (i = 0; i < N_FRAMES; i++) { 
     853      perspstepsc[i] = (1+cos(i*M_PI/(N_FRAMES)))/2*(perspcstart - perspcstop)+perspcstop; 
     854    } 
     855#ifndef NDEBUG 
     856    // cout << "Step perspc " << perspcstep << endl; 
     857    cout << "Matrix6 "; 
     858    for (i = 0; i < N_FRAMES; i++) 
     859      cout << perspstepsc[i] << " "; 
     860    cout << endl; 
     861#endif 
     862  } 
     863 
     864  void 
     865  backward(GtkWidget * widget) { 
     866    update_textures_dir(widget, false); 
     867#ifndef NDEBUG 
     868    cerr << "Current page: " << current_page << endl; 
     869#endif 
     870  } 
     871 
     872  void 
     873  reset(GtkWidget * widget) { 
     874    animating = FALSE; 
     875    frame = 0; 
     876    lookposx = 0.0; 
     877    lookposy = 0.0; 
     878    lookposz = 3.48; 
     879    atx = 0.0; 
     880    aty = 0.0; 
     881    atz = 0.0; 
     882    persp = 44.0; 
     883    angle = 0.0; 
     884    current_face = 0; 
     885    active_animation = ANIM_NONE; 
     886    previous_animation = ANIM_NONE; 
     887    last_animation = ANIM_NONE; 
     888    update_textures(widget); 
     889  } 
     890 
     891  void 
     892  quick_reset(GtkWidget * widget) { 
     893    animating = FALSE; 
     894    frame = 0; 
     895    lookposx = 0.0; 
     896    lookposy = 0.0; 
     897    lookposz = 3.48; 
     898    atx = 0.0; 
     899    aty = 0.0; 
     900    atz = 0.0; 
     901    persp = 44.0; 
     902    angle = 0.0; 
     903    current_face = 0; 
     904    active_animation = ANIM_NONE; 
     905    previous_animation = ANIM_NONE; 
     906    last_animation = ANIM_NONE; 
     907    //    update_textures(widget); 
     908  } 
     909 
     910  // shift old textures and render the new page 
     911  // texmap[0] -> current page 
     912  // texmap[1] -> prev page 
     913  // texmap[2] -> next page 
     914  void update_textures_dir(GtkWidget * widget, bool forward) { 
     915    assert(current_page >= 0); 
     916    assert(current_page < total_pages); 
     917    if (forward) { 
     918      current_page = next_page(); 
     919      int tmp = texmap[2]; 
     920      texmap[2] = texmap[1]; 
     921      texmap[1] = texmap[0]; 
     922      texmap[0] = tmp; 
     923      render_page(pixmap, next_page(), tex_width, tex_height); 
     924    } else { 
     925      current_page = prev_page(); 
     926      int tmp = texmap[0]; 
     927      texmap[0] = texmap[1]; 
     928      texmap[1] = texmap[2]; 
     929      texmap[2] = tmp; 
     930      render_page(pixmap, prev_page(), tex_width, tex_height); 
     931    } 
     932 
     933    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
     934                  textures[texmap[forward ? 2 : 1]]); 
     935    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
     936                 0, 
     937                 GL_RGBA, 
     938                 tex_width, 
     939                 tex_height, 
     940                 0, 
     941                 GL_RGBA, 
     942                 GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
     943 
     944    gdk_window_invalidate_rect(widget->window, &widget->allocation, 
     945                               FALSE); 
     946 
     947  } 
     948 
     949  // render all (3) textures 
     950  void update_textures(GtkWidget * widget) { 
     951 
     952    assert(current_page >= 0); 
     953    assert(current_page < total_pages); 
     954    render_page(pixmap, current_page, tex_width, tex_height); 
     955    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[texmap[0]]); 
     956    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
     957                 0, 
     958                 GL_RGBA, 
     959                 tex_width, 
     960                 tex_height, 
     961                 0, 
     962                 GL_RGBA, 
     963                 GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
     964 
     965    render_page(pixmap, prev_page(), tex_width, tex_height); 
     966    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[texmap[1]]); 
     967    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
     968                 0, 
     969                 GL_RGBA, 
     970                 tex_width, 
     971                 tex_height, 
     972                 0, 
     973                 GL_RGBA, 
     974                 GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
     975 
     976    render_page(pixmap, next_page(), tex_width, tex_height); 
     977    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[texmap[2]]); 
     978    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 
     979                 0, 
     980                 GL_RGBA, 
     981                 tex_width, 
     982                 tex_height, 
     983                 0, 
     984                 GL_RGBA, 
     985                 GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels(pixmap)); 
     986 
     987    gdk_window_invalidate_rect(widget->window, &widget->allocation, 
     988                               FALSE); 
     989 
     990  } 
     991 
     992protected: 
     993  PopplerDocument * doc; 
     994  int current_page; 
     995  int current_face; 
     996  const int total_pages; 
     997  int frame; 
     998  double lookposx, lookposy, lookposz; 
     999  double atx, aty, atz; 
     1000  double persp, angle; 
     1001  GdkPixbuf *pixmap; 
     1002  int texmap[3]; 
     1003 
     1004  // OpenGL Textures 
     1005  GLuint textures[3]; 
     1006 
     1007  // Width and Height of the rendered pixmap (aspect 
     1008  // ratio is fixed, should instead depend on the  
     1009  // aspect ratio of the pdf page) 
     1010  static const gint tex_width = (gint) (3 * 1024 / 2); 
     1011  static const gint tex_height = (gint) (3 * 768 / 2); 
     1012 
     1013  void 
     1014  render_page(GdkPixbuf * pm, int i, gint iWidth, gint iHeight) { 
     1015    PopplerPage *page; 
     1016    page = poppler_document_get_page(doc, i); 
     1017    double w, h; 
     1018    poppler_page_get_size(page, &w, &h); 
     1019    poppler_page_render_to_pixbuf(page, 0, 0, iWidth, iHeight, 
     1020                                  1.0 * iWidth / w, 0, pm); 
     1021  } 
     1022 
     1023  void 
     1024  drawCube(void) { 
     1025    int i; 
     1026 
     1027    for (i = 0; i < 6; i++) { 
     1028      if (i == current_face) { 
     1029        glEnable(GL_TEXTURE_RECTANGLE_ARB); 
     1030        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
     1031                      textures[texmap[0]]); 
     1032      } else if (i == prev_face()) { 
     1033        glEnable(GL_TEXTURE_RECTANGLE_ARB); 
     1034        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
     1035                      textures[texmap[1]]); 
     1036      } else if (i == next_face()) { 
     1037        glEnable(GL_TEXTURE_RECTANGLE_ARB); 
     1038        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 
     1039                      textures[texmap[2]]); 
     1040      } else if (i <= 3) { 
     1041        glDisable(GL_TEXTURE_RECTANGLE_ARB); 
     1042        glColor4f(0.4, 0.0, 0.0, 1.0); 
     1043      } else { 
     1044        glDisable(GL_TEXTURE_RECTANGLE_ARB); 
     1045        glColor4f(1.0, 1.0, 1.0, 1.0); 
     1046      } 
     1047      glPolygonMode(GL_FRONT, GL_FILL); 
     1048      glBegin(GL_QUADS); 
     1049      //      glNormal3fv(&n[i][0]); 
     1050      glTexCoord2f((1.0 - mapping[i][4]) * tex_width, 
     1051                   mapping[i][5] * tex_height); 
     1052      glVertex3fv(&v[faces[i][0]][0]); 
     1053 
     1054      glTexCoord2f((1.0 - mapping[i][6]) * tex_width, 
     1055                   mapping[i][7] * tex_height); 
     1056      glVertex3fv(&v[faces[i][1]][0]); 
     1057 
     1058      glTexCoord2f((1.0 - mapping[i][0]) * tex_width, 
     1059                   mapping[i][1] * tex_height); 
     1060      glVertex3fv(&v[faces[i][2]][0]); 
     1061 
     1062      glTexCoord2f((1.0 - mapping[i][2]) * tex_width, 
     1063                   mapping[i][3] * tex_height); 
     1064      glVertex3fv(&v[faces[i][3]][0]); 
     1065 
     1066      glEnd(); 
     1067    } 
     1068  } 
    10931069}; 
    10941070 
    10951071GLfloat 
    1096     pdfcube::n[6][3] = { 
    1097         {0.0, 0.0, -1.0} 
    1098         , {1.0, 0.0, 0.0} 
    1099         , {0.0, 0.0, 1.0} 
    1100         , {-1.0, 0.0, 0.0} 
    1101         , 
    1102         {0.0, 1.0, 0.0} 
    1103         , {0.0, -1.0, 0.0} 
     1072pdfcube::n[6][3] = { 
     1073  {0.0, 0.0, -1.0} 
     1074  , {1.0, 0.0, 0.0} 
     1075  , {0.0, 0.0, 1.0} 
     1076  , {-1.0, 0.0, 0.0} 
     1077  , 
     1078  {0.0, 1.0, 0.0} 
     1079  , {0.0, -1.0, 0.0} 
    11041080}; 
    11051081GLint 
    1106     pdfcube::faces[6][4] = { 
    1107         {7, 4, 0, 3} 
    1108         , {7, 6, 5, 4} 
    1109         , {5, 6, 2, 1} 
    1110         , {0, 1, 2, 3} 
    1111         , 
    1112         {3, 2, 6, 7} 
    1113         , {4, 5, 1, 0} 
     1082pdfcube::faces[6][4] = { 
     1083  {7, 4, 0, 3} 
     1084  , {7, 6, 5, 4} 
     1085  , {5, 6, 2, 1} 
     1086  , {0, 1, 2, 3} 
     1087  , 
     1088  {3, 2, 6, 7} 
     1089  , {4, 5, 1, 0} 
    11141090}; 
    11151091GLfloat 
    1116     pdfcube::mapping[6][8] = { 
    1117         {1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0} 
    1118         , 
    1119         {0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0} 
    1120         , 
    1121         {0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0} 
    1122         , 
    1123         {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0} 
    1124         , 
    1125         {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0} 
    1126         ,                       // top 
    1127         {1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0} 
    1128         ,                       // bottom 
     1092pdfcube::mapping[6][8] = { 
     1093  {1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0} 
     1094  , 
     1095  {0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0} 
     1096  , 
     1097  {0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0} 
     1098  , 
     1099  {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0} 
     1100  , 
     1101  {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0} 
     1102  ,                     // top 
     1103  {1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0} 
     1104  ,                     // bottom 
    11291105}; 
    11301106 
    11311107pdfcube * 
    1132     pc; 
     1108pc; 
    11331109 
    11341110////////////////////////////////////////////////////////////////////////// 
     
    11431119realize(GtkWidget * widget, gpointer data) 
    11441120{ 
    1145         GdkGLContext * 
    1146             glcontext = gtk_widget_get_gl_context(widget); 
    1147         GdkGLDrawable * 
    1148             gldrawable = gtk_widget_get_gl_drawable(widget); 
    1149  
    1150 #ifdef DEBUG_MODE 
    1151         g_print("%s: \"realize\"\n", gtk_widget_get_name(widget)); 
    1152 #endif 
    1153         //g_mutex_lock (gl_mutex); 
     1121  GdkGLContext * 
     1122    glcontext = gtk_widget_get_gl_context(widget); 
     1123  GdkGLDrawable * 
     1124    gldrawable = gtk_widget_get_gl_drawable(widget); 
     1125 
     1126#ifndef NDEBUG 
     1127  g_print("%s: \"realize\"\n", gtk_widget_get_name(widget)); 
     1128#endif 
     1129  //g_mutex_lock (gl_mutex); 
    11541130 
    11551131  /*** OpenGL BEGIN ***/ 
    1156         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
    1157                 return; 
    1158  
    1159         pc->initialize(widget); 
    1160  
    1161         gdk_gl_drawable_gl_end(gldrawable); 
     1132  if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
     1133    return; 
     1134 
     1135  pc->initialize(widget); 
     1136 
     1137  gdk_gl_drawable_gl_end(gldrawable); 
    11621138  /*** OpenGL END ***/ 
    1163         //g_mutex_unlock (gl_mutex); 
     1139  //g_mutex_unlock (gl_mutex); 
    11641140} 
    11651141 
     
    11711147 ***/ 
    11721148static 
    1173     gboolean 
     1149gboolean 
    11741150configure_event(GtkWidget * widget, GdkEventConfigure * event, gpointer data) 
    11751151{ 
    1176         GdkGLContext * 
    1177             glcontext = gtk_widget_get_gl_context(widget); 
    1178         GdkGLDrawable * 
    1179             gldrawable = gtk_widget_get_gl_drawable(widget); 
    1180  
    1181         GLsizei 
    1182             w = widget->allocation.width; 
    1183         GLsizei 
    1184             h = widget->allocation.height; 
    1185  
    1186 #ifdef DEBUG_MODE 
    1187         g_print("%s: \"configure_event\"\n", gtk_widget_get_name(widget)); 
    1188 #endif 
    1189         //g_mutex_lock (gl_mutex); 
     1152  GdkGLContext * 
     1153    glcontext = gtk_widget_get_gl_context(widget); 
     1154  GdkGLDrawable * 
     1155    gldrawable = gtk_widget_get_gl_drawable(widget); 
     1156 
     1157  GLsizei 
     1158    w = widget->allocation.width; 
     1159  GLsizei 
     1160    h = widget->allocation.height; 
     1161 
     1162#ifndef NDEBUG 
     1163  g_print("%s: \"configure_event\"\n", gtk_widget_get_name(widget)); 
     1164#endif 
     1165  //g_mutex_lock (gl_mutex); 
    11901166  /*** OpenGL BEGIN ***/ 
    1191         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
    1192                 return FALSE; 
    1193  
    1194         glViewport(0, 0, w, h); 
    1195  
    1196         gdk_gl_drawable_gl_end(gldrawable); 
    1197  
    1198  /*** OpenGL END ***/ 
    1199         //g_mutex_unlock (gl_mutex); 
    1200  
    1201         return TRUE; 
     1167  if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
     1168    return FALSE; 
     1169 
     1170  glViewport(0, 0, w, h); 
     1171 
     1172  gdk_gl_drawable_gl_end(gldrawable); 
     1173 
     1174  /*** OpenGL END ***/ 
     1175  //g_mutex_unlock (gl_mutex); 
     1176 
     1177  return TRUE; 
    12021178} 
    12031179 
     
    12081184 ***/ 
    12091185static 
    1210     gboolean 
     1186gboolean 
    12111187expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data) 
    12121188{ 
    1213         GdkGLContext * 
    1214             glcontext = gtk_widget_get_gl_context(widget); 
    1215         GdkGLDrawable * 
    1216             gldrawable = gtk_widget_get_gl_drawable(widget); 
    1217  
    1218         //g_mutex_lock (gl_mutex); 
     1189  GdkGLContext * 
     1190    glcontext = gtk_widget_get_gl_context(widget); 
     1191  GdkGLDrawable * 
     1192    gldrawable = gtk_widget_get_gl_drawable(widget); 
     1193 
     1194  //g_mutex_lock (gl_mutex); 
    12191195  /*** OpenGL BEGIN ***/ 
    1220         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
    1221                 return FALSE; 
    1222  
    1223         glDrawBuffer(GL_BACK); 
    1224  
    1225         pc->redraw(widget); 
    1226  
    1227         /* Swap buffers */ 
    1228         if (gdk_gl_drawable_is_double_buffered(gldrawable)) 
    1229                 gdk_gl_drawable_swap_buffers(gldrawable); 
    1230         else 
    1231                 glFlush(); 
    1232  
    1233         gdk_gl_drawable_gl_end(gldrawable); 
     1196  if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
     1197    return FALSE; 
     1198 
     1199  glDrawBuffer(GL_BACK); 
     1200 
     1201  pc->redraw(widget); 
     1202 
     1203  /* Swap buffers */ 
     1204  if (gdk_gl_drawable_is_double_buffered(gldrawable)) 
     1205    gdk_gl_drawable_swap_buffers(gldrawable); 
     1206  else 
     1207    glFlush(); 
     1208 
     1209  gdk_gl_drawable_gl_end(gldrawable); 
    12341210  /*** OpenGL END ***/ 
    12351211 
    1236         //g_mutex_unlock (gl_mutex); 
    1237  
    1238         return TRUE; 
     1212  //g_mutex_unlock (gl_mutex); 
     1213 
     1214  return TRUE; 
    12391215} 
    12401216 
     
    12451221 ***/ 
    12461222static 
    1247     gboolean 
     1223gboolean 
    12481224timeout(GtkWidget * widget) 
    12491225{ 
    1250         /* Invalidate the whole window. */ 
    1251         gdk_window_invalidate_rect(widget->window, &widget->allocation, FALSE); 
    1252  
    1253         /* Update synchronously. */ 
    1254         gdk_window_process_updates(widget->window, FALSE); 
    1255  
    1256         return TRUE; 
     1226  /* Invalidate the whole window. */ 
     1227  gdk_window_invalidate_rect(widget->window, &widget->allocation, FALSE); 
     1228 
     1229  /* Update synchronously. */ 
     1230  gdk_window_process_updates(widget->window, FALSE); 
     1231 
     1232  return TRUE; 
    12571233} 
    12581234 
     
    12641240unrealize(GtkWidget * widget, gpointer data) 
    12651241{ 
    1266         GdkGLContext * 
    1267             glcontext = gtk_widget_get_gl_context(widget); 
    1268         GdkGLDrawable * 
    1269             gldrawable = gtk_widget_get_gl_drawable(widget); 
    1270  
    1271 #ifdef DEBUG_MODE 
    1272         g_print("%s: \"unrealize\"\n", gtk_widget_get_name(widget)); 
    1273 #endif 
    1274         //g_mutex_lock (gl_mutex); 
     1242  GdkGLContext * 
     1243    glcontext = gtk_widget_get_gl_context(widget); 
     1244  GdkGLDrawable * 
     1245    gldrawable = gtk_widget_get_gl_drawable(widget); 
     1246 
     1247#ifndef NDEBUG 
     1248  g_print("%s: \"unrealize\"\n", gtk_widget_get_name(widget)); 
     1249#endif 
     1250  //g_mutex_lock (gl_mutex); 
    12751251 
    12761252  /*** OpenGL BEGIN ***/ 
    1277         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
    1278                 return; 
    1279  
    1280         gdk_gl_drawable_gl_end(gldrawable); 
     1253  if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) 
     1254    return; 
     1255 
     1256  gdk_gl_drawable_gl_end(gldrawable); 
    12811257  /*** OpenGL END ***/ 
    1282         //g_mutex_unlock (gl_mutex); 
     1258  //g_mutex_unlock (gl_mutex); 
    12831259} 
    12841260 
     
    12881264 ***/ 
    12891265static 
    1290     gboolean 
     1266gboolean 
    12911267motion_notify_event(GtkWidget * widget, GdkEventMotion * event, gpointer data) 
    12921268{ 
    1293 #ifdef DEBUG_MODE 
    1294         g_print("%s: \"motion_notify_event\": button", 
    1295                 gtk_widget_get_name(widget)); 
    1296         if (event->state & GDK_BUTTON1_MASK) { 
    1297                 g_print(" 1"); 
    1298         } 
    1299  
    1300         if (event->state & GDK_BUTTON2_MASK) { 
    1301                 g_print(" 2"); 
    1302         } 
    1303  
    1304         if (event->state & GDK_BUTTON3_MASK) { 
    1305                 g_print(" 3"); 
    1306         } 
    1307  
    1308         g_print("\n"); 
    1309 #endif 
    1310         return FALSE; 
     1269#ifndef NDEBUG 
     1270  g_print("%s: \"motion_notify_event\": button", 
     1271          gtk_widget_get_name(widget)); 
     1272  if (event->state & GDK_BUTTON1_MASK) { 
     1273    g_print(" 1"); 
     1274  } 
     1275 
     1276  if (event->state & GDK_BUTTON2_MASK) { 
     1277    g_print(" 2"); 
     1278  } 
     1279 
     1280  if (event->state & GDK_BUTTON3_MASK) { 
     1281    g_print(" 3"); 
     1282  } 
     1283 
     1284  g_print("\n"); 
     1285#endif 
     1286  return FALSE; 
    13111287} 
    13121288 
     
    13171293 ***/ 
    13181294static 
    1319     gboolean 
     1295gboolean 
    13201296button_press_event(GtkWidget * widget, GdkEventButton * event, gpointer data) 
    13211297{ 
    1322 #ifdef DEBUG_MODE 
    1323         g_print("%s: \"button_press_event\": ", gtk_widget_get_name(widget)); 
    1324 #endif 
    1325         if (event->button == 1) { 
    1326 #ifdef DEBUG_MODE 
    1327                 g_print("button 1\n"); 
    1328 #endif 
    1329                 return TRUE; 
    1330         } 
    1331  
    1332         if (event->button == 2) { 
    1333 #ifdef DEBUG_MODE 
    1334                 g_print("button 2\n"); 
    1335 #endif 
    1336                 return TRUE; 
    1337         } 
    1338 #ifdef DEBUG_MODE 
    1339         g_print("\n"); 
    1340 #endif 
    1341         return FALSE; 
     1298#ifndef NDEBUG 
     1299  g_print("%s: \"button_press_event\": ", gtk_widget_get_name(widget)); 
     1300#endif 
     1301  if (event->button == 1) { 
     1302#ifndef NDEBUG 
     1303    g_print("button 1\n"); 
     1304#endif 
     1305    return TRUE; 
     1306  } 
     1307 
     1308  if (event->button == 2) { 
     1309#ifndef NDEBUG 
     1310    g_print("button 2\n"); 
     1311#endif 
     1312    return TRUE; 
     1313  } 
     1314#ifndef NDEBUG 
     1315  g_print("\n"); 
     1316#endif 
     1317  return FALSE; 
    13421318} 
    13431319 
     
    13471323 ***/ 
    13481324static 
    1349     gboolean 
     1325gboolean 
    13501326key_press_event(GtkWidget * widget, GdkEventKey * event, gpointer data) 
    13511327{ 
    1352 #ifdef DEBUG_MODE 
    1353         g_print("%s: \"key_press_event\": ", gtk_widget_get_name(widget)); 
    1354 #endif 
    1355         if (event->state == GDK_CONTROL_MASK) 
    1356  
    1357                 switch (event->keyval) { 
    1358                 case GDK_1: 
    1359                 case GDK_2: 
    1360                 case GDK_3: 
    1361                 case GDK_4: 
    1362                 case GDK_5: 
    1363                 case GDK_6: 
    1364                 case GDK_7: 
    1365                 case GDK_8: 
    1366                 case GDK_9: 
    1367 #ifdef DEBUG_MODE 
    1368                         g_print("n key\n"); 
    1369 #endif 
    1370                         if (sleeping()) 
    1371                                 pc->section(widget, event->keyval - GDK_1 + 1); 
    1372                         break; 
    1373  
    1374                         // Let's quit 
    1375                 case GDK_q: 
    1376 #ifdef DEBUG_MODE 
    1377                         g_print("Escape key\n"); 
    1378 #endif 
    1379                         gtk_main_quit(); 
    1380                         break; 
    1381  
    1382                         // Update all textures 
    1383                 case GDK_l: 
    1384 #ifdef DEBUG_MODE 
    1385                         g_print("u key\n"); 
    1386                         cerr << "Pagina: " << pc->page() << endl; 
    1387 #endif 
    1388                         pc->reset(widget); 
    1389                         break; 
    1390         } else 
    1391                 switch (event->keyval) { 
    1392  
    1393                         // return to page 1 
    1394                 case GDK_1: 
    1395                 case GDK_2: 
    1396                 case GDK_3: 
    1397                 case GDK_4: 
    1398                 case GDK_5: 
    1399                 case GDK_6: 
    1400                 case GDK_7: 
    1401                 case GDK_8: 
    1402                 case GDK_9: 
    1403 #ifdef DEBUG_MODE 
    1404                         g_print("n key\n"); 
    1405 #endif 
    1406                         if (sleeping()) 
    1407                                 pc->go_to(widget, (event->keyval - GDK_1) * 5); 
    1408                         break; 
    1409  
    1410                         // Animated Cube Advancement 
    1411                 case GDK_a: 
    1412 #ifdef DEBUG_MODE 
    1413                         g_print("a key\n"); 
    1414 #endif 
    1415                         if (sleeping()) 
    1416                                 start_animation(widget, CUBE_PREV); 
    1417  
    1418                         break; 
    1419                 case GDK_c: 
    1420 #ifdef DEBUG_MODE 
    1421                         g_print("c key\n"); 
    1422 #endif 
    1423                         if (sleeping()) 
    1424                                 start_animation(widget, CUBE_NEXT); 
    1425                         break; 
    1426  
    1427                         // Quick switch to next page 
    1428                 case GDK_Page_Down: 
    1429                 case GDK_Right: 
    1430 #ifdef DEBUG_MODE 
    1431                         g_print("s key\n"); 
    1432 #endif 
    1433                         if (sleeping()) 
    1434                                 start_animation(widget, SWITCH_FW); 
    1435                         break; 
    1436  
    1437                         // Quick switch to previous page 
    1438                 case GDK_Page_Up: 
    1439                 case GDK_Left: 
    1440 #ifdef DEBUG_MODE 
    1441                         g_print("q key\n"); 
    1442 #endif 
    1443                         if (sleeping()) 
    1444                                 start_animation(widget, SWITCH_BW); 
    1445                         break; 
    1446  
    1447                 case GDK_g: 
    1448                         if (sleeping()) 
    1449                                 if (last_animation >= 
    1450                                     ZOOM1 and last_animation <= ZOOMC) 
    1451                                         start_animation(widget, ZOOM0); 
    1452                         break; 
    1453  
    1454                 case GDK_h: 
    1455                         if (sleeping()) 
    1456                                 if (last_animation >= 
    1457                                     ZOOM1 and last_animation <= ZOOMC) 
    1458                                         start_animation(widget, ZOOM0); 
    1459                                 else 
    1460                                         start_animation(widget, ZOOM1); 
    1461                         break; 
    1462  
    1463                 case GDK_j: 
    1464                         if (sleeping()) 
    1465                                 if (last_animation >= 
    1466                                     ZOOM1 and last_animation <= ZOOMC) 
    1467                                         start_animation(widget, ZOOM0); 
    1468                                 else 
    1469                                         start_animation(widget, ZOOM2); 
    1470                         break; 
    1471  
    1472                 case GDK_k: 
    1473                         if (sleeping()) 
    1474                                 if (last_animation >= 
    1475                                     ZOOM1 and last_animation <= ZOOMC) 
    1476                                         start_animation(widget, ZOOM0); 
    1477                                 else 
    1478                                         start_animation(widget, ZOOM3); 
    1479                         break; 
    1480  
    1481                 case GDK_l: 
    1482                         if (sleeping()) 
    1483                                 if (last_animation >= 
    1484                                     ZOOM1 and last_animation <= ZOOMC) 
    1485                                         start_animation(widget, ZOOM0); 
    1486                                 else 
    1487                                         start_animation(widget, ZOOM4); 
    1488                         break; 
    1489  
    1490                 case GDK_z: 
    1491                         if (sleeping()) 
    1492                                 if (last_animation >= 
    1493                                     ZOOM1 and last_animation <= ZOOMC) 
    1494                                         start_animation(widget, ZOOM0); 
    1495                                 else 
    1496                                         start_animation(widget, ZOOMC); 
    1497                         break; 
    1498  
    1499                         // Automatic advance (you should se the Animated slides on the command line) 
    1500                 case GDK_space: 
    1501                         if (page_transition[pc->page()]and sleeping()) 
    1502                                 start_animation(widget, CUBE_NEXT); 
    1503                         else if (sleeping()) 
    1504                                 start_animation(widget, SWITCH_FW); 
    1505  
    1506                         break; 
    1507  
    1508                         // switch fullscreen 
    1509                 case GDK_f: 
    1510                         if ((fullscreen = !fullscreen) == true) 
    1511                                 gtk_window_fullscreen((GtkWindow *) (data)); 
    1512                         else 
    1513                                 gtk_window_unfullscreen((GtkWindow *) (data)); 
    1514                         break; 
    1515  
    1516                         // Let's quit 
    1517                 case GDK_Escape: 
    1518 #ifdef DEBUG_MODE 
    1519                         g_print("Escape key\n"); 
    1520 #endif 
    1521                         gtk_main_quit(); 
    1522                         break; 
    1523  
    1524                 default: 
    1525 #ifdef DEBUG_MODE 
    1526                         g_print("\n"); 
    1527 #endif 
    1528                         return FALSE; 
    1529                 } 
    1530  
    1531         return TRUE; 
     1328#ifndef NDEBUG 
     1329  g_print("%s: \"key_press_event\": ", gtk_widget_get_name(widget)); 
     1330#endif 
     1331  if (event->state == GDK_CONTROL_MASK) 
     1332 
     1333    switch (event->keyval) { 
     1334    case GDK_1: 
     1335    case GDK_2: 
     1336    case GDK_3: 
     1337    case GDK_4: 
     1338    case GDK_5: 
     1339    case GDK_6: 
     1340    case GDK_7: 
     1341    case GDK_8: 
     1342    case GDK_9: 
     1343#ifndef NDEBUG 
     1344      g_print("n key\n"); 
     1345#endif 
     1346      if (sleeping()) 
     1347        pc->section(widget, event->keyval - GDK_1 + 1); 
     1348      break; 
     1349 
     1350      // Let's quit 
     1351    case GDK_q: 
     1352#ifndef NDEBUG 
     1353      g_print("Escape key\n"); 
     1354#endif 
     1355      gtk_main_quit(); 
     1356      break; 
     1357 
     1358      // Update all textures 
     1359    case GDK_l: 
     1360#ifndef NDEBUG 
     1361      g_print("u key\n"); 
     1362      cerr << "Pagina: " << pc->page() << endl; 
     1363#endif 
     1364      pc->reset(widget); 
     1365      break; 
     1366    } else 
     1367    switch (event->keyval) { 
     1368 
     1369      // return to page 1 
     1370    case GDK_1: 
     1371    case GDK_2: 
     1372    case GDK_3: 
     1373    case GDK_4: 
     1374    case GDK_5: 
     1375    case GDK_6: 
     1376    case GDK_7: 
     1377    case GDK_8: 
     1378    case GDK_9: 
     1379#ifndef NDEBUG 
     1380      g_print("n key\n"); 
     1381#endif 
     1382      if (sleeping()) 
     1383        pc->go_to(widget, (event->keyval - GDK_1) * 5); 
     1384      break; 
     1385 
     1386      // Animated Cube Advancement 
     1387    case GDK_a: 
     1388#ifndef NDEBUG 
     1389      g_print("a key\n"); 
     1390#endif 
     1391      if (sleeping()) 
     1392        start_animation(widget, CUBE_PREV); 
     1393 
     1394      break; 
     1395    case GDK_c: 
     1396#ifndef NDEBUG 
     1397      g_print("c key\n"); 
     1398#endif 
     1399      if (sleeping()) 
     1400        start_animation(widget, CUBE_NEXT); 
     1401      break; 
     1402 
     1403      // Quick switch to next page 
     1404    case GDK_Page_Down: 
     1405    case GDK_Right: 
     1406#ifndef NDEBUG 
     1407      g_print("s key\n"); 
     1408#endif 
     1409      if (sleeping()) 
     1410        start_animation(widget, SWITCH_FW); 
     1411      break; 
     1412 
     1413      // Quick switch to previous page 
     1414    case GDK_Page_Up: 
     1415    case GDK_Left: 
     1416#ifndef NDEBUG 
     1417      g_print("q key\n"); 
     1418#endif 
     1419      if (sleeping()) 
     1420        start_animation(widget, SWITCH_BW); 
     1421      break; 
     1422 
     1423    case GDK_g: 
     1424      if (sleeping()) 
     1425        if (last_animation >= 
     1426            ZOOM1 and last_animation <= ZOOMC) 
     1427          start_animation(widget, ZOOM0); 
     1428      break; 
     1429 
     1430    case GDK_h: 
     1431      if (sleeping()) 
     1432        if (last_animation >= 
     1433            ZOOM1 and last_animation <= ZOOMC) 
     1434          start_animation(widget, ZOOM0); 
     1435        else 
     1436          start_animation(widget, ZOOM1); 
     1437      break; 
     1438 
     1439    case GDK_j: 
     1440      if (sleeping()) 
     1441        if (last_animation >= 
     1442            ZOOM1 and last_animation <= ZOOMC) 
     1443          start_animation(widget, ZOOM0); 
     1444        else 
     1445          start_animation(widget, ZOOM2); 
     1446      break; 
     1447 
     1448    case GDK_k: 
     1449      if (sleeping()) 
     1450        if (last_animation >= 
     1451            ZOOM1 and last_animation <= ZOOMC) 
     1452          start_animation(widget, ZOOM0); 
     1453        else 
     1454          start_animation(widget, ZOOM3); 
     1455      break; 
     1456 
     1457    case GDK_l: 
     1458      if (sleeping()) 
     1459        if (last_animation >= 
     1460            ZOOM1 and last_animation <= ZOOMC) 
     1461          start_animation(widget, ZOOM0); 
     1462        else 
     1463          start_animation(widget, ZOOM4); 
     1464      break; 
     1465 
     1466    case GDK_z: 
     1467      if (sleeping()) 
     1468        if (last_animation >= 
     1469            ZOOM1 and last_animation <= ZOOMC) 
     1470          start_animation(widget, ZOOM0); 
     1471        else 
     1472          start_animation(widget, ZOOMC); 
     1473      break; 
     1474 
     1475      // Automatic advance (you should se the Animated slides on the command line) 
     1476    case GDK_space: 
     1477      if (page_transition[pc->page()]and sleeping()) 
     1478        start_animation(widget, CUBE_NEXT); 
     1479      else if (sleeping()) 
     1480        start_animation(widget, SWITCH_FW); 
     1481 
     1482      break; 
     1483 
     1484      // switch fullscreen 
     1485    case GDK_f: 
     1486      if ((fullscreen = !fullscreen) == true) 
     1487        gtk_window_fullscreen((GtkWindow *) (data)); 
     1488      else 
     1489        gtk_window_unfullscreen((GtkWindow *) (data)); 
     1490      break; 
     1491 
     1492      // Let's quit 
     1493    case GDK_Escape: 
     1494#ifndef NDEBUG 
     1495      g_print("Escape key\n"); 
     1496#endif 
     1497      gtk_main_quit(); 
     1498      break; 
     1499 
     1500    default: 
     1501#ifndef NDEBUG 
     1502      g_print("\n"); 
     1503#endif 
     1504      return FALSE; 
     1505    } 
     1506 
     1507  return TRUE; 
    15321508} 
    15331509 
     
    15401516 
    15411517static guint 
    1542     timeout_id = 0; 
     1518timeout_id = 0; 
    15431519 
    15441520static void 
    15451521timeout_add(GtkWidget * widget) 
    15461522{ 
    1547         if (timeout_id == 0) { 
    1548                 timeout_id = g_timeout_add(TIMEOUT_INTERVAL, 
    1549                                            (GSourceFunc) timeout, widget); 
    1550         } 
     1523  if (timeout_id == 0) { 
     1524    timeout_id = g_timeout_add(TIMEOUT_INTERVAL, 
     1525                               (GSourceFunc) timeout, widget); 
     1526  } 
    15511527} 
    15521528 
     
    15541530timeout_remove(GtkWidget * widget) 
    15551531{ 
    1556         if (timeout_id != 0) { 
    1557                 g_source_remove(timeout_id); 
    1558                 timeout_id = 0; 
    1559         } 
     1532  if (timeout_id != 0) { 
     1533    g_source_remove(timeout_id); 
     1534    timeout_id = 0; 
     1535  } 
    15601536} 
    15611537 
     
    15651541 ***/ 
    15661542static 
    1567     gboolean 
     1543gboolean 
    15681544map_event(GtkWidget * widget, GdkEvent * event, gpointer data) 
    15691545{ 
    1570 #ifdef DEBUG_MODE 
    1571         g_print("%s: \"map_event\":\n", gtk_widget_get_name(widget)); 
    1572 #endif 
    1573         if (animating) 
    1574                 timeout_add(widget); 
    1575  
    1576         return TRUE; 
     1546#ifndef NDEBUG 
     1547  g_print("%s: \"map_event\":\n", gtk_widget_get_name(widget)); 
     1548#endif 
     1549  if (animating) 
     1550    timeout_add(widget); 
     1551 
     1552  return TRUE; 
    15771553} 
    15781554 
     
    15821558 ***/ 
    15831559static 
    1584     gboolean 
     1560gboolean 
    15851561unmap_event(GtkWidget * widget, GdkEvent * event, gpointer data) 
    15861562{ 
    1587 #ifdef DEBUG_MODE 
    1588         g_print("%s: \"unmap_event\":\n", gtk_widget_get_name(widget)); 
    1589 #endif 
    1590         timeout_remove(widget); 
    1591  
    1592         return TRUE; 
     1563#ifndef NDEBUG 
     1564  g_print("%s: \"unmap_event\":\n", gtk_widget_get_name(widget)); 
     1565#endif 
     1566  timeout_remove(widget); 
     1567 
     1568  return TRUE; 
    15931569} 
    15941570 
     
    15991575 ***/ 
    16001576static 
    1601     gboolean 
     1577gboolean 
    16021578visibility_notify_event(GtkWidget * widget, 
    16031579                        GdkEventVisibility * event, gpointer data) 
    16041580{ 
    1605         if (animating) { 
    1606                 if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) 
    1607                         timeout_remove(widget); 
    1608                 else 
    1609                         timeout_add(widget); 
    1610         } 
    1611  
    1612         return TRUE; 
     1581  if (animating) { 
     1582    if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) 
     1583      timeout_remove(widget); 
     1584    else 
     1585      timeout_add(widget); 
     1586  } 
     1587 
     1588  return TRUE; 
    16131589} 
    16141590 
     
    16231599start_animation(GtkWidget * widget, enum animation a) 
    16241600{ 
    1625         if (sleeping()) { 
    1626                 animating = true; 
    1627                 previous_animation = last_animation; 
    1628                 last_animation = active_animation = a; 
    1629                 timeout_add(widget); 
    1630         } 
     1601  if (sleeping()) { 
     1602    animating = true; 
     1603    previous_animation = last_animation; 
     1604    last_animation = active_animation = a; 
     1605    timeout_add(widget); 
     1606  } 
    16311607} 
    16321608 
     
    16341610stop_animation(GtkWidget * widget) 
    16351611{ 
    1636         animating = false; 
    1637         timeout_remove(widget); 
    1638         gdk_window_invalidate_rect(widget->window, &widget->allocation, FALSE); 
    1639         gdk_window_process_updates(widget->window, FALSE); 
     1612  animating = false; 
     1613  timeout_remove(widget); 
     1614  gdk_window_invalidate_rect(widget->window, &widget->allocation, FALSE); 
     1615  gdk_window_process_updates(widget->window, FALSE); 
    16401616} 
    16411617 
     
    16501626create_window(GdkGLConfig * glconfig) 
    16511627{ 
    1652         GtkWidget * 
    1653             window; 
    1654         GtkWidget * 
    1655             vbox; 
    1656         GtkWidget * 
    1657             drawing_area; 
    1658  
    1659         /* 
    1660         * Top-level window. 
    1661         */ 
    1662  
    1663         window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    1664         gtk_window_set_title(GTK_WINDOW(window), DEFAULT_TITLE); 
    1665  
    1666         /* Get automatically redrawn if any of their children changed allocation. */ 
    1667         gtk_container_set_reallocate_redraws(GTK_CONTAINER(window), TRUE); 
    1668  
    1669         /* Connect signal handlers to the window */ 
    1670         g_signal_connect(G_OBJECT(window), "delete_event", 
    1671                         G_CALLBACK(gtk_main_quit), NULL); 
    1672  
    1673         /* 
    1674         * VBox. 
    1675         */ 
    1676  
    1677         vbox = gtk_vbox_new(FALSE, 0); 
    1678         gtk_container_add(GTK_CONTAINER(window), vbox); 
    1679         gtk_widget_show(vbox); 
    1680  
    1681         /* 
    1682         * Drawing area to draw OpenGL scene. 
    1683         */ 
    1684  
    1685         drawing_area = gtk_drawing_area_new(); 
    1686         gtk_widget_set_size_request(drawing_area, DEFAULT_WIDTH, 
    1687                                     DEFAULT_HEIGHT); 
    1688  
    1689         /* Set OpenGL-capability to the widget */ 
    1690         gtk_widget_set_gl_capability(drawing_area, 
    1691                                      glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); 
    1692  
    1693         gtk_widget_add_events(drawing_area, 
    1694                               GDK_BUTTON1_MOTION_MASK | 
    1695                               GDK_BUTTON2_MOTION_MASK | 
    1696                               GDK_BUTTON_PRESS_MASK | 
    1697                               GDK_VISIBILITY_NOTIFY_MASK); 
    1698  
    1699         /* Connect signal handlers to the drawing area */ 
    1700         g_signal_connect_after(G_OBJECT(drawing_area), "realize", 
    1701                                G_CALLBACK(realize), NULL); 
    1702         g_signal_connect(G_OBJECT(drawing_area), "configure_event", 
    1703                         G_CALLBACK(configure_event), NULL); 
    1704         g_signal_connect(G_OBJECT(drawing_area), "expose_event", 
    1705                         G_CALLBACK(expose_event), NULL); 
    1706         g_signal_connect(G_OBJECT(drawing_area), "unrealize", 
    1707                         G_CALLBACK(unrealize), NULL); 
    1708  
    1709         g_signal_connect(G_OBJECT(drawing_area), "motion_notify_event", 
    1710                         G_CALLBACK(motion_notify_event), NULL); 
    1711         g_signal_connect(G_OBJECT(drawing_area), "button_press_event", 
    1712                         G_CALLBACK(button_press_event), NULL); 
    1713  
    1714         /* key_press_event handler for top-level window */ 
    1715         g_signal_connect_swapped(G_OBJECT(window), "key_press_event", 
    1716                                 G_CALLBACK(key_press_event), drawing_area); 
    1717  
    1718         /* For timeout function. */ 
    1719         g_signal_connect(G_OBJECT(drawing_area), "map_event", 
    1720                         G_CALLBACK(map_event), NULL); 
    1721         g_signal_connect(G_OBJECT(drawing_area), "unmap_event", 
    1722                         G_CALLBACK(unmap_event), NULL); 
    1723         g_signal_connect(G_OBJECT(drawing_area), "visibility_notify_event", 
    1724                         G_CALLBACK(visibility_notify_event), NULL); 
    1725  
    1726         gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0); 
    1727  
    1728         gtk_widget_show(drawing_area); 
    1729  
    1730         return window; 
     1628  GtkWidget * 
     1629    window; 
     1630  GtkWidget * 
     1631    vbox; 
     1632  GtkWidget * 
     1633    drawing_area; 
     1634 
     1635  /* 
     1636  * Top-level window. 
     1637  */ 
     1638 
     1639  window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
     1640  gtk_window_set_title(GTK_WINDOW(window), DEFAULT_TITLE); 
     1641 
     1642  /* Get automatically redrawn if any of their children changed allocation. */ 
     1643  gtk_container_set_reallocate_redraws(GTK_CONTAINER(window), TRUE); 
     1644 
     1645  /* Connect signal handlers to the window */ 
     1646  g_signal_connect(G_OBJECT(window), "delete_event", 
     1647                  G_CALLBACK(gtk_main_quit), NULL); 
     1648 
     1649  /* 
     1650  * VBox. 
     1651  */ 
     1652 
     1653  vbox = gtk_vbox_new(FALSE, 0); 
     1654  gtk_container_add(GTK_CONTAINER(window), vbox); 
     1655  gtk_widget_show(vbox); 
     1656 
     1657  /* 
     1658  * Drawing area to draw OpenGL scene. 
     1659  */ 
     1660 
     1661  drawing_area = gtk_drawing_area_new(); 
     1662  gtk_widget_set_size_request(drawing_area, DEFAULT_WIDTH, 
     1663                              DEFAULT_HEIGHT); 
     1664 
     1665  /* Set OpenGL-capability to the widget */ 
     1666  gtk_widget_set_gl_capability(drawing_area, 
     1667                               glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); 
     1668 
     1669  gtk_widget_add_events(drawing_area, 
     1670                        GDK_BUTTON1_MOTION_MASK | 
     1671                        GDK_BUTTON2_MOTION_MASK | 
     1672                        GDK_BUTTON_PRESS_MASK | 
     1673                        GDK_VISIBILITY_NOTIFY_MASK); 
     1674 
     1675  /* Connect signal handlers to the drawing area */ 
     1676  g_signal_connect_after(G_OBJECT(drawing_area), "realize", 
     1677                         G_CALLBACK(realize), NULL); 
     1678  g_signal_connect(G_OBJECT(drawing_area), "configure_event", 
     1679                  G_CALLBACK(configure_event), NULL); 
     1680  g_signal_connect(G_OBJECT(drawing_area), "expose_event", 
     1681                  G_CALLBACK(expose_event), NULL); 
     1682  g_signal_connect(G_OBJECT(drawing_area), "unrealize", 
     1683                  G_CALLBACK(unrealize), NULL); 
     1684 
     1685  g_signal_connect(G_OBJECT(drawing_area), "motion_notify_event", 
     1686                  G_CALLBACK(motion_notify_event), NULL); 
     1687  g_signal_connect(G_OBJECT(drawing_area), "button_press_event", 
     1688                  G_CALLBACK(button_press_event), NULL); 
     1689 
     1690  /* key_press_event handler for top-level window */ 
     1691  g_signal_connect_swapped(G_OBJECT(window), "key_press_event", 
     1692                          G_CALLBACK(key_press_event), drawing_area); 
     1693 
     1694  /* For timeout function. */ 
     1695  g_signal_connect(G_OBJECT(drawing_area), "map_event", 
     1696                  G_CALLBACK(map_event), NULL); 
     1697  g_signal_connect(G_OBJECT(drawing_area), "unmap_event", 
     1698                  G_CALLBACK(unmap_event), NULL); 
     1699  g_signal_connect(G_OBJECT(drawing_area), "visibility_notify_event", 
     1700                  G_CALLBACK(visibility_notify_event), NULL); 
     1701 
     1702  gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0); 
     1703 
     1704  gtk_widget_show(drawing_area); 
     1705 
     1706  return window; 
    17311707} 
    17321708 
     
    17371713configure_gl(void) 
    17381714{ 
    1739         GdkGLConfig * 
    1740             glconfig; 
    1741  
    1742         /* Try double-buffered visual */ 
    1743         glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode) 
    1744                                              (GDK_GL_MODE_RGBA | 
    1745                                               GDK_GL_MODE_ALPHA | 
    1746                                               GDK_GL_MODE_RGB | 
    1747                                               GDK_GL_MODE_DEPTH | 
    1748                                               GDK_GL_MODE_DOUBLE)); 
    1749         if (glconfig == NULL) { 
    1750                 g_print("\n*** Cannot find the double-buffered visual.\n"); 
    1751                 g_print("\n*** Trying single-buffered visual.\n"); 
    1752  
    1753                 /* Try single-buffered visual */ 
    1754                 glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode) 
    1755                                                     (GDK_GL_MODE_RGB | 
    1756                                                       GDK_GL_MODE_DEPTH)); 
    1757                 if (glconfig == NULL) { 
    1758                         g_print 
    1759                             ("*** No appropriate OpenGL-capable visual found.\n"); 
    1760                         exit(1); 
    1761                 } 
    1762         } 
    1763  
    1764         return glconfig; 
     1715  GdkGLConfig * 
     1716    glconfig; 
     1717 
     1718  /* Try double-buffered visual */ 
     1719  glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode) 
     1720                                       (GDK_GL_MODE_RGBA | 
     1721                                        GDK_GL_MODE_ALPHA | 
     1722                                        GDK_GL_MODE_RGB | 
     1723                                        GDK_GL_MODE_DEPTH | 
     1724                                        GDK_GL_MODE_DOUBLE)); 
     1725  if (glconfig == NULL) { 
     1726    g_print("\n*** Cannot find the double-buffered visual.\n"); 
     1727    g_print("\n*** Trying single-buffered visual.\n"); 
     1728 
     1729    /* Try single-buffered visual */ 
     1730    glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode) 
     1731                                        (GDK_GL_MODE_RGB | 
     1732                                          GDK_GL_MODE_DEPTH)); 
     1733    if (glconfig == NULL) { 
     1734      g_print 
     1735        ("*** No appropriate OpenGL-capable visual found.\n"); 
     1736      exit(1); 
     1737    } 
     1738  } 
     1739 
     1740  return glconfig; 
    17651741} 
    17661742 
     
    17801756get_absolute_file_name(const gchar * fileName) 
    17811757{ 
    1782         gchar * 
    1783             absoluteFileName = NULL; 
    1784         if (g_path_is_absolute(fileName)) { 
    1785                 absoluteFileName = g_strdup(fileName); 
    1786         } else { 
    1787                 gchar * 
    1788                     currentDir = g_get_current_dir(); 
    1789                 absoluteFileName = g_build_filename(currentDir, fileName, NULL); 
    1790                 g_free(currentDir); 
    1791         } 
    1792  
    1793         return absoluteFileName; 
     1758  gchar * 
     1759    absoluteFileName = NULL; 
     1760  if (g_path_is_absolute(fileName)) { 
     1761    absoluteFileName = g_strdup(fileName); 
     1762  } else { 
     1763    gchar * 
     1764      currentDir = g_get_current_dir(); 
     1765    absoluteFileName = g_build_filename(currentDir, fileName, NULL); 
     1766    g_free(currentDir); 
     1767  } 
     1768 
     1769  return absoluteFileName; 
    17941770} 
    17951771 
     
    18001776main(int argc, char *argv[]) 
    18011777{ 
    1802         GtkWidget * 
    1803             window; 
    1804         GdkGLConfig * 
    1805             glconfig; 
    1806  
    1807         /* Initialize GTK. */ 
    1808         gtk_init(&argc, &argv); 
    1809  
    1810         /* Initialize GtkGLExt. */ 
    1811         gtk_gl_init(&argc, &argv); 
    1812  
    1813         /* Configure OpenGL framebuffer. */ 
    1814         glconfig = configure_gl(); 
    1815  
    1816         if (argc < 2) { 
    1817                 perror("usage: pdfcube file_uri [cube_page ...]"); 
    1818                 exit(1); 
    1819         } 
    1820         gchar * 
    1821             absoluteFileName = get_absolute_file_name(argv[1]); 
    1822         gchar * 
    1823             filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL); 
    1824         g_free(absoluteFileName); 
    1825         if (NULL == filename_uri) { 
    1826                 cerr << "Errore nel nome del file" << endl; 
    1827         } 
    1828         PopplerDocument * 
    1829             document = poppler_document_new_from_file(filename_uri, NULL, NULL); 
    1830  
    1831         if (document == NULL) { 
    1832                 perror("invaild pdf file"); 
    1833                 exit(2); 
    1834         } 
    1835  
    1836         pc = new pdfcube(document); 
    1837  
    1838         page_transition = new bool[pc->pages()]; 
    1839  
    1840         for (int ii = 0; ii < pc->pages(); ii++) { 
    1841                 page_transition[ii] = false; 
    1842         } 
    1843  
    1844         for (int ii = 2; ii < argc; ii++) { 
    1845                 page_transition[atoi(argv[ii])] = true; 
    1846         } 
    1847  
    1848         /* Create and show the application window. */ 
    1849         window = create_window(glconfig); 
    1850  
    1851         if (fullscreen) 
    1852                 gtk_window_fullscreen((GtkWindow *) (window)); 
    1853  
    1854         gtk_widget_show(window); 
    1855  
    1856         gtk_main(); 
    1857  
    1858         return 0; 
     1778  GtkWidget * 
     1779    window; 
     1780  GdkGLConfig * 
     1781    glconfig; 
     1782 
     1783  /* Initialize GTK. */ 
     1784  gtk_init(&argc, &argv); 
     1785 
     1786  /* Initialize GtkGLExt. */ 
     1787  gtk_gl_init(&argc, &argv); 
     1788 
     1789  /* Configure OpenGL framebuffer. */ 
     1790  glconfig = configure_gl(); 
     1791 
     1792  if (argc < 2) { 
     1793    perror("usage: pdfcube file_uri [cube_page ...]"); 
     1794    exit(1); 
     1795  } 
     1796  gchar * 
     1797    absoluteFileName = get_absolute_file_name(argv[1]); 
     1798  gchar * 
     1799    filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL); 
     1800  g_free(absoluteFileName); 
     1801  if (NULL == filename_uri) { 
     1802    cerr << "Errore nel nome del file" << endl; 
     1803  } 
     1804  PopplerDocument * 
     1805    document = poppler_document_new_from_file(filename_uri, NULL, NULL); 
     1806 
     1807  if (document == NULL) { 
     1808    perror("invaild pdf file"); 
     1809    exit(2); 
     1810  } 
     1811 
     1812  pc = new pdfcube(document); 
     1813 
     1814  page_transition = new bool[pc->pages()]; 
     1815 
     1816  for (int ii = 0; ii < pc->pages(); ii++) { 
     1817    page_transition[ii] = false; 
     1818  } 
     1819 
     1820  for (int ii = 2; ii < argc; ii++) { 
     1821    page_transition[atoi(argv[ii])] = true; 
     1822  } 
     1823 
     1824  /* Create and show the application window. */ 
     1825  window = create_window(glconfig); 
     1826 
     1827  if (fullscreen) 
     1828    gtk_window_fullscreen((GtkWindow *) (window)); 
     1829 
     1830  gtk_widget_show(window); 
     1831 
     1832  gtk_main(); 
     1833 
     1834  return 0; 
    18591835} 
    18601836