src/java.desktop/share/native/libjavajpeg/jpegdecoder.c
author jiefu
Fri, 15 Nov 2019 20:39:26 +0800
changeset 59110 8c4c358272a9
parent 50489 580159eeac07
permissions -rw-r--r--
8234232: [TESTBUG] gc/shenandoah/jvmti/TestHeapDump.java fails with -Xcomp Reviewed-by: zgu
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
46870
942b678b7869 8166748: Clean out Windows IA64 support
gtriantafill
parents: 40151
diff changeset
     2
 * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
 * This file was based upon the example.c stub file included in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
 * release 6 of the Independent JPEG Group's free JPEG software.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
 * It has been updated to conform to release 6b.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
/* First, if system header files define "boolean" map it to "system_boolean" */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
#define boolean system_boolean
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#include <stdio.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
#include <setjmp.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
#include <string.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
#include <stdlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
#include <assert.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
#include "jni.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
#include "jni_util.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
/* undo "system_boolean" hack and undef FAR since we don't use it anyway */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
#undef boolean
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
#undef FAR
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
#include <jpeglib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
#include "jerror.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
25092
b35eb67cf1e3 8026385: [macosx] (awt) setjmp/longjmp changes the process signal mask on OS X
ddehaven
parents: 23917
diff changeset
    50
#ifdef __APPLE__
b35eb67cf1e3 8026385: [macosx] (awt) setjmp/longjmp changes the process signal mask on OS X
ddehaven
parents: 23917
diff changeset
    51
/* use setjmp/longjmp versions that do not save/restore the signal mask */
b35eb67cf1e3 8026385: [macosx] (awt) setjmp/longjmp changes the process signal mask on OS X
ddehaven
parents: 23917
diff changeset
    52
#define setjmp _setjmp
b35eb67cf1e3 8026385: [macosx] (awt) setjmp/longjmp changes the process signal mask on OS X
ddehaven
parents: 23917
diff changeset
    53
#define longjmp _longjmp
b35eb67cf1e3 8026385: [macosx] (awt) setjmp/longjmp changes the process signal mask on OS X
ddehaven
parents: 23917
diff changeset
    54
#endif
b35eb67cf1e3 8026385: [macosx] (awt) setjmp/longjmp changes the process signal mask on OS X
ddehaven
parents: 23917
diff changeset
    55
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
/* The method IDs we cache. Note that the last two belongs to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
 * java.io.InputStream class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
static jmethodID sendHeaderInfoID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
static jmethodID sendPixelsByteID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
static jmethodID sendPixelsIntID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
static jmethodID InputStream_readID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
static jmethodID InputStream_availableID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
/* Initialize the Java VM instance variable when the library is
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
   first loaded */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
JavaVM *jvm;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
JNIEXPORT jint JNICALL
33653
c1ee09fe3274 8136556: Add the ability to perform static builds of MacOSX x64 binaries
bobv
parents: 25859
diff changeset
    70
DEF_JNI_OnLoad(JavaVM *vm, void *reserved)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
    jvm = vm;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
    return JNI_VERSION_1_2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
 * ERROR HANDLING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
 * The JPEG library's standard error handler (jerror.c) is divided into
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
 * several "methods" which you can override individually.  This lets you
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
 * adjust the behavior without duplicating a lot of code, which you might
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
 * have to update with each future release.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
 * Our example here shows how to override the "error_exit" method so that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
 * control is returned to the library's caller when a fatal error occurs,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
 * rather than calling exit() as the standard error_exit method does.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
 * We use C's setjmp/longjmp facility to return control.  This means that the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
 * routine which calls the JPEG library must first execute a setjmp() call to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
 * establish the return point.  We want the replacement error_exit to do a
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
 * longjmp().  But we need to make the setjmp buffer accessible to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
 * error_exit routine.  To do this, we make a private extension of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
 * standard JPEG error handler object.  (If we were using C++, we'd say we
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
 * were making a subclass of the regular error handler.)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
 * Here's the extended error handler struct:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
struct sun_jpeg_error_mgr {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
  struct jpeg_error_mgr pub;    /* "public" fields */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
  jmp_buf setjmp_buffer;        /* for return to caller */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
};
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
typedef struct sun_jpeg_error_mgr * sun_jpeg_error_ptr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
 * Here's the routine that will replace the standard error_exit method:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
METHODDEF(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
sun_jpeg_error_exit (j_common_ptr cinfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
  /* cinfo->err really points to a sun_jpeg_error_mgr struct */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
  sun_jpeg_error_ptr myerr = (sun_jpeg_error_ptr) cinfo->err;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
  /* Always display the message. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
  /* We could postpone this until after returning, if we chose. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
  /* (*cinfo->err->output_message) (cinfo); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
  /* For Java, we will format the message and put it in the error we throw. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
  /* Return control to the setjmp point */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
  longjmp(myerr->setjmp_buffer, 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
 * Error Message handling
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
 * This overrides the output_message method to send JPEG messages
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
METHODDEF(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
sun_jpeg_output_message (j_common_ptr cinfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
  char buffer[JMSG_LENGTH_MAX];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
  /* Create the message */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
  (*cinfo->err->format_message) (cinfo, buffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
  /* Send it to stderr, adding a newline */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
  fprintf(stderr, "%s\n", buffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
 * INPUT HANDLING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
 * The JPEG library's input management is defined by the jpeg_source_mgr
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
 * structure which contains two fields to convey the information in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
 * buffer and 5 methods which perform all buffer management.  The library
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
 * defines a standard input manager that uses stdio for obtaining compressed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
 * jpeg data, but here we need to use Java to get our data.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
 * We need to make the Java class information accessible to the source_mgr
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
 * input routines.  We also need to store a pointer to the start of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
 * Java array being used as an input buffer so that it is not moved or
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
 * garbage collected while the JPEG library is using it.  To store these
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
 * things, we make a private extension of the standard JPEG jpeg_source_mgr
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
 * object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
 * Here's the extended source manager struct:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
struct sun_jpeg_source_mgr {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
  struct jpeg_source_mgr pub;   /* "public" fields */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
  jobject hInputStream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
  int suspendable;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
  unsigned long remaining_skip;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
  JOCTET *inbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
  jbyteArray hInputBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
  size_t inbufoffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
  /* More stuff */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
  union pixptr {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
      int               *ip;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
      unsigned char     *bp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
  } outbuf;
35289
1031cb912792 8139017: More stable image decoding
vadim
parents: 33653
diff changeset
   183
  size_t outbufSize;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
  jobject hOutputBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
};
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
typedef struct sun_jpeg_source_mgr * sun_jpeg_source_ptr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
/* We use Get/ReleasePrimitiveArrayCritical functions to avoid
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
 * the need to copy buffer elements.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
 * MAKE SURE TO:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
 * - carefully insert pairs of RELEASE_ARRAYS and GET_ARRAYS around
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
 *   callbacks to Java.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
 * - call RELEASE_ARRAYS before returning to Java.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
 * Otherwise things will go horribly wrong. There may be memory leaks,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
 * excessive pinning, or even VM crashes!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
 * Note that GetPrimitiveArrayCritical may fail!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
static void RELEASE_ARRAYS(JNIEnv *env, sun_jpeg_source_ptr src)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
    if (src->inbuf) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
        if (src->pub.next_input_byte == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
            src->inbufoffset = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
            src->inbufoffset = src->pub.next_input_byte - src->inbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
        (*env)->ReleasePrimitiveArrayCritical(env, src->hInputBuffer,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
                                              src->inbuf, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
        src->inbuf = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
    if (src->outbuf.ip) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
        (*env)->ReleasePrimitiveArrayCritical(env, src->hOutputBuffer,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
                                              src->outbuf.ip, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
        src->outbuf.ip = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
static int GET_ARRAYS(JNIEnv *env, sun_jpeg_source_ptr src)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
    if (src->hInputBuffer) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
        assert(src->inbuf == 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
        src->inbuf = (JOCTET *)(*env)->GetPrimitiveArrayCritical
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
            (env, src->hInputBuffer, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
        if (src->inbuf == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
            return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
        if ((int)(src->inbufoffset) >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
            src->pub.next_input_byte = src->inbuf + src->inbufoffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
    if (src->hOutputBuffer) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
        assert(src->outbuf.ip == 0);
35292
8508354e76e1 8141213: [Parfait]Potentially blocking function GetArrayLength called in JNI critical region at line 239 of jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c in function GET_ARRAYS
vadim
parents: 35289
diff changeset
   237
        src->outbufSize = (*env)->GetArrayLength(env, src->hOutputBuffer);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
        src->outbuf.ip = (int *)(*env)->GetPrimitiveArrayCritical
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
            (env, src->hOutputBuffer, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
        if (src->outbuf.ip == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
            RELEASE_ARRAYS(env, src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
            return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
 * Initialize source.  This is called by jpeg_read_header() before any
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
 * data is actually read.  Unlike init_destination(), it may leave
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
 * bytes_in_buffer set to 0 (in which case a fill_input_buffer() call
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
 * will occur immediately).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
GLOBAL(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
sun_jpeg_init_source(j_decompress_ptr cinfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
    sun_jpeg_source_ptr src = (sun_jpeg_source_ptr) cinfo->src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    src->pub.next_input_byte = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    src->pub.bytes_in_buffer = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
 * This is called whenever bytes_in_buffer has reached zero and more
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
 * data is wanted.  In typical applications, it should read fresh data
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
 * into the buffer (ignoring the current state of next_input_byte and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
 * bytes_in_buffer), reset the pointer & count to the start of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
 * buffer, and return TRUE indicating that the buffer has been reloaded.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
 * It is not necessary to fill the buffer entirely, only to obtain at
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
 * least one more byte.  bytes_in_buffer MUST be set to a positive value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
 * if TRUE is returned.  A FALSE return should only be used when I/O
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
 * suspension is desired (this mode is discussed in the next section).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
 * Note that with I/O suspension turned on, this procedure should not
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
 * do any work since the JPEG library has a very simple backtracking
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
 * mechanism which relies on the fact that the buffer will be filled
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
 * only when it has backed out to the top application level.  When
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
 * suspendable is turned on, the sun_jpeg_fill_suspended_buffer will
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
 * do the actual work of filling the buffer.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
GLOBAL(boolean)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
sun_jpeg_fill_input_buffer(j_decompress_ptr cinfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    sun_jpeg_source_ptr src = (sun_jpeg_source_ptr) cinfo->src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
    int ret, buflen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
    if (src->suspendable) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
        return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
    if (src->remaining_skip) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
        src->pub.skip_input_data(cinfo, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    RELEASE_ARRAYS(env, src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
    buflen = (*env)->GetArrayLength(env, src->hInputBuffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
    ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
                                src->hInputBuffer, 0, buflen);
23892
9959956918be 8029854: Enhance JPEG decodings
prr
parents: 23644
diff changeset
   300
    if (ret > buflen) ret = buflen;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
    if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
        cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
    if (ret <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
        /* Silently accept truncated JPEG files */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
        WARNMS(cinfo, JWRN_JPEG_EOF);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
        src->inbuf[0] = (JOCTET) 0xFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
        src->inbuf[1] = (JOCTET) JPEG_EOI;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
        ret = 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
    src->pub.next_input_byte = src->inbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
    src->pub.bytes_in_buffer = ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
    return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
 * Note that with I/O suspension turned on, the JPEG library requires
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
 * that all buffer filling be done at the top application level.  Due
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
 * to the way that backtracking works, this procedure should save all
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 12994
diff changeset
   322
 * of the data that was left in the buffer when suspension occurred and
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
 * only read new data at the end.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
GLOBAL(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
sun_jpeg_fill_suspended_buffer(j_decompress_ptr cinfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
    sun_jpeg_source_ptr src = (sun_jpeg_source_ptr) cinfo->src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
    size_t offset, buflen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
    int ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
    RELEASE_ARRAYS(env, src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
    ret = (*env)->CallIntMethod(env, src->hInputStream,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
                                InputStream_availableID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
    if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
        cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
    }
8355
6b58fe58e767 6989774: imageio compiler warnings in native code
bae
parents: 5506
diff changeset
   340
    if (ret < 0 || (unsigned int)ret <= src->remaining_skip) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
    if (src->remaining_skip) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
        src->pub.skip_input_data(cinfo, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
    /* Save the data currently in the buffer */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
    offset = src->pub.bytes_in_buffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
    if (src->pub.next_input_byte > src->inbuf) {
12994
a758ccd05133 7153693: Three 2D_ImageIO tests failed due ImageFormatException on OEL 6.* Unbreakable Kernel x64
bae
parents: 9035
diff changeset
   349
        memmove(src->inbuf, src->pub.next_input_byte, offset);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
    RELEASE_ARRAYS(env, src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
    buflen = (*env)->GetArrayLength(env, src->hInputBuffer) - offset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
    if (buflen <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
        if (!GET_ARRAYS(env, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
            cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
    ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
                                src->hInputBuffer, offset, buflen);
40151
396a601f5f8e 8074827: Resolve disabled warnings for libjavajpeg
prr
parents: 35292
diff changeset
   361
    if ((ret > 0) && ((unsigned int)ret > buflen)) ret = (int)buflen;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
    if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
        cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
    if (ret <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
        /* Silently accept truncated JPEG files */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
        WARNMS(cinfo, JWRN_JPEG_EOF);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
        src->inbuf[offset] = (JOCTET) 0xFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
        src->inbuf[offset + 1] = (JOCTET) JPEG_EOI;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
        ret = 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
    src->pub.next_input_byte = src->inbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
    src->pub.bytes_in_buffer = ret + offset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
 * Skip num_bytes worth of data.  The buffer pointer and count should
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
 * be advanced over num_bytes input bytes, refilling the buffer as
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
 * needed.  This is used to skip over a potentially large amount of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
 * uninteresting data (such as an APPn marker).  In some applications
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
 * it may be possible to optimize away the reading of the skipped data,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
 * but it's not clear that being smart is worth much trouble; large
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
 * skips are uncommon.  bytes_in_buffer may be zero on return.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
 * A zero or negative skip count should be treated as a no-op.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
 * Note that with I/O suspension turned on, this procedure should not
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
 * do any I/O since the JPEG library has a very simple backtracking
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
 * mechanism which relies on the fact that the buffer will be filled
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
 * only when it has backed out to the top application level.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
GLOBAL(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
sun_jpeg_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
    sun_jpeg_source_ptr src = (sun_jpeg_source_ptr) cinfo->src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
    int ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
    int buflen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
    if (num_bytes < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
    num_bytes += src->remaining_skip;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
    src->remaining_skip = 0;
8355
6b58fe58e767 6989774: imageio compiler warnings in native code
bae
parents: 5506
diff changeset
   410
    ret = (int)src->pub.bytes_in_buffer; /* this conversion is safe, because capacity of the buffer is limited by jnit */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
    if (ret >= num_bytes) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
        src->pub.next_input_byte += num_bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
        src->pub.bytes_in_buffer -= num_bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
    num_bytes -= ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
    if (src->suspendable) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
        src->remaining_skip = num_bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
        src->pub.bytes_in_buffer = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
        src->pub.next_input_byte = src->inbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
    /* Note that the signature for the method indicates that it takes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
     * and returns a long.  Casting the int num_bytes to a long on
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
     * the input should work well enough, and if we assume that the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
     * return value for this particular method should always be less
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
     * than the argument value (or -1), then the return value coerced
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
     * to an int should return us the information we need...
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
    RELEASE_ARRAYS(env, src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
    buflen =  (*env)->GetArrayLength(env, src->hInputBuffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
    while (num_bytes > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
        ret = (*env)->CallIntMethod(env, src->hInputStream,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
                                    InputStream_readID,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
                                    src->hInputBuffer, 0, buflen);
23892
9959956918be 8029854: Enhance JPEG decodings
prr
parents: 23644
diff changeset
   437
        if (ret > buflen) ret = buflen;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
        if ((*env)->ExceptionOccurred(env)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
            cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
        if (ret < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
        num_bytes -= ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
    if (!GET_ARRAYS(env, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
        cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
    if (num_bytes > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
        /* Silently accept truncated JPEG files */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
        WARNMS(cinfo, JWRN_JPEG_EOF);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
        src->inbuf[0] = (JOCTET) 0xFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
        src->inbuf[1] = (JOCTET) JPEG_EOI;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
        src->pub.bytes_in_buffer = 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
        src->pub.next_input_byte = src->inbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
        src->pub.bytes_in_buffer = -num_bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
        src->pub.next_input_byte = src->inbuf + ret + num_bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
 * Terminate source --- called by jpeg_finish_decompress() after all
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
 * data has been read.  Often a no-op.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
GLOBAL(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
sun_jpeg_term_source(j_decompress_ptr cinfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
Java_sun_awt_image_JPEGImageDecoder_initIDs(JNIEnv *env, jclass cls,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
                                            jclass InputStreamClass)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
{
23644
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   476
    CHECK_NULL(sendHeaderInfoID = (*env)->GetMethodID(env, cls, "sendHeaderInfo",
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   477
                                           "(IIZZZ)Z"));
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   478
    CHECK_NULL(sendPixelsByteID = (*env)->GetMethodID(env, cls, "sendPixels", "([BI)Z"));
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   479
    CHECK_NULL(sendPixelsIntID = (*env)->GetMethodID(env, cls, "sendPixels", "([II)Z"));
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   480
    CHECK_NULL(InputStream_readID = (*env)->GetMethodID(env, InputStreamClass,
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   481
                                             "read", "([BII)I"));
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   482
    CHECK_NULL(InputStream_availableID = (*env)->GetMethodID(env, InputStreamClass,
0cdb97daeef5 8030787: [Parfait] JNI-related warnings from b119 for jdk/src/share/native/sun/awt/image
pchelko
parents: 23010
diff changeset
   483
                                                  "available", "()I"));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
Java_sun_awt_image_JPEGImageDecoder_readImage(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
                                              jobject this,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
                                              jobject hInputStream,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
                                              jbyteArray hInputBuffer)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
  /* This struct contains the JPEG decompression parameters and pointers to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
   * working space (which is allocated as needed by the JPEG library).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
  struct jpeg_decompress_struct cinfo;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
  /* We use our private extension JPEG error handler.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
   * Note that this struct must live as long as the main JPEG parameter
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
   * struct, to avoid dangling-pointer problems.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
  struct sun_jpeg_error_mgr jerr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
  struct sun_jpeg_source_mgr jsrc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
  int ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
  unsigned char *bp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
  int *ip, pixel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
  int grayscale;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
  int hasalpha;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
  int buffered_mode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
  int final_pass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
  /* Step 0: verify the inputs. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
  if (hInputBuffer == 0 || hInputStream == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
    JNU_ThrowNullPointerException(env, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
  jsrc.outbuf.ip = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
  jsrc.inbuf = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
  /* Step 1: allocate and initialize JPEG decompression object */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
  /* We set up the normal JPEG error routines, then override error_exit. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
  cinfo.err = jpeg_std_error(&jerr.pub);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
  jerr.pub.error_exit = sun_jpeg_error_exit;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
  /* We need to setup our own print routines */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
  jerr.pub.output_message = sun_jpeg_output_message;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
  /* Establish the setjmp return context for sun_jpeg_error_exit to use. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
  if (setjmp(jerr.setjmp_buffer)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
    /* If we get here, the JPEG code has signaled an error.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
     * We need to clean up the JPEG object, close the input file, and return.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
    jpeg_destroy_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
    RELEASE_ARRAYS(env, &jsrc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
    if (!(*env)->ExceptionOccurred(env)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
        char buffer[JMSG_LENGTH_MAX];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
        (*cinfo.err->format_message) ((struct jpeg_common_struct *) &cinfo,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
                                      buffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
        JNU_ThrowByName(env, "sun/awt/image/ImageFormatException", buffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
  /* Now we can initialize the JPEG decompression object. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
  jpeg_create_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
  /* Step 2: specify data source (eg, a file) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
  cinfo.src = &jsrc.pub;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
  jsrc.hInputStream = hInputStream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
  jsrc.hInputBuffer = hInputBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
  jsrc.hOutputBuffer = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
  jsrc.suspendable = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
  jsrc.remaining_skip = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
  jsrc.inbufoffset = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
  jsrc.pub.init_source = sun_jpeg_init_source;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
  jsrc.pub.fill_input_buffer = sun_jpeg_fill_input_buffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
  jsrc.pub.skip_input_data = sun_jpeg_skip_input_data;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
  jsrc.pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
  jsrc.pub.term_source = sun_jpeg_term_source;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
  if (!GET_ARRAYS(env, &jsrc)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
    jpeg_destroy_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
  /* Step 3: read file parameters with jpeg_read_header() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
  (void) jpeg_read_header(&cinfo, TRUE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
  /* select buffered-image mode if it is a progressive JPEG only */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
  buffered_mode = cinfo.buffered_image = jpeg_has_multiple_scans(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
  grayscale = (cinfo.out_color_space == JCS_GRAYSCALE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
  hasalpha = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
  /* We can ignore the return value from jpeg_read_header since
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
   *   (a) suspension is not possible with the stdio data source, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
   *                                    (nor with the Java input source)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
   *   (b) we passed TRUE to reject a tables-only JPEG file as an error.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
   * See libjpeg.doc for more info.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
  RELEASE_ARRAYS(env, &jsrc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
  ret = (*env)->CallBooleanMethod(env, this, sendHeaderInfoID,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
                                  cinfo.image_width, cinfo.image_height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
                                  grayscale, hasalpha, buffered_mode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
  if ((*env)->ExceptionOccurred(env) || !ret) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
    /* No more interest in this image... */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
    jpeg_destroy_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
  /* Make a one-row-high sample array with enough room to expand to ints */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
  if (grayscale) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
      jsrc.hOutputBuffer = (*env)->NewByteArray(env, cinfo.image_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
      jsrc.hOutputBuffer = (*env)->NewIntArray(env, cinfo.image_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
  if (jsrc.hOutputBuffer == 0 || !GET_ARRAYS(env, &jsrc)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
    jpeg_destroy_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
  /* Step 4: set parameters for decompression */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
  /* In this example, we don't need to change any of the defaults set by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
   * jpeg_read_header(), so we do nothing here.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
  /* For the first pass for Java, we want to deal with RGB for simplicity */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
  /* Unfortunately, the JPEG code does not automatically convert Grayscale */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
  /* to RGB, so we have to deal with Grayscale explicitly. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
  if (!grayscale && !hasalpha) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
      cinfo.out_color_space = JCS_RGB;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
  /* Step 5: Start decompressor */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
  jpeg_start_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
  /* We may need to do some setup of our own at this point before reading
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
   * the data.  After jpeg_start_decompress() we have the correct scaled
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
   * output image dimensions available, as well as the output colormap
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
   * if we asked for color quantization.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
  /* Step 6: while (scan lines remain to be read) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
  /*           jpeg_read_scanlines(...); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
  /* Here we use the library's state variable cinfo.output_scanline as the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
   * loop counter, so that we don't have to keep track ourselves.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
  if (buffered_mode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
      final_pass = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
      cinfo.dct_method = JDCT_IFAST;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
  } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
      final_pass = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
  do {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
      if (buffered_mode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
          do {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
              sun_jpeg_fill_suspended_buffer(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
              jsrc.suspendable = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
              ret = jpeg_consume_input(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
              jsrc.suspendable = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
          } while (ret != JPEG_SUSPENDED && ret != JPEG_REACHED_EOI);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
          if (ret == JPEG_REACHED_EOI) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
              final_pass = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
              cinfo.dct_method = JDCT_ISLOW;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
          jpeg_start_output(&cinfo, cinfo.input_scan_number);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
      while (cinfo.output_scanline < cinfo.output_height) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
          if (! final_pass) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
              do {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
                  sun_jpeg_fill_suspended_buffer(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
                  jsrc.suspendable = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
                  ret = jpeg_consume_input(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
                  jsrc.suspendable = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
              } while (ret != JPEG_SUSPENDED && ret != JPEG_REACHED_EOI);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
              if (ret == JPEG_REACHED_EOI) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
                  break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
              }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
          (void) jpeg_read_scanlines(&cinfo, (JSAMPARRAY) &(jsrc.outbuf), 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
          if (grayscale) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
              RELEASE_ARRAYS(env, &jsrc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
              ret = (*env)->CallBooleanMethod(env, this, sendPixelsByteID,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
                                              jsrc.hOutputBuffer,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
                                              cinfo.output_scanline - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
          } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
              if (hasalpha) {
35289
1031cb912792 8139017: More stable image decoding
vadim
parents: 33653
diff changeset
   669
                  ip = jsrc.outbuf.ip + jsrc.outbufSize;
1031cb912792 8139017: More stable image decoding
vadim
parents: 33653
diff changeset
   670
                  bp = jsrc.outbuf.bp + jsrc.outbufSize * 4;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
                  while (ip > jsrc.outbuf.ip) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
                      pixel = (*--bp) << 24;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
                      pixel |= (*--bp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
                      pixel |= (*--bp) << 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
                      pixel |= (*--bp) << 16;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
                      *--ip = pixel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
                  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
              } else {
35289
1031cb912792 8139017: More stable image decoding
vadim
parents: 33653
diff changeset
   679
                  ip = jsrc.outbuf.ip + jsrc.outbufSize;
1031cb912792 8139017: More stable image decoding
vadim
parents: 33653
diff changeset
   680
                  bp = jsrc.outbuf.bp + jsrc.outbufSize * 3;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
                  while (ip > jsrc.outbuf.ip) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
                      pixel = (*--bp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
                      pixel |= (*--bp) << 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
                      pixel |= (*--bp) << 16;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
                      *--ip = pixel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
                  }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
              }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
              RELEASE_ARRAYS(env, &jsrc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
              ret = (*env)->CallBooleanMethod(env, this, sendPixelsIntID,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
                                              jsrc.hOutputBuffer,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
                                              cinfo.output_scanline - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
          if ((*env)->ExceptionOccurred(env) || !ret ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
              !GET_ARRAYS(env, &jsrc)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
              /* No more interest in this image... */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
              jpeg_destroy_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
              return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
      if (buffered_mode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
          jpeg_finish_output(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
  } while (! final_pass);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
  /* Step 7: Finish decompression */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
  (void) jpeg_finish_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
  /* We can ignore the return value since suspension is not possible
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
   * with the stdio data source.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
   * (nor with the Java data source)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
  /* Step 8: Release JPEG decompression object */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
  /* This is an important step since it will release a good deal of memory. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
  jpeg_destroy_decompress(&cinfo);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
  /* After finish_decompress, we can close the input file.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
   * Here we postpone it until after no more JPEG errors are possible,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
   * so as to simplify the setjmp error logic above.  (Actually, I don't
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
   * think that jpeg_destroy can do an error exit, but why assume anything...)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
  /* Not needed for Java - the Java code will close the file */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
  /* fclose(infile); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
  /* At this point you may want to check to see whether any corrupt-data
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
   * warnings occurred (test whether jerr.pub.num_warnings is nonzero).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
  /* And we're done! */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
  RELEASE_ARRAYS(env, &jsrc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
  return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
 * SOME FINE POINTS:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
 * In the above code, we ignored the return value of jpeg_read_scanlines,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
 * which is the number of scanlines actually read.  We could get away with
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
 * this because we asked for only one line at a time and we weren't using
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
 * a suspending data source.  See libjpeg.doc for more info.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
 * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
 * we should have done it beforehand to ensure that the space would be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
 * counted against the JPEG max_memory setting.  In some systems the above
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
 * code would risk an out-of-memory error.  However, in general we don't
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
 * know the output image dimensions before jpeg_start_decompress(), unless we
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
 * call jpeg_calc_output_dimensions().  See libjpeg.doc for more about this.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
 * Scanlines are returned in the same order as they appear in the JPEG file,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
 * which is standardly top-to-bottom.  If you must emit data bottom-to-top,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
 * you can use one of the virtual arrays provided by the JPEG memory manager
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
 * to invert the data.  See wrbmp.c for an example.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
 * As with compression, some operating modes may require temporary files.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
 * On some systems you may need to set up a signal handler to ensure that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
 * temporary files are deleted if the program is interrupted.  See libjpeg.doc.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
 */