EXTERN_C DLLEXPORT int read_raw_image(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument res) { int err; int check; MImage out; char * file; libraw_data_t *iprc = libraw_init(0); libraw_processed_image_t * img; WolframImageLibrary_Functions imgFuns = libData->imageLibraryFunctions; err = LIBRARY_FUNCTION_ERROR; file = MArgument_getUTF8String(Args[0]); libraw_open_file(iprc, file); libraw_unpack(iprc); iprc->params.output_bps = 8; check = libraw_dcraw_process(iprc); if (check != LIBRAW_SUCCESS) goto cleanup; img = libraw_dcraw_make_mem_image(iprc, &check); if (img == NULL) goto cleanup; if (img->type != LIBRAW_IMAGE_BITMAP || img->colors != 3) goto cleanup; if (img->bits == 16) { raw_t_ubit16 * raw_data = (raw_t_ubit16*)img->data; imgFuns->MImage_new2D(img->width, img->height, 3, MImage_Type_Bit16, MImage_CS_RGB, 1, &out); memcpy(imgFuns->MImage_getBit16Data(out), raw_data, img->width * img->height * 3 * sizeof(raw_t_ubit16)); } else if (img->bits == 8) { raw_t_ubit8 * raw_data = (raw_t_ubit8*)img->data; imgFuns->MImage_new2D(img->width, img->height, 3, MImage_Type_Bit8, MImage_CS_RGB, 1, &out); memcpy(imgFuns->MImage_getByteData(out), raw_data, img->width * img->height * 3 * sizeof(raw_t_ubit8)); } else { goto cleanup; } MArgument_setMImage(res, out); err = LIBRARY_NO_ERROR; cleanup: libData->UTF8String_disown(file); libraw_dcraw_clear_mem(img); return err; }
static GthImage * _cairo_image_surface_create_from_raw (GInputStream *istream, GthFileData *file_data, int requested_size, int *original_width, int *original_height, gpointer user_data, GCancellable *cancellable, GError **error) { libraw_data_t *raw_data; int result; void *buffer = NULL; size_t size; GthImage *image = NULL; raw_data = libraw_init (LIBRAW_OPIONS_NO_MEMERR_CALLBACK | LIBRAW_OPIONS_NO_DATAERR_CALLBACK); if (raw_data == NULL) { _libraw_set_gerror (error, errno); goto fatal_error; } libraw_set_progress_handler (raw_data, _libraw_progress_cb, cancellable); if (! _g_input_stream_read_all (istream, &buffer, &size, cancellable, error)) goto fatal_error; raw_data->params.output_tiff = FALSE; raw_data->params.use_camera_wb = TRUE; raw_data->params.use_rawspeed = TRUE; raw_data->params.highlight = FALSE; raw_data->params.use_camera_matrix = TRUE; raw_data->params.output_color = RAW_OUTPUT_COLOR_SRGB; raw_data->params.output_bps = 8; raw_data->params.half_size = (requested_size > 0); result = libraw_open_buffer (raw_data, buffer, size); if (LIBRAW_FATAL_ERROR (result)) { _libraw_set_gerror (error, result); goto fatal_error; } /* */ #if RAW_USE_EMBEDDED_THUMBNAIL if (requested_size > 0) { /* read the thumbnail */ result = libraw_unpack_thumb (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } switch (raw_data->thumbnail.tformat) { case LIBRAW_THUMBNAIL_JPEG: image = _libraw_read_jpeg_data (raw_data->thumbnail.thumb, raw_data->thumbnail.tlength, requested_size, cancellable, error); break; case LIBRAW_THUMBNAIL_BITMAP: image = _libraw_read_bitmap_data (raw_data->thumbnail.twidth, raw_data->thumbnail.theight, raw_data->thumbnail.tcolors, 8, (guchar *) raw_data->thumbnail.thumb, raw_data->thumbnail.tlength); break; default: g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Unsupported data format"); break; } if ((image != NULL) && (_libraw_get_tranform (raw_data) != GTH_TRANSFORM_NONE)) { cairo_surface_t *surface; cairo_surface_t *rotated; surface = gth_image_get_cairo_surface (image); rotated = _cairo_image_surface_transform (surface, _libraw_get_tranform (raw_data)); gth_image_set_cairo_surface (image, rotated); cairo_surface_destroy (rotated); cairo_surface_destroy (surface); } } else #endif { /* read the image */ libraw_processed_image_t *processed_image; result = libraw_unpack (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } result = libraw_dcraw_process (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } processed_image = libraw_dcraw_make_mem_image (raw_data, &result); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } switch (processed_image->type) { case LIBRAW_IMAGE_JPEG: image = _libraw_read_jpeg_data (processed_image->data, processed_image->data_size, -1, cancellable, error); break; case LIBRAW_IMAGE_BITMAP: image = _libraw_read_bitmap_data (processed_image->width, processed_image->height, processed_image->colors, processed_image->bits, processed_image->data, processed_image->data_size); break; default: g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Unsupported data format"); break; } libraw_dcraw_clear_mem (processed_image); } /* get the original size */ if ((original_width != NULL) && (original_height != NULL)) { result = libraw_adjust_sizes_info_only (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } *original_width = raw_data->sizes.iwidth; *original_height = raw_data->sizes.iheight; } fatal_error: if (raw_data != NULL) libraw_close (raw_data); g_free (buffer); return image; }