--- parser3/src/classes/image.C 2001/04/11 15:45:48 1.7 +++ parser3/src/classes/image.C 2001/04/12 13:15:18 1.12 @@ -5,15 +5,18 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: image.C,v 1.7 2001/04/11 15:45:48 paf Exp $ + $Id: image.C,v 1.12 2001/04/12 13:15:18 paf Exp $ */ #include "pa_config_includes.h" #include -#include "Imaging.h" -#include "Gif.h" +#ifdef WIN32 +# include "smtp/smtp.h" +#endif + +#include "gif.h" #include "pa_common.h" #include "pa_request.h" @@ -314,7 +317,7 @@ static void _html(Request& r, const Stri tag << " />"; r.write_pass_lang(tag); } -/* + /// ^image.load[background.gif] static void _load(Request& r, const String& method_name, Array *params) { Pool& pool=r.pool(); @@ -325,48 +328,35 @@ static void _load(Request& r, const Stri const String& file_name=vfile_name.as_string(); const char *file_name_cstr=r.absolute(file_name).cstr(String::UL_FILE_NAME); + gdImage image(pool); if(FILE *f=fopen(file_name_cstr, "rb")) { - gdImagePtr image=gdImageCreateFromGif(f); - int width=gdImageSX(image); - int height=gdImageSY(image); + image.CreateFromGif(f); + int width=image.SX(); + int height=image.SY(); fclose(f); - static_cast(r.self)->set(&file_name, width, height, image); + static_cast(r.self)->set(&file_name, width, height, &image); } else PTHROW(0, 0, &method_name, "can not open background image '%s'", file_name_cstr); } -*/ -inline void v2rgb(int v, int& r, int& g, int& b) { - r=v>>8*2 & 0xFF; - g=v>>8*1 & 0xFF; - b=v & 0xFF; -} /// ^image.create[width;height] bgcolor=white /// ^image.create[width;height;bgcolor] -/// @test ImagingDelete static void _create(Request& r, const String& method_name, Array *params) { Pool& pool=r.pool(); int width=(int)r.process(*static_cast(params->get(0))).as_double(); int height=(int)r.process(*static_cast(params->get(1))).as_double(); - int bgcolor_value=0xFFFFFF; + int bgcolor_value=0xffFFff; if(params->size()>2) bgcolor_value= (int)r.process(*static_cast(params->get(2))).as_double(); - Imaging im=ImagingNew("P", width, height); - ImagingPalette palette=ImagingPaletteNew("RGB"); - ImagingPaletteCachePrepare(palette); - { - int r,g,b; v2rgb(bgcolor_value, r,g,b); - ImagingPaletteCacheUpdate(palette, r,g,b); - int bgcolor_index=ImagingPaletteCache(palette, r,g,b); - ImagingDrawRectangle(im, 0, 0, width-1, height-1, - bgcolor_index, bgcolor_index); - } - static_cast(r.self)->set(0, width, height, im); + gdImage *image=new(pool) gdImage(pool); + image->Create(width, height); + image->FilledRectangle(0, 0, width-1, height-1, image->Color(bgcolor_value)); + static_cast(r.self)->set(0, width, height, image); } /// ^image.gif[] @@ -374,11 +364,11 @@ static void _create(Request& r, const St static void _gif(Request& r, const String& method_name, Array *params) { Pool& pool=r.pool(); - Imaging im=static_cast(r.self)->im; - if(!im) + gdImage *image=static_cast(r.self)->image; + if(!image) PTHROW(0, 0, &method_name, - "does not contain image"); + "does not contain an image"); char *file_name_cstr=0; if(params->size()) { @@ -389,36 +379,35 @@ static void _gif(Request& r, const Strin 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 - - ImagingCodecStateInstance codec_state={0}; - GIFENCODERSTATE encoder_state={0}; - int bits; - codec_state.shuffle=ImagingFindPacker("P", &bits); - codec_state.bits=codec_state.bits=bits; - codec_state.xsize = im->xsize; - codec_state.ysize = im->ysize; - /* Allocate memory buffer (if bits field is set) */ - codec_state.bytes = (codec_state.bits * codec_state.xsize+7)/8; - codec_state.buffer = (UINT8*) malloc(codec_state.bytes); - codec_state.context=&encoder_state; - - String result(pool); - do { - const int buf_size=10*0x400; - UINT8 *buf=(UINT8 *)pool.malloc(buf_size); - int encoded_size=ImagingGifEncode(im, &codec_state, buf, buf_size); - if(encoded_size>0) - result.APPEND_CLEAN((const char *)buf, encoded_size, 0, 0); - } while(codec_state.errcode==0); + 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*/, result.cstr(), result.size(), - file_name_cstr, &image_gif); + vfile.set(false/*not tainted*/, out.cstr(), out.size(), file_name_cstr, &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())); + +} + // initialize void initialize_image_class(Pool& pool, VStateless_class& vclass) { // ^image:measure[DATA] @@ -429,7 +418,7 @@ void initialize_image_class(Pool& pool, vclass.add_native_method("html", Method::CT_DYNAMIC, _html, 0, 1); /// ^image.load[background.gif] -// vclass.add_native_method("load", Method::CT_DYNAMIC, _load, 1, 1); + vclass.add_native_method("load", Method::CT_DYNAMIC, _load, 1, 1); /// ^image.create[width;height] bgcolor=white /// ^image.create[width;height;bgcolor] @@ -438,4 +427,7 @@ void initialize_image_class(Pool& pool, /// ^image.gif[] /// ^image.gif[user-file-name] vclass.add_native_method("gif", Method::CT_DYNAMIC, _gif, 0, 1); + + /// ^image.line(x0;y0;x1;y1;color) + vclass.add_native_method("line", Method::CT_DYNAMIC, _line, 5, 5); }