mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:17:36 +00:00
JPGLoader: Move JPGLoader internal structs and #defines to JPGLoader.cpp
This commit is contained in:
parent
a8b00780a8
commit
4b19b99b36
2 changed files with 152 additions and 150 deletions
|
@ -40,6 +40,60 @@
|
||||||
if (JPG_DBG) \
|
if (JPG_DBG) \
|
||||||
dbg() << x
|
dbg() << x
|
||||||
|
|
||||||
|
#define JPG_INVALID 0X0000
|
||||||
|
|
||||||
|
#define JPG_APPN0 0XFFE0
|
||||||
|
#define JPG_APPN1 0XFFE1
|
||||||
|
#define JPG_APPN2 0XFFE2
|
||||||
|
#define JPG_APPN3 0XFFE3
|
||||||
|
#define JPG_APPN4 0XFFE4
|
||||||
|
#define JPG_APPN5 0XFFE5
|
||||||
|
#define JPG_APPN6 0XFFE6
|
||||||
|
#define JPG_APPN7 0XFFE7
|
||||||
|
#define JPG_APPN8 0XFFE8
|
||||||
|
#define JPG_APPN9 0XFFE9
|
||||||
|
#define JPG_APPNA 0XFFEA
|
||||||
|
#define JPG_APPNB 0XFFEB
|
||||||
|
#define JPG_APPNC 0XFFEC
|
||||||
|
#define JPG_APPND 0XFFED
|
||||||
|
#define JPG_APPNE 0xFFEE
|
||||||
|
#define JPG_APPNF 0xFFEF
|
||||||
|
|
||||||
|
#define JPG_RESERVED1 0xFFF1
|
||||||
|
#define JPG_RESERVED2 0xFFF2
|
||||||
|
#define JPG_RESERVED3 0xFFF3
|
||||||
|
#define JPG_RESERVED4 0xFFF4
|
||||||
|
#define JPG_RESERVED5 0xFFF5
|
||||||
|
#define JPG_RESERVED6 0xFFF6
|
||||||
|
#define JPG_RESERVED7 0xFFF7
|
||||||
|
#define JPG_RESERVED8 0xFFF8
|
||||||
|
#define JPG_RESERVED9 0xFFF9
|
||||||
|
#define JPG_RESERVEDA 0xFFFA
|
||||||
|
#define JPG_RESERVEDB 0xFFFB
|
||||||
|
#define JPG_RESERVEDC 0xFFFC
|
||||||
|
#define JPG_RESERVEDD 0xFFFD
|
||||||
|
|
||||||
|
#define JPG_RST0 0xFFD0
|
||||||
|
#define JPG_RST1 0xFFD1
|
||||||
|
#define JPG_RST2 0xFFD2
|
||||||
|
#define JPG_RST3 0xFFD3
|
||||||
|
#define JPG_RST4 0xFFD4
|
||||||
|
#define JPG_RST5 0xFFD5
|
||||||
|
#define JPG_RST6 0xFFD6
|
||||||
|
#define JPG_RST7 0xFFD7
|
||||||
|
|
||||||
|
#define JPG_DHP 0xFFDE
|
||||||
|
#define JPG_EXP 0xFFDF
|
||||||
|
|
||||||
|
#define JPG_DHT 0XFFC4
|
||||||
|
#define JPG_DQT 0XFFDB
|
||||||
|
#define JPG_EOI 0xFFD9
|
||||||
|
#define JPG_RST 0XFFDD
|
||||||
|
#define JPG_SOF0 0XFFC0
|
||||||
|
#define JPG_SOI 0XFFD8
|
||||||
|
#define JPG_SOS 0XFFDA
|
||||||
|
#define JPG_COM 0xFFFE
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
constexpr static u8 zigzag_map[64] {
|
constexpr static u8 zigzag_map[64] {
|
||||||
|
@ -55,6 +109,103 @@ constexpr static u8 zigzag_map[64] {
|
||||||
|
|
||||||
using Marker = u16;
|
using Marker = u16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MCU means group of data units that are coded together. A data unit is an 8x8
|
||||||
|
* block of component data. In interleaved scans, number of non-interleaved data
|
||||||
|
* units of a component C is Ch * Cv, where Ch and Cv represent the horizontal &
|
||||||
|
* vertical subsampling factors of the component, respectively. A MacroBlock is
|
||||||
|
* an 8x8 block of RGB values before encoding, and 8x8 block of YCbCr values when
|
||||||
|
* we're done decoding the huffman stream.
|
||||||
|
*/
|
||||||
|
struct Macroblock {
|
||||||
|
union {
|
||||||
|
i32 y[64] = { 0 };
|
||||||
|
i32 r[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
i32 cb[64] = { 0 };
|
||||||
|
i32 g[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
i32 cr[64] = { 0 };
|
||||||
|
i32 b[64];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MacroblockMeta {
|
||||||
|
u32 total;
|
||||||
|
u32 padded_total;
|
||||||
|
u32 hcount;
|
||||||
|
u32 vcount;
|
||||||
|
u32 hpadded_count;
|
||||||
|
u32 vpadded_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ComponentSpec {
|
||||||
|
i8 id { -1 };
|
||||||
|
u8 hsample_factor { 1 }; // Horizontal sampling factor.
|
||||||
|
u8 vsample_factor { 1 }; // Vertical sampling factor.
|
||||||
|
u8 ac_destination_id;
|
||||||
|
u8 dc_destination_id;
|
||||||
|
u8 qtable_id; // Quantization table id.
|
||||||
|
};
|
||||||
|
|
||||||
|
struct StartOfFrame {
|
||||||
|
enum class FrameType {
|
||||||
|
Baseline = 0
|
||||||
|
// Progressive = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
FrameType type { FrameType::Baseline };
|
||||||
|
u8 precision;
|
||||||
|
u16 height;
|
||||||
|
u16 width;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HuffmanTableSpec {
|
||||||
|
u8 type;
|
||||||
|
u8 destination_id;
|
||||||
|
u8 code_counts[16] = { 0 };
|
||||||
|
Vector<u8> symbols;
|
||||||
|
Vector<u16> codes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HuffmanStreamState {
|
||||||
|
Vector<u8> stream;
|
||||||
|
u8 bit_offset { 0 };
|
||||||
|
size_t byte_offset { 0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
struct JPGLoadingContext {
|
||||||
|
enum State {
|
||||||
|
NotDecoded = 0,
|
||||||
|
Error,
|
||||||
|
FrameDecoded,
|
||||||
|
BitmapDecoded
|
||||||
|
};
|
||||||
|
|
||||||
|
State state { State::NotDecoded };
|
||||||
|
const u8* data { nullptr };
|
||||||
|
size_t data_size { 0 };
|
||||||
|
u32 luma_table[64];
|
||||||
|
u32 chroma_table[64];
|
||||||
|
StartOfFrame frame;
|
||||||
|
u8 hsample_factor;
|
||||||
|
u8 vsample_factor;
|
||||||
|
bool has_zero_based_ids;
|
||||||
|
u8 component_count;
|
||||||
|
ComponentSpec components[3];
|
||||||
|
RefPtr<Gfx::Bitmap> bitmap;
|
||||||
|
u16 dc_reset_interval;
|
||||||
|
Vector<HuffmanTableSpec> dc_tables;
|
||||||
|
Vector<HuffmanTableSpec> ac_tables;
|
||||||
|
HuffmanStreamState huffman_stream;
|
||||||
|
i32 previous_dc_values[3] = { 0 };
|
||||||
|
MacroblockMeta mblock_meta;
|
||||||
|
};
|
||||||
|
|
||||||
void generate_huffman_codes(HuffmanTableSpec& table)
|
void generate_huffman_codes(HuffmanTableSpec& table)
|
||||||
{
|
{
|
||||||
unsigned code = 0;
|
unsigned code = 0;
|
||||||
|
|
|
@ -31,161 +31,12 @@
|
||||||
#include <LibGfx/ImageDecoder.h>
|
#include <LibGfx/ImageDecoder.h>
|
||||||
#include <LibGfx/Size.h>
|
#include <LibGfx/Size.h>
|
||||||
|
|
||||||
#define JPG_INVALID 0X0000
|
|
||||||
|
|
||||||
#define JPG_APPN0 0XFFE0
|
|
||||||
#define JPG_APPN1 0XFFE1
|
|
||||||
#define JPG_APPN2 0XFFE2
|
|
||||||
#define JPG_APPN3 0XFFE3
|
|
||||||
#define JPG_APPN4 0XFFE4
|
|
||||||
#define JPG_APPN5 0XFFE5
|
|
||||||
#define JPG_APPN6 0XFFE6
|
|
||||||
#define JPG_APPN7 0XFFE7
|
|
||||||
#define JPG_APPN8 0XFFE8
|
|
||||||
#define JPG_APPN9 0XFFE9
|
|
||||||
#define JPG_APPNA 0XFFEA
|
|
||||||
#define JPG_APPNB 0XFFEB
|
|
||||||
#define JPG_APPNC 0XFFEC
|
|
||||||
#define JPG_APPND 0XFFED
|
|
||||||
#define JPG_APPNE 0xFFEE
|
|
||||||
#define JPG_APPNF 0xFFEF
|
|
||||||
|
|
||||||
#define JPG_RESERVED1 0xFFF1
|
|
||||||
#define JPG_RESERVED2 0xFFF2
|
|
||||||
#define JPG_RESERVED3 0xFFF3
|
|
||||||
#define JPG_RESERVED4 0xFFF4
|
|
||||||
#define JPG_RESERVED5 0xFFF5
|
|
||||||
#define JPG_RESERVED6 0xFFF6
|
|
||||||
#define JPG_RESERVED7 0xFFF7
|
|
||||||
#define JPG_RESERVED8 0xFFF8
|
|
||||||
#define JPG_RESERVED9 0xFFF9
|
|
||||||
#define JPG_RESERVEDA 0xFFFA
|
|
||||||
#define JPG_RESERVEDB 0xFFFB
|
|
||||||
#define JPG_RESERVEDC 0xFFFC
|
|
||||||
#define JPG_RESERVEDD 0xFFFD
|
|
||||||
|
|
||||||
#define JPG_RST0 0xFFD0
|
|
||||||
#define JPG_RST1 0xFFD1
|
|
||||||
#define JPG_RST2 0xFFD2
|
|
||||||
#define JPG_RST3 0xFFD3
|
|
||||||
#define JPG_RST4 0xFFD4
|
|
||||||
#define JPG_RST5 0xFFD5
|
|
||||||
#define JPG_RST6 0xFFD6
|
|
||||||
#define JPG_RST7 0xFFD7
|
|
||||||
|
|
||||||
#define JPG_DHP 0xFFDE
|
|
||||||
#define JPG_EXP 0xFFDF
|
|
||||||
|
|
||||||
#define JPG_DHT 0XFFC4
|
|
||||||
#define JPG_DQT 0XFFDB
|
|
||||||
#define JPG_EOI 0xFFD9
|
|
||||||
#define JPG_RST 0XFFDD
|
|
||||||
#define JPG_SOF0 0XFFC0
|
|
||||||
#define JPG_SOI 0XFFD8
|
|
||||||
#define JPG_SOS 0XFFDA
|
|
||||||
#define JPG_COM 0xFFFE
|
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
RefPtr<Gfx::Bitmap> load_jpg(const StringView& path);
|
RefPtr<Gfx::Bitmap> load_jpg(const StringView& path);
|
||||||
RefPtr<Gfx::Bitmap> load_jpg_from_memory(const u8* data, size_t length);
|
RefPtr<Gfx::Bitmap> load_jpg_from_memory(const u8* data, size_t length);
|
||||||
|
|
||||||
/**
|
struct JPGLoadingContext;
|
||||||
* MCU means group of data units that are coded together. A data unit is an 8x8
|
|
||||||
* block of component data. In interleaved scans, number of non-interleaved data
|
|
||||||
* units of a component C is Ch * Cv, where Ch and Cv represent the horizontal &
|
|
||||||
* vertical subsampling factors of the component, respectively. A MacroBlock is
|
|
||||||
* an 8x8 block of RGB values before encoding, and 8x8 block of YCbCr values when
|
|
||||||
* we're done decoding the huffman stream.
|
|
||||||
*/
|
|
||||||
struct Macroblock {
|
|
||||||
union {
|
|
||||||
i32 y[64] = { 0 };
|
|
||||||
i32 r[64];
|
|
||||||
};
|
|
||||||
|
|
||||||
union {
|
|
||||||
i32 cb[64] = { 0 };
|
|
||||||
i32 g[64];
|
|
||||||
};
|
|
||||||
|
|
||||||
union {
|
|
||||||
i32 cr[64] = { 0 };
|
|
||||||
i32 b[64];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MacroblockMeta {
|
|
||||||
u32 total;
|
|
||||||
u32 padded_total;
|
|
||||||
u32 hcount;
|
|
||||||
u32 vcount;
|
|
||||||
u32 hpadded_count;
|
|
||||||
u32 vpadded_count;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ComponentSpec {
|
|
||||||
i8 id { -1 };
|
|
||||||
u8 hsample_factor { 1 }; // Horizontal sampling factor.
|
|
||||||
u8 vsample_factor { 1 }; // Vertical sampling factor.
|
|
||||||
u8 ac_destination_id;
|
|
||||||
u8 dc_destination_id;
|
|
||||||
u8 qtable_id; // Quantization table id.
|
|
||||||
};
|
|
||||||
|
|
||||||
struct StartOfFrame {
|
|
||||||
enum class FrameType {
|
|
||||||
Baseline = 0
|
|
||||||
// Progressive = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
FrameType type { FrameType::Baseline };
|
|
||||||
u8 precision;
|
|
||||||
u16 height;
|
|
||||||
u16 width;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct HuffmanTableSpec {
|
|
||||||
u8 type;
|
|
||||||
u8 destination_id;
|
|
||||||
u8 code_counts[16] = { 0 };
|
|
||||||
Vector<u8> symbols;
|
|
||||||
Vector<u16> codes;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct HuffmanStreamState {
|
|
||||||
Vector<u8> stream;
|
|
||||||
u8 bit_offset { 0 };
|
|
||||||
size_t byte_offset { 0 };
|
|
||||||
};
|
|
||||||
|
|
||||||
struct JPGLoadingContext {
|
|
||||||
enum State {
|
|
||||||
NotDecoded = 0,
|
|
||||||
Error,
|
|
||||||
FrameDecoded,
|
|
||||||
BitmapDecoded
|
|
||||||
};
|
|
||||||
|
|
||||||
State state { State::NotDecoded };
|
|
||||||
const u8* data { nullptr };
|
|
||||||
size_t data_size { 0 };
|
|
||||||
u32 luma_table[64];
|
|
||||||
u32 chroma_table[64];
|
|
||||||
StartOfFrame frame;
|
|
||||||
u8 hsample_factor;
|
|
||||||
u8 vsample_factor;
|
|
||||||
bool has_zero_based_ids;
|
|
||||||
u8 component_count;
|
|
||||||
ComponentSpec components[3];
|
|
||||||
RefPtr<Gfx::Bitmap> bitmap;
|
|
||||||
u16 dc_reset_interval;
|
|
||||||
Vector<HuffmanTableSpec> dc_tables;
|
|
||||||
Vector<HuffmanTableSpec> ac_tables;
|
|
||||||
HuffmanStreamState huffman_stream;
|
|
||||||
i32 previous_dc_values[3] = { 0 };
|
|
||||||
MacroblockMeta mblock_meta;
|
|
||||||
};
|
|
||||||
|
|
||||||
class JPGImageDecoderPlugin : public ImageDecoderPlugin {
|
class JPGImageDecoderPlugin : public ImageDecoderPlugin {
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue