Blame gtkmm-osx/jpeg-6b/jutils.c

darco 56a656
/*
darco 56a656
 * jutils.c
darco 56a656
 *
darco 56a656
 * Copyright (C) 1991-1996, Thomas G. Lane.
darco 56a656
 * This file is part of the Independent JPEG Group's software.
darco 56a656
 * For conditions of distribution and use, see the accompanying README file.
darco 56a656
 *
darco 56a656
 * This file contains tables and miscellaneous utility routines needed
darco 56a656
 * for both compression and decompression.
darco 56a656
 * Note we prefix all global names with "j" to minimize conflicts with
darco 56a656
 * a surrounding application.
darco 56a656
 */
darco 56a656
darco 56a656
#define JPEG_INTERNALS
darco 56a656
#include "jinclude.h"
darco 56a656
#include "jpeglib.h"
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
darco 56a656
 * of a DCT block read in natural order (left to right, top to bottom).
darco 56a656
 */
darco 56a656
darco 56a656
#if 0				/* This table is not actually needed in v6a */
darco 56a656
darco 56a656
const int jpeg_zigzag_order[DCTSIZE2] = {
darco 56a656
   0,  1,  5,  6, 14, 15, 27, 28,
darco 56a656
   2,  4,  7, 13, 16, 26, 29, 42,
darco 56a656
   3,  8, 12, 17, 25, 30, 41, 43,
darco 56a656
   9, 11, 18, 24, 31, 40, 44, 53,
darco 56a656
  10, 19, 23, 32, 39, 45, 52, 54,
darco 56a656
  20, 22, 33, 38, 46, 51, 55, 60,
darco 56a656
  21, 34, 37, 47, 50, 56, 59, 61,
darco 56a656
  35, 36, 48, 49, 57, 58, 62, 63
darco 56a656
};
darco 56a656
darco 56a656
#endif
darco 56a656
darco 56a656
/*
darco 56a656
 * jpeg_natural_order[i] is the natural-order position of the i'th element
darco 56a656
 * of zigzag order.
darco 56a656
 *
darco 56a656
 * When reading corrupted data, the Huffman decoders could attempt
darco 56a656
 * to reference an entry beyond the end of this array (if the decoded
darco 56a656
 * zero run length reaches past the end of the block).  To prevent
darco 56a656
 * wild stores without adding an inner-loop test, we put some extra
darco 56a656
 * "63"s after the real entries.  This will cause the extra coefficient
darco 56a656
 * to be stored in location 63 of the block, not somewhere random.
darco 56a656
 * The worst case would be a run-length of 15, which means we need 16
darco 56a656
 * fake entries.
darco 56a656
 */
darco 56a656
darco 56a656
const int jpeg_natural_order[DCTSIZE2+16] = {
darco 56a656
  0,  1,  8, 16,  9,  2,  3, 10,
darco 56a656
 17, 24, 32, 25, 18, 11,  4,  5,
darco 56a656
 12, 19, 26, 33, 40, 48, 41, 34,
darco 56a656
 27, 20, 13,  6,  7, 14, 21, 28,
darco 56a656
 35, 42, 49, 56, 57, 50, 43, 36,
darco 56a656
 29, 22, 15, 23, 30, 37, 44, 51,
darco 56a656
 58, 59, 52, 45, 38, 31, 39, 46,
darco 56a656
 53, 60, 61, 54, 47, 55, 62, 63,
darco 56a656
 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
darco 56a656
 63, 63, 63, 63, 63, 63, 63, 63
darco 56a656
};
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Arithmetic utilities
darco 56a656
 */
darco 56a656
darco 56a656
GLOBAL(long)
darco 56a656
jdiv_round_up (long a, long b)
darco 56a656
/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
darco 56a656
/* Assumes a >= 0, b > 0 */
darco 56a656
{
darco 56a656
  return (a + b - 1L) / b;
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
GLOBAL(long)
darco 56a656
jround_up (long a, long b)
darco 56a656
/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
darco 56a656
/* Assumes a >= 0, b > 0 */
darco 56a656
{
darco 56a656
  a += b - 1L;
darco 56a656
  return a - (a % b);
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
darco 56a656
 * and coefficient-block arrays.  This won't work on 80x86 because the arrays
darco 56a656
 * are FAR and we're assuming a small-pointer memory model.  However, some
darco 56a656
 * DOS compilers provide far-pointer versions of memcpy() and memset() even
darco 56a656
 * in the small-model libraries.  These will be used if USE_FMEM is defined.
darco 56a656
 * Otherwise, the routines below do it the hard way.  (The performance cost
darco 56a656
 * is not all that great, because these routines aren't very heavily used.)
darco 56a656
 */
darco 56a656
darco 56a656
#ifndef NEED_FAR_POINTERS	/* normal case, same as regular macros */
darco 56a656
#define FMEMCOPY(dest,src,size)	MEMCOPY(dest,src,size)
darco 56a656
#define FMEMZERO(target,size)	MEMZERO(target,size)
darco 56a656
#else				/* 80x86 case, define if we can */
darco 56a656
#ifdef USE_FMEM
darco 56a656
#define FMEMCOPY(dest,src,size)	_fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
darco 56a656
#define FMEMZERO(target,size)	_fmemset((void FAR *)(target), 0, (size_t)(size))
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
darco 56a656
		   JSAMPARRAY output_array, int dest_row,
darco 56a656
		   int num_rows, JDIMENSION num_cols)
darco 56a656
/* Copy some rows of samples from one place to another.
darco 56a656
 * num_rows rows are copied from input_array[source_row++]
darco 56a656
 * to output_array[dest_row++]; these areas may overlap for duplication.
darco 56a656
 * The source and destination arrays must be at least as wide as num_cols.
darco 56a656
 */
darco 56a656
{
darco 56a656
  register JSAMPROW inptr, outptr;
darco 56a656
#ifdef FMEMCOPY
darco 56a656
  register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
darco 56a656
#else
darco 56a656
  register JDIMENSION count;
darco 56a656
#endif
darco 56a656
  register int row;
darco 56a656
darco 56a656
  input_array += source_row;
darco 56a656
  output_array += dest_row;
darco 56a656
darco 56a656
  for (row = num_rows; row > 0; row--) {
darco 56a656
    inptr = *input_array++;
darco 56a656
    outptr = *output_array++;
darco 56a656
#ifdef FMEMCOPY
darco 56a656
    FMEMCOPY(outptr, inptr, count);
darco 56a656
#else
darco 56a656
    for (count = num_cols; count > 0; count--)
darco 56a656
      *outptr++ = *inptr++;	/* needn't bother with GETJSAMPLE() here */
darco 56a656
#endif
darco 56a656
  }
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
darco 56a656
		 JDIMENSION num_blocks)
darco 56a656
/* Copy a row of coefficient blocks from one place to another. */
darco 56a656
{
darco 56a656
#ifdef FMEMCOPY
darco 56a656
  FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
darco 56a656
#else
darco 56a656
  register JCOEFPTR inptr, outptr;
darco 56a656
  register long count;
darco 56a656
darco 56a656
  inptr = (JCOEFPTR) input_row;
darco 56a656
  outptr = (JCOEFPTR) output_row;
darco 56a656
  for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {
darco 56a656
    *outptr++ = *inptr++;
darco 56a656
  }
darco 56a656
#endif
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jzero_far (void FAR * target, size_t bytestozero)
darco 56a656
/* Zero out a chunk of FAR memory. */
darco 56a656
/* This might be sample-array data, block-array data, or alloc_large data. */
darco 56a656
{
darco 56a656
#ifdef FMEMZERO
darco 56a656
  FMEMZERO(target, bytestozero);
darco 56a656
#else
darco 56a656
  register char FAR * ptr = (char FAR *) target;
darco 56a656
  register size_t count;
darco 56a656
darco 56a656
  for (count = bytestozero; count > 0; count--) {
darco 56a656
    *ptr++ = 0;
darco 56a656
  }
darco 56a656
#endif
darco 56a656
}