JPEGReader.st
changeset 2282 ec2ab83c4b1b
parent 2050 a955518cdad4
child 2283 a1aa773edb4e
equal deleted inserted replaced
2281:f7b9aed0515a 2282:ec2ab83c4b1b
    65     j_common_ptr cinfo;
    65     j_common_ptr cinfo;
    66 {
    66 {
    67     struct my_error_mgr *myerrPtr = (struct my_error_mgr *) cinfo->err;
    67     struct my_error_mgr *myerrPtr = (struct my_error_mgr *) cinfo->err;
    68 
    68 
    69     if (@global(ErrorPrinting) == true) {
    69     if (@global(ErrorPrinting) == true) {
    70 	fprintf(stderr, "JPEGReader [warning]: jpeg error\n");
    70 	console_printf("JPEGReader [warning]: jpeg error\n");
    71     }
    71     }
    72     longjmp(myerrPtr->setjmp_buffer, 1);
    72     longjmp(myerrPtr->setjmp_buffer, 1);
    73 }
    73 }
    74 
    74 
    75 static
    75 static
    77     j_common_ptr cinfo;
    77     j_common_ptr cinfo;
    78 {
    78 {
    79     char buffer[JMSG_LENGTH_MAX];
    79     char buffer[JMSG_LENGTH_MAX];
    80 
    80 
    81     if (@global(ErrorPrinting) == true) {
    81     if (@global(ErrorPrinting) == true) {
    82 	fprintf(stderr, "libJPEG [error]: ");
    82 	console_printf("libJPEG [error]: ");
    83 
    83 
    84        /* Create the message */
    84        /* Create the message */
    85        (*cinfo->err->format_message) (cinfo, buffer);
    85        (*cinfo->err->format_message) (cinfo, buffer);
    86 
    86 
    87        /* Send it to stderr, adding a newline */
    87        /* Send it to stderr, adding a newline */
    88        fprintf(stderr, "%s\n", buffer);
    88        console_printf("%s\n", buffer);
    89     }
    89     }
    90 }
    90 }
    91 
    91 
    92 /*
    92 /*
    93  * Optional progress monitor: display a percent-done figure on stderr.
    93  * Optional progress monitor: display a percent-done figure on stderr.
   103   int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit);
   103   int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit);
   104 
   104 
   105   if (percent_done != prog->percent_done) {
   105   if (percent_done != prog->percent_done) {
   106     prog->percent_done = percent_done;
   106     prog->percent_done = percent_done;
   107     if (total_passes > 1) {
   107     if (total_passes > 1) {
   108       fprintf(stderr, "\rPass %d/%d: %3d%% ",
   108       console_printf("\rPass %d/%d: %3d%% ",
   109 	      prog->pub.completed_passes + prog->completed_extra_passes + 1,
   109 	      prog->pub.completed_passes + prog->completed_extra_passes + 1,
   110 	      total_passes, percent_done);
   110 	      total_passes, percent_done);
   111     } else {
   111     } else {
   112       fprintf(stderr, "\r %3d%% ", percent_done);
   112       console_printf("\r %3d%% ", percent_done);
   113     }
   113     }
   114     fflush(stderr);
   114     fflush(stderr);
   115   }
   115   }
   116 }
   116 }
   117 
   117 
   133 void
   133 void
   134 JPG_end_progress_monitor (j_common_ptr cinfo)
   134 JPG_end_progress_monitor (j_common_ptr cinfo)
   135 {
   135 {
   136   /* Clear away progress display */
   136   /* Clear away progress display */
   137   if (cinfo->err->trace_level == 0) {
   137   if (cinfo->err->trace_level == 0) {
   138     fprintf(stderr, "\r                \r");
   138     console_printf("\r                \r");
   139     fflush(stderr);
       
   140   }
   139   }
   141 }
   140 }
   142 
   141 
   143 #endif
   142 #endif
   144 
   143 
   169 
   168 
   170     Only reading of files is supported.
   169     Only reading of files is supported.
   171 
   170 
   172     [See also:]
   171     [See also:]
   173 	Image Form Icon
   172 	Image Form Icon
   174 	BlitImageReader FaceReader GIFReader PBMReader PCXReader 
   173 	BlitImageReader FaceReader GIFReader PBMReader PCXReader
   175 	ST80FormReader SunRasterReader TargaReader TIFFReader WindowsIconReader 
   174 	ST80FormReader SunRasterReader TargaReader TIFFReader WindowsIconReader
   176 	XBMReader XPMReader XWDReader 
   175 	XBMReader XPMReader XWDReader
   177 "
   176 "
   178 ! !
   177 ! !
   179 
   178 
   180 !JPEGReader class methodsFor:'initialization'!
   179 !JPEGReader class methodsFor:'initialization'!
   181 
   180 
   252     if (__isExternalBytesLike(j_d_s)
   251     if (__isExternalBytesLike(j_d_s)
   253      && __isExternalBytesLike(j_e_m)) {
   252      && __isExternalBytesLike(j_e_m)) {
   254 	cinfoPtr = (struct jpeg_decompress_struct *)(__externalBytesAddress(j_d_s));
   253 	cinfoPtr = (struct jpeg_decompress_struct *)(__externalBytesAddress(j_d_s));
   255 	jerrPtr = (struct my_error_mgr *)(__externalBytesAddress(j_e_m));
   254 	jerrPtr = (struct my_error_mgr *)(__externalBytesAddress(j_e_m));
   256 
   255 
   257 	/* 
   256 	/*
   258 	 * Initialize the JPEG decompression object with default error handling.
   257 	 * Initialize the JPEG decompression object with default error handling.
   259 	 */
   258 	 */
   260 	cinfoPtr->err = jpeg_std_error(jerrPtr);
   259 	cinfoPtr->err = jpeg_std_error(jerrPtr);
   261 
   260 
   262 	/*
   261 	/*
   263 	 * prepare to handle errors smoothly ...
   262 	 * prepare to handle errors smoothly ...
   264 	 */
   263 	 */
   265 	jerrPtr->pub.error_exit = my_error_exit;
   264 	jerrPtr->pub.error_exit = my_error_exit;
   266 	if (setjmp(jerrPtr->setjmp_buffer)) {
   265 	if (setjmp(jerrPtr->setjmp_buffer)) {
   267 	    /* 
   266 	    /*
   268 	     * error occurred ...
   267 	     * error occurred ...
   269 	     */
   268 	     */
   270 	    jpeg_destroy_decompress(cinfoPtr);
   269 	    jpeg_destroy_decompress(cinfoPtr);
   271 	    RETURN (false);
   270 	    RETURN (false);
   272 	}
   271 	}
   276 	*/
   275 	*/
   277        jerrPtr->pub.output_message = my_output_message;
   276        jerrPtr->pub.output_message = my_output_message;
   278 
   277 
   279 	jpeg_create_decompress(cinfoPtr);
   278 	jpeg_create_decompress(cinfoPtr);
   280 #if 0
   279 #if 0
   281 	/* 
   280 	/*
   282 	 * Insert custom COM marker processor.
   281 	 * Insert custom COM marker processor.
   283 	 */
   282 	 */
   284 	jpeg_set_marker_processor(cinfoPtr, JPEG_COM, COM_handler);
   283 	jpeg_set_marker_processor(cinfoPtr, JPEG_COM, COM_handler);
   285 #endif
   284 #endif
   286 	cinfoPtr->err->trace_level = 0;
   285 	cinfoPtr->err->trace_level = 0;
   390 	rowPointers[2] = NULL;
   389 	rowPointers[2] = NULL;
   391 	rowPointers[3] = NULL;
   390 	rowPointers[3] = NULL;
   392 
   391 
   393 	if (cinfoPtr->output_scanline < cinfoPtr->output_height) {
   392 	if (cinfoPtr->output_scanline < cinfoPtr->output_height) {
   394 	    if (setjmp(jerrPtr->setjmp_buffer)) {
   393 	    if (setjmp(jerrPtr->setjmp_buffer)) {
   395 		/* 
   394 		/*
   396 		 * error occurred ...
   395 		 * error occurred ...
   397 		 */
   396 		 */
   398 		jpeg_destroy_decompress(cinfoPtr);
   397 		jpeg_destroy_decompress(cinfoPtr);
   399 		RETURN (__mkSmallInteger(-1));
   398 		RETURN (__mkSmallInteger(-1));
   400 	    }
   399 	    }
   401 	    num_scanlines = jpeg_read_scanlines(cinfoPtr, 
   400 	    num_scanlines = jpeg_read_scanlines(cinfoPtr,
   402 						rowPointers,
   401 						rowPointers,
   403 						1);
   402 						1);
   404 	    RETURN (__mkSmallInteger(num_scanlines));
   403 	    RETURN (__mkSmallInteger(num_scanlines));
   405 	}
   404 	}
   406 	RETURN (__mkSmallInteger(0));
   405 	RETURN (__mkSmallInteger(0));
   494 	    ^ self fromStream:s.
   493 	    ^ self fromStream:s.
   495 	] ensure:[
   494 	] ensure:[
   496 	    s notNil ifTrue:[s close].
   495 	    s notNil ifTrue:[s close].
   497 	    tmpFile delete.
   496 	    tmpFile delete.
   498 	].
   497 	].
   499         
   498 
   500 	"/ 'JPEGReader [info]: can only read from real streams' infoPrintCR.
   499 	"/ 'JPEGReader [info]: can only read from real streams' infoPrintCR.
   501 	"/ ^ nil
   500 	"/ ^ nil
   502     ].
   501     ].
   503 
   502 
   504     inStream := aStream.
   503     inStream := aStream.
   535     bytesPerRow := colorComponents * width.
   534     bytesPerRow := colorComponents * width.
   536 
   535 
   537     [(returnCode := self decompressChunkInto:data startingAt:dataIdx) > 0] whileTrue:[
   536     [(returnCode := self decompressChunkInto:data startingAt:dataIdx) > 0] whileTrue:[
   538 	"/ got a row in the buffer ...
   537 	"/ got a row in the buffer ...
   539 	dataIdx := dataIdx + bytesPerRow
   538 	dataIdx := dataIdx + bytesPerRow
   540     ].    
   539     ].
   541     returnCode < 0 ifTrue:[
   540     returnCode < 0 ifTrue:[
   542 	'JPEGReader [info]: ' infoPrint. self get_error_message infoPrintCR.
   541 	'JPEGReader [info]: ' infoPrint. self get_error_message infoPrintCR.
   543 	^ nil
   542 	^ nil
   544     ].
   543     ].
   545 
   544 
   576 ! !
   575 ! !
   577 
   576 
   578 !JPEGReader class methodsFor:'documentation'!
   577 !JPEGReader class methodsFor:'documentation'!
   579 
   578 
   580 version
   579 version
   581     ^ '$Header: /cvs/stx/stx/libview2/JPEGReader.st,v 1.46 2005-07-08 19:39:01 cg Exp $'
   580     ^ '$Header: /cvs/stx/stx/libview2/JPEGReader.st,v 1.47 2007-01-24 13:44:00 cg Exp $'
   582 ! !
   581 ! !
   583 
   582 
   584 JPEGReader initialize!
   583 JPEGReader initialize!