mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:27:45 +00:00
GraphicsBitmap: Add a new "Indexed8" format that uses a 256-entry palette.
These bitmaps should only be used as a source bitmap, we won't support painting into them using Painter. You can however manipulate the raw pixel data. :^)
This commit is contained in:
parent
cec16105cc
commit
61e3ecec79
3 changed files with 56 additions and 8 deletions
|
@ -11,7 +11,7 @@
|
|||
|
||||
class GraphicsBitmap : public Retainable<GraphicsBitmap> {
|
||||
public:
|
||||
enum class Format { Invalid, RGB32, RGBA32 };
|
||||
enum class Format { Invalid, RGB32, RGBA32, Indexed8 };
|
||||
|
||||
static Retained<GraphicsBitmap> create(Format, const Size&);
|
||||
static Retained<GraphicsBitmap> create_wrapper(Format, const Size&, RGBA32*);
|
||||
|
@ -23,6 +23,8 @@ public:
|
|||
RGBA32* scanline(int y);
|
||||
const RGBA32* scanline(int y) const;
|
||||
|
||||
const byte* bits(int y) const;
|
||||
|
||||
Rect rect() const { return { {}, m_size }; }
|
||||
Size size() const { return m_size; }
|
||||
int width() const { return m_size.width(); }
|
||||
|
@ -37,6 +39,23 @@ public:
|
|||
|
||||
size_t size_in_bytes() const { return m_pitch * m_size.height() * sizeof(RGBA32); }
|
||||
|
||||
Color palette_color(byte index) const { return Color::from_rgba(m_palette[index]); }
|
||||
void set_palette_color(byte index, Color color) { m_palette[index] = color.value(); }
|
||||
|
||||
Color get_pixel(int x, int y) const
|
||||
{
|
||||
switch (m_format) {
|
||||
case Format::RGB32:
|
||||
return Color::from_rgb(scanline(y)[x]);
|
||||
case Format::RGBA32:
|
||||
return Color::from_rgba(scanline(y)[x]);
|
||||
case Format::Indexed8:
|
||||
return Color::from_rgba(m_palette[bits(y)[x]]);
|
||||
default:
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
GraphicsBitmap(Format, const Size&);
|
||||
GraphicsBitmap(Format, const Size&, RGBA32*);
|
||||
|
@ -45,6 +64,7 @@ private:
|
|||
|
||||
Size m_size;
|
||||
RGBA32* m_data { nullptr };
|
||||
RGBA32* m_palette { nullptr };
|
||||
size_t m_pitch { 0 };
|
||||
Format m_format { Format::Invalid };
|
||||
bool m_needs_munmap { false };
|
||||
|
@ -61,3 +81,8 @@ inline const RGBA32* GraphicsBitmap::scanline(int y) const
|
|||
{
|
||||
return reinterpret_cast<const RGBA32*>((((const byte*)m_data) + (y * m_pitch)));
|
||||
}
|
||||
|
||||
inline const byte* GraphicsBitmap::bits(int y) const
|
||||
{
|
||||
return reinterpret_cast<const byte*>(scanline(y));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue