/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.graphics;
import org.eclipse.swt.internal.cocoa.*;
import org.eclipse.swt.*;
/**
* Instances of this class manage operating system resources that
* define how text looks when it is displayed. Fonts may be constructed
* by providing a device and either name, size and style information
* or a FontData
object which encapsulates this data.
*
* Application code must explicitly invoke the Font.dispose()
* method to release the operating system resources managed by each instance
* when those instances are no longer required.
*
* IMPORTANT: This field is not part of the SWT * public API. It is marked public only so that it can be shared * within the packages provided by SWT. It is not available on all * platforms and should never be accessed from application code. *
* * @noreference This field is not intended to be referenced by clients. */ public NSFont handle; /** * the traits not supported to the OS font resource * (Warning: This field is platform dependent) ** IMPORTANT: This field is not part of the SWT * public API. It is marked public only so that it can be shared * within the packages provided by SWT. It is not available on all * platforms and should never be accessed from application code. *
* * @noreference This field is not intended to be referenced by clients. */ public int extraTraits; static final double SYNTHETIC_BOLD = -2.5; static final double SYNTHETIC_ITALIC = 0.2; Font(Device device) { super(device); } /** * Constructs a new font given a device and font data * which describes the desired font's appearance. ** You must dispose the font when it is no longer required. *
* * @param device the device to create the font on * @param fd the FontData that describes the desired font (must not be null) * * @exception IllegalArgumentException* You must dispose the font when it is no longer required. *
* * @param device the device to create the font on * @param fds the array of FontData that describes the desired font (must not be null) * * @exception IllegalArgumentExceptiontrue
if the object is the same as this object and false
otherwise
*
* @see #hashCode
*/
public boolean equals(Object object) {
if (object == this) return true;
if (!(object instanceof Font)) return false;
Font font = (Font)object;
return handle == font.handle;
}
/**
* Returns an array of FontData
s representing the receiver.
* On Windows, only one FontData will be returned per font. On X however,
* a Font
object may be composed of multiple X
* fonts. To support this case, we return an array of font data objects.
*
* @return an array of font data objects describing the receiver
*
* @exception SWTException
* IMPORTANT: This method is not part of the public
* API for Font
. It is marked public only so that it
* can be shared within the packages provided by SWT. It is not
* available on all platforms, and should never be called from
* application code.
*
true
when passed to
* equals
must return the same value for this
* method.
*
* @return the receiver's hash
*
* @see #equals
*/
public int hashCode() {
return handle != null ? (int)/*64*/handle.id : 0;
}
void init(String name, float height, int style, String nsName) {
if (name == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
Point dpi = device.dpi, screenDPI = device.getScreenDPI();
float size = height * dpi.y / screenDPI.y;
if (nsName != null) {
handle = NSFont.fontWithName(NSString.stringWith(nsName), size);
} else {
NSString family = NSString.stringWith(name);
NSFont nsFont = NSFont.fontWithName(family, size);
if (nsFont == null) nsFont = NSFont.systemFontOfSize(size);
NSFontManager manager = NSFontManager.sharedFontManager();
if (nsFont != null) {
if ((style & (SWT.BOLD | SWT.ITALIC)) == 0) {
handle = nsFont;
} else {
int traits = 0;
if ((style & SWT.ITALIC) != 0) traits |= OS.NSItalicFontMask;
if ((style & SWT.BOLD) != 0) traits |= OS.NSBoldFontMask;
handle = manager.convertFont(nsFont, traits);
if ((style & SWT.ITALIC) != 0 && (handle == null || (manager.traitsOfFont(handle) & OS.NSItalicFontMask) == 0)) {
traits &= ~OS.NSItalicFontMask;
handle = null;
if ((style & SWT.BOLD) != 0) {
handle = manager.convertFont(nsFont, traits);
}
}
if ((style & SWT.BOLD) != 0 && handle == null) {
traits &= ~OS.NSBoldFontMask;
if ((style & SWT.ITALIC) != 0) {
traits |= OS.NSItalicFontMask;
handle = manager.convertFont(nsFont, traits);
}
}
if (handle == null) handle = nsFont;
}
}
if (handle == null) {
handle = NSFont.systemFontOfSize(size);
}
if ((style & SWT.ITALIC) != 0 && (manager.traitsOfFont(handle) & OS.NSItalicFontMask) == 0) {
extraTraits |= OS.NSItalicFontMask;
}
if ((style & SWT.BOLD) != 0 && (manager.traitsOfFont(handle) & OS.NSBoldFontMask) == 0) {
extraTraits |= OS.NSBoldFontMask;
}
}
if (handle == null) {
handle = device.systemFont.handle;
}
handle.retain();
}
/**
* Returns true
if the font has been disposed,
* and false
otherwise.
*
* This method gets the dispose state for the font.
* When a font has been disposed, it is an error to
* invoke any other method (except {@link #dispose()}) using the font.
*
* @return true
when the font is disposed and false
otherwise
*/
public boolean isDisposed() {
return handle == null;
}
/**
* Returns a string containing a concise, human-readable
* description of the receiver.
*
* @return a string representation of the receiver
*/
public String toString () {
if (isDisposed()) return "Font {*DISPOSED*}";
return "Font {" + handle + "}";
}
}