Implement a custom DCT filter callback for lossless transforms
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@703 632fc199-4ca6-4c93-a231-07263d6284db
diff --git a/turbojpeg.c b/turbojpeg.c
index a41f85d..60d6ee9 100644
--- a/turbojpeg.c
+++ b/turbojpeg.c
@@ -1038,15 +1038,45 @@
{
alloc=0; dstSizes[i]=tjBufSize(w, h, jpegSubsamp);
}
- jpeg_mem_dest_tj(cinfo, &dstBufs[i], &dstSizes[i], alloc);
+ if(!(t[i].options&TJXOPT_NOOUTPUT))
+ jpeg_mem_dest_tj(cinfo, &dstBufs[i], &dstSizes[i], alloc);
jpeg_copy_critical_parameters(dinfo, cinfo);
dstcoefs=jtransform_adjust_parameters(dinfo, cinfo, srccoefs,
&xinfo[i]);
- jpeg_write_coefficients(cinfo, dstcoefs);
- jcopy_markers_execute(dinfo, cinfo, JCOPYOPT_ALL);
+ if(!(t[i].options&TJXOPT_NOOUTPUT))
+ {
+ jpeg_write_coefficients(cinfo, dstcoefs);
+ jcopy_markers_execute(dinfo, cinfo, JCOPYOPT_ALL);
+ }
+ else jinit_c_master_control(cinfo, TRUE);
jtransform_execute_transformation(dinfo, cinfo, srccoefs,
&xinfo[i]);
- jpeg_finish_compress(cinfo);
+ if(t[i].customFilter)
+ {
+ int ci, by, y;
+ for(ci=0; ci<cinfo->num_components; ci++)
+ {
+ jpeg_component_info *compptr=&cinfo->comp_info[ci];
+ tjregion arrayRegion={0, 0, compptr->width_in_blocks*DCTSIZE,
+ DCTSIZE};
+ tjregion planeRegion={0, 0, compptr->width_in_blocks*DCTSIZE,
+ compptr->height_in_blocks*DCTSIZE};
+ for(by=0; by<compptr->height_in_blocks; by+=compptr->v_samp_factor)
+ {
+ JBLOCKARRAY barray=(dinfo->mem->access_virt_barray)
+ ((j_common_ptr)dinfo, dstcoefs[ci], by, compptr->v_samp_factor,
+ TRUE);
+ for(y=0; y<compptr->v_samp_factor; y++)
+ {
+ if(t[i].customFilter(barray[y][0], arrayRegion, planeRegion,
+ ci, i)==-1)
+ _throw("tjTransform(): Error in custom filter");
+ arrayRegion.y+=DCTSIZE;
+ }
+ }
+ }
+ }
+ if(!(t[i].options&TJXOPT_NOOUTPUT)) jpeg_finish_compress(cinfo);
}
jpeg_finish_decompress(dinfo);