--- parser3/src/classes/image.C 2001/09/17 16:14:04 1.40.4.2 +++ parser3/src/classes/image.C 2001/09/13 14:10:54 1.41 @@ -5,9 +5,9 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: image.C,v 1.40.4.2 2001/09/17 16:14:04 parser Exp $ + $Id: image.C,v 1.41 2001/09/13 14:10:54 parser Exp $ */ -static const char *RCSId="$Id: image.C,v 1.40.4.2 2001/09/17 16:14:04 parser Exp $"; +static const char *RCSId="$Id: image.C,v 1.41 2001/09/13 14:10:54 parser Exp $"; /* jpegsize: gets the width and height (in pixels) of a jpeg file @@ -137,7 +137,7 @@ void measure_gif(Pool& pool, const Strin if(strncmp(head->type, "GIF", 3)!=0) PTHROW(0, 0, origin_string, - "not GIF file - wrong signature"); + "not GIF file - signature not found"); width=little_endian_to_int(head->width); height=little_endian_to_int(head->height); @@ -161,7 +161,7 @@ void measure_jpeg(Pool& pool, const Stri if(!(signature[0]==0xFF && signature[1]==0xD8)) PTHROW(0, 0, origin_string, - "not JPEG file - wrong signature"); + "not JPEG file - signature not found"); bool found=false; while(true) { @@ -356,7 +356,8 @@ static gdImage *load(Request& r, const S static void _load(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& file_name=params->as_string(0, "file name must not be code"); + Value& vfile_name=params->as_no_junction(0, "file name must not be code"); + const String& file_name=vfile_name.as_string(); gdImage& image=*load(r, method_name, file_name); int width=image.SX(); @@ -392,9 +393,9 @@ static void _gif(Request& r, const Strin String out(pool); image->Gif(out); VFile& vfile=*new(pool) VFile(pool); - String& image_gif=*new(pool) String(pool, "image/gif"); + Value *content_type=new(pool) VString(*new(pool) String(pool, "image/gif")); vfile.set(false/*not tainted*/, - out.cstr(String::UL_AS_IS), out.size(), 0, &image_gif); + out.cstr(String::UL_AS_IS), out.size(), 0, content_type); r.write_no_lang(vfile); } @@ -465,16 +466,6 @@ static void _bar(Request& r, const Strin image->Color(params->as_int(4, r))); } -#ifndef DOXYGEN -static void add_point(Array::Item *value, void *info) { - Array& row=*static_cast(value); - gdImage::Point **p=static_cast(info); - - (**p).x=row.get_string(0)->as_int(); - (**p).y=row.get_string(1)->as_int(); - *p++; -} -#endif static void _replace(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); @@ -484,21 +475,24 @@ static void _replace(Request& r, const S &method_name, "does not contain an image"); - Table *table=params->as_no_junction(2, "coordinates must not be code").get_table(); - if(!table) - PTHROW(0, 0, - &method_name, - "coordinates must be table"); + if((params->size()-2)%2) // I see your thoughts, but that's more readable + PTHROW(0, 0, + &method_name, + "y coordinate missing"); - gdImage::Point *all_p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*table->size()); - gdImage::Point *add_p=all_p; - table->for_each(add_point, &add_p); - image->FilledPolygonReplaceColor(all_p, table->size(), + int n=(params->size()-2)/2; + + gdImage::Point *p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*n); + for(int i=0; ias_int(2+i*2+0, r); + p[i].y=params->as_int(2+i*2+1, r); + } + image->FilledPolygonReplaceColor(p, n, image->Color(params->as_int(0, r)), // src color image->Color(params->as_int(1, r)));// dest color } -static void _polyline(Request& r, const String& method_name, MethodParams *params) { +static void _polygon(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); gdImage *image=static_cast(r.self)->image; @@ -507,39 +501,19 @@ static void _polyline(Request& r, const &method_name, "does not contain an image"); - Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); - if(!table) - PTHROW(0, 0, - &method_name, - "coordinates must be table"); - - gdImage::Point *all_p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*table->size()); - gdImage::Point *add_p=all_p; - table->for_each(add_point, &add_p); - image->Polygon(all_p, table->size(), - image->Color(params->as_int(0, r)), - false/*not closed*/); -} - -static void _polygon(Request& r, const String& method_name, MethodParams *params) { - Pool& pool=r.pool(); - - gdImage *image=static_cast(r.self)->image; - if(!image) + if((params->size()-1)%2) // [I see..] see now? PTHROW(0, 0, &method_name, - "does not contain an image"); + "y coordinate missing"); - Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); - if(!table) - PTHROW(0, 0, - &method_name, - "coordinates must be table"); - - gdImage::Point *all_p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*table->size()); - gdImage::Point *add_p=all_p; - table->for_each(add_point, &add_p); - image->Polygon(all_p, table->size(), + int n=(params->size()-1)/2; + + gdImage::Point *p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*n); + for(int i=0; ias_int(2+i*2+0, r); + p[i].y=params->as_int(2+i*2+1, r); + } + image->Polygon(p, n, image->Color(params->as_int(0, r))); } @@ -552,16 +526,19 @@ static void _polybar(Request& r, const S &method_name, "does not contain an image"); - Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); - if(!table) - PTHROW(0, 0, - &method_name, - "coordinates must be table"); + if((params->size()-1)%2) // [I see..] see now? + PTHROW(0, 0, + &method_name, + "y coordinate missing"); - gdImage::Point *all_p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*table->size()); - gdImage::Point *add_p=all_p; - table->for_each(add_point, &add_p); - image->FilledPolygon(all_p, table->size(), + int n=(params->size()-1)/2; + + gdImage::Point *p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*n); + for(int i=0; ias_int(2+i*2+0, r); + p[i].y=params->as_int(2+i*2+1, r); + } + image->FilledPolygon(p, n, image->Color(params->as_int(0, r))); } @@ -715,17 +692,14 @@ MImage::MImage(Pool& apool) : Methoded(a // ^image.bar(x0;y0;x1;y1;color) add_native_method("bar", Method::CT_DYNAMIC, _bar, 5, 5); - // ^image.replace(color-source;color-dest)[table x:y] - add_native_method("replace", Method::CT_DYNAMIC, _replace, 3, 3); - - // ^image.polyline(color)[table x:y] - add_native_method("polyline", Method::CT_DYNAMIC, _polyline, 2, 2); + // ^image.replace(color-source;color-dest)(x;y)... point coord pairs + add_native_method("replace", Method::CT_DYNAMIC, _replace, 2+3*2, 2+100*2); - // ^image.polygon(color)[table x:y] - add_native_method("polygon", Method::CT_DYNAMIC, _polygon, 2, 2); + // ^image.polygon(color)(x;y)... point coord pairs + add_native_method("polygon", Method::CT_DYNAMIC, _polygon, 1+3*2, 1+100*2); - // ^image.polybar(color)[table x:y] - add_native_method("polybar", Method::CT_DYNAMIC, _polybar, 2, 2); + // ^image.polybar(color)(x;y)... point coord pairs + add_native_method("polybar", Method::CT_DYNAMIC, _polybar, 1+3*2, 1+100*2); // ^image.font[alPHAbet;font-file-name.gif](spacebar_width) // ^image.font[alPHAbet;font-file-name.gif](spacebar_width;width)