More fixes to the OpenGL overlay code on win32. This now seems to
work quite reliably on several different pieces of hardware. Apparently doing SetLayerPaletteEntries with a palette larger than the overlay size caused the drivers to screw up in unpredictable ways. Also SwapBuffers swapped both the overlay and main window, which is not what fltk's interface wanted, this was easy to fix however. Patch for full scrollbars so that clicking on them does not move anything. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1188 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
7a17c343cc
commit
8e5c8b50d3
@ -1,5 +1,5 @@
|
||||
//
|
||||
// "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.9 2000/06/05 21:20:51 mike Exp $"
|
||||
// "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.10 2000/06/10 18:24:30 bill Exp $"
|
||||
//
|
||||
// OpenGL overlay code for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
@ -136,18 +136,19 @@ void Fl_Gl_Window::make_overlay() {
|
||||
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 < 256; i++) {
|
||||
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[(1<<fl_overlay_depth)-2] = RGB(0,0,0);
|
||||
palette[(1<<fl_overlay_depth)-1] = RGB(255,255,255);
|
||||
palette[n-1] = RGB(0,0,0);
|
||||
palette[n] = RGB(255,255,255);
|
||||
}
|
||||
// and use it:
|
||||
wglSetLayerPaletteEntries(hdc, 1, 1, 255, palette+1);
|
||||
wglSetLayerPaletteEntries(hdc, 1, 1, n, palette+1);
|
||||
wglRealizeLayerPalette(hdc, 1, TRUE);
|
||||
}
|
||||
valid(0);
|
||||
@ -184,8 +185,8 @@ void Fl_Gl_Window::make_overlay_current() {
|
||||
if (overlay != this) {
|
||||
#ifdef _WIN32
|
||||
fl_set_gl_context(this, (GLXContext)overlay);
|
||||
if (fl_overlay_depth)
|
||||
wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE);
|
||||
// if (fl_overlay_depth)
|
||||
// wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE);
|
||||
#else
|
||||
((Fl_Gl_Window*)overlay)->make_current();
|
||||
#endif
|
||||
@ -207,5 +208,5 @@ void Fl_Gl_Window::hide_overlay() {
|
||||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.9 2000/06/05 21:20:51 mike Exp $".
|
||||
// End of "$Id: Fl_Gl_Overlay.cxx,v 1.5.2.10 2000/06/10 18:24:30 bill Exp $".
|
||||
//
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
//
|
||||
// "$Id: Fl_Gl_Window.cxx,v 1.12.2.13 2000/06/05 21:20:51 mike Exp $"
|
||||
// "$Id: Fl_Gl_Window.cxx,v 1.12.2.14 2000/06/10 18:24:30 bill Exp $"
|
||||
//
|
||||
// OpenGL window code for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
@ -146,7 +146,12 @@ void Fl_Gl_Window::ortho() {
|
||||
|
||||
void Fl_Gl_Window::swap_buffers() {
|
||||
#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);
|
||||
#else
|
||||
SwapBuffers(Fl_X::i(this)->private_dc);
|
||||
#endif
|
||||
#else
|
||||
glXSwapBuffers(fl_display, fl_xid(this));
|
||||
#endif
|
||||
@ -167,10 +172,9 @@ void Fl_Gl_Window::flush() {
|
||||
#endif
|
||||
|
||||
#if HAVE_GL_OVERLAY && defined(_WIN32)
|
||||
if (overlay && overlay != this &&
|
||||
((damage()&(FL_DAMAGE_OVERLAY|FL_DAMAGE_EXPOSE))
|
||||
|| !save_valid)) {
|
||||
// Draw into hardware overlay planes
|
||||
// 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);
|
||||
if (fl_overlay_depth)
|
||||
wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE);
|
||||
@ -180,8 +184,8 @@ void Fl_Gl_Window::flush() {
|
||||
draw_overlay();
|
||||
fl_overlay = 0;
|
||||
valid(save_valid);
|
||||
if (damage() == FL_DAMAGE_OVERLAY) {
|
||||
wglSwapLayerBuffers(Fl_X::i(this)->private_dc,WGL_SWAP_OVERLAY1);
|
||||
wglSwapLayerBuffers(Fl_X::i(this)->private_dc, WGL_SWAP_OVERLAY1);
|
||||
if (damage() == FL_DAMAGE_OVERLAY) { // main layer is undamaged
|
||||
if (fixcursor) SetCursor(Fl_X::i(this)->cursor);
|
||||
return;
|
||||
}
|
||||
@ -323,5 +327,5 @@ void Fl_Gl_Window::draw_overlay() {}
|
||||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Gl_Window.cxx,v 1.12.2.13 2000/06/05 21:20:51 mike Exp $".
|
||||
// End of "$Id: Fl_Gl_Window.cxx,v 1.12.2.14 2000/06/10 18:24:30 bill Exp $".
|
||||
//
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
//
|
||||
// "$Id: Fl_Slider.cxx,v 1.8.2.7 2000/06/05 21:20:57 mike Exp $"
|
||||
// "$Id: Fl_Slider.cxx,v 1.8.2.8 2000/06/10 18:24:31 bill Exp $"
|
||||
//
|
||||
// Slider widget for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
@ -182,7 +182,7 @@ int Fl_Slider::handle(int event, int x, int y, int w, int h) {
|
||||
int W = (horizontal() ? w : h);
|
||||
//int H = (horizontal() ? h : w);
|
||||
int mx = (horizontal() ? Fl::event_x()-x : Fl::event_y()-y);
|
||||
int S = int(slider_size_*W+.5);
|
||||
int S = int(slider_size_*W+.5); if (S >= W) return 0;
|
||||
int X;
|
||||
static int offcenter;
|
||||
|
||||
@ -251,5 +251,5 @@ int Fl_Slider::handle(int event) {
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Slider.cxx,v 1.8.2.7 2000/06/05 21:20:57 mike Exp $".
|
||||
// End of "$Id: Fl_Slider.cxx,v 1.8.2.8 2000/06/10 18:24:31 bill Exp $".
|
||||
//
|
||||
|
||||
Loading…
Reference in New Issue
Block a user