Module example.
#include "oyranos_cmm.h"
#include "oyranos_helper.h"
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "jpegmarkers.h"
#define CMM_NICK "oJPG"
#define OY_oJPG_FILTER_REGISTRATION OY_TOP_INTERNAL OY_SLASH OY_DOMAIN_INTERNAL OY_SLASH OY_TYPE_STD OY_SLASH "file_loader"
oyMessage_f ojpg_msg = oyMessageFunc;
#if defined(__GNUC__)
# define OY_DBG_FORMAT_ "%s:%d %s() "
# define OY_DBG_ARGS_ strrchr(__FILE__,'/') ? strrchr(__FILE__,'/')+1 : __FILE__,__LINE__,__func__
#else
# define OY_DBG_FORMAT_ "%s:%d "
# define OY_DBG_ARGS_ strrchr(__FILE__,'/') ? strrchr(__FILE__,'/')+1 : __FILE__,__LINE__
#endif
#define _DBG_FORMAT_ OY_DBG_FORMAT_
#define _DBG_ARGS_ OY_DBG_ARGS_
#include "oyranos_i18n.h"
#define AD oyAllocateFunc_, oyDeAllocateFunc_
const char * ojpgApi4UiGetText2 ( const char * select,
const char * format );
char ** ui_text,
const char * ojpgApi4UiGetText ( const char * select,
extern const char * ojpg_api4_ui_texts[];
{
int error = 0;
return error;
}
int ojpgCMMMessageFuncSet ( oyMessage_f message_func )
{
ojpg_msg = message_func;
return 0;
}
const char * ojpgGetText ( const char * select,
{
if(strcmp(select, "name")==0)
return _(CMM_NICK);
return oyCMMgetText( select, type, context );
}
0,0,0,
CMM_NICK,
(char*)"0.9.6",
ojpgGetText,
(char**)oyCMM_texts,
NULL,
&ojpg_icon,
ojpgInit
};
#define OY_oJPG_FILTER_REGISTRATION_BASE OY_TOP_SHARED OY_SLASH OY_DOMAIN_INTERNAL OY_SLASH OY_TYPE_STD OY_SLASH
oyCMMapi_s * ojpgApi7CmmCreate (
const char * format,
const char * ext )
{
module_api[3] = {0,9,6};
* sockets[2] = {0,0};
const char * properties[] =
{
"file=read",
"image=pixel",
"layers=1",
"icc=1",
"ext=jpg,jpeg",
0
};
plugs[0] = plug;
sockets[0] = socket;
char * registration = NULL;
oyStringAddPrintf( ®istration, AD,
OY_oJPG_FILTER_REGISTRATION_BASE"file_read.input_%s._%s._CPU._ACCEL", format, CMM_NICK );
if(
oy_debug >= 2) ojpg_msg(oyMSG_DBG, NULL, _DBG_FORMAT_
"registration:%s ojpg %s", _DBG_ARGS_,
registration,
ext );
oy_image_connector_texts );
registration,
cmm_version, module_api,
NULL,
ojpgFilter_CmmRun,
properties, 0 );
}
int deAllocData ( void ** data ) { oyDeAllocateFunc_(*data); *data = NULL; return 0; }
const char ojpg_read_extra_options[] = {
"\n\
<" "file_read" ">\n\
<filename></filename>\n\
</" "file_read" ">\n\
};
oyCMMapi_s * ojpgApi4CmmCreate (
const char * format )
{
module_api[3] = {0,9,6};
char * registration = NULL;
const char * category = ojpgApi4UiGetText2(
"category",
oyNAME_NAME, format);
ojpg_api4_ui_texts, 0 );
const char * oforms_options = ojpg_read_extra_options;
oyPointer_Set( backend_context, NULL,
"ojpg_file_format", oyStringCopy(format, oyAllocateFunc_),
"char*", deAllocData );
oyStringAddPrintf( ®istration, AD,
OY_oJPG_FILTER_REGISTRATION_BASE"file_read.input_%s._" CMM_NICK "._CPU._ACCEL", format );
registration,
cmm_version, module_api,
"",
NULL,
ojpgFilterNode_GetText,
ui,
NULL );
}
{
char * t = NULL;
const char * tmp = NULL;
if(tmp)
t = oyStringCopy( tmp, allocateFunc );
return t;
}
#define A(long_text) oyStringAdd_( &tmp, long_text, AD )
char ** ui_text,
{
int error = 0;
char * tmp = NULL;
*ui_text = tmp;
return error;
}
int statical,
uint32_t * result )
{
uint32_t error = !filter;
#if 0
if(!error)
#endif
*result = error;
return 0;
}
oyProfile_s * profileFromMatrix(
double pandg[9],
const char * name, int32_t icc_profile_flags )
{
if(!p)
{
"/color_matrix."
"redx_redy_greenx_greeny_bluex_bluey_whitex_whitey_gamma",
0);
* result = 0;
int pos = 0;
opts,"create_profile.icc_profile.color_matrix",
&result );
}
return p;
}
int select_icc_profile(j_decompress_ptr cinfo,
const char * filename,
JOCTET **icc_data_ptr,
unsigned int *icc_data_len)
{
unsigned int len;
int lIsITUFax = jpeg_get_marker_size( cinfo, JPEG_APP0+1, (JOCTET*)"G3FAX", 5, &len ) == 0;
{
char * profile_name = 0;
char * prof_mem = 0;
size_t size = 0;
switch(cinfo->out_color_space)
{
case JCS_GRAYSCALE:
break;
case JCS_RGB:
if(lIsITUFax)
{
profile_name = strdup("ITULab.icc");
cinfo->out_color_space = JCS_YCbCr;
} else {
const char * fn = strrchr( filename,
OY_SLASH_C );
if(fn)
fn += 1;
else
fn = filename;
if(fn[0] == '_')
profile_name = strdup("compatibleWithAdobeRGB1998.icc");
else
{
profile_name = strdup("YCC profile - supports extended sRGB range PRELIMINARY 1-4-2002.icc");
{
cinfo->out_color_space = JCS_YCbCr;
} else
}
}
break;
case JCS_CMYK:
break;
case JCS_YCbCr:
if(lIsITUFax)
profile_name = strdup("ITULab.icc");
else
profile_name = strdup("YCC profile - supports extended sRGB range PRELIMINARY 1-4-2002.icc");
break;
case JCS_UNKNOWN:
case JCS_YCCK:
break;
}
*icc_data_ptr = (JOCTET*)prof_mem;
*icc_data_len = size;
if(profile_name) free( profile_name );
if(size && prof_mem)
return 1;
}
return 0;
}
{
int error = 0;
const char * filename = 0;
FILE * fp = 0;
* output_image = 0;
size_t fsize = 0;
uint8_t * buf = 0;
size_t mem_n = 0;
int width,height,nchannels;
int32_t icc_profile_flags = 0;
const char * format = "jpeg";
{
}
socket_data)
{
error = oyFilterPlug_ImageRootRun( requestor_plug, ticket );
return error;
{
requestor_plug = 0;
}
if(error <= 0)
{
}
if(filename)
fp = fopen( filename, "rm" );
if(!fp)
{
OY_DBG_FORMAT_ " could not open: %s",
OY_DBG_ARGS_, oyNoEmptyString_m( filename ) );
return 1;
}
fseek(fp,0L,SEEK_END);
fsize = ftell(fp);
rewind(fp);
if(oy_debug)
OY_DBG_FORMAT_ "file size %u",
OY_DBG_ARGS_, fsize );
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
unsigned int len = 0;
unsigned char * icc = NULL;
int m;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress (&cinfo);
jpeg_stdio_src (&cinfo, fp);
for (m = 0; m < 16; m++)
jpeg_save_markers(&cinfo, JPEG_APP0 + m, 0xFFFF);
(void) jpeg_read_header (&cinfo, TRUE);
if( jpeg_get_marker_size( &cinfo, JPEG_APP0+2, (JOCTET*)"ICC_PROFILE", 12, &len ) == 0 )
{
icc = (unsigned char*) malloc(len);
jpeg_get_marker_data( &cinfo, JPEG_APP0+2, (JOCTET*)"ICC_PROFILE", 12, len, (JOCTET*)icc );
}
if (icc && len)
{ if(oy_debug)
ojpg_msg( oyMSG_DBG, (
oyStruct_s*)node, OY_DBG_FORMAT_
"jpeg embedded profile found: %d", OY_DBG_ARGS_, len);
} else if (select_icc_profile(&cinfo, filename, &icc, &len))
{ if(oy_debug)
ojpg_msg( oyMSG_DBG, (
oyStruct_s*)node, OY_DBG_FORMAT_
"jpeg default profile selected: %d", OY_DBG_ARGS_, len);
} else
if(oy_debug)
ojpg_msg( oyMSG_DBG, (
oyStruct_s*)node, OY_DBG_FORMAT_
"jpeg no profile found", OY_DBG_ARGS_);
if(icc && len)
{
free(icc); icc = NULL;
len = 0;
}
jpeg_start_decompress (&cinfo);
nchannels = cinfo.out_color_components;
width = cinfo.output_width;
height = cinfo.output_height;
if(mem_n)
{
buf = (uint8_t*) oyAllocateFunc_(mem_n * sizeof(uint8_t));
if(!buf)
{
ojpg_msg(oyMSG_WARN, (
oyStruct_s *) node, _DBG_FORMAT_
"Could not allocate enough memory.", _DBG_ARGS_);
return 1;
}
}
if(oy_debug)
ojpg_msg( oyMSG_DBG, (
oyStruct_s *) node, _DBG_FORMAT_
"allocate image data: 0x%x size: %d ", _DBG_ARGS_, (
int)(intptr_t)
buf, mem_n );
while (cinfo.output_scanline < height) {
JSAMPROW b = &buf[(cinfo.output_width * nchannels)*cinfo.output_scanline];
jpeg_read_scanlines(&cinfo, &b, 1);
}
if(csp == icSigCmykData)
{
int n = width * height * 4;
{
uint8_t * d = (uint8_t*)buf;
int i;
#pragma omp parallel for private(i)
for(i = 0; i < n; ++i)
d[i] = 255 - d[i];
}
}
jpeg_finish_decompress (&cinfo);
jpeg_destroy_decompress (&cinfo);
}
if(!prof)
if(oy_debug)
OY_DBG_FORMAT_ "%dx%d %s|%s[%d]",
OY_DBG_ARGS_, width, height,
if (!image_in)
{
OY_DBG_FORMAT_ "can't create a new image\n%dx%d %s[%d]",
OY_DBG_ARGS_, width, height, format, nchannels );
return FALSE;
}
"/filename",
fclose(fp); fp = NULL;
if(error <= 0)
{
}
if(ticket)
if(ticket &&
output_image &&
{
0,0,
}
return 1;
}
const char * ojpgApi4UiGetText2 ( const char * select,
const char * format )
{
char * category = 0;
if(strcmp(select,"name") == 0)
{
return "read";
return _("read");
return _("Load Image File Object");
} else if(strcmp(select,"help") == 0)
{
return "help";
return _("Option \"filename\", a valid filename of a existing image");
return _("The Option \"filename\" should contain a valid filename to read the image data from. If the file does not exist, a error will occure.");
}
else if(strcmp(select,"category") == 0)
{
if(!category)
{
const char * i18n[] = {_("Files"),_("Read"),0};
int len = strlen(i18n[0]) + strlen(i18n[1]) + strlen(format);
category = (char*)malloc( len + 64 );
if(category)
{
char * t;
sprintf( category,"%s/%s %s", i18n[0], i18n[1], format );
t = strstr(category, format);
if(t) t[0] = toupper(t[0]);
} else
ojpg_msg(oyMSG_WARN, (
oyStruct_s *) 0, _DBG_FORMAT_
"\n " "Could not allocate enough memory.", _DBG_ARGS_);
}
return "category";
return category;
else
return category;
}
return 0;
}
const char * ojpgApi4UiGetText ( const char * select,
{
const char * format = (const char*) oyPointer_GetPointer( backend_context );
return ojpgApi4UiGetText2(select, type, format);
}
const char * ojpg_api4_ui_texts[] = {"name", "category", "help", NULL};
{
* a_tmp = 0,
* m = 0;
int i,n = 1;
ojpg_msg( oyMSG_WARN, module_info, _DBG_FORMAT_ "wrong module info passed in", _DBG_ARGS_ );
a = a_tmp;
{
const char * format = "jpeg";
m = ojpgApi4CmmCreate( format );
if(!a)
{
a = m;
}
else
if(a && m)
{
}
}
for( i = 0; i < n; ++i)
{
const char * format = "jpeg";
m = ojpgApi7CmmCreate( format, "jpeg,jpg" );
{
a = m;
}
else
if(a && m)
{
}
}
return 0;
}