From 50575a9f16dbccd19949deae8bc9724f9de0f81f Mon Sep 17 00:00:00 2001 From: Shahzaib Ibrahim Date: Wed, 7 May 2025 17:06:14 +0200 Subject: [PATCH 1/3] [win32] Introducing new FontData Constructor to create a deep copy This change will give us a chance to use proper channel to create a deep copy of FontData object instead of using FontData(fd.toString) --- .../org/eclipse/swt/graphics/FontData.java | 46 +++++++++++++++++++ ...est_org_eclipse_swt_graphics_FontData.java | 9 ++++ 2 files changed, 55 insertions(+) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/FontData.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/FontData.java index 247842e13d9..478219faefc 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/FontData.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/FontData.java @@ -240,6 +240,52 @@ public FontData(String string) { } } + +/** + * Constructs a new FontData copy + * + * @param fontData the FondData object for which copy is needed to be made + * + * @exception IllegalArgumentException + * + * @since 3.130 + */ +public FontData(FontData fontData) { + if (fontData == null) + SWT.error(SWT.ERROR_NULL_ARGUMENT); + + if (fontData.data != null) { + LOGFONT newData = new LOGFONT(); + setHeight(fontData.getHeightF()); + newData.lfHeight = fontData.data.lfHeight; + newData.lfWidth = fontData.data.lfWidth; + newData.lfEscapement = fontData.data.lfEscapement; + newData.lfOrientation = fontData.data.lfOrientation; + newData.lfWeight = fontData.data.lfWeight; + newData.lfItalic = fontData.data.lfItalic; + newData.lfUnderline = fontData.data.lfUnderline; + newData.lfStrikeOut = fontData.data.lfStrikeOut; + newData.lfCharSet = fontData.data.lfCharSet; + newData.lfOutPrecision = fontData.data.lfOutPrecision; + newData.lfClipPrecision = fontData.data.lfClipPrecision; + newData.lfQuality = fontData.data.lfQuality; + newData.lfPitchAndFamily = fontData.data.lfPitchAndFamily; + + // Deep copy of the char array lfFaceName + if (fontData.data.lfFaceName != null) { + newData.lfFaceName = new char[fontData.data.lfFaceName.length]; + System.arraycopy(fontData.data.lfFaceName, 0, newData.lfFaceName, 0, fontData.data.lfFaceName.length); + } + + this.data = newData; + } else { + this.data = null; + } +} + + /** * Constructs a new font data given a font name, * the height of the desired font in points, diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java index 41d5d5a2225..71896a1ef03 100644 --- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java @@ -90,6 +90,15 @@ public void test_ConstructorLjava_lang_StringII() { } } +@Test +public void test_ConstructorLjava_lang_FontData() { + // Test new FontData(FontData fontData) + FontData fd = new FontData(SwtTestUtil.testFontName, 30, SWT.ITALIC); + FontData reconstructedFontDataFromCopyConstructor = new FontData(fd); + assertEquals(fd, reconstructedFontDataFromCopyConstructor); + assertEquals(fd.hashCode(), reconstructedFontDataFromCopyConstructor.hashCode()); +} + @Test public void test_equalsLjava_lang_Object() { FontData fd1 = new FontData(SwtTestUtil.testFontName, 10, SWT.NORMAL); From 50258e6c202f6101f5b8c2154a9960f66456e6f7 Mon Sep 17 00:00:00 2001 From: Shahzaib Ibrahim Date: Thu, 8 May 2025 10:55:34 +0200 Subject: [PATCH 2/3] Replacing occurrences of FontData(String) to Deep copy the object Using the new constructor FontData(fontData) to deep copy the object. --- .../Eclipse SWT/win32/org/eclipse/swt/graphics/Font.java | 6 +++--- .../org/eclipse/swt/internal/DefaultSWTFontRegistry.java | 2 +- .../org/eclipse/swt/internal/ScalingSWTFontRegistry.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Font.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Font.java index b1f3249ab26..bfc17a166ed 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Font.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Font.java @@ -103,7 +103,7 @@ public Font(Device device, FontData fd) { super(device); if (fd == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); this.zoom = DPIUtil.getNativeDeviceZoom(); - this.fontData = new FontData(fd.toString()); + this.fontData = new FontData(fd); this.fontHeight = fd.height; init(); } @@ -112,7 +112,7 @@ private Font(Device device, FontData fd, int zoom) { super(device); if (fd == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); this.zoom = zoom; - this.fontData = new FontData(fd.toString()); + this.fontData = new FontData(fd); this.fontHeight = fd.height; init(); } @@ -151,7 +151,7 @@ public Font(Device device, FontData[] fds) { } this.zoom = DPIUtil.getNativeDeviceZoom(); FontData fd = fds[0]; - this.fontData = new FontData(fd.toString()); + this.fontData = new FontData(fd); this.fontHeight = fd.height; init(); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/DefaultSWTFontRegistry.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/DefaultSWTFontRegistry.java index 89a56015346..222080e765b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/DefaultSWTFontRegistry.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/DefaultSWTFontRegistry.java @@ -77,7 +77,7 @@ public Font getFont(long fontHandle, int zoom) { } private Font registerFont(FontData fontData, Font font) { - FontData clonedFontData = new FontData(fontData.toString()); + FontData clonedFontData = new FontData(fontData); fontsMap.put(clonedFontData, font); return font; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ScalingSWTFontRegistry.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ScalingSWTFontRegistry.java index fcd71786440..1cc1c8af7d2 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ScalingSWTFontRegistry.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ScalingSWTFontRegistry.java @@ -128,7 +128,7 @@ public Font getFont(FontData fontData, int zoom) { if (customFontsKeyMap.containsKey(fontData)) { container = customFontsKeyMap.get(fontData); } else { - FontData clonedFontData = new FontData(fontData.toString()); + FontData clonedFontData = new FontData(fontData); container = new ScaledCustomFontContainer(clonedFontData); customFontsKeyMap.put(clonedFontData, container); } From 46cfceeb2b3d094951a6c7fc733d53b7a8daddb4 Mon Sep 17 00:00:00 2001 From: Shahzaib Ibrahim Date: Thu, 8 May 2025 13:28:20 +0200 Subject: [PATCH 3/3] Addition of Deep Copy Methods for FontData in Cocoa and GTK --- .../org/eclipse/swt/graphics/FontData.java | 20 +++++++++++++++++++ .../org/eclipse/swt/graphics/FontData.java | 19 ++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java index abf7e66142b..4c86361a7fa 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java @@ -186,6 +186,26 @@ public FontData(String string) { } } +/** + * Constructs a new FontData copy + * + * @param fontData the FondData object for which copy is needed to be made + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the argument is null
  • + *
+ * @since 3.130 + */ +public FontData(FontData fontData) { + if (fontData == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); + + setName(fontData.name); + setHeight(fontData.height); + setStyle(fontData.style); + this.nsName = fontData.nsName; +} + /** * Constructs a new font data given a font name, * the height of the desired font in points, diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/FontData.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/FontData.java index ca717f680a1..fc8a2f5f362 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/FontData.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/FontData.java @@ -184,6 +184,25 @@ public FontData(String string) { } } +/** + * Constructs a new FontData copy + * + * @param fontData the FondData object for which copy is needed to be made + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the argument is null
  • + *
+ * @since 3.130 + */ +public FontData(FontData fontData) { + if (fontData == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); + + setName(fontData.name); + setHeight(fontData.height); + setStyle(fontData.style); +} + /** * Constructs a new font data given a font name, * the height of the desired font in points,