📄 tif_ojpeg.c
字号:
static int
TIFFojpeg_finish_decompress(register OJPEGState *sp)
{return CALLJPEG(sp,-1,(int)jpeg_finish_decompress(&sp->cinfo.d));}
static int
TIFFojpeg_read_header(register OJPEGState *sp,boolean require_image)
{return CALLJPEG(sp,-1,jpeg_read_header(&sp->cinfo.d,require_image));}
static int
TIFFojpeg_read_raw_data(register OJPEGState *sp,JSAMPIMAGE data,int max_lines)
{
return
CALLJPEG(sp,-1,(int)jpeg_read_raw_data(&sp->cinfo.d,data,(JDIMENSION)max_lines));
}
static int
TIFFojpeg_read_scanlines(register OJPEGState *sp,JSAMPARRAY scanlines,
int max_lines)
{ return
CALLJPEG(sp,-1,(int)jpeg_read_scanlines(&sp->cinfo.d,scanlines,(JDIMENSION)max_lines));
}
static int
TIFFojpeg_start_decompress(register OJPEGState *sp)
{return CALLVJPEG(sp,jpeg_start_decompress(&sp->cinfo.d));}
#ifdef never
/* The following subroutines comprise a JPEG Library "destination" data manager
by directing compressed data from the JPEG Library to a TIFF Library output
buffer.
*/
static void
std_init_destination(register j_compress_ptr cinfo){} /* "Dummy" stub */
static boolean
std_empty_output_buffer(register j_compress_ptr cinfo)
{
# define sp ((OJPEGState *)cinfo)
register TIFF *tif = sp->tif;
tif->tif_rawcc = tif->tif_rawdatasize; /* Entire buffer has been filled */
TIFFFlushData1(tif);
sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata;
sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize;
return TRUE;
# undef sp
}
static void
std_term_destination(register j_compress_ptr cinfo)
{
# define sp ((OJPEGState *)cinfo)
register TIFF *tif = sp->tif;
/* NB: The TIFF Library does the final buffer flush. */
tif->tif_rawcp = (tidata_t)sp->dest.next_output_byte;
tif->tif_rawcc = tif->tif_rawdatasize - (tsize_t)sp->dest.free_in_buffer;
# undef sp
}
/*ARGSUSED*/ static void
TIFFojpeg_data_dest(register OJPEGState *sp,TIFF *tif)
{
sp->cinfo.c.dest = &sp->dest;
sp->dest.init_destination = std_init_destination;
sp->dest.empty_output_buffer = std_empty_output_buffer;
sp->dest.term_destination = std_term_destination;
}
/* Alternate destination manager to output JPEGTables field: */
static void
tables_init_destination(register j_compress_ptr cinfo)
{
# define sp ((OJPEGState *)cinfo)
/* The "jpegtables_length" field is the allocated buffer size while building */
sp->dest.next_output_byte = (JOCTET *)sp->jpegtables;
sp->dest.free_in_buffer = (size_t)sp->jpegtables_length;
# undef sp
}
static boolean
tables_empty_output_buffer(register j_compress_ptr cinfo)
{ void *newbuf;
# define sp ((OJPEGState *)cinfo)
/* The entire buffer has been filled, so enlarge it by 1000 bytes. */
if (!( newbuf = _TIFFrealloc( (tdata_t)sp->jpegtables
, (tsize_t)(sp->jpegtables_length + 1000)
)
)
) ERREXIT1(cinfo,JERR_OUT_OF_MEMORY,100);
sp->dest.next_output_byte = (JOCTET *)newbuf + sp->jpegtables_length;
sp->dest.free_in_buffer = (size_t)1000;
sp->jpegtables = newbuf;
sp->jpegtables_length += 1000;
return TRUE;
# undef sp
}
static void
tables_term_destination(register j_compress_ptr cinfo)
{
# define sp ((OJPEGState *)cinfo)
/* Set tables length to no. of Bytes actually emitted. */
sp->jpegtables_length -= sp->dest.free_in_buffer;
# undef sp
}
/*ARGSUSED*/ static int
TIFFojpeg_tables_dest(register OJPEGState *sp, TIFF *tif)
{
/* Allocate a working buffer for building tables. The initial size is 1000
Bytes, which is usually adequate.
*/
if (sp->jpegtables) _TIFFfree(sp->jpegtables);
if (!(sp->jpegtables = (void*)
_TIFFmalloc((tsize_t)(sp->jpegtables_length = 1000))
)
)
{
sp->jpegtables_length = 0;
TIFFError("TIFFojpeg_tables_dest",no_jtable_space);
return 0;
};
sp->cinfo.c.dest = &sp->dest;
sp->dest.init_destination = tables_init_destination;
sp->dest.empty_output_buffer = tables_empty_output_buffer;
sp->dest.term_destination = tables_term_destination;
return 1;
}
#endif /* never */
/* The following subroutines comprise a JPEG Library "source" data manager by
by directing compressed data to the JPEG Library from a TIFF Library input
buffer.
*/
static void
std_init_source(register j_decompress_ptr cinfo)
{
# define sp ((OJPEGState *)cinfo)
register TIFF *tif = sp->tif;
if (sp->src.bytes_in_buffer == 0)
{
sp->src.next_input_byte = (const JOCTET *)tif->tif_rawdata;
sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
};
# undef sp
}
static boolean
std_fill_input_buffer(register j_decompress_ptr cinfo)
{ static const JOCTET dummy_EOI[2]={0xFF,JPEG_EOI};
# define sp ((OJPEGState *)cinfo)
/* Control should never get here, since an entire strip/tile is read into
memory before the decompressor is called; thus, data should have been
supplied by the "init_source" method. ...But, sometimes things fail.
*/
WARNMS(cinfo,JWRN_JPEG_EOF);
sp->src.next_input_byte = dummy_EOI; /* Insert a fake EOI marker */
sp->src.bytes_in_buffer = sizeof dummy_EOI;
return TRUE;
# undef sp
}
static void
std_skip_input_data(register j_decompress_ptr cinfo,long num_bytes)
{
# define sp ((OJPEGState *)cinfo)
if (num_bytes > 0)
if (num_bytes > (long)sp->src.bytes_in_buffer) /* oops: buffer overrun */
(void)std_fill_input_buffer(cinfo);
else
{
sp->src.next_input_byte += (size_t)num_bytes;
sp->src.bytes_in_buffer -= (size_t)num_bytes;
}
# undef sp
}
/*ARGSUSED*/ static void
std_term_source(register j_decompress_ptr cinfo){} /* "Dummy" stub */
/* Allocate temporary I/O buffers for downsampled data, using values computed in
"jpeg_start_{de}compress()". We use the JPEG Library's allocator so that
buffers will be released automatically when done with a strip/tile. This is
also a handy place to compute samplesperclump, bytesperline, etc.
*/
static int
alloc_downsampled_buffers(TIFF *tif,jpeg_component_info *comp_info,
int num_components)
{ register OJPEGState *sp = OJState(tif);
sp->samplesperclump = 0;
if (num_components > 0)
{ int ci = 0;
register jpeg_component_info *compptr = comp_info;
do
{ JSAMPARRAY buf;
sp->samplesperclump +=
compptr->h_samp_factor * compptr->v_samp_factor;
if (!(buf = TIFFojpeg_alloc_sarray( sp
, JPOOL_IMAGE
, compptr->width_in_blocks*DCTSIZE
, compptr->v_samp_factor *DCTSIZE
)
)
) return 0;
sp->ds_buffer[ci] = buf;
}
while (++compptr,++ci < num_components);
};
return 1;
}
#ifdef never
/* JPEG Encoding begins here. */
static void
unsuppress_quant_table(register OJPEGState *sp,int tblno)
{ register JQUANT_TBL *qtbl;
if (qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) qtbl->sent_table = FALSE;
}
static void
unsuppress_huff_table(register OJPEGState *sp,register int tblno)
{ register JHUFF_TBL *htbl;
if ( (htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno])
|| (htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno])
) htbl->sent_table = FALSE;
}
static int
prepare_JPEGTables(register TIFF *tif)
{ register OJPEGState *sp = OJState(tif);
/* Initialize quantization tables for the current quality setting, and mark for
output only the tables that we want. Note that chrominance tables are
currently used only with YCbCr.
*/
if ( !TIFFojpeg_set_quality(sp,sp->jpegquality,FALSE);
|| !TIFFojpeg_suppress_tables(sp,TRUE)
) return 0;
if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)
{
unsuppress_quant_table(sp,0);
if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_quant_table(sp,1);
}
if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
{
unsuppress_huff_table(sp,0);
if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_huff_table(sp,1);
};
return TIFFojpeg_tables_dest(sp,tif) && TIFFojpeg_write_tables(sp);
}
static int
OJPEGSetupEncode(register TIFF *tif)
{ static const char module[]={"OJPEGSetupEncode"};
register OJPEGState *sp = OJState(tif);
# define td (&tif->tif_dir)
/* Verify miscellaneous parameters. This will need work if the TIFF Library
ever supports different depths for different components, or if the JPEG
Library ever supports run-time depth selection. Neither seems imminent.
*/
if (td->td_bitspersample != BITS_IN_JSAMPLE)
{
TIFFError(module,bad_bps,td->td_bitspersample);
return 0;
};
/* Initialize all JPEG parameters to default values. Note that the JPEG
Library's "jpeg_set_defaults()" method needs legal values for the
"in_color_space" and "input_components" fields.
*/
sp->cinfo.c.in_color_space = JCS_UNKNOWN;
sp->cinfo.c.input_components = 1;
if (!TIFFojpeg_set_defaults(sp)) return 0;
switch (sp->photometric = td->td_photometric) /* set per-file parameters */
{
case PHOTOMETRIC_YCBCR:
sp->h_sampling = td->td_ycbcrsubsampling[0];
sp->v_sampling = td->td_ycbcrsubsampling[1];
# ifdef COLORIMETRY_SUPPORT
/* A ReferenceBlackWhite field MUST be present, since the default value
is inapproriate for YCbCr. Fill in the proper value if application
didn't set it.
*/
if (!TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
{ float refbw[6];
long top = 1L << td->td_bitspersample;
refbw[0] = 0;
refbw[1] = (float)(top-1L);
refbw[2] = (float)(top>>1);
refbw[3] = refbw[1];
refbw[4] = refbw[2];
refbw[5] = refbw[1];
TIFFSetField(tif,TIFFTAG_REFERENCEBLACKWHITE,refbw);
};
# endif /* COLORIMETRY_SUPPORT */
break;
case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
case PHOTOMETRIC_MASK:
TIFFError(module,"PhotometricInterpretation %d not allowed for JPEG",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -