|
|
| version 1.52, 2001/10/09 07:06:00 | version 1.60, 2001/10/29 13:04:45 |
|---|---|
| Line 128 void measure_gif(Pool& pool, const Strin | Line 128 void measure_gif(Pool& pool, const Strin |
| void *buf; | void *buf; |
| const int head_size=sizeof(GIF_Header); | const int head_size=sizeof(GIF_Header); |
| if(reader.read(buf, head_size)<head_size) | if(reader.read(buf, head_size)<head_size) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| origin_string, | origin_string, |
| "not GIF file - too small"); | "not GIF file - too small"); |
| GIF_Header *head=(GIF_Header *)buf; | GIF_Header *head=(GIF_Header *)buf; |
| if(strncmp(head->type, "GIF", 3)!=0) | if(strncmp(head->type, "GIF", 3)!=0) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| origin_string, | origin_string, |
| "not GIF file - wrong signature"); | "not GIF file - wrong signature"); |
| Line 142 void measure_gif(Pool& pool, const Strin | Line 142 void measure_gif(Pool& pool, const Strin |
| height=little_endian_to_int(head->height); | height=little_endian_to_int(head->height); |
| } | } |
| /// @test remove ugly mech in reader - 20K limit | |
| void measure_jpeg(Pool& pool, const String *origin_string, | void measure_jpeg(Pool& pool, const String *origin_string, |
| Measure_reader& reader, int& width, int& height) { | Measure_reader& reader, int& width, int& height) { |
| // JFIF format markers | // JFIF format markers |
| Line 152 void measure_jpeg(Pool& pool, const Stri | Line 153 void measure_jpeg(Pool& pool, const Stri |
| void *buf; | void *buf; |
| const size_t prefix_size=2; | const size_t prefix_size=2; |
| if(reader.read(buf, prefix_size)<prefix_size) | if(reader.read(buf, prefix_size)<prefix_size) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| origin_string, | origin_string, |
| "not JPEG file - too small"); | "not JPEG file - too small"); |
| unsigned char *signature=(unsigned char *)buf; | unsigned char *signature=(unsigned char *)buf; |
| if(!(signature[0]==0xFF && signature[1]==0xD8)) | if(!(signature[0]==0xFF && signature[1]==0xD8)) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| origin_string, | origin_string, |
| "not JPEG file - wrong signature"); | "not JPEG file - wrong signature"); |
| Line 193 void measure_jpeg(Pool& pool, const Stri | Line 194 void measure_jpeg(Pool& pool, const Stri |
| } | } |
| if(!found) | if(!found) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| origin_string, | origin_string, |
| "broken JPEG file - size frame not found"); | "broken JPEG file - size frame not found"); |
| } | } |
| Line 202 void measure_jpeg(Pool& pool, const Stri | Line 203 void measure_jpeg(Pool& pool, const Stri |
| void measure(Pool& pool, const String& file_name, | void measure(Pool& pool, const String& file_name, |
| Measure_reader& reader, int& width, int& height) { | Measure_reader& reader, int& width, int& height) { |
| if(const char *cext=strrchr(file_name.cstr(), '.')) { | if(const char *cext=strrchr(file_name.cstr(String::UL_FILE_SPEC), '.')) { |
| cext++; | cext++; |
| if(strcasecmp(cext, "GIF")==0) | if(strcasecmp(cext, "GIF")==0) |
| measure_gif(pool, &file_name, reader, width, height); | measure_gif(pool, &file_name, reader, width, height); |
| else if(strcasecmp(cext, "JPG")==0 || strcasecmp(cext, "JPEG")==0) | else if(strcasecmp(cext, "JPG")==0 || strcasecmp(cext, "JPEG")==0) |
| measure_jpeg(pool, &file_name, reader, width, height); | measure_jpeg(pool, &file_name, reader, width, height); |
| else | else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &file_name, | &file_name, |
| "unhandled image file name extension '%s'", cext); | "unhandled image file name extension '%s'", cext); |
| } else | } else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &file_name, | &file_name, |
| "can not determine image type - no file name extension"); | "can not determine image type - no file name extension"); |
| } | } |
| Line 317 static void _html(Request& r, const Stri | Line 318 static void _html(Request& r, const Stri |
| 0/*no name*/, | 0/*no name*/, |
| false/*don't intercept string*/); | false/*don't intercept string*/); |
| if(vattribs.is_defined()) // allow 'void' | if(vattribs.is_defined()) // allow 'void' |
| if(attribs=vattribs.get_hash()) { | if(attribs=vattribs.get_hash(&method_name)) { |
| Attrib_info attrib_info={&tag, 0}; | Attrib_info attrib_info={&tag, 0}; |
| attribs->for_each(append_attrib_pair, &attrib_info); | attribs->for_each(append_attrib_pair, &attrib_info); |
| } else | } else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "attributes must be hash"); | "attributes must be hash"); |
| } | } |
| Line 342 static gdImage *load(Request& r, const S | Line 343 static gdImage *load(Request& r, const S |
| bool ok=image.CreateFromGif(f); | bool ok=image.CreateFromGif(f); |
| fclose(f); | fclose(f); |
| if(!ok) | if(!ok) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &file_name, | &file_name, |
| "is not in GIF format"); | "is not in GIF format"); |
| return ℑ | return ℑ |
| } else { | } else { |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "can not open '%s'", file_name_cstr); | "can not open '%s'", file_name_cstr); |
| return 0; | return 0; |
| Line 385 static void _gif(Request& r, const Strin | Line 386 static void _gif(Request& r, const Strin |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 406 static void _line(Request& r, const Stri | Line 407 static void _line(Request& r, const Stri |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 423 static void _fill(Request& r, const Stri | Line 424 static void _fill(Request& r, const Stri |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 438 static void _rectangle(Request& r, const | Line 439 static void _rectangle(Request& r, const |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 455 static void _bar(Request& r, const Strin | Line 456 static void _bar(Request& r, const Strin |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 482 static void _replace(Request& r, const S | Line 483 static void _replace(Request& r, const S |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Table *table=params->as_no_junction(2, "coordinates must not be code").get_table(); | Table *table=params->as_no_junction(2, "coordinates must not be code").get_table(); |
| if(!table) | if(!table) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "coordinates must be table"); | "coordinates must be table"); |
| Line 505 static void _polyline(Request& r, const | Line 506 static void _polyline(Request& r, const |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); | Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); |
| if(!table) | if(!table) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "coordinates must be table"); | "coordinates must be table"); |
| Line 528 static void _polygon(Request& r, const S | Line 529 static void _polygon(Request& r, const S |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); | Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); |
| if(!table) | if(!table) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "coordinates must be table"); | "coordinates must be table"); |
| Line 550 static void _polybar(Request& r, const S | Line 551 static void _polybar(Request& r, const S |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); | Table *table=params->as_no_junction(1, "coordinates must not be code").get_table(); |
| if(!table) | if(!table) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "coordinates must be table"); | "coordinates must be table"); |
| Line 651 static void _font(Request& r, const Stri | Line 652 static void _font(Request& r, const Stri |
| monospace_width=0; | monospace_width=0; |
| if(!alphabet.size()) | if(!alphabet.size()) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "alphabet must not be empty"); | "alphabet must not be empty"); |
| Line 673 static void _text(Request& r, const Stri | Line 674 static void _text(Request& r, const Stri |
| if(vimage.font) | if(vimage.font) |
| vimage.font->string_display(*vimage.image, x, y, s); | vimage.font->string_display(*vimage.image, x, y, s); |
| else | else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "set the font first"); | "set the font first"); |
| else | else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| } | } |
| Line 694 static void _length(Request& r, const St | Line 695 static void _length(Request& r, const St |
| result.set_name(method_name); | result.set_name(method_name); |
| r.write_assign_lang(result); | r.write_assign_lang(result); |
| } else | } else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "set the font first"); | "set the font first"); |
| else | else |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| } | } |
| Line 708 static void _arc(Request& r, const Strin | Line 709 static void _arc(Request& r, const Strin |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 727 static void _sector(Request& r, const St | Line 728 static void _sector(Request& r, const St |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 746 static void _circle(Request& r, const St | Line 747 static void _circle(Request& r, const St |
| gdImage *image=static_cast<VImage *>(r.self)->image; | gdImage *image=static_cast<VImage *>(r.self)->image; |
| if(!image) | if(!image) |
| PTHROW(0, 0, | throw Exception(0, 0, |
| &method_name, | &method_name, |
| "does not contain an image"); | "does not contain an image"); |
| Line 761 static void _circle(Request& r, const St | Line 762 static void _circle(Request& r, const St |
| image->Color(params->as_int(3, "color must be int", 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) | |
| throw Exception(0, 0, | |
| &method_name, | |
| msg); | |
| gdImage *src=static_cast<VImage *>(&value)->image; | |
| if(!src) | |
| throw Exception(0, 0, | |
| &method_name, | |
| msg); | |
| return *src; | |
| } | |
| static void _copy(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| gdImage *dest=static_cast<VImage *>(r.self)->image; | |
| if(!dest) | |
| throw Exception(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=(int)(params->size()>1+2+2+2+1? | |
| params->as_int(1+2+2+2+1, "dest_h must be int", r):sh*(((double)dw)/((double)sw))); | |
| int tolerance=params->size()>1+2+2+2+2? | |
| params->as_int(1+2+2+2+2, "tolerance must be int", r):150; | |
| src.CopyResampled(*dest, dx, dy, sx, sy, dw, dh, sw, sh, tolerance); | |
| } else | |
| src.Copy(*dest, dx, dy, sx, sy, sw, sh); | |
| } | |
| // constructor | // constructor |
| MImage::MImage(Pool& apool) : Methoded(apool) { | MImage::MImage(Pool& apool) : Methoded(apool) { |
| Line 827 MImage::MImage(Pool& apool) : Methoded(a | Line 876 MImage::MImage(Pool& apool) : Methoded(a |
| // ^image.circle(center x;center y;r;color) | // ^image.circle(center x;center y;r;color) |
| add_native_method("circle", Method::CT_DYNAMIC, _circle, 4, 4); | 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[;tolerance]]]) | |
| add_native_method("copy", Method::CT_DYNAMIC, _copy, 1+2+2+2, (1+2+2+2)+2+1); | |
| } | } |
| // global variable | // global variable |