// Copyright (C) 2000-2007, Luca Padovani . // // This file is part of GtkMathView, a flexible, high-quality rendering // engine for MathML documents. // // GtkMathView is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published // by the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // GtkMathView is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . #include #include #include "defs.h" #include "String.hh" #include "ValueConversion.hh" typedef Variant Variant_void; bool IsEmpty(const SmartPtr& value) { assert(value); return is_a(value); } bool IsTokenId(const SmartPtr& value) { assert(value); return is_a< Variant >(value); } bool IsSequence(const SmartPtr& value) { assert(value); return is_a< Variant< std::vector< SmartPtr > > >(value); } bool IsLength(const SmartPtr& value) { assert(value); return is_a< Variant >(value); } bool IsRGBColor(const SmartPtr& value) { assert(value); return is_a< Variant >(value); } bool IsNumber(const SmartPtr& value) { assert(value); return is_a< Variant >(value); } bool ToBoolean(const SmartPtr& value) { if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); assert(false); return bool(); } float ToNumber(const SmartPtr& value) { if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); assert(false); return float(); } int ToInteger(const SmartPtr& value) { if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); assert(false); return int(); } String ToString(const SmartPtr& value) { if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); assert(false); return String(); } Length ToLength(const SmartPtr& value) { if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); assert(false); return Length(); } RGBColor ToRGBColor(const SmartPtr& value) { if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); assert(false); return RGBColor(); } TokenId ToTokenId(const SmartPtr& value) { assert(value); if (SmartPtr< Variant > v = smart_cast< Variant >(value)) return v->getValue(); else return T__NOTVALID; } SmartPtr ToSequence(const SmartPtr& value) { return smart_cast(value); } Length::Unit toUnitId(TokenId id) { switch (id) { case T__PERCENTAGE: return Length::PERCENTAGE_UNIT; case T_EM: return Length::EM_UNIT; case T_EX: return Length::EX_UNIT; case T_PX: return Length::PX_UNIT; case T_IN: return Length::IN_UNIT; case T_CM: return Length::CM_UNIT; case T_MM: return Length::MM_UNIT; case T_PT: return Length::PT_UNIT; case T_PC: return Length::PC_UNIT; default: return Length::UNDEFINED_UNIT; } } Length::Unit toUnitId(const SmartPtr& value) { return toUnitId(ToTokenId(value)); } RGBColor ToRGB(const SmartPtr& value) { if (IsRGBColor(value)) return ToRGBColor(value); switch (ToTokenId(value)) { case T_BLACK: return RGBColor::BLACK(); case T_SILVER: return RGBColor::SILVER(); case T_GRAY: return RGBColor::GRAY(); case T_WHITE: return RGBColor::WHITE(); case T_MAROON: return RGBColor::MAROON(); case T_RED: return RGBColor::RED(); case T_PURPLE: return RGBColor::PURPLE(); case T_FUCHSIA: return RGBColor::FUCHSIA(); case T_GREEN: return RGBColor::GREEN(); case T_LIME: return RGBColor::LIME(); case T_OLIVE: return RGBColor::OLIVE(); case T_YELLOW: return RGBColor::YELLOW(); case T_NAVY: return RGBColor::NAVY(); case T_BLUE: return RGBColor::BLUE(); case T_TEAL: return RGBColor::TEAL(); case T_AQUA: return RGBColor::AQUA(); default: assert(false); return RGBColor::BLACK(); } } SmartPtr GetComponent(const SmartPtr& value, int i, int j) { if (value) if (i < 0) return value; else { SmartPtr vSeq = smart_cast(value); assert(vSeq); assert(vSeq->getSize() > 0); return GetComponent(vSeq->getValue(std::min(i, static_cast(vSeq->getSize() - 1))), j, -1); } else return 0; }