diff --git a/uppsrc/TCore/CalcNode.cpp b/uppsrc/TCore/CalcNode.cpp index 0332e8478..f02eda156 100644 --- a/uppsrc/TCore/CalcNode.cpp +++ b/uppsrc/TCore/CalcNode.cpp @@ -552,7 +552,7 @@ void CalcSymbols::Remove(String name) CalcContext::Global::Global(const String& name, CalcProc proc) { - GetGlobals().Add(name, proc); + GetGlobals().Add(name, proc); } CalcContext::CalcContext() @@ -579,20 +579,20 @@ Value CalcContext::Get(String name) const return Value(); } -Value CalcContext::TryEvaluate(String expr) -{ - try { - return Evaluate(expr); - } - catch(Exc e) { - return ErrorValue(e); - } -} - Value CalcContext::Evaluate(String expr) { - CalcNodePtr node = CalcParser().ScanVoid(expr); - return !!node ? node->Calc(*this) : Value(); + CalcParser parser; + try + { + CalcNodePtr cn = parser.ScanVoid(expr); + if(!cn) + return Value(); + return cn->Calc(*this); + } + catch(Exc e) + { + return ErrorValue(e); + } } double CalcContext::EvaluateDouble(String expr) @@ -1289,7 +1289,7 @@ String CalcParser::GetSqlString() else if(*pos) out.Cat(*pos++); else - throw Exc(t_("Unterminated string constant")); + throw Exc(t_("Unterminated string constant")); } return out; } @@ -1424,7 +1424,7 @@ CalcNodePtr CalcParser::ScanCompare() out_node = new CalcConstNode(Value()); } else if(islike) { - CalcNodePtr lexpr = ScanBitOr(); + CalcNodePtr lexpr = ScanSelect(); out_node = new CalcFunctionNode("like", node, lexpr); } else if(isis) { @@ -1435,7 +1435,7 @@ CalcNodePtr CalcParser::ScanCompare() throw Exc(t_("expected 'between', 'in' or 'like'")); else return node; - + if(!isnot) return out_node; return new CalcFunctionNode("!", out_node); diff --git a/uppsrc/TCore/CalcNode.h b/uppsrc/TCore/CalcNode.h index e7cc98531..af9aed940 100644 --- a/uppsrc/TCore/CalcNode.h +++ b/uppsrc/TCore/CalcNode.h @@ -111,7 +111,7 @@ class CalcSequenceNode : public CalcNode { public: CalcSequenceNode(pick_ Vector nodes); CalcSequenceNode(CalcNodePtr node1, CalcNodePtr node2); - + virtual CalcNodePtr Clone() const { return new CalcSequenceNode(*this); } virtual Value Calc(CalcContext& context) const; virtual String Format() const; @@ -343,8 +343,6 @@ public: virtual ~CalcContext(); Value Evaluate(String expr); - Value TryEvaluate(String expr); - double EvaluateDouble(String expr); String EvaluateString(String expr); int EvaluateInt(String expr); @@ -641,6 +639,8 @@ CalcCastMemberTemplate(CalcCastMemberPacket, 6) #define FGENID1(tag, lnum) FGENID2(tag, lnum) #define FGENID(a, b) COMBINE(COMBINE(a, b), __LINE__) +#define SUBEXPAND(M) M + #ifndef NOHELP #define FDECLTH(tag, topic, id, group, proc) \ static GLOBAL_VARP(HelpCalc, FGENID(chlp, tag), (callback(proc), id, "Calc$" topic, group, ASSTRING(proc))); \ @@ -682,32 +682,32 @@ FDECLTH(dflt, topic, id, group, gate) #define FDECLAP0(id, x, group) FDECLTA(BTA1, id, "C" ASSTRING(id) ASSTRING(x), ASSTRING(id), group, COMBINE3(C, id, x)) #define MDECLT(null, topic, id, group, call) \ -struct FGENID(clcp, dflt) : public BASECLASS \ -{ FGENID(clcp, dflt)(); bool CalcIt(CalcPacket& packet) { return CalcCastMember(packet, this, &BASECLASS::call); } }; \ -static GLOBAL_VARP(HelpCalc, FGENID(chlp, dflt), (callback(static_cast(0), \ - brutal_cast(&FGENID(clcp, dflt)::CalcIt)), \ +struct FGENID(clcp, SUBEXPAND(MFILEID)) : public BASECLASS \ +{ FGENID(clcp, SUBEXPAND(MFILEID))(); bool CalcIt(CalcPacket& packet) { return CalcCastMember(packet, this, &BASECLASS::call); } }; \ +static GLOBAL_VARP(HelpCalc, FGENID(chlp, SUBEXPAND(MFILEID)), (callback(static_cast(0), \ + brutal_cast(&FGENID(clcp, SUBEXPAND(MFILEID))::CalcIt)), \ id, "Calc$" topic, group, ASSTRING(call))); \ INITBLOCK_(FGENID(mblk, tag)) { \ - FGENID(chlp, dflt)(); \ - static CalcLocalItem FGENID(clci, dflt)(BASECLASS::GetLocalMap(), id, \ - brutal_cast(&FGENID(clcp, dflt)::CalcIt)); \ + FGENID(chlp, SUBEXPAND(MFILEID))(); \ + static CalcLocalItem FGENID(clci, SUBEXPAND(MFILEID))(BASECLASS::GetLocalMap(), id, \ + brutal_cast(&FGENID(clcp, SUBEXPAND(MFILEID))::CalcIt)); \ } \ -static void FGENID(chlt, dflt)(String& out) { out.Cat(FGENID(chlp, dflt)().GetTitle()); } \ -RegisterHelpTopicInfo("Calc$" topic, __FILE__, callback(&FGENID(chlt, dflt)), CNULL) +static void FGENID(chlt, SUBEXPAND(MFILEID))(String& out) { out.Cat(FGENID(chlp, SUBEXPAND(MFILEID))().GetTitle()); } \ +RegisterHelpTopicInfo("Calc$" topic, __FILE__, callback(&FGENID(chlt, SUBEXPAND(MFILEID))), CNULL) #define MDECLTA(null, topic, id, group, call) \ -struct FGENID(clcp, dflt) : public BASECLASS \ -{ FGENID(clcp, dflt)(); bool CalcIt(CalcPacket& packet) { return CalcCastMemberPacket(packet, this, &BASECLASS::call); } }; \ -static GLOBAL_VARP(HelpCalc, FGENID(chlp, dflt), (callback(static_cast(0), \ - brutal_cast(&FGENID(clcp, dflt)::CalcIt)), \ +struct FGENID(clcp, SUBEXPAND(MFILEID)) : public BASECLASS \ +{ FGENID(clcp, SUBEXPAND(MFILEID))(); bool CalcIt(CalcPacket& packet) { return CalcCastMemberPacket(packet, this, &BASECLASS::call); } }; \ +static GLOBAL_VARP(HelpCalc, FGENID(chlp, SUBEXPAND(MFILEID)), (callback(static_cast(0), \ + brutal_cast(&FGENID(clcp, SUBEXPAND(MFILEID))::CalcIt)), \ id, "Calc$" topic, group, ASSTRING(call))); \ INITBLOCK_(FGENID(mblk, tag)) { \ - FGENID(chlp, dflt)(); \ - static CalcLocalItem FGENID(clci, dflt)(BASECLASS::GetLocalMap(), id, \ - brutal_cast(&FGENID(clcp, dflt)::CalcIt)); \ + FGENID(chlp, SUBEXPAND(MFILEID))(); \ + static CalcLocalItem FGENID(clci, SUBEXPAND(MFILEID))(BASECLASS::GetLocalMap(), id, \ + brutal_cast(&FGENID(clcp, SUBEXPAND(MFILEID))::CalcIt)); \ } \ -static void FGENID(chlt, dflt)(String& out) { out.Cat(FGENID(chlp, dflt)().GetTitle()); } \ -RegisterHelpTopicInfo("Calc$" topic, __FILE__, callback(&FGENID(chlt, dflt)), CNULL) +static void FGENID(chlt, SUBEXPAND(MFILEID))(String& out) { out.Cat(FGENID(chlp, SUBEXPAND(MFILEID))().GetTitle()); } \ +RegisterHelpTopicInfo("Calc$" topic, __FILE__, callback(&FGENID(chlt, SUBEXPAND(MFILEID))), CNULL) #define MDECL(id, x, group) MDECLT(BTA0, ASSTRING(call), id, group, call) #define MDECL0(id, x, group) MDECLT(BTA1, ASSTRING(id), id, group, COMBINE3(C, id, x)) diff --git a/uppsrc/plugin/png/pngupp.cpp b/uppsrc/plugin/png/pngupp.cpp index c43fc92d0..ec43e6bee 100644 --- a/uppsrc/plugin/png/pngupp.cpp +++ b/uppsrc/plugin/png/pngupp.cpp @@ -176,11 +176,11 @@ bool PNGRaster::Create() } } - png_bytep trans_colors = 0; + png_bytep trans_alpha = 0; png_color_16p trans_values = 0; int num_trans = 0; - png_get_tRNS(data->png_ptr, data->info_ptr, &trans_colors, &num_trans, &trans_values); + png_get_tRNS(data->png_ptr, data->info_ptr, &trans_alpha, &num_trans, &trans_values); // bool has_mask = (num_trans > 0); // AlphaArray im(width, height, out_bpp, 4, NULL, Vector(), has_mask ? 8 : 0, 4); @@ -201,13 +201,13 @@ bool PNGRaster::Create() rgba.g = c.green; rgba.b = c.blue; rgba.a = 255; + if(trans_alpha && i < num_trans) + rgba.a = trans_alpha[i]; data->palette[i] = rgba; } - if(trans_colors) { + Premultiply(data->palette, data->palette, pal_count); + if(trans_alpha) data->info.kind = IMAGE_MASK; - for(int i = 0; i < num_trans; i++) - data->palette[(int)trans_colors[i]] = RGBAZero(); - } } else if(!(color_type & PNG_COLOR_MASK_COLOR)) { // grayscale @@ -217,13 +217,11 @@ bool PNGRaster::Create() RGBA rgba; rgba.r = rgba.g = rgba.b = (byte)level; rgba.a = 255; + if(trans_alpha && i < num_trans) + rgba.a = trans_alpha[i]; data->palette[i] = rgba; } - if(trans_colors) { - data->info.kind = IMAGE_MASK; - for(int i = 0; i < num_trans; i++) - data->palette[(int)trans_colors[i]] = RGBAZero(); - } + Premultiply(data->palette, data->palette, colors); } /*