|
|
| version 1.138, 2011/11/23 12:17:22 | version 1.147, 2015/09/18 00:08:12 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: @b image parser class. | Parser: @b image parser class. |
| Copyright(c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| */ | */ |
| static const char * const IDENT_IMAGE_C="$Date$"; | |
| /* | /* |
| jpegsize: gets the width and height (in pixels) of a jpeg file | jpegsize: gets the width and height (in pixels) of a jpeg file |
| Andrew Tong, werdna@ugcs.caltech.edu February 14, 1995 | Andrew Tong, werdna@ugcs.caltech.edu February 14, 1995 |
| Line 17 static const char * const IDENT_IMAGE_C= | Line 15 static const char * const IDENT_IMAGE_C= |
| */ | */ |
| #include "pa_config_includes.h" | #include "pa_config_includes.h" |
| #include "pa_vmethod_frame.h" | |
| #include "gif.h" | #include "gif.h" |
| #include "pa_vmethod_frame.h" | |
| #include "pa_common.h" | #include "pa_common.h" |
| #include "pa_request.h" | #include "pa_request.h" |
| #include "pa_vfile.h" | #include "pa_vfile.h" |
| Line 29 static const char * const IDENT_IMAGE_C= | Line 25 static const char * const IDENT_IMAGE_C= |
| #include "pa_vdate.h" | #include "pa_vdate.h" |
| #include "pa_table.h" | #include "pa_table.h" |
| volatile const char * IDENT_IMAGE_C="$Id$"; | |
| // defines | // defines |
| static const String spacebar_width_name("space"); | static const String spacebar_width_name("space"); |
| Line 245 public: | Line 243 public: |
| return 0; | return 0; |
| char* lbuf=new(PointerFreeGC) char[limit]; | char* lbuf=new(PointerFreeGC) char[limit]; |
| size_t read_size=(size_t)::read(f, lbuf, limit); abuf=lbuf; | ssize_t read_size=::read(f, lbuf, limit); abuf=lbuf; |
| if(ssize_t(read_size)<0 || read_size>limit) | if(read_size<0) |
| throw Exception(0, | throw Exception(0, &file_name, "measure read failed: %s (%d)", strerror(errno), errno); |
| &file_name, | |
| "measure failed: actually read %u bytes count not in [0..%u] valid range", | |
| read_size, limit); | |
| return read_size; | return read_size; |
| } | } |
| Line 465 static Value* parse_IFD_entry_formatted_ | Line 459 static Value* parse_IFD_entry_formatted_ |
| } | } |
| // date.C | // date.C |
| tm cstr_to_time_t(char *cstr); | tm cstr_to_time_t(char *, const char **); |
| static Value* parse_IFD_entry_formatted_value(bool is_big, ushort format, | static Value* parse_IFD_entry_formatted_value(bool is_big, ushort format, |
| size_t component_size, uint components_count, | size_t component_size, uint components_count, |
| Line 481 static Value* parse_IFD_entry_formatted_ | Line 475 static Value* parse_IFD_entry_formatted_ |
| strcpy(cstr_writable, cstr); | strcpy(cstr_writable, cstr); |
| try { | try { |
| return new VDate(cstr_to_time_t(cstr_writable)); | tm tmIn=cstr_to_time_t(cstr_writable, 0); |
| return new VDate(tmIn); | |
| } | } |
| catch(...) { /*ignore bad date times*/ } | catch(...) { /*ignore bad date times*/ } |
| } | } |
| Line 829 static void _html(Request& r, MethodPara | Line 824 static void _html(Request& r, MethodPara |
| if(params.count()) { | if(params.count()) { |
| // for backward compatibility: someday was ^html{} | // for backward compatibility: someday was ^html{} |
| Value& vattribs=r.process_to_value(params[0], false/*don't intercept string*/); | Value& vattribs=r.process_to_value(params[0], false/*don't intercept string*/); |
| if(!vattribs.is_string()) // allow empty | if(!vattribs.is_string()) { // allow empty |
| if((attribs=vattribs.get_hash())) { | if((attribs=vattribs.get_hash())) { |
| Attrib_info info={&tag, 0}; | Attrib_info info={&tag, 0}; |
| attribs->for_each<Attrib_info*>(append_attrib_pair, &info); | attribs->for_each<Attrib_info*>(append_attrib_pair, &info); |
| Line 837 static void _html(Request& r, MethodPara | Line 832 static void _html(Request& r, MethodPara |
| throw Exception(PARSER_RUNTIME, | throw Exception(PARSER_RUNTIME, |
| 0, | 0, |
| "attributes must be hash"); | "attributes must be hash"); |
| } | |
| } | } |
| { | { |
| Line 896 static void _gif(Request& r, MethodParam | Line 892 static void _gif(Request& r, MethodParam |
| VFile& vfile=*new VFile; | VFile& vfile=*new VFile; |
| vfile.set(false/*not tainted*/, | vfile.set_binary(false/*not tainted*/, (const char *)buf.ptr, buf.size, file_name, new VString(*new String("image/gif"))); |
| (const char*)buf.ptr, buf.size, | |
| file_name, | |
| new VString(*new String("image/gif"))); | |
| vfile.set_mode(false/*binary*/); | |
| r.write_no_lang(vfile); | r.write_no_lang(vfile); |
| } | } |
| Line 977 static void _replace(Request& r, MethodP | Line 968 static void _replace(Request& r, MethodP |
| gdImage::Point* all_p=0; | gdImage::Point* all_p=0; |
| size_t count=0; | size_t count=0; |
| if(params.count() == 3){ | if(params.count() == 3){ |
| Table* table=params.as_no_junction(2, COORDINATES_MUST_NOT_BE_CODE).get_table(); | Table* table=params.as_table(2, "coordinates"); |
| if(!table) | |
| throw Exception(PARSER_RUNTIME, | |
| 0, | |
| "coordinates must be table"); | |
| count=table->count(); | count=table->count(); |
| all_p=new(PointerFreeGC) gdImage::Point[count]; | all_p=new(PointerFreeGC) gdImage::Point[count]; |
| gdImage::Point* add_p=all_p; | gdImage::Point* add_p=all_p; |
| Line 1007 static void _replace(Request& r, MethodP | Line 994 static void _replace(Request& r, MethodP |
| static void _polyline(Request& r, MethodParams& params) { | static void _polyline(Request& r, MethodParams& params) { |
| gdImage& image=GET_SELF(r, VImage).image(); | gdImage& image=GET_SELF(r, VImage).image(); |
| Table* table=params.as_no_junction(1, COORDINATES_MUST_NOT_BE_CODE).get_table(); | Table* table=params.as_table(1, "coordinates"); |
| if(!table) | |
| throw Exception(PARSER_RUNTIME, | |
| 0, | |
| "coordinates must be table"); | |
| gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; | gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; |
| gdImage::Point *add_p=all_p; | gdImage::Point *add_p=all_p; |
| Line 1024 static void _polyline(Request& r, Method | Line 1007 static void _polyline(Request& r, Method |
| static void _polygon(Request& r, MethodParams& params) { | static void _polygon(Request& r, MethodParams& params) { |
| gdImage& image=GET_SELF(r, VImage).image(); | gdImage& image=GET_SELF(r, VImage).image(); |
| Table* table=params.as_no_junction(1, COORDINATES_MUST_NOT_BE_CODE).get_table(); | Table* table=(Table*)params.as_table(1, "coordinates"); |
| if(!table) | |
| throw Exception(PARSER_RUNTIME, | |
| 0, | |
| "coordinates must be table"); | |
| gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; | gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; |
| gdImage::Point *add_p=all_p; | gdImage::Point *add_p=all_p; |
| Line 1040 static void _polygon(Request& r, MethodP | Line 1019 static void _polygon(Request& r, MethodP |
| static void _polybar(Request& r, MethodParams& params) { | static void _polybar(Request& r, MethodParams& params) { |
| gdImage& image=GET_SELF(r, VImage).image(); | gdImage& image=GET_SELF(r, VImage).image(); |
| Table* table=params.as_no_junction(1, COORDINATES_MUST_NOT_BE_CODE).get_table(); | Table* table=(Table*)params.as_table(1, "coordinates"); |
| if(!table) | |
| throw Exception(PARSER_RUNTIME, | |
| 0, | |
| "coordinates must be table"); | |
| gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; | gdImage::Point* all_p=new(PointerFreeGC) gdImage::Point[table->count()]; |
| gdImage::Point *add_p=all_p; | gdImage::Point *add_p=all_p; |
| Line 1164 static void _font(Request& r, MethodPara | Line 1139 static void _font(Request& r, MethodPara |
| int monospace_width=0; // proportional | int monospace_width=0; // proportional |
| int letter_spacing=1; | int letter_spacing=1; |
| if(params.count()>2){ | if(params.count()>2){ |
| if(HashStringValue* options=params.as_no_junction(2, "param must be int or hash").get_hash()){ | if(HashStringValue* options=params[2].get_hash()){ |
| // third option is hash | // third option is hash |
| if(params.count()>3) | if(params.count()>3) |
| throw Exception(PARSER_RUNTIME, | throw Exception(PARSER_RUNTIME, 0, "too many params were specified"); |
| 0, | |
| "too many options were specified"); | |
| int valid_options=0; | int valid_options=0; |
| if(Value* vspacebar_width=options->get(spacebar_width_name)){ | if(Value* vspacebar_width=options->get(spacebar_width_name)){ |
| valid_options++; | valid_options++; |
| Line 1189 static void _font(Request& r, MethodPara | Line 1162 static void _font(Request& r, MethodPara |
| throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); | throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); |
| } else { | } else { |
| // backward | // backward |
| spacebar_width=params.as_int(2, "spacebar_width must be int", r); | spacebar_width=params.as_int(2, "param must be int or hash", r); |
| if(params.count()>3) { | if(params.count()>3) { |
| monospace_width=params.as_int(3, "monospace_width must be int", r); | monospace_width=params.as_int(3, "monospace_width must be int", r); |
| if(!monospace_width) | if(!monospace_width) |