--- parser3/src/classes/image.C 2001/10/08 15:50:22 1.49 +++ parser3/src/classes/image.C 2001/10/16 09:59:23 1.55 @@ -4,7 +4,7 @@ Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: image.C,v 1.49 2001/10/08 15:50:22 parser Exp $ + $Id: image.C,v 1.55 2001/10/16 09:59:23 parser Exp $ */ /* @@ -313,7 +313,9 @@ static void _html(Request& r, const Stri Hash *attribs=0; if(params->size()) { - Value &vattribs=params->get(0); + Value &vattribs=r.process(params->get(0), + 0/*no name*/, + false/*don't intercept string*/); if(vattribs.is_defined()) // allow 'void' if(attribs=vattribs.get_hash()) { Attrib_info attrib_info={&tag, 0}; @@ -367,11 +369,11 @@ static void _load(Request& r, const Stri static void _create(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - int width=params->as_int(0, r); - int height=params->as_int(1, r); + 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->size()>2) - bgcolor_value=params->as_int(2, r); + bgcolor_value=params->as_int(2, "color must be int", r); gdImage& image=*new(pool) gdImage(pool); image.Create(width, height); image.FilledRectangle(0, 0, width-1, height-1, image.Color(bgcolor_value)); @@ -409,11 +411,11 @@ static void _line(Request& r, const Stri "does not contain an image"); image->Line( - params->as_int(0, r), - params->as_int(1, r), - params->as_int(2, r), - params->as_int(3, r), - image->Color(params->as_int(4, 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, const String& method_name, MethodParams *params) { @@ -426,9 +428,9 @@ static void _fill(Request& r, const Stri "does not contain an image"); image->Fill( - params->as_int(0, r), - params->as_int(1, r), - image->Color(params->as_int(2, 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, const String& method_name, MethodParams *params) { @@ -441,11 +443,11 @@ static void _rectangle(Request& r, const "does not contain an image"); image->Rectangle( - params->as_int(0, r), - params->as_int(1, r), - params->as_int(2, r), - params->as_int(3, r), - image->Color(params->as_int(4, 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, const String& method_name, MethodParams *params) { @@ -458,11 +460,11 @@ static void _bar(Request& r, const Strin "does not contain an image"); image->FilledRectangle( - params->as_int(0, r), - params->as_int(1, r), - params->as_int(2, r), - params->as_int(3, r), - image->Color(params->as_int(4, 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 @@ -494,8 +496,8 @@ static void _replace(Request& r, const S gdImage::Point *add_p=all_p; table->for_each(add_point, &add_p); image->FilledPolygonReplaceColor(all_p, table->size(), - image->Color(params->as_int(0, r)), // src color - image->Color(params->as_int(1, r)));// dest color + 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, const String& method_name, MethodParams *params) { @@ -517,7 +519,7 @@ static void _polyline(Request& r, const 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)), + image->Color(params->as_int(0, "color must be int", r)), false/*not closed*/); } @@ -540,7 +542,7 @@ static void _polygon(Request& r, const S 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))); + image->Color(params->as_int(0, "color must be int", r))); } static void _polybar(Request& r, const String& method_name, MethodParams *params) { @@ -562,7 +564,7 @@ static void _polybar(Request& r, const S gdImage::Point *add_p=all_p; table->for_each(add_point, &add_p); image->FilledPolygon(all_p, table->size(), - image->Color(params->as_int(0, r))); + image->Color(params->as_int(0, "color must be int", r))); } // font @@ -639,10 +641,10 @@ static void _font(Request& r, const Stri const String& alphabet=params->as_string(0, "alphabet must not be code"); gdImage& image=*load(r, method_name, params->as_string(1, "file_name must not be code")); - int spacebar_width=params->as_int(2, r); + int spacebar_width=params->as_int(2, "spacebar_width must be int", r); int monospace_width; if(params->size()>3) { - monospace_width=params->as_int(3, r); + monospace_width=params->as_int(3, "monospace_width must be int", r); if(!monospace_width) monospace_width=image.SX(); } else @@ -662,8 +664,8 @@ static void _font(Request& r, const Stri static void _text(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - int x=params->as_int(0, r); - int y=params->as_int(1, r); + 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=*static_cast(r.self); @@ -711,13 +713,13 @@ static void _arc(Request& r, const Strin "does not contain an image"); image->Arc( - params->as_int(0, r), //cx - params->as_int(1, r), //cy - params->as_int(2, r), //w - params->as_int(3, r), //h - params->as_int(4, r), //s - params->as_int(5, r), //e - image->Color(params->as_int(6, 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, const String& method_name, MethodParams *params) { @@ -730,13 +732,13 @@ static void _sector(Request& r, const St "does not contain an image"); image->Sector( - params->as_int(0, r), //cx - params->as_int(1, r), //cy - params->as_int(2, r), //w - params->as_int(3, r), //h - params->as_int(4, r), //s - params->as_int(5, r), //e - image->Color(params->as_int(6, 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, const String& method_name, MethodParams *params) { @@ -748,17 +750,63 @@ static void _circle(Request& r, const St &method_name, "does not contain an image"); - int radius=params->as_int(2, r); + int size=params->as_int(2, "radius must be int", r)*2; image->Arc( - params->as_int(0, r), //cx - params->as_int(1, r), //cy - radius, //w - radius, //h + 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, r))); + image->Color(params->as_int(3, "color must be int", r))); } +gdImage& as_image(Pool& pool, const String& method_name, MethodParams *params, + int index, const char *msg) { + Value& value=params->as_no_junction(index, msg); + + if(strcmp(value.type(), VIMAGE_TYPE)!=0) + PTHROW(0, 0, + &method_name, + msg); + + gdImage *src=static_cast(&value)->image; + if(!src) + PTHROW(0, 0, + &method_name, + msg); + + return *src; +} + +// ^image.copy[source](src x;src y;src w;src h;dst x;dst y[;dest w[;dest h]]) +static void _copy(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + + gdImage *dest=static_cast(r.self)->image; + if(!dest) + PTHROW(0, 0, + &method_name, + "self does not contain an image"); + + gdImage& src=as_image(pool, method_name, 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->size()>1+2+2+2) { + int dw=params->as_int(1+2+2+2, "dest_w must be int", r); + int dh=params->size()>1+2+2+2+1?params->as_int(1+2+2+2+1, "dest_h must be int", r):dw; + + src.CopyResampled(*dest, dx, dy, sx, sy, dw, dh, sw, sh); + } else + src.Copy(*dest, dx, dy, sx, sy, sw, sh); +} + + // constructor MImage::MImage(Pool& apool) : Methoded(apool) { @@ -825,6 +873,8 @@ MImage::MImage(Pool& apool) : Methoded(a // ^image.circle(center x;center y;r;color) add_native_method("circle", Method::CT_DYNAMIC, _circle, 4, 4); + // ^image.copy[source](src x;src y;src w;src h;dst x;dst y[;dest w[;dest h]]) + add_native_method("copy", Method::CT_DYNAMIC, _copy, 1+2+2+2, (1+2+2+2)+2); } // global variable