Skip to content

Commit 61c84bb

Browse files
committed
#446 font creator editing phase 1
1 parent 5cb1b48 commit 61c84bb

File tree

1 file changed

+46
-25
lines changed

1 file changed

+46
-25
lines changed

tcMenuGenerator/src/main/java/com/thecoderscorner/menu/editorui/gfxui/CreateFontUtilityController.java

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.thecoderscorner.menu.editorui.gfxui;
22

3+
import com.thecoderscorner.menu.domain.state.PortableColor;
4+
import com.thecoderscorner.menu.domain.util.PortablePalette;
35
import com.thecoderscorner.menu.editorui.dialog.AppInformationPanel;
46
import com.thecoderscorner.menu.editorui.dialog.SelectUnicodeRangesDialog;
57
import com.thecoderscorner.menu.editorui.generator.core.VariableNameGenerator;
68
import com.thecoderscorner.menu.editorui.gfxui.TcUnicodeFontExporter.TcUnicodeFontBlock;
9+
import com.thecoderscorner.menu.editorui.gfxui.imgedit.SimpleImagePane;
10+
import com.thecoderscorner.menu.editorui.gfxui.pixmgr.BmpDataManager;
11+
import com.thecoderscorner.menu.editorui.gfxui.pixmgr.NativeBmpBitPacker;
12+
import com.thecoderscorner.menu.editorui.gfxui.pixmgr.NativePixelFormat;
713
import com.thecoderscorner.menu.editorui.uimodel.CurrentProjectEditorUI;
814
import com.thecoderscorner.menu.editorui.util.SafeNavigator;
915
import javafx.collections.FXCollections;
@@ -15,11 +21,9 @@
1521
import javafx.scene.control.MenuItem;
1622
import javafx.scene.control.TextField;
1723
import javafx.scene.control.*;
18-
import javafx.scene.image.Image;
19-
import javafx.scene.image.ImageView;
20-
import javafx.scene.image.WritableImage;
24+
import javafx.scene.layout.BorderPane;
2125
import javafx.scene.layout.GridPane;
22-
import javafx.scene.paint.Color;
26+
import javafx.scene.layout.Pane;
2327
import javafx.stage.Stage;
2428

2529
import javax.swing.*;
@@ -59,7 +63,7 @@ public class CreateFontUtilityController {
5963
private Path currentDir;
6064
private LoadedFont loadedFont = NO_LOADED_FONT;
6165
private Set<UnicodeBlockMapping> blockMappings = Set.of();
62-
private final Map<UnicodeBlockMapping,List<ToggleButton>> controlsByBlock = new HashMap<>();
66+
private final Map<UnicodeBlockMapping,List<FontGlyphDataControl>> controlsByBlock = new HashMap<>();
6367
private final Map<Integer, Boolean> currentlySelected = new HashMap<>();
6468

6569
public void initialise(CurrentProjectEditorUI editorUI, String homeDirectory) {
@@ -136,29 +140,24 @@ private void recalcFont() {
136140

137141
gridRow++;
138142

139-
var allButtons = new ArrayList<ToggleButton>();
143+
var allButtons = new ArrayList<FontGlyphDataControl>();
140144
int gridCol = 0;
141145
for(int i = minimumStartingCode(blockRange); i<blockRange.getEndingCode(); i++) {
142146
var maybeGlyph = loadedFont.getConvertedGlyph(i);
143147
if (maybeGlyph.isPresent()) {
144148
var glyph = maybeGlyph.get();
145-
Image img = fromGlyphToImg(glyph);
146-
var toggleButton = new ToggleButton("U" + glyph.code() + " : " + new String(Character.toChars(glyph.code())));
147-
ImageView fontImg = new ImageView(img);
148-
fontImg.fitHeightProperty().bind(fontRenderArea.getScene().widthProperty().multiply(.05));
149-
fontImg.fitWidthProperty().bind(fontRenderArea.getScene().widthProperty().multiply(.05));
150-
toggleButton.setGraphic(fontImg);
151-
toggleButton.setContentDisplay(ContentDisplay.TOP);
152-
toggleButton.setTooltip(new Tooltip(String.format("W=%d, H=%d", glyph.calculatedWidth(), glyph.toBaseLine() + glyph.belowBaseline())));
149+
var bmp = fromGlyphToImg(glyph);
150+
var toggleButton = new FontGlyphDataControl(i, bmp);
153151
var selected = currentlySelected.get(glyph.code());
154152
toggleButton.setSelected(selected != null && selected);
155-
toggleButton.setOnAction(event -> {
156-
currentlySelected.put(glyph.code(), toggleButton.isSelected());
157-
recalcSize();
158-
});
159-
fontRenderArea.add(toggleButton, gridCol, gridRow);
153+
// toggleButton.setOnAction(event -> {
154+
// currentlySelected.put(glyph.code(), toggleButton.isSelected());
155+
// recalcSize();
156+
// });
157+
Pane ui = toggleButton.getUI();
158+
fontRenderArea.add(ui, gridCol, gridRow);
160159
allButtons.add(toggleButton);
161-
GridPane.setMargin(toggleButton, new Insets(4));
160+
GridPane.setMargin(ui, new Insets(4));
162161
gridCol++;
163162
if(gridCol > 9) {
164163
gridCol = 0;
@@ -172,10 +171,9 @@ private void recalcFont() {
172171
recalcSize();
173172
}
174173

175-
private Image fromGlyphToImg(ConvertedFontGlyph glyph) {
176-
WritableImage img = new WritableImage(glyph.calculatedWidth() + 1, glyph.belowBaseline() + glyph.toBaseLine() + 2);
174+
private BmpDataManager fromGlyphToImg(ConvertedFontGlyph glyph) {
175+
var data = new NativeBmpBitPacker(glyph.calculatedWidth() + 1, glyph.belowBaseline() + glyph.toBaseLine() + 2, true);
177176
try {
178-
var writer = img.getPixelWriter();
179177
int bitOffset = 0;
180178
for(int y=glyph.fontDims().startY();y<glyph.fontDims().lastY(); y++) {
181179
for(int x=glyph.fontDims().startX();x<glyph.fontDims().lastX(); x++) {
@@ -184,15 +182,15 @@ private Image fromGlyphToImg(ConvertedFontGlyph glyph) {
184182
int d = glyph.data()[byteOffset];
185183
boolean on = (d & (1<<(7 - (bitOffset % 8)))) != 0;
186184
if(on) {
187-
writer.setColor(x, y, Color.WHITE);
185+
data.setBitAt(x, y, true);
188186
}
189187
bitOffset++;
190188
}
191189
}
192190
} catch (Exception e) {
193191
logger.log(System.Logger.Level.ERROR, "Image conversion caused exception", e);
194192
}
195-
return img;
193+
return data;
196194
}
197195

198196
@SuppressWarnings("unused")
@@ -335,4 +333,27 @@ private void checkButtons() {
335333
public void onOnlineHelp(ActionEvent actionEvent) {
336334
SafeNavigator.safeNavigateTo(AppInformationPanel.FONTS_GUIDE_URL);
337335
}
336+
337+
class FontGlyphDataControl {
338+
private static final PortablePalette FONT_PALETTE = new PortablePalette(new PortableColor[]{PortableColor.BLACK, PortableColor.WHITE}, PortablePalette.PaletteMode.ONE_BPP);
339+
final private int code;
340+
final private BmpDataManager data;
341+
boolean selected;
342+
343+
public FontGlyphDataControl(int code, BmpDataManager data) {
344+
this.code = code;
345+
this.data = data;
346+
}
347+
348+
public Pane getUI() {
349+
BorderPane pane = new BorderPane();
350+
pane.setCenter(new SimpleImagePane(data, NativePixelFormat.MONO_BITMAP, false, FONT_PALETTE, List.of()));
351+
pane.setBottom(new Label(STR."U\{code} : \{new String(Character.toChars(code))}"));
352+
return pane;
353+
}
354+
355+
public void setSelected(boolean selected) {
356+
this.selected = selected;
357+
}
358+
}
338359
}

0 commit comments

Comments
 (0)