--- parser3/src/classes/image.C 2001/08/27 15:17:15 1.31 +++ parser3/src/classes/image.C 2001/08/31 10:18:08 1.35 @@ -5,9 +5,9 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: image.C,v 1.31 2001/08/27 15:17:15 parser Exp $ + $Id: image.C,v 1.35 2001/08/31 10:18:08 parser Exp $ */ -static const char *RCSId="$Id: image.C,v 1.31 2001/08/27 15:17:15 parser Exp $"; +static const char *RCSId="$Id: image.C,v 1.35 2001/08/31 10:18:08 parser Exp $"; /* jpegsize: gets the width and height (in pixels) of a jpeg file @@ -111,8 +111,16 @@ struct JPG_Size_segment_body { // -inline short bytes_to_int(unsigned char chars[2]) { - return(short)((chars[1]<<8) + chars[0]); +inline short x_endian_to_int(unsigned char L, unsigned char H) { + return(short)((H<<8) + L); +} + +inline short big_endian_to_int(unsigned char b[2]) { + return x_endian_to_int(b[1], b[0]); +} + +inline short little_endian_to_int(unsigned char b[2]) { + return x_endian_to_int(b[0], b[1]); } void measure_gif(Pool& pool, const String *origin_string, @@ -123,37 +131,37 @@ void measure_gif(Pool& pool, const Strin if(reader.read(buf, head_size)type, "GIF", 3)!=0) PTHROW(0, 0, origin_string, - "bad image file - GIF signature not found"); + "not GIF file - signature not found"); - width=bytes_to_int(head->width); - height=bytes_to_int(head->height); + width=little_endian_to_int(head->width); + height=little_endian_to_int(head->height); } void measure_jpeg(Pool& pool, const String *origin_string, Measure_reader& reader, int& width, int& height) { // JFIF format markers const unsigned char MARKER=0xFF; - const unsigned char SIZE_FIRST=0xC0; - const unsigned char SIZE_LAST=0xC3; + const unsigned char CODE_SIZE_FIRST=0xC0; + const unsigned char CODE_SIZE_LAST=0xC3; void *buf; const size_t prefix_size=2; if(reader.read(buf, prefix_size)marker!=MARKER) break; - if(head->code >= SIZE_FIRST && head->code <= SIZE_LAST) { + if(head->code >= CODE_SIZE_FIRST && head->code <= CODE_SIZE_LAST) { // Segments that contain size info if(reader.read(buf, sizeof(JPG_Size_segment_body))width); - height=bytes_to_int(body->height); + width=big_endian_to_int(body->width); + height=big_endian_to_int(body->height); found=true; break; } else { // Dummy read to skip over data - size_t limit=bytes_to_int(head->length) - 2; + size_t limit=big_endian_to_int(head->length) - 2; if(reader.read(buf, limit)0; x--) { + for(int x=ifont.SX()-1; x>=0; x--) { for(int y=0; yas_no_junction(0, "alphabet must not be code"); Value& file_name=params->as_no_junction(1, "file_name must not be code"); int height=r.process(params->get(2)).as_int(); + int spacebar_width=r.process(params->get(3)).as_int(); - int width=params->size()>3?r.process(params->get(3)).as_int():0; + int monospace_width=params->size()>4?r.process(params->get(4)).as_int():0; static_cast(r.self)->font=new(pool) Font(pool, valphabet.as_string(), *load(r, method_name, file_name.as_string()), - height, width); + height, monospace_width, spacebar_width); } static void _text(Request& r, const String& method_name, MethodParams *params) { @@ -675,9 +686,9 @@ MImage::MImage(Pool& apool) : Methoded(a // ^image.polybar(color)(x;y)... point coord pairs add_native_method("polybar", Method::CT_DYNAMIC, _polybar, 1+3*2, 1+100*2); - // ^image.font[alPHAbet;font-file-name.gif](height) - // ^image.font[alPHAbet;font-file-name.gif](height;width) - add_native_method("font", Method::CT_DYNAMIC, _font, 3, 4); + // ^image.font[alPHAbet;font-file-name.gif](height;spacebar_width) + // ^image.font[alPHAbet;font-file-name.gif](height;spacebar_width;width) + add_native_method("font", Method::CT_DYNAMIC, _font, 4, 5); // ^image.text(x;y)[text] add_native_method("text", Method::CT_DYNAMIC, _text, 3, 3);