--- parser3/src/classes/image.C 2002/11/22 16:16:33 1.80 +++ parser3/src/classes/image.C 2002/11/29 12:13:42 1.89 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_IMAGE_C="$Date: 2002/11/22 16:16:33 $"; +static const char* IDENT_IMAGE_C="$Date: 2002/11/29 12:13:42 $"; /* jpegsize: gets the width and height (in pixels) of a jpeg file @@ -24,6 +24,7 @@ static const char* IDENT_IMAGE_C="$Date: #include "pa_request.h" #include "pa_vfile.h" #include "pa_vimage.h" +#include "pa_vdate.h" // class @@ -72,13 +73,13 @@ public: /*override*/void seek(long value, int whence) { if(lseek(f, value, whence)<0) - throw Exception("file.seek", + throw Exception("image.format", &file_name, "seek(value=%ld, whence=%d) failed: %s (%d), actual filename '%s'", value, whence, strerror(errno), errno, fname); } - /*override*/long tell() { return ::tell(f); } + /*override*/long tell() { return lseek(f, 0, SEEK_CUR); } private: Pool& pool; @@ -104,11 +105,11 @@ public: switch(whence) { case SEEK_CUR: new_offset=offset+value; break; case SEEK_SET: new_offset=(size_t)value; break; - default: throw Exception("file.seek", 0, "whence #%d not supported", 0, whence); break; + default: throw Exception(0, 0, "whence #%d not supported", 0, whence); break; // never } if((ssize_t)new_offset<0 || new_offset>size) - throw Exception("file.seek", + throw Exception("image.format", &file_name, "seek(value=%l, whence=%d) failed: out of buffer, new_offset>size (%l>%l) or new_offset<0", value, whence, new_offset, size); @@ -189,6 +190,8 @@ struct JPG_Exif_IFD_entry { #define JPG_IFD_TAG_EXIF_OFFSET 0x8769 +#define JPEG_EXIF_DATE_CHARS 20 + // inline ushort x_endian_to_ushort(uchar b0, uchar b1) { @@ -212,7 +215,7 @@ inline uint endian_to_uint(bool is_big, static void measure_gif(Pool& pool, const String *origin_string, Measure_reader& reader, ushort& width, ushort& height) { - void *buf; + const void *buf; const int head_size=sizeof(GIF_Header); if(reader.read(buf, head_size)=0) + return new(pool) VDate(pool, t); + } + if(const char *premature_zero_pos=(const char *)memchr(cstr, 0, size)) size=premature_zero_pos-cstr; return new(pool) VString(*new(pool) String(pool, cstr, size, true/*tainted*/)); @@ -456,7 +474,7 @@ static void measure_jpeg(Pool& pool, con const uchar CODE_SIZE_D=0xC3; const uchar CODE_EXIF=0xE1; - void *buf; + const void *buf; const size_t prefix_size=2; if(reader.read(buf, prefix_size)get(0), /*0/*no name* /,*/ false/*don't intercept string*/); - if(vattribs.is_defined()) // allow 'void' + if(!vattribs.is_string()) // allow empty if(attribs=vattribs.get_hash(&method_name)) { Attrib_info attrib_info={&tag, 0}; attribs->for_each(append_attrib_pair, &attrib_info); @@ -891,10 +909,10 @@ static void _polybar(Request& r, const S // font -#define Y(y)(y+index*height+1) +#define Y(y)(y+index*height) /// simple gdImage-based font storage & text output -class Font : public Pooled { +class Font: public Pooled { public: const static int letter_spacing; @@ -906,7 +924,7 @@ public: Font(Pool& pool, const String& aalphabet, - gdImage& aifont, int aheight, int amonospace, int aspacebarspace) : Pooled(pool), + gdImage& aifont, int aheight, int amonospace, int aspacebarspace): Pooled(pool), alphabet(aalphabet), height(aheight), monospace(amonospace), spacebarspace(aspacebarspace), ifont(aifont) { @@ -924,7 +942,7 @@ public: return spacebarspace; int tr=ifont.GetTransparent(); for(int x=ifont.SX()-1; x>=0; x--) { - for(int y=0; y=0) - ifont.Copy(image, x, y, 0, Y(0), index_width(index), height-1); + ifont.Copy(image, x, y, 0, Y(0), index_width(index), height); } /* ******************************** string ********************************** */ + int step_width(int index) { + return letter_spacing + (monospace ? monospace : index_width(index)); + } + + // counts trailing letter_spacing, consider this OK. useful for contiuations int string_width(const String& s){ const char *cstr=s.cstr(); int result=0; for(; *cstr; cstr++) - result+=index_width(index_of(*cstr)); + result+=step_width(index_of(*cstr)); return result; } @@ -951,7 +974,7 @@ public: if(cstr) for(; *cstr; cstr++) { int index=index_of(*cstr); index_display(image, x, y, index); - x+=letter_spacing + (monospace ? monospace : index_width(index)); + x+=step_width(index); } } @@ -976,6 +999,12 @@ static void _font(Request& r, const Stri throw Exception("parser.runtime", &method_name, "alphabet must not be empty"); + + if(int remainder=image.SY() % alphabet.size()) + throw Exception("parser.runtime", + &method_name, + "font-file height(%d) not divisable by alphabet size(%d), remainder=%d", + image.SY(), alphabet.size(), remainder); static_cast(r.get_self())->font=new(pool) Font(pool, alphabet,