From: Udi F. <udi...@us...> - 2005-10-04 22:29:05
|
Update of /cvsroot/ufraw/ufraw In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16965 Modified Files: dcraw.c dcraw_api.c dcraw_api.h dcraw_indi.c ufraw-gimp.c ufraw.h ufraw_ufraw.c ufraw_writer.c Log Message: Updated to dcraw 7.74. This involved some API changes, mostly getting rid of 'trim', since there is a new border_interpolate(). Index: dcraw_api.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/dcraw_api.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** dcraw_api.c 29 Sep 2005 21:24:24 -0000 1.13 --- dcraw_api.c 4 Oct 2005 22:28:54 -0000 1.14 *************** *** 41,45 **** #define FC(filters,row,col) \ (filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) ! int identify(int will_decode); void bad_pixels(); void foveon_interpolate(); --- 41,45 ---- #define FC(filters,row,col) \ (filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) ! int identify(int no_decode); void bad_pixels(); void foveon_interpolate(); *************** *** 49,60 **** float pre_mul[4], const unsigned filters, /*const*/ gushort white[8][8], const char *ifname); void vng_interpolate_INDI(gushort (*image)[4], const unsigned filters, ! const int width, const int height, const int colors, ! const int quick_interpolate, const int rgb_max); void cam_to_cielab_INDI (gushort cam[4], float lab[3], ! const int colors, const int maximum, float rgb_cam[3][4]); ! void ahd_interpolate_INDI(const int height, const int width, ! const unsigned filters, gushort (*image)[4], int *trim_p, ! const int colors, const int maximum, float rgb_cam[3][4]); void flip_image_INDI(gushort (*image)[4], int *height_p, int *width_p, const int flip); --- 49,61 ---- float pre_mul[4], const unsigned filters, /*const*/ gushort white[8][8], const char *ifname); + void lin_interpolate_INDI(gushort (*image)[4], const unsigned filters, + const int width, const int height, const int colors); void vng_interpolate_INDI(gushort (*image)[4], const unsigned filters, ! const int width, const int height, const int colors, const int rgb_max); void cam_to_cielab_INDI (gushort cam[4], float lab[3], ! const int colors, const int maximum, float rgb_cam[3][4]); ! void ahd_interpolate_INDI(gushort (*image)[4], const unsigned filters, ! const int width, const int height, const int colors, ! const int maximum, float rgb_cam[3][4]); void flip_image_INDI(gushort (*image)[4], int *height_p, int *width_p, const int flip); *************** *** 85,89 **** return DCRAW_OPEN_ERROR; } ! if (identify(1)) { /* dcraw already sent a dcraw_message() */ fclose(ifp); g_free(ifname); --- 86,90 ---- return DCRAW_OPEN_ERROR; } ! if (identify(0)) { /* dcraw already sent a dcraw_message() */ fclose(ifp); g_free(ifname); *************** *** 102,106 **** h->filters = filters; h->raw_color = raw_color; - h->trim = (h->filters!=0); h->shrink = shrink = (h->filters!=0); h->ymag = ymag; --- 103,106 ---- *************** *** 140,144 **** } h->raw.colors = colors; - h->raw.trim = 0; h->fourColorFilters = filters; dcraw_message(DCRAW_VERBOSE, "Loading %s %s image from %s...\n", --- 140,143 ---- *************** *** 178,182 **** recombine = ( hh->colors==3 && hh->raw.colors==4 ); f->colors = hh->colors; - f->trim = 0; /* hh->raw.image is shrunk in half if there are filters. --- 177,180 ---- *************** *** 251,255 **** iBuf = (void*)g_new0(guint64, h * w * 4); norm = div * div; - /* BUG - handle image->trim */ for(r=0; r<image->height; r++) { --- 249,252 ---- *************** *** 310,319 **** messageBuffer = NULL; lastStatus = DCRAW_SUCCESS; ! if (flip) { ! // dcraw_message(DCRAW_VERBOSE, "Flipping image %c:%c:%c...\n", ! // flip & 1 ? 'H':'0', flip & 2 ? 'V':'0', ! // flip & 4 ? 'T':'0'); flip_image_INDI(image->image, &image->height, &image->width, flip); - } // h->message = messageBuffer; return lastStatus; --- 307,312 ---- messageBuffer = NULL; lastStatus = DCRAW_SUCCESS; ! if (flip) flip_image_INDI(image->image, &image->height, &image->width, flip); // h->message = messageBuffer; return lastStatus; *************** *** 349,353 **** fujiWidth = h->fuji_width; f->colors = h->colors; - f->trim = h->trim; f->image = g_new0(dcraw_image_type, f->height * f->width); --- 342,345 ---- *************** *** 370,373 **** --- 362,366 ---- } /* It might be better to report an error here: */ + /* (dcraw also forbids AHD for Fuji rotated images) */ if (interpolation==dcraw_ahd_interpolation && h->colors > 3) interpolation = dcraw_vng_interpolation; *************** *** 381,392 **** if (interpolation==dcraw_bilinear_interpolation) ! vng_interpolate_INDI(f->image, ff, f->width, f->height, ! cl, TRUE, 0xFFFF); else if (interpolation==dcraw_vng_interpolation) ! vng_interpolate_INDI(f->image, ff, f->width, f->height, ! cl, FALSE, 0xFFFF); else if (interpolation==dcraw_ahd_interpolation) ! ahd_interpolate_INDI(f->height, f->width, ! h->filters, f->image, &f->trim, f->colors, 0xFFFF, h->rgb_cam); if (cl==4 && h->colors == 3) { --- 374,383 ---- if (interpolation==dcraw_bilinear_interpolation) ! lin_interpolate_INDI(f->image, ff, f->width, f->height, cl); else if (interpolation==dcraw_vng_interpolation) ! vng_interpolate_INDI(f->image, ff, f->width, f->height, cl, 0xFFFF); else if (interpolation==dcraw_ahd_interpolation) ! ahd_interpolate_INDI(f->image, ff, f->width, f->height, cl, ! 0xFFFF, h->rgb_cam); if (cl==4 && h->colors == 3) { Index: ufraw_writer.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_writer.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ufraw_writer.c 15 Sep 2005 00:15:03 -0000 1.8 --- ufraw_writer.c 4 Oct 2005 22:28:54 -0000 1.9 *************** *** 114,119 **** width = uf->image.width; height = uf->image.height; ! rowStride = width + 2*uf->image.trim; ! rawImage = uf->image.image + uf->image.trim*rowStride + uf->image.trim; pixbuf16 = g_new(guint16, width*3); if (uf->conf->type==ppm8_type) { --- 114,119 ---- width = uf->image.width; height = uf->image.height; ! rowStride = width; ! rawImage = uf->image.image; pixbuf16 = g_new(guint16, width*3); if (uf->conf->type==ppm8_type) { Index: dcraw_indi.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/dcraw_indi.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dcraw_indi.c 29 Sep 2005 21:24:24 -0000 1.7 --- dcraw_indi.c 4 Oct 2005 22:28:54 -0000 1.8 *************** *** 33,40 **** --- 33,48 ---- #define camera_blue cam_mul[2] + #define CLASS + #define FORC3 for (c=0; c < 3; c++) #define FORC4 for (c=0; c < 4; c++) #define FORCC for (c=0; c < colors; c++) + #define SQR(x) ((x)*(x)) + /* dcraw.c defines: + * #define CLIP(x) (MAX(0,MIN((x),clip_max))) + * But in our case maximum should already be normalized to 0xFFFF */ + #define CLIP(x) (MAX(0,MIN((x),0xFFFF))) + /* In order to inline this calculation, I make the risky *************** *** 47,52 **** (int)(filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) - #define CLASS - void CLASS merror (void *ptr, char *where); --- 55,58 ---- *************** *** 64,69 **** maximum -= black; /* maximum is changed only locally */ if (use_auto_wb || (use_camera_wb && camera_red == -1)) { ! FORCC min[c] = INT_MAX; ! FORCC max[c] = count[c] = sum[c] = 0; for (row=0; row < height; row++) for (col=0; col < width; col++) --- 70,75 ---- maximum -= black; /* maximum is changed only locally */ if (use_auto_wb || (use_camera_wb && camera_red == -1)) { ! FORC4 min[c] = INT_MAX; ! FORC4 max[c] = count[c] = sum[c] = 0; for (row=0; row < height; row++) for (col=0; col < width; col++) *************** *** 79,86 **** count[c]++; } ! FORCC pre_mul[c] = count[c] / sum[c]; } if (use_camera_wb && camera_red != -1) { ! FORCC count[c] = sum[c] = 0; for (row=0; row < 8; row++) for (col=0; col < 8; col++) { --- 85,92 ---- count[c]++; } ! FORCC if (sum[c]) pre_mul[c] = count[c] / sum[c]; } if (use_camera_wb && camera_red != -1) { ! FORC4 count[c] = sum[c] = 0; for (row=0; row < 8; row++) for (col=0; col < 8; col++) { *************** *** 95,98 **** --- 101,105 ---- FORCC pre_mul[c] = count[c] / sum[c]; else if (camera_red && camera_blue) + /* 'sizoef pre_mul' does not work because pre_mul is an argument (UF)*/ memcpy (pre_mul, cam_mul, 4*sizeof(float)); else *************** *** 140,143 **** --- 147,215 ---- } + void CLASS border_interpolate_INDI (const int height, const int width, + ushort (*image)[4], const unsigned filters, int colors, + int border) + { + int row, col, y, x, c, sum[8]; /* changed from unsigned to int UF */ + + for (row=0; row < height; row++) + for (col=0; col < width; col++) { + if (col==border && row >= border && row < height-border) + col = width-border; + memset (sum, 0, sizeof sum); + for (y=row-1; y != row+2; y++) + for (x=col-1; x != col+2; x++) + if (y < height && x < width) { + /* Do not use BAYER macro since shrink is aways false here UF */ + sum[FC(y,x)] += image[row*width + col][FC(row,col)]; + sum[FC(y,x)+4]++; + } + FORCC if (c != FC(row,col)) + image[row*width+col][c] = sum[c] / sum[c+4]; + } + } + + void CLASS lin_interpolate_INDI(ushort (*image)[4], const unsigned filters, + const int width, const int height, const int colors) /*UF*/ + { + int code[8][2][32], *ip, sum[4]; + int c, i, x, y, row, col, shift, color; + ushort *pix; + + dcraw_message (DCRAW_VERBOSE, "Bilinear interpolation...\n"); /*UF*/ + + border_interpolate_INDI (height, width, image, filters, colors, 1); + for (row=0; row < 8; row++) + for (col=0; col < 2; col++) { + ip = code[row][col]; + memset (sum, 0, sizeof sum); + for (y=-1; y <= 1; y++) + for (x=-1; x <= 1; x++) { + shift = (y==0) + (x==0); + if (shift == 2) continue; + color = FC(row+y,col+x); + *ip++ = (width*y + x)*4 + color; + *ip++ = shift; + *ip++ = color; + sum[color] += 1 << shift; + } + FORCC + if (c != FC(row,col)) { + *ip++ = c; + *ip++ = sum[c]; + } + } + for (row=1; row < height-1; row++) + for (col=1; col < width-1; col++) { + pix = image[row*width+col]; + ip = code[row & 7][col & 1]; + memset (sum, 0, sizeof sum); + for (i=8; i--; ip+=3) + sum[ip[2]] += pix[ip[0]] << ip[1]; + for (i=colors; --i; ip+=2) + pix[ip[0]] = sum[ip[0]] / ip[1]; + } + } + /* This algorithm is officially called: *************** *** 151,156 **** */ void CLASS vng_interpolate_INDI(ushort (*image)[4], const unsigned filters, ! const int width, const int height, const int colors, ! const int quick_interpolate, const int clip_max) /*UF*/ { static const signed char *cp, terms[] = { --- 223,227 ---- */ void CLASS vng_interpolate_INDI(ushort (*image)[4], const unsigned filters, ! const int width, const int height, const int colors) /*UF*/ { static const signed char *cp, terms[] = { *************** *** 180,228 **** ushort (*brow[5])[4], *pix; int code[8][2][320], *ip, gval[8], gmin, gmax, sum[4]; ! int row, col, shift, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; int g, diff, thold, num, c; ! dcraw_message (DCRAW_VERBOSE, "%s interpolation...\n", ! quick_interpolate ? "Bilinear":"VNG"); /*UF*/ ! ! for (row=0; row < 8; row++) { /* Precalculate for bilinear */ ! for (col=1; col < 3; col++) { ! ip = code[row][col & 1]; ! memset (sum, 0, sizeof sum); ! for (y=-1; y <= 1; y++) ! for (x=-1; x <= 1; x++) { ! shift = (y==0) + (x==0); ! if (shift == 2) continue; ! color = FC(row+y,col+x); ! *ip++ = (width*y + x)*4 + color; ! *ip++ = shift; ! *ip++ = color; ! sum[color] += 1 << shift; ! } ! FORCC ! if (c != FC(row,col)) { ! *ip++ = c; ! *ip++ = sum[c]; ! } ! } ! } ! for (row=1; row < height-1; row++) { /* Do bilinear interpolation */ ! for (col=1; col < width-1; col++) { ! pix = image[row*width+col]; ! ip = code[row & 7][col & 1]; ! memset (sum, 0, sizeof sum); ! for (g=8; g--; ) { ! diff = pix[*ip++]; ! diff <<= *ip++; ! sum[*ip++] += diff; ! } ! for (g=colors; --g; ) { ! c = *ip++; ! pix[c] = sum[c] / *ip++; ! } ! } ! } ! if (quick_interpolate) ! return; for (row=0; row < 8; row++) { /* Precalculate for VNG */ --- 251,259 ---- ushort (*brow[5])[4], *pix; int code[8][2][320], *ip, gval[8], gmin, gmax, sum[4]; ! int row, col, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; int g, diff, thold, num, c; ! lin_interpolate_INDI(image, filters, width, height, colors); /*UF*/ ! dcraw_message (DCRAW_VERBOSE, "VNG interpolation...\n"); /*UF*/ for (row=0; row < 8; row++) { /* Precalculate for VNG */ *************** *** 267,272 **** memset (gval, 0, sizeof gval); while ((g = ip[0]) != INT_MAX) { /* Calculate gradients */ ! num = (diff = pix[g] - pix[ip[1]]) >> 31; ! gval[ip[3]] += (diff = ((diff ^ num) - num) << ip[2]); ip += 5; if ((g = ip[-1]) == -1) continue; --- 298,303 ---- memset (gval, 0, sizeof gval); while ((g = ip[0]) != INT_MAX) { /* Calculate gradients */ ! diff = ABS(pix[g] - pix[ip[1]]) << ip[2]; ! gval[ip[3]] += diff; ip += 5; if ((g = ip[-1]) == -1) continue; *************** *** 300,309 **** FORCC { /* Save to buffer */ t = pix[color]; ! if (c != color) { ! t += (sum[c] - sum[color])/num; ! if (t < 0) t = 0; ! if (t > clip_max) t = clip_max; ! } ! brow[2][col][c] = t; } } --- 331,337 ---- FORCC { /* Save to buffer */ t = pix[color]; ! if (c != color) ! t += (sum[c] - sum[color]) / num; ! brow[2][col][c] = CLIP(t); } } *************** *** 318,327 **** } - #define SQR(x) ((x)*(x)) - /* dcraw.c defines: - * #define CLIP(x) (MAX(0,MIN((x),clip_max))) - * But in our case maximum should already be normalized to 0xFFFF */ - #define CLIP(x) (MAX(0,MIN((x),0xFFFF))) - void CLASS cam_to_cielab_INDI (ushort cam[4], float lab[3], const int colors, const int maximum, const float rgb_cam[3][4]) --- 346,349 ---- *************** *** 359,367 **** #define TS 256 /* Tile Size */ ! void CLASS ahd_interpolate_INDI(const int height, const int width, ! const unsigned filters, ushort (*image)[4], int *trim_p, ! const int colors, const int maximum, const float rgb_cam[3][4]) { - int trim = *trim_p; int i, j, top, left, row, col, tr, tc, fc, c, d, val, hm[2]; ushort (*pix)[4], (*rix)[3]; --- 381,388 ---- #define TS 256 /* Tile Size */ ! void CLASS ahd_interpolate_INDI(ushort (*image)[4], const unsigned filters, ! const int width, const int height, const int colors, ! const int maximum, const float rgb_cam[3][4]) { int i, j, top, left, row, col, tr, tc, fc, c, d, val, hm[2]; ushort (*pix)[4], (*rix)[3]; *************** *** 374,377 **** --- 395,400 ---- dcraw_message (DCRAW_VERBOSE, "AHD interpolation...\n"); /*UF*/ + + border_interpolate_INDI (height, width, image, filters, colors, 3); buffer = malloc (26*TS*TS); /* 1664 kB */ merror (buffer, "ahd_interpolate()"); *************** *** 384,403 **** memset (rgb, 0, 12*TS*TS); ! /* Horizontally interpolate green into rgb[0]: */ ! for (row = top; row < top+TS && row < height; row++) { col = left + (FC(row,left) == 1); if (col < 2) col += 2; for (fc = FC(row,col); col < left+TS && col < width-2; col+=2) { ! pix = image + row*width + col; val = ((pix[-1][1] + pix[0][fc] + pix[1][1]) * 2 - pix[-2][fc] - pix[2][fc]) >> 2; rgb[0][row-top][col-left][1] = CLIP(val); - } - } - /* Vertically interpolate green into rgb[1]: */ - for (row = top < 2 ? 2:top; row < top+TS && row < height-2; row++) { - col = left + (FC(row,left) == 1); - for (fc = FC(row,col); col < left+TS && col < width; col+=2) { - pix = image + row*width + col; val = ((pix[-width][1] + pix[0][fc] + pix[width][1]) * 2 - pix[-2*width][fc] - pix[2*width][fc]) >> 2; --- 407,419 ---- memset (rgb, 0, 12*TS*TS); ! /* Interpolate green horizontally and vertically: */ ! for (row = top < 2 ? 2:top; row < top+TS && row < height-2; row++) { col = left + (FC(row,left) == 1); if (col < 2) col += 2; for (fc = FC(row,col); col < left+TS && col < width-2; col+=2) { ! pix = image + row*width+col; val = ((pix[-1][1] + pix[0][fc] + pix[1][1]) * 2 - pix[-2][fc] - pix[2][fc]) >> 2; rgb[0][row-top][col-left][1] = CLIP(val); val = ((pix[-width][1] + pix[0][fc] + pix[width][1]) * 2 - pix[-2*width][fc] - pix[2*width][fc]) >> 2; *************** *** 407,416 **** /* Interpolate red and blue, and convert to CIELab: */ for (d=0; d < 2; d++) ! for (row=top+1; row < top+TS-1 && row < height-1; row++) { ! tr = row-top; for (col=left+1; col < left+TS-1 && col < width-1; col++) { ! tc = col-left; ! pix = image + row*width + col; ! rix = &rgb[d][tr][tc]; if ((c = 2 - FC(row,col)) == 1) { c = FC(row+1,col); --- 423,430 ---- /* Interpolate red and blue, and convert to CIELab: */ for (d=0; d < 2; d++) ! for (row=top+1; row < top+TS-1 && row < height-1; row++) for (col=left+1; col < left+TS-1 && col < width-1; col++) { ! pix = image + row*width+col; ! rix = &rgb[d][row-top][col-left]; if ((c = 2 - FC(row,col)) == 1) { c = FC(row+1,col); *************** *** 429,435 **** rix[0][c] = pix[0][c]; cam_to_cielab_INDI (rix[0], flab, colors, maximum, rgb_cam); ! FORC3 lab[d][tr][tc][c] = 64*flab[c]; } - } /* Build homogeneity maps from the CIELab images: */ memset (homo, 0, 2*TS*TS); --- 443,448 ---- rix[0][c] = pix[0][c]; cam_to_cielab_INDI (rix[0], flab, colors, maximum, rgb_cam); ! FORC3 lab[d][row-top][col-left][c] = 64*flab[c]; } /* Build homogeneity maps from the CIELab images: */ memset (homo, 0, 2*TS*TS); *************** *** 474,479 **** } free (buffer); - trim = 3; - *trim_p = trim; } #undef TS --- 487,490 ---- *************** *** 512,516 **** (pix[width][i]*(1-fc) + pix[width+1][i]*fc) * fr; } ! free (image); width = wide; height = high; --- 523,527 ---- (pix[width][i]*(1-fc) + pix[width+1][i]*fc) * fr; } ! free (image); width = wide; height = high; *************** *** 531,534 **** --- 542,549 ---- int height = *height_p, width = *width_p;/* INDI - UF*/ + // Message is suppressed because error handling is not enabled here. + // dcraw_message (DCRAW_VERBOSE, "Flipping image %c:%c:%c...\n", + // flip & 1 ? 'H':'0', flip & 2 ? 'V':'0', flip & 4 ? 'T':'0'); /*UF*/ + img = (INT64 *) image; size = height * width; Index: ufraw.h =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** ufraw.h 28 Sep 2005 20:53:34 -0000 1.15 --- ufraw.h 4 Oct 2005 22:28:54 -0000 1.16 *************** *** 150,154 **** typedef struct { image_type *image; ! int height, width, trim; } image_data; --- 150,154 ---- typedef struct { image_type *image; ! int height, width; } image_data; Index: dcraw.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/dcraw.c,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** dcraw.c 4 Oct 2005 12:51:23 -0000 1.23 --- dcraw.c 4 Oct 2005 22:28:54 -0000 1.24 *************** *** 94,105 **** float flash_used, canon_5814; time_t timestamp; int data_offset, meta_offset, meta_length, nikon_curve_offset; ! int tiff_data_compression, kodak_data_compression; int raw_height, raw_width, top_margin, left_margin; int height, width, fuji_width, colors, tiff_samples; /*UF*/ int black, maximum, clip_max, clip_color=1; /*UF*/ int iheight, iwidth, shrink; /*UF*/ ! int dng_version, is_canon, is_foveon, raw_color, use_gamma; /*UF*/ ! int trim, flip, xmag, ymag; /*UF*/ int zero_after_ff; unsigned filters; /*UF*/ --- 94,106 ---- float flash_used, canon_5814; time_t timestamp; + unsigned shot_order; int data_offset, meta_offset, meta_length, nikon_curve_offset; ! int tiff_bps, tiff_data_compression, kodak_data_compression; int raw_height, raw_width, top_margin, left_margin; int height, width, fuji_width, colors, tiff_samples; /*UF*/ int black, maximum, clip_max, clip_color=1; /*UF*/ int iheight, iwidth, shrink; /*UF*/ ! int dng_version, is_foveon, raw_color, use_gamma; /*UF*/ ! int flip, xmag, ymag; /*UF*/ int zero_after_ff; unsigned filters; /*UF*/ *************** *** 107,111 **** void (*load_raw)(); /*UF*/ float bright=1, red_scale=1, blue_scale=1, sigma_d=0, sigma_r=0; /*UF*/ ! int four_color_rgb=0, document_mode=0, quick_interpolate=0; int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_rgb=0; /*UF*/ int fuji_secondary, use_secondary=0; /*UF*/ --- 108,112 ---- void (*load_raw)(); /*UF*/ float bright=1, red_scale=1, blue_scale=1, sigma_d=0, sigma_r=0; /*UF*/ ! int four_color_rgb=0, document_mode=0; int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_rgb=0; /*UF*/ int fuji_secondary, use_secondary=0; /*UF*/ *************** *** 818,827 **** col = jidx % 1748 + 2*1680; } ! } else if (raw_width == 3516) { ! row = jidx / 1758; ! col = jidx % 1758; if (row >= raw_height) { row -= raw_height; ! col += 1758; } } else { --- 819,828 ---- col = jidx % 1748 + 2*1680; } ! } else if (raw_width == 4476 || raw_width == 3516) { ! row = jidx / (raw_width/2); ! col = jidx % (raw_width/2); if (row >= raw_height) { row -= raw_height; ! col += raw_width/2; } } else { *************** *** 905,920 **** { ushort *pixel, *rp; ! int row, col, nbits; pixel = calloc (raw_width * tiff_samples, sizeof *pixel); merror (pixel, "adobe_dng_load_raw_nc()"); - for (nbits=0; 1 << nbits <= maximum; nbits++); for (row=0; row < raw_height; row++) { ! if (nbits == 16) read_shorts (pixel, raw_width * tiff_samples); else { getbits(-1); for (col=0; col < raw_width * tiff_samples; col++) ! pixel[col] = getbits(nbits); } for (rp=pixel, col=0; col < raw_width; col++) --- 906,920 ---- { ushort *pixel, *rp; ! int row, col; pixel = calloc (raw_width * tiff_samples, sizeof *pixel); merror (pixel, "adobe_dng_load_raw_nc()"); for (row=0; row < raw_height; row++) { ! if (tiff_bps == 16) read_shorts (pixel, raw_width * tiff_samples); else { getbits(-1); for (col=0; col < raw_width * tiff_samples; col++) ! pixel[col] = getbits(tiff_bps); } for (rp=pixel, col=0; col < raw_width; col++) *************** *** 1098,1103 **** void CLASS nikon_e2100_load_raw() { ! uchar data[3432], *dp; ! ushort pixel[2288], *pix; int row, col; --- 1098,1103 ---- void CLASS nikon_e2100_load_raw() { ! uchar data[3456], *dp; ! ushort pixel[2304], *pix; int row, col; *************** *** 1542,1547 **** buf[0][0][i] = 2048; for (row=0; row < height; row+=4) { ! for (i=0; i < 3; i++) ! mul[i] = getbits(6); FORC3 { val = ((0x1000000/last[c] + 0x7ff) >> 12) * mul[c]; --- 1542,1546 ---- buf[0][0][i] = 2048; for (row=0; row < height; row+=4) { ! FORC3 mul[c] = getbits(6); FORC3 { val = ((0x1000000/last[c] + 0x7ff) >> 12) * mul[c]; *************** *** 1816,1820 **** } } - maximum = 0xe74; } --- 1815,1818 ---- *************** *** 2909,2912 **** --- 2907,2971 ---- } + void CLASS border_interpolate (int border) + { + unsigned row, col, y, x, c, sum[8]; + + for (row=0; row < height; row++) + for (col=0; col < width; col++) { + if (col==border && row >= border && row < height-border) + col = width-border; + memset (sum, 0, sizeof sum); + for (y=row-1; y != row+2; y++) + for (x=col-1; x != col+2; x++) + if (y < height && x < width) { + sum[FC(y,x)] += BAYER(y,x); + sum[FC(y,x)+4]++; + } + FORCC if (c != FC(row,col)) + image[row*width+col][c] = sum[c] / sum[c+4]; + } + } + + void CLASS lin_interpolate() + { + int code[8][2][32], *ip, sum[4]; + int c, i, x, y, row, col, shift, color; + ushort *pix; + + dcraw_message (DCRAW_VERBOSE, "Bilinear interpolation...\n"); /*UF*/ + + border_interpolate(1); + for (row=0; row < 8; row++) + for (col=0; col < 2; col++) { + ip = code[row][col]; + memset (sum, 0, sizeof sum); + for (y=-1; y <= 1; y++) + for (x=-1; x <= 1; x++) { + shift = (y==0) + (x==0); + if (shift == 2) continue; + color = FC(row+y,col+x); + *ip++ = (width*y + x)*4 + color; + *ip++ = shift; + *ip++ = color; + sum[color] += 1 << shift; + } + FORCC + if (c != FC(row,col)) { + *ip++ = c; + *ip++ = sum[c]; + } + } + for (row=1; row < height-1; row++) + for (col=1; col < width-1; col++) { + pix = image[row*width+col]; + ip = code[row & 7][col & 1]; + memset (sum, 0, sizeof sum); + for (i=8; i--; ip+=3) + sum[ip[2]] += pix[ip[0]] << ip[1]; + for (i=colors; --i; ip+=2) + pix[ip[0]] = sum[ip[0]] / ip[1]; + } + } + /* This algorithm is officially called: *************** *** 2947,2989 **** ushort (*brow[5])[4], *pix; int code[8][2][320], *ip, gval[8], gmin, gmax, sum[4]; ! int row, col, shift, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; int g, diff, thold, num, c; ! dcraw_message (DCRAW_VERBOSE, "%s interpolation...\n", ! quick_interpolate ? "Bilinear":"VNG"); /*UF*/ ! ! for (row=0; row < 8; row++) { /* Precalculate for bilinear */ ! for (col=1; col < 3; col++) { ! ip = code[row][col & 1]; ! memset (sum, 0, sizeof sum); ! for (y=-1; y <= 1; y++) ! for (x=-1; x <= 1; x++) { ! shift = (y==0) + (x==0); ! if (shift == 2) continue; ! color = FC(row+y,col+x); ! *ip++ = (width*y + x)*4 + color; ! *ip++ = shift; ! *ip++ = color; ! sum[color] += 1 << shift; ! } ! FORCC ! if (c != FC(row,col)) { ! *ip++ = c; ! *ip++ = sum[c]; ! } ! } ! } ! for (row=1; row < height-1; row++) { /* Do bilinear interpolation */ ! for (col=1; col < width-1; col++) { ! pix = image[row*width+col]; ! ip = code[row & 7][col & 1]; ! memset (sum, 0, sizeof sum); ! for (g=8; g--; ip+=3) ! sum[ip[2]] += pix[ip[0]] << ip[1]; ! for (g=colors; --g; ip+=2) ! pix[ip[0]] = sum[ip[0]] / ip[1]; ! } ! } ! if (quick_interpolate) return; for (row=0; row < 8; row++) { /* Precalculate for VNG */ --- 3006,3014 ---- ushort (*brow[5])[4], *pix; int code[8][2][320], *ip, gval[8], gmin, gmax, sum[4]; ! int row, col, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; int g, diff, thold, num, c; ! lin_interpolate(); ! dcraw_message (DCRAW_VERBOSE, "VNG interpolation...\n"); /*UF*/ for (row=0; row < 8; row++) { /* Precalculate for VNG */ *************** *** 3122,3125 **** --- 3147,3152 ---- dcraw_message (DCRAW_VERBOSE, "AHD interpolation...\n"); /*UF*/ + + border_interpolate(3); buffer = malloc (26*TS*TS); /* 1664 kB */ merror (buffer, "ahd_interpolate()"); *************** *** 3132,3151 **** memset (rgb, 0, 12*TS*TS); ! /* Horizontally interpolate green into rgb[0]: */ ! for (row = top; row < top+TS && row < height; row++) { col = left + (FC(row,left) == 1); if (col < 2) col += 2; for (fc = FC(row,col); col < left+TS && col < width-2; col+=2) { ! pix = image + row*width + col; val = ((pix[-1][1] + pix[0][fc] + pix[1][1]) * 2 - pix[-2][fc] - pix[2][fc]) >> 2; rgb[0][row-top][col-left][1] = CLIP(val); - } - } - /* Vertically interpolate green into rgb[1]: */ - for (row = top < 2 ? 2:top; row < top+TS && row < height-2; row++) { - col = left + (FC(row,left) == 1); - for (fc = FC(row,col); col < left+TS && col < width; col+=2) { - pix = image + row*width + col; val = ((pix[-width][1] + pix[0][fc] + pix[width][1]) * 2 - pix[-2*width][fc] - pix[2*width][fc]) >> 2; --- 3159,3171 ---- memset (rgb, 0, 12*TS*TS); ! /* Interpolate green horizontally and vertically: */ ! for (row = top < 2 ? 2:top; row < top+TS && row < height-2; row++) { col = left + (FC(row,left) == 1); if (col < 2) col += 2; for (fc = FC(row,col); col < left+TS && col < width-2; col+=2) { ! pix = image + row*width+col; val = ((pix[-1][1] + pix[0][fc] + pix[1][1]) * 2 - pix[-2][fc] - pix[2][fc]) >> 2; rgb[0][row-top][col-left][1] = CLIP(val); val = ((pix[-width][1] + pix[0][fc] + pix[width][1]) * 2 - pix[-2*width][fc] - pix[2*width][fc]) >> 2; *************** *** 3155,3164 **** /* Interpolate red and blue, and convert to CIELab: */ for (d=0; d < 2; d++) ! for (row=top+1; row < top+TS-1 && row < height-1; row++) { ! tr = row-top; for (col=left+1; col < left+TS-1 && col < width-1; col++) { ! tc = col-left; ! pix = image + row*width + col; ! rix = &rgb[d][tr][tc]; if ((c = 2 - FC(row,col)) == 1) { c = FC(row+1,col); --- 3175,3182 ---- /* Interpolate red and blue, and convert to CIELab: */ for (d=0; d < 2; d++) ! for (row=top+1; row < top+TS-1 && row < height-1; row++) for (col=left+1; col < left+TS-1 && col < width-1; col++) { ! pix = image + row*width+col; ! rix = &rgb[d][row-top][col-left]; if ((c = 2 - FC(row,col)) == 1) { c = FC(row+1,col); *************** *** 3177,3183 **** rix[0][c] = pix[0][c]; cam_to_cielab (rix[0], flab); ! FORC3 lab[d][tr][tc][c] = 64*flab[c]; } - } /* Build homogeneity maps from the CIELab images: */ memset (homo, 0, 2*TS*TS); --- 3195,3200 ---- rix[0][c] = pix[0][c]; cam_to_cielab (rix[0], flab); ! FORC3 lab[d][row-top][col-left][c] = 64*flab[c]; } /* Build homogeneity maps from the CIELab images: */ memset (homo, 0, 2*TS*TS); *************** *** 3222,3226 **** } free (buffer); - trim = 3; } #undef TS --- 3239,3242 ---- *************** *** 3236,3240 **** unsigned sep; ! if (verbose) fprintf (stderr, "Bilateral filtering...\n"); wr = ceil(sigma_d*2); /* window radius */ --- 3252,3256 ---- unsigned sep; ! dcraw_message (DCRAW_VERBOSE, "Bilateral filtering...\n"); /*UF*/ wr = ceil(sigma_d*2); /* window radius */ *************** *** 3361,3364 **** --- 3377,3382 ---- fseek (ifp, get4()+base, SEEK_SET); + if (tag == 8 && type == 4) + shot_order = get4(); if (tag == 0xc && len == 4) { camera_red = getrat(); *************** *** 3457,3461 **** } if (tag == 0x4001) { ! fseek (ifp, strstr(model,"EOS-1D") ? 68:50, SEEK_CUR); get2_rggb: FORC4 cam_mul[c ^ (c >> 1)] = get2(); --- 3475,3480 ---- } if (tag == 0x4001) { ! fseek (ifp, strstr(model,"EOS-1D") ? 68 : ! strstr(model,"EOS 5D") ? 126 : 50, SEEK_CUR); get2_rggb: FORC4 cam_mul[c ^ (c >> 1)] = get2(); *************** *** 3474,3478 **** { struct tm t; - time_t ts; char str[20]; int i; --- 3493,3496 ---- *************** *** 3489,3495 **** t.tm_year -= 1900; t.tm_mon -= 1; ! putenv ("TZ=UTC"); /* Remove this to assume local time */ ! if ((ts = mktime(&t)) > 0) ! timestamp = ts; } --- 3507,3512 ---- t.tm_year -= 1900; t.tm_mon -= 1; ! if (mktime(&t) > 0) ! timestamp = mktime(&t); } *************** *** 3563,3567 **** case 0x102: /* Bits per sample */ fuji_secondary = len == 2; ! if (level) maximum = (1 << get2()) - 1; break; case 0x103: /* Compression */ --- 3580,3584 ---- case 0x102: /* Bits per sample */ fuji_secondary = len == 2; ! maximum = (1 << (tiff_bps = get2())) - 1; break; case 0x103: /* Compression */ *************** *** 3588,3592 **** case 0x131: /* Software tag */ fgets (software, 64, ifp); ! if (!strncmp(software,"Adobe",5)) make[0] = 0; break; --- 3605,3611 ---- case 0x131: /* Software tag */ fgets (software, 64, ifp); ! if (!strncmp(software,"Adobe",5) || ! !strncmp(software,"Bibble",6) || ! !strcmp (software,"Digital Photo Professional")) make[0] = 0; break; *************** *** 3943,3948 **** --- 3962,3973 ---- timestamp = get4(); } + if (type == 0x5817) + shot_order = len; if (type == 0x580e) timestamp = len; + #ifdef LOCALTIME + if ((type | 0x4000) == 0x580e) + timestamp = mktime (gmtime (×tamp)); + #endif if (type == 0x5813) flash_used = int_to_float(len); *************** *** 3968,3972 **** int tx=0, ty=0; struct tm t; - time_t ts; fseek (ifp, 0, SEEK_SET); --- 3993,3996 ---- *************** *** 3994,4000 **** t.tm_year -= 1900; t.tm_mon -= 1; ! putenv ("TZ="); ! if ((ts = mktime(&t)) > 0) ! timestamp = ts; data_offset += tx * ty * 2; strcpy (make, "Rollei"); --- 4018,4023 ---- t.tm_year -= 1900; t.tm_mon -= 1; ! if (mktime(&t) > 0) ! timestamp = mktime(&t); data_offset += tx * ty * 2; strcpy (make, "Rollei"); *************** *** 4134,4137 **** --- 4157,4191 ---- } + void CLASS parse_riff() + { + unsigned i, size, end; + char tag[4], date[64], month[64]; + static const char mon[12][4] = + { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; + struct tm t; + + order = 0x4949; + fread (tag, 4, 1, ifp); + size = get4(); + if (!memcmp(tag,"RIFF",4) || !memcmp(tag,"LIST",4)) { + end = ftell(ifp) + size; + get4(); + while (ftell(ifp) < end) + parse_riff(); + } else if (!memcmp(tag,"IDIT",4) && size < 64) { + fread (date, 64, 1, ifp); + date[size] = 0; + if (sscanf (date, "%*s %s %d %d:%d:%d %d", month, &t.tm_mday, + &t.tm_hour, &t.tm_min, &t.tm_sec, &t.tm_year) == 6) { + for (i=0; i < 12 && strcmp(mon[i],month); i++); + t.tm_mon = i; + t.tm_year -= 1900; + if (mktime(&t) > 0) + timestamp = mktime(&t); + } + } else + fseek (ifp, size, SEEK_CUR); + } + void CLASS parse_smal (int offset, int fsize) { *************** *** 4220,4223 **** --- 4274,4280 ---- timestamp = atoi (foveon_gets (poff[i][1], name, 64)); } + #ifdef LOCALTIME + timestamp = mktime (gmtime (×tamp)); + #endif } fseek (ifp, save, SEEK_SET); *************** *** 4243,4246 **** --- 4300,4305 ---- { "Canon EOS D60", { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, + { "Canon EOS 5D", + { 7082,-1419,-376,-6858,14220,2900,-969,1328,7630 } }, { "Canon EOS 10D", { 8197,-2000,-1118,-6714,14335,2592,-2536,3178,8266 } }, *************** *** 4489,4496 **** accordingly. Return nonzero if the file cannot be decoded. */ ! int CLASS identify (int will_decode) { char head[32], *cp; ! unsigned hlen, fsize, i, c, is_jpeg=0; static const struct { int fsize; --- 4548,4555 ---- accordingly. Return nonzero if the file cannot be decoded. */ ! int CLASS identify (int no_decode) { char head[32], *cp; ! unsigned hlen, fsize, i, c, is_jpeg=0, is_canon; static const struct { int fsize; *************** *** 4545,4551 **** make[0] = model[0] = model2[0] = 0; memset (white, 0, sizeof white); ! data_offset = meta_length = tiff_data_compression = 0; zero_after_ff = dng_version = fuji_secondary = 0; ! timestamp = tiff_samples = black = is_foveon = 0; raw_color = use_gamma = xmag = ymag = 1; filters = UINT_MAX; /* 0 = no filters, UINT_MAX = unknown */ --- 4604,4610 ---- make[0] = model[0] = model2[0] = 0; memset (white, 0, sizeof white); ! data_offset = meta_length = tiff_bps = tiff_data_compression = 0; zero_after_ff = dng_version = fuji_secondary = 0; ! timestamp = shot_order = tiff_samples = black = is_foveon = 0; raw_color = use_gamma = xmag = ymag = 1; filters = UINT_MAX; /* 0 = no filters, UINT_MAX = unknown */ *************** *** 4633,4636 **** --- 4692,4698 ---- fread (&data_offset, 4, 1, ifp); data_offset = ntohl(data_offset); + } else if (!memcmp (head, "RIFF", 4)) { + fseek (ifp, 0, SEEK_SET); + parse_riff(); } else if (!memcmp (head, "DSC-Image", 9)) parse_rollei(); *************** *** 4651,4654 **** --- 4713,4717 ---- if (make[0] == 0) parse_smal (0, fsize); if (make[0] == 0) is_jpeg = parse_jpeg(0); + if (no_decode) return !timestamp; for (i=0; i < sizeof corp / sizeof *corp; i++) *************** *** 4694,4700 **** if (filters == UINT_MAX) filters = 0x94949494; ! if ((is_canon = !strcmp(make,"Canon"))) load_raw = memcmp (head+6,"HEAPCCDR",8) ? lossless_jpeg_load_raw : canon_compressed_load_raw; if (!strcmp(make,"NIKON")) load_raw = nikon_is_compressed() ? --- 4757,4765 ---- if (filters == UINT_MAX) filters = 0x94949494; ! if ((is_canon = !strcmp(make,"Canon"))) { load_raw = memcmp (head+6,"HEAPCCDR",8) ? lossless_jpeg_load_raw : canon_compressed_load_raw; + maximum = 0xfff; + } if (!strcmp(make,"NIKON")) load_raw = nikon_is_compressed() ? *************** *** 4804,4807 **** --- 4869,4876 ---- left_margin = 74; goto canon_cr2; + } else if (is_canon && raw_width == 4476) { + top_margin = 34; + left_margin = 90; + goto canon_cr2; } else if (is_canon && raw_width == 5108) { top_margin = 13; *************** *** 5176,5179 **** --- 5245,5249 ---- width -= 21; load_raw = olympus_e300_load_raw; + maximum = 0xfff; if (fsize > 15728640) { load_raw = unpacked_load_raw; *************** *** 5442,5448 **** dng_skip: if (!load_raw || !height || is_jpeg) { ! if (will_decode) ! dcraw_message (DCRAW_UNSUPPORTED, "%s: Cannot decode %s %s%s images.\n", ! ifname, make, model, is_jpeg ? " JPEG":""); /*UF*/ return 1; } --- 5512,5517 ---- dng_skip: if (!load_raw || !height || is_jpeg) { ! dcraw_message (DCRAW_UNSUPPORTED, "%s: Cannot decode %s %s%s images.\n", ! ifname, make, model, is_jpeg ? " JPEG":""); /*UF*/ return 1; } *************** *** 5532,5537 **** colors = 1; memset (histogram, 0, sizeof histogram); ! for (row = trim; row < height-trim; row++) ! for (col = trim; col < width-trim; col++) { img = image[row*width+col]; if (document_mode) --- 5601,5606 ---- colors = 1; memset (histogram, 0, sizeof histogram); ! for (row = 0; row < height; row++) ! for (col = 0; col < width; col++) { img = image[row*width+col]; if (document_mode) *************** *** 5649,5655 **** float white=0, r; ! fprintf (ofp, "P6\n%d %d\n255\n", ! xmag*(width-trim*2), ymag*(height-trim*2)); ! ppm = calloc (width-trim*2, 3*xmag); merror (ppm, "write_ppm()"); --- 5718,5723 ---- float white=0, r; ! fprintf (ofp, "P6\n%d %d\n255\n", xmag*width, ymag*height); ! ppm = calloc (width, 3*xmag); merror (ppm, "write_ppm()"); *************** *** 5673,5682 **** lut[i] = val; } ! for (row=trim; row < height-trim; row++) { ! for (col=trim; col < width-trim; col++) FORC3 for (i=0; i < xmag; i++) ! ppm[xmag*(col-trim)+i][c] = lut[image[row*width+col][c]]; for (i=0; i < ymag; i++) ! fwrite (ppm, width-trim*2, 3*xmag, ofp); } free (ppm); --- 5741,5750 ---- lut[i] = val; } ! for (row=0; row < height; row++) { ! for (col=0; col < width; col++) FORC3 for (i=0; i < xmag; i++) ! ppm[xmag*col+i][c] = lut[image[row*width+col][c]]; for (i=0; i < ymag; i++) ! fwrite (ppm, width, 3*xmag, ofp); } free (ppm); *************** *** 5704,5719 **** ushort *buffer, *pred; ! hw[0] = htonl(height-trim*2); /* write the header */ ! hw[1] = htonl(width-trim*2); memcpy (head+14, hw, sizeof hw); fwrite (head, 40, 1, ofp); ! psize = (height-trim*2) * (width-trim*2); buffer = calloc (6, psize); merror (buffer, "write_psd()"); pred = buffer; ! for (row = trim; row < height-trim; row++) ! for (col = trim; col < width-trim; col++) { FORC3 pred[c*psize] = htons(image[row*width+col][c]); pred++; --- 5772,5787 ---- ushort *buffer, *pred; ! hw[0] = htonl(height); /* write the header */ ! hw[1] = htonl(width); memcpy (head+14, hw, sizeof hw); fwrite (head, 40, 1, ofp); ! psize = height*width; buffer = calloc (6, psize); merror (buffer, "write_psd()"); pred = buffer; ! for (row = 0; row < height; row++) ! for (col = 0; col < width; col++) { FORC3 pred[c*psize] = htons(image[row*width+col][c]); pred++; *************** *** 5732,5745 **** if (maximum < 256) maximum = 256; ! fprintf (ofp, "P6\n%d %d\n%d\n", ! width-trim*2, height-trim*2, maximum); ! ppm = calloc (width-trim*2, 6); merror (ppm, "write_ppm16()"); ! for (row = trim; row < height-trim; row++) { ! for (col = trim; col < width-trim; col++) ! FORC3 ppm[col-trim][c] = htons(image[row*width+col][c]); ! fwrite (ppm, width-trim*2, 6, ofp); } free (ppm); --- 5800,5812 ---- if (maximum < 256) maximum = 256; ! fprintf (ofp, "P6\n%d %d\n%d\n", width, height, maximum); ! ppm = calloc (width, 6); merror (ppm, "write_ppm16()"); ! for (row = 0; row < height; row++) { ! for (col = 0; col < width; col++) ! FORC3 ppm[col][c] = htons(image[row*width+col][c]); ! fwrite (ppm, width, 6, ofp); } free (ppm); *************** *** 5751,5755 **** static int arg, status=0, user_flip=-1, user_black=-1; static int timestamp_only=0, identify_only=0, write_to_stdout=0; ! static int half_size=0, use_fuji_rotate=1, use_vng=0; static char opt, *ofname, *cp; static struct utimbuf ut; --- 5818,5822 ---- static int arg, status=0, user_flip=-1, user_black=-1; static int timestamp_only=0, identify_only=0, write_to_stdout=0; ! static int half_size=0, use_fuji_rotate=1, quality=3; static char opt, *ofname, *cp; static struct utimbuf ut; *************** *** 5761,5768 **** ofp = stdout; if (argc == 1) { fprintf (stderr, ! "\nRaw Photo Decoder \"dcraw\" v7.70" "\nby Dave Coffin, dcoffin a cybercom o net" "\n\nUsage: %s [options] file1 file2 ...\n" --- 5828,5838 ---- ofp = stdout; + #ifndef LOCALTIME + putenv ("TZ=UTC"); + #endif if (argc == 1) { fprintf (stderr, ! "\nRaw Photo Decoder \"dcraw\" v7.74" "\nby Dave Coffin, dcoffin a cybercom o net" "\n\nUsage: %s [options] file1 file2 ...\n" *************** *** 5784,5790 **** #endif "\n-d Document Mode (no color, no interpolation)" ! "\n-V Use VNG interpolation" ! "\n-q Quick, low-quality bilinear interpolation" ! "\n-h Half-size color image (3x faster than -q)" "\n-f Interpolate RGGB as four colors" "\n-B <domain> <range> Apply bilateral filter to reduce noise" --- 5854,5859 ---- #endif "\n-d Document Mode (no color, no interpolation)" ! "\n-q [0-3] Set the interpolation quality (default = 3)" ! "\n-h Half-size color image (twice as fast as \"-q 0\")" "\n-f Interpolate RGGB as four colors" "\n-B <domain> <range> Apply bilateral filter to reduce noise" *************** *** 5802,5806 **** for (arg=1; argv[arg][0] == '-'; ) { opt = argv[arg++][1]; ! if ((strchr("Bbrlkt", opt) && !isdigit(argv[arg][0])) || (opt == 'B' && !isdigit(argv[arg+1][0]))) { fprintf (stderr, "Non-numeric argument to \"-%c\"\n", opt); --- 5871,5875 ---- for (arg=1; argv[arg][0] == '-'; ) { opt = argv[arg++][1]; ! if ((strchr("Bbrlktq", opt) && !isdigit(argv[arg][0])) || (opt == 'B' && !isdigit(argv[arg+1][0]))) { fprintf (stderr, "Non-numeric argument to \"-%c\"\n", opt); *************** *** 5816,5819 **** --- 5885,5889 ---- case 'k': user_black = atoi(argv[arg++]); break; case 't': user_flip = atoi(argv[arg++]); break; + case 'q': quality = atoi(argv[arg++]); break; #ifdef USE_LCMS case 'p': profile = argv[arg++] ; break; *************** *** 5826,5831 **** case 'f': four_color_rgb = 1; break; case 'd': document_mode = 1; break; - case 'V': use_vng = 1; break; - case 'q': quick_interpolate = 1; break; case 'a': use_auto_wb = 1; break; case 'w': use_camera_wb = 1; break; --- 5896,5899 ---- *************** *** 5876,5882 **** } if (timestamp_only) { ! identify(0); ! if ((status = !timestamp)) fprintf (stderr, "%s has no timestamp.\n", ifname); else { dcraw_message (DCRAW_VERBOSE, "%s time set to %d.\n", ifname, (int) timestamp); /*UF*/ --- 5944,5951 ---- } if (timestamp_only) { ! if ((status = identify(1))) fprintf (stderr, "%s has no timestamp.\n", ifname); + else if (identify_only) + printf ("%10ld%10d %s\n", timestamp, shot_order, ifname); else { dcraw_message (DCRAW_VERBOSE, "%s time set to %d.\n", ifname, (int) timestamp); /*UF*/ *************** *** 5886,5890 **** goto next; } ! if ((status = identify(1))) goto next; if (user_flip >= 0) flip = user_flip; --- 5955,5959 ---- goto next; } ! if ((status = identify(0))) goto next; if (user_flip >= 0) flip = user_flip; *************** *** 5920,5925 **** if (shrink) filters = 0; cam_to_cielab (NULL,NULL); ! if ((trim = filters && !document_mode)) { ! if (quick_interpolate || use_vng || colors > 3) vng_interpolate(); else ahd_interpolate(); --- 5989,5996 ---- if (shrink) filters = 0; cam_to_cielab (NULL,NULL); ! if (filters && !document_mode) { ! if (quality == 0) ! lin_interpolate(); ! else if (quality < 3 || colors > 3 || fuji_width) vng_interpolate(); else ahd_interpolate(); Index: ufraw-gimp.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw-gimp.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** ufraw-gimp.c 15 Sep 2005 00:15:03 -0000 1.11 --- ufraw-gimp.c 4 Oct 2005 22:28:54 -0000 1.12 *************** *** 279,284 **** pixtmp = g_new(guint16, tile_height * uf->image.width * 3); ! rowStride = uf->image.width + 2*uf->image.trim; ! rawImage = uf->image.image + uf->image.trim*rowStride + uf->image.trim; for (row = 0; row < uf->image.height; row += tile_height) { preview_progress(widget, "Loading image", --- 279,284 ---- pixtmp = g_new(guint16, tile_height * uf->image.width * 3); ! rowStride = uf->image.width; ! rawImage = uf->image.image; for (row = 0; row < uf->image.height; row += tile_height) { preview_progress(widget, "Loading image", Index: ufraw_ufraw.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ufraw_ufraw.c 29 Sep 2005 21:24:24 -0000 1.18 --- ufraw_ufraw.c 4 Oct 2005 22:28:54 -0000 1.19 *************** *** 342,348 **** uf->image.image = final.image; dcraw_flip_image(&final, raw->flip); ! uf->image.trim = final.trim; ! uf->image.height = final.height - 2 * final.trim; ! uf->image.width = final.width - 2 * final.trim; preview_progress(uf->widget, "Loading image", 0.5); return UFRAW_SUCCESS; --- 342,347 ---- uf->image.image = final.image; dcraw_flip_image(&final, raw->flip); ! uf->image.height = final.height; ! uf->image.width = final.width; preview_progress(uf->widget, "Loading image", 0.5); return UFRAW_SUCCESS; Index: dcraw_api.h =================================================================== RCS file: /cvsroot/ufraw/ufraw/dcraw_api.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dcraw_api.h 29 Sep 2005 21:24:24 -0000 1.7 --- dcraw_api.h 4 Oct 2005 22:28:54 -0000 1.8 *************** *** 17,26 **** typedef struct { dcraw_image_type *image; ! int width, height, colors, trim; } dcraw_image_data; typedef struct { FILE *ifp; ! int width, height, colors, fourColorFilters, filters, raw_color, trim; int flip, shrink, ymag; dcraw_image_data raw; --- 17,26 ---- typedef struct { dcraw_image_type *image; ! int width, height, colors; } dcraw_image_data; typedef struct { FILE *ifp; ! int width, height, colors, fourColorFilters, filters, raw_color; int flip, shrink, ymag; dcraw_image_data raw; |