Update of /cvsroot/ufraw/ufraw
In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv30815

Modified Files:
        dcraw_indi.c 
Log Message:
Fix bug #391: Enable OpenMP for xtrans_interpolate_INDI(). Patch by Frank 
Markesteijn.

Index: dcraw_indi.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/dcraw_indi.c,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -d -r1.118 -r1.119
--- dcraw_indi.c        25 Aug 2014 13:00:18 -0000      1.118
+++ dcraw_indi.c        29 Aug 2014 15:00:15 -0000      1.119
@@ -589,7 +589,6 @@
 }
 
 #define TS 512         /* Tile Size */
-
 /*
    Frank Markesteijn's algorithm for Fuji X-Trans sensors
  */
@@ -617,14 +616,6 @@
     cielab_INDI(0, 0, colors, rgb_cam);
     border_interpolate_INDI(height, width, image, filters, colors, 6, hh);
     ndir = 4 << (passes > 1);
-    buffer = (char *) malloc(TS * TS * (ndir * 11 + 6));
-    merror(buffer, "xtrans_interpolate()");
-    rgb  = (ushort(*)[TS][TS][3]) buffer;
-    lab  = (short(*)    [TS][3])(buffer + TS * TS * (ndir * 6));
-    drv  = (float(*)[TS][TS])(buffer + TS * TS * (ndir * 6 + 6));
-    homo = (char(*)[TS][TS])(buffer + TS * TS * (ndir * 10 + 6));
-
-    progress(PROGRESS_INTERPOLATE, -height);
 
     /* Map a green hexagon around each non-green pixel and vice versa:      */
     for (row = 0; row < 3; row++)
@@ -670,166 +661,186 @@
             }
         }
 
-    for (top = 3; top < height - 19; top += TS - 16) {
-        progress(PROGRESS_INTERPOLATE, TS - 16);
-        for (left = 3; left < width - 19; left += TS - 16) {
-            mrow = MIN(top + TS, height - 3);
-            mcol = MIN(left + TS, width - 3);
-            for (row = top; row < mrow; row++)
-                for (col = left; col < mcol; col++)
-                    memcpy(rgb[0][row - top][col - left], image[row * width + 
col], 6);
-            FORC3 memcpy(rgb[c + 1], rgb[0], sizeof * rgb);
 
-            /* Interpolate green horizontally, vertically, and along both 
diagonals: */
-            for (row = top; row < mrow; row++)
-                for (col = left; col < mcol; col++) {
-                    if ((f = fcol_INDI(filters, row, col, hh->top_margin, 
hh->left_margin, hh->xtrans)) == 1) continue;
-                    pix = image + row * width + col;
-                    hex = allhex[row % 3][col % 3][0];
-                    color[1][0] = 174 * (pix[  hex[1]][1] + pix[  hex[0]][1]) -
-                                  46 * (pix[2 * hex[1]][1] + pix[2 * 
hex[0]][1]);
-                    color[1][1] = 223 *  pix[  hex[3]][1] + pix[  hex[2]][1] * 
33 +
-                                  92 * (pix[      0 ][f] - pix[ -hex[2]][f]);
-                    FORC(2) color[1][2 + c] =
-                        164 * pix[hex[4 + c]][1] + 92 * pix[-2 * hex[4 + 
c]][1] + 33 *
-                        (2 * pix[0][f] - pix[3 * hex[4 + c]][f] - pix[-3 * 
hex[4 + c]][f]);
-                    FORC4 rgb[c ^ !((row - sgrow) % 3)][row - top][col - 
left][1] =
-                        LIM(color[1][c] >> 8, pix[0][1], pix[0][3]);
-                }
+#ifdef _OPENMP
+    #pragma omp parallel                               \
+    default(shared)                                    \
+    private(top, left, row, col, pix, mrow, mcol, hex, color, c, pass, rix, 
val, d, f, g, h, i, diff, lix, tr, avg, v, buffer, rgb, lab, drv, homo, hm, max)
+#endif
+    {
+        buffer = (char *) malloc(TS * TS * (ndir * 11 + 6));
+        merror(buffer, "xtrans_interpolate()");
+        rgb  = (ushort(*)[TS][TS][3]) buffer;
+        lab  = (short(*)    [TS][3])(buffer + TS * TS * (ndir * 6));
+        drv  = (float(*)[TS][TS])(buffer + TS * TS * (ndir * 6 + 6));
+        homo = (char(*)[TS][TS])(buffer + TS * TS * (ndir * 10 + 6));
 
-            for (pass = 0; pass < passes; pass++) {
-                if (pass == 1)
-                    memcpy(rgb += 4, buffer, 4 * sizeof * rgb);
+        progress(PROGRESS_INTERPOLATE, -height);
 
-                /* Recalculate green from interpolated values of closer 
pixels: */
-                if (pass) {
-                    for (row = top + 2; row < mrow - 2; row++)
-                        for (col = left + 2; col < mcol - 2; col++) {
-                            if ((f = fcol_INDI(filters, row, col, 
hh->top_margin, hh->left_margin, hh->xtrans)) == 1) continue;
-                            pix = image + row * width + col;
-                            hex = allhex[row % 3][col % 3][1];
-                            for (d = 3; d < 6; d++) {
-                                rix = &rgb[(d - 2) ^ !((row - sgrow) % 3)][row 
- top][col - left];
-                                val = rix[-2 * hex[d]][1] + 2 * rix[hex[d]][1]
-                                      - rix[-2 * hex[d]][f] - 2 * 
rix[hex[d]][f] + 3 * rix[0][f];
-                                rix[0][1] = LIM(val / 3, pix[0][1], pix[0][3]);
-                            }
-                        }
-                }
+#ifdef _OPENMP
+        #pragma omp for
+#endif
 
-                /* Interpolate red and blue values for solitary green pixels:  
 */
-                for (row = (top - sgrow + 4) / 3 * 3 + sgrow; row < mrow - 2; 
row += 3)
-                    for (col = (left - sgcol + 4) / 3 * 3 + sgcol; col < mcol 
- 2; col += 3) {
-                        rix = &rgb[0][row - top][col - left];
-                        h = fcol_INDI(filters, row, col + 1, hh->top_margin, 
hh->left_margin, hh->xtrans);
-                        memset(diff, 0, sizeof diff);
-                        for (i = 1, d = 0; d < 6; d++, i ^= TS ^ 1, h ^= 2) {
-                            for (c = 0; c < 2; c++, h ^= 2) {
-                                g = 2 * rix[0][1] - rix[i << c][1] - rix[-i << 
c][1];
-                                color[h][d] = g + rix[i << c][h] + rix[-i << 
c][h];
-                                if (d > 1)
-                                    diff[d] += SQR(rix[i << c][1] - rix[-i << 
c][1]
-                                                   - rix[i << c][h] + rix[-i 
<< c][h]) + SQR(g);
-                            }
-                            if (d > 1 && (d & 1))
-                                if (diff[d - 1] < diff[d])
-                                    FORC(2) color[c * 2][d] = color[c * 2][d - 
1];
-                            if (d < 2 || (d & 1)) {
-                                FORC(2) rix[0][c * 2] = CLIP(color[c * 2][d] / 
2);
-                                rix += TS * TS;
-                            }
-                        }
-                    }
+        for (top = 3; top < height - 19; top += TS - 16) {
+            progress(PROGRESS_INTERPOLATE, TS - 16);
+            for (left = 3; left < width - 19; left += TS - 16) {
+                mrow = MIN(top + TS, height - 3);
+                mcol = MIN(left + TS, width - 3);
+                for (row = top; row < mrow; row++)
+                    for (col = left; col < mcol; col++)
+                        memcpy(rgb[0][row - top][col - left], image[row * 
width + col], 6);
+                FORC3 memcpy(rgb[c + 1], rgb[0], sizeof * rgb);
 
-                /* Interpolate red for blue pixels and vice versa:             
 */
-                for (row = top + 1; row < mrow - 1; row++)
-                    for (col = left + 1; col < mcol - 1; col++) {
-                        if ((f = 2 - fcol_INDI(filters, row, col, 
hh->top_margin, hh->left_margin, hh->xtrans)) == 1) continue;
-                        rix = &rgb[0][row - top][col - left];
-                        i = (row - sgrow) % 3 ? TS : 1;
-                        for (d = 0; d < 4; d++, rix += TS * TS)
-                            rix[0][f] = CLIP((rix[i][f] + rix[-i][f] +
-                                              2 * rix[0][1] - rix[i][1] - 
rix[-i][1]) / 2);
+                /* Interpolate green horizontally, vertically, and along both 
diagonals: */
+                for (row = top; row < mrow; row++)
+                    for (col = left; col < mcol; col++) {
+                        if ((f = fcol_INDI(filters, row, col, hh->top_margin, 
hh->left_margin, hh->xtrans)) == 1) continue;
+                        pix = image + row * width + col;
+                        hex = allhex[row % 3][col % 3][0];
+                        color[1][0] = 174 * (pix[  hex[1]][1] + pix[  
hex[0]][1]) -
+                                      46 * (pix[2 * hex[1]][1] + pix[2 * 
hex[0]][1]);
+                        color[1][1] = 223 *  pix[  hex[3]][1] + pix[  
hex[2]][1] * 33 +
+                                      92 * (pix[      0 ][f] - pix[ 
-hex[2]][f]);
+                        FORC(2) color[1][2 + c] =
+                            164 * pix[hex[4 + c]][1] + 92 * pix[-2 * hex[4 + 
c]][1] + 33 *
+                            (2 * pix[0][f] - pix[3 * hex[4 + c]][f] - pix[-3 * 
hex[4 + c]][f]);
+                        FORC4 rgb[c ^ !((row - sgrow) % 3)][row - top][col - 
left][1] =
+                            LIM(color[1][c] >> 8, pix[0][1], pix[0][3]);
                     }
 
-                /* Fill in red and blue for 2x2 blocks of green:               
 */
-                for (row = top + 2; row < mrow - 2; row++) if ((row - sgrow) % 
3)
-                        for (col = left + 2; col < mcol - 2; col++) if ((col - 
sgcol) % 3) {
-                                rix = &rgb[0][row - top][col - left];
+                for (pass = 0; pass < passes; pass++) {
+                    if (pass == 1)
+                        memcpy(rgb += 4, buffer, 4 * sizeof * rgb);
+
+                    /* Recalculate green from interpolated values of closer 
pixels: */
+                    if (pass) {
+                        for (row = top + 2; row < mrow - 2; row++)
+                            for (col = left + 2; col < mcol - 2; col++) {
+                                if ((f = fcol_INDI(filters, row, col, 
hh->top_margin, hh->left_margin, hh->xtrans)) == 1) continue;
+                                pix = image + row * width + col;
                                 hex = allhex[row % 3][col % 3][1];
-                                for (d = 0; d < ndir; d += 2, rix += TS * TS)
-                                    if (hex[d] + hex[d + 1]) {
-                                        g = 3 * rix[0][1] - 2 * rix[hex[d]][1] 
- rix[hex[d + 1]][1];
-                                        for (c = 0; c < 4; c += 2) rix[0][c] =
-                                                CLIP((g + 2 * rix[hex[d]][c] + 
rix[hex[d + 1]][c]) / 3);
-                                    } else {
-                                        g = 2 * rix[0][1] - rix[hex[d]][1] - 
rix[hex[d + 1]][1];
-                                        for (c = 0; c < 4; c += 2) rix[0][c] =
-                                                CLIP((g + rix[hex[d]][c] + 
rix[hex[d + 1]][c]) / 2);
-                                    }
+                                for (d = 3; d < 6; d++) {
+                                    rix = &rgb[(d - 2) ^ !((row - sgrow) % 
3)][row - top][col - left];
+                                    val = rix[-2 * hex[d]][1] + 2 * 
rix[hex[d]][1]
+                                          - rix[-2 * hex[d]][f] - 2 * 
rix[hex[d]][f] + 3 * rix[0][f];
+                                    rix[0][1] = LIM(val / 3, pix[0][1], 
pix[0][3]);
+                                }
                             }
-            }
-            rgb = (ushort(*)[TS][TS][3]) buffer;
-            mrow -= top;
-            mcol -= left;
-
-            /* Convert to CIELab and differentiate in all directions:       */
-            for (d = 0; d < ndir; d++) {
-                for (row = 2; row < mrow - 2; row++)
-                    for (col = 2; col < mcol - 2; col++)
-                        cielab_INDI(rgb[d][row][col], lab[row][col], colors, 
rgb_cam);
-                for (f = dir[d & 3], row = 3; row < mrow - 3; row++)
-                    for (col = 3; col < mcol - 3; col++) {
-                        lix = &lab[row][col];
-                        g = 2 * lix[0][0] - lix[f][0] - lix[-f][0];
-                        drv[d][row][col] = SQR(g)
-                                           + SQR((2 * lix[0][1] - lix[f][1] - 
lix[-f][1] + g * 500 / 232))
-                                           + SQR((2 * lix[0][2] - lix[f][2] - 
lix[-f][2] - g * 500 / 580));
                     }
-            }
 
-            /* Build homogeneity maps from the derivatives:                 */
-            memset(homo, 0, ndir * TS * TS);
-            for (row = 4; row < mrow - 4; row++)
-                for (col = 4; col < mcol - 4; col++) {
-                    for (tr = FLT_MAX, d = 0; d < ndir; d++)
-                        if (tr > drv[d][row][col])
-                            tr = drv[d][row][col];
-                    tr *= 8;
-                    for (d = 0; d < ndir; d++)
-                        for (v = -1; v <= 1; v++)
-                            for (h = -1; h <= 1; h++)
-                                if (drv[d][row + v][col + h] <= tr)
-                                    homo[d][row][col]++;
+                    /* Interpolate red and blue values for solitary green 
pixels:   */
+                    for (row = (top - sgrow + 4) / 3 * 3 + sgrow; row < mrow - 
2; row += 3)
+                        for (col = (left - sgcol + 4) / 3 * 3 + sgcol; col < 
mcol - 2; col += 3) {
+                            rix = &rgb[0][row - top][col - left];
+                            h = fcol_INDI(filters, row, col + 1, 
hh->top_margin, hh->left_margin, hh->xtrans);
+                            memset(diff, 0, sizeof diff);
+                            for (i = 1, d = 0; d < 6; d++, i ^= TS ^ 1, h ^= 
2) {
+                                for (c = 0; c < 2; c++, h ^= 2) {
+                                    g = 2 * rix[0][1] - rix[i << c][1] - 
rix[-i << c][1];
+                                    color[h][d] = g + rix[i << c][h] + rix[-i 
<< c][h];
+                                    if (d > 1)
+                                        diff[d] += SQR(rix[i << c][1] - rix[-i 
<< c][1]
+                                                       - rix[i << c][h] + 
rix[-i << c][h]) + SQR(g);
+                                }
+                                if (d > 1 && (d & 1))
+                                    if (diff[d - 1] < diff[d])
+                                        FORC(2) color[c * 2][d] = color[c * 
2][d - 1];
+                                if (d < 2 || (d & 1)) {
+                                    FORC(2) rix[0][c * 2] = CLIP(color[c * 
2][d] / 2);
+                                    rix += TS * TS;
+                                }
+                            }
+                        }
+
+                    /* Interpolate red for blue pixels and vice versa:         
     */
+                    for (row = top + 1; row < mrow - 1; row++)
+                        for (col = left + 1; col < mcol - 1; col++) {
+                            if ((f = 2 - fcol_INDI(filters, row, col, 
hh->top_margin, hh->left_margin, hh->xtrans)) == 1) continue;
+                            rix = &rgb[0][row - top][col - left];
+                            i = (row - sgrow) % 3 ? TS : 1;
+                            for (d = 0; d < 4; d++, rix += TS * TS)
+                                rix[0][f] = CLIP((rix[i][f] + rix[-i][f] +
+                                                  2 * rix[0][1] - rix[i][1] - 
rix[-i][1]) / 2);
+                        }
+
+                    /* Fill in red and blue for 2x2 blocks of green:           
     */
+                    for (row = top + 2; row < mrow - 2; row++) if ((row - 
sgrow) % 3)
+                            for (col = left + 2; col < mcol - 2; col++) if 
((col - sgcol) % 3) {
+                                    rix = &rgb[0][row - top][col - left];
+                                    hex = allhex[row % 3][col % 3][1];
+                                    for (d = 0; d < ndir; d += 2, rix += TS * 
TS)
+                                        if (hex[d] + hex[d + 1]) {
+                                            g = 3 * rix[0][1] - 2 * 
rix[hex[d]][1] - rix[hex[d + 1]][1];
+                                            for (c = 0; c < 4; c += 2) 
rix[0][c] =
+                                                    CLIP((g + 2 * 
rix[hex[d]][c] + rix[hex[d + 1]][c]) / 3);
+                                        } else {
+                                            g = 2 * rix[0][1] - rix[hex[d]][1] 
- rix[hex[d + 1]][1];
+                                            for (c = 0; c < 4; c += 2) 
rix[0][c] =
+                                                    CLIP((g + rix[hex[d]][c] + 
rix[hex[d + 1]][c]) / 2);
+                                        }
+                                }
                 }
+                rgb = (ushort(*)[TS][TS][3]) buffer;
+                mrow -= top;
+                mcol -= left;
 
-            /* Average the most homogenous pixels for the final result:     */
-            if (height - top < TS + 4) mrow = height - top + 2;
-            if (width - left < TS + 4) mcol = width - left + 2;
-            for (row = MIN(top, 8); row < mrow - 8; row++)
-                for (col = MIN(left, 8); col < mcol - 8; col++) {
-                    for (d = 0; d < ndir; d++)
-                        for (hm[d] = 0, v = -2; v <= 2; v++)
-                            for (h = -2; h <= 2; h++)
-                                hm[d] += homo[d][row + v][col + h];
-                    for (d = 0; d < ndir - 4; d++)
-                        if (hm[d] < hm[d + 4]) hm[d  ] = 0;
-                        else if (hm[d] > hm[d + 4]) hm[d + 4] = 0;
-                    for (max = hm[0], d = 1; d < ndir; d++)
-                        if (max < hm[d]) max = hm[d];
-                    max -= max >> 3;
-                    memset(avg, 0, sizeof avg);
-                    for (d = 0; d < ndir; d++)
-                        if (hm[d] >= max) {
-                            FORC3 avg[c] += rgb[d][row][col][c];
-                            avg[3]++;
+                /* Convert to CIELab and differentiate in all directions:      
 */
+                for (d = 0; d < ndir; d++) {
+                    for (row = 2; row < mrow - 2; row++)
+                        for (col = 2; col < mcol - 2; col++)
+                            cielab_INDI(rgb[d][row][col], lab[row][col], 
colors, rgb_cam);
+                    for (f = dir[d & 3], row = 3; row < mrow - 3; row++)
+                        for (col = 3; col < mcol - 3; col++) {
+                            lix = &lab[row][col];
+                            g = 2 * lix[0][0] - lix[f][0] - lix[-f][0];
+                            drv[d][row][col] = SQR(g)
+                                               + SQR((2 * lix[0][1] - 
lix[f][1] - lix[-f][1] + g * 500 / 232))
+                                               + SQR((2 * lix[0][2] - 
lix[f][2] - lix[-f][2] - g * 500 / 580));
                         }
-                    FORC3 image[(row + top)*width + col + left][c] = avg[c] / 
avg[3];
                 }
-        }
-    }
 
-    free(buffer);
+                /* Build homogeneity maps from the derivatives:                
 */
+                memset(homo, 0, ndir * TS * TS);
+                for (row = 4; row < mrow - 4; row++)
+                    for (col = 4; col < mcol - 4; col++) {
+                        for (tr = FLT_MAX, d = 0; d < ndir; d++)
+                            if (tr > drv[d][row][col])
+                                tr = drv[d][row][col];
+                        tr *= 8;
+                        for (d = 0; d < ndir; d++)
+                            for (v = -1; v <= 1; v++)
+                                for (h = -1; h <= 1; h++)
+                                    if (drv[d][row + v][col + h] <= tr)
+                                        homo[d][row][col]++;
+                    }
+
+                /* Average the most homogenous pixels for the final result:    
 */
+                if (height - top < TS + 4) mrow = height - top + 2;
+                if (width - left < TS + 4) mcol = width - left + 2;
+                for (row = MIN(top, 8); row < mrow - 8; row++)
+                    for (col = MIN(left, 8); col < mcol - 8; col++) {
+                        for (d = 0; d < ndir; d++)
+                            for (hm[d] = 0, v = -2; v <= 2; v++)
+                                for (h = -2; h <= 2; h++)
+                                    hm[d] += homo[d][row + v][col + h];
+                        for (d = 0; d < ndir - 4; d++)
+                            if (hm[d] < hm[d + 4]) hm[d  ] = 0;
+                            else if (hm[d] > hm[d + 4]) hm[d + 4] = 0;
+                        for (max = hm[0], d = 1; d < ndir; d++)
+                            if (max < hm[d]) max = hm[d];
+                        max -= max >> 3;
+                        memset(avg, 0, sizeof avg);
+                        for (d = 0; d < ndir; d++)
+                            if (hm[d] >= max) {
+                                FORC3 avg[c] += rgb[d][row][col][c];
+                                avg[3]++;
+                            }
+                        FORC3 image[(row + top)*width + col + left][c] = 
avg[c] / avg[3];
+                    }
+            }
+        }
+        free(buffer);
+    } /* _OPENMP */
 }
 
 /*


------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
ufraw-cvs mailing list
ufraw-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ufraw-cvs

Reply via email to