diff --git a/src/java/org/stathissideris/ascii2image/core/CommandLineConverter.java b/src/java/org/stathissideris/ascii2image/core/CommandLineConverter.java index 937953a..95dbe18 100644 --- a/src/java/org/stathissideris/ascii2image/core/CommandLineConverter.java +++ b/src/java/org/stathissideris/ascii2image/core/CommandLineConverter.java @@ -112,6 +112,31 @@ public static void main(String[] args){ .create() ); + cmdLnOptions.addOption( + OptionBuilder.withLongOpt("font-family") + .withDescription("Font Family.") + .hasArg() + .withArgName("FONTFAMILY") + .create() + ); + + cmdLnOptions.addOption( + OptionBuilder.withLongOpt("font-size") + .withDescription("Font Size.") + .hasArg() + .withArgName("FONTSIZE") + .create() + ); + + cmdLnOptions.addOption( + OptionBuilder.withLongOpt("short-color-codes") + .withDescription("Short Custom Color Codes.") + .hasArg() + .withArgName("SHORTCOLORCODES") + .create() + ); + + //TODO: uncomment this for next version: // cmdLnOptions.addOption( // OptionBuilder.withLongOpt("config") diff --git a/src/java/org/stathissideris/ascii2image/core/ConversionOptions.java b/src/java/org/stathissideris/ascii2image/core/ConversionOptions.java index 5599f65..4e77926 100644 --- a/src/java/org/stathissideris/ascii2image/core/ConversionOptions.java +++ b/src/java/org/stathissideris/ascii2image/core/ConversionOptions.java @@ -22,6 +22,7 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.stathissideris.ascii2image.graphics.CustomShapeDefinition; +import org.stathissideris.ascii2image.graphics.FontMeasurer; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; @@ -114,6 +115,23 @@ public ConversionOptions(CommandLine cmdLine) throws UnsupportedEncodingExceptio renderingOptions.setFontURL(cmdLine.getOptionValue("svg-font-url")); } + if (cmdLine.hasOption("short-color-codes")) { + processingOptions.setShortColorCodes(cmdLine.getOptionValue("short-color-codes")); + } + + if (cmdLine.hasOption(("font-family"))) { + processingOptions.setFontFamily(cmdLine.getOptionValue("font-family")); + FontMeasurer.instance().setFontFamilyName(processingOptions.getFontFamily()); + } + + if (cmdLine.hasOption(("font-size"))) { + processingOptions.setFontSize(cmdLine.getOptionValue("font-size")); + FontMeasurer.instance().setFontSize(Integer.parseInt(cmdLine.getOptionValue("font-size"))); + } + if (cmdLine.hasOption(("font-style"))) { + processingOptions.setFontSize(cmdLine.getOptionValue("font-style")); + FontMeasurer.setFontStyle(cmdLine.getOptionValue("font-style").equals("PLAIN")?Font.PLAIN:Font.BOLD); + } ConfigurationParser configParser = new ConfigurationParser(); try { for (Option curOption : cmdLine.getOptions()) { diff --git a/src/java/org/stathissideris/ascii2image/core/ProcessingOptions.java b/src/java/org/stathissideris/ascii2image/core/ProcessingOptions.java index 1833e9f..de0a372 100644 --- a/src/java/org/stathissideris/ascii2image/core/ProcessingOptions.java +++ b/src/java/org/stathissideris/ascii2image/core/ProcessingOptions.java @@ -19,7 +19,10 @@ */ package org.stathissideris.ascii2image.core; +import java.awt.*; +import java.security.InvalidParameterException; import java.util.HashMap; +import java.util.Map; import org.stathissideris.ascii2image.graphics.CustomShapeDefinition; @@ -37,6 +40,76 @@ public class ProcessingOptions { private boolean performSeparationOfCommonEdges = true; private boolean allCornersAreRound = false; + public String getFontFamily() { + return fontFamily; + } + + public void setFontFamily(final String fontFamily) { + this.fontFamily = fontFamily; + } + + public String getFontSize() { + return fontSize; + } + + public void setFontSize(final String fontSize) { + this.fontSize = fontSize; + } + + private String fontFamily; + private String fontSize; + private String fontStyle; + + public String getFontStyle() { + return fontStyle; + } + + public void setFontStyle(final String fontStyle) { + this.fontStyle = fontStyle; + } + + public boolean isShortColorCodes() { + return shortColorCodes != null; + } + public String getShortColorCodes() { + return shortColorCodes; + } + + public void setShortColorCodes(final String shortColorCodes) { + this.shortColorCodes = shortColorCodes; + shortColorCodeMap.put('0', new Color(0, 0, 0)); // Black + shortColorCodeMap.put('2', new Color(0x5*17, 0x5*17, 0xB*17)); //Blue + shortColorCodeMap.put('1', new Color(0x9*17, 0xD*17, 0x9*17)); //Green + shortColorCodeMap.put('3', new Color(0xF*17, 0xA*17, 0xA*17)); //Pink + shortColorCodeMap.put('4', new Color(0xE*17, 0x3*17, 0x2*17)); //Red (RED) + shortColorCodeMap.put('5', new Color(0xF*17, 0xF*17, 0x3*17)); //Yellow + shortColorCodeMap.put('6', new Color(0x1 * 17, 0x4*17, 0x4*17)); //BlackGreen (144) + shortColorCodeMap.put('7', new Color(0x1*17, 0x8*17, 0x8*17)); //DarkGreen (188) + shortColorCodeMap.put('8', new Color(0x8 * 17, 0x8*17, 0x8*17)); //Grey (888) + shortColorCodeMap.put('9', new Color(0xF*17, 0x7*17, 0x3*17)); //Orange (F73) + shortColorCodeMap.put('A', new Color(0xF*17, 0xD*17, 0xE*17)); //Light Pink (FDE) + shortColorCodeMap.put('B', new Color(0xB*17, 0xD*17, 0xE*17)); //Light Blue (BDE) + shortColorCodeMap.put('C', new Color(0x0*17, 0xB*17, 0xF*17)); //Bright Blue (0BF) + + if (shortColorCodes.length()==0) return; + String[] rgbList= shortColorCodes.split(";"); + Character currentKey= 'G'; + for (int i=0; i getShortColorCodeMap() { + return shortColorCodeMap; + } + + private HashMap shortColorCodeMap= new HashMap(); + public static final int USE_TAGS = 0; public static final int RENDER_TAGS = 1; public static final int IGNORE_TAGS = 2; @@ -238,6 +311,6 @@ public CustomShapeDefinition getFromCustomShapes(String tagName){ return customShapes.get(tagName); } - + } diff --git a/src/java/org/stathissideris/ascii2image/graphics/Diagram.java b/src/java/org/stathissideris/ascii2image/graphics/Diagram.java index ef3d66b..ba6cb10 100644 --- a/src/java/org/stathissideris/ascii2image/graphics/Diagram.java +++ b/src/java/org/stathissideris/ascii2image/graphics/Diagram.java @@ -383,7 +383,7 @@ public Diagram(TextGrid grid, ConversionOptions options) { //assign color codes to shapes //TODO: text on line should not change its color - Iterator cellColorPairs = grid.findColorCodes().iterator(); + Iterator cellColorPairs = grid.findColorCodes(options).iterator(); while(cellColorPairs.hasNext()){ TextGrid.CellColorPair pair = (TextGrid.CellColorPair) cellColorPairs.next(); @@ -513,7 +513,7 @@ public Diagram(TextGrid grid, ConversionOptions options) { //copy again workGrid = new TextGrid(grid); - workGrid.removeNonText(); + workGrid.removeNonText(options); // ****** handle text ******* diff --git a/src/java/org/stathissideris/ascii2image/graphics/FontMeasurer.java b/src/java/org/stathissideris/ascii2image/graphics/FontMeasurer.java index 6cdac3e..c364a43 100644 --- a/src/java/org/stathissideris/ascii2image/graphics/FontMeasurer.java +++ b/src/java/org/stathissideris/ascii2image/graphics/FontMeasurer.java @@ -36,8 +36,35 @@ * @author Efstathios Sideris */ public class FontMeasurer { - - private static final String fontFamilyName = "Dialog"; + + public static String getFontFamilyName() { + return fontFamilyName; + } + + public static void setFontFamilyName (String fontFamily) { + fontFamilyName= fontFamily; + } + + private static String fontFamilyName = "Dialog"; + private static int fontSize = 12; + private static int fontStyle = Font.BOLD; + + public static int getFontSize() { + return fontSize; + } + + public static void setFontSize(final int fontSize) { + FontMeasurer.fontSize = fontSize; + } + + public static int getFontStyle() { + return fontStyle; + } + + public static void setFontStyle(final int fontStyle) { + FontMeasurer.fontStyle = fontStyle; + } + //private static final String fontFamilyName = "Helvetica"; private static final boolean DEBUG = false; @@ -139,8 +166,8 @@ public Font getFontFor(int maxWidth, String string){ public Font getFontFor(int pixelHeight, FontRenderContext frc){ - float size = 12; - Font currentFont = new Font(fontFamilyName, Font.BOLD, (int) size); + float fontSizeInFloat= fontSize; + Font currentFont = new Font(fontFamilyName, fontStyle, fontSize); // Font currentFont = new Font("Times", Font.BOLD, (int) size); if(DEBUG) System.out.println(currentFont.getFontName()); //ascent is the distance between the baseline and the tallest character @@ -148,28 +175,28 @@ public Font getFontFor(int pixelHeight, FontRenderContext frc){ int direction; //direction of size change (towards smaller or bigger) if(ascent > pixelHeight){ - currentFont = currentFont.deriveFont(size - 1); - size--; + currentFont = currentFont.deriveFont(fontSizeInFloat - 1); + fontSizeInFloat--; direction = -1; } else { - currentFont = currentFont.deriveFont(size + 1); - size++; + currentFont = currentFont.deriveFont(fontSizeInFloat + 1); + fontSizeInFloat++; direction = 1; } - while(size > 0){ - currentFont = currentFont.deriveFont(size); + while(fontSizeInFloat > 0){ + currentFont = currentFont.deriveFont(fontSizeInFloat); //rectangle = currentFont.getStringBounds(testString, frc); ascent = getAscent(currentFont); if(direction == 1){ if(ascent > pixelHeight){ - size = size - 0.5f; - return currentFont.deriveFont(size); + fontSizeInFloat = fontSizeInFloat - 0.5f; + return currentFont.deriveFont(fontSizeInFloat); } - else size = size + 0.5f; + else fontSizeInFloat = fontSizeInFloat + 0.5f; } else { if(ascent < pixelHeight) return currentFont; - else size = size - 0.5f; + else fontSizeInFloat = fontSizeInFloat - 0.5f; } } return null; diff --git a/src/java/org/stathissideris/ascii2image/text/TextGrid.java b/src/java/org/stathissideris/ascii2image/text/TextGrid.java index 1ead278..b2c4d02 100644 --- a/src/java/org/stathissideris/ascii2image/text/TextGrid.java +++ b/src/java/org/stathissideris/ascii2image/text/TextGrid.java @@ -25,6 +25,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.stathissideris.ascii2image.core.ConversionOptions; import org.stathissideris.ascii2image.core.FileUtils; import org.stathissideris.ascii2image.core.ProcessingOptions; import org.stathissideris.ascii2image.graphics.CustomShapeDefinition; @@ -559,12 +560,12 @@ public boolean isBlankBetweenCharacters(Cell cell){ * Makes blank all the cells that contain non-text * elements. */ - public void removeNonText(){ + public void removeNonText(ConversionOptions options){ //the following order is significant //since the south-pointing arrowheads //are determined based on the surrounding boundaries removeArrowheads(); - removeColorCodes(); + removeColorCodes(options); removeBoundaries(); removeMarkupTags(); } @@ -580,14 +581,19 @@ public void removeArrowheads(){ } } - public void removeColorCodes(){ - Iterator cells = findColorCodes().iterator(); + public void removeColorCodes(ConversionOptions options){ + + Iterator cells = findColorCodes(options).iterator(); while(cells.hasNext()){ Cell cell = ((CellColorPair) cells.next()).cell; set(cell, ' '); cell = cell.getEast(); set(cell, ' '); - cell = cell.getEast(); set(cell, ' '); - cell = cell.getEast(); set(cell, ' '); + if (options.processingOptions.getShortColorCodes() == null) { + cell = cell.getEast(); + set(cell, ' '); + cell = cell.getEast(); + set(cell, ' '); + } } } @@ -628,24 +634,33 @@ public ArrayList findArrowheads(){ } - public ArrayList findColorCodes(){ - Pattern colorCodePattern = Pattern.compile("c[A-F0-9]{3}"); + public ArrayList findColorCodes(ConversionOptions options){ + Pattern colorCodePattern = + options.processingOptions.isShortColorCodes()? + Pattern.compile("z[A-Z0-9]"): + Pattern.compile("c[A-F0-9]{3}"); + int colorCodeWidth= options.processingOptions.isShortColorCodes()?2:4; ArrayList result = new ArrayList(); int width = getWidth(); int height = getHeight(); for(int yi = 0; yi < height; yi++){ - for(int xi = 0; xi < width - 3; xi++){ + for(int xi = 0; xi < width - colorCodeWidth-1; xi++){ Cell cell = new Cell(xi, yi); - String s = getStringAt(cell, 4); + String s = getStringAt(cell, colorCodeWidth); Matcher matcher = colorCodePattern.matcher(s); if(matcher.matches()){ - char cR = s.charAt(1); - char cG = s.charAt(2); - char cB = s.charAt(3); - int r = Integer.valueOf(String.valueOf(cR), 16).intValue() * 17; - int g = Integer.valueOf(String.valueOf(cG), 16).intValue() * 17; - int b = Integer.valueOf(String.valueOf(cB), 16).intValue() * 17; - result.add(new CellColorPair(cell, new Color(r, g, b))); + if (options.processingOptions.isShortColorCodes()) { + Color c= options.processingOptions.getShortColorCodeMap().getOrDefault(s.charAt(1), Color.white); + result.add(new CellColorPair(cell, c)); + } else { + char cR = s.charAt(1); + char cG = s.charAt(2); + char cB = s.charAt(3); + int r = Integer.valueOf(String.valueOf(cR), 16).intValue() * 17; + int g = Integer.valueOf(String.valueOf(cG), 16).intValue() * 17; + int b = Integer.valueOf(String.valueOf(cB), 16).intValue() * 17; + result.add(new CellColorPair(cell, new Color(r, g, b))); + } } } }