50   struct jpeg_source_mgr pub;   
    52   std::istream * infile;             
    54   boolean start_of_file;        
    57 typedef my_source_mgr * my_src_ptr;
    59 #define INPUT_BUF_SIZE  4096        68 init_source (j_decompress_ptr cinfo)
    70   my_src_ptr src = (my_src_ptr) cinfo->src;
    76   src->start_of_file = TRUE;
   114 fill_input_buffer (j_decompress_ptr cinfo)
   116   my_src_ptr src = (my_src_ptr) cinfo->src;
   119   src->infile->read((
char *)src->buffer, INPUT_BUF_SIZE);
   120   nbytes = src->infile->gcount();
   124     if (src->start_of_file)     
   125       ERREXIT(cinfo, JERR_INPUT_EMPTY);
   126     WARNMS(cinfo, JWRN_JPEG_EOF);
   128     src->buffer[0] = (JOCTET) 0xFF;
   129     src->buffer[1] = (JOCTET) JPEG_EOI;
   133   src->pub.next_input_byte = src->buffer;
   134   src->pub.bytes_in_buffer = nbytes;
   135   src->start_of_file = FALSE;
   154 skip_input_data (j_decompress_ptr cinfo, 
long num_bytes)
   156   my_src_ptr src = (my_src_ptr) cinfo->src;
   163     while (num_bytes > (
long) src->pub.bytes_in_buffer) {
   164       num_bytes -= (long) src->pub.bytes_in_buffer;
   165       (
void) fill_input_buffer(cinfo);
   170     src->pub.next_input_byte += (size_t) num_bytes;
   171     src->pub.bytes_in_buffer -= (size_t) num_bytes;
   195 term_source (j_decompress_ptr cinfo)
   208 jpeg_istream_src (j_decompress_ptr cinfo, std::istream * infile)
   219   if (cinfo->src == 
nullptr) {     
   220     cinfo->src = (
struct jpeg_source_mgr *)
   221       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
   222                                   sizeof(my_source_mgr));
   223     src = (my_src_ptr) cinfo->src;
   224     src->buffer = (JOCTET *)
   225       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
   226                                   INPUT_BUF_SIZE * 
sizeof(JOCTET));
   229   src = (my_src_ptr) cinfo->src;
   230   src->pub.init_source = init_source;
   231   src->pub.fill_input_buffer = fill_input_buffer;
   232   src->pub.skip_input_data = skip_input_data;
   233   src->pub.resync_to_restart = jpeg_resync_to_restart; 
   234   src->pub.term_source = term_source;
   235   src->infile = infile;
   236   src->pub.bytes_in_buffer = 0; 
   237   src->pub.next_input_byte = 
nullptr; 
   247 PNMFileTypeJPG::Reader::
   248 Reader(
PNMFileType *type, std::istream *file, 
bool owns_file, std::string magic_number) :
   252   for (std::string::reverse_iterator mi = magic_number.rbegin();
   253        mi != magic_number.rend();
   258     pnmimage_jpg_cat.error()
   259       << 
"Unable to put back magic number.\n";
   268   _cinfo.err = jpeg_std_error(&_jerr.pub);
   271   jpeg_create_decompress(&_cinfo);
   274   jpeg_istream_src(&_cinfo, file);
   277   jpeg_save_markers(&_cinfo, JPEG_COM, 0xffff);
   280   jpeg_read_header(&_cinfo, TRUE);
   287   _num_channels = _cinfo.num_components;
   288   _x_size = (int)_cinfo.image_width;
   289   _y_size = (
int)_cinfo.image_height;
   290   _maxval = MAXJSAMPLE;
   293   _cinfo.scale_num = 1;
   294   _cinfo.scale_denom = 1;
   305 void PNMFileTypeJPG::Reader::
   307   if (_has_read_size && _read_x_size != 0 && _read_y_size != 0) {
   309     int x_reduction = _cinfo.image_width / _read_x_size;
   310     int y_reduction = _cinfo.image_height / _read_y_size;
   311     _cinfo.scale_denom = std::max(std::min(x_reduction, y_reduction), 1);
   316   jpeg_start_decompress(&_cinfo);
   321   _num_channels = _cinfo.output_components;
   322   _x_size = (int)_cinfo.output_width;
   323   _y_size = (
int)_cinfo.output_height;
   329 PNMFileTypeJPG::Reader::
   332     jpeg_destroy_decompress(&_cinfo);
   346 int PNMFileTypeJPG::Reader::
   347 read_data(
xel *array, xelval *) {
   354   nassertr(_cinfo.output_components == 1 || _cinfo.output_components == 3, 0);
   363   row_stride = _cinfo.output_width * _cinfo.output_components;
   366   buffer = (*_cinfo.mem->alloc_sarray)
   367                 ((j_common_ptr) &_cinfo, JPOOL_IMAGE, row_stride, 1);
   376   while (_cinfo.output_scanline < _cinfo.output_height) {
   381     jpeg_read_scanlines(&_cinfo, buffer, 1);
   384     JSAMPROW bufptr = buffer[0];
   385     for (
int i = 0; i < row_stride; i += _cinfo.output_components) {
   386       if (_cinfo.output_components == 1) {
   387         xelval val = (xelval)bufptr[i];
   388         nassertr(x < _x_size * _y_size, 0);
   389         PNM_ASSIGN1(array[x], val);
   391         xelval red, grn, blu;
   392         red = (xelval)bufptr[i];
   393         grn = (xelval)bufptr[i+1];
   394         blu = (xelval)bufptr[i+2];
   395         nassertr(x < _x_size * _y_size, 0);
   396         PPM_ASSIGN(array[x], red, grn, blu);
   405   jpeg_finish_decompress(&_cinfo);
   414   if (_jerr.pub.num_warnings) {
   415     pnmimage_jpg_cat.warning()
   416       << 
"Jpeg data may be corrupt" << std::endl;
 This is the base class of a family of classes that represent particular image file types that PNMImag...
 
static void consider_yield()
Possibly suspends the current thread for the rest of the current epoch, if it has run for enough this...
 
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
 
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
 
This is an abstract base class that defines the interface for reading image files of various types.
 
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.