Image mapping

This commit is contained in:
marcin.sciesinski
2019-10-08 09:05:05 -07:00
parent 1cebf75fa3
commit 26e9b949e4
4 changed files with 880 additions and 805 deletions

View File

@@ -63,6 +63,9 @@ public class ImageGenerator {
}
ImageGenerator generator = new ImageGenerator(properties, new File(properties.getProperty("recipe.file")));
generator.generateImagesFromCardsFile(new File(args[1]));
File folder = new File(args[1]);
for (File file : folder.listFiles()) {
generator.generateImagesFromCardsFile(file);
}
}
}

View File

@@ -272,7 +272,13 @@ public class JSONImageRecipe implements ImageRecipe {
} else if (type.equalsIgnoreCase("map")) {
final Function<RenderContext, String> key = createStringProvider(stringObj.get("key"));
Map<String, String> map = (Map<String, String>) stringObj.get("map");
return renderContext -> map.get(key.apply(renderContext));
return renderContext -> {
final String mapKey = key.apply(renderContext);
final String value = map.get(mapKey);
if (value == null)
throw new ImageGenerationException("Missing value in map for key: " + mapKey);
return value;
};
} else if (type.equalsIgnoreCase("replace")) {
final Function<RenderContext, String> source = createStringProvider(stringObj.get("source"));
final Function<RenderContext, String> match = createStringProvider(stringObj.get("match"));

View File

@@ -30,25 +30,36 @@ public class TextBoxLayerRecipe implements LayerRecipe {
@Override
public void renderLayer(RenderContext renderContext, Graphics2D graphics) {
final String[] textLines = text.apply(renderContext);
if (textLines.length > 0) {
AttributedCharacterIterator[] iteratorLines = new AttributedCharacterIterator[textLines.length];
for (int i = 0; i < textLines.length; i++) {
iteratorLines[i] = createAttributedCharacterIterator(textLines[i], renderContext);
}
AttributedCharacterIterator[] iteratorLines = new AttributedCharacterIterator[textLines.length];
for (int i = 0; i < textLines.length; i++) {
iteratorLines[i] = createAttributedCharacterIterator(textLines[i], renderContext);
}
final TextBox box = textBox.apply(renderContext);
final TextBox box = textBox.apply(renderContext);
// graphics.setPaint(Color.WHITE);
// graphics.fillRect(box.getX(), box.getY(), box.getWidth(), box.getHeight());
Point2D.Float pen = new Point2D.Float(box.getX(), box.getY());
FontRenderContext frc = graphics.getFontRenderContext();
FontRenderContext frc = graphics.getFontRenderContext();
// Dry run to check for height
float textHeight = processText((layout, x, y) -> {
}, iteratorLines, 0, 0, box.getWidth(), frc);
float textAscent = Math.min(0.125f, (1 - textHeight / box.getHeight()) / 2f) * box.getHeight();
processText((layout, x, y) -> layout.draw(graphics, x, y), iteratorLines, box.getX(), box.getY() + textAscent, box.getWidth(), frc);
}
}
private float processText(LineRenderingCallback callback, AttributedCharacterIterator[] iteratorLines, float x, float y, float width, FontRenderContext frc) {
Point2D.Float pen = new Point2D.Float(x, y);
for (AttributedCharacterIterator styledText : iteratorLines) {
// let styledText be an AttributedCharacterIterator containing at least
// one character
LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);
float wrappingWidth = box.getWidth();
float wrappingWidth = width;
while (measurer.getPosition() < styledText.getEndIndex()) {
TextLayout layout = measurer.nextLayout(wrappingWidth);
@@ -57,12 +68,13 @@ public class TextBoxLayerRecipe implements LayerRecipe {
float dx = layout.isLeftToRight() ?
0 : (wrappingWidth - layout.getAdvance());
layout.draw(graphics, pen.x + dx, pen.y);
callback.drawLine(layout, pen.x + dx, pen.y);
pen.y += layout.getDescent() + layout.getLeading();
}
// Paragraph break
pen.y += 2;
}
return pen.y;
}
private AttributedCharacterIterator createAttributedCharacterIterator(String text, RenderContext renderContext) {
@@ -132,4 +144,8 @@ public class TextBoxLayerRecipe implements LayerRecipe {
private interface TextParsingCallback {
void appendText(String text, String style);
}
private interface LineRenderingCallback {
void drawLine(TextLayout layout, float x, float y);
}
}

File diff suppressed because it is too large Load Diff