--- parser3/src/classes/image.C 2001/04/11 13:03:39 1.6 +++ parser3/src/classes/image.C 2001/04/11 15:45:48 1.7 @@ -5,18 +5,15 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: image.C,v 1.6 2001/04/11 13:03:39 paf Exp $ + $Id: image.C,v 1.7 2001/04/11 15:45:48 paf Exp $ */ #include "pa_config_includes.h" #include -#ifdef WIN32 -# include "smtp/smtp.h" -#endif - -#include "gif.h" +#include "Imaging.h" +#include "Gif.h" #include "pa_common.h" #include "pa_request.h" @@ -303,7 +300,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); @@ -317,7 +314,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(); @@ -340,15 +337,16 @@ static void _load(Request& r, const Stri &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(); @@ -358,29 +356,32 @@ static void _create(Request& r, const St if(params->size()>2) bgcolor_value= (int)r.process(*static_cast(params->get(2))).as_double(); - gdImagePtr image=gdImageCreate(width, height); + Imaging im=ImagingNew("P", width, height); + ImagingPalette palette=ImagingPaletteNew("RGB"); + ImagingPaletteCachePrepare(palette); { int r,g,b; v2rgb(bgcolor_value, r,g,b); - gdImageFilledRectangle(image, 0, 0, width-1, height-1, - gdImageColorExact(image, 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, image); + static_cast(r.self)->set(0, width, height, im); } /// ^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(); - gdImagePtr image=static_cast(r.self)->image; - if(!image) + Imaging im=static_cast(r.self)->im; + if(!im) PTHROW(0, 0, &method_name, "does not contain image"); char *file_name_cstr=0; - if(params) { + if(params->size()) { 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"); @@ -389,9 +390,31 @@ static void _gif(Request& r, const Strin } // 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); + 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*/, result.cstr(), result.size(), + file_name_cstr, &image_gif); r.write_no_lang(vfile); } @@ -406,7 +429,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]