From 503720b574c2ae79df5cbd05788c854ed7b680d4 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Tue, 20 Jun 2023 16:12:26 -0400 Subject: [PATCH] LibGfx/JPEG: Put generic definitions in a shared header That file holds information that are used by both a decoder and an encoder. --- .../LibGfx/ImageFormats/JPEGLoader.cpp | 101 +--------------- .../LibGfx/ImageFormats/JPEGShared.h | 111 ++++++++++++++++++ 2 files changed, 112 insertions(+), 100 deletions(-) create mode 100644 Userland/Libraries/LibGfx/ImageFormats/JPEGShared.h diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp index 39aee02ef3..372d3f08b0 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp @@ -17,109 +17,10 @@ #include #include #include - -// These names are defined in B.1.1.3 - Marker assignments - -#define JPEG_APPN0 0XFFE0 -#define JPEG_APPN1 0XFFE1 -#define JPEG_APPN2 0XFFE2 -#define JPEG_APPN3 0XFFE3 -#define JPEG_APPN4 0XFFE4 -#define JPEG_APPN5 0XFFE5 -#define JPEG_APPN6 0XFFE6 -#define JPEG_APPN7 0XFFE7 -#define JPEG_APPN8 0XFFE8 -#define JPEG_APPN9 0XFFE9 -#define JPEG_APPN10 0XFFEA -#define JPEG_APPN11 0XFFEB -#define JPEG_APPN12 0XFFEC -#define JPEG_APPN13 0XFFED -#define JPEG_APPN14 0xFFEE -#define JPEG_APPN15 0xFFEF - -#define JPEG_RESERVED1 0xFFF1 -#define JPEG_RESERVED2 0xFFF2 -#define JPEG_RESERVED3 0xFFF3 -#define JPEG_RESERVED4 0xFFF4 -#define JPEG_RESERVED5 0xFFF5 -#define JPEG_RESERVED6 0xFFF6 -#define JPEG_RESERVED7 0xFFF7 -#define JPEG_RESERVED8 0xFFF8 -#define JPEG_RESERVED9 0xFFF9 -#define JPEG_RESERVEDA 0xFFFA -#define JPEG_RESERVEDB 0xFFFB -#define JPEG_RESERVEDC 0xFFFC -#define JPEG_RESERVEDD 0xFFFD - -#define JPEG_RST0 0xFFD0 -#define JPEG_RST1 0xFFD1 -#define JPEG_RST2 0xFFD2 -#define JPEG_RST3 0xFFD3 -#define JPEG_RST4 0xFFD4 -#define JPEG_RST5 0xFFD5 -#define JPEG_RST6 0xFFD6 -#define JPEG_RST7 0xFFD7 - -#define JPEG_ZRL 0xF0 - -#define JPEG_DHP 0xFFDE -#define JPEG_EXP 0xFFDF - -#define JPEG_DAC 0XFFCC -#define JPEG_DHT 0XFFC4 -#define JPEG_DQT 0XFFDB -#define JPEG_EOI 0xFFD9 -#define JPEG_DRI 0XFFDD -#define JPEG_SOF0 0XFFC0 -#define JPEG_SOF1 0XFFC1 -#define JPEG_SOF2 0xFFC2 -#define JPEG_SOF15 0xFFCF -#define JPEG_SOI 0XFFD8 -#define JPEG_SOS 0XFFDA -#define JPEG_COM 0xFFFE +#include namespace Gfx { -constexpr static u8 zigzag_map[64] { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -}; - -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 { - i16 y[64] = { 0 }; - i16 r[64]; - }; - - union { - i16 cb[64] = { 0 }; - i16 g[64]; - }; - - union { - i16 cr[64] = { 0 }; - i16 b[64]; - }; - - i16 k[64] = { 0 }; -}; - struct MacroblockMeta { u32 total { 0 }; u32 padded_total { 0 }; diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGShared.h b/Userland/Libraries/LibGfx/ImageFormats/JPEGShared.h new file mode 100644 index 0000000000..62369fbf04 --- /dev/null +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGShared.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2023, Lucas Chollet + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +// These names are defined in B.1.1.3 - Marker assignments + +#define JPEG_APPN0 0XFFE0 +#define JPEG_APPN1 0XFFE1 +#define JPEG_APPN2 0XFFE2 +#define JPEG_APPN3 0XFFE3 +#define JPEG_APPN4 0XFFE4 +#define JPEG_APPN5 0XFFE5 +#define JPEG_APPN6 0XFFE6 +#define JPEG_APPN7 0XFFE7 +#define JPEG_APPN8 0XFFE8 +#define JPEG_APPN9 0XFFE9 +#define JPEG_APPN10 0XFFEA +#define JPEG_APPN11 0XFFEB +#define JPEG_APPN12 0XFFEC +#define JPEG_APPN13 0XFFED +#define JPEG_APPN14 0xFFEE +#define JPEG_APPN15 0xFFEF + +#define JPEG_RESERVED1 0xFFF1 +#define JPEG_RESERVED2 0xFFF2 +#define JPEG_RESERVED3 0xFFF3 +#define JPEG_RESERVED4 0xFFF4 +#define JPEG_RESERVED5 0xFFF5 +#define JPEG_RESERVED6 0xFFF6 +#define JPEG_RESERVED7 0xFFF7 +#define JPEG_RESERVED8 0xFFF8 +#define JPEG_RESERVED9 0xFFF9 +#define JPEG_RESERVEDA 0xFFFA +#define JPEG_RESERVEDB 0xFFFB +#define JPEG_RESERVEDC 0xFFFC +#define JPEG_RESERVEDD 0xFFFD + +#define JPEG_RST0 0xFFD0 +#define JPEG_RST1 0xFFD1 +#define JPEG_RST2 0xFFD2 +#define JPEG_RST3 0xFFD3 +#define JPEG_RST4 0xFFD4 +#define JPEG_RST5 0xFFD5 +#define JPEG_RST6 0xFFD6 +#define JPEG_RST7 0xFFD7 + +#define JPEG_ZRL 0xF0 + +#define JPEG_DHP 0xFFDE +#define JPEG_EXP 0xFFDF + +#define JPEG_DAC 0XFFCC +#define JPEG_DHT 0XFFC4 +#define JPEG_DQT 0XFFDB +#define JPEG_EOI 0xFFD9 +#define JPEG_DRI 0XFFDD +#define JPEG_SOF0 0XFFC0 +#define JPEG_SOF1 0XFFC1 +#define JPEG_SOF2 0xFFC2 +#define JPEG_SOF15 0xFFCF +#define JPEG_SOI 0XFFD8 +#define JPEG_SOS 0XFFDA +#define JPEG_COM 0xFFFE + +namespace Gfx { + +using Marker = u16; + +constexpr static u8 zigzag_map[64] { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63 +}; + +/** + * 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 { + i16 y[64] = { 0 }; + i16 r[64]; + }; + + union { + i16 cb[64] = { 0 }; + i16 g[64]; + }; + + union { + i16 cr[64] = { 0 }; + i16 b[64]; + }; + + i16 k[64] = { 0 }; +}; + +}