blob: 5c5bb17dc52cf0a9a7f551778963c476111aab29 [file] [log] [blame]
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +00001/*
2 * jutils.c
3 *
DRC5033f3e2014-05-18 18:33:44 +00004 * This file was part of the Independent JPEG Group's software:
Thomas G. Lane489583f1996-02-07 00:00:00 +00005 * Copyright (C) 1991-1996, Thomas G. Lane.
DRC5033f3e2014-05-18 18:33:44 +00006 * It was modified by The libjpeg-turbo Project to include only code
7 * relevant to libjpeg-turbo.
Alex Naidis6eb7d372016-10-16 23:10:08 +02008 * For conditions of distribution and use, see the accompanying README.ijg
9 * file.
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000010 *
Thomas G. Lanebc79e061995-08-02 00:00:00 +000011 * This file contains tables and miscellaneous utility routines needed
12 * for both compression and decompression.
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000013 * Note we prefix all global names with "j" to minimize conflicts with
14 * a surrounding application.
15 */
16
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000017#define JPEG_INTERNALS
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000018#include "jinclude.h"
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000019#include "jpeglib.h"
20
21
22/*
Thomas G. Lanebc79e061995-08-02 00:00:00 +000023 * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
24 * of a DCT block read in natural order (left to right, top to bottom).
25 */
26
DRCe5eaf372014-05-09 18:00:32 +000027#if 0 /* This table is not actually needed in v6a */
Thomas G. Lane489583f1996-02-07 00:00:00 +000028
Thomas G. Lanebc79e061995-08-02 00:00:00 +000029const int jpeg_zigzag_order[DCTSIZE2] = {
30 0, 1, 5, 6, 14, 15, 27, 28,
31 2, 4, 7, 13, 16, 26, 29, 42,
32 3, 8, 12, 17, 25, 30, 41, 43,
33 9, 11, 18, 24, 31, 40, 44, 53,
34 10, 19, 23, 32, 39, 45, 52, 54,
35 20, 22, 33, 38, 46, 51, 55, 60,
36 21, 34, 37, 47, 50, 56, 59, 61,
37 35, 36, 48, 49, 57, 58, 62, 63
38};
39
Thomas G. Lane489583f1996-02-07 00:00:00 +000040#endif
41
Thomas G. Lanebc79e061995-08-02 00:00:00 +000042/*
43 * jpeg_natural_order[i] is the natural-order position of the i'th element
44 * of zigzag order.
45 *
46 * When reading corrupted data, the Huffman decoders could attempt
47 * to reference an entry beyond the end of this array (if the decoded
48 * zero run length reaches past the end of the block). To prevent
49 * wild stores without adding an inner-loop test, we put some extra
50 * "63"s after the real entries. This will cause the extra coefficient
51 * to be stored in location 63 of the block, not somewhere random.
52 * The worst case would be a run-length of 15, which means we need 16
53 * fake entries.
54 */
55
Leon Scroggins III3993b372018-07-16 10:43:45 -040056const int jpeg_natural_order[DCTSIZE2 + 16] = {
Thomas G. Lanebc79e061995-08-02 00:00:00 +000057 0, 1, 8, 16, 9, 2, 3, 10,
58 17, 24, 32, 25, 18, 11, 4, 5,
59 12, 19, 26, 33, 40, 48, 41, 34,
60 27, 20, 13, 6, 7, 14, 21, 28,
61 35, 42, 49, 56, 57, 50, 43, 36,
62 29, 22, 15, 23, 30, 37, 44, 51,
63 58, 59, 52, 45, 38, 31, 39, 46,
64 53, 60, 61, 54, 47, 55, 62, 63,
65 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
66 63, 63, 63, 63, 63, 63, 63, 63
67};
68
69
70/*
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000071 * Arithmetic utilities
72 */
73
Thomas G. Lane489583f1996-02-07 00:00:00 +000074GLOBAL(long)
Leon Scroggins III3993b372018-07-16 10:43:45 -040075jdiv_round_up(long a, long b)
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000076/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
77/* Assumes a >= 0, b > 0 */
78{
79 return (a + b - 1L) / b;
80}
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000081
82
DRCa8eabfe2011-03-29 04:58:40 +000083GLOBAL(long)
Leon Scroggins III3993b372018-07-16 10:43:45 -040084jround_up(long a, long b)
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000085/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
86/* Assumes a >= 0, b > 0 */
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000087{
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000088 a += b - 1L;
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000089 return a - (a % b);
90}
91
92
Thomas G. Lane489583f1996-02-07 00:00:00 +000093GLOBAL(void)
Leon Scroggins III3993b372018-07-16 10:43:45 -040094jcopy_sample_rows(JSAMPARRAY input_array, int source_row,
95 JSAMPARRAY output_array, int dest_row, int num_rows,
96 JDIMENSION num_cols)
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +000097/* Copy some rows of samples from one place to another.
98 * num_rows rows are copied from input_array[source_row++]
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000099 * to output_array[dest_row++]; these areas may overlap for duplication.
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000100 * The source and destination arrays must be at least as wide as num_cols.
101 */
102{
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000103 register JSAMPROW inptr, outptr;
Leon Scroggins III3993b372018-07-16 10:43:45 -0400104 register size_t count = (size_t)(num_cols * sizeof(JSAMPLE));
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000105 register int row;
106
107 input_array += source_row;
108 output_array += dest_row;
109
110 for (row = num_rows; row > 0; row--) {
111 inptr = *input_array++;
112 outptr = *output_array++;
DRC5033f3e2014-05-18 18:33:44 +0000113 MEMCOPY(outptr, inptr, count);
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000114 }
115}
116
117
Thomas G. Lane489583f1996-02-07 00:00:00 +0000118GLOBAL(void)
Leon Scroggins III3993b372018-07-16 10:43:45 -0400119jcopy_block_row(JBLOCKROW input_row, JBLOCKROW output_row,
120 JDIMENSION num_blocks)
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000121/* Copy a row of coefficient blocks from one place to another. */
122{
DRC5de454b2014-05-18 19:04:03 +0000123 MEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * sizeof(JCOEF)));
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000124}
125
126
Thomas G. Lane489583f1996-02-07 00:00:00 +0000127GLOBAL(void)
Leon Scroggins III3993b372018-07-16 10:43:45 -0400128jzero_far(void *target, size_t bytestozero)
DRC5033f3e2014-05-18 18:33:44 +0000129/* Zero out a chunk of memory. */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000130/* This might be sample-array data, block-array data, or alloc_large data. */
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000131{
DRC5033f3e2014-05-18 18:33:44 +0000132 MEMZERO(target, bytestozero);
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +0000133}