Spectre/Graphics/PixelFormat: Rework
source/Graphics/Image/IcoFormat.cpp: use new PixelFormat. source/Graphics/Image.cpp: update to confirm with new PixelFormat Spectre/Graphics/PixelFormat: add PF_getNumChannels() Spectre/Graphics/PixelFormat: Rework the enum with proper naming convention and documentation.
This commit is contained in:
parent
82add50157
commit
c731cda1a2
5 changed files with 73 additions and 16 deletions
|
|
@ -100,6 +100,7 @@ local graphics_module = Module("source/Graphics", {
|
||||||
"Image.cpp",
|
"Image.cpp",
|
||||||
"ImageLoader.cpp",
|
"ImageLoader.cpp",
|
||||||
"Image/IcoFormat.cpp",
|
"Image/IcoFormat.cpp",
|
||||||
|
"PixelFormat.cpp",
|
||||||
|
|
||||||
"OpenGL.cpp",
|
"OpenGL.cpp",
|
||||||
"GL/glad.c",
|
"GL/glad.c",
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,49 @@
|
||||||
#ifndef SPECTRE_GRAPHICS_PIXELFORMAT_H
|
#ifndef SPECTRE_GRAPHICS_PIXELFORMAT_H
|
||||||
#define SPECTRE_GRAPHICS_PIXELFORMAT_H
|
#define SPECTRE_GRAPHICS_PIXELFORMAT_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
namespace sp {
|
namespace sp {
|
||||||
|
|
||||||
enum PixelFormat
|
enum PixelFormat
|
||||||
{
|
{
|
||||||
PF_Unknown = 0,
|
PF_Unknown = 0,
|
||||||
PF_RGB = 1, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue.
|
PF_Alpha = 1, // 8 bit alpha channel.
|
||||||
PF_RGBA = 2, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha.
|
|
||||||
PF_32BGR = 3, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused.
|
// Byte-order formats.
|
||||||
PF_32BGRA = 4, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha.
|
// Pixels are always ordered with the first channel at the first byte, second channel at the second byte.
|
||||||
PF_Alpha = 5, // 8 bit alpha channel.
|
// ---------------------------
|
||||||
|
|
||||||
|
PF_RGB = 2, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue.
|
||||||
|
PF_RGBX = 3, // 32 bits per pixel, 8 bits are used for red, green, Last 8 bits are unused.
|
||||||
|
PF_RGBA = 4, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha.
|
||||||
|
PF_BGR = 5, // 24 bits per pixel, 8 bits are used for blue, green, red.
|
||||||
|
PF_BGRX = 6, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused.
|
||||||
|
PF_BGRA = 7, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha.
|
||||||
|
|
||||||
|
// Packed formats.
|
||||||
|
// ---------------------------
|
||||||
|
|
||||||
|
// 32-bit: Pixels are in ordered in 32-bit words. where the first channel is stored at the most significant byte (MSB).
|
||||||
|
// these formats are architecture dependant (litte/big-endian).
|
||||||
|
// (MSB) | byte 0 | byte 1 | byte 2 | byte 3 | (LSB)
|
||||||
|
PF_RGBX32 = 8, // | rrrr rrrr | gggg gggg | bbbb bbbb | xxxx xxxx |
|
||||||
|
PF_RGBA32 = 9, // | rrrr rrrr | gggg gggg | bbbb bbbb | aaaa aaaa |
|
||||||
|
PF_BGRX32 = 10, // | bbbb bbbb | gggg gggg | rrrr rrrr | xxxx xxxx |
|
||||||
|
PF_BGRA32 = 11, // | bbbb bbbb | gggg gggg | rrrr rrrr | aaaa aaaa |
|
||||||
|
|
||||||
|
// 24-bit (unsuppored for now)
|
||||||
|
//PF_RGB24 = 12, // | rrrr rrrr | gggg gggg | bbbb bbbb |
|
||||||
|
//PF_BGR24 = 13, // | bbbb bbbb | gggg gggg | rrrr rrrr |
|
||||||
|
|
||||||
|
// 16-bit (unsuppored for now)
|
||||||
|
//PF_RGB565 = 14, // | rrrr rggg | gggb bbbb |
|
||||||
|
//PF_RGBA5551 = 15 // | rrrr rggg | ggb bbbba |
|
||||||
|
//PF_RGBX5551 = 16 // | rrrr rggg | ggb bbbbx |
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint8_t PF_getNumChannels(enum PixelFormat format);
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
#endif /* SPECTRE_GRAPHICS_PIXELFORMAT_H */
|
#endif /* SPECTRE_GRAPHICS_PIXELFORMAT_H */
|
||||||
|
|
|
||||||
|
|
@ -165,29 +165,28 @@ void Image::flipY()
|
||||||
|
|
||||||
void Image::setPixels(const void *pixels, PixelFormat format)
|
void Image::setPixels(const void *pixels, PixelFormat format)
|
||||||
{
|
{
|
||||||
switch(format) {
|
switch(PF_getNumChannels(format)) {
|
||||||
case PixelFormat::PF_RGB :
|
case 4:
|
||||||
case PixelFormat::PF_32BGR :
|
|
||||||
m_channels = RGB;
|
|
||||||
break;
|
|
||||||
case PixelFormat::PF_RGBA :
|
|
||||||
case PixelFormat::PF_32BGRA :
|
|
||||||
m_channels = RGBA;
|
m_channels = RGBA;
|
||||||
break;
|
break;
|
||||||
|
case 3:
|
||||||
|
m_channels = RGB;
|
||||||
|
break;
|
||||||
default :
|
default :
|
||||||
m_channels = Alpha;
|
m_channels = Alpha;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pixels.resize(m_size.y * getStride());
|
m_pixels.resize(m_size.y * getStride());
|
||||||
|
|
||||||
if (format == PixelFormat::PF_32BGR || format == PixelFormat::PF_32BGRA) {
|
// TODO: Move pixel format convertion to it's own function(s)
|
||||||
|
if (format == PixelFormat::PF_BGR || format == PixelFormat::PF_BGRA) {
|
||||||
const uint8_t *ptr = (const uint8_t *) pixels;
|
const uint8_t *ptr = (const uint8_t *) pixels;
|
||||||
|
|
||||||
for(int i = 0; i < m_pixels.size(); i += 4) {
|
for(int i = 0; i < m_pixels.size(); i += 4) {
|
||||||
m_pixels[i+0] = ptr[2];
|
m_pixels[i+0] = ptr[2];
|
||||||
m_pixels[i+1] = ptr[1];
|
m_pixels[i+1] = ptr[1];
|
||||||
m_pixels[i+2] = ptr[0];
|
m_pixels[i+2] = ptr[0];
|
||||||
if (format == PixelFormat::PF_32BGRA) {
|
if (format == PixelFormat::PF_BGRA) {
|
||||||
m_pixels[i+3] = ptr[3];
|
m_pixels[i+3] = ptr[3];
|
||||||
}
|
}
|
||||||
ptr += 4;
|
ptr += 4;
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,9 @@ bool IcoFormat::decode(Image& img, const unsigned char *data, unsigned size)
|
||||||
largest = findLargestImage(ent, num_ent);
|
largest = findLargestImage(ent, num_ent);
|
||||||
|
|
||||||
if (largest->bpp == 32) {
|
if (largest->bpp == 32) {
|
||||||
format = PixelFormat::PF_32BGRA;
|
format = PixelFormat::PF_BGRA;
|
||||||
} else {
|
} else {
|
||||||
format = PixelFormat::PF_32BGR;
|
format = PixelFormat::PF_BGR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: plus 40 bytes here to skip over the DIB header.
|
// NOTE: plus 40 bytes here to skip over the DIB header.
|
||||||
|
|
|
||||||
26
source/Graphics/PixelFormat.cpp
Normal file
26
source/Graphics/PixelFormat.cpp
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
#include <Spectre/Graphics/PixelFormat.h>
|
||||||
|
|
||||||
|
namespace sp {
|
||||||
|
|
||||||
|
uint8_t PF_getNumChannels(enum PixelFormat format)
|
||||||
|
{
|
||||||
|
switch(format) {
|
||||||
|
case PixelFormat::PF_RGBA :
|
||||||
|
case PixelFormat::PF_RGBA32 :
|
||||||
|
case PixelFormat::PF_BGRA :
|
||||||
|
case PixelFormat::PF_BGRA32 :
|
||||||
|
return 4;
|
||||||
|
case PixelFormat::PF_RGB :
|
||||||
|
case PixelFormat::PF_RGBX :
|
||||||
|
case PixelFormat::PF_RGBX32 :
|
||||||
|
case PixelFormat::PF_BGR :
|
||||||
|
case PixelFormat::PF_BGRX :
|
||||||
|
case PixelFormat::PF_BGRX32 :
|
||||||
|
return 3;
|
||||||
|
default :
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace sp
|
||||||
Loading…
Add table
Add a link
Reference in a new issue