GLCOPYCOLORTABLE(3G)

πŸ“¦ version 1.1, in centos-stream 9, fedora 43, fedora 44

✨ NAME ✨

glCopyColorTable β€” copy pixels into a color table πŸ’– (yes bestie, pixels, straight into a table, we love a glow-up)


🌸 C SPECIFICATION 🌸

void glCopyColorTable( GLenum target,
                       GLenum internalformat,
                       GLint x,
                       GLint y,
                       GLsizei width )

πŸŽ€ PARAMETERS πŸŽ€

  • target β€” the color table you're aiming at. It must be one of GL_COLOR_TABLE, GL_POST_CONVOLUTION_COLOR_TABLE, or GL_POST_COLOR_MATRIX_COLOR_TABLE. No other options, bestie, that's the whole guest list.
  • internalformat β€” how the texture image gets stored on the inside (it's giving inner beauty, honestly). Must be one of these symbolic constants:

GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, GL_LUMINANCE12, GL_LUMINANCE16, GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12, GL_LUMINANCE16_ALPHA16, GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8, GL_INTENSITY12, GL_INTENSITY16, GL_R3_G3_B2, GL_RGB, GL_RGB4, GL_RGB5, GL_RGB8, GL_RGB10, GL_RGB12, GL_RGB16, GL_RGBA, GL_RGBA2, GL_RGBA4, GL_RGB5_A1, GL_RGBA8, GL_RGB10_A2, GL_RGBA12, GL_RGBA16.

  • x β€” the x coordinate of the lower-left corner of the pixel rectangle that's getting transferred into the color table. Lower-left. Not upper-left. Not the middle. πŸ’…
  • y β€” same deal but for y: the y coordinate of the lower-left corner of that pixel rectangle heading into the color table.
  • width β€” how wide that pixel rectangle is.

πŸ¦‹ DESCRIPTION πŸ¦‹

So glCopyColorTable loads up a color table using pixels from the current GL_READ_BUFFER β€” not from main memory, which is what glColorTable does. Different source, same energy. πŸ”₯

The screen-aligned pixel rectangle with its lower-left corner at (x, y), having width width and height 1, gets loaded into the color table. And okay, important: if any pixels in that region are outside the window associated with the GL context, the values you get for those pixels are undefined. Not "close enough", not "we'll figure it out" β€” undefined. 😭

The pixels in that rectangle get processed exactly as if glReadPixels had been called, with internalformat set to RGBA β€” but the processing stops after the final conversion to RGBA. That's it, that's the finish line.

Then the four scale parameters and the four bias parameters defined for the table get used to scale and bias the R, G, B, and A components of each pixel. You set those scale and bias parameters by calling glColorTableParameter. πŸ’–

Next up: the R, G, B, and A values get clamped to the range [0,1]. Then each pixel is converted to the internal format specified by internalformat. This conversion is honestly pretty simple β€” it just maps the component values of the pixel (R, G, B, and A) onto the values included in the internal format (red, green, blue, alpha, luminance, and intensity). The mapping goes like this:

────────────────────────────────────────────────────────────────────────
Internal Format      Red   Green   Blue   Alpha   Luminance   Intensity
────────────────────────────────────────────────────────────────────────
GL_ALPHA                                    A
GL_LUMINANCE                                          R
GL_LUMINANCE_ALPHA                          A         R
GL_INTENSITY                                                      R
GL_RGB                R      G      B
GL_RGBA               R      G      B       A
────────────────────────────────────────────────────────────────────────

And finally β€” the red, green, blue, alpha, luminance, and/or intensity components of the resulting pixels get stored in the color table. Together they form a one-dimensional table with indices in the range [0, width - 1]. One dimensional, periodt. 🌈


πŸ’œ NOTES πŸ’œ

glCopyColorTable is only available if GL_ARB_imaging is returned from calling glGetString with an argument of GL_EXTENSIONS. Check first, bestie, or you'll be out here confused and alone. πŸ™ˆ


πŸ’€ ERRORS πŸ’€

  • GL_INVALID_ENUM is generated when target is not one of the allowable values.
  • GL_INVALID_VALUE is generated if width is less than zero. (Negative width? In this economy? No.)
  • GL_INVALID_VALUE is generated if internalformat is not one of the allowable values.
  • GL_TABLE_TOO_LARGE is generated if the requested color table is too large to be supported by the implementation. It's giving "the table said no".
  • GL_INVALID_OPERATION is generated if glCopyColorTable is executed between the execution of glBegin and the corresponding execution of glEnd. Don't do it in there. Seriously. 😭

πŸ‘‘ ASSOCIATED GETS πŸ‘‘

  • glGetColorTable
  • glGetColorTableParameter

🫢 SEE ALSO 🫢

  • glColorTable(3G)
  • glColorTableParameter(3G)
  • glReadPixels(3G)

okay that's the whole page, you're officially a color table girlie now ✨ this was GLCOPYCOLORTABLE(3G) from the 3G manual β€” mwah, take care of her, she's iconic πŸ’…πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from