| Index: src/gpu/gl/builders/GrGLSLPrettyPrint.cpp
|
| diff --git a/src/gpu/gl/builders/GrGLSLPrettyPrint.cpp b/src/gpu/gl/builders/GrGLSLPrettyPrint.cpp
|
| index 27f4b44e66b87258d7f9131a7fed789aefd5485e..02802987c6007f58496920e03410cd6b176ba53b 100644
|
| --- a/src/gpu/gl/builders/GrGLSLPrettyPrint.cpp
|
| +++ b/src/gpu/gl/builders/GrGLSLPrettyPrint.cpp
|
| @@ -12,69 +12,86 @@ class GLSLPrettyPrint {
|
| public:
|
| GLSLPrettyPrint() {}
|
|
|
| - SkString prettify(const SkString& input, bool countlines) {
|
| - // setup pretty state
|
| - fIndex = 0;
|
| - fLength = input.size();
|
| - fInput = input;
|
| + SkString prettify(const char** strings,
|
| + int* lengths,
|
| + int count,
|
| + bool countlines) {
|
| fCountlines = countlines;
|
| fTabs = 0;
|
| fLinecount = 1;
|
| fFreshline = true;
|
|
|
| + // If a string breaks while in the middle 'parse until' we need to continue parsing on the
|
| + // next string
|
| + fInParseUntilNewline = false;
|
| + fInParseUntil = false;
|
| +
|
| int parensDepth = 0;
|
| +
|
| // number 1st line
|
| this->lineNumbering();
|
| - while (fLength > fIndex) {
|
| - /* the heart and soul of our prettification algorithm. The rules should hopefully be
|
| - * self explanatory. For '#' and '//' tokens we parse until we reach a newline.
|
| - *
|
| - * For long style comments like this one, we search for the ending token. We also
|
| - * preserve whitespace in these comments WITH THE CAVEAT that we do the newlines
|
| - * ourselves. This allows us to remain in control of line numbers, and matching tabs
|
| - * Existing tabs in the input string are copied over too, but this will look funny
|
| - *
|
| - * '{' and '}' are handled in basically the same way. We add a newline if we aren't
|
| - * on a fresh line, dirty the line, then add a second newline, ie braces are always
|
| - * on their own lines indented properly. The one funkiness here is structs print with
|
| - * the semicolon on its own line. Its not a problem for a glsl compiler though
|
| - *
|
| - * '(' and ')' are basically ignored, except as a sign we need to ignore ';' ala
|
| - * in for loops.
|
| - *
|
| - * ';' means add a new line
|
| - *
|
| - * '\t' and '\n' are ignored in general parsing for backwards compatability with
|
| - * existing shader code and we also have a special case for handling whitespace
|
| - * at the beginning of fresh lines.
|
| - *
|
| - * Otherwise just add the new character to the pretty string, indenting if necessary.
|
| - */
|
| - if (this->hasToken("#") || this->hasToken("//")) {
|
| - this->parseUntilNewline();
|
| - } else if (this->hasToken("/*")) {
|
| - this->parseUntil("*/");
|
| - } else if ('{' == fInput[fIndex]) {
|
| - this->newline();
|
| - this->appendChar('{');
|
| - fTabs++;
|
| - this->newline();
|
| - } else if ('}' == fInput[fIndex]) {
|
| - fTabs--;
|
| - this->newline();
|
| - this->appendChar('}');
|
| - this->newline();
|
| - } else if (this->hasToken(")")) {
|
| - parensDepth--;
|
| - } else if (this->hasToken("(")) {
|
| - parensDepth++;
|
| - } else if (!parensDepth && this->hasToken(";")) {
|
| - this->newline();
|
| - } else if ('\t' == fInput[fIndex] || '\n' == fInput[fIndex] ||
|
| - (fFreshline && ' ' == fInput[fIndex])) {
|
| - fIndex++;
|
| - } else {
|
| - this->appendChar(input[fIndex]);
|
| + for (int i = 0; i < count; i++) {
|
| + // setup pretty state
|
| + fIndex = 0;
|
| + fLength = lengths[i];
|
| + fInput = strings[i];
|
| +
|
| + while (fLength > fIndex) {
|
| + /* the heart and soul of our prettification algorithm. The rules should hopefully
|
| + * be self explanatory. For '#' and '//' tokens we parse until we reach a newline.
|
| + *
|
| + * For long style comments like this one, we search for the ending token. We also
|
| + * preserve whitespace in these comments WITH THE CAVEAT that we do the newlines
|
| + * ourselves. This allows us to remain in control of line numbers, and matching
|
| + * tabs Existing tabs in the input string are copied over too, but this will look
|
| + * funny
|
| + *
|
| + * '{' and '}' are handled in basically the same way. We add a newline if we aren't
|
| + * on a fresh line, dirty the line, then add a second newline, ie braces are always
|
| + * on their own lines indented properly. The one funkiness here is structs print
|
| + * with the semicolon on its own line. Its not a problem for a glsl compiler though
|
| + *
|
| + * '(' and ')' are basically ignored, except as a sign we need to ignore ';' ala
|
| + * in for loops.
|
| + *
|
| + * ';' means add a new line
|
| + *
|
| + * '\t' and '\n' are ignored in general parsing for backwards compatability with
|
| + * existing shader code and we also have a special case for handling whitespace
|
| + * at the beginning of fresh lines.
|
| + *
|
| + * Otherwise just add the new character to the pretty string, indenting if necessary.
|
| + */
|
| + if (fInParseUntilNewline) {
|
| + this->parseUntilNewline();
|
| + } else if (fInParseUntil) {
|
| + this->parseUntil(fInParseUntilToken);
|
| + } else if (this->hasToken("#") || this->hasToken("//")) {
|
| + this->parseUntilNewline();
|
| + } else if (this->hasToken("/*")) {
|
| + this->parseUntil("*/");
|
| + } else if ('{' == fInput[fIndex]) {
|
| + this->newline();
|
| + this->appendChar('{');
|
| + fTabs++;
|
| + this->newline();
|
| + } else if ('}' == fInput[fIndex]) {
|
| + fTabs--;
|
| + this->newline();
|
| + this->appendChar('}');
|
| + this->newline();
|
| + } else if (this->hasToken(")")) {
|
| + parensDepth--;
|
| + } else if (this->hasToken("(")) {
|
| + parensDepth++;
|
| + } else if (!parensDepth && this->hasToken(";")) {
|
| + this->newline();
|
| + } else if ('\t' == fInput[fIndex] || '\n' == fInput[fIndex] ||
|
| + (fFreshline && ' ' == fInput[fIndex])) {
|
| + fIndex++;
|
| + } else {
|
| + this->appendChar(fInput[fIndex]);
|
| + }
|
| }
|
| }
|
| return fPretty;
|
| @@ -107,9 +124,11 @@ private:
|
| if ('\n' == fInput[fIndex]) {
|
| fIndex++;
|
| this->newline();
|
| + fInParseUntilNewline = false;
|
| break;
|
| }
|
| fPretty.appendf("%c", fInput[fIndex++]);
|
| + fInParseUntilNewline = true;
|
| }
|
| }
|
|
|
| @@ -127,10 +146,13 @@ private:
|
| fIndex++;
|
| }
|
| if (this->hasToken(token)) {
|
| + fInParseUntil = false;
|
| break;
|
| }
|
| fFreshline = false;
|
| fPretty.appendf("%c", fInput[fIndex++]);
|
| + fInParseUntil = true;
|
| + fInParseUntilToken = token;
|
| }
|
| }
|
|
|
| @@ -162,12 +184,21 @@ private:
|
| bool fCountlines, fFreshline;
|
| int fTabs, fLinecount;
|
| size_t fIndex, fLength;
|
| - SkString fInput, fPretty;
|
| + const char* fInput;
|
| + SkString fPretty;
|
| +
|
| + // Some helpers for parseUntil when we go over a string length
|
| + bool fInParseUntilNewline;
|
| + bool fInParseUntil;
|
| + const char* fInParseUntilToken;
|
| };
|
|
|
| -SkString PrettyPrintGLSL(const SkString& input, bool countlines) {
|
| +SkString PrettyPrintGLSL(const char** strings,
|
| + int* lengths,
|
| + int count,
|
| + bool countlines) {
|
| GLSLPrettyPrint pp;
|
| - return pp.prettify(input, countlines);
|
| + return pp.prettify(strings, lengths, count, countlines);
|
| }
|
|
|
| } // end namespace
|
|
|