xres/yres become double
we had them as float before to make load/save easier, but that means we need lots of hacks to make properties work correctly instead, convert to/from float on read/write and have them as double internally
This commit is contained in:
parent
792ff7f03d
commit
5771be4186
@ -12,6 +12,7 @@
|
|||||||
- oop, histnorm was broken by the new vipsstats
|
- oop, histnorm was broken by the new vipsstats
|
||||||
- never use IM ping to get a header, fixes BMP load
|
- never use IM ping to get a header, fixes BMP load
|
||||||
- set @filename for non-vips formats in vips7 compat layer
|
- set @filename for non-vips formats in vips7 compat layer
|
||||||
|
- make Xres/Yres double
|
||||||
|
|
||||||
20/8/11 started 7.27.0
|
20/8/11 started 7.27.0
|
||||||
- version bump for new dev cycle
|
- version bump for new dev cycle
|
||||||
|
17
TODO
17
TODO
@ -1,24 +1,9 @@
|
|||||||
blocking bugs
|
blocking bugs
|
||||||
=============
|
=============
|
||||||
|
|
||||||
- im_copy_set is broken?
|
|
||||||
|
|
||||||
$ vips im_copy_set babe.jpg x.v 22 2.83 2.83 100 100
|
|
||||||
$ header -a x.v
|
|
||||||
x.v: 1024x768 uchar, 3 bands, srgb VipsImage (0x14e8000)
|
|
||||||
interpretation: 22 - srgb
|
|
||||||
xoffset: 0
|
|
||||||
yoffset: 0
|
|
||||||
xres: 0.000000
|
|
||||||
yres: 0.000000
|
|
||||||
|
|
||||||
xres/yres need to become double (they are float atm)
|
|
||||||
|
|
||||||
the compat stuff and the wrappers in header.c need revising
|
|
||||||
|
|
||||||
|
|
||||||
- turning on all debug in object.c causes huge mem use?
|
- turning on all debug in object.c causes huge mem use?
|
||||||
|
|
||||||
|
seems to be when making a string for a set of flags?
|
||||||
|
|
||||||
- none!
|
- none!
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ static const char *vips_copy_names[] = {
|
|||||||
"xres",
|
"xres",
|
||||||
"yres",
|
"yres",
|
||||||
"xoffset",
|
"xoffset",
|
||||||
"xoffset",
|
"yoffset",
|
||||||
"bands",
|
"bands",
|
||||||
"format",
|
"format",
|
||||||
"coding",
|
"coding",
|
||||||
|
@ -105,7 +105,7 @@ void vips_image_init_fields( VipsImage *image,
|
|||||||
int xsize, int ysize, int bands,
|
int xsize, int ysize, int bands,
|
||||||
VipsBandFormat format, VipsCoding coding,
|
VipsBandFormat format, VipsCoding coding,
|
||||||
VipsInterpretation interpretation,
|
VipsInterpretation interpretation,
|
||||||
float xres, float yres );
|
double xres, double yres );
|
||||||
|
|
||||||
int vips_image_copy_fields_array( VipsImage *out, VipsImage *in[] );
|
int vips_image_copy_fields_array( VipsImage *out, VipsImage *in[] );
|
||||||
int vips_image_copy_fieldsv( VipsImage *out, VipsImage *in1, ... )
|
int vips_image_copy_fieldsv( VipsImage *out, VipsImage *in1, ... )
|
||||||
|
@ -263,8 +263,8 @@ typedef struct _VipsImage {
|
|||||||
VipsBandFormat BandFmt; /* pixel format */
|
VipsBandFormat BandFmt; /* pixel format */
|
||||||
VipsCoding Coding; /* pixel coding */
|
VipsCoding Coding; /* pixel coding */
|
||||||
VipsInterpretation Type;/* pixel interpretation */
|
VipsInterpretation Type;/* pixel interpretation */
|
||||||
float Xres; /* horizontal pixels per millimetre */
|
double Xres; /* horizontal pixels per millimetre */
|
||||||
float Yres; /* vertical pixels per millimetre */
|
double Yres; /* vertical pixels per millimetre */
|
||||||
|
|
||||||
int Xoffset; /* image origin hint */
|
int Xoffset; /* image origin hint */
|
||||||
int Yoffset; /* image origin hint */
|
int Yoffset; /* image origin hint */
|
||||||
@ -294,6 +294,13 @@ typedef struct _VipsImage {
|
|||||||
* VipsImage.
|
* VipsImage.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* During vips image read and write we need temporary float-sized
|
||||||
|
* fields in the struct for staging xres/yres. Don't use these any
|
||||||
|
* other time.
|
||||||
|
*/
|
||||||
|
float Xres_float;
|
||||||
|
float Yres_float;
|
||||||
|
|
||||||
char *mode; /* mode string passed to _new() */
|
char *mode; /* mode string passed to _new() */
|
||||||
VipsImageType dtype; /* descriptor type */
|
VipsImageType dtype; /* descriptor type */
|
||||||
int fd; /* file descriptor */
|
int fd; /* file descriptor */
|
||||||
|
@ -153,9 +153,6 @@ static HeaderField int_field[] = {
|
|||||||
{ "yoffset", G_STRUCT_OFFSET( VipsImage, Yoffset ) }
|
{ "yoffset", G_STRUCT_OFFSET( VipsImage, Yoffset ) }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* These are actually floats :-( how annoying. We report them as doubles for
|
|
||||||
* consistency with the vips_image_*() functions.
|
|
||||||
*/
|
|
||||||
static HeaderField double_field[] = {
|
static HeaderField double_field[] = {
|
||||||
{ "xres", G_STRUCT_OFFSET( VipsImage, Xres ) },
|
{ "xres", G_STRUCT_OFFSET( VipsImage, Xres ) },
|
||||||
{ "yres", G_STRUCT_OFFSET( VipsImage, Yres ) }
|
{ "yres", G_STRUCT_OFFSET( VipsImage, Yres ) }
|
||||||
@ -456,7 +453,7 @@ vips_image_init_fields( VipsImage *image,
|
|||||||
int xsize, int ysize, int bands,
|
int xsize, int ysize, int bands,
|
||||||
VipsBandFormat format, VipsCoding coding,
|
VipsBandFormat format, VipsCoding coding,
|
||||||
VipsInterpretation interpretation,
|
VipsInterpretation interpretation,
|
||||||
float xres, float yres )
|
double xres, double yres )
|
||||||
{
|
{
|
||||||
g_object_set( image,
|
g_object_set( image,
|
||||||
"width", xsize,
|
"width", xsize,
|
||||||
@ -554,8 +551,8 @@ vips_image_copy_fields_array( VipsImage *out, VipsImage *in[] )
|
|||||||
out->Coding = in[0]->Coding;
|
out->Coding = in[0]->Coding;
|
||||||
out->Xres = in[0]->Xres;
|
out->Xres = in[0]->Xres;
|
||||||
out->Yres = in[0]->Yres;
|
out->Yres = in[0]->Yres;
|
||||||
out->Xoffset = 0;
|
out->Xoffset = in[0]->Xoffset;
|
||||||
out->Yoffset = 0;
|
out->Yoffset = in[0]->Yoffset;
|
||||||
|
|
||||||
/* Count number of images.
|
/* Count number of images.
|
||||||
*/
|
*/
|
||||||
@ -750,7 +747,7 @@ vips_image_get( VipsImage *image, const char *field, GValue *value_copy )
|
|||||||
if( strcmp( field, double_field[i].field ) == 0 ) {
|
if( strcmp( field, double_field[i].field ) == 0 ) {
|
||||||
g_value_init( value_copy, G_TYPE_DOUBLE );
|
g_value_init( value_copy, G_TYPE_DOUBLE );
|
||||||
g_value_set_double( value_copy,
|
g_value_set_double( value_copy,
|
||||||
G_STRUCT_MEMBER( float, image,
|
G_STRUCT_MEMBER( double, image,
|
||||||
double_field[i].offset ) );
|
double_field[i].offset ) );
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
@ -759,7 +756,7 @@ vips_image_get( VipsImage *image, const char *field, GValue *value_copy )
|
|||||||
if( strcmp( field, old_double_field[i].field ) == 0 ) {
|
if( strcmp( field, old_double_field[i].field ) == 0 ) {
|
||||||
g_value_init( value_copy, G_TYPE_DOUBLE );
|
g_value_init( value_copy, G_TYPE_DOUBLE );
|
||||||
g_value_set_double( value_copy,
|
g_value_set_double( value_copy,
|
||||||
G_STRUCT_MEMBER( float, image,
|
G_STRUCT_MEMBER( double, image,
|
||||||
old_double_field[i].offset ) );
|
old_double_field[i].offset ) );
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
@ -1135,13 +1132,13 @@ vips_image_get_double( VipsImage *image, const char *field, double *out )
|
|||||||
|
|
||||||
for( i = 0; i < VIPS_NUMBER( double_field ); i++ )
|
for( i = 0; i < VIPS_NUMBER( double_field ); i++ )
|
||||||
if( strcmp( field, double_field[i].field ) == 0 ) {
|
if( strcmp( field, double_field[i].field ) == 0 ) {
|
||||||
*out = G_STRUCT_MEMBER( float, image,
|
*out = G_STRUCT_MEMBER( double, image,
|
||||||
double_field[i].offset );
|
double_field[i].offset );
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
for( i = 0; i < VIPS_NUMBER( old_double_field ); i++ )
|
for( i = 0; i < VIPS_NUMBER( old_double_field ); i++ )
|
||||||
if( strcmp( field, old_double_field[i].field ) == 0 ) {
|
if( strcmp( field, old_double_field[i].field ) == 0 ) {
|
||||||
*out = G_STRUCT_MEMBER( float, image,
|
*out = G_STRUCT_MEMBER( double, image,
|
||||||
old_double_field[i].offset );
|
old_double_field[i].offset );
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
@ -925,6 +925,7 @@ vips_object_set_property( GObject *gobject,
|
|||||||
vips_object_print_name( object );
|
vips_object_print_name( object );
|
||||||
printf( ".%s = %s\n", g_param_spec_get_name( pspec ), str_value );
|
printf( ".%s = %s\n", g_param_spec_get_name( pspec ), str_value );
|
||||||
g_free( str_value );
|
g_free( str_value );
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
@ -1372,7 +1373,8 @@ vips_object_class_install_argument( VipsObjectClass *object_class,
|
|||||||
VipsArgumentClass *argument_class = g_new( VipsArgumentClass, 1 );
|
VipsArgumentClass *argument_class = g_new( VipsArgumentClass, 1 );
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "vips_object_class_install_argument: %s\n",
|
printf( "vips_object_class_install_argument: %s %s\n",
|
||||||
|
g_type_name( G_TYPE_FROM_CLASS( object_class ) ),
|
||||||
g_param_spec_get_name( pspec ) );
|
g_param_spec_get_name( pspec ) );
|
||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
|
@ -255,8 +255,8 @@ static FieldIO fields[] = {
|
|||||||
{ G_STRUCT_OFFSET( VipsImage, BandFmt ), 4, vips__copy_4byte },
|
{ G_STRUCT_OFFSET( VipsImage, BandFmt ), 4, vips__copy_4byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Coding ), 4, vips__copy_4byte },
|
{ G_STRUCT_OFFSET( VipsImage, Coding ), 4, vips__copy_4byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Type ), 4, vips__copy_4byte },
|
{ G_STRUCT_OFFSET( VipsImage, Type ), 4, vips__copy_4byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Xres ), 4, vips__copy_4byte },
|
{ G_STRUCT_OFFSET( VipsImage, Xres_float ), 4, vips__copy_4byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Yres ), 4, vips__copy_4byte },
|
{ G_STRUCT_OFFSET( VipsImage, Yres_float ), 4, vips__copy_4byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Length ), 4, vips__copy_4byte },
|
{ G_STRUCT_OFFSET( VipsImage, Length ), 4, vips__copy_4byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Compression ), 2, vips__copy_2byte },
|
{ G_STRUCT_OFFSET( VipsImage, Compression ), 2, vips__copy_2byte },
|
||||||
{ G_STRUCT_OFFSET( VipsImage, Level ), 2, vips__copy_2byte },
|
{ G_STRUCT_OFFSET( VipsImage, Level ), 2, vips__copy_2byte },
|
||||||
@ -304,6 +304,12 @@ vips__read_header_bytes( VipsImage *im, unsigned char *from )
|
|||||||
*/
|
*/
|
||||||
im->Bbits = vips_format_sizeof( im->BandFmt ) << 3;
|
im->Bbits = vips_format_sizeof( im->BandFmt ) << 3;
|
||||||
|
|
||||||
|
/* We read xres/yres as floats to a staging area, then copy to double
|
||||||
|
* in the main fields.
|
||||||
|
*/
|
||||||
|
im->Xres = im->Xres_float;
|
||||||
|
im->Yres = im->Yres_float;
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,6 +324,12 @@ vips__write_header_bytes( VipsImage *im, unsigned char *to )
|
|||||||
int i;
|
int i;
|
||||||
unsigned char *q;
|
unsigned char *q;
|
||||||
|
|
||||||
|
/* We set xres/yres as floats in a staging area, then copy those
|
||||||
|
* smaller values to the file.
|
||||||
|
*/
|
||||||
|
im->Xres_float = im->Xres;
|
||||||
|
im->Yres_float = im->Yres;
|
||||||
|
|
||||||
/* Always write the magic number MSB first.
|
/* Always write the magic number MSB first.
|
||||||
*/
|
*/
|
||||||
vips__copy_4byte( !vips_amiMSBfirst(),
|
vips__copy_4byte( !vips_amiMSBfirst(),
|
||||||
|
Loading…
Reference in New Issue
Block a user