Добавлен парсер анимационных переходов
This commit is contained in:
parent
0191133720
commit
bef2e92ed4
@ -0,0 +1,117 @@
|
||||
package com.annimon.everlastingsummer.transitions;
|
||||
|
||||
import java.util.List;
|
||||
import android.graphics.Color;
|
||||
import com.annimon.everlastingsummer.Token;
|
||||
import com.annimon.everlastingsummer.TokenType;
|
||||
|
||||
/**
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public final class TransitionsParser {
|
||||
|
||||
private static final Token EOF = new Token("", TokenType.EOF);
|
||||
|
||||
public static void parse(List<Token> tokens) {
|
||||
new TransitionsParser(tokens).parse();
|
||||
}
|
||||
|
||||
private final List<Token> tokens;
|
||||
private final int tokensCount;
|
||||
private int position;
|
||||
|
||||
private TransitionsParser(List<Token> tokens) {
|
||||
this.tokens = tokens;
|
||||
tokensCount = tokens.size();
|
||||
position = 0;
|
||||
}
|
||||
|
||||
private void parse() {
|
||||
while (!match(TokenType.EOF)) {
|
||||
if (match(TokenType.DEFINE)) {
|
||||
final String name = consume(TokenType.WORD).getText();
|
||||
consume(TokenType.EQ);
|
||||
final String type = consume(TokenType.WORD).getText();
|
||||
if ("Fade".equals(type)) parseFade(name);
|
||||
else if ("Dissolve".equals(type)) parseDissolve(name);
|
||||
} else {
|
||||
position++;
|
||||
}
|
||||
}
|
||||
tokens.clear();
|
||||
}
|
||||
|
||||
private void parseFade(String name) {
|
||||
consume(TokenType.LPAREN);
|
||||
final int outTime = consumeTime();
|
||||
// TODO: consume(TokenType.COMMA)
|
||||
final int holdTime = consumeTime();
|
||||
// TODO: consume(TokenType.COMMA)
|
||||
final int inTime = consumeTime();
|
||||
|
||||
int color = Color.BLACK;
|
||||
if (!lookMatch(0, TokenType.RPAREN)) {
|
||||
// TODO: consume(TokenType.COMMA)
|
||||
// color? =?
|
||||
match(TokenType.WORD);
|
||||
match(TokenType.EQ);
|
||||
color = consumeColor();
|
||||
}
|
||||
consume(TokenType.RPAREN);
|
||||
Transitions.set(name, new Fade(outTime, holdTime, inTime, color));
|
||||
}
|
||||
|
||||
private void parseDissolve(String name) {
|
||||
consume(TokenType.LPAREN);
|
||||
final int time = consumeTime();
|
||||
consume(TokenType.RPAREN);
|
||||
Transitions.set(name, new Dissolve(time));
|
||||
}
|
||||
|
||||
|
||||
private int consumeTime() {
|
||||
return (int) (1000 * Double.parseDouble(consume(TokenType.NUMBER).getText()));
|
||||
}
|
||||
|
||||
private int consumeColor() {
|
||||
return parseColor( consume(TokenType.TEXT).getText() );
|
||||
}
|
||||
|
||||
private int parseColor(String text) {
|
||||
try {
|
||||
return Color.parseColor(text);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
// #fff
|
||||
int index = text.charAt(0) == '#' ? 1 : 0;
|
||||
if (text.length() != (index + 3)) return Color.BLACK;
|
||||
final StringBuilder sb = new StringBuilder(7);
|
||||
sb.append("#");
|
||||
sb.append(text.charAt(index)).append(text.charAt(index));
|
||||
index++;
|
||||
sb.append(text.charAt(index)).append(text.charAt(index));
|
||||
index++;
|
||||
sb.append(text.charAt(index)).append(text.charAt(index));
|
||||
return parseColor(sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean match(TokenType type) {
|
||||
if (get(0).getType() != type) return false;
|
||||
position++;
|
||||
return true;
|
||||
}
|
||||
|
||||
private Token consume(TokenType type) {
|
||||
if (get(0).getType() != type) throw new RuntimeException("Ожидался токен " + type + ".");
|
||||
return tokens.get(position++);
|
||||
}
|
||||
|
||||
private boolean lookMatch(int pos, TokenType type) {
|
||||
return (type == get(pos).getType());
|
||||
}
|
||||
|
||||
private Token get(int offset) {
|
||||
if (position + offset >= tokensCount) return EOF;
|
||||
return tokens.get(position + offset);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user