From 74e3a0a4ed0a42b62b78443328b655dadb997343 Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Thu, 8 Dec 2022 10:29:25 +0100 Subject: [PATCH] fixup! feat(core): basic support for jpeg rendering --- core/SConscript.firmware | 2 +- core/SConscript.unix | 2 +- core/embed/extmod/modtrezorui/display.c | 2 +- .../extmod/modtrezorui/tjpgd/doc/00index.html | 77 ------ .../extmod/modtrezorui/tjpgd/doc/aa_idct.png | Bin 13605 -> 0 bytes .../extmod/modtrezorui/tjpgd/doc/css_e.css | 60 ----- .../modtrezorui/tjpgd/doc/en/appnote.html | 234 ------------------ .../modtrezorui/tjpgd/doc/en/decomp.html | 64 ----- .../modtrezorui/tjpgd/doc/en/input.html | 53 ---- .../extmod/modtrezorui/tjpgd/doc/en/jdec.html | 46 ---- .../extmod/modtrezorui/tjpgd/doc/en/jpeg.jpeg | Bin 14188 -> 0 bytes .../extmod/modtrezorui/tjpgd/doc/en/opt.png | Bin 29921 -> 0 bytes .../modtrezorui/tjpgd/doc/en/output.html | 60 ----- .../extmod/modtrezorui/tjpgd/doc/en/p1.png | Bin 3338 -> 0 bytes .../modtrezorui/tjpgd/doc/en/prepare.html | 69 ------ .../modtrezorui/tjpgd/{src => }/tjpgd.c | 0 .../modtrezorui/tjpgd/{src => }/tjpgd.h | 0 .../modtrezorui/tjpgd/{src => }/tjpgdcnf.h | 0 18 files changed, 3 insertions(+), 666 deletions(-) delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/00index.html delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/aa_idct.png delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/css_e.css delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/appnote.html delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/decomp.html delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/input.html delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/jdec.html delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/jpeg.jpeg delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/opt.png delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/output.html delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/p1.png delete mode 100644 core/embed/extmod/modtrezorui/tjpgd/doc/en/prepare.html rename core/embed/extmod/modtrezorui/tjpgd/{src => }/tjpgd.c (100%) rename core/embed/extmod/modtrezorui/tjpgd/{src => }/tjpgd.h (100%) rename core/embed/extmod/modtrezorui/tjpgd/{src => }/tjpgdcnf.h (100%) diff --git a/core/SConscript.firmware b/core/SConscript.firmware index d409bbfce..de5cdb934 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -179,7 +179,7 @@ SOURCE_MOD += [ 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'embed/extmod/modtrezorui/modtrezorui.c', 'embed/extmod/modtrezorui/qr-code-generator/qrcodegen.c', - 'embed/extmod/modtrezorui/tjpgd/src/tjpgd.c', + 'embed/extmod/modtrezorui/tjpgd/tjpgd.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', diff --git a/core/SConscript.unix b/core/SConscript.unix index f10b9581b..045ed5770 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -175,7 +175,7 @@ SOURCE_MOD += [ 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'embed/extmod/modtrezorui/modtrezorui.c', 'embed/extmod/modtrezorui/qr-code-generator/qrcodegen.c', - 'embed/extmod/modtrezorui/tjpgd/src/tjpgd.c', + 'embed/extmod/modtrezorui/tjpgd/tjpgd.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', diff --git a/core/embed/extmod/modtrezorui/display.c b/core/embed/extmod/modtrezorui/display.c index 723669099..98e404741 100644 --- a/core/embed/extmod/modtrezorui/display.c +++ b/core/embed/extmod/modtrezorui/display.c @@ -20,7 +20,7 @@ #define _GNU_SOURCE #include "qr-code-generator/qrcodegen.h" -#include "tjpgd/src/tjpgd.h" +#include "tjpgd/tjpgd.h" #include "uzlib.h" diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/00index.html b/core/embed/extmod/modtrezorui/tjpgd/doc/00index.html deleted file mode 100644 index bc0b960d8..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/00index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - -TJpgDec - Tiny JPEG Decompressor - - - -

TJpgDec - Tiny JPEG Decompressor

-
- -
-layer -

TJpgDec is a generic JPEG image decompressor module that highly optimized for small embedded systems. It works with very low memory consumption, so that it can be incorporated into tiny microcontrollers, such as AVR, 8051, PIC, Z80, Cortex-M0 and etc.

- -

Features

- -
- - -
-

Application Interface

-

There are two API functions to analyze and decompress the JPEG image.

- -
- - -
-

I/O functions

-

To input the JPEG data and output the decompressed image, TJpgDec requires two user defined I/O functions. These are called back from the TJpgDec module in the decompression process.

- -
- - -
-

Resources

-

The TJpgDec module is a free software opened for education, research and development. You can use, modify and/or redistribute it for personal projects or commercial products without any restriction under your responsibility.

- -
- - -
-

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/aa_idct.png b/core/embed/extmod/modtrezorui/tjpgd/doc/aa_idct.png deleted file mode 100644 index ec9421b56272492cd8b039b26abcd7e11afdd51b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13605 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 diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/css_e.css b/core/embed/extmod/modtrezorui/tjpgd/doc/css_e.css deleted file mode 100644 index 7e234d2f3..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/css_e.css +++ /dev/null @@ -1,60 +0,0 @@ -* {margin: 0; padding: 0; border-width: 0;} -body {margin: 8px; background-color: #e0ffff; font-color: black; font-family: serif; line-height: 133%; max-width: 1024px;} -a:link {color: blue;} -a:visited {color: darkmagenta;} -a:hover {background-color: #a0ffff;} -a:active {color: darkmagenta; overflow: hidden; outline:none; position: relative; top: 1px; left: 1px;} -abbr {border-width: 1px;} - -p {margin: 0 0 0.3em 1em;} -em {font-style: normal; font-weight: bold; margin: 0 0.1em;} -pre em {font-style: italic; font-weight: normal;} -strong {} -pre {border: 1px dashed gray; margin: 0.5em 1em; padding: 0.5em; line-height: 1.2em; font-size: 85%; font-family: "Consolas", "Courier New", monospace; background-color: white;} -pre span.c {color: green;} -pre span.k {color: blue;} -tt {margin: 0 0.2em; font-size: 85%; font-family: "Consolas", "Courier New", monospace; } -tt.arg {font-style: italic;} -ol {margin: 0 2.5em;} -ul {margin: 0 2em;} -dl {margin: 0 1em;} -dt {font-size: 85%; font-family: "Consolas", "Courier New", monospace;} -dl.par dt {margin: 0.5em 0 0 0 ; font-style: italic; } -dl.ret dt {margin: 0.5em 0 0 0 ; } -dd {margin: 0 2em;} -hr {border-width: 1px; margin: 1em;} -div.abst {font-family: sans-serif;} -div.para {clear: both; font-family: serif;} -div.ret a {font-size: 85%; font-family: "Consolas", "Courier New", monospace; } -.equ {text-indent: 0; margin: 1em 2em 1em;} -.indent {margin-left: 2em;} -.rset {float: right; margin: 0 0 0.5em 0.5em;} -.lset {float: left; margin: 0 0.5em 0.5em 0.5em;} -ul.flat li {list-style-type: none; margin: 0;} -a.imglnk img {border: 1px solid;} -.iequ {white-space: nowrap; font-weight: bold;} -.clr {clear: both;} -.it {font-style: italic;} -.mfd {font-size: 0.7em; padding: 0 1px; border: 1px solid; white-space : nowrap} - -h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} -p.hdd {float: right; text-align: right; margin-top: 0.5em;} -hr.hds {clear: both; margin-bottom: 1em;} - -h2 {font-size: 2em; font-family: sans-serif; background-color: #d8d8FF; padding: 0.5em 0.5em; margin: 0 0 0.5em;} -h3 {font-size: 1.5em; font-family: sans-serif; margin: 1.5em 0 0.5em;} -h4 {font-size: 1.2em; font-family: sans-serif; margin: 1em 0 0.2em;} -h5 {font-size: 1em; font-family: sans-serif; margin: 0.5em 0 0em;} -small {font-size: 80%;} -.indent {margin-left: 2em;} - -/* Tables */ -table {margin: 0.5em 1em; border-collapse: collapse; border: 2px solid black; } -th {background-color: white; border-style: solid; border-width: 1px 1px 2px; border-color: black; padding: 0 3px; vertical-align: top; white-space: nowrap;} -td {background-color: white; border: 1px solid black; padding: 0 3px; vertical-align: top; line-height: 1.3em;} -table.lst td:first-child {font-size: 85%; font-family: "Consolas", "Courier New", monospace;} -table.lst2 td {font-size: 85%; font-family: "Consolas", "Courier New", monospace;} -table caption {font-family: sans-serif; font-weight: bold;} -tr.lst3 td { border-width: 2px 1px 1px; } - -p.foot {clear: both; text-indent: 0; margin: 1em 0.5em 1em;} diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/appnote.html b/core/embed/extmod/modtrezorui/tjpgd/doc/en/appnote.html deleted file mode 100644 index d06fa5bb0..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/en/appnote.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - -TJpgDec Module Application Note - - - - -

TJpgDec Module Application Note

-
    -
  1. How to Use
  2. -
  3. Limits
  4. -
  5. Memory Usage
  6. -
  7. Options
  8. -
  9. About TJpgDec License
  10. -
-
- -
-

How to Use

-

First of all, you should build and run the sample program shown below. This is a typical usage of TJpgDec module and it helps to narrow down the problem on debugging.

-

The decompression session is divided in two stages. The first stage is to analyze the JPEG image and the second stage is to decompress it.

-
    -
  1. Initialize input stream. (e.g. open a file)
  2. -
  3. Allocate JPEG decompression object and work area.
  4. -
  5. Call jd_prepare() to analyze and prepare to decompress the JPEG image.
  6. -
  7. Initialize output device with the image info in the decompression object.
  8. -
  9. Call jd_decomp() to decompress the JPEG image.
  10. -
- -

System Organization

-

- -

Example

-
-/*------------------------------------------------*/
-/* TJpgDec Quick Evaluation Program for PCs       */
-/*------------------------------------------------*/
-
-#include <stdio.h>
-#include <string.h>
-#include "tjpgd.h"
-
-/* Bytes per pixel of image output */
-#define N_BPP (3 - JD_FORMAT)
-
-
-/* Session identifier for input/output functions (name, members and usage are as user defined) */
-typedef struct {
-    FILE *fp;               /* Input stream */
-    uint8_t *fbuf;          /* Output frame buffer */
-    unsigned int wfbuf;     /* Width of the frame buffer [pix] */
-} IODEV;
-
-
-/*------------------------------*/
-/* User defined input funciton  */
-/*------------------------------*/
-
-size_t in_func (    /* Returns number of bytes read (zero on error) */
-    JDEC* jd,       /* Decompression object */
-    uint8_t* buff,  /* Pointer to the read buffer (null to remove data) */
-    size_t nbyte    /* Number of bytes to read/remove */
-)
-{
-    IODEV *dev = (IODEV*)jd->device;   /* Session identifier (5th argument of jd_prepare function) */
-
-
-    if (buff) { /* Raad data from imput stream */
-        return fread(buff, 1, nbyte, dev->fp);
-    } else {    /* Remove data from input stream */
-        return fseek(dev->fp, nbyte, SEEK_CUR) ? 0 : nbyte;
-    }
-}
-
-
-/*------------------------------*/
-/* User defined output funciton */
-/*------------------------------*/
-
-int out_func (      /* Returns 1 to continue, 0 to abort */
-    JDEC* jd,       /* Decompression object */
-    void* bitmap,   /* Bitmap data to be output */
-    JRECT* rect     /* Rectangular region of output image */
-)
-{
-    IODEV *dev = (IODEV*)jd->device;   /* Session identifier (5th argument of jd_prepare function) */
-    uint8_t *src, *dst;
-    uint16_t y, bws;
-    unsigned int bwd;
-
-
-    /* Progress indicator */
-    if (rect->left == 0) {
-        printf("\r%lu%%", (rect->top << jd->scale) * 100UL / jd->height);
-    }
-
-    /* Copy the output image rectangle to the frame buffer */
-    src = (uint8_t*)bitmap;                           /* Output bitmap */
-    dst = dev->fbuf + N_BPP * (rect->top * dev->wfbuf + rect->left);  /* Left-top of rectangle in the frame buffer */
-    bws = N_BPP * (rect->right - rect->left + 1);     /* Width of the rectangle [byte] */
-    bwd = N_BPP * dev->wfbuf;                         /* Width of the frame buffer [byte] */
-    for (y = rect->top; y <= rect->bottom; y++) {
-        memcpy(dst, src, bws);   /* Copy a line */
-        src += bws; dst += bwd;  /* Next line */
-    }
-
-    return 1;    /* Continue to decompress */
-}
-
-
-/*------------------------------*/
-/* Program Main                 */
-/*------------------------------*/
-
-int main (int argc, char* argv[])
-{
-    JRESULT res;      /* Result code of TJpgDec API */
-    JDEC jdec;        /* Decompression object */
-    void *work;       /* Pointer to the work area */
-    size_t sz_work = 3500; /* Size of work area */
-    IODEV devid;      /* Session identifier */
-
-
-    /* Initialize input stream */
-    if (argc < 2) return -1;
-    devid.fp = fopen(argv[1], "rb");
-    if (!devid.fp) return -1;
-
-    /* Prepare to decompress */
-    work = (void*)malloc(sz_work);
-    res = jd_prepare(&jdec, in_func, work, sz_work, &devid);
-    if (res == JDR_OK) {
-        /* It is ready to dcompress and image info is available here */
-        printf("Image size is %u x %u.\n%u bytes of work ares is used.\n", jdec.width, jdec.height, sz_work - jdec.sz_pool);
-
-        /* Initialize output device */
-        devid.fbuf = (uint8_t*)malloc(N_BPP * jdec.width * jdec.height); /* Create frame buffer for output image */
-        devid.wfbuf = jdec.width;
-
-        res = jd_decomp(&jdec, out_func, 0);   /* Start to decompress with 1/1 scaling */
-        if (res == JDR_OK) {
-            /* Decompression succeeded. You have the decompressed image in the frame buffer here. */
-            printf("\rDecompression succeeded.\n");
-
-        } else {
-            printf("jd_decomp() failed (rc=%d)\n", res);
-        }
-
-        free(devid.fbuf);    /* Discard frame buffer */
-
-    } else {
-        printf("jd_prepare() failed (rc=%d)\n", res);
-    }
-
-    free(work);             /* Discard work area */
-
-    fclose(devid.fp);       /* Close the JPEG file */
-
-    return res;
-}
-
- -
- -
-

Limits

-
    -
  • JPEG standard: Baseline only. Progressive and Lossless JPEG format are not supported.
  • -
  • Image size: Upto 65520 x 65520 pixels.
  • -
  • Colorspace: Y-Cb-Cr (color) and Grayscale (monochrome).
  • -
  • Sampling factor: 4:4:4, 4:2:2, 4:2:2(V) or 4:2:0 for color image.
  • -
-
- -
-

Memory Usage

-

These are the memory usage of some platforms at default configuration. Each compilations are optimized in code size.

- - - - -
AVRPIC24CM0IA-32
CompilerGCCC30GCCMSC
text+const6.1k5.1k3.1k3.7k
-

TJpgDec requires a work area upto 3100 bytes for most JPEG images. It exactly depends on what parameter has been used to create the JPEG image to be decompressed. The 3100 bytes is the maximum memory requirement in default configuration and it varies depends on JD_SZBUF and JD_FASTDECODE.

-
- - -
-

Options

-

TJpgDec has some configuration options on output format, performance and memory usage. These options are in tjpgdcnf.h.

-
-
JD_SZBUF
-
This option speficies how many bytes read from input stream at a time. TJpgDec alignes each read request to the buffer size, so that 512, 1024, 2048... byte is ideal to read data from the storage device.
-
JD_FORMAT
-
This option speficies the output pixel format. 0:RGB888, 1:RGB565 or 2:Grayscale.
-
JD_USE_SCALE
-
This option switches output scaling feature. When enabled (1), the output image can be descaled on decompression. The descaling ratio is specified in jd_decomp function.
-
JD_FASTDECODE
-
This option switches the decompression algorithm. How this option affects the performance is highly depends on the processor architectre as shown in right image. The Lv.0 is the basic optimization in minimal memory usage suitable for 8/16-bit processors. The Lv.1 depends on 32-bit barrel shifter and is suitable for 32-bit processors. It requires additional 320 bytes of work area. The Lv.2 enables the table conversion for huffman decoding. It requires additional 6 << HUFF_BITS, 6144 by default, bytes of work area.
-
JD_TBLCLIP
-
This option switches to use table conversion for saturation alithmetics. It requires 1024 bytes of code size.
-
-
- - -
-

About TJpgDec License

-

This is a copy of the TJpgDec license document that included in the source codes.

-
-/*----------------------------------------------------------------------------/
-/ TJpgDec - Tiny JPEG Decompressor R0.xx                       (C)ChaN, 20xx
-/-----------------------------------------------------------------------------/
-/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems.
-/ This is a free software that opened for education, research and commercial
-/  developments under license policy of following terms.
-/
-/  Copyright (C) 20xx, ChaN, all right reserved.
-/
-/ * The TJpgDec module is a free software and there is NO WARRANTY.
-/ * No restriction on use. You can use, modify and redistribute it for
-/   personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
-/ * Redistributions of source code must retain the above copyright notice.
-/
-/----------------------------------------------------------------------------*/
-

Therefore TJpgDec license is one of the BSD-style license but there is a significant difference. Because TJpgDec is for embedded projects, so that the conditions for redistributions in binary form, such as embedded code, hex file and binary library, are not specified in order to maximize its usability. The documentation of the distributions may or may not include about TJpgDec and its license document. Of course TJpgDec is compatible with the projects under GNU GPL. When redistribute TJpgDec with any modification, the license can also be changed to GNU GPL or any BSD-style license.

-
- -

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/decomp.html b/core/embed/extmod/modtrezorui/tjpgd/doc/en/decomp.html deleted file mode 100644 index 12048a084..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/en/decomp.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - -TJpgDec - jd_decomp - - - - -
-

jd_decomp

-

The jd_decomp function decompress the JPEG image and output it as pixel data.

-
-JRESULT jd_decomp (
-  JDEC* jdec,             /* Pointer to valid decompression object */
-  int(*outfunc)(JDEC*,void*,JRECT*), /* Pointer to output function */
-  uint8_t scale           /* Scaling factor */
-);
-
-
- -
-

Parameters

-
-
jdec
-
Specifies the valid decompressor object.
-
outfunc
-
Specifies the user defined data output function. The jd_decomp function calls this function to output the decompressed JPEG image in pre-defined pixel format.
-
scale
-
Specifies scaling factor N for output. The output image is descaled to 1/2N (N = 0 to 3). When scaling feature is disabled (JD_USE_SCALE == 0), it must be 0.
-
-
- - -
-

Return Values

-
-
JDR_OK
-
Function succeeded.
-
JDR_INTR
-
The decompression process was interrupted by output function.
-
JDR_INP
-
An error occured in input function due to hard error or wrong stream termination.
-
JDR_PAR
-
Parameter error. Given scale factor is invalid.
-
JDR_FMT1
-
Data format error. The input JPEG data can be collapted.
-
-
- - -
-

Description

-

The jd_decomp function is the second stage of a JPEG decompression session. It decompresses the input JPEG stream and outputs it via user defined output function. After this function, the decompressor object is no longer valid.

-

The scaling factor can be specified on decompresson. It descales the size of the output image by 1/2, 1/4 or 1/8. For example, when decompress a JPEG image of 1024x768 in 1/4 scaling, the decmopressed image will be output in 256x192. The scaling ratio of 1/2 and 1/4 will slightly decrease the decompression speed compared to 1/1 due to averaging process. However scaling ratio of 1/8 will 2-3 times faster than 1/1, because IDCT and averaging process for each block can be skipped. This characteristic is sutable to create thumbnails.

-
- - -

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/input.html b/core/embed/extmod/modtrezorui/tjpgd/doc/en/input.html deleted file mode 100644 index 73f143782..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/en/input.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - -TJpgDec - Input Function - - - - -
-

Input Function

-

User defined input function to read data from input stream.

-
-size_t in_func (
-  JDEC* jdec,       /* Pointer to the decompression object */
-  uint8_t* buff,    /* Pointer to buffer to store the read data */
-  size_t ndata      /* Number of bytes to read/remove */
-);
-
-
-
- -
-

Parameters

-
-
jdec
-
Decompression object of this session.
-
buff
-
Points the read buffer to store the data read form the input stream. A null pointer specifies to remove the data from the input stream.
-
ndata
-
Number of bytes to read/remove from the input stream.
-
-
- - -
-

Return Values

-

Returns number of bytes read/removed. If any value not expected is returned, the jd_prepare and jd_decomp function aborts with JDR_INP.

-
- - -
-

Description

-

This function is the data input interface of the TJpgDec module. The corresponding decompression session can be identified by the session identifier jdec->device passed to the 5th argument of jd_prepare function.

-
- - -

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/jdec.html b/core/embed/extmod/modtrezorui/tjpgd/doc/en/jdec.html deleted file mode 100644 index b72db8064..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/en/jdec.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - -TjpgDec - JDEC - - - - -
-

JDEC

-

The JDEC structure holds the data, pointer and flags to manage the decompression session. Application program must not change any member in this structure.

-
-typedef struct JDEC JDEC;
-struct JDEC {
-    size_t dctr;                 /* Number of bytes available in the input buffer */
-    uint8_t* dptr;               /* Current data read ptr */
-    uint8_t* inbuf;              /* Bit stream input buffer */
-    uint8_t dmsk;                /* Current bit in the current read byte */
-    uint8_t scale;               /* Output scaling ratio */
-    uint8_t msx, msy;            /* MCU size in unit of block (width, height) */
-    uint8_t qtid[3];             /* Quantization table ID of each component */
-    uint8_t ncomp;               /* Number of color components (1:grayscale, 3:color) */
-    int16_t dcv[3];              /* Previous DC element of each component */
-    uint16_t nrst;               /* Restart inverval */
-    uint16_t width, height;      /* Size of the input image (pixel) */
-    uint8_t* huffbits[2][2];     /* Huffman bit distribution tables [yc][dcac] */
-    uint16_t* huffcode[2][2];    /* Huffman code word tables [yc][dcac] */
-    uint8_t* huffdata[2][2];     /* Huffman decoded data tables [yc][dcac] */
-    int32_t* qttbl[4];           /* De-quaitizer tables [id] */
-    void* workbuf;               /* Working buffer for IDCT and RGB output */
-    uint8_t* mcubuf;             /* Working buffer for the MCU */
-    void* pool;                  /* Pointer to available memory pool */
-    size_t sz_pool;              /* Size of momory pool (bytes available) */
-    size_t (*infunc)(JDEC*, uint8_t*, size_t); /* Pointer to jpeg stream input function */
-    void* device;                /* Pointer to I/O device identifiler for the session */
-};
-
-
- -

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/jpeg.jpeg b/core/embed/extmod/modtrezorui/tjpgd/doc/en/jpeg.jpeg deleted file mode 100644 index 0d71186cf4505786dd2c98d6ffb04c622b70f4ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14188 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 diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/opt.png b/core/embed/extmod/modtrezorui/tjpgd/doc/en/opt.png deleted file mode 100644 index fbc4bb483fb4dc83ebde39279b3ea733045188fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29921 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 E1Dy;yb^rhX diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/output.html b/core/embed/extmod/modtrezorui/tjpgd/doc/en/output.html deleted file mode 100644 index d6a21b3d7..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/en/output.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - -TJpgDec - Output Function - - - - -
-

Output Function

-

User defined output function to write decompressed pixels to the output device.

-
-int out_func (
-  JDEC* jdec,    /* Pointer to the decompression object */
-  void* bitmap,  /* Bitmap to be output */
-  JRECT* rect    /* Rectangle to output */
-);
-
-
- -
-

Parameters

-
-
jdec
-
Decompression object of this session.
-
bitmap
-
Decompressed image to be output.
-
rect
-
Specifies output rectangle where in the image. Type is defined in tjpgd.h
-
-
- - -
-

Return Values

-

Normally returns 1. It lets TJpgDec to continue the decompressing process. If a 0 is returned, jd_decomp function aborts with JDR_INTR. This is useful to interrupt the decompression process.

-
- - -
-

Description

-

This function is the data output interface of the TJpgDec module. The corresponding decompression session can be identified by the session identifier jdec->device passed to the 5th argument of jd_prepare function.

-

The bitmap is sent to the frame buffer or display device in this function. The first pixel in the bitmap is the left-top of the rectangular, the second one is next right and last pixel is the bottom-right of the rectangle. Because the JPEG image is compressed and streamed in unit of MCU (Minimum Coded Unit), TJpgDec outputs the image in MCU by MCU. The size of MCU depends on the sampling factor of JPEG compression, typically in 8x8, 16x8 or 16x16, but the rectangles on right end and bottom end of the image will be clipped.

-

The output pixel format is defined by JD_FORMAT option in the tjpgdcnf.h as shown below.

- - - - - -
JD_FORMATPixel Format
0 (RGB888)uint8_t bitmap[] = {R1, G1, B1, R2, G2, B2, ....
1 (RGB565)uint16_t bitmap[] = {rrrrrggggggbbbbb, ....
2 (Grayscale)uint8_t bitmap[] = {Y1, Y2, Y3, ....
-
- - -

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/p1.png b/core/embed/extmod/modtrezorui/tjpgd/doc/en/p1.png deleted file mode 100644 index 6a81f86b20f42162e7bfe83561ea2dccac0f0310..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3338 zcmb7{c|6mPAICRmlPg!4nAr$pt`VZS=Hu4PnUt(TX^7lM$jxTt>iWu5L#ah_gmR^Y z%ur~g%aw)*k)Q8B-~WH_$K&;QJs!{Z`~A=BzgL#4v#p4bybuTk60rlU@gNYGwkKIW z-aYau_|CpP({Xhq*z7sT+uO;>36z{17#Ikm(cyF06$*1z`x2?e|_gFvEP{|bCvQxpmU2`AfGTM(je{dey&7f#QN*jZKv>u019UBRT0{sb6v_3a0%PzzC??mlSM_pB&FuAWGbE_D5!h{y$f(s#fZ-xGd3+3r+towcTpd; zHNq%0o(ybuSY;t)CP|$#bE`}!XqnTm%j!n9mQwuwNxEZnln~O+5J6knzdkw14Lt@v z*Gv24&XSYu8v!8SYsavbCq1_DI${aWd2tVHU-w(3|7wqXU7C@=PAKGCD5kC?`pMdO zQF2wp^(E%9g%!lEsk+|6nzhNy^MDv{sa)8k%XYo|XPJ$koGwBxcTLs4pNOFQXsx|f zmiEkVcJdrLeYm4oemY%M2dG-(%SrazxDRC{QeVtfqgQPtyU>?{uUGmE0!FVhr-admU60+K)`=|PYRTt*cwMUF(U%q0e%^gP$RYj6wq>SNp?nzbI!M=OT#J^n0W z%P5A%XKmM?t~Pk!v5%d0!UT}q3T>b~c>2zp_SW!yMp9D*C$mtMPmWfDS!z4OgOACm zt4fQmhPkjb@Njm+*l4s?jmpT)Z|LpPZHtl58b2_Ro*$z< zPU+QT5T19RmRTqu%rD3<-qf65k}=$GR28*Z`N<;H>ZB9+Pn)18bFiwjA#uYKRQEFH zZH`P%$*P{T{@{|7=M6r4nuP&~>psqG4b(l+1hdk8Om&;;@(_K!Md|z`PK2%`&m@#r zo_P3TnE5gt`nsvR=Cxby?r}MKPc8*l{$8fLrP~zUeg0SoGqqo!UtNQqd1z(!78dfj!+ z&`G7LlGhkXs6sG=0VChPW6T`lovk7X7F)Y0NFIXLolX#PS$l<4(|!K~bsuTq;cAUo zzK8at3K%$bI-Bs_Q%T_=+Pz-1_=7k`;v9W%8%#4{idZiK-50O>kK2<8OA;`8Zu{0h z7J54Bregc42Hg+t&2Xw5HXdKHX6?+UiqgMjH_O>==EA8@qmy3AkQK)t{;m=8q51q# z%pJ9842AbHcUb0I>!c1o_U4G78Ghue0F?TYSrBVvIOp;{t|Q~h@R0w*QwciCFYTEk zGBlIksrn$zw@-w!v!hw=|E!hNU9 z07frC96onKPRm=lldQJzc)7afofx ztE0Vd*g~|UN;_^^D*jfd6C5=x5=(0H$=aNqmbA+1mJw>V!(#uy%mq{?LJj6lC<-*= z99I5njqCQYvG;nRp+I6sHhioKmt; zaF4??r`ixW1Z|8Oo3Ujh59S+bAE3sckqoWO1>#$uiqy5{uIS}9&~7O+bTC;6;;l^O z)n#1g(c8yV6ob$f>p@32fj2|eMn~ogWNt|s8Jf8OIgfld!cSZ)DR0-)_Z}-bDx&SU z$9Tq78zYvT;QcQ=ZrmR--|6`A($mjC^0;@77X2#C1Me4-!U4z%bfiJ0zGM1_3l6KweG& zP4vhN*iQXF;(*25VS|0m?GOvQhYnKY51QhsUcZEaJO}>O(PmO(+qy3-xQ!Ff3f1hV^`o{by&=S@4$PNGQ9{;Z9G$EpW)mo9}|)1J9<7?9`X@d z-rOct`D?JuzTs7L{`-X~=fO5FO9a7%bldSh={7|ON^+U1RZy-stNpw5DQwMcf8-Yg$RIvGJDYmK@)2sE3EeY$J6T)*BKW`63 zERZy1=OW_v+Z>Jk^C4nkf)q}BSh?)?z2IGYS@V&!MZfi)KFm1`L(6Sr(Na*r%4a%va9;^IxrO|<@=oFBMgz+QL5)>ZlK?nfu%i-IL)#krg3zDTMtpHXC v@I(CnXLscBo(Py6#atT#Fkwo{tX**ExwYZl0SEnmOO2h4v-Km((<%Q0Yndiw diff --git a/core/embed/extmod/modtrezorui/tjpgd/doc/en/prepare.html b/core/embed/extmod/modtrezorui/tjpgd/doc/en/prepare.html deleted file mode 100644 index 363b77169..000000000 --- a/core/embed/extmod/modtrezorui/tjpgd/doc/en/prepare.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - -TJpgDec - jd_prepare - - - - -
-

jd_prepare

-

The jd_prepare function analyzes the JPEG data and create a decompression object for subsequnet decompression process.

-
-JRESULT jd_prepare (
-  JDEC* jdec,        /* Pointer to blank decompression object */
-  size_t (*infunc)(JDEC*, uint8_t*, size_t), /* Pointer to input function */
-  void* work,        /* Pointer to the work area */
-  size_t sz_work,    /* Size of the work area */
-  void* device       /* Session identifier for the session */
-);
-
-
- -
-

Parameters

-
-
jdec
-
Specifies the decompression object to be initialized. The decompression object is used by subsequent decompression process.
-
input
-
Pointer to the user defined data input function. The jd_prepare and jd_decomp function call this function to read the JPEG data from the input stream.
-
work
-
Pointer to the work area for this session. It should be aligned to the word boundary, or it can result a hard fault on some processors.
-
sz_work
-
Size of the work area in unit of byte. TJpgDec requires upto 3092 bytes of work area depends on the built-in parameter tables of the JPEG image to deccompress.
-
device
-
Pointer to the user defined session identifier for this session. It is stored to the member device in the decompression object. It can be refered by I/O functions to identify the corresponding session. If this feature is not needed, set null and do not care about this.
-
-
- - -
-

Return Values

-
-
JDR_OK
-
Function succeeded and the decompression object is valid.
-
JDR_INP
-
An error occured in input function due to a hard error or wrong stream termination.
-
JDR_MEM1
-
Insufficient work area for this JPEG image.
-
JDR_MEM2
-
Insufficient input buffer for this JPEG image. JD_SZBUF may be too small.
-
JDR_FMT1
-
Data format error. The JPEG data can be collapted.
-
JDR_FMT3
-
Not supported JPEG standard. May be a progressive JPEG image.
-
-
- -
-

Description

-

The jd_prepare function is the first stage of a JPEG decompression session. It analyzes the JPEG image and create parameter tables for decompression. After the function succeeded, the session gets ready to decompress the JPEG image by the jd_decomp fnction. The application program can refer the dimensions of the JPEG image stored in the decompression object. These information will be used to configure the output device and parameters for subsequent decompression stage.

-
- -

Return

- - diff --git a/core/embed/extmod/modtrezorui/tjpgd/src/tjpgd.c b/core/embed/extmod/modtrezorui/tjpgd/tjpgd.c similarity index 100% rename from core/embed/extmod/modtrezorui/tjpgd/src/tjpgd.c rename to core/embed/extmod/modtrezorui/tjpgd/tjpgd.c diff --git a/core/embed/extmod/modtrezorui/tjpgd/src/tjpgd.h b/core/embed/extmod/modtrezorui/tjpgd/tjpgd.h similarity index 100% rename from core/embed/extmod/modtrezorui/tjpgd/src/tjpgd.h rename to core/embed/extmod/modtrezorui/tjpgd/tjpgd.h diff --git a/core/embed/extmod/modtrezorui/tjpgd/src/tjpgdcnf.h b/core/embed/extmod/modtrezorui/tjpgd/tjpgdcnf.h similarity index 100% rename from core/embed/extmod/modtrezorui/tjpgd/src/tjpgdcnf.h rename to core/embed/extmod/modtrezorui/tjpgd/tjpgdcnf.h