gigatron/rom/Contrib/at67/image.h
2025-01-28 19:17:01 +03:00

85 lines
2.5 KiB
C++

#ifndef IMAGE_H
#define IMAGE_H
#include <stdint.h>
#include <string>
#include <vector>
#define GTRGB_IDENTIFIER "GTRGB"
namespace Image
{
// Possible future formats, (GT_RGB_222 is the only one currently supported)
enum GtRgbFormats {GT_RGB_222=0, GT_RGBA_2222, GT_Index_8, GT_RGB_565, GT_RGBA_5551, GT_RGBA_4444, GT_RGB_888, GT_RGBA_8888};
enum DiffusionType {LumError0=0, LumError1, LumError2, LumError3, RgbError, NumDiffusionTypes};
// Byte align and pack the structs so that we can read/write them directly, (should be compatible for Windows, Linux and hopefully MacOS)
#pragma pack(push, 1)
struct GtRgbHeader
{
char _name[6] = GTRGB_IDENTIFIER;
uint16_t _format;
uint16_t _width;
uint16_t _height;
};
struct GtRgbFile
{
GtRgbHeader _header;
std::vector<uint8_t> _data;
std::vector<uint16_t> _optional;
};
struct TgaHeader
{
uint8_t _idLength;
uint8_t _colourMapType;
uint8_t _imageType;
uint16_t _colourMapOrigin;
uint16_t _colourMapLength;
uint8_t _colourMapDepth;
uint16_t _originX;
uint16_t _originY;
uint16_t _width;
uint16_t _height;
uint8_t _bitsPerPixel;
uint8_t _imageDescriptor;
};
struct TgaFile
{
TgaHeader _header;
std::vector<uint8_t> _data;
uint8_t _imageOrigin = 0x00;
};
#pragma pack(pop)
double getGammaInput(void);
double getGammaOutput(void);
double getDiffusionScale(void);
DiffusionType getDiffusionType(void);
void setGammaInput(double gammaInput);
void setGammaOutput(double gammaOutput);
void setDiffusionScale(double diffusionScale);
void setDiffusionType(int diffusionType);
void initialise(void);
bool loadGtRgbFile(const std::string& filename, GtRgbFile& gtRgbFile);
bool saveGtRgbFile(const std::string& filename, GtRgbFile& gtRgbFile);
bool loadTgaFile(const std::string& filename, TgaFile& tgaFile);
bool convertRGB8toRGB2(const std::vector<uint8_t>& src, std::vector<uint8_t>& dst, int width, int height, uint8_t imageOrigin);
bool convertRGBA8toRGB2(const std::vector<uint8_t>& src, std::vector<uint8_t>& dst, int width, int height, uint8_t imageOrigin);
bool ditherRGB8toRGB2(std::vector<uint8_t>& src, std::vector<uint8_t>& dst, int width, int height, uint8_t imageOrigin);
bool ditherRGBA8toRGB2(std::vector<uint8_t>& src, std::vector<uint8_t>& dst, int width, int height, uint8_t imageOrigin);
void process(void);
}
#endif