- assert (doubleFont != null);
-
- BufferedImage image = null;
-
- image = glyphCache.get(cell);
- if (image == null) {
- // Generate glyph and draw it to an image.
- image = new BufferedImage(textWidth * 2, textHeight * 2,
- BufferedImage.TYPE_INT_ARGB);
- Graphics2D gr2 = image.createGraphics();
- gr2.setFont(doubleFont);
-
- // Draw the background rectangle, then the foreground character.
- if (getScreen() instanceof ECMA48Terminal) {
- // BUG: the background color is coming in the same as the
- // foreground color. For now, don't draw it.
- } else {
- gr2.setColor(SwingTerminal.attrToBackgroundColor(cell));
- gr2.fillRect(0, 0, image.getWidth(), image.getHeight());
- }
- gr2.setColor(SwingTerminal.attrToForegroundColor(cell));
- char [] chars = new char[1];
- chars[0] = cell.getChar();
- gr2.drawChars(chars, 0, 1, doubleTextAdjustX,
- (textHeight * 2) - doubleMaxDescent + doubleTextAdjustY);
-
- if (cell.isUnderline() && (line.getDoubleHeight() != 1)) {
- gr2.fillRect(0, textHeight - 2, textWidth, 2);
- }
- gr2.dispose();
-
- // Now save this generated image, using a new key that will not
- // be mutated by invertCell().
- Cell key = new Cell();
- key.setTo(cell);
- glyphCache.put(key, image);
- }
-
- // Now that we have the double-wide glyph drawn, copy the right
- // pieces of it to the cells.
- Cell left = new Cell();
- Cell right = new Cell();
- left.setTo(cell);
- right.setTo(cell);
- right.setChar(' ');
- BufferedImage leftImage = null;
- BufferedImage rightImage = null;
- switch (line.getDoubleHeight()) {
- case 1:
- // Top half double height
- leftImage = image.getSubimage(0, 0, textWidth, textHeight);
- rightImage = image.getSubimage(textWidth, 0, textWidth, textHeight);
- break;
- case 2:
- // Bottom half double height
- leftImage = image.getSubimage(0, textHeight, textWidth, textHeight);
- rightImage = image.getSubimage(textWidth, textHeight,
- textWidth, textHeight);
- break;
- default:
- // Either single height double-width, or error fallback
- BufferedImage wideImage = new BufferedImage(textWidth * 2,
- textHeight, BufferedImage.TYPE_INT_ARGB);
- Graphics2D grWide = wideImage.createGraphics();
- grWide.drawImage(image, 0, 0, wideImage.getWidth(),
- wideImage.getHeight(), null);
- grWide.dispose();
- leftImage = wideImage.getSubimage(0, 0, textWidth, textHeight);
- rightImage = wideImage.getSubimage(textWidth, 0, textWidth,
- textHeight);
- break;
- }
- left.setImage(leftImage);
- right.setImage(rightImage);
- putCharXY(x, y, left);
- putCharXY(x + 1, y, right);
- }
-
- /**
- * Set up the single and double-width fonts.
- *
- * @param fontSize the size of font to request for the single-width font.
- * The double-width font will be 2x this value.
- */
- private void setupFonts(final int fontSize) {
- try {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- InputStream in = loader.getResourceAsStream(SwingTerminal.FONTFILE);
- Font terminusRoot = Font.createFont(Font.TRUETYPE_FONT, in);
- Font terminusDouble = terminusRoot.deriveFont(Font.PLAIN,
- fontSize * 2);
- doubleFont = terminusDouble;
- } catch (java.awt.FontFormatException e) {
- new TExceptionDialog(getApplication(), e);
- doubleFont = new Font(Font.MONOSPACED, Font.PLAIN, fontSize * 2);
- } catch (java.io.IOException e) {
- new TExceptionDialog(getApplication(), e);
- doubleFont = new Font(Font.MONOSPACED, Font.PLAIN, fontSize * 2);
- }
-
- // Get font descent.
- BufferedImage image = new BufferedImage(fontSize * 10, fontSize * 10,
- BufferedImage.TYPE_INT_ARGB);
- Graphics2D gr = image.createGraphics();
- gr.setFont(doubleFont);
- FontMetrics fm = gr.getFontMetrics();
- doubleMaxDescent = fm.getMaxDescent();
-
- gr.dispose();
-
- // (Re)create the glyph cache.
- glyphCache = new HashMap<Cell, BufferedImage>();