Diff for /parser3/src/classes/image.C between versions 1.138 and 1.147

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)

Removed from v.1.138  
changed lines
  Added in v.1.147


E-mail: