⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glut_compatability.cxx

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CXX
字号:
//// "$Id: glut_compatability.cxx,v 1.1.1.1 2003/08/07 21:18:41 jasonk Exp $"//// GLUT emulation routines for the Fast Light Tool Kit (FLTK).//// Copyright 1998-1999 by Bill Spitzak and others.//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Library General Public// License as published by the Free Software Foundation; either// version 2 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Library General Public License for more details.//// You should have received a copy of the GNU Library General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307// USA.//// Please report all bugs and problems to "fltk-bugs@easysw.com".//// Emulation of Glut using fltk.// GLUT is Copyright (c) Mark J. Kilgard, 1994, 1995, 1996.// "This program is freely distributable without licensing fees  and is// provided without guarantee or warrantee expressed or  implied. This// program is -not- in the public domain."// Although I have copied the GLUT API, none of my code is based on// any Glut implementation details and is therefore covered by the LGPL.#include <config.h>#if HAVE_GL#include <FL/glut.H>#define MAXWINDOWS 32static Fl_Glut_Window *windows[MAXWINDOWS+1];Fl_Glut_Window *glut_window;int glut_menu;void (*glut_menustate_function)(int);void (*glut_menustatus_function)(int,int,int);static void default_reshape(int w, int h) {glViewport(0,0,w,h);}void Fl_Glut_Window::make_current() {  glut_window = this;  if (shown()) Fl_Gl_Window::make_current();}static int indraw;void Fl_Glut_Window::draw() {  glut_window = this;  indraw = 1;  if (!valid()) {reshape(w(),h()); valid(1);}  display();  indraw = 0;}void glutSwapBuffers() {  if (!indraw) glut_window->swap_buffers();}void Fl_Glut_Window::draw_overlay() {  glut_window = this;  if (!valid()) {reshape(w(),h()); valid(1);}  overlaydisplay();}static void domenu(int, int, int);int Fl_Glut_Window::handle(int event) {  make_current();  int ex = Fl::event_x();  int ey = Fl::event_y();  int button;  switch (event) {  case FL_PUSH:    button = Fl::event_button()-1;    if (button<0) button = 0;    if (button>2) button = 2;    if (menu[button]) {domenu(menu[button],ex,ey); return 1;}    mouse_down |= 1<<button;    if (mouse) {mouse(button,GLUT_DOWN,ex,ey); return 1;}    if (motion) return 1;    break;  case FL_RELEASE:    for (button = 0; button < 3; button++) if (mouse_down & (1<<button)) {      if (mouse) mouse(button,GLUT_UP,ex,ey);    }    mouse_down = 0;    return 1;  case FL_ENTER:    if (entry) {entry(GLUT_ENTERED); return 1;}    if (passivemotion) return 1;    break;  case FL_LEAVE:    if (entry) {entry(GLUT_LEFT); return 1;}    if (passivemotion) return 1;    break;  case FL_DRAG:    if (motion) {motion(ex, ey); return 1;}    break;  case FL_MOVE:    if (passivemotion) {passivemotion(ex, ey); return 1;}    break;  case FL_FOCUS:    if (keyboard || special) return 1;    break;  case FL_KEYBOARD:    if (Fl::event_text()[0]) {      if (keyboard) {keyboard(Fl::event_text()[0],ex,ey); return 1;}      break;    } else {      if (special) {	int i = Fl::event_key();	if (i > FL_F && i <= FL_F_Last) i = i-FL_F;	special(i,ex,ey);	return 1;      }      break;    }  case FL_HIDE:    if (visibility) visibility(GLUT_NOT_VISIBLE);    break;  case FL_SHOW:    if (visibility) visibility(GLUT_VISIBLE);    break;  }  return Fl_Gl_Window::handle(event);}static int glut_mode = GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;void Fl_Glut_Window::_init() {  for (number=1; number<MAXWINDOWS; number++) if (!windows[number]) break;  windows[number] = this;  menu[0] = menu[1] = menu[2] = 0;  reshape = default_reshape;  keyboard = 0;  mouse = 0;  motion = 0;  passivemotion = 0;  entry = 0;  visibility = 0;  special = 0;  mouse_down = 0;  mode(glut_mode);}Fl_Glut_Window::Fl_Glut_Window(int w, int h, const char *t) :  Fl_Gl_Window(w,h,t) {_init();}Fl_Glut_Window::Fl_Glut_Window(int x,int y,int w,int h, const char *t) :  Fl_Gl_Window(x,y,w,h,t) {_init();}static int initargc;static char **initargv;void glutInit(int *argc, char **argv) {  initargc = *argc;  initargv = new char*[*argc+1];  int i,j;  for (i=0; i<=*argc; i++) initargv[i] = argv[i];  for (i=j=1; i<*argc; ) {    if (Fl::arg(*argc,argv,i));    else argv[j++] = argv[i++];  }  argv[j] = 0;  *argc = j;}void glutInitDisplayMode(unsigned int mode) {  glut_mode = mode;}void glutMainLoop() {Fl::run();}////////////////////////////////////////////////////////////////static int initx, inity, initw=300, inith=300, initpos;void glutInitWindowPosition(int x, int y) {  initx = x; inity = y; initpos = 1;}void glutInitWindowSize(int w, int h) {  initw = w; inith = h;}int glutCreateWindow(char *title) {  Fl_Glut_Window *W;  if (initpos) {    W = new Fl_Glut_Window(initx,inity,initw,inith,title);    initpos = 0;  } else {    W = new Fl_Glut_Window(initw,inith,title);  }  W->resizable(W);  if (initargc) {    W->show(initargc,initargv);    initargc = 0;  } else {    W->show();  }  W->make_current();  return W->number;}int glutCreateSubWindow(int win, int x, int y, int w, int h) {  Fl_Glut_Window *W = new Fl_Glut_Window(x,y,w,h,0);  windows[win]->add(W);  if (windows[win]->shown()) W->show();  W->make_current();  return W->number;}Fl_Glut_Window::~Fl_Glut_Window() {  if (glut_window == this) glut_window = 0;  windows[number] = 0;}void glutDestroyWindow(int win) {  // should destroy children!!!  delete windows[win];}void glutSetWindow(int win) {  windows[win]->make_current();}////////////////////////////////////////////////////////////////#include <FL/Fl_Menu_Item.H>struct menu {  void (*cb)(int);  Fl_Menu_Item *m;  int size;  int alloc;};#define MAXMENUS 32static menu menus[MAXMENUS+1];static void domenu(int n, int ex, int ey) {  glut_menu = n;  menu *m = &menus[n];  if (glut_menustate_function) glut_menustate_function(1);  if (glut_menustatus_function) glut_menustatus_function(1,ex,ey);  const Fl_Menu_Item* g = m->m->popup(Fl::event_x(), Fl::event_y(), 0);  if (g && g->callback_) ((void (*)(int))(g->callback_))(int(g->argument()));  if (glut_menustatus_function) glut_menustatus_function(0,ex,ey);  if (glut_menustate_function) glut_menustate_function(0);}int glutCreateMenu(void (*cb)(int)) {  int i;  for (i=1; i<MAXMENUS; i++) if (!menus[i].cb) break;  menu *m = &menus[i];  m->cb = cb;  return glut_menu = i;}void glutDestroyMenu(int n) {  menu *m = &menus[n];  delete[] m->m;  m->m = 0;  m->cb = 0;  m->size = m->alloc = 0;}static Fl_Menu_Item* additem(menu *m) {  if (m->size+1 >= m->alloc) {    m->alloc = m->size*2+10;    Fl_Menu_Item* nm = new Fl_Menu_Item[m->alloc];    for (int i=0; i<m->size; i++) nm[i] = m->m[i];    delete[] m->m;    m->m = nm;  }  int n = m->size++;  m->m[n+1].text = 0;  Fl_Menu_Item* i = &(m->m[n]);  i->shortcut_ = 0;  i->flags = 0;  i->labeltype_ = i->labelfont_ = i->labelsize_ = i->labelcolor_ = 0;  return i;}void glutAddMenuEntry(char *label, int value) {  menu *m = &menus[glut_menu];  Fl_Menu_Item* i = additem(m);  i->text = label;  i->callback_ = (Fl_Callback*)(m->cb);  i->user_data_ = (void *)value;}void glutAddSubMenu(char *label, int submenu) {  menu *m = &menus[glut_menu];  Fl_Menu_Item* i = additem(m);  i->text = label;  i->callback_ = 0;  i->user_data_ = (void *)(menus[submenu].m);  i->flags = FL_PUP_SUBMENU;}void glutChangeToMenuEntry(int item, char *label, int value) {  menu *m = &menus[glut_menu];  Fl_Menu_Item* i = &m->m[item-1];  i->text = label;  i->callback_ = (Fl_Callback*)(m->cb);  i->user_data_ = (void *)value;  i->flags = 0;}void glutChangeToSubMenu(int item, char *label, int submenu) {  menu *m = &menus[glut_menu];  Fl_Menu_Item* i = &m->m[item-1];  i->text = label;  i->callback_ = 0;  i->user_data_ = (void *)(menus[submenu].m);  i->flags = FL_PUP_SUBMENU;}void glutRemoveMenuItem(int item) {  menu *m = &menus[glut_menu];  if (item > m->size || item < 1) return;  for (int i = item-1; i <= m->size; i++) m->m[i] = m->m[i+1];  m->size--;}////////////////////////////////////////////////////////////////int glutGet(GLenum type) {  switch (type) {  case GLUT_RETURN_ZERO: return 0;  case GLUT_WINDOW_X: return glut_window->x();  case GLUT_WINDOW_Y: return glut_window->y();  case GLUT_WINDOW_WIDTH: return glut_window->w();  case GLUT_WINDOW_HEIGHT: return glut_window->h();  case GLUT_WINDOW_PARENT:    if (glut_window->parent())      return ((Fl_Glut_Window *)(glut_window->parent()))->number;    else      return 0;//case GLUT_WINDOW_NUM_CHILDREN://case GLUT_WINDOW_CURSOR: return   case GLUT_SCREEN_WIDTH: return Fl::w();  case GLUT_SCREEN_HEIGHT: return Fl::h();//case GLUT_SCREEN_WIDTH_MM://case GLUT_SCREEN_HEIGHT_MM:  case GLUT_MENU_NUM_ITEMS: return menus[glut_menu].size;  case GLUT_DISPLAY_MODE_POSSIBLE: return Fl_Gl_Window::can_do(glut_mode);  case GLUT_INIT_WINDOW_X: return initx;  case GLUT_INIT_WINDOW_Y: return inity;  case GLUT_INIT_WINDOW_WIDTH: return initw;  case GLUT_INIT_WINDOW_HEIGHT: return inith;  case GLUT_INIT_DISPLAY_MODE: return glut_mode;//case GLUT_ELAPSED_TIME:  case GLUT_WINDOW_BUFFER_SIZE:    if (glutGet(GLUT_WINDOW_RGBA))      return glutGet(GLUT_WINDOW_RED_SIZE)+	glutGet(GLUT_WINDOW_GREEN_SIZE)+	glutGet(GLUT_WINDOW_BLUE_SIZE)+	glutGet(GLUT_WINDOW_ALPHA_SIZE);    else      return glutGet(GLUT_WINDOW_COLORMAP_SIZE);  default: {GLint p; glGetIntegerv(type, &p); return p;}  }}int glutLayerGet(GLenum type) {  switch (type) {  case GLUT_OVERLAY_POSSIBLE: return glut_window->can_do_overlay();//case GLUT_LAYER_IN_USE://case GLUT_HAS_OVERLAY:  case GLUT_TRANSPARENT_INDEX: return 0; // true for SGI  case GLUT_NORMAL_DAMAGED: return glut_window->damage();  case GLUT_OVERLAY_DAMAGED: return 1; // kind of works...  default: return 0;  }}#endif//// End of "$Id: glut_compatability.cxx,v 1.1.1.1 2003/08/07 21:18:41 jasonk Exp $".//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -