[Scummvm-cvs-logs] SF.net SVN: scummvm: [32782] scummvm/branches/gsoc2008-gui
Tanoku at users.sourceforge.net
Tanoku at users.sourceforge.net
Wed Jun 25 13:34:58 CEST 2008
Revision: 32782
http://scummvm.svn.sourceforge.net/scummvm/?rev=32782&view=rev
Author: Tanoku
Date: 2008-06-25 04:34:58 -0700 (Wed, 25 Jun 2008)
Log Message:
-----------
- Reverted getHostPlatformString() from util.cpp (Yeah, Max was right)
- XMLParser now supports streams!
- Added remaining key values for DrawStep parsing.
- XMLParser parserError() bugfixes.
Modified Paths:
--------------
scummvm/branches/gsoc2008-gui/common/xmlparser.cpp
scummvm/branches/gsoc2008-gui/common/xmlparser.h
scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp
Modified: scummvm/branches/gsoc2008-gui/common/xmlparser.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/common/xmlparser.cpp 2008-06-25 09:06:25 UTC (rev 32781)
+++ scummvm/branches/gsoc2008-gui/common/xmlparser.cpp 2008-06-25 11:34:58 UTC (rev 32782)
@@ -36,12 +36,13 @@
void XMLParser::debug_testEval() {
static const char *debugConfigText =
- "</* lol this is just a moronic test */drawdata id = \"mainmenu_bg\" cache = true>\n"
- "<drawstep| func = \"roundedsq\" fill = \"gradient\" gradient_start = \"255, 255, 128\" gradient_end = \"128, 128, 128\" size = \"auto\"/>\n"
- "//<drawstep func = \"roundedsq\" fill = \"none\" color = /*\"0, 0, 0\"*/\"0, 1, 2\" size = \"auto\"/>\n"
- "</ drawdata>/* lol this is just a simple test*/\n";
+ "</* lol this is just assa moronic test */drawdata id = \"mainmenu_bg\" cache = true>\n"
+ "<drawstep func = \"roundedsq\" fill = \"none\" color = \"0, 1, 2\" size = \"auto\" />\n"
+ "<drawstep func = \"roundedsqXD\" fill = \"none\" color = \"0, 1, 2\" size = \"auto\"/>\n"
+ "</ drawdata>/* lol this is just a simple test*/\n"
+ "I loled";
- _text = strdup(debugConfigText);
+ _text.fillFromMem(strdup(debugConfigText));
_fileName = strdup("test_parse.xml");
Common::String test = "12, 125, 125";
@@ -50,48 +51,42 @@
}
-void XMLParser::parserError(const char *error_string, ...) {
+void XMLParser::parserError(const char *errorString, ...) {
_state = kParserError;
int pos = _pos;
- int line_count = 1;
- int line_start = -1;
- int line_width = 1;
+ int lineCount = 1;
+ int lineStart = -1;
do {
if (_text[pos] == '\n' || _text[pos] == '\r') {
- line_count++;
+ lineCount++;
- if (line_start == -1)
- line_start = pos;
+ if (lineStart == -1)
+ lineStart = MAX(pos + 1, _pos - 60);
}
} while (pos-- > 0);
- line_start = MAX(line_start, _pos - 80);
+ char lineStr[70];
+ _text.stream()->seek(lineStart, SEEK_SET);
+ _text.stream()->readLine(lineStr, 70);
- do {
- if (_text[line_start + line_width] == '\n' || _text[line_start + line_width] == '\r')
- break;
- } while (_text[line_start + line_width++]);
+ printf(" File <%s>, line %d:\n", _fileName, lineCount);
- line_width = MIN(line_width, 80);
+ printf("%s%s%s\n",
+ lineStr[0] == '<' ? "" : "...",
+ lineStr[strlen(lineStr) - 1] == '>' ? "" : "...",
+ lineStr);
- char linestr[81];
- strncpy(linestr, &_text[line_start] + 1, line_width );
- linestr[line_width - 1] = 0;
-
- printf(" File <%s>, line %d:\n", _fileName, line_count);
-
- printf("%s\n", linestr);
- for (int i = 1; i < _pos - line_start; ++i)
+ for (int i = 0; i < _pos - lineStart + 3; ++i)
printf(" ");
printf("^\n");
printf("Parser error: ");
va_list args;
- va_start(args, error_string);
- vprintf(error_string, args);
+ va_start(args, errorString);
+ vprintf(errorString, args);
va_end(args);
printf("\n");
Modified: scummvm/branches/gsoc2008-gui/common/xmlparser.h
===================================================================
--- scummvm/branches/gsoc2008-gui/common/xmlparser.h 2008-06-25 09:06:25 UTC (rev 32781)
+++ scummvm/branches/gsoc2008-gui/common/xmlparser.h 2008-06-25 11:34:58 UTC (rev 32782)
@@ -30,6 +30,7 @@
#include "graphics/surface.h"
#include "common/system.h"
#include "common/xmlparser.h"
+#include "common/stream.h"
#include "common/hashmap.h"
#include "common/hash-str.h"
@@ -37,6 +38,43 @@
namespace Common {
+class XMLStream {
+protected:
+ SeekableReadStream *_stream;
+ int _pos;
+
+public:
+ XMLStream() : _stream(0), _pos(0) {}
+
+ ~XMLStream() {
+ delete _stream;
+ }
+
+ SeekableReadStream *stream() {
+ return _stream;
+ }
+
+ const char operator [](int idx) {
+ assert(_stream && idx >= 0);
+
+ if (_pos + 1 != idx)
+ _stream->seek(idx, SEEK_SET);
+
+ _pos = idx;
+
+ return _stream->readSByte();
+ }
+
+ void fillFromMem(const char *buffer, bool dispose = false) {
+ delete _stream;
+ _stream = new MemoryReadStream((const byte*)buffer, strlen(buffer), dispose);
+ }
+
+ void fillFromFile(const char *filename) {
+
+ }
+};
+
/**
* The base XMLParser class implements generic functionality for parsing
* XML-like files.
@@ -132,7 +170,7 @@
/**
* Prints an error message when parsing fails and stops the parser.
*/
- virtual void parserError(const char *errorString, ...);
+ virtual void parserError(const char *errorString, ...) GCC_PRINTF(1, 2);
/**
* Skips spaces/whitelines etc. Returns true if any spaces were skipped.
@@ -199,7 +237,7 @@
}
int _pos; /** Current position on the XML buffer. */
- char *_text; /** Buffer with the text being parsed */
+ XMLStream _text; /** Buffer with the text being parsed */
char *_fileName;
ParserState _state; /** Internal state of the parser */
Modified: scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp 2008-06-25 09:06:25 UTC (rev 32781)
+++ scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp 2008-06-25 11:34:58 UTC (rev 32782)
@@ -55,8 +55,10 @@
bool ThemeParser::keyCallback(Common::String keyName) {
// automatically handle with a function from the hash table.
- if (!_callbacks.contains(_activeKey.top()->name))
+ if (!_callbacks.contains(_activeKey.top()->name)) {
+ parserError("%s is not a valid key name.", keyName.c_str());
return false;
+ }
return (this->*(_callbacks[_activeKey.top()->name]))();
}
@@ -72,7 +74,7 @@
step->extraData = 0;
step->factor = 1;
- step->fillArea = false;
+ step->fillArea = true;
step->fillMode = Graphics::VectorRenderer::kFillDisabled;
step->scale = (1 << 16);
step->shadow = 0;
@@ -104,7 +106,7 @@
drawstep->drawingCall = _drawFunctions[functionName];
- uint32 red, green, blue;
+ uint32 red, green, blue, w, h;
/**
* Helper macro to sanitize and assign an integer value from a key
@@ -114,13 +116,18 @@
* assigned.
* @param key_name Name as STRING of the key identifier as it appears in the
* theme description format.
+ * @param force Sets if the key is optional or necessary.
*/
-#define __PARSER_ASSIGN_INT(struct_name, key_name) \
+#define __PARSER_ASSIGN_INT(struct_name, key_name, force) \
if (stepNode->values.contains(key_name)) { \
- if (!validateKeyInt(stepNode->values[key_name].c_str())) \
+ if (!validateKeyInt(stepNode->values[key_name].c_str())) {\
+ parserError("Error when parsing key value for '%s'.", key_name); \
return false; \
- \
+ } \
drawstep->struct_name = atoi(stepNode->values[key_name].c_str()); \
+ } else if (force) { \
+ parserError("Missing necessary key '%s'.", key_name); \
+ return false; \
}
/**
@@ -136,17 +143,20 @@
*/
#define __PARSER_ASSIGN_RGB(struct_name, key_name) \
if (stepNode->values.contains(key_name)) { \
- if (sscanf(stepNode->values[key_name].c_str(), "%d, %d, %d", &red, &green, &blue) != 3) \
- return false; \
- \
+ if (sscanf(stepNode->values[key_name].c_str(), "%d, %d, %d", &red, &green, &blue) != 3 || \
+ red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255) {\
+ parserError("Error when parsing color struct '%s'", stepNode->values[key_name].c_str());\
+ return false; \
+ }\
drawstep->struct_name.r = red; \
drawstep->struct_name.g = green; \
drawstep->struct_name.b = blue; \
+ drawstep->struct_name.set = true; \
}
- __PARSER_ASSIGN_INT(stroke, "stroke");
- __PARSER_ASSIGN_INT(shadow, "shadow");
- __PARSER_ASSIGN_INT(factor, "gradient_factor");
+ __PARSER_ASSIGN_INT(stroke, "stroke", false);
+ __PARSER_ASSIGN_INT(shadow, "shadow", false);
+ __PARSER_ASSIGN_INT(factor, "gradient_factor", false);
__PARSER_ASSIGN_RGB(fgColor, "fg_color");
__PARSER_ASSIGN_RGB(bgColor, "bg_color");
@@ -154,13 +164,45 @@
__PARSER_ASSIGN_RGB(gradColor2, "gradient_end");
if (functionName == "roundedsq" || functionName == "circle") {
- __PARSER_ASSIGN_INT(radius, "radius");
+ __PARSER_ASSIGN_INT(radius, "radius", true)
}
if (functionName == "bevelsq") {
- __PARSER_ASSIGN_INT(extraData, "bevel");
+ __PARSER_ASSIGN_INT(extraData, "bevel", true);
}
+ if (functionName == "triangle") {
+
+ }
+
+ if (stepNode->values.contains("size")) {
+ if (stepNode->values["size"] == "auto") {
+ drawstep->fillArea = true;
+ } else if (sscanf(stepNode->values["size"].c_str(), "%d, %d", &w, &h) == 2) {
+ drawstep->fillArea = false;
+ drawstep->w = w;
+ drawstep->h = h;
+ } else {
+ parserError("Invalid value in 'size' subkey: Valid options are 'auto' or 'X, X' to define width and height.");
+ return false;
+ }
+ }
+
+ if (stepNode->values.contains("fill")) {
+ if (stepNode->values["fill"] == "none")
+ drawstep->fillMode = VectorRenderer::kFillDisabled;
+ else if (stepNode->values["fill"] == "foreground")
+ drawstep->fillMode = VectorRenderer::kFillForeground;
+ else if (stepNode->values["fill"] == "background")
+ drawstep->fillMode = VectorRenderer::kFillBackground;
+ else if (stepNode->values["fill"] == "gradient")
+ drawstep->fillMode = VectorRenderer::kFillGradient;
+ else {
+ parserError("'%s' is not a valid fill mode for a shape.", stepNode->values["fill"].c_str());
+ return false;
+ }
+ }
+
#undef __PARSER_ASSIGN_INT
#undef __PARSER_ASSIGN_RGB
@@ -188,12 +230,15 @@
cached = true;
}
- if (drawdataNode->values.contains("platform")) {
+ // Both Max and Johannes suggest using a non-platform specfic approach based on available
+ // resources and active resolution. getHostPlatformString() has been removed, so fix this.
+
+/* if (drawdataNode->values.contains("platform")) {
if (drawdataNode->values["platform"].compareToIgnoreCase(Common::getHostPlatformString()) != 0) {
drawdataNode->ignore = true;
return true;
}
- }
+ }*/
if (g_InterfaceManager.addDrawData(id, cached) == false) {
parserError("Repeated DrawData: Only one set of Drawing Data for a widget may be specified on each platform.");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list