--- parser3/src/classes/image.C 2003/03/25 10:21:07 1.90.2.15.2.18 +++ parser3/src/classes/image.C 2003/11/20 17:19:27 1.101 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_IMAGE_C="$Date: 2003/03/25 10:21:07 $"; +static const char * const IDENT_IMAGE_C="$Date: 2003/11/20 17:19:27 $"; /* jpegsize: gets the width and height (in pixels) of a jpeg file @@ -33,7 +33,7 @@ static const char* IDENT_IMAGE_C="$Date: class MImage: public Methoded { public: // VStateless_class - Value* create_new_value() { return new VImage(); } + Value* create_new_value(Pool&) { return new VImage(); } public: MImage(); @@ -331,8 +331,7 @@ static void measure_gif(const String& or Measure_reader& reader, ushort& width, ushort& height) { const char* buf; - const int head_size=sizeof(GIF_Header); - if(reader.read(buf, head_size)=0) return new VDate(t); } - if(const char* premature_zero_pos=(const char* )memchr(cstr, 0, size)) - size=premature_zero_pos-cstr; - return new VString(*new String(cstr, size, true/*tainted*/)); + if(const char* premature_zero_pos=(const char* )memchr(cstr, 0, length)) + length=premature_zero_pos-cstr; + return new VString(*new String(cstr, length, true/*tainted*/)); } if(components_count==1) @@ -428,7 +426,7 @@ static Value* parse_IFD_entry_formatted_ HashStringValue& hash=result->hash(); for(uint i=0; i(context); @@ -697,19 +694,19 @@ static void file_measure_action( measure(*info.file_name, reader, *info.width, *info.height, info.exif); } -static void _measure(Request& r, MethodParams* params) { - Value& data=params->as_no_junction(0, "data must not be code"); +static void _measure(Request& r, MethodParams& params) { + Value& data=params.as_no_junction(0, "data must not be code"); ushort width=0; ushort height=0; Value* exif=0; const String* file_name; - if(file_name=data.get_string()) { - File_measure_action_info info; - info.width=&width; - info.height=&height; - info.exif=&exif; - info.file_name=file_name; + if((file_name=data.get_string())) { + File_measure_action_info info={ + &width, &height, + &exif, + file_name + }; file_read_action_under_lock(r.absolute(*file_name), "measure", file_measure_action, &info); } else { @@ -745,7 +742,7 @@ static void append_attrib_pair( if(value->is_string() || value->as_int()>=0) *info->tag << "=\"" << value->as_string() << "\""; } -static void _html(Request& r, MethodParams* params) { +static void _html(Request& r, MethodParams& params) { String tag; tag << "count()) { + if(params.count()) { // for backward compatibility: someday was ^html{} - Value& vattribs=r.process_to_value(*(*params)[0], - /*0/*no name* /,*/ + Value& vattribs=r.process_to_value(params[0], false/*don't intercept string*/); if(!vattribs.is_string()) // allow empty - if(attribs=vattribs.get_hash()) { - Attrib_info info={&tag}; + if((attribs=vattribs.get_hash())) { + Attrib_info info={&tag, 0}; attribs->for_each(append_attrib_pair, &info); } else throw Exception("parser.runtime", @@ -793,53 +789,53 @@ static gdImage* load(Request& r, throw Exception("file.missing", 0, "can not open '%s'", file_name_cstr); - return 0; } } -static void _load(Request& r, MethodParams* params) { - const String& file_name=params->as_string(0, "file name must not be code"); +static void _load(Request& r, MethodParams& params) { + const String& file_name=params.as_string(0, "file name must not be code"); gdImage* image=load(r, file_name); GET_SELF(r, VImage).set(&file_name, image->SX(), image->SY(), image); } -static void _create(Request& r, MethodParams* params) { - - int width=params->as_int(0, "width must be int", r); - int height=params->as_int(1, "height must be int", r); +static void _create(Request& r, MethodParams& params) { + int width=params.as_int(0, "width must be int", r); + int height=params.as_int(1, "height must be int", r); int bgcolor_value=0xffFFff; - if(params->count()>2) - bgcolor_value=params->as_int(2, "color must be int", r); + if(params.count()>2) + bgcolor_value=params.as_int(2, "color must be int", r); gdImage* image=new gdImage; image->Create(width, height); image->FilledRectangle(0, 0, width-1, height-1, image->Color(bgcolor_value)); GET_SELF(r, VImage).set(0, width, height, image); } -static void _gif(Request& r, MethodParams* params) { - +static void _gif(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, 0, "does not contain an image"); - // could _ but don't thing it's wise to use $image.src for vfile.name + const String *file_name=0; + if(params.count()>0) + file_name=¶ms.as_string(0, "file name must be string"); gdBuf buf=image->Gif(); VFile& vfile=*new VFile; Value* content_type=new VString(*new String("image/gif")); vfile.set(false/*not tainted*/, - (const char*)buf.ptr, buf.size, 0, content_type); + (const char*)buf.ptr, buf.size, + file_name? file_name->cstr(String::L_FILE_SPEC): 0, + content_type); r.write_no_lang(vfile); } -static void _line(Request& r, MethodParams* params) { - +static void _line(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, @@ -847,15 +843,14 @@ static void _line(Request& r, MethodPara "does not contain an image"); image->Line( - params->as_int(0, "x0 must be int", r), - params->as_int(1, "y0 must be int", r), - params->as_int(2, "x1 must be int", r), - params->as_int(3, "y1 must be int", r), - image->Color(params->as_int(4, "color must be int", r))); + params.as_int(0, "x0 must be int", r), + params.as_int(1, "y0 must be int", r), + params.as_int(2, "x1 must be int", r), + params.as_int(3, "y1 must be int", r), + image->Color(params.as_int(4, "color must be int", r))); } -static void _fill(Request& r, MethodParams* params) { - +static void _fill(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, @@ -863,13 +858,12 @@ static void _fill(Request& r, MethodPara "does not contain an image"); image->Fill( - params->as_int(0, "x must be int", r), - params->as_int(1, "y must be int", r), - image->Color(params->as_int(2, "color must be int", r))); + params.as_int(0, "x must be int", r), + params.as_int(1, "y must be int", r), + image->Color(params.as_int(2, "color must be int", r))); } -static void _rectangle(Request& r, MethodParams* params) { - +static void _rectangle(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, @@ -877,15 +871,14 @@ static void _rectangle(Request& r, Metho "does not contain an image"); image->Rectangle( - params->as_int(0, "x0 must be int", r), - params->as_int(1, "y0 must be int", r), - params->as_int(2, "x1 must be int", r), - params->as_int(3, "y1 must be int", r), - image->Color(params->as_int(4, "color must be int", r))); + params.as_int(0, "x0 must be int", r), + params.as_int(1, "y0 must be int", r), + params.as_int(2, "x1 must be int", r), + params.as_int(3, "y1 must be int", r), + image->Color(params.as_int(4, "color must be int", r))); } -static void _bar(Request& r, MethodParams* params) { - +static void _bar(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, @@ -893,11 +886,11 @@ static void _bar(Request& r, MethodParam "does not contain an image"); image->FilledRectangle( - params->as_int(0, "x0 must be int", r), - params->as_int(1, "y0 must be int", r), - params->as_int(2, "x1 must be int", r), - params->as_int(3, "y1 must be int", r), - image->Color(params->as_int(4, "color must be int", r))); + params.as_int(0, "x0 must be int", r), + params.as_int(1, "y0 must be int", r), + params.as_int(2, "x1 must be int", r), + params.as_int(3, "y1 must be int", r), + image->Color(params.as_int(4, "color must be int", r))); } #ifndef DOXYGEN @@ -908,90 +901,86 @@ static void add_point(Table::element_typ (*p)++; } #endif -static void _replace(Request& r, MethodParams* params) { - +static void _replace(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, 0, "does not contain an image"); - Table* table=params->as_no_junction(2, "coordinates must not be code").get_table(); + Table* table=params.as_no_junction(2, "coordinates must not be code").get_table(); if(!table) throw Exception(0, 0, "coordinates must be table"); - gdImage::Point *all_p=new gdImage::Point[table->count()]; + gdImage::Point *all_p=new(PointerFreeGC) gdImage::Point[table->count()]; gdImage::Point *add_p=all_p; table->for_each(add_point, &add_p); image->FilledPolygonReplaceColor(all_p, table->count(), - image->Color(params->as_int(0, "src color must be int", r)), - image->Color(params->as_int(1, "dest color must be int", r))); + image->Color(params.as_int(0, "src color must be int", r)), + image->Color(params.as_int(1, "dest color must be int", r))); } -static void _polyline(Request& r, MethodParams* params) { - +static void _polyline(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, 0, "does not contain an image"); - Table* table=params->as_no_junction(1, "coordinates must not be code").get_table(); + Table* table=params.as_no_junction(1, "coordinates must not be code").get_table(); if(!table) throw Exception(0, 0, "coordinates must be table"); - gdImage::Point* all_p=new gdImage::Point[table->count()]; + gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; gdImage::Point *add_p=all_p; table->for_each(add_point, &add_p); image->Polygon(all_p, table->count(), - image->Color(params->as_int(0, "color must be int", r)), + image->Color(params.as_int(0, "color must be int", r)), false/*not closed*/); } -static void _polygon(Request& r, MethodParams* params) { - +static void _polygon(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, 0, "does not contain an image"); - Table* table=params->as_no_junction(1, "coordinates must not be code").get_table(); + Table* table=params.as_no_junction(1, "coordinates must not be code").get_table(); if(!table) throw Exception(0, 0, "coordinates must be table"); - gdImage::Point* all_p=new gdImage::Point[table->count()]; + gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; gdImage::Point *add_p=all_p; table->for_each(add_point, &add_p); image->Polygon(all_p, table->count(), - image->Color(params->as_int(0, "color must be int", r))); + image->Color(params.as_int(0, "color must be int", r))); } -static void _polybar(Request& r, MethodParams* params) { - +static void _polybar(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, 0, "does not contain an image"); - Table* table=params->as_no_junction(1, "coordinates must not be code").get_table(); + Table* table=params.as_no_junction(1, "coordinates must not be code").get_table(); if(!table) throw Exception("parser.runtime", 0, "coordinates must be table"); - gdImage::Point* all_p=new gdImage::Point[table->count()]; + gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; gdImage::Point *add_p=all_p; table->for_each(add_point, &add_p); image->FilledPolygon(all_p, table->count(), - image->Color(params->as_int(0, "color must be int", r))); + image->Color(params.as_int(0, "color must be int", r))); } // font @@ -1005,9 +994,9 @@ const int Font::letter_spacing=1; Font::Font(//, const String& aalphabet, gdImage* aifont, int aheight, int amonospace, int aspacebarspace): - alphabet(aalphabet), height(aheight), monospace(amonospace), spacebarspace(aspacebarspace), - ifont(aifont) { + ifont(aifont), + alphabet(aalphabet) { } /* ******************************** char ********************************** */ @@ -1061,13 +1050,13 @@ void Font::string_display(gdImage* image // -static void _font(Request& r, MethodParams* params) { - const String& alphabet=params->as_string(0, "alphabet must not be code"); - gdImage* image=load(r, params->as_string(1, "file_name must not be code")); - int spacebar_width=params->as_int(2, "spacebar_width must be int", r); +static void _font(Request& r, MethodParams& params) { + const String& alphabet=params.as_string(0, "alphabet must not be code"); + gdImage* image=load(r, params.as_string(1, "file_name must not be code")); + int spacebar_width=params.as_int(2, "spacebar_width must be int", r); int monospace_width; - if(params->count()>3) { - monospace_width=params->as_int(3, "monospace_width must be int", r); + if(params.count()>3) { + monospace_width=params.as_int(3, "monospace_width must be int", r); if(!monospace_width) monospace_width=image->SX(); } else @@ -1090,10 +1079,10 @@ static void _font(Request& r, MethodPara image->SY() / alphabet.length(), monospace_width, spacebar_width); } -static void _text(Request& r, MethodParams* params) { - int x=params->as_int(0, "x must be int", r); - int y=params->as_int(1, "y must be int", r); - const String& s=params->as_string(2, "text must not be code"); +static void _text(Request& r, MethodParams& params) { + int x=params.as_int(0, "x must be int", r); + int y=params.as_int(1, "y must be int", r); + const String& s=params.as_string(2, "text must not be code"); VImage& vimage=GET_SELF(r, VImage); if(vimage.image) @@ -1109,8 +1098,8 @@ static void _text(Request& r, MethodPara "does not contain an image"); } -static void _length(Request& r, MethodParams* params) { - const String& s=params->as_string(0, "text must not be code"); +static void _length(Request& r, MethodParams& params) { + const String& s=params.as_string(0, "text must not be code"); VImage& vimage=GET_SELF(r, VImage); if(vimage.image) @@ -1126,7 +1115,7 @@ static void _length(Request& r, MethodPa "does not contain an image"); } -static void _arc(Request& r, MethodParams* params) { +static void _arc(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, @@ -1134,16 +1123,16 @@ static void _arc(Request& r, MethodParam "does not contain an image"); image->Arc( - params->as_int(0, "center_x must be int", r), - params->as_int(1, "center_y must be int", r), - params->as_int(2, "width must be int", r), - params->as_int(3, "height must be int", r), - params->as_int(4, "start degrees must be int", r), - params->as_int(5, "end degrees must be int", r), - image->Color(params->as_int(6, "cx must be int", r))); + params.as_int(0, "center_x must be int", r), + params.as_int(1, "center_y must be int", r), + params.as_int(2, "width must be int", r), + params.as_int(3, "height must be int", r), + params.as_int(4, "start degrees must be int", r), + params.as_int(5, "end degrees must be int", r), + image->Color(params.as_int(6, "cx must be int", r))); } -static void _sector(Request& r, MethodParams* params) { +static void _sector(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, @@ -1151,37 +1140,37 @@ static void _sector(Request& r, MethodPa "does not contain an image"); image->Sector( - params->as_int(0, "center_x must be int", r), - params->as_int(1, "center_y must be int", r), - params->as_int(2, "width must be int", r), - params->as_int(3, "height must be int", r), - params->as_int(4, "start degrees must be int", r), - params->as_int(5, "end degrees must be int", r), - image->Color(params->as_int(6, "color must be int", r))); + params.as_int(0, "center_x must be int", r), + params.as_int(1, "center_y must be int", r), + params.as_int(2, "width must be int", r), + params.as_int(3, "height must be int", r), + params.as_int(4, "start degrees must be int", r), + params.as_int(5, "end degrees must be int", r), + image->Color(params.as_int(6, "color must be int", r))); } -static void _circle(Request& r, MethodParams* params) { +static void _circle(Request& r, MethodParams& params) { gdImage* image=GET_SELF(r, VImage).image; if(!image) throw Exception(0, 0, "does not contain an image"); - int size=params->as_int(2, "radius must be int", r)*2; + int size=params.as_int(2, "radius must be int", r)*2; image->Arc( - params->as_int(0, "center_x must be int", r), - params->as_int(1, "center_y must be int", r), + params.as_int(0, "center_x must be int", r), + params.as_int(1, "center_y must be int", r), size, //w size, //h 0, //s 360, //e - image->Color(params->as_int(3, "color must be int", r))); + image->Color(params.as_int(3, "color must be int", r))); } -gdImage* as_image(MethodParams* params, int index, const char* msg) { +gdImage* as_image(MethodParams& params, int index, const char* msg) { gdImage* src=0; - Value& value=params->as_no_junction(index, msg); + Value& value=params.as_no_junction(index, msg); if(Value* vimage=value.as(VIMAGE_TYPE, false)) { src=static_cast(vimage)->image; @@ -1197,7 +1186,7 @@ gdImage* as_image(MethodParams* params, return src; } -static void _copy(Request& r, MethodParams* params) { +static void _copy(Request& r, MethodParams& params) { gdImage* dest=GET_SELF(r, VImage).image; if(!dest) throw Exception(0, @@ -1206,18 +1195,18 @@ static void _copy(Request& r, MethodPara gdImage* src=as_image(params, 0, "src must be image"); - int sx=params->as_int(1, "src_x must be int", r); - int sy=params->as_int(2, "src_y must be int", r); - int sw=params->as_int(3, "src_w must be int", r); - int sh=params->as_int(4, "src_h must be int", r); - int dx=params->as_int(5, "dest_x must be int", r); - int dy=params->as_int(6, "dest_y must be int", r); - if(params->count()>1+2+2+2) { - int dw=params->as_int(1+2+2+2, "dest_w must be int", r); - int dh=(int)(params->count()>1+2+2+2+1? - params->as_int(1+2+2+2+1, "dest_h must be int", r):sh*(((double)dw)/((double)sw))); - int tolerance=params->count()>1+2+2+2+2? - params->as_int(1+2+2+2+2, "tolerance must be int", r):150; + int sx=params.as_int(1, "src_x must be int", r); + int sy=params.as_int(2, "src_y must be int", r); + int sw=params.as_int(3, "src_w must be int", r); + int sh=params.as_int(4, "src_h must be int", r); + int dx=params.as_int(5, "dest_x must be int", r); + int dy=params.as_int(6, "dest_y must be int", r); + if(params.count()>1+2+2+2) { + int dw=params.as_int(1+2+2+2, "dest_w must be int", r); + int dh=(int)(params.count()>1+2+2+2+1? + params.as_int(1+2+2+2+1, "dest_h must be int", r):sh*(((double)dw)/((double)sw))); + int tolerance=params.count()>1+2+2+2+2? + params.as_int(1+2+2+2+2, "tolerance must be int", r):150; src->CopyResampled(*dest, dx, dy, sx, sy, dw, dh, sw, sh, tolerance); } else @@ -1243,7 +1232,7 @@ MImage::MImage(): Methoded("image") { add_native_method("create", Method::CT_DYNAMIC, _create, 2, 3); // ^image.gif[] - add_native_method("gif", Method::CT_DYNAMIC, _gif, 0, 0); + add_native_method("gif", Method::CT_DYNAMIC, _gif, 0, 1); // ^image.line(x0;y0;x1;y1;color) add_native_method("line", Method::CT_DYNAMIC, _line, 5, 5);