/* Method: Info#delay= Purpose: Set the delay attribute Notes: Convert from numeric value to string. */ VALUE Info_delay_eq(VALUE self, VALUE string) { Info *info; int delay; int not_num; char dstr[20]; Data_Get_Struct(self, Info, info); if (NIL_P(string)) { (void) RemoveImageOption(info, "delay"); } else { not_num = 0; (void) rb_protect(arg_is_integer, string, ¬_num); if (not_num) { rb_raise(rb_eTypeError, "failed to convert %s into Integer", rb_class2name(CLASS_OF(string))); } delay = NUM2INT(string); sprintf(dstr, "%d", delay); (void) RemoveImageOption(info, "delay"); (void) SetImageOption(info, "delay", dstr); } return self; }
/* Static: set_color_option Purpose: Set a color name as the value of the specified option Note: Call QueryColorDatabase to validate color name */ static VALUE set_color_option(VALUE self, const char *option, VALUE color) { Info *info; char *name; PixelPacket pp; ExceptionInfo exception; MagickBooleanType okay; Data_Get_Struct(self, Info, info); if (NIL_P(color)) { (void) RemoveImageOption(info, option); } else { GetExceptionInfo(&exception); name = StringValuePtr(color); okay = QueryColorDatabase(name, &pp, &exception); (void) DestroyExceptionInfo(&exception); if (!okay) { rb_raise(rb_eArgError, "invalid color name `%s'", name); } (void) RemoveImageOption(info, option); (void) SetImageOption(info, option, name); } return self; }
/* Static: set_dbl_option(obj, option, value) Purpose: Set an Image::Info option to a floating-point value Notes: SetImageOption expects the value to be a string. */ static VALUE set_dbl_option(VALUE self, const char *option, VALUE value) { Info *info; char buff[50]; double d; long n; int len; Data_Get_Struct(self, Info, info); if (NIL_P(value)) { (void) RemoveImageOption(info, option); } else { d = NUM2DBL(value); n = floor(d); if (d == n) { len = sprintf(buff, "%-10ld", n); } else { len = sprintf(buff, "%-10.2f", d); } memset(buff+len, '\0', sizeof(buff)-len); (void) RemoveImageOption(info, option); (void) SetImageOption(info, option, buff); } return self; }
/* Method: Info#dispose= Purpose: Convert a DisposeType enumerator into the equivalent dispose option string */ VALUE Info_dispose_eq(VALUE self, VALUE disp) { Info *info; DisposeType dispose; const char *option; int x; Data_Get_Struct(self, Info, info); if (NIL_P(disp)) { (void) RemoveImageOption(info, "dispose"); return self; } VALUE_TO_ENUM(disp, dispose, DisposeType); option = "Undefined"; for (x = 0; x < N_DISPOSE_OPTIONS; x++) { if (dispose == Dispose_Option[x].enumerator) { option = Dispose_Option[x].string; break; } } (void) SetImageOption(info, "dispose", option); return self; }
VALUE Info_undefine(VALUE self, VALUE format, VALUE key) { Info *info; char *format_p, *key_p; long format_l, key_l; char fkey[MaxTextExtent]; format_p = rm_str2cstr(format, &format_l); key_p = rm_str2cstr(key, &key_l); if (format_l > MAX_FORMAT_LEN || format_l + key_l > MaxTextExtent) { rb_raise(rb_eArgError, "can't undefine %.60s:%.1024s - too long", format_p, key_p); } sprintf(fkey, "%.60s:%.*s", format_p, (int)(MaxTextExtent-61), key_p); Data_Get_Struct(self, Info, info); /* Depending on the IM version, RemoveImageOption returns either */ /* char * or MagickBooleanType. Ignore the return value. */ (void) RemoveImageOption(info, fkey); return self; }
/* Method: Info#origin=+-x+-y Purpose: Set origin geometry. Argument may be a Geometry object as well as a geometry string. */ VALUE Info_origin_eq(VALUE self, VALUE origin_arg) { Info *info; volatile VALUE origin_str; char *origin; Data_Get_Struct(self, Info, info); if (NIL_P(origin_arg)) { (void) RemoveImageOption(info, "origin"); return self; } origin_str = rm_to_s(origin_arg); origin = GetPageGeometry(StringValuePtr(origin_str)); if (IsGeometry(origin) == MagickFalse) { rb_raise(rb_eArgError, "invalid origin geometry: %s", origin); } (void) SetImageOption(info, "origin", origin); return self; }
/* Method: Info#gravity= Purpose: Convert a GravityType enum to a gravity option name and store in the Info structure */ VALUE Info_gravity_eq(VALUE self, VALUE grav) { Info *info; GravityType gravity; const char *option; int x; Data_Get_Struct(self, Info, info); if (NIL_P(grav)) { (void) RemoveImageOption(info, "gravity"); return self; } VALUE_TO_ENUM(grav, gravity, GravityType); option = "Undefined"; for (x = 0; x < N_GRAVITY_OPTIONS; x++) { if (gravity == Gravity_Option[x].enumerator) { option = Gravity_Option[x].string; break; } } (void) SetImageOption(info, "gravity", option); return self; }
void Magick::Options::fontFamily(const std::string &family_) { if (family_.length() == 0) { _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font); (void) RemoveImageOption(imageInfo(),"family"); } else { Magick::CloneString(&_drawInfo->family,family_); (void) SetImageOption(imageInfo(),"family",family_.c_str()); } }
/* Method: Info#define(format, key[, value]) Purpose: Call SetImageOption Note: The only method in Info that is not an attribute accessor. */ VALUE Info_define(int argc, VALUE *argv, VALUE self) { Info *info; char *format, *key; const char *value = ""; long format_l, key_l; char ckey[100]; unsigned int okay; volatile VALUE fmt_arg; Data_Get_Struct(self, Info, info); switch (argc) { case 3: /* Allow any argument that supports to_s */ fmt_arg = rb_String(argv[2]); value = (const char *)StringValuePtr(fmt_arg); case 2: key = rm_str2cstr(argv[1], &key_l); format = rm_str2cstr(argv[0], &format_l); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); } if (2 + format_l + key_l > (long)sizeof(ckey)) { rb_raise(rb_eArgError, "%.20s:%.20s not defined - format or key too long", format, key); } (void) sprintf(ckey, "%s:%s", format, key); (void) RemoveImageOption(info, ckey); okay = SetImageOption(info, ckey, value); if (!okay) { rb_warn("%.20s=\"%.78s\" not defined - SetImageOption failed.", ckey, value); return Qnil; } return self; }
/* Method: Info#set_option Purpose: Set the specified option to this value. If the value is nil just unset any current value */ static VALUE set_option(VALUE self, const char *key, VALUE string) { Info *info; char *value; Data_Get_Struct(self, Info, info); if (NIL_P(string)) { (void) RemoveImageOption(info, key); } else { value = StringValuePtr(string); (void) SetImageOption(info, key, value); } return self; }
/* Method: Info[format, key] = value Purpose: Call SetImageOption Note: Essentially the same function as Info#define but paired with Info#[]= If the value is nil it is equivalent to #undefine. The 2 argument form is the original form. Added support for a single argument after ImageMagick started using Set/GetImageOption for options that aren't represented by fields in the ImageInfo structure. */ VALUE Info_aset(int argc, VALUE *argv, VALUE self) { Info *info; volatile VALUE value; char *format_p, *key_p, *value_p = NULL; long format_l, key_l; char ckey[MaxTextExtent]; unsigned int okay; Data_Get_Struct(self, Info, info); switch (argc) { case 3: format_p = rm_str2cstr(argv[0], &format_l); key_p = rm_str2cstr(argv[1], &key_l); if (format_l > MAX_FORMAT_LEN || format_l+key_l > MaxTextExtent-1) { rb_raise(rb_eArgError, "%.60s:%.1024s not defined - too long", format_p, key_p); } (void) sprintf(ckey, "%.60s:%.*s", format_p, (int)(sizeof(ckey)-MAX_FORMAT_LEN), key_p); value = argv[2]; break; case 2: strncpy(ckey, StringValuePtr(argv[0]), sizeof(ckey)-1); ckey[sizeof(ckey)-1] = '\0'; value = argv[1]; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); break; } if (NIL_P(value)) { (void) RemoveImageOption(info, ckey); } else { /* Allow any argument that supports to_s */ value = rm_to_s(value); value_p = StringValuePtr(value); (void) RemoveImageOption(info, ckey); okay = SetImageOption(info, ckey, value_p); if (!okay) { rb_warn("`%s' not defined - SetImageOption failed.", ckey); return Qnil; } } return self; }