GraphicsBitmap.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #include "Color.h"
  3. #include "Rect.h"
  4. #include "Size.h"
  5. #include <AK/Retainable.h>
  6. #include <AK/RetainPtr.h>
  7. #include <AK/AKString.h>
  8. class GraphicsBitmap : public Retainable<GraphicsBitmap> {
  9. public:
  10. enum class Format { Invalid, RGB32, RGBA32 };
  11. static Retained<GraphicsBitmap> create(Format, const Size&);
  12. static Retained<GraphicsBitmap> create_wrapper(Format, const Size&, RGBA32*);
  13. static RetainPtr<GraphicsBitmap> load_from_file(Format, const String& path, const Size&);
  14. static RetainPtr<GraphicsBitmap> create_with_shared_buffer(Format, int shared_buffer_id, const Size&, RGBA32* buffer = nullptr);
  15. ~GraphicsBitmap();
  16. RGBA32* scanline(int y);
  17. const RGBA32* scanline(int y) const;
  18. Rect rect() const { return { {}, m_size }; }
  19. Size size() const { return m_size; }
  20. int width() const { return m_size.width(); }
  21. int height() const { return m_size.height(); }
  22. size_t pitch() const { return m_pitch; }
  23. int shared_buffer_id() const { return m_shared_buffer_id; }
  24. bool has_alpha_channel() const { return m_format == Format::RGBA32; }
  25. private:
  26. GraphicsBitmap(Format, const Size&);
  27. GraphicsBitmap(Format, const Size&, RGBA32*);
  28. GraphicsBitmap(Format, int shared_buffer_id, const Size&, RGBA32*);
  29. Size m_size;
  30. RGBA32* m_data { nullptr };
  31. size_t m_pitch { 0 };
  32. Format m_format { Format::Invalid };
  33. bool m_mmaped { false };
  34. int m_shared_buffer_id { -1 };
  35. };
  36. inline RGBA32* GraphicsBitmap::scanline(int y)
  37. {
  38. return reinterpret_cast<RGBA32*>((((byte*)m_data) + (y * m_pitch)));
  39. }
  40. inline const RGBA32* GraphicsBitmap::scanline(int y) const
  41. {
  42. return reinterpret_cast<const RGBA32*>((((const byte*)m_data) + (y * m_pitch)));
  43. }