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

Reply via email to