11package com .thecoderscorner .menu .editorui .gfxui ;
22
3+ import com .thecoderscorner .menu .domain .state .PortableColor ;
4+ import com .thecoderscorner .menu .domain .util .PortablePalette ;
35import com .thecoderscorner .menu .editorui .dialog .AppInformationPanel ;
46import com .thecoderscorner .menu .editorui .dialog .SelectUnicodeRangesDialog ;
57import com .thecoderscorner .menu .editorui .generator .core .VariableNameGenerator ;
68import 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 ;
713import com .thecoderscorner .menu .editorui .uimodel .CurrentProjectEditorUI ;
814import com .thecoderscorner .menu .editorui .util .SafeNavigator ;
915import javafx .collections .FXCollections ;
1521import javafx .scene .control .MenuItem ;
1622import javafx .scene .control .TextField ;
1723import 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 ;
2125import javafx .scene .layout .GridPane ;
22- import javafx .scene .paint . Color ;
26+ import javafx .scene .layout . Pane ;
2327import javafx .stage .Stage ;
2428
2529import 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