00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "CEGUIImageset_xmlHandler.h"
00027
00028 #include "CEGUIExceptions.h"
00029 #include "CEGUISystem.h"
00030 #include "CEGUILogger.h"
00031 #include "CEGUIXmlHandlerHelper.h"
00032
00033 #include "xercesc/sax2/SAX2XMLReader.hpp"
00034 #include "xercesc/sax2/XMLReaderFactory.hpp"
00035
00036
00037 namespace CEGUI
00038 {
00039
00040
00041
00042
00043
00044 const String Imageset_xmlHandler::ImagesetElement( (utf8*)"Imageset" );
00045 const String Imageset_xmlHandler::ImageElement( (utf8*)"Image" );
00046 const char Imageset_xmlHandler::ImagesetImageFileAttribute[] = "Imagefile";
00047 const char Imageset_xmlHandler::ImagesetResourceGroupAttribute[] = "ResourceGroup";
00048 const char Imageset_xmlHandler::ImagesetNameAttribute[] = "Name";
00049 const char Imageset_xmlHandler::ImagesetNativeHorzResAttribute[] = "NativeHorzRes";
00050 const char Imageset_xmlHandler::ImagesetNativeVertResAttribute[] = "NativeVertRes";
00051 const char Imageset_xmlHandler::ImagesetAutoScaledAttribute[] = "AutoScaled";
00052 const char Imageset_xmlHandler::ImageNameAttribute[] = "Name";
00053 const char Imageset_xmlHandler::ImageXPosAttribute[] = "XPos";
00054 const char Imageset_xmlHandler::ImageYPosAttribute[] = "YPos";
00055 const char Imageset_xmlHandler::ImageWidthAttribute[] = "Width";
00056 const char Imageset_xmlHandler::ImageHeightAttribute[] = "Height";
00057 const char Imageset_xmlHandler::ImageXOffsetAttribute[] = "XOffset";
00058 const char Imageset_xmlHandler::ImageYOffsetAttribute[] = "YOffset";
00059
00060
00061
00062
00063 void Imageset_xmlHandler::startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const XERCES_CPP_NAMESPACE::Attributes& attrs)
00064 {
00065 XERCES_CPP_NAMESPACE_USE
00066 String element(XmlHandlerHelper::transcodeXmlCharToString(localname));
00067
00068
00069 if (element == ImageElement)
00070 {
00071 String name(XmlHandlerHelper::getAttributeValueAsString(attrs, ImageNameAttribute));
00072
00073 Rect rect;
00074 rect.d_left = (float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImageXPosAttribute);
00075 rect.d_top = (float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImageYPosAttribute);
00076 rect.setWidth((float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImageWidthAttribute));
00077 rect.setHeight((float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImageHeightAttribute));
00078
00079 Point offset;
00080 offset.d_x = (float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImageXOffsetAttribute);
00081 offset.d_y = (float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImageYOffsetAttribute);
00082
00083 d_imageset->defineImage(name, rect, offset);
00084 }
00085
00086 else if (element == ImagesetElement)
00087 {
00088 d_imageset->d_name = XmlHandlerHelper::getAttributeValueAsString(attrs, ImagesetNameAttribute);
00089
00090 Logger::getSingleton().logEvent("Started creation of Imageset '" + d_imageset->d_name + "' via XML file.", Informative);
00091
00092
00093
00094
00095 float hres, vres;
00096
00097
00098 hres = (float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImagesetNativeHorzResAttribute);
00099
00100
00101 vres = (float)XmlHandlerHelper::getAttributeValueAsInteger(attrs, ImagesetNativeVertResAttribute);
00102
00103 d_imageset->setNativeResolution(Size(hres, vres));
00104
00105
00106 String autoscale(XmlHandlerHelper::getAttributeValueAsString(attrs, ImagesetAutoScaledAttribute));
00107
00108
00109 if ((autoscale == (utf8*)"true") || (autoscale == (utf8*)"1"))
00110 {
00111 d_imageset->setAutoScalingEnabled(true);
00112 }
00113 else
00114 {
00115 d_imageset->setAutoScalingEnabled(false);
00116 }
00117
00118
00119
00120
00121 String filename(XmlHandlerHelper::getAttributeValueAsString(attrs, ImagesetImageFileAttribute));
00122 String resourceGroup(XmlHandlerHelper::getAttributeValueAsString(attrs, ImagesetResourceGroupAttribute));
00123
00124 try
00125 {
00126 d_imageset->d_texture = System::getSingleton().getRenderer()->createTexture(filename, resourceGroup);
00127 }
00128 catch(...)
00129 {
00130 throw RendererException((utf8*)"Imageset::xmlHandler::startElement - An unexpected error occurred while creating a Texture object from file '" + filename + "'");
00131 }
00132
00133 }
00134
00135 else
00136 {
00137 throw FileIOException("Imageset::xmlHandler::startElement - Unexpected data was found while parsing the Imageset file: '" + element + "' is unknown.");
00138 }
00139
00140 }
00141
00142 void Imageset_xmlHandler::endElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname)
00143 {
00144 XERCES_CPP_NAMESPACE_USE
00145 String element(XmlHandlerHelper::transcodeXmlCharToString(localname));
00146
00147 if (element == ImagesetElement)
00148 {
00149 Logger::getSingleton().logEvent("Finished creation of Imageset '" + d_imageset->d_name + "' via XML file.", Informative);
00150 }
00151 }
00152
00153
00154 void Imageset_xmlHandler::warning(const XERCES_CPP_NAMESPACE::SAXParseException &exc)
00155 {
00156 throw(exc);
00157 }
00158
00159 void Imageset_xmlHandler::error(const XERCES_CPP_NAMESPACE::SAXParseException &exc)
00160 {
00161 throw(exc);
00162 }
00163
00164 void Imageset_xmlHandler::fatalError(const XERCES_CPP_NAMESPACE::SAXParseException &exc)
00165 {
00166 throw(exc);
00167 }
00168
00169 }