1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/* bzflag
* Copyright (c) 1993 - 2005 Tim Riker
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the license found in the file
* named COPYING that should have accompanied this file.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "stdafx.h"
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include "TextToolBatch.h"
TextToolBatch::TextToolBatch() : position(0)
{
}
TextToolBatch::TextToolBatch(std::string file) : position(0)
{
loadFile(file);
}
TextToolBatch::~TextToolBatch()
{
}
void TextToolBatch::loadFile(std::string file)
{
std::ifstream* input = new std::ifstream(file.c_str(), std::ios::in);
char* buffer = new char[256];
bool group = false;
std::string font;
std::string flags;
std::vector<int> sizes;
std::string filename;
int minAASize;
while (input->good()) {
buffer[0] = 0;
// trim leading ws
ws(*input);
// read a line
input->getline(buffer, 256);
// ignore and read next line if comment or blank
if (buffer[0] == 0) continue;
if (buffer[0] == '#') continue;
if (strcmp(buffer, "group") == 0) {
// error if "group" and already in group
if (group) error("group: Already in group");
// set flag and read next line if "group" and not already in group
else group = true;
// read next line
continue;
} else if (strcmp(buffer, "end") == 0) {
// error if "end" and not in group
if (!group) error("end: Not in group");
// unset flag, create items, and read next line if "end" and in group
else {
group = false;
for (unsigned int i = 0; i < sizes.size(); i++) {
BatchItem temp;
// set font face
temp.font = font;
// set font flags (just bold and italic; underline and strikethrough are just lines)
int index = flags.find("bold", 0);
if (index >= 0) temp.bold = true; else temp.bold = false;
index = flags.find("italic", 0);
if (index >= 0) temp.italic = true; else temp.italic = false;
// set font size
temp.size = sizes[i];
// set AA quality
if (temp.size >= minAASize) temp.antiAlias = true; else temp.antiAlias = false;
// set filename (with $s -> size transform)
char* buf = new char[5];
sprintf(buf, "%d", sizes[i]);
std::string tmp = filename;
tmp.replace(tmp.find("$s"), 2, buf);
temp.filename = tmp;
items.push_back(temp);
}
sizes.clear();
minAASize = 16; // default to AAing 16-point and bigger
}
// read next line
continue;
}
// error if not in group
if (!group) error("command: Not in group");
// parse "font", "flags", "sizes", "filename" into the structure
if (strncmp(buffer, "font", 4) == 0) {
font = std::string(buffer + 5);
} else if (strncmp(buffer, "flags", 5) == 0) {
flags = std::string(buffer + 6);
} else if (strncmp(buffer, "sizes", 5) == 0) {
std::string tmp = std::string(buffer + 6);
unsigned int x = 0;
unsigned int y = tmp.size();
while (x < tmp.size()) {
y = tmp.find(" ", x + 1);
std::string sizestr = tmp.substr(x, y);
int sizeint = atoi(sizestr.c_str());
sizes.push_back(sizeint);
x = y;
}
} else if (strncmp(buffer, "filename", 8) == 0) {
filename = std::string(buffer + 9);
} else if (strncmp(buffer, "minaasize", 9) == 0) {
minAASize = atoi(buffer + 9);
} else {
error("command: unrecognized");
}
}
delete[] buffer;
}
bool TextToolBatch::getNext(BatchItem& item)
{
if (position >= items.size())
return false;
item = items[position++];
return true;
}
void TextToolBatch::error(std::string msg)
{
std::cerr << msg << std::endl;
exit(-2);
}
|