Esempio n. 1
0
void xmldata::loadLangFile(core::stringc  filename )
{
		core::stringc file="../media/";
		file+=filename;
		if (!device)
		{ 
			printf("Problems!\n");
			return;
		}

		const u32 starttime = device->getTimer()->getRealTime();
		io::IXMLReaderUTF8* xml = device->getFileSystem()->createXMLReaderUTF8(file.c_str());

		Lang CurrentLang;

		bool inside = false;
		bool found = false;

		// Language counter (using the XML hierachy)
		u32 count = 0;
		u32 linecount = 0;
		u32 linecount2 = 0;

		wchar_t out[255];

        while(xml && xml->read())
        {
                switch(xml->getNodeType())
                {
                case io::EXN_TEXT:		
                        break;

                case io::EXN_ELEMENT:
                {
					
						if ((core::stringw("text") == xml->getNodeName()))
						{

								// utf8toWchar was introducted in Irrlicht 1.9
								// This will allow IRB to save/load strings encoded in UTF8 to it's platform native WCHAR format.
								
								utf8ToWchar(xml->getAttributeValue("id"), out, 255);
								CurrentLang.name = stringw(out);
								
								utf8ToWchar(xml->getAttributeValue("str"), out, 255);
								CurrentLang.text = stringw(out);
	
								LANGManager::getInstance()->language.push_back(CurrentLang);
								linecount++;
						}
						if (core::stringw("about") == xml->getNodeName())
						{

								CurrentLang.name=L"txt_about";
								utf8ToWchar(xml->getAttributeValue("str"), out, 255);
								CurrentLang.text=stringw(out);
								LANGManager::getInstance()->aboutext.push_back(CurrentLang);
								
						}
				}
                break;

				case io::EXN_ELEMENT_END:
					if (!inside)
					{
						linecount=0;
						linecount2=0;
					}

					if (inside)
						count++;

					inside = false;
					break;
                default:
                        break;
                }
        }


        if (xml)
                xml->drop(); // don't forget to delete the xml reader

}
Esempio n. 2
0
unsigned int draw_freetype_font(char** image, unsigned* image_width, unsigned* image_height, void* font_info, unsigned long font_index, size_t font_size, unsigned int x, unsigned int y, const char* cstr)
{
	size_t len = strlen(cstr) + 1;
	wchar_t* str = new wchar_t[len];
	wmemset(str, 0, len);
	utf8ToWchar(str, len, cstr);

	if(!font_info)return -1;
	FT_Face face = *(reinterpret_cast<FT_Face*>(font_info) + font_index);

	FT_Size_RequestRec size_req;
	size_req.type = FT_SIZE_REQUEST_TYPE_CELL;
	size_req.width = 0;
	size_req.height = font_size << 6;
	size_req.horiResolution = 0;
	size_req.vertResolution = 0;

	if (FT_Request_Size(face, &size_req))
	{
		return -1;
	}

 	if (*image)
	{
		unsigned int pen_x = x;
		unsigned int pen_y = y + static_cast<unsigned int>(face->ascender * face->size->metrics.y_ppem / face->units_per_EM);

		RasterInfo raster_info;
		raster_info.image = *image;
		raster_info.width = *image_width;

		FT_Raster_Params raster_params = {};
		raster_params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT | FT_RASTER_FLAG_CLIP;
		raster_params.gray_spans = static_cast<FT_Raster_Span_Func>(rasterSpanFunc);
		raster_params.user = &raster_info;
		raster_params.clip_box.yMin = pen_y - *image_height;
		raster_params.clip_box.yMax = pen_y;

		FT_GlyphSlot glyph_slot = face->glyph;

		for ( ; *str != L'\0'; str++)
		{
			if (FT_Load_Char(face, *str, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP))
			{
				return -1;
			}

			if (glyph_slot->format != FT_GLYPH_FORMAT_OUTLINE)
			{
				return -1;
			}

			raster_params.clip_box.xMin = -pen_x;
			raster_params.clip_box.xMax = *image_width - pen_x;

			raster_info.pen_x = pen_x;
			raster_info.pen_y = pen_y;

			if (FT_Outline_Render(s_freetype, &glyph_slot->outline, &raster_params))
			{
				return -1;
			}

			pen_x += glyph_slot->advance.x >> 6;
		}

		return pen_x - x;
	}
	else
	{
Esempio n. 3
0
void xmldata::loadLang(IrrlichtDevice * device)
{
	// --> Loader code
	// read configuration from xml file
	this->device=device;
		const u32 starttime = device->getTimer()->getRealTime();
        io::IXMLReaderUTF8* xml = device->getFileSystem()->createXMLReaderUTF8("../media/lang.xml");

		Lang CurrentLang;

		core::stringc  MessageText = "";
		core::stringc  language = "";
		core::stringc  description = "";
		core::stringc  filename = "";
		core::stringw  result = L"";

		bool inside = false;
		bool found = false;

		// Language counter (using the XML hierachy)
		u32 count = 0;
		u32 linecount = 0;
		u32 linecount2 = 0;

        while(xml && xml->read())
        {
                switch(xml->getNodeType())
                {
                case io::EXN_TEXT:		
                        break;

                case io::EXN_ELEMENT:
                {
					
						if (core::stringw("language") == xml->getNodeName())
						{
							linecount=0;
							linecount2=0;
							if (!inside) 
							{
								inside=true;							
							}

                            language = stringc(xml->getAttributeValue("name"));
							description = stringc(xml->getAttributeValue("description"));								
							if (LANGManager::getInstance()->defaultLanguage==language)
							{
								found=true; //Get the filename of the xml file for the lang if it's the current one and if it's exist
								filename = stringc(xml->getAttributeValue("filename"));
							}
						}

						if ((core::stringw("text") == xml->getNodeName()) && filename=="" && (language==LANGManager::getInstance()->defaultLanguage))
						{

								wchar_t out[255];

								utf8ToWchar(xml->getAttributeValue("id"), out, 255);
								CurrentLang.name = stringw(out);
								
								utf8ToWchar(xml->getAttributeValue("str"), out, 255);
								CurrentLang.text=stringw(out);

								LANGManager::getInstance()->language.push_back(CurrentLang);
								linecount++;
						}
						if (core::stringw("about") == xml->getNodeName() && filename=="" && (language==LANGManager::getInstance()->defaultLanguage))
						{
								wchar_t out[255];
								CurrentLang.name=L"txt_about";
								utf8ToWchar(xml->getAttributeValue("str"), out, 255);
								CurrentLang.text=stringw(out);
								LANGManager::getInstance()->aboutext.push_back(CurrentLang);
						}
				}
                break;

				case io::EXN_ELEMENT_END:
					if (!inside)
					{
						linecount=0;
						linecount2=0;
					}

					if (inside)
						count++;

					inside = false;
					break;
                default:
                        break;
                }
        }

		/*
		core::stringw countstr = ((core::stringw)L"Language count: ")+(core::stringw)(count);
		stats->addItem(countstr.c_str());

		const u32 endtime = device->getTimer()->getRealTime();
		u32 time = endtime-starttime;

		stats->addItem(((core::stringw)L"Parse time used: "+(core::stringw)time+L" ms.").c_str()); */

        if (xml)
                xml->drop(); // don't forget to delete the xml reader

		if (filename!="") // If the langage string is not stored in lang, get it from the associated filename.
			loadLangFile(filename);
	// <-- Loader code

}