/** * Adds to the receiver a circular or elliptical arc that lies within the specified rectangular * area. * * <p>The resulting arc begins at <code>startAngle</code> and extends for <code>arcAngle</code> * degrees. Angles are interpreted such that 0 degrees is at the 3 o'clock position. A positive * value indicates a counter-clockwise rotation while a negative value indicates a clockwise * rotation. * * <p>The center of the arc is the center of the rectangle whose origin is (<code>x</code>, <code> * y</code>) and whose size is specified by the <code>width</code> and <code>height</code> * arguments. * * <p>The resulting arc covers an area <code>width + 1</code> pixels wide by <code>height + 1 * </code> pixels tall. * * @param x the x coordinate of the upper-left corner of the arc * @param y the y coordinate of the upper-left corner of the arc * @param width the width of the arc * @param height the height of the arc * @param startAngle the beginning angle * @param arcAngle the angular extent of the arc, relative to the start angle * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed * </ul> */ public void addArc( float x, float y, float width, float height, float startAngle, float arcAngle) { if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); NSAffineTransform transform = NSAffineTransform.transform(); transform.translateXBy(x + width / 2f, y + height / 2f); transform.scaleXBy(width / 2f, height / 2f); NSBezierPath path = NSBezierPath.bezierPath(); NSPoint center = new NSPoint(); float sAngle = -startAngle; float eAngle = -(startAngle + arcAngle); path.appendBezierPathWithArcWithCenter_radius_startAngle_endAngle_clockwise_( center, 1, sAngle, eAngle, arcAngle > 0); path.transformUsingAffineTransform(transform); handle.appendBezierPath(path); }
/** * Adds to the receiver the pattern of glyphs generated by drawing the given string using the * given font starting at the point (x, y). * * @param string the text to use * @param x the x coordinate of the starting point * @param y the y coordinate of the starting point * @param font the font to use * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the font is null * <li>ERROR_INVALID_ARGUMENT - if the font has been disposed * </ul> * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed * </ul> */ public void addString(String string, float x, float y, Font font) { if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); if (font == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); if (font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); NSString str = NSString.stringWith(string); NSTextStorage textStorage = ((NSTextStorage) new NSTextStorage().alloc()); textStorage.initWithString_(str); NSLayoutManager layoutManager = (NSLayoutManager) new NSLayoutManager().alloc().init(); NSTextContainer textContainer = (NSTextContainer) new NSTextContainer().alloc(); NSSize size = new NSSize(); size.width = Float.MAX_VALUE; size.height = Float.MAX_VALUE; textContainer.initWithContainerSize(size); textStorage.addLayoutManager(layoutManager); layoutManager.addTextContainer(textContainer); NSRange range = new NSRange(); range.length = str.length(); textStorage.beginEditing(); textStorage.addAttribute(OS.NSFontAttributeName(), font.handle, range); textStorage.endEditing(); range = layoutManager.glyphRangeForTextContainer(textContainer); if (range.length != 0) { int glyphs = OS.malloc(4 * range.length * 2); layoutManager.getGlyphs(glyphs, range); NSBezierPath path = NSBezierPath.bezierPath(); NSPoint point = new NSPoint(); point.x = x; point.y = y; path.moveToPoint(point); path.appendBezierPathWithGlyphs(glyphs, range.length, font.handle); NSAffineTransform transform = NSAffineTransform.transform(); transform.scaleXBy(1, -1); transform.translateXBy(0, -((2 * y) + textStorage.size().height)); path.transformUsingAffineTransform(transform); OS.free(glyphs); handle.appendBezierPath(path); } textContainer.release(); layoutManager.release(); textStorage.release(); }