mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-23 09:51:57 -05: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) \
|
||||
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 {
|
||||
|
||||
constexpr static u8 zigzag_map[64] {
|
||||
|
@ -55,6 +109,103 @@ constexpr static u8 zigzag_map[64] {
|
|||
|
||||
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)
|
||||
{
|
||||
unsigned code = 0;
|
||||
|
|
|
@ -31,161 +31,12 @@
|
|||
#include <LibGfx/ImageDecoder.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 {
|
||||
|
||||
RefPtr<Gfx::Bitmap> load_jpg(const StringView& path);
|
||||
RefPtr<Gfx::Bitmap> load_jpg_from_memory(const u8* data, size_t length);
|
||||
|
||||
/**
|
||||
* 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;
|
||||
};
|
||||
struct JPGLoadingContext;
|
||||
|
||||
class JPGImageDecoderPlugin : public ImageDecoderPlugin {
|
||||
public:
|
||||
|
|
Loading…
Add table
Reference in a new issue