mirror of https://github.com/fltk/fltk
Replaced remaining _WIN32 symbols with WIN32
Stuff from work: Removed reference to unused GL/glu.h header file, which is missing on some Linux systems. Fl_Gl_Window has a new method to allow you to get and set the context: void Fl_Gl_Window::context(void*, int destroy = 0) void* Fl_Gl_Window::context() const; Return or set a pointer to the GLContext that this window is using. This is a system-dependent structure, but it is portable to copy the context from one window to another. You can also set it to NULL, which will force FLTK to recreate the context the next time make_current() is called, this is useful for getting around bugs in OpenGL implementations. If destroy_flag is true the context will be destroyed by fltk when the window is destroyed, or when the mode() is changed, or the next time context(x) is called. Some cleanup of Fl_Gl_Choice to move most of the system dependent #ifdefs into Fl_Gl_Choice.cxx. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1413 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
8470c05b58
commit
97234fb3e2
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: Fl_Gl_Window.H,v 1.7.2.3 2001/01/22 15:13:37 easysw Exp $"
|
||||
// "$Id: Fl_Gl_Window.H,v 1.7.2.4 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// OpenGL header file for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -27,6 +27,10 @@
|
|||
|
||||
#include "Fl_Window.H"
|
||||
|
||||
#ifndef GLContext
|
||||
typedef void* GLContext; // actually a GLXContext or HGLDC
|
||||
#endif
|
||||
|
||||
class Fl_Gl_Choice; // structure to hold result of glXChooseVisual
|
||||
|
||||
class Fl_Gl_Window : public Fl_Window {
|
||||
|
@ -34,7 +38,7 @@ class Fl_Gl_Window : public Fl_Window {
|
|||
int mode_;
|
||||
const int *alist;
|
||||
Fl_Gl_Choice *g;
|
||||
void * context; // actually a GLXContext
|
||||
GLContext context_;
|
||||
char valid_;
|
||||
char damage1_; // damage() of back buffer
|
||||
virtual FL_EXPORT void draw_overlay();
|
||||
|
@ -66,14 +70,16 @@ public:
|
|||
int mode(int a) {return mode(a,0);}
|
||||
int mode(const int *a) {return mode(0, a);}
|
||||
|
||||
void* context() const {return context_;}
|
||||
FL_EXPORT void context(void*, int destroy_flag = false);
|
||||
FL_EXPORT void make_current();
|
||||
FL_EXPORT void swap_buffers();
|
||||
FL_EXPORT void ortho();
|
||||
|
||||
FL_EXPORT int can_do_overlay();
|
||||
FL_EXPORT void redraw_overlay();
|
||||
FL_EXPORT void hide_overlay();
|
||||
|
||||
FL_EXPORT void make_current();
|
||||
FL_EXPORT void make_overlay_current();
|
||||
FL_EXPORT void swap_buffers();
|
||||
FL_EXPORT void ortho();
|
||||
|
||||
FL_EXPORT ~Fl_Gl_Window();
|
||||
Fl_Gl_Window(int W, int H, const char *l=0) : Fl_Window(W,H,l) {init();}
|
||||
|
@ -84,5 +90,5 @@ public:
|
|||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Window.H,v 1.7.2.3 2001/01/22 15:13:37 easysw Exp $".
|
||||
// End of "$Id: Fl_Gl_Window.H,v 1.7.2.4 2001/03/14 17:20:01 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: glut.H,v 1.6.2.9 2001/01/22 15:13:38 easysw Exp $"
|
||||
// "$Id: glut.H,v 1.6.2.10 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// GLUT emulation header file for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -45,7 +45,7 @@
|
|||
#define __glut_h__
|
||||
|
||||
#include <FL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
//#include <GL/glu.h>
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Glut is emulated using this window class and these static variables
|
||||
|
@ -431,7 +431,7 @@ extern "C" {
|
|||
extern int APIENTRY glutExtensionSupported(char *name);
|
||||
|
||||
/* Stroke font constants (use these in GLUT program). */
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
#ifdef WIN32
|
||||
# define GLUT_STROKE_ROMAN ((void*)0)
|
||||
# define GLUT_STROKE_MONO_ROMAN ((void*)1)
|
||||
#else
|
||||
|
@ -470,5 +470,5 @@ extern void APIENTRY glutSolidIcosahedron();
|
|||
#endif /* __glut_h__ */
|
||||
|
||||
//
|
||||
// End of "$Id: glut.H,v 1.6.2.9 2001/01/22 15:13:38 easysw Exp $".
|
||||
// End of "$Id: glut.H,v 1.6.2.10 2001/03/14 17:20:01 spitzak Exp $".
|
||||
//
|
||||
|
|
7
Makefile
7
Makefile
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# "$Id: Makefile,v 1.12.2.5 2001/01/22 15:13:37 easysw Exp $"
|
||||
# "$Id: Makefile,v 1.12.2.6 2001/03/14 17:20:01 spitzak Exp $"
|
||||
#
|
||||
# Top-level makefile for the Fast Light Tool Kit (FLTK).
|
||||
#
|
||||
|
@ -68,6 +68,9 @@ distclean: clean
|
|||
makeinclude: configure configh.in makeinclude.in
|
||||
./configure
|
||||
|
||||
configure: configure.in
|
||||
autoconf
|
||||
|
||||
#
|
||||
# End of "$Id: Makefile,v 1.12.2.5 2001/01/22 15:13:37 easysw Exp $".
|
||||
# End of "$Id: Makefile,v 1.12.2.6 2001/03/14 17:20:01 spitzak Exp $".
|
||||
#
|
||||
|
|
|
@ -41,6 +41,7 @@ very well for single-buffered. </P>
|
|||
</UL>
|
||||
</TD><TD align=left valign=top>
|
||||
<UL>
|
||||
<LI><A href=#Fl_Gl_Window.context>context</A></LI>
|
||||
<LI><A href=#Fl_Gl_Window.draw>draw</A></LI>
|
||||
<LI><A href=#Fl_Gl_Window.draw_overlay>draw_overlay</A></LI>
|
||||
<LI><A href=#Fl_Gl_Window.handle>handle</A></LI>
|
||||
|
@ -120,6 +121,22 @@ window a child of another window if you wish to do this! </P>
|
|||
<BR> int Fl_Gl_Window::can_do() const</A></H4>
|
||||
Returns non-zero if the hardware supports the given or current OpenGL
|
||||
mode.
|
||||
|
||||
<h4><a name=Fl_Gl_Window.context>void* Fl_Gl_Window::context() const;
|
||||
<br>void Fl_Gl_Window::context(void*, int destroy_flag = false);</a></h4>
|
||||
|
||||
Return or set a pointer to the GLContext that this window is
|
||||
using. This is a system-dependent structure, but it is portable to copy
|
||||
the context from one window to another. You can also set it to NULL,
|
||||
which will force FLTK to recreate the context the next time <a
|
||||
href=#make_current><tt>make_current()</tt></a> is called, this is
|
||||
useful for getting around bugs in OpenGL implementations.
|
||||
|
||||
<p>If <i>destroy_flag</i> is true the context will be destroyed by
|
||||
fltk when the window is destroyed, or when the <a
|
||||
href=#mode><tt>mode()</tt></a> is changed, or the next time
|
||||
<tt>context(x)</tt> is called.
|
||||
|
||||
<H4><A name=Fl_Gl_Window.valid>char Fl_Gl_Window::valid() const
|
||||
<BR> void Fl_Gl_Window::valid(char i)</A></H4>
|
||||
<TT>Fl_Gl_Window::valid()</TT> is turned off when FLTK creates a new
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: Fl_Gl_Choice.H,v 1.4.2.5 2001/01/22 15:13:39 easysw Exp $"
|
||||
// "$Id: Fl_Gl_Choice.H,v 1.4.2.6 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// OpenGL definitions for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -20,42 +20,49 @@
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
// USA.
|
||||
//
|
||||
// Please report all bugs and problems to "fltk-bugs@fltk.org".
|
||||
// Please report all bugs and problems to "fltk-bugs@easysw.com".
|
||||
//
|
||||
|
||||
// Internal interface to set up OpenGL.
|
||||
//
|
||||
// A "Fl_Gl_Choice" is used to cache results of calling the
|
||||
// OpenGL code for system-specific information needed to
|
||||
// implement a "mode".
|
||||
// For X this is a visual, and this must be called *before*
|
||||
// the X window is created.
|
||||
// For win32 this can be delayed to a more convienent time,
|
||||
// as it only returns information for modifying a device
|
||||
// context.
|
||||
// This is used by Fl_Gl_Window, gl_start(), and gl_visual()
|
||||
// A "Fl_Gl_Choice" is created from an OpenGL mode and holds information
|
||||
// necessary to create a window (on X) and to create an OpenGL "context"
|
||||
// (on both X and Win32).
|
||||
//
|
||||
// fl_create_gl_context takes a window (necessary only on Win32) and an
|
||||
// Fl_Gl_Choice and returns a new OpenGL context. All contexts share
|
||||
// display lists with each other.
|
||||
//
|
||||
// On X another fl_create_gl_context is provided to create it for any
|
||||
// X visual.
|
||||
//
|
||||
// fl_set_gl_context makes the given OpenGL context current and makes
|
||||
// it draw into the passed window. It tracks the current one context
|
||||
// to avoid calling the context switching code when the same context
|
||||
// is used, though it is a mystery to me why the GLX/WGL libraries
|
||||
// don't do this themselves...
|
||||
//
|
||||
// fl_no_gl_context clears that cache so the next fl_set_gl_context is
|
||||
// guaranteed to work.
|
||||
//
|
||||
// fl_delete_gl_context destroys the context.
|
||||
//
|
||||
// This code is used by Fl_Gl_Window, gl_start(), and gl_visual()
|
||||
|
||||
#ifndef Fl_Gl_Choice_H
|
||||
#define Fl_Gl_Choice_H
|
||||
|
||||
// Warning: whatever GLContext is defined to must take exactly the same
|
||||
// space in a structure as a void*!!!
|
||||
#ifdef WIN32
|
||||
# include <windows.h>
|
||||
# include <FL/gl.h>
|
||||
# define GLXContext HGLRC
|
||||
# define GLX_BUFFER_SIZE 1
|
||||
# define GLX_RGBA 2
|
||||
# define GLX_GREEN_SIZE 3
|
||||
# define GLX_ALPHA_SIZE 4
|
||||
# define GLX_ACCUM_GREEN_SIZE 5
|
||||
# define GLX_ACCUM_ALPHA_SIZE 6
|
||||
# define GLX_DOUBLEBUFFER 7
|
||||
# define GLX_DEPTH_SIZE 8
|
||||
# define GLX_STENCIL_SIZE 9
|
||||
# define GLContext HGLRC
|
||||
#else
|
||||
# include <GL/glx.h>
|
||||
# define GLContext GLXContext
|
||||
#endif
|
||||
|
||||
// one of these structures is returned:
|
||||
// Describes crap needed to create a GLContext.
|
||||
class Fl_Gl_Choice {
|
||||
int mode;
|
||||
const int *alist;
|
||||
|
@ -68,28 +75,35 @@ public:
|
|||
XVisualInfo *vis; // the visual to use
|
||||
Colormap colormap; // a colormap for that visual
|
||||
#endif
|
||||
uchar r,d,o; // rgb mode, double buffered, overlay flags
|
||||
// Return one of these structures for a given gl mode.
|
||||
// The second argument is a glX attribute list, and is used if mode is
|
||||
// zero. This is not supported on Win32:
|
||||
static Fl_Gl_Choice *find(int mode, const int *);
|
||||
};
|
||||
|
||||
extern GLXContext fl_first_context; // used to make all contexts share
|
||||
extern GLXContext fl_current_context;
|
||||
|
||||
class Fl_Window;
|
||||
|
||||
#ifdef WIN32
|
||||
// This must be called before fl_set_gl_context works:
|
||||
HDC fl_private_dc(Fl_Window*, int, Fl_Gl_Choice **gp);
|
||||
|
||||
GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice*, int layer=0);
|
||||
|
||||
#else
|
||||
|
||||
GLContext fl_create_gl_context(XVisualInfo* vis);
|
||||
|
||||
static inline
|
||||
GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice* g) {
|
||||
return fl_create_gl_context(g->vis);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void fl_set_gl_context(Fl_Window*, GLXContext);
|
||||
void fl_set_gl_context(Fl_Window*, GLContext);
|
||||
void fl_no_gl_context();
|
||||
void fl_delete_gl_context(GLContext);
|
||||
|
||||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Choice.H,v 1.4.2.5 2001/01/22 15:13:39 easysw Exp $".
|
||||
// End of "$Id: Fl_Gl_Choice.H,v 1.4.2.6 2001/03/14 17:20:01 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: Fl_Gl_Choice.cxx,v 1.5.2.5 2001/01/22 15:13:39 easysw Exp $"
|
||||
// "$Id: Fl_Gl_Choice.cxx,v 1.5.2.6 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// OpenGL visual selection code for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -20,7 +20,7 @@
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
// USA.
|
||||
//
|
||||
// Please report all bugs and problems to "fltk-bugs@fltk.org".
|
||||
// Please report all bugs and problems to "fltk-bugs@easysw.com".
|
||||
//
|
||||
|
||||
#include <config.h>
|
||||
|
@ -32,7 +32,6 @@
|
|||
#include "Fl_Gl_Choice.H"
|
||||
|
||||
static Fl_Gl_Choice *first;
|
||||
GLXContext fl_first_context;
|
||||
|
||||
// this assummes one of the two arguments is zero:
|
||||
// We keep the list system in Win32 to stay compatible and interpret
|
||||
|
@ -143,16 +142,8 @@ Fl_Gl_Choice *Fl_Gl_Choice::find(int mode, const int *alist) {
|
|||
#ifdef WIN32
|
||||
g->pixelformat = pixelformat;
|
||||
g->pfd = chosen_pfd;
|
||||
g->d = ((mode&FL_DOUBLE) != 0);
|
||||
g->r = (mode & FL_INDEX);
|
||||
g->o = 0; // not an overlay
|
||||
#else
|
||||
g->vis = vis;
|
||||
g->colormap = 0;
|
||||
int i;
|
||||
glXGetConfig(fl_display, vis, GLX_DOUBLEBUFFER, &i); g->d = i;
|
||||
glXGetConfig(fl_display, vis, GLX_RGBA, &i); g->r = i;
|
||||
glXGetConfig(fl_display, vis, GLX_LEVEL, &i); g->o = i;
|
||||
|
||||
if (/*MaxCmapsOfScreen(ScreenOfDisplay(fl_display,fl_screen))==1 && */
|
||||
vis->visualid == fl_visual->visualid &&
|
||||
|
@ -166,36 +157,50 @@ Fl_Gl_Choice *Fl_Gl_Choice::find(int mode, const int *alist) {
|
|||
return g;
|
||||
}
|
||||
|
||||
static GLContext first_context;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
HDC fl_private_dc(Fl_Window* w, int mode, Fl_Gl_Choice **gp) {
|
||||
Fl_X* i = Fl_X::i(w);
|
||||
if (!i->private_dc) {
|
||||
i->private_dc = GetDCEx(i->xid, 0, DCX_CACHE);
|
||||
Fl_Gl_Choice *g = Fl_Gl_Choice::find(mode, 0);
|
||||
if (gp) *gp = g;
|
||||
GLContext fl_create_gl_context(Fl_Window* window, const Fl_Gl_Choice* g, int layer) {
|
||||
Fl_X* i = Fl_X::i(window);
|
||||
HDC hdc = i->private_dc;
|
||||
if (!hdc) {
|
||||
hdc = i->private_dc = GetDCEx(i->xid, 0, DCX_CACHE);
|
||||
SetPixelFormat(i->private_dc, g->pixelformat, &g->pfd);
|
||||
#if USE_COLORMAP
|
||||
if (fl_palette) SelectPalette(i->private_dc, fl_palette, FALSE);
|
||||
#endif
|
||||
}
|
||||
return i->private_dc;
|
||||
GLContext context =
|
||||
layer ? wglCreateLayerContext(hdc, layer) : wglCreateContext(hdc);
|
||||
if (context) {
|
||||
if (first_context) wglShareLists(first_context, context);
|
||||
else first_context = context;
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
GLContext fl_create_gl_context(XVisualInfo* vis) {
|
||||
GLContext context = glXCreateContext(fl_display, vis, first_context, 1);
|
||||
if (!first_context) first_context = context;
|
||||
return context;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static GLXContext cached_context;
|
||||
|
||||
static GLContext cached_context;
|
||||
static Fl_Window* cached_window;
|
||||
|
||||
void fl_set_gl_context(Fl_Window* w, GLXContext c) {
|
||||
if (c != cached_context || w != cached_window) {
|
||||
cached_context = c;
|
||||
void fl_set_gl_context(Fl_Window* w, GLContext context) {
|
||||
if (context != cached_context || w != cached_window) {
|
||||
cached_context = context;
|
||||
cached_window = w;
|
||||
#ifdef WIN32
|
||||
wglMakeCurrent(Fl_X::i(w)->private_dc, c);
|
||||
wglMakeCurrent(Fl_X::i(w)->private_dc, context);
|
||||
#else
|
||||
glXMakeCurrent(fl_display, fl_xid(w), c);
|
||||
glXMakeCurrent(fl_display, fl_xid(w), context);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -210,8 +215,19 @@ void fl_no_gl_context() {
|
|||
#endif
|
||||
}
|
||||
|
||||
void fl_delete_gl_context(GLContext context) {
|
||||
if (cached_context == context) fl_no_gl_context();
|
||||
if (context != first_context) {
|
||||
#ifdef WIN32
|
||||
wglDeleteContext(context);
|
||||
#else
|
||||
glXDestroyContext(fl_display, context);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Choice.cxx,v 1.5.2.5 2001/01/22 15:13:39 easysw Exp $".
|
||||
// End of "$Id: Fl_Gl_Choice.cxx,v 1.5.2.6 2001/03/14 17:20:01 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.14 2001/01/22 15:13:39 easysw Exp $"
|
||||
// "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.15 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// OpenGL overlay code for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -20,21 +20,25 @@
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
// USA.
|
||||
//
|
||||
// Please report all bugs and problems to "fltk-bugs@fltk.org".
|
||||
// Please report all bugs and problems to "fltk-bugs@easysw.com".
|
||||
//
|
||||
|
||||
#include <config.h>
|
||||
#if HAVE_GL
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Gl_Window.H>
|
||||
#include <FL/x.H>
|
||||
#include "Fl_Gl_Choice.H"
|
||||
#include <FL/Fl_Gl_Window.H>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if HAVE_GL_OVERLAY
|
||||
#if !HAVE_GL_OVERLAY
|
||||
|
||||
#if !defined(_WIN32) && !defined(WIN32)
|
||||
int Fl_Gl_Window::can_do_overlay() {return 0;}
|
||||
|
||||
void Fl_Gl_Window::make_overlay() {overlay = this;}
|
||||
|
||||
#else
|
||||
|
||||
// Methods on Fl_Gl_Window that create an overlay window. Because
|
||||
// many programs don't need the overlay, this is seperated into this
|
||||
|
@ -51,11 +55,14 @@
|
|||
// "faked" by drawing into the main layers. This is indicated by
|
||||
// setting overlay == this.
|
||||
|
||||
#ifndef WIN32
|
||||
////////////////////////////////////////////////////////////////
|
||||
// X version
|
||||
|
||||
extern XVisualInfo *fl_find_overlay_visual();
|
||||
extern XVisualInfo *fl_overlay_visual;
|
||||
extern Colormap fl_overlay_colormap;
|
||||
extern unsigned long fl_transparent_pixel;
|
||||
static Fl_Gl_Choice overlay_choice;
|
||||
extern uchar fl_overlay;
|
||||
|
||||
class _Fl_Gl_Overlay : public Fl_Gl_Window {
|
||||
|
@ -65,12 +72,6 @@ public:
|
|||
_Fl_Gl_Overlay(int x, int y, int w, int h) :
|
||||
Fl_Gl_Window(x,y,w,h) {
|
||||
set_flag(INACTIVE);
|
||||
overlay_choice.vis = fl_overlay_visual;
|
||||
overlay_choice.colormap = fl_overlay_colormap;
|
||||
overlay_choice.r = 0;
|
||||
overlay_choice.d = 0;
|
||||
overlay_choice.o = 1;
|
||||
g = &overlay_choice;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -88,91 +89,87 @@ void _Fl_Gl_Overlay::draw() {
|
|||
}
|
||||
|
||||
void _Fl_Gl_Overlay::show() {
|
||||
if (shown()) {Fl_Gl_Window::show(); return;}
|
||||
fl_background_pixel = int(fl_transparent_pixel);
|
||||
if (!shown()) {
|
||||
fl_background_pixel = int(fl_transparent_pixel);
|
||||
Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap);
|
||||
fl_background_pixel = -1;
|
||||
// find the outermost window to tell wm about the colormap:
|
||||
Fl_Window *w = window();
|
||||
for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;}
|
||||
XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1);
|
||||
context(fl_create_gl_context(fl_overlay_visual), 1);
|
||||
valid(0);
|
||||
}
|
||||
Fl_Gl_Window::show();
|
||||
fl_background_pixel = -1;
|
||||
// find the outermost window to tell wm about the colormap:
|
||||
Fl_Window *w = window();
|
||||
for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;}
|
||||
XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1);
|
||||
}
|
||||
|
||||
int Fl_Gl_Window::can_do_overlay() {
|
||||
return fl_find_overlay_visual() != 0;
|
||||
}
|
||||
|
||||
#else // _WIN32:
|
||||
|
||||
int Fl_Gl_Window::can_do_overlay() {
|
||||
Fl_Gl_Choice* choice = Fl_Gl_Choice::find(0,0);
|
||||
return (choice && (choice->pfd.bReserved & 15));
|
||||
}
|
||||
|
||||
extern int fl_overlay_depth;
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
int Fl_Gl_Window::can_do_overlay() {return 0;}
|
||||
|
||||
#endif
|
||||
|
||||
void Fl_Gl_Window::make_overlay() {
|
||||
if (!overlay) {
|
||||
#if HAVE_GL_OVERLAY
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
HDC hdc = fl_private_dc(this, mode_,&g);
|
||||
GLXContext context = wglCreateLayerContext(hdc, 1);
|
||||
if (context) { // we found a usable overlay context
|
||||
if (fl_first_context) wglShareLists(fl_first_context, context);
|
||||
else fl_first_context = context;
|
||||
overlay = context;
|
||||
LAYERPLANEDESCRIPTOR pfd;
|
||||
wglDescribeLayerPlane(hdc, g->pixelformat, 1, sizeof(pfd), &pfd);
|
||||
if (!pfd.iPixelType) {
|
||||
; // full-color overlay
|
||||
} else {
|
||||
fl_overlay_depth = pfd.cColorBits; // used by gl_color()
|
||||
if (fl_overlay_depth > 8) fl_overlay_depth = 8;
|
||||
COLORREF palette[256];
|
||||
int n = (1<<fl_overlay_depth)-1;
|
||||
// copy all colors except #0 into the overlay palette:
|
||||
for (int i = 0; i <= n; i++) {
|
||||
uchar r,g,b; Fl::get_color((Fl_Color)i,r,g,b);
|
||||
palette[i] = RGB(r,g,b);
|
||||
}
|
||||
// always provide black & white in the last 2 pixels:
|
||||
if (fl_overlay_depth < 8) {
|
||||
palette[n-1] = RGB(0,0,0);
|
||||
palette[n] = RGB(255,255,255);
|
||||
}
|
||||
// and use it:
|
||||
wglSetLayerPaletteEntries(hdc, 1, 1, n, palette+1);
|
||||
wglRealizeLayerPalette(hdc, 1, TRUE);
|
||||
}
|
||||
valid(0);
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (can_do_overlay()) {
|
||||
_Fl_Gl_Overlay* o = new _Fl_Gl_Overlay(0,0,w(),h());
|
||||
overlay = o;
|
||||
add(*o);
|
||||
o->show();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if (overlay) return;
|
||||
if (can_do_overlay()) {
|
||||
_Fl_Gl_Overlay* o = new _Fl_Gl_Overlay(0,0,w(),h());
|
||||
overlay = o;
|
||||
add(*o);
|
||||
o->show();
|
||||
} else {
|
||||
overlay = this; // fake the overlay
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
////////////////////////////////////////////////////////////////
|
||||
// WIN32 version:
|
||||
|
||||
//static COLORREF *palette;
|
||||
extern int fl_overlay_depth;
|
||||
|
||||
void Fl_Gl_Window::make_overlay() {
|
||||
if (overlay) return;
|
||||
|
||||
GLContext context = fl_create_gl_context(this, g, 1);
|
||||
if (!context) {overlay = this; return;} // fake the overlay
|
||||
|
||||
HDC hdc = Fl_X::i(this)->private_dc;
|
||||
overlay = context;
|
||||
LAYERPLANEDESCRIPTOR pfd;
|
||||
wglDescribeLayerPlane(hdc, g->pixelformat, 1, sizeof(pfd), &pfd);
|
||||
if (!pfd.iPixelType) {
|
||||
; // full-color overlay
|
||||
} else {
|
||||
fl_overlay_depth = pfd.cColorBits; // used by gl_color()
|
||||
if (fl_overlay_depth > 8) fl_overlay_depth = 8;
|
||||
COLORREF palette[256];
|
||||
int n = (1<<fl_overlay_depth)-1;
|
||||
// copy all colors except #0 into the overlay palette:
|
||||
for (int i = 0; i <= n; i++) {
|
||||
uchar r,g,b; Fl::get_color((Fl_Color)i,r,g,b);
|
||||
palette[i] = RGB(r,g,b);
|
||||
}
|
||||
// always provide black & white in the last 2 pixels:
|
||||
if (fl_overlay_depth < 8) {
|
||||
palette[n-1] = RGB(0,0,0);
|
||||
palette[n] = RGB(255,255,255);
|
||||
}
|
||||
// and use it:
|
||||
wglSetLayerPaletteEntries(hdc, 1, 1, n, palette+1);
|
||||
wglRealizeLayerPalette(hdc, 1, TRUE);
|
||||
}
|
||||
valid(0);
|
||||
return;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
void Fl_Gl_Window::redraw_overlay() {
|
||||
if (!shown()) return;
|
||||
make_overlay();
|
||||
#if !defined(_WIN32) && !defined(WIN32)
|
||||
#ifndef WIN32
|
||||
if (overlay != this)
|
||||
((Fl_Gl_Window*)overlay)->redraw();
|
||||
else
|
||||
|
@ -184,8 +181,8 @@ void Fl_Gl_Window::make_overlay_current() {
|
|||
make_overlay();
|
||||
#if HAVE_GL_OVERLAY
|
||||
if (overlay != this) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
fl_set_gl_context(this, (GLXContext)overlay);
|
||||
#ifdef WIN32
|
||||
fl_set_gl_context(this, (GLContext)overlay);
|
||||
// if (fl_overlay_depth)
|
||||
// wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE);
|
||||
#else
|
||||
|
@ -198,7 +195,7 @@ void Fl_Gl_Window::make_overlay_current() {
|
|||
|
||||
void Fl_Gl_Window::hide_overlay() {
|
||||
#if HAVE_GL_OVERLAY
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
#ifdef WIN32
|
||||
// nothing needs to be done? Or should it be erased?
|
||||
#else
|
||||
if (overlay && overlay!=this) ((Fl_Gl_Window*)overlay)->hide();
|
||||
|
@ -209,5 +206,5 @@ void Fl_Gl_Window::hide_overlay() {
|
|||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.14 2001/01/22 15:13:39 easysw Exp $".
|
||||
// End of "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.15 2001/03/14 17:20:01 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: Fl_Gl_Window.cxx,v 1.12.2.20 2001/01/22 15:13:39 easysw Exp $"
|
||||
// "$Id: Fl_Gl_Window.cxx,v 1.12.2.21 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// OpenGL window code for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -28,8 +28,8 @@
|
|||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/x.H>
|
||||
#include <FL/Fl_Gl_Window.H>
|
||||
#include "Fl_Gl_Choice.H"
|
||||
#include <FL/Fl_Gl_Window.H>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -63,66 +63,65 @@ int Fl_Gl_Window::can_do(int a, const int *b) {
|
|||
}
|
||||
|
||||
void Fl_Gl_Window::show() {
|
||||
#if !defined(_WIN32) && !defined(WIN32)
|
||||
if (!shown()) {
|
||||
if (!g) {
|
||||
g = Fl_Gl_Choice::find(mode_,alist);
|
||||
if (!g) {Fl::error("Insufficient GL support"); return;}
|
||||
}
|
||||
#ifndef WIN32
|
||||
Fl_X::make_xid(this, g->vis, g->colormap);
|
||||
if (overlay && overlay != this) ((Fl_Gl_Window*)overlay)->show();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
Fl_Window::show();
|
||||
}
|
||||
|
||||
void Fl_Gl_Window::invalidate() {
|
||||
valid(0);
|
||||
#if !defined(_WIN32) && !defined(WIN32)
|
||||
#ifndef WIN32
|
||||
if (overlay) ((Fl_Gl_Window*)overlay)->valid(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
int Fl_Gl_Window::mode(int m, const int *a) {
|
||||
if (m == mode_ && a == alist) return 0;
|
||||
mode_ = m; alist = a;
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
// destroy context and g:
|
||||
if (shown()) {hide(); show();}
|
||||
#else
|
||||
// under X, if the visual changes we must make a new X window (!):
|
||||
if (shown()) {
|
||||
Fl_Gl_Choice *g1 = g;
|
||||
g = Fl_Gl_Choice::find(mode_,alist);
|
||||
if (!g || g->vis->visualid != g1->vis->visualid || g->d != g1->d) {
|
||||
hide(); show();
|
||||
}
|
||||
}
|
||||
#ifndef WIN32
|
||||
int oldmode = mode_;
|
||||
Fl_Gl_Choice* oldg = g;
|
||||
#endif
|
||||
context(0);
|
||||
mode_ = m; alist = a;
|
||||
if (shown()) {
|
||||
g = Fl_Gl_Choice::find(m, a);
|
||||
#ifndef WIN32
|
||||
// under X, if the visual changes we must make a new X window (yuck!):
|
||||
if (!g || g->vis->visualid!=oldg->vis->visualid || (oldmode^m)&FL_DOUBLE) {
|
||||
hide();
|
||||
show();
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
g = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define NON_LOCAL_CONTEXT 0x80000000
|
||||
|
||||
void Fl_Gl_Window::make_current() {
|
||||
if (!context) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
context = wglCreateContext(fl_private_dc(this, mode_,&g));
|
||||
if (fl_first_context) wglShareLists(fl_first_context, (GLXContext)context);
|
||||
else fl_first_context = (GLXContext)context;
|
||||
#else
|
||||
context = glXCreateContext(fl_display, g->vis, fl_first_context, 1);
|
||||
if (!fl_first_context) fl_first_context = (GLXContext)context;
|
||||
#endif
|
||||
if (!context_) {
|
||||
mode_ &= ~NON_LOCAL_CONTEXT;
|
||||
context_ = fl_create_gl_context(this, g);
|
||||
valid(0);
|
||||
}
|
||||
fl_set_gl_context(this, (GLXContext)context);
|
||||
#if (defined(_WIN32) || defined(WIN32)) && USE_COLORMAP
|
||||
fl_set_gl_context(this, context_);
|
||||
#if defined(WIN32) && USE_COLORMAP
|
||||
if (fl_palette) {
|
||||
fl_GetDC(fl_xid(this));
|
||||
SelectPalette(fl_gc, fl_palette, FALSE);
|
||||
RealizePalette(fl_gc);
|
||||
}
|
||||
#endif // USE_COLORMAP
|
||||
if (g->d) glDrawBuffer(GL_BACK);
|
||||
current_ = this;
|
||||
}
|
||||
|
||||
|
@ -142,7 +141,7 @@ void Fl_Gl_Window::ortho() {
|
|||
}
|
||||
|
||||
void Fl_Gl_Window::swap_buffers() {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
#ifdef WIN32
|
||||
#if HAVE_GL_OVERLAY
|
||||
// Do not swap the overlay, to match GLX:
|
||||
wglSwapLayerBuffers(Fl_X::i(this)->private_dc, WGL_SWAP_MAIN_PLANE);
|
||||
|
@ -154,25 +153,25 @@ void Fl_Gl_Window::swap_buffers() {
|
|||
#endif
|
||||
}
|
||||
|
||||
#if HAVE_GL_OVERLAY && defined(_WIN32)
|
||||
#if HAVE_GL_OVERLAY && defined(WIN32)
|
||||
uchar fl_overlay; // changes how fl_color() works
|
||||
int fl_overlay_depth = 0;
|
||||
#endif
|
||||
|
||||
void Fl_Gl_Window::flush() {
|
||||
uchar save_valid = valid_;
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
|
||||
#if HAVE_GL_OVERLAY && defined(WIN32)
|
||||
|
||||
// SGI 320 messes up overlay with user-defined cursors:
|
||||
bool fixcursor =
|
||||
Fl_X::i(this)->cursor && Fl_X::i(this)->cursor != fl_default_cursor;
|
||||
if (fixcursor) SetCursor(0);
|
||||
#endif
|
||||
|
||||
#if HAVE_GL_OVERLAY && (defined(_WIN32) || defined(WIN32))
|
||||
// Draw into hardware overlay planes:
|
||||
if (overlay && overlay != this
|
||||
&& (damage()&(FL_DAMAGE_OVERLAY|FL_DAMAGE_EXPOSE) || !save_valid)) {
|
||||
fl_set_gl_context(this, (GLXContext)overlay);
|
||||
fl_set_gl_context(this, (GLContext)overlay);
|
||||
if (fl_overlay_depth)
|
||||
wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE);
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
@ -191,7 +190,9 @@ void Fl_Gl_Window::flush() {
|
|||
|
||||
make_current();
|
||||
|
||||
if (g->d) {
|
||||
if (mode_ & FL_DOUBLE) {
|
||||
|
||||
glDrawBuffer(GL_BACK);
|
||||
|
||||
if (!SWAP_TYPE) {
|
||||
SWAP_TYPE = UNDEFINED;
|
||||
|
@ -224,16 +225,10 @@ void Fl_Gl_Window::flush() {
|
|||
if (damage1_ || damage() != FL_DAMAGE_OVERLAY || !save_valid) draw();
|
||||
// we use a seperate context for the copy because rasterpos must be 0
|
||||
// and depth test needs to be off:
|
||||
static GLXContext ortho_context = 0;
|
||||
static GLContext ortho_context = 0;
|
||||
static Fl_Gl_Window* ortho_window = 0;
|
||||
int init = !ortho_context;
|
||||
if (init) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
ortho_context = wglCreateContext(Fl_X::i(this)->private_dc);
|
||||
#else
|
||||
ortho_context =glXCreateContext(fl_display,g->vis,fl_first_context,1);
|
||||
#endif
|
||||
}
|
||||
if (init) ortho_context = fl_create_gl_context(this, g);
|
||||
fl_set_gl_context(this, ortho_context);
|
||||
if (init || !save_valid || ortho_window != this) {
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
@ -274,7 +269,7 @@ void Fl_Gl_Window::flush() {
|
|||
|
||||
}
|
||||
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
#if HAVE_GL_OVERLAY && defined(WIN32)
|
||||
if (fixcursor) SetCursor(Fl_X::i(this)->cursor);
|
||||
#endif
|
||||
valid(1);
|
||||
|
@ -283,7 +278,7 @@ void Fl_Gl_Window::flush() {
|
|||
void Fl_Gl_Window::resize(int X,int Y,int W,int H) {
|
||||
if (W != w() || H != h()) {
|
||||
valid(0);
|
||||
#if !defined(_WIN32) && !defined(WIN32)
|
||||
#ifndef WIN32
|
||||
if (!resizable() && overlay && overlay != this)
|
||||
((Fl_Gl_Window*)overlay)->resize(0,0,W,H);
|
||||
#endif
|
||||
|
@ -291,26 +286,18 @@ void Fl_Gl_Window::resize(int X,int Y,int W,int H) {
|
|||
Fl_Window::resize(X,Y,W,H);
|
||||
}
|
||||
|
||||
void Fl_Gl_Window::context(void* v, int destroy_flag) {
|
||||
if (context_ && !(mode_&NON_LOCAL_CONTEXT)) fl_delete_gl_context(context_);
|
||||
context_ = (GLContext)v;
|
||||
if (destroy_flag) mode_ &= ~NON_LOCAL_CONTEXT;
|
||||
else mode_ |= NON_LOCAL_CONTEXT;
|
||||
}
|
||||
|
||||
void Fl_Gl_Window::hide() {
|
||||
if (context) {
|
||||
fl_no_gl_context();
|
||||
if (context != fl_first_context) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
wglDeleteContext((GLXContext)context);
|
||||
#else
|
||||
glXDestroyContext(fl_display, (GLXContext)context);
|
||||
#endif
|
||||
}
|
||||
// This causes incompatibility with some OpenGL libraries
|
||||
// I don't think this is not necessary in any case, right?
|
||||
//#ifdef GLX_MESA_release_buffers
|
||||
// glXReleaseBuffersMESA(fl_display, fl_xid(this));
|
||||
//#endif
|
||||
context = 0;
|
||||
}
|
||||
#if HAVE_GL_OVERLAY && (defined(_WIN32) || defined(WIN32))
|
||||
if (overlay && overlay != this && (GLXContext)overlay != fl_first_context) {
|
||||
wglDeleteContext((GLXContext)overlay);
|
||||
context(0);
|
||||
#if HAVE_GL_OVERLAY && defined(WIN32)
|
||||
if (overlay && overlay != this) {
|
||||
fl_delete_gl_context((GLContext)overlay);
|
||||
overlay = 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -327,7 +314,7 @@ void Fl_Gl_Window::init() {
|
|||
box(FL_NO_BOX);
|
||||
mode_ = FL_RGB | FL_DEPTH | FL_DOUBLE;
|
||||
alist = 0;
|
||||
context = 0;
|
||||
context_ = 0;
|
||||
g = 0;
|
||||
overlay = 0;
|
||||
}
|
||||
|
@ -337,5 +324,5 @@ void Fl_Gl_Window::draw_overlay() {}
|
|||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Window.cxx,v 1.12.2.20 2001/01/22 15:13:39 easysw Exp $".
|
||||
// End of "$Id: Fl_Gl_Window.cxx,v 1.12.2.21 2001/03/14 17:20:01 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: Fl_compose.cxx,v 1.1.2.6 2001/01/22 15:13:40 easysw Exp $"
|
||||
// "$Id: Fl_compose.cxx,v 1.1.2.7 2001/03/14 17:20:01 spitzak Exp $"
|
||||
//
|
||||
// Character compose processing for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -30,7 +30,7 @@ static const char* const compose_pairs =
|
|||
"`A'A^A~A:A*AAE,C`E'E^E:E`I'I^I:I-D~N`O'O^O~O:Ox O/`U'U^U:U'YTHss"
|
||||
"`a'a^a~a:a*aae,c`e'e^e:e`i'i^i:i-d~n`o'o^o~o:o-:o/`u'u^u:u'yth:y";
|
||||
|
||||
#if !defined(_WIN32) && !defined(WIN32) // X only
|
||||
#ifndef WIN32 // X only
|
||||
// X dead-key lookup table. This turns a dead-key keysym into the
|
||||
// first of two characters for one of the compose sequences. These
|
||||
// keysyms start at 0xFE50.
|
||||
|
@ -113,7 +113,7 @@ int Fl::compose(int& del) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
#if !defined(_WIN32) && !defined(WIN32) // X only
|
||||
#ifndef WIN32 // X only
|
||||
// See if they typed a dead key. This gets it into the same state as
|
||||
// typing prefix+accent:
|
||||
if (i >= 0xfe50 && i <= 0xfe5b) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: fl_file_chooser.cxx,v 1.10.2.8 2001/01/22 15:13:41 easysw Exp $"
|
||||
// "$Id: fl_file_chooser.cxx,v 1.10.2.9 2001/03/14 17:20:02 spitzak Exp $"
|
||||
//
|
||||
// File chooser widget for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -231,7 +231,7 @@ int FCB::get(char* buf) {
|
|||
for (dirent** r = q+1; n && r < last; r++) {
|
||||
if (!item_height(*r, 0)) continue;
|
||||
int i;
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
#ifdef WIN32
|
||||
for (i=0; i<n && tolower((*q)->d_name[i])==tolower((*r)->d_name[i]); i++) {}
|
||||
#else
|
||||
for (i=0; i<n && (*q)->d_name[i]==(*r)->d_name[i]; i++) {}
|
||||
|
@ -632,5 +632,5 @@ char* fl_file_chooser(const char* message, const char* pat, const char* fname)
|
|||
}
|
||||
|
||||
//
|
||||
// End of "$Id: fl_file_chooser.cxx,v 1.10.2.8 2001/01/22 15:13:41 easysw Exp $".
|
||||
// End of "$Id: fl_file_chooser.cxx,v 1.10.2.9 2001/03/14 17:20:02 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: gl_draw.cxx,v 1.7.2.4 2001/01/22 15:13:41 easysw Exp $"
|
||||
// "$Id: gl_draw.cxx,v 1.7.2.5 2001/03/14 17:20:02 spitzak Exp $"
|
||||
//
|
||||
// OpenGL drawing support routines for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -37,14 +37,14 @@
|
|||
#include "Fl_Font.H"
|
||||
#include <string.h>
|
||||
|
||||
void gl_font(int fontid, int size) {fl_font(fontid, size);}
|
||||
int gl_height() {return fl_height();}
|
||||
int gl_descent() {return fl_descent();}
|
||||
double gl_width(const char* s) {return fl_width(s);}
|
||||
double gl_width(const char* s, int n) {return fl_width(s,n);}
|
||||
double gl_width(uchar c) {return fl_width(c);}
|
||||
|
||||
void gl_draw(const char* str, int n) {
|
||||
void gl_font(int fontid, int size) {
|
||||
fl_font(fontid, size);
|
||||
if (!fl_fontsize->listbase) {
|
||||
#ifdef WIN32
|
||||
int base = fl_fontsize->metr.tmFirstChar;
|
||||
|
@ -60,11 +60,11 @@ void gl_draw(const char* str, int n) {
|
|||
glXUseXFont(fl_xfont->fid, base, size, fl_fontsize->listbase+base);
|
||||
#endif
|
||||
}
|
||||
glListBase(fl_fontsize->listbase);
|
||||
}
|
||||
|
||||
glPushAttrib(GL_LIST_BIT);
|
||||
glListBase(fl_fontsize->listbase);
|
||||
glCallLists(n, GL_UNSIGNED_BYTE, str);
|
||||
glPopAttrib();
|
||||
void gl_draw(const char* str, int n) {
|
||||
glCallLists(n, GL_UNSIGNED_BYTE, str);
|
||||
}
|
||||
|
||||
void gl_draw(const char* str, int n, int x, int y) {
|
||||
|
@ -155,5 +155,5 @@ void gl_draw_image(const uchar* b, int x, int y, int w, int h, int d, int ld) {
|
|||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: gl_draw.cxx,v 1.7.2.4 2001/01/22 15:13:41 easysw Exp $".
|
||||
// End of "$Id: gl_draw.cxx,v 1.7.2.5 2001/03/14 17:20:02 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: gl_start.cxx,v 1.6.2.4 2001/01/22 15:13:41 easysw Exp $"
|
||||
// "$Id: gl_start.cxx,v 1.6.2.5 2001/03/14 17:20:02 spitzak Exp $"
|
||||
//
|
||||
// OpenGL context routines for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -20,7 +20,7 @@
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
// USA.
|
||||
//
|
||||
// Please report all bugs and problems to "fltk-bugs@fltk.org".
|
||||
// Please report all bugs and problems to "fltk-bugs@easysw.com".
|
||||
//
|
||||
|
||||
// You MUST use gl_visual() to select the default visual before doing
|
||||
|
@ -42,35 +42,27 @@
|
|||
#include <FL/Fl_Window.H>
|
||||
#include <FL/x.H>
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
#include "Fl_Gl_Choice.H"
|
||||
|
||||
extern GLXContext fl_first_context; // in Fl_Gl_Choice.C
|
||||
extern int fl_clip_state_number; // in fl_rect.C
|
||||
|
||||
static GLXContext context;
|
||||
static GLContext context;
|
||||
static int clip_state_number=-1;
|
||||
static int pw, ph;
|
||||
|
||||
#ifdef WIN32
|
||||
static int default_mode;
|
||||
static Fl_Gl_Choice* gl_choice;
|
||||
#endif
|
||||
|
||||
Region XRectangleRegion(int x, int y, int w, int h); // in fl_rect.C
|
||||
|
||||
void gl_start() {
|
||||
#ifdef WIN32
|
||||
HDC hdc = fl_private_dc(Fl_Window::current(), default_mode,0);
|
||||
#endif
|
||||
if (!context) {
|
||||
#ifdef WIN32
|
||||
context = wglCreateContext(hdc);
|
||||
if (!fl_first_context) fl_first_context = context;
|
||||
else wglShareLists(fl_first_context, context);
|
||||
if (!gl_choice) Fl::gl_visual(0);
|
||||
context = fl_create_gl_context(Fl_Window::current(), gl_choice);
|
||||
#else
|
||||
context = glXCreateContext(fl_display, fl_visual, fl_first_context, 1);
|
||||
if (!context) Fl::fatal("OpenGL does not support this visual");
|
||||
if (!fl_first_context) fl_first_context = context;
|
||||
context = fl_create_gl_context(fl_visual);
|
||||
#endif
|
||||
}
|
||||
fl_set_gl_context(Fl_Window::current(), context);
|
||||
|
@ -100,19 +92,18 @@ void gl_start() {
|
|||
}
|
||||
|
||||
void gl_finish() {
|
||||
#ifdef WIN32
|
||||
glFlush();
|
||||
#else
|
||||
#ifndef WIN32
|
||||
glXWaitGL();
|
||||
#endif
|
||||
}
|
||||
|
||||
int Fl::gl_visual(int mode, int *alist) {
|
||||
#ifdef WIN32
|
||||
default_mode = mode;
|
||||
#else
|
||||
Fl_Gl_Choice *c = Fl_Gl_Choice::find(mode,alist);
|
||||
if (!c) return 0;
|
||||
#ifdef WIN32
|
||||
gl_choice = c;
|
||||
#else
|
||||
fl_visual = c->vis;
|
||||
fl_colormap = c->colormap;
|
||||
#endif
|
||||
|
@ -122,5 +113,5 @@ int Fl::gl_visual(int mode, int *alist) {
|
|||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: gl_start.cxx,v 1.6.2.4 2001/01/22 15:13:41 easysw Exp $".
|
||||
// End of "$Id: gl_start.cxx,v 1.6.2.5 2001/03/14 17:20:02 spitzak Exp $".
|
||||
//
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// "$Id: cube.cxx,v 1.4.2.4 2001/01/22 15:13:41 easysw Exp $"
|
||||
// "$Id: cube.cxx,v 1.4.2.5 2001/03/14 17:20:02 spitzak Exp $"
|
||||
//
|
||||
// Another forms test program for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
|
@ -152,6 +152,16 @@ int main(int argc, char **argv) {
|
|||
form->show(argc,argv);
|
||||
cube->show();
|
||||
cube2->show();
|
||||
#if 0
|
||||
// This demonstrates how to manipulate OpenGL contexts.
|
||||
// In this case the same context is used by multiple windows (I'm not
|
||||
// sure if this is allowed on Win32, can somebody check?).
|
||||
// This fixes a bug on the XFree86 3.0 OpenGL where only one context
|
||||
// per program seems to work, but there are probably better uses for
|
||||
// this!
|
||||
cube->make_current(); // causes context to be created
|
||||
cube2->context(cube->context()); // share the contexts
|
||||
#endif
|
||||
for (;;) {
|
||||
if (form->visible() && speed->value())
|
||||
{if (!Fl::check()) break;} // returns immediately
|
||||
|
@ -169,5 +179,5 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
|
||||
//
|
||||
// End of "$Id: cube.cxx,v 1.4.2.4 2001/01/22 15:13:41 easysw Exp $".
|
||||
// End of "$Id: cube.cxx,v 1.4.2.5 2001/03/14 17:20:02 spitzak Exp $".
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue