static void normalise_path(std::string &result, const StringRange &path) { StringRange part(path.begin, path.end); if (!path.Empty() && (path[0] == '/')) { result += '/'; ++part.begin; } const size_t initial_result_length = result.size(); while (true) { part.end = part.FindChar('/'); // returns part.end if the char is not found if (part.Empty() || (part == ".")) { // skip this part } else if (part == "..") { // pop the last component if (result.size() <= initial_result_length) throw std::invalid_argument(path.ToString()); size_t pos = result.rfind('/'); if (pos == std::string::npos) { pos = 0; } assert(pos >= initial_result_length); result.erase(pos); } else { // push the new component if (result.size() > initial_result_length) result += '/'; result.append(part.begin, part.Size()); } if (part.end == path.end) { break; } assert(*part.end == '/'); part.begin = part.end + 1; part.end = path.end; } }
void DistanceFieldFont::ParseInfo(const StringRange &line) { std::stringstream ss(line.ToString()); std::string token; while (ss >> token != 0) { std::pair<std::string, std::string> pair; split_token(token, pair); if (pair.first == "size") { m_fontSize = get_value<float>(pair.second); return; } } }
void DistanceFieldFont::ParseCommon(const StringRange &line) { std::stringstream ss(line.ToString()); std::string token; while (ss >> token != 0) { std::pair<std::string, std::string> pair; split_token(token, pair); if (pair.first == "scaleW") m_sheetSize.x = get_value<float>(pair.second); else if (pair.first == "scaleH") m_sheetSize.y = get_value<float>(pair.second); } }
//get font definitions from a line of xml, insert glyph information into the map void DistanceFieldFont::ParseChar(const StringRange &r) { std::stringstream ss(r.ToString()); std::string token; Uint32 id = 0; double x = 0.0; double y = 0.0; double uSize = 0.0; double vSize = 0.0; double xoffset = 0.0; double yoffset = 0.0; double advance = 0.0; while (ss >> token) { std::pair<std::string, std::string> pair; split_token(token, pair); //only care about some values if (pair.first == "id") id = get_value<Uint32>(pair.second); else if (pair.first == "x") x = get_value<double>(pair.second); else if (pair.first == "y") y = get_value<double>(pair.second); else if (pair.first == "width") uSize = get_value<double>(pair.second); else if (pair.first == "height") vSize = get_value<double>(pair.second); else if (pair.first == "xoffset") xoffset = get_value<float>(pair.second); else if (pair.first == "yoffset") yoffset = get_value<float>(pair.second); else if (pair.first == "xadvance") advance = get_value<float>(pair.second); } const float scale = 1.f/m_fontSize; Glyph g; g.uv = vector2f(float(x)/m_sheetSize.x, float(y)/m_sheetSize.y); g.uvSize = vector2f(float(uSize)/m_sheetSize.x, float(vSize)/m_sheetSize.y); g.size = vector2f(float(uSize), float(vSize)) * scale; g.offset = vector2f(float(xoffset), float(m_lineHeight-vSize-yoffset)) * scale; g.xAdvance = advance * scale; m_glyphs[id] = g; }
void IniConfig::Read(const FileSystem::FileData &data) { StringRange buffer = data.AsStringRange(); buffer = buffer.StripUTF8BOM(); std::string section_name; MapType *section_map = 0; while (!buffer.Empty()) { StringRange line = buffer.ReadLine().StripSpace(); // if the line is a comment, skip it if (line.Empty() || (line[0] == '#')) continue; // check for a section header if ((line.Size() >= 2) && (line[0] == '[') && (line.end[-1] == ']')) { ++line.begin; --line.end; section_name = line.ToString(); section_map = 0; continue; } const char *kend = line.FindChar('='); // if there's no '=' sign, skip the line if (kend == line.end) { Output("WARNING: ignoring invalid line in config file:\n '%.*s'\n", int(line.Size()), line.begin); continue; } StringRange key(line.begin, kend); StringRange value(kend + 1, line.end); // strip whitespace key.end = key.RFindNonSpace(); value = value.StripSpace(); if (!section_map) section_map = &m_map[section_name]; (*section_map)[key.ToString()] = value.ToString(); } }
static void normalise_path(std::string &result, const StringRange &path) { StringRange part(path.begin, path.begin); const char *c = path.begin; if ((c != path.end) && (*c == '/')) { result += '/'; ++c; ++part.begin; } const size_t initial_result_length = result.size(); while (true) { if ((*c == '/') || (c == path.end)) { part.end = c; if (part.Empty() || (part == ".")) { // skip this part } else if (part == "..") { // pop the last component if (result.size() <= initial_result_length) throw std::invalid_argument(path.ToString()); size_t pos = result.rfind('/', result.size()-2); ++pos; assert(pos >= initial_result_length); result.erase(pos); } else { // push the new component if (part.end != path.end) { assert(*part.end == '/'); ++part.end; } result.append(part.begin, part.Size()); } part.begin = c+1; } if (c == path.end) { break; } ++c; } }