Update of /cvsroot/ufraw/ufraw
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv2030

Modified Files:
        ufraw.h ufraw_lens_ui.c ufraw_ufraw.c 
Log Message:
Apply TCA before Bayer interpolation.


Index: ufraw.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw.h,v
retrieving revision 1.140
retrieving revision 1.141
diff -u -d -r1.140 -r1.141
--- ufraw.h     1 Dec 2009 03:30:57 -0000       1.140
+++ ufraw.h     8 Dec 2009 06:17:26 -0000       1.141
@@ -291,6 +291,7 @@
     int RawCount;
 #ifdef HAVE_LENSFUN
     int modFlags; /* postprocessing operations (LF_MODIFY_XXX) */
+    lfModifier *TCAmodifier;
     lfModifier *modifier;
 #endif /* HAVE_LENSFUN */
     void *lanczos_func; /* the Lanczos kernel */
@@ -327,6 +328,7 @@
 void ufraw_flip_orientation(ufraw_data *uf, int flip);
 void ufraw_flip_image(ufraw_data *uf, int flip);
 void ufraw_invalidate_layer(ufraw_data *uf, UFRawPhase phase);
+void ufraw_invalidate_tca_layer(ufraw_data *uf);
 void ufraw_invalidate_hotpixel_layer(ufraw_data *uf);
 void ufraw_invalidate_denoise_layer(ufraw_data *uf);
 void ufraw_invalidate_darkframe_layer(ufraw_data *uf);

Index: ufraw_lens_ui.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_lens_ui.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- ufraw_lens_ui.c     21 Nov 2009 05:51:59 -0000      1.21
+++ ufraw_lens_ui.c     8 Dec 2009 06:17:26 -0000       1.22
@@ -670,7 +670,7 @@
     remove_tca_models (data, CFG->lens_tca.Model);
     lf_lens_add_calib_tca (CFG->lens, &CFG->lens_tca);
 
-    ufraw_invalidate_layer(data->UF, ufraw_transform_phase);
+    ufraw_invalidate_tca_layer(data->UF);
     render_preview (data);
 }
 
@@ -708,7 +708,7 @@
     gtk_label_set_text (GTK_LABEL (data->LensTCADesc), details);
     gtk_widget_show_all (data->LensTCATable);
 
-    ufraw_invalidate_layer(data->UF, ufraw_transform_phase);
+    ufraw_invalidate_tca_layer(data->UF);
     render_preview (data);
 }
 

Index: ufraw_ufraw.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v
retrieving revision 1.225
retrieving revision 1.226
diff -u -d -r1.225 -r1.226
--- ufraw_ufraw.c       5 Dec 2009 02:38:05 -0000       1.225
+++ ufraw_ufraw.c       8 Dec 2009 06:17:26 -0000       1.226
@@ -39,9 +39,11 @@
 /* What about LF_MODIFY_ALL? */
 #define UF_LF_ALL (LF_MODIFY_TCA | LF_MODIFY_VIGNETTING | \
        LF_MODIFY_DISTORTION | LF_MODIFY_GEOMETRY | LF_MODIFY_SCALE)
-
+#define UF_LF_TRANSFORM ( \
+       LF_MODIFY_DISTORTION | LF_MODIFY_GEOMETRY | LF_MODIFY_SCALE)
 static void ufraw_convert_image_vignetting(ufraw_data *uf,
        ufraw_image_data *img, UFRectangle *area);
+static void ufraw_prepare_tca(ufraw_data *uf);
 #endif
 static void ufraw_image_format(int *colors, int *bytes, ufraw_image_data *img,
        const char *formats, const char *caller);
@@ -263,6 +265,7 @@
     uf->HaveFilters = raw->filters!=0;
 #ifdef HAVE_LENSFUN
     uf->modFlags = 0;
+    uf->TCAmodifier = NULL;
     uf->modifier = NULL;
     uf->lanczos_func = NULL;
 #endif
@@ -688,6 +691,7 @@
     g_free(uf->RawHistogram);
 #ifdef HAVE_LENSFUN
     lf_lens_destroy(uf->conf->lens);
+    lf_modifier_destroy(uf->TCAmodifier);
     lf_camera_destroy(uf->conf->camera);
     lf_modifier_destroy(uf->modifier);
     g_free(uf->lanczos_func);
@@ -778,7 +782,7 @@
     if (img2->buffer != NULL) {
        area.width = img2->width;
        area.height = img2->height;
-       /* Apply distortion, TCA, geometry and rotation */
+       /* Apply distortion, geometry and rotation */
        ufraw_convert_image_transform(uf, img, img2, &area);
        g_free(img->buffer);
        *img = *img2;
@@ -822,7 +826,7 @@
 }
 #endif
 
-/* Apply distortion, TCA, geometry and rotation in a single pass */
+/* Apply distortion, geometry and rotation in a single pass */
 static void ufraw_convert_image_transform(ufraw_data *uf, ufraw_image_data 
*img,
        ufraw_image_data *outimg, UFRectangle *area)
 {
@@ -834,10 +838,8 @@
     int x, y, c;
 
 #ifdef HAVE_LENSFUN
-    gboolean applyLF = uf->modifier != NULL &&
-           (uf->modFlags & (UF_LF_ALL & ~LF_MODIFY_VIGNETTING));
+    gboolean applyLF = uf->modifier != NULL && (uf->modFlags & 
UF_LF_TRANSFORM);
 #endif
-
     for (y = area->y; y < area->y + area->height; y++) {
        guint8 *cur0 = outimg->buffer + y * outimg->rowstride;
        float srcX0 = y*sine - img->height*sine*cosine;
@@ -847,43 +849,35 @@
            float srcX = srcX0 + x*cosine;
            float srcY = srcY0 - x*sine;
 #ifdef HAVE_LENSFUN
-           float buff[3 * 2];
-           float *modcoord = buff;
+           float buff[2];
            if (applyLF) {
-               lf_modifier_apply_subpixel_geometry_distortion(uf->modifier,
+               lf_modifier_apply_geometry_distortion(uf->modifier,
                        srcX, srcY, 1, 1, buff);
+               srcX = buff[0];
+               srcY = buff[1];
            }
 #endif
-           for (c = 0; c < 3; c++
-#ifdef HAVE_LENSFUN
-                   , modcoord += 2
-#endif
-               ) {
-#ifdef HAVE_LENSFUN
-               if (applyLF) {
-                   srcX = modcoord[0];
-                   srcY = modcoord[1];
-               }
-#endif
 #ifdef LANCZOS_DATA_FLOAT
-               float xs = ceilf(srcX) - LANCZOS_SUPPORT;
-               float xe = floorf(srcX) + LANCZOS_SUPPORT;
-               float ys = ceilf(srcY) - LANCZOS_SUPPORT;
-               float ye = floorf(srcY) + LANCZOS_SUPPORT;
-               if (xs < 0 || ys < 0 || xe >= img->width || ye >= img->height) {
+           float xs = ceilf(srcX) - LANCZOS_SUPPORT;
+           float xe = floorf(srcX) + LANCZOS_SUPPORT;
+           float ys = ceilf(srcY) - LANCZOS_SUPPORT;
+           float ye = floorf(srcY) + LANCZOS_SUPPORT;
+           if (xs < 0 || ys < 0 || xe >= img->width || ye >= img->height) {
+               for (c = 0; c < 3; c++)
                    cur[c] = 0;
-                   continue;
-               }
+               continue;
+           }
+           int dsrc = img->width - (xe - xs) - 1;
+
+           for (c = 0; c < 3; c++) {
                ufraw_image_type *src = (ufraw_image_type *)(img->buffer +
                        (long)ys * img->rowstride + (long)xs * img->depth);
-               int dsrc = img->width - (xe - xs) - 1;
-
                float norm = 0.0;
                float sum = 0.0;
 
                float _dx = srcX - xs;
-               float dy = srcY - ys;
-               for (; ys <= ye; ys += 1.0, dy -= 1.0) {
+               float yc, dy = srcY - ys;
+               for (yc = ys; yc <= ye; yc += 1.0, dy -= 1.0) {
                    float xc, dx = _dx;
                    for (xc = xs; xc <= xe; xc += 1.0, dx -= 1.0, src++) {
                        float d = dx * dx + dy * dy;
@@ -900,28 +894,31 @@
                    cur[c] = LIM((int)(sum / norm), 0, 0xffff);
                else
                    cur[c] = 0;
+           }
 #else
-               /* Do it in integer arithmetic, it's faster */
-               int xx = (int)srcX;
-               int yy = (int)srcY;
-               int xs = xx + 1 - LANCZOS_SUPPORT;
-               int xe = xx     + LANCZOS_SUPPORT;
-               int ys = yy + 1 - LANCZOS_SUPPORT;
-               int ye = yy     + LANCZOS_SUPPORT;
-               if (xs < 0 || ys < 0 || xe >= img->width || ye >= img->height) {
+           /* Do it in integer arithmetic, it's faster */
+           int xx = (int)srcX;
+           int yy = (int)srcY;
+           int xs = xx + 1 - LANCZOS_SUPPORT;
+           int xe = xx     + LANCZOS_SUPPORT;
+           int ys = yy + 1 - LANCZOS_SUPPORT;
+           int ye = yy     + LANCZOS_SUPPORT;
+           if (xs < 0 || ys < 0 || xe >= img->width || ye >= img->height) {
+               for (c = 0; c < 3; c++)
                    cur[c] = 0;
-                   continue;
-               }
+               continue;
+           }
+           int dsrc = img->width - (xe - xs) - 1;
+
+           for (c = 0; c < 3; c++) {
                ufraw_image_type *src = (ufraw_image_type *)(img->buffer +
                        ys * img->rowstride + xs * img->depth);
-               int dsrc = img->width - (xe - xs) - 1;
-
                int norm = 0;
                int sum = 0;
 
                int _dx = (int)(srcX * 4096.0) - (xs << 12);
-               int dy = (int)(srcY * 4096.0) - (ys << 12);
-               for (; ys <= ye; ys++, dy -= 4096) {
+               int yc, dy = (int)(srcY * 4096.0) - (ys << 12);
+               for (yc = ys; yc <= ye; yc++, dy -= 4096) {
                    int xc, dx = _dx;
                    for (xc = xs; xc <= xe; xc++, src++, dx -= 4096) {
                        int d = (dx * dx + dy * dy) >> 12;
@@ -938,8 +935,8 @@
                    cur[c] = LIM(sum / norm, 0, 0xffff);
                else
                    cur[c] = 0;
-#endif
            }
+#endif
        }
     }
 }
@@ -1319,7 +1316,60 @@
        }
     }
 }
-#endif /* HAVE_LENSFUN */
+
+/* Apply TCA */
+static void ufraw_convert_image_tca(ufraw_data *uf, ufraw_image_data *img,
+       ufraw_image_data *outimg, UFRectangle *area)
+{
+    if (uf->TCAmodifier == NULL)
+       return;
+    int y;
+#ifdef _OPENMP
+#pragma omp parallel for schedule(static) default(none) \
+  shared(uf,img,outimg,area)
+#endif
+    for (y = area->y; y < area->y + area->height; y++) {
+       guint16 *dst = (guint16*)(outimg->buffer + y * outimg->rowstride +
+               area->x * outimg->depth);
+       ufraw_image_type *src = (ufraw_image_type *)(img->buffer +
+               y * img->rowstride + area->x * img->depth);
+       ufraw_image_type *srcEnd = (ufraw_image_type *)(img->buffer +
+               y * img->rowstride + (area->x+area->width) * img->depth);
+       float buff[3 * 2 * area->width];
+       lf_modifier_apply_subpixel_distortion(uf->TCAmodifier,
+               area->x, y, area->width, 1, buff);
+       float *modcoord = buff;
+       for (; src < srcEnd; src++, dst += outimg->depth/2) {
+           int c;
+           // Only red and blue channels get corrected
+           for (c = 0; c <= 2; c+=2, modcoord += 4) {
+               float srcX = modcoord[0];
+               float srcY = modcoord[1];
+               /* Do it in integer arithmetic, it's faster */
+               int xx = (int)srcX;
+               int yy = (int)srcY;
+               // TODO: better handling of the borders.
+               if (xx < 0 || yy < 0 || xx+1 >= img->width || yy+1 >= 
img->height) {
+                   dst[c] = 0;
+                   continue;
+               }
+               ufraw_image_type *lf_src = (ufraw_image_type *)(img->buffer +
+                       yy * img->rowstride + xx * img->depth);
+               guint64 dx = (int)(srcX * 4096.0) - (xx << 12);
+               guint64 dy = (int)(srcY * 4096.0) - (yy << 12);
+               dst[c] = ( (4096-dy)*((4096-dx)*lf_src[0][c]
+                               + dx*lf_src[1][c])
+                       + dy*((4096-dx)*lf_src[img->width][c]
+                               + (dx)*lf_src[img->width+1][c]) ) >> 24;
+           }
+           modcoord -= 2;
+           // Green channels are intact
+           for (c = 1; c <= 3; c+=2)
+               dst[c] = src[0][c];
+       }
+    }
+}
+#endif // HAVE_LENSFUN
 
 static void ufraw_convert_import_buffer(ufraw_data *uf, UFRawPhase phase, 
dcraw_image_data *dcimg)
 {
@@ -1329,8 +1379,18 @@
     img->width = dcimg->width;
     img->depth = sizeof (dcraw_image_type);
     img->rowstride = img->width * img->depth;
-    if (img->buffer)
-       g_free(img->buffer);
+#ifdef HAVE_LENSFUN
+    ufraw_prepare_tca(uf);
+    if (uf->TCAmodifier != NULL) {
+       ufraw_image_data inImg = *img;
+       inImg.buffer = (guint8 *)dcimg->image;
+       img->buffer = g_realloc(img->buffer, img->height * img->rowstride);
+       UFRectangle area = {0, 0, img->width, img->height };
+       ufraw_convert_image_tca(uf, &inImg, img, &area);
+       return;
+    }
+#endif
+    g_free(img->buffer);
     img->buffer = g_memdup(dcimg->image, img->height * img->rowstride);
 }
 
@@ -1389,8 +1449,7 @@
     ufraw_prepare_transform(uf);
 #ifdef HAVE_LENSFUN
     if (uf->conf->rotationAngle == 0 &&
-       (uf->modifier == NULL ||
-       !(uf->modFlags & (UF_LF_ALL & ~LF_MODIFY_VIGNETTING))))
+       (uf->modifier == NULL || !(uf->modFlags & UF_LF_TRANSFORM)))
 #else
     if (uf->conf->rotationAngle == 0)
 #endif /* HAVE_LENSFUN */
@@ -1454,6 +1513,34 @@
     }
 }
 
+#ifdef HAVE_LENSFUN
+static void ufraw_prepare_tca(ufraw_data *uf)
+{
+    ufraw_image_data *img = &uf->Images[ufraw_raw_phase];
+
+    if (uf->TCAmodifier != NULL)
+       lf_modifier_destroy(uf->TCAmodifier);
+    uf->TCAmodifier = NULL;
+
+    if (uf->conf->camera == NULL || uf->conf->lens == NULL)
+       return;
+
+    uf->TCAmodifier = lf_modifier_new(uf->conf->lens,
+           uf->conf->camera->CropFactor, img->width, img->height);
+    if (uf->TCAmodifier == NULL)
+       return;
+
+    uf->modFlags = lf_modifier_initialize(uf->TCAmodifier, uf->conf->lens,
+           LF_PF_U16, uf->conf->focal_len, uf->conf->aperture,
+           uf->conf->subject_distance, 1.0, uf->conf->cur_lens_type,
+           LF_MODIFY_TCA, FALSE);
+    if ((uf->modFlags & LF_MODIFY_TCA) == 0) {
+       lf_modifier_destroy(uf->TCAmodifier);
+       uf->TCAmodifier = NULL;
+    }
+}
+#endif
+
 static void ufraw_prepare_transform(ufraw_data *uf)
 {
     if (uf->lanczos_func == NULL) {
@@ -1494,7 +1581,8 @@
     float real_scale = pow(2.0, conf->lens_scale);
     uf->modFlags = lf_modifier_initialize(uf->modifier, conf->lens,
            LF_PF_U16, conf->focal_len, conf->aperture, conf->subject_distance,
-           real_scale, conf->cur_lens_type, UF_LF_ALL, FALSE);
+           real_scale, conf->cur_lens_type,
+           UF_LF_TRANSFORM | LF_MODIFY_VIGNETTING, FALSE);
     if ((uf->modFlags & UF_LF_ALL) == 0) {
        lf_modifier_destroy(uf->modifier);
        uf->modifier = NULL;
@@ -1819,6 +1907,11 @@
     }
 }
 
+void ufraw_invalidate_tca_layer(ufraw_data *uf)
+{
+    ufraw_invalidate_layer(uf, ufraw_raw_phase);
+}
+
 void ufraw_invalidate_hotpixel_layer(ufraw_data *uf)
 {
     ufraw_invalidate_layer(uf, ufraw_raw_phase);


------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
ufraw-cvs mailing list
ufraw-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ufraw-cvs

Reply via email to