home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 May / VPR0105A.BIN / OLS / BR98211 / br98211.lzh / JPG6CDB.CPP < prev    next >
C/C++ Source or Header  |  2000-04-25  |  4KB  |  168 lines

  1. // JPEG Loader for Browser Return Ver2
  2. // Copyright (C) AsakaSoft 2000
  3. // this software is based in part on the work of the Independent JPEG Group.
  4. //
  5.  
  6. #include <stdio.h>
  7. #include <dos.h>
  8. #include <mem.h>
  9. extern "C" {
  10. #include "jpeglib.h"
  11. }
  12.  
  13. typedef unsigned int uint;
  14. typedef unsigned char uchar;
  15.  
  16. uchar pbuf[4][640/8];
  17. uchar nsw = 0;
  18. void pinit ( void );
  19. void pset ( uint x, uchar r, uchar g, uchar b, uchar dx, uchar dy );
  20. void psetg ( uint x, uint gray, uchar dx, uchar dy );
  21. void pwrite ( JDIMENSION w, /*uint y,*/ FILE *cfp );
  22.  
  23. /*uchar pat[4][4] = {
  24.  1, 10,  3, 12,
  25. 14,  5, 16,  7,
  26.  4, 13,  2, 11,
  27. 17,  9, 15,  6 };
  28. */
  29. uchar pat[4][4] = {
  30. 16,  7, 14,  5,
  31.  3, 12,  1, 10,
  32. 13,  4, 15,  6,
  33.  0,  8,  2, 11 };
  34.  
  35. main ( ) {
  36.     struct jpeg_decompress_struct cinfo;
  37.     struct jpeg_error_mgr jerr;
  38.     JSAMPARRAY buf;
  39.  
  40.     JDIMENSION jx, jy, sl, i;
  41.     unsigned long lx, ly;
  42.  
  43.     FILE *fp;
  44.     int row_stride;
  45.     FILE *cfp;
  46.  
  47. /*    outportb ( 0x6a, 1 );
  48.     for ( i = 0 ; i < 8 ; i++ ) {
  49.         outportb ( 0xa8, i );
  50.         outportb ( 0xac, i*2 );
  51.         outportb ( 0xaa, i*2 );
  52.         outportb ( 0xae, i*2 );
  53.         outportb ( 0xa8, i + 8 );
  54.         outportb ( 0xac, i*2+1 );
  55.         outportb ( 0xaa, i*2+1 );
  56.         outportb ( 0xae, i*2+1 );
  57.     }
  58. */
  59.  
  60.     cinfo.err = jpeg_std_error ( &jerr );
  61.     jpeg_create_decompress ( &cinfo );
  62.  
  63. //    if ( **(_argv+2) == '/' ) nsw = 1;
  64.     fp = fopen ( *(_argv+1),"rb" );
  65.     if ( fp == NULL ) return ( 1 );
  66.     cfp = fopen ( *(_argv+2), "wb" );
  67.     if ( cfp == NULL ) {
  68.         fclose ( fp );
  69.         return ( 1 );
  70.     }
  71.  
  72. printf ( "JPEG Loader for AsakaSoft Browser Returns Ver2\nthis software is based in part on the work of the Independent JPEG Group.\n\nNow Loading %s\n", *(_argv+1) );
  73.  
  74.     jpeg_stdio_src ( &cinfo, fp );
  75.  
  76.     jpeg_read_header ( &cinfo, TRUE );
  77.  
  78.     printf ( "Start Decompress...\r" );
  79.     jpeg_start_decompress ( &cinfo );
  80.     printf ( "Start Decompress...done.\n" );
  81.  
  82.     jx = cinfo.output_width;
  83.     jy = cinfo.output_height;
  84.     lx = jx, ly = jy;
  85.     printf ( "X%lu Y%lu\n", lx, ly );
  86.     fwrite ( (void *)&lx, 4, 1, cfp );
  87.     fwrite ( (void *)&ly, 4, 1, cfp );
  88.     fputc ( 1, cfp );
  89.  
  90.     row_stride = cinfo.output_width * cinfo.output_components;
  91.     buf = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
  92.  
  93.     while ( cinfo.output_scanline < cinfo.output_height ) {
  94.         sl = cinfo.output_scanline;
  95.         jpeg_read_scanlines (&cinfo, buf, 1);
  96.  
  97.         pinit ();
  98.         for ( i = 0 ; i < jx ; i++ ) {
  99.             if ( cinfo.output_components == 1 ) {
  100.                 psetg ( i, buf[0][i], i&3, sl&3 );
  101.             } else {
  102.                 pset ( i, buf[0][i*3], buf[0][i*3+1], buf[0][i*3+2], i&3, sl&3 );
  103.             }
  104.         }
  105.         pwrite ( jx, /*sl,*/ cfp );
  106.         printf ( "Scan %u/%u\r", sl, jy );
  107.     }
  108.     printf ( "Scan Complete.\n" );
  109.  
  110.     jpeg_finish_decompress ( &cinfo );
  111.  
  112.     jpeg_destroy_decompress ( &cinfo );
  113.  
  114.     fclose ( fp );
  115.     fclose ( cfp );
  116.     return ( 0 );
  117. }
  118.  
  119. void pinit ( void ) {
  120.     memset ( pbuf, 0, 640/8*4 );
  121. }
  122.  
  123. void pset ( uint x, uchar r, uchar g, uchar b, uchar dx, uchar dy ) {
  124.     uchar s;
  125.  
  126.     s = ( (uint)b*28 + (uint)r*77 + (uint)g*151 ) / 256;
  127.     psetg ( x, s, dx, dy );
  128. }
  129.  
  130. void psetg ( uint x, uint gray, uchar dx, uchar dy ) {
  131.     uchar or[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
  132.     uchar bi, b2;
  133.  
  134.     if ( x >= 640 ) return;
  135. //    gray = (uint)gray * 15 / 255;
  136. /*    b2 = gray % 17;
  137.     gray /= 17;
  138.     if ( b2 >= pat[dx][dy] ) gray++;
  139. */
  140.     gray = ( gray + pat[dx][dy] ) / 17;
  141.  
  142.     if ( nsw ) gray = 15 - gray;
  143.  
  144.     bi = x >> 3;
  145.     b2 = x & 7;
  146.  
  147.     if ( gray & 1 ) pbuf[0][bi] |= or[b2];
  148.     if ( gray & 2 ) pbuf[1][bi] |= or[b2];
  149.     if ( gray & 4 ) pbuf[2][bi] |= or[b2];
  150.     if ( gray & 8 ) pbuf[3][bi] |= or[b2];
  151. }
  152.  
  153. void pwrite ( JDIMENSION w, /*uint y,*/ FILE *cfp ) {
  154. //    uint gseg[4] = { 0xe000, 0xa800, 0xb000, 0xb800 };
  155.     uint i, j;
  156.     JDIMENSION x;
  157.  
  158. //    if ( y >= 400 ) return;
  159.     x = ( w + 7 ) / 8;
  160.     if ( x > 80 ) x = 80;
  161.  
  162.     for ( i = 0 ; i < 4; i++ ) {
  163. //        _fmemcpy ( MK_FP ( gseg[i], y * 80 ), pbuf[i], 80 );
  164.         fwrite ( pbuf[i], x, 1, cfp );
  165.     }
  166. }
  167.  
  168.