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 }
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 {
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 }