blob: aebcaa955c7f15ab55b31c28d2f9a477c4b0db83 [file] [log] [blame]
Thomas G. Lane2cbeb8a1991-10-07 00:00:00 +00001/*
2 * jutils.c
3 *
4 * Copyright (C) 1991, Thomas G. Lane.
5 * This file is part of the Independent JPEG Group's software.
6 * For conditions of distribution and use, see the accompanying README file.
7 *
8 * This file contains miscellaneous utility routines needed for both
9 * compression and decompression.
10 * Note we prefix all global names with "j" to minimize conflicts with
11 * a surrounding application.
12 */
13
14#include "jinclude.h"
15
16
17GLOBAL long
18jround_up (long a, long b)
19/* Compute a rounded up to next multiple of b; a >= 0, b > 0 */
20{
21 a += b-1;
22 return a - (a % b);
23}
24
25
26GLOBAL void
27jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
28 JSAMPARRAY output_array, int dest_row,
29 int num_rows, long num_cols)
30/* Copy some rows of samples from one place to another.
31 * num_rows rows are copied from input_array[source_row++]
32 * to output_array[dest_row++]; these areas should not overlap.
33 * The source and destination arrays must be at least as wide as num_cols.
34 */
35{
36 /* On normal machines we can use memcpy(). This won't work on 80x86 because
37 * the sample arrays are FAR and we're assuming a small-pointer memory model.
38 */
39 register JSAMPROW inptr, outptr;
40#ifdef NEED_FAR_POINTERS
41 register long count;
42#else
43 register size_t count = num_cols * SIZEOF(JSAMPLE);
44#endif
45 register int row;
46
47 input_array += source_row;
48 output_array += dest_row;
49
50 for (row = num_rows; row > 0; row--) {
51 inptr = *input_array++;
52 outptr = *output_array++;
53#ifdef NEED_FAR_POINTERS
54 for (count = num_cols; count > 0; count--)
55 *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */
56#else
57 memcpy((void *) outptr, (void *) inptr, count);
58#endif
59 }
60}
61
62
63GLOBAL void
64jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, long num_blocks)
65/* Copy a row of coefficient blocks from one place to another. */
66{
67 /* On normal machines we can use memcpy(). This won't work on 80x86 because
68 * the block arrays are FAR and we're assuming a small-pointer memory model.
69 */
70#ifdef NEED_FAR_POINTERS
71 register JCOEFPTR inptr, outptr;
72 register int i;
73 register long count;
74
75 for (count = num_blocks; count > 0; count--) {
76 inptr = *input_row++;
77 outptr = *output_row++;
78 for (i = DCTSIZE2; i > 0; i--)
79 *outptr++ = *inptr++;
80 }
81#else
82 memcpy((void *) output_row, (void *) input_row,
83 (size_t) (num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))));
84#endif
85}
86
87
88GLOBAL void
89jzero_far (void FAR * target, size_t bytestozero)
90/* Zero out a chunk of FAR memory. */
91/* This might be sample-array data, block-array data, or alloc_medium data. */
92{
93 /* On normal machines we can use MEMZERO(). This won't work on 80x86
94 * because we're assuming a small-pointer memory model.
95 */
96#ifdef NEED_FAR_POINTERS
97 register char FAR * ptr = (char FAR *) target;
98 register size_t count;
99
100 for (count = bytestozero; count > 0; count--) {
101 *ptr++ = 0;
102 }
103#else
104 MEMZERO((void *) target, bytestozero);
105#endif
106}