if (lpEnumFontFamProc == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
public FontData [] getFontList (String faceName, boolean scalable) {	checkDevice ();		/* Create the callback */	Callback callback = new Callback (this, "EnumFontFamProc", 4);	int lpEnumFontFamProc = callback.getAddress ();			/* Initialize the instance variables */	metrics = OS.IsUnicode ? (TEXTMETRIC)new TEXTMETRICW() : new TEXTMETRICA();	pixels = new int[nFonts];	logFonts = new LOGFONT [nFonts];	for (int i=0; i<logFonts.length; i++) {		logFonts [i] = OS.IsUnicode ? (LOGFONT) new LOGFONTW () : new LOGFONTA ();	}	nFonts = 0;	/* Enumerate */	int offset = 0;	int hDC = internal_new_GC (null);	if (faceName == null) {			/* The user did not specify a face name, so they want all versions of all available face names */		OS.EnumFontFamilies (hDC, null, lpEnumFontFamProc, scalable ? 1 : 0);				/**		 * For bitmapped fonts, EnumFontFamilies only enumerates once for each font, regardless		 * of how many styles are available. If the user wants bitmapped fonts, enumerate on		 * each face name now.		 */		offset = nFonts;		for (int i=0; i<offset; i++) {			LOGFONT lf = logFonts [i];			/**			 * Bug in Windows 98. When EnumFontFamiliesEx is called with a specified face name, it			 * should enumerate for each available style of that font. Instead, it only enumerates			 * once. The fix is to call EnumFontFamilies, which works as expected.			 */			if (OS.IsUnicode) {				OS.EnumFontFamiliesW (hDC, ((LOGFONTW)lf).lfFaceName, lpEnumFontFamProc, scalable ? 1 : 0);			} else {				OS.EnumFontFamiliesA (hDC, ((LOGFONTA)lf).lfFaceName, lpEnumFontFamProc, scalable ? 1 : 0);			}		}	} else {		/* Use the character encoding for the default locale */		TCHAR lpFaceName = new TCHAR (0, faceName, true);		/**		 * Bug in Windows 98. When EnumFontFamiliesEx is called with a specified face name, it		 * should enumerate for each available style of that font. Instead, it only enumerates		 * once. The fix is to call EnumFontFamilies, which works as expected.		 */		OS.EnumFontFamilies (hDC, lpFaceName, lpEnumFontFamProc, scalable ? 1 : 0);	}	int logPixelsY = OS.GetDeviceCaps(hDC, OS.LOGPIXELSY);	internal_dispose_GC (hDC, null);	/* Create the fontData from the logfonts */	int count = nFonts - offset;	FontData [] result = new FontData [count];	for (int i=0; i<count; i++) {		int index = i + offset;		result [i] = FontData.win32_new (logFonts [index], Compatibility.round(pixels [index] * 72, logPixelsY));	}		/* Clean up */	callback.dispose ();	logFonts = null;	pixels = null;	metrics = null;	return result;}