summaryrefslogtreecommitdiff
path: root/src/gl_draw.cxx
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2019-04-10 17:02:04 +0200
committerAlbrecht Schlosser <albrechts.fltk@online.de>2019-04-10 17:02:04 +0200
commit3bbc453237d8c303daeb5b255756f29edd01010d (patch)
tree55ce1308fa215b74cd0100a92aee452dd3010594 /src/gl_draw.cxx
parentcb7dbc34d73cdb8e305d62c19e9b0164c13727e4 (diff)
Save and restore GL parameters as appropriate
According to the docs "glPixelStorei sets pixel storage modes that affect the operation of subsequent glReadPixels as well as the unpacking of texture patterns (see glTexImage2D and glTexSubImage2D)." Hence we (a) must be aware that current values of these modes can be anything set by user or FLTK code before (b) should be polite and restore these modes to previous values See discussion in fltk.coredev, thread "gl_draw problem" started on Apr 05, 2019.
Diffstat (limited to 'src/gl_draw.cxx')
-rw-r--r--src/gl_draw.cxx20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/gl_draw.cxx b/src/gl_draw.cxx
index ed35d8d62..e45c870f3 100644
--- a/src/gl_draw.cxx
+++ b/src/gl_draw.cxx
@@ -217,9 +217,12 @@ void gl_rect(int x, int y, int w, int h) {
void gl_draw_image(const uchar* b, int x, int y, int w, int h, int d, int ld) {
if (!ld) ld = w*d;
+ GLint row_length;
+ glGetIntegerv(GL_UNPACK_ROW_LENGTH, &row_length); // get current row length
glPixelStorei(GL_UNPACK_ROW_LENGTH, ld/d);
glRasterPos2i(x,y);
glDrawPixels(w,h,d<4?GL_RGB:GL_RGBA,GL_UNSIGNED_BYTE,(const ulong*)b);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length); // restore row length
}
@@ -404,18 +407,24 @@ int gl_texture_fifo::compute_texture(const char* str, int n)
int w, h;
w = fl_width(fifo[current].utf8, n) * gl_scale;
// Hack - make w be aligned
- w = (w + 3) & 0xFFFFFFC;
+ w = (w + 3) & (~3);
h = fl_height() * gl_scale;
-
+
fifo[current].scale = gl_scale;
fifo[current].fdesc = gl_fontsize;
char *txt_buf = Fl_Gl_Window_Driver::global()->alpha_mask_for_string(str, n, w, h);
-
+
+ // save GL parameters GL_UNPACK_ROW_LENGTH and GL_UNPACK_ALIGNMENT
+ GLint row_length, alignment;
+ glGetIntegerv(GL_UNPACK_ROW_LENGTH, &row_length);
+ glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
+
// put the bitmap in an alpha-component-only texture
glPushAttrib(GL_TEXTURE_BIT);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, fifo[current].texName);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- //glPixelStorei(GL_UNPACK_ROW_LENGTH, w);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, w);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
// GL_ALPHA8 is defined in GL/gl.h of X11 and of MinGW32 and of MinGW64 and of OpenGL.framework for MacOS
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_ALPHA8, w, h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, txt_buf);
/* For the record: texture construction if an alpha-only-texture is not possible
@@ -424,6 +433,9 @@ int gl_texture_fifo::compute_texture(const char* str, int n)
*/
delete[] txt_buf; // free the buffer now we have copied it into the Gl texture
glPopAttrib();
+ // restore saved GL parameters
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
return current;
}