Update of /cvsroot/ufraw/ufraw
In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv7878
Modified Files:
ufraw-gimp.c ufraw.h ufraw_developer.c ufraw_preview.c
ufraw_ufraw.c ufraw_writer.c
Log Message:
Fix slowdown when sending images to Gimp.
Index: ufraw_writer.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_writer.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -d -r1.59 -r1.60
--- ufraw_writer.c 28 Aug 2009 22:41:20 -0000 1.59
+++ ufraw_writer.c 1 Sep 2009 05:24:51 -0000 1.60
@@ -62,37 +62,20 @@
}
}
-static int ppm8_row_writer(
- ufraw_data *uf,
- void * volatile out,
- void * pixbuf,
- int row, int width, int grayscale)
+static int ppm_row_writer(ufraw_data *uf, void *volatile out, void *pixbuf,
+ int row, int width, int height, int grayscale, int bitDepth)
{
- row=row;
- if ((int)fwrite(pixbuf, grayscale ? 1 : 3, width, out)<width) {
- ufraw_set_error(uf, _("Error creating file '%s'."),
- uf->conf->outputFilename);
- ufraw_set_error(uf, g_strerror(errno));
- return UFRAW_ERROR;
- } else {
- return UFRAW_SUCCESS;
+ (void)row;
+ int rowStride = width * (grayscale ? 1 : 3) * (bitDepth>8 ? 2 : 1);
+ if ( bitDepth>8 ) {
+ guint16 *pixbuf16 = (guint16 *)pixbuf;
+ int i;
+ for (i=0; i<3*width*height; i++)
+ pixbuf16[i] = g_htons(pixbuf16[i]);
}
-}
-
-static int ppm16_row_writer(
- ufraw_data *uf,
- void * volatile out,
- void * pixbuf,
- int row, int width, int grayscale)
-{
- row=row;
- guint16 *pixbuf16 = (guint16 *) pixbuf;
- int i;
- for (i=0; i<3*width; i++)
- pixbuf16[i] = g_htons(pixbuf16[i]);
- if ((int)fwrite(pixbuf16, grayscale ? 2 : 6, width, out)<width) {
+ if ((int)fwrite(pixbuf, rowStride, height, out)<height) {
ufraw_set_error(uf, _("Error creating file '%s'."),
- uf->conf->outputFilename);
+ uf->conf->outputFilename);
ufraw_set_error(uf, g_strerror(errno));
return UFRAW_ERROR;
} else {
@@ -111,22 +94,22 @@
vsnprintf(ufraw_tiff_message, max_path, fmt, ap);
}
-int tiff_row_writer(
- ufraw_data *uf,
- void * volatile out,
- void * pixbuf,
- int row, int width, int grayscale)
+int tiff_row_writer(ufraw_data *uf, void *volatile out, void *pixbuf,
+ int row, int width, int height, int grayscale, int bitDepth)
{
- width=width; grayscale=grayscale;
- if (TIFFWriteScanline(out, pixbuf, row, 0)<0) {
- // 'errno' does seem to contain useful information
- ufraw_set_error(uf, _("Error creating file."));
- ufraw_set_error(uf, ufraw_tiff_message);
- ufraw_tiff_message[0] = '\0';
- return UFRAW_ERROR;
- } else {
- return UFRAW_SUCCESS;
+ (void)grayscale;
+ int rowStride = width*( bitDepth>8 ? 6 : 3);
+ int i;
+ for (i=0; i<height; i++) {
+ if (TIFFWriteScanline(out, pixbuf+i*rowStride, row+i, 0)<0) {
+ // 'errno' does seem to contain useful information
+ ufraw_set_error(uf, _("Error creating file."));
+ ufraw_set_error(uf, ufraw_tiff_message);
+ ufraw_tiff_message[0] = '\0';
+ return UFRAW_ERROR;
+ }
}
+ return UFRAW_SUCCESS;
}
#endif /*HAVE_LIBTIFF*/
@@ -165,19 +148,20 @@
cinfo->err->msg_parm.i[3]);
}
-static int jpeg_row_writer(
- ufraw_data *uf,
- void * volatile out,
- void * pixbuf,
- int row, int width, int grayscale)
+static int jpeg_row_writer(ufraw_data *uf, void *volatile out, void *pixbuf,
+ int row, int width, int height, int grayscale, int bitDepth)
{
- row=row; width=width; grayscale=grayscale;
- guint8 *pixbuf8 = pixbuf;
- jpeg_write_scanlines((struct jpeg_compress_struct *)out, &pixbuf8, 1);
- if ( ufraw_is_error(uf) )
- return UFRAW_ERROR;
- else
- return UFRAW_SUCCESS;
+ (void)row;
+ (void)grayscale;
+ (void)bitDepth;
+ int i;
+ for (i=0; i<height; i++) {
+ guint8 *pixbuf8 = pixbuf + 3*width*i;
+ jpeg_write_scanlines((struct jpeg_compress_struct *)out, &pixbuf8, 1);
+ if ( ufraw_is_error(uf) )
+ return UFRAW_ERROR;
+ }
+ return UFRAW_SUCCESS;
}
#endif /*HAVE_LIBJPEG*/
@@ -201,15 +185,17 @@
png_info *ping_info, char *profile_type, guint8 *profile_data,
png_uint_32 length);
-int png_row_writer(
- ufraw_data *uf,
- void * volatile out,
- void * pixbuf,
- int row, int width, int grayscale)
+int png_row_writer(ufraw_data *uf, void *volatile out, void *pixbuf,
+ int row, int width, int height, int grayscale, int bitDepth)
{
- uf=uf; row=row; width=width; grayscale=grayscale;
+ (void)uf;
+ (void)row;
+ (void)grayscale;
+ int rowStride = width * (bitDepth>8 ? 6 : 3);
- png_write_row(out, (guint8 *)pixbuf);
+ int i;
+ for (i=0; i<height; i++)
+ png_write_row(out, (guint8 *)pixbuf + rowStride*i);
return UFRAW_SUCCESS;
}
@@ -219,13 +205,14 @@
ufraw_data *uf,
void * volatile out,
int width, int height, int left, int top, int bitDepth, int grayscaleMode,
- int (*row_writer) (ufraw_data *, void * volatile, void *, int, int, int))
+ int (*row_writer) (ufraw_data *, void * volatile, void *, int, int, int,
int, int))
{
int row, row0, rowStride;
image_type *rawImage;
rowStride = uf->image.width;
rawImage = uf->image.image;
- guint16 pixbuf[rowStride * 3 * DEVELOP_BATCH];
+ int byteDepth = (bitDepth+7)/8;
+ guint8 pixbuf8[rowStride * 3 * byteDepth * DEVELOP_BATCH];
if (uf->conf->rotationAngle != 0) {
// Buffer for unrotated image.
@@ -244,8 +231,8 @@
preview_progress(uf->widget, _("Converting image"),
0.5 * row0/image.height);
guint8 *rowbuf = &image.buffer[row0*image.rowstride];
- develope(rowbuf, rawImage[row0*rowStride],
- uf->developer, 16, (guint16*)rowbuf,
+ develop(rowbuf, rawImage[row0*rowStride],
+ uf->developer, 16,
MIN(image.height - row0, DEVELOP_BATCH) * image.width);
}
// Write rotated image to output.
@@ -258,42 +245,39 @@
for (row = 0; row < DEVELOP_BATCH; row++) {
if (row + row0 >= height)
continue;
- guint16 *rowbuf = &pixbuf[row * rowStride * 3];
+ guint8 *rowbuf = &pixbuf8[row * rowStride * 3 * byteDepth];
ufraw_rotate_row(&image, rowbuf, uf->conf->rotationAngle,
bitDepth, top+row+row0, left, width);
if (grayscaleMode)
grayscale_buffer(rowbuf, width, bitDepth);
}
- for (row = row0; row < height && row < row0 + DEVELOP_BATCH; row++)
{
- guint16 *rowbuf = &pixbuf[(row-row0) * rowStride * 3];
- if (row_writer(uf, out, rowbuf, row, width, grayscaleMode) !=
UFRAW_SUCCESS)
- break;
- }
+ int batchHeight = MIN(height-row0, DEVELOP_BATCH);
+ if ( row_writer(uf, out, pixbuf8, row0, width, batchHeight,
+ grayscaleMode, bitDepth) != UFRAW_SUCCESS )
+ break;
}
g_free(image.buffer);
} else {
- guint16 *rowbuf;
// No rotation required. Develop straight to output.
for (row0 = 0; row0 < height; row0 += DEVELOP_BATCH) {
preview_progress(uf->widget, _("Saving image"),
0.5 + 0.5*row0/height);
#ifdef _OPENMP
-#pragma omp parallel for default(shared) private(row, rowbuf)
+#pragma omp parallel for default(shared) private(row)
#endif
for (row = 0; row < DEVELOP_BATCH; row++) {
if (row + row0 >= height)
continue;
- rowbuf = &pixbuf[row * rowStride * 3];
- develope(rowbuf, rawImage[(top+row+row0)*rowStride+left],
- uf->developer, bitDepth, rowbuf, width);
+ guint8 *rowbuf = &pixbuf8[row * rowStride * 3 * byteDepth];
+ develop(rowbuf, rawImage[(top+row+row0)*rowStride+left],
+ uf->developer, bitDepth, width);
if (grayscaleMode)
grayscale_buffer(rowbuf, width, bitDepth);
}
- for (row = row0; row < height && row < row0 + DEVELOP_BATCH; row++)
{
- rowbuf = &pixbuf[(row-row0) * rowStride * 3];
- if (row_writer(uf, out, rowbuf, row, width, grayscaleMode) !=
UFRAW_SUCCESS)
- break;
- }
+ int batchHeight = MIN(height-row0, DEVELOP_BATCH);
+ if ( row_writer(uf, out, pixbuf8, row0, width, batchHeight,
+ grayscaleMode, bitDepth) != UFRAW_SUCCESS )
+ break;
}
}
}
@@ -404,12 +388,12 @@
fprintf(out, "P%c\n%d %d\n%d\n",
grayscaleMode ? '5' : '6', width, height, 0xFF);
ufraw_write_image_data(uf, out, width, height, left, top,
- BitDepth, grayscaleMode, ppm8_row_writer);
+ BitDepth, grayscaleMode, ppm_row_writer);
} else if ( uf->conf->type==ppm_type && BitDepth==16 ) {
fprintf(out, "P%c\n%d %d\n%d\n",
grayscaleMode ? '5' : '6', width, height, 0xFFFF);
ufraw_write_image_data(uf, out, width, height, left, top,
- BitDepth, grayscaleMode, ppm16_row_writer);
+ BitDepth, grayscaleMode, ppm_row_writer);
#ifdef HAVE_LIBTIFF
} else if ( uf->conf->type==tiff_type ) {
TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
Index: ufraw_developer.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_developer.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -d -r1.70 -r1.71
--- ufraw_developer.c 6 Aug 2009 04:50:20 -0000 1.70
+++ ufraw_developer.c 1 Sep 2009 05:24:50 -0000 1.71
@@ -785,12 +785,12 @@
*minc = min;
}
-inline void develope(void *po, guint16 pix[4], developer_data *d, int mode,
- guint16 *buf, int count)
+void develop(void *po, guint16 pix[4], developer_data *d, int mode, int count)
{
- guint8 *p8 = po;
- guint16 *p16 = po, c, tmppix[3];
+ guint16 c, tmppix[3], *buf;
int i;
+ if (mode==16) buf = po;
+ else buf = g_alloca(count*6);
#ifdef _OPENMP
#pragma omp parallel \
@@ -821,8 +821,10 @@
cmsDoTransform(d->colorTransform, buf, buf, count);
#endif
- if (mode==16) for (i=0; i<3*count; i++) p16[i] = buf[i];
- else for (i=0; i<3*count; i++) p8[i] = buf[i] >> 8;
+ if (mode!=16) {
+ guint8 *p8 = po;
+ for (i=0; i<3*count; i++) p8[i] = buf[i] >> 8;
+ }
}
static void develop_grayscale(guint16 *pixel, const developer_data *d)
Index: ufraw_preview.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_preview.c,v
retrieving revision 1.262
retrieving revision 1.263
diff -u -d -r1.262 -r1.263
--- ufraw_preview.c 27 Aug 2009 23:45:23 -0000 1.262
+++ ufraw_preview.c 1 Sep 2009 05:24:51 -0000 1.263
@@ -909,7 +909,6 @@
{
if (data->FreezeDialog) return FALSE;
guint8 pix[99], *p8, pen[4][3];
- guint16 pixtmp[9999];
image_type p16;
int x, c, cl, y, y0, y1;
int raw_his[raw_his_size][4], raw_his_max;
@@ -946,7 +945,7 @@
for (cl=0; cl<colors; cl++) p16[cl] = 0;
p16[c] = Developer->max * 0x08000 / Developer->rgbWB[c] *
0x10000 / Developer->exposure;
- develope(pen[c], p16, Developer, 8, pixtmp, 1);
+ develop(pen[c], p16, Developer, 8, 1);
guint8 max=1;
for (cl=0; cl<3; cl++) max = MAX(pen[c][cl], max);
for (cl=0; cl<3; cl++) pen[c][cl] = pen[c][cl] * 0xff / max;
@@ -962,13 +961,13 @@
p16[cl] = MIN((guint64)x*Developer->rgbMax *
Developer->rgbWB[c] /
Developer->rgbWB[cl] / raw_his_size, 0xFFFF);
- develope(p8, p16, Developer, 8, pixtmp, 1);
+ develop(p8, p16, Developer, 8, 1);
grayCurve[x][c] = MAX(MAX(p8[0],p8[1]),p8[2]) *
(hisHeight-1) / MAXOUT;
/* Value for pixel x of pure color c */
p16[0] = p16[1] = p16[2] = p16[3] = 0;
p16[c] = MIN((guint64)x*Developer->rgbMax/raw_his_size, 0xFFFF);
- develope(p8, p16, Developer, 8, pixtmp, 1);
+ develop(p8, p16, Developer, 8, 1);
pureCurve[x][c] = MAX(MAX(p8[0],p8[1]),p8[2]) *
(hisHeight-1) / MAXOUT;
}
Index: ufraw.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw.h,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -d -r1.117 -r1.118
--- ufraw.h 28 Aug 2009 22:41:20 -0000 1.117
+++ ufraw.h 1 Sep 2009 05:24:50 -0000 1.118
@@ -401,8 +401,7 @@
void developer_prepare(developer_data *d, conf_data *conf,
int rgbMax, float rgb_cam[3][4], int colors, int useMatrix,
DeveloperMode mode);
-void develope(void *po, guint16 pix[4], developer_data *d, int mode,
- guint16 *buf, int count);
+void develop(void *po, guint16 pix[4], developer_data *d, int mode, int count);
void develop_linear(guint16 in[4], guint16 out[3], developer_data *d);
/* prototype for functions in ufraw_saver.c */
@@ -415,7 +414,7 @@
ufraw_data *uf,
void * volatile out,
int width, int height, int left, int top, int bitDepth, int grayscaleMode,
- int (*row_writer) (ufraw_data *, void * volatile, void *, int, int, int));
+ int (*row_writer) (ufraw_data *, void * volatile, void *, int, int, int,
int, int));
/* prototype for functions in ufraw_delete.c */
long ufraw_delete(void *widget, ufraw_data *uf);
Index: ufraw-gimp.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw-gimp.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- ufraw-gimp.c 31 Aug 2009 06:30:06 -0000 1.54
+++ ufraw-gimp.c 1 Sep 2009 05:24:50 -0000 1.55
@@ -297,16 +297,14 @@
}
}
-int gimp_row_writer(
- ufraw_data *uf,
- void * volatile out,
- void * pixbuf,
- int row, int width, int grayscale)
+int gimp_row_writer(ufraw_data *uf, void *volatile out, void *pixbuf,
+ int row, int width, int height, int grayscale, int bitDepth)
{
(void)uf;
(void)grayscale;
+ (void)bitDepth;
- gimp_pixel_rgn_set_rect(out, pixbuf, 0, row, width, 1);
+ gimp_pixel_rgn_set_rect(out, pixbuf, 0, row, width, height);
return UFRAW_SUCCESS;
}
Index: ufraw_ufraw.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v
retrieving revision 1.178
retrieving revision 1.179
diff -u -d -r1.178 -r1.179
--- ufraw_ufraw.c 10 Aug 2009 19:35:11 -0000 1.178
+++ ufraw_ufraw.c 1 Sep 2009 05:24:51 -0000 1.179
@@ -1174,14 +1174,13 @@
if (saidx < 0)
return out;
- guint16 *pixtmp = g_new (guint16, w * 3);
int yy;
for (yy = y; yy < y + h; yy++)
{
guint8 *dest = out->buffer + (yy * out->width + x) *
out->depth;
- develope (
+ develop(
dest, (void *)(in->buffer + (yy * in->width + x) *
in->depth),
- uf->developer, 8, pixtmp, w);
+ uf->developer, 8, w);
#ifdef HAVE_LENSFUN
if (uf->modifier &&
@@ -1197,7 +1196,6 @@
}
#endif /* HAVE_LENSFUN */
}
- g_free (pixtmp);
}
break;
@@ -1611,7 +1609,7 @@
{
int sum, stop, wp, c, pMax, pMin, p;
image_type pix;
- guint16 p16[3], pixtmp[3];
+ guint16 p16[3];
if (uf->conf->autoExposure!=apply_state) return;
@@ -1628,7 +1626,7 @@
{
for (c=0; c<uf->colors; c++)
pix[c] = MIN (p * maxChan/uf->conf->chanMul[c], uf->rgbMax);
- develope(p16, pix, uf->AutoDeveloper, 16, pixtmp, 1);
+ develop(p16, pix, uf->AutoDeveloper, 16, 1);
for (c=0, wp=0; c<3; c++) wp = MAX(wp, p16[c]);
if (wp < 0x10000 * 99/100) pMin = p;
else pMax = p;
@@ -1655,7 +1653,7 @@
{
int sum, stop, bp, c;
image_type pix;
- guint16 p16[3], pixtmp[3];
+ guint16 p16[3];
if (uf->conf->autoBlack==disabled_state) return;
@@ -1670,7 +1668,7 @@
for (c=0; c<uf->colors; c++) maxChan = MAX(uf->conf->chanMul[c], maxChan);
for (c=0; c<uf->colors; c++)
pix[c] = MIN (bp * maxChan/uf->conf->chanMul[c], uf->rgbMax);
- develope(p16, pix, uf->AutoDeveloper, 16, pixtmp, 1);
+ develop(p16, pix, uf->AutoDeveloper, 16, 1);
for (c=0, bp=0; c<3; c++) bp = MAX(bp, p16[c]);
CurveDataSetPoint(&uf->conf->curve[uf->conf->curveIndex],
@@ -1688,7 +1686,7 @@
{
int sum, stop, steps=8, bp, p, i, j, c;
image_type pix;
- guint16 p16[3], pixtmp[3];
+ guint16 p16[3];
CurveData *curve = &uf->conf->curve[uf->conf->curveIndex];
double decay = 0.90;
double norm = (1-pow(decay,steps))/(1-decay);
@@ -1705,7 +1703,7 @@
sum += uf->RawHistogram[bp];
for (c=0; c<uf->colors; c++)
pix[c] = MIN (bp * maxChan/uf->conf->chanMul[c], uf->rgbMax);
- develope(p16, pix, uf->AutoDeveloper, 16, pixtmp, 1);
+ develop(p16, pix, uf->AutoDeveloper, 16, 1);
for (c=0, p=0; c<3; c++) p = MAX(p, p16[c]);
stop += uf->RawCount * pow(decay,i) / norm;
/* Skip adding point if slope is too big (more than 4) */
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
ufraw-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ufraw-cvs