--- parser3/src/classes/image.C 2001/04/11 17:06:10 1.9 +++ parser3/src/classes/image.C 2001/04/12 14:08:57 1.14 @@ -5,7 +5,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: image.C,v 1.9 2001/04/11 17:06:10 paf Exp $ + $Id: image.C,v 1.14 2001/04/12 14:08:57 paf Exp $ */ #include "pa_config_includes.h" @@ -303,7 +303,7 @@ static void _html(Request& r, const Stri Hash& fields=static_cast(r.self)->fields(); Hash *attribs=0; - if(params) + if(params->size()) if(attribs=static_cast(params->get(0))->get_hash()) { Attrib_info attrib_info={&tag, 0}; attribs->for_each(append_attrib_pair, &attrib_info); @@ -360,8 +360,6 @@ static void _create(Request& r, const St } /// ^image.gif[] -/// ^image.gif[user-file-name] -/// @test gdImageDestroy make gd pooled! static void _gif(Request& r, const String& method_name, Array *params) { Pool& pool=r.pool(); @@ -369,25 +367,168 @@ static void _gif(Request& r, const Strin if(!image) PTHROW(0, 0, &method_name, - "does not contain image"); + "does not contain an image"); - char *file_name_cstr=0; - if(params) { - Value& vfile_name=*static_cast(params->get(0)); - // forcing [this body type] - r.fail_if_junction_(true, vfile_name, method_name, "file name must not be code"); - - file_name_cstr=vfile_name.as_string().cstr(String::UL_FILE_NAME); - } // could _ but don't thing it's wise to use $image.src for vfile.name + + String out(pool); image->Gif(out); VFile& vfile=*new(pool) VFile(pool); String& image_gif=*new(pool) String(pool, "image/gif"); - vfile.set(false/*not tainted*/, z, z, file_name_cstr, &image_gif); + vfile.set(false/*not tainted*/, out.cstr(), out.size(), 0, &image_gif); r.write_no_lang(vfile); } +/// ^image.line(x0;y0;x1;y1;color) +static void _line(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + image->Line( + (int)r.process(*static_cast(params->get(0))).as_double(), + (int)r.process(*static_cast(params->get(1))).as_double(), + (int)r.process(*static_cast(params->get(2))).as_double(), + (int)r.process(*static_cast(params->get(3))).as_double(), + image->Color((int)r.process(*static_cast(params->get(4))).as_double())); +} + +/// ^image.fill(x;y;color) +static void _fill(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + image->Fill( + (int)r.process(*static_cast(params->get(0))).as_double(), + (int)r.process(*static_cast(params->get(1))).as_double(), + image->Color((int)r.process(*static_cast(params->get(2))).as_double())); +} + +/// ^image.rectangle(x0;y0;x1;y1;color) +static void _rectangle(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + image->Rectangle( + (int)r.process(*static_cast(params->get(0))).as_double(), + (int)r.process(*static_cast(params->get(1))).as_double(), + (int)r.process(*static_cast(params->get(2))).as_double(), + (int)r.process(*static_cast(params->get(3))).as_double(), + image->Color((int)r.process(*static_cast(params->get(4))).as_double())); +} + +/// ^image.bar(x0;y0;x1;y1;color) +static void _bar(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + image->FilledRectangle( + (int)r.process(*static_cast(params->get(0))).as_double(), + (int)r.process(*static_cast(params->get(1))).as_double(), + (int)r.process(*static_cast(params->get(2))).as_double(), + (int)r.process(*static_cast(params->get(3))).as_double(), + image->Color((int)r.process(*static_cast(params->get(4))).as_double())); +} + +/// ^image.replace(color-source;color-dest)(x;y)... point coord pairs +static void _replace(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + if((params->size()-2)%2) // I see your thoughts, but that's more readable + PTHROW(0, 0, + &method_name, + "y coordinate missing"); + + int n=(params->size()-2)/2; + + gdImage::Point *p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*n); + for(int i=0; i(params->get(2+i*2+0))).as_double(); + p[i].y=(int)r.process(*static_cast(params->get(2+i*2+1))).as_double(); + } + image->FilledPolygonReplaceColor(p, n, + image->Color((int)r.process(*static_cast(params->get(0))).as_double()), // src color + image->Color((int)r.process(*static_cast(params->get(1))).as_double())); // dest color +} + +/// ^image.polygon(color)(x;y)... point coord pairs +static void _polygon(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + if((params->size()-1)%2) // [I see..] see now? + PTHROW(0, 0, + &method_name, + "y coordinate missing"); + + int n=(params->size()-1)/2; + + gdImage::Point *p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*n); + for(int i=0; i(params->get(1+i*2+0))).as_double(); + p[i].y=(int)r.process(*static_cast(params->get(1+i*2+1))).as_double(); + } + image->Polygon(p, n, + image->Color((int)r.process(*static_cast(params->get(0))).as_double())); +} + +/// ^image.polybar(color)(x;y)... point coord pairs +static void _polybar(Request& r, const String& method_name, Array *params) { + Pool& pool=r.pool(); + + gdImage *image=static_cast(r.self)->image; + if(!image) + PTHROW(0, 0, + &method_name, + "does not contain an image"); + + if((params->size()-1)%2) // [I see..] see now? + PTHROW(0, 0, + &method_name, + "y coordinate missing"); + + int n=(params->size()-1)/2; + + gdImage::Point *p=(gdImage::Point *)pool.malloc(sizeof(gdImage::Point)*n); + for(int i=0; i(params->get(1+i*2+0))).as_double(); + p[i].y=(int)r.process(*static_cast(params->get(1+i*2+1))).as_double(); + } + image->FilledPolygon(p, n, + image->Color((int)r.process(*static_cast(params->get(0))).as_double())); +} + // initialize void initialize_image_class(Pool& pool, VStateless_class& vclass) { // ^image:measure[DATA] @@ -405,6 +546,27 @@ void initialize_image_class(Pool& pool, vclass.add_native_method("create", Method::CT_DYNAMIC, _create, 2, 3); /// ^image.gif[] - /// ^image.gif[user-file-name] - vclass.add_native_method("gif", Method::CT_DYNAMIC, _gif, 0, 1); + vclass.add_native_method("gif", Method::CT_DYNAMIC, _gif, 0, 0); + + /// ^image.line(x0;y0;x1;y1;color) + vclass.add_native_method("line", Method::CT_DYNAMIC, _line, 5, 5); + + /// ^image.fill(x;y;color) + vclass.add_native_method("fill", Method::CT_DYNAMIC, _fill, 3, 3); + + /// ^image.rectangle(x0;y0;x1;y1;color) + vclass.add_native_method("rectangle", Method::CT_DYNAMIC, _rectangle, 5, 5); + + /// ^image.bar(x0;y0;x1;y1;color) + vclass.add_native_method("bar", Method::CT_DYNAMIC, _bar, 5, 5); + + /// ^image.replace(color-source;color-dest)(x;y)... point coord pairs + vclass.add_native_method("replace", Method::CT_DYNAMIC, _replace, 2+3*2, 2+100*2); + + /// ^image.polygon(color)(x;y)... point coord pairs + vclass.add_native_method("polygon", Method::CT_DYNAMIC, _polygon, 1+3*2, 1+100*2); + + /// ^image.polybar(color)(x;y)... point coord pairs + vclass.add_native_method("polybar", Method::CT_DYNAMIC, _polybar, 1+3*2, 1+100*2); + }