diff dstep/appkit/NSTypesetter.d @ 16:19885b43130e

Huge update, the bridge actually works now
author Jacob Carlborg <doob@me.com>
date Sun, 03 Jan 2010 22:06:11 +0100
parents
children b9de51448c6b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dstep/appkit/NSTypesetter.d	Sun Jan 03 22:06:11 2010 +0100
@@ -0,0 +1,472 @@
+/**
+ * Copyright: Copyright (c) 2009 Jacob Carlborg.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Sep 24, 2009 
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module dstep.appkit.NSTypesetter;
+
+import dstep.appkit.NSFont;
+import dstep.appkit.NSLayoutManager;
+import dstep.appkit.NSParagraphStyle;
+import dstep.appkit.NSSimpleHorizontalTypesetter;
+import dstep.appkit.NSTextContainer;
+import dstep.applicationservices.coregraphics.CGBase;
+import dstep.corefoundation.CFCharacterSet;
+import dstep.foundation.NSArray;
+import dstep.foundation.NSAttributedString;
+import dstep.foundation.NSDictionary;
+import dstep.foundation.NSGeometry;
+import dstep.foundation.NSObjCRuntime;
+import dstep.foundation.NSObject;
+import dstep.foundation.NSRange;
+import dstep.objc.bridge.Bridge;
+import dstep.objc.objc;
+
+typedef NSUInteger NSTypesetterControlCharacterAction;
+
+enum : NSUInteger
+{
+	NSTypesetterZeroAdvancementAction = (1 << 0),
+	NSTypesetterWhitespaceAction = (1 << 1),
+	NSTypesetterHorizontalTabAction = (1 << 2),
+	NSTypesetterLineBreakAction = (1 << 3),
+	NSTypesetterParagraphBreakAction = (1 << 4),
+	NSTypesetterContainerBreakAction = (1 << 5)
+}
+
+const TNSLayoutPhaseInterface = `
+
+	void willSetLineFragmentRect (NSRectPointer lineRect, NSRange glyphRange, NSRectPointer usedRect, CGFloat* baselineOffset)
+	{
+		return invokeObjcSelf!(void, "willSetLineFragmentRect:forGlyphRange:usedRect:baselineOffset:", NSRectPointer, NSRange, NSRectPointer, CGFloat*)(lineRect, glyphRange, usedRect, baselineOffset);
+	}
+
+	bool shouldBreakLineByWordBeforeCharacterAtIndex (NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(bool, "shouldBreakLineByWordBeforeCharacterAtIndex:", NSUInteger)(charIndex);
+	}
+
+	bool shouldBreakLineByHyphenatingBeforeCharacterAtIndex (NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(bool, "shouldBreakLineByHyphenatingBeforeCharacterAtIndex:", NSUInteger)(charIndex);
+	}
+
+	float hyphenationFactorForGlyphAtIndex (NSUInteger glyphIndex)
+	{
+		return invokeObjcSelf!(float, "hyphenationFactorForGlyphAtIndex:", NSUInteger)(glyphIndex);
+	}
+
+	uint hyphenCharacterForGlyphAtIndex (NSUInteger glyphIndex)
+	{
+		return invokeObjcSelf!(uint, "hyphenCharacterForGlyphAtIndex:", NSUInteger)(glyphIndex);
+	}
+
+	NSRect boundingBoxForControlGlyphAtIndex (NSUInteger glyphIndex, NSTextContainer textContainer, NSRect proposedRect, NSPoint glyphPosition, NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(NSRect, "boundingBoxForControlGlyphAtIndex:forTextContainer:proposedLineFragment:glyphPosition:characterIndex:", NSUInteger, NSTextContainer, NSRect, NSPoint, NSUInteger)(glyphIndex, textContainer, proposedRect, glyphPosition, charIndex);
+	}
+
+	//mixin ObjcBindMethod!(willSetLineFragmentRect, "willSetLineFragmentRect:forGlyphRange:usedRect:baselineOffset:");
+	//mixin ObjcBindMethod!(shouldBreakLineByWordBeforeCharacterAtIndex, "shouldBreakLineByWordBeforeCharacterAtIndex:");
+	//mixin ObjcBindMethod!(shouldBreakLineByHyphenatingBeforeCharacterAtIndex, "shouldBreakLineByHyphenatingBeforeCharacterAtIndex:");
+	//mixin ObjcBindMethod!(hyphenationFactorForGlyphAtIndex, "hyphenationFactorForGlyphAtIndex:");
+	//mixin ObjcBindMethod!(hyphenCharacterForGlyphAtIndex, "hyphenCharacterForGlyphAtIndex:");
+	//mixin ObjcBindMethod!(boundingBoxForControlGlyphAtIndex, "boundingBoxForControlGlyphAtIndex:forTextContainer:proposedLineFragment:glyphPosition:characterIndex:");
+
+`;
+
+const TNSGlyphStorageInterface = `
+
+	NSRange characterRangeForGlyphRange (NSRange glyphRange, NSRangePointer actualGlyphRange)
+	{
+		return invokeObjcSelf!(NSRange, "characterRangeForGlyphRange:actualGlyphRange:", NSRange, NSRangePointer)(glyphRange, actualGlyphRange);
+	}
+
+	NSRange glyphRangeForCharacterRange (NSRange charRange, NSRangePointer actualCharRange)
+	{
+		return invokeObjcSelf!(NSRange, "glyphRangeForCharacterRange:actualCharacterRange:", NSRange, NSRangePointer)(charRange, actualCharRange);
+	}
+
+	NSUInteger getGlyphsInRange (NSRange glyphsRange, NSGlyph* glyphBuffer, NSUInteger* charIndexBuffer, NSGlyphInscription* inscribeBuffer, bool* elasticBuffer, char* bidiLevelBuffer)
+	{
+		return invokeObjcSelf!(NSUInteger, "getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:bidiLevels:", NSRange, NSGlyph*, NSUInteger*, NSGlyphInscription*, bool*, char*)(glyphsRange, glyphBuffer, charIndexBuffer, inscribeBuffer, elasticBuffer, bidiLevelBuffer);
+	}
+
+	void getLineFragmentRect (NSRectPointer lineFragmentRect, NSRectPointer lineFragmentUsedRect, NSRectPointer remainingRect, NSUInteger startingGlyphIndex, NSRect proposedRect, CGFloat lineSpacing, CGFloat paragraphSpacingBefore, CGFloat paragraphSpacingAfter)
+	{
+		return invokeObjcSelf!(void, "getLineFragmentRect:usedRect:remainingRect:forStartingGlyphAtIndex:proposedRect:lineSpacing:paragraphSpacingBefore:paragraphSpacingAfter:", NSRectPointer, NSRectPointer, NSRectPointer, NSUInteger, NSRect, CGFloat, CGFloat, CGFloat)(lineFragmentRect, lineFragmentUsedRect, remainingRect, startingGlyphIndex, proposedRect, lineSpacing, paragraphSpacingBefore, paragraphSpacingAfter);
+	}
+
+	void setLineFragmentRect (NSRect fragmentRect, NSRange glyphRange, NSRect usedRect, CGFloat baselineOffset)
+	{
+		return invokeObjcSelf!(void, "setLineFragmentRect:forGlyphRange:usedRect:baselineOffset:", NSRect, NSRange, NSRect, CGFloat)(fragmentRect, glyphRange, usedRect, baselineOffset);
+	}
+
+	void substituteGlyphsInRange (NSRange glyphRange, NSGlyph* glyphs)
+	{
+		return invokeObjcSelf!(void, "substituteGlyphsInRange:withGlyphs:", NSRange, NSGlyph*)(glyphRange, glyphs);
+	}
+
+	void insertGlyph (uint glyph, NSUInteger glyphIndex, NSUInteger characterIndex)
+	{
+		return invokeObjcSelf!(void, "insertGlyph:atGlyphIndex:characterIndex:", uint, NSUInteger, NSUInteger)(glyph, glyphIndex, characterIndex);
+	}
+
+	void deleteGlyphsInRange (NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "deleteGlyphsInRange:", NSRange)(glyphRange);
+	}
+
+	void setNotShownAttribute (bool flag, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setNotShownAttribute:forGlyphRange:", bool, NSRange)(flag, glyphRange);
+	}
+
+	void setDrawsOutsideLineFragment (bool flag, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setDrawsOutsideLineFragment:forGlyphRange:", bool, NSRange)(flag, glyphRange);
+	}
+
+	void setLocation (NSPoint location, CGFloat* advancements, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setLocation:withAdvancements:forStartOfGlyphRange:", NSPoint, CGFloat*, NSRange)(location, advancements, glyphRange);
+	}
+
+	void setAttachmentSize (NSSize attachmentSize, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setAttachmentSize:forGlyphRange:", NSSize, NSRange)(attachmentSize, glyphRange);
+	}
+
+	void setBidiLevels (char* levels, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setBidiLevels:forGlyphRange:", char*, NSRange)(levels, glyphRange);
+	}
+
+	//mixin ObjcBindMethod!(characterRangeForGlyphRange, "characterRangeForGlyphRange:actualGlyphRange:");
+	//mixin ObjcBindMethod!(glyphRangeForCharacterRange, "glyphRangeForCharacterRange:actualCharacterRange:");
+	//mixin ObjcBindMethod!(getGlyphsInRange, "getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:bidiLevels:");
+	//mixin ObjcBindMethod!(getLineFragmentRect, "getLineFragmentRect:usedRect:remainingRect:forStartingGlyphAtIndex:proposedRect:lineSpacing:paragraphSpacingBefore:paragraphSpacingAfter:");
+	//mixin ObjcBindMethod!(setLineFragmentRect, "setLineFragmentRect:forGlyphRange:usedRect:baselineOffset:");
+	//mixin ObjcBindMethod!(substituteGlyphsInRange, "substituteGlyphsInRange:withGlyphs:");
+	//mixin ObjcBindMethod!(insertGlyph, "insertGlyph:atGlyphIndex:characterIndex:");
+	//mixin ObjcBindMethod!(deleteGlyphsInRange, "deleteGlyphsInRange:");
+	//mixin ObjcBindMethod!(setNotShownAttribute, "setNotShownAttribute:forGlyphRange:");
+	//mixin ObjcBindMethod!(setDrawsOutsideLineFragment, "setDrawsOutsideLineFragment:forGlyphRange:");
+	//mixin ObjcBindMethod!(setLocation, "setLocation:withAdvancements:forStartOfGlyphRange:");
+	//mixin ObjcBindMethod!(setAttachmentSize, "setAttachmentSize:forGlyphRange:");
+	//mixin ObjcBindMethod!(setBidiLevels, "setBidiLevels:forGlyphRange:");
+
+`;
+
+class NSTypesetter : NSObject
+{
+	mixin (ObjcWrap);
+	
+	void getLineFragmentRect (NSRectPointer lineFragmentRect, NSRectPointer lineFragmentUsedRect, NSRange paragraphSeparatorGlyphRange, NSPoint lineOrigin)
+	{
+		return invokeObjcSelf!(void, "getLineFragmentRect:usedRect:forParagraphSeparatorGlyphRange:atProposedOrigin:", NSRectPointer, NSRectPointer, NSRange, NSPoint)(lineFragmentRect, lineFragmentUsedRect, paragraphSeparatorGlyphRange, lineOrigin);
+	}
+
+	bool usesFontLeading ()
+	{
+		return invokeObjcSelf!(bool, "usesFontLeading");
+	}
+
+	void setUsesFontLeading (bool flag)
+	{
+		return invokeObjcSelf!(void, "setUsesFontLeading:", bool)(flag);
+	}
+
+	int typesetterBehavior ()
+	{
+		return invokeObjcSelf!(int, "typesetterBehavior");
+	}
+
+	void setTypesetterBehavior (int behavior)
+	{
+		return invokeObjcSelf!(void, "setTypesetterBehavior:", int)(behavior);
+	}
+
+	float hyphenationFactor ()
+	{
+		return invokeObjcSelf!(float, "hyphenationFactor");
+	}
+
+	void setHyphenationFactor (float factor)
+	{
+		return invokeObjcSelf!(void, "setHyphenationFactor:", float)(factor);
+	}
+
+	CGFloat lineFragmentPadding ()
+	{
+		return invokeObjcSelf!(CGFloat, "lineFragmentPadding");
+	}
+
+	void setLineFragmentPadding (CGFloat padding)
+	{
+		return invokeObjcSelf!(void, "setLineFragmentPadding:", CGFloat)(padding);
+	}
+
+	NSFont substituteFontForFont (NSFont originalFont)
+	{
+		return invokeObjcSelf!(NSFont, "substituteFontForFont:", NSFont)(originalFont);
+	}
+
+	NSTextTab textTabForGlyphLocation (CGFloat glyphLocation, int direction, CGFloat maxLocation)
+	{
+		return invokeObjcSelf!(NSTextTab, "textTabForGlyphLocation:writingDirection:maxLocation:", CGFloat, int, CGFloat)(glyphLocation, direction, maxLocation);
+	}
+
+	bool bidiProcessingEnabled ()
+	{
+		return invokeObjcSelf!(bool, "bidiProcessingEnabled");
+	}
+
+	void setBidiProcessingEnabled (bool flag)
+	{
+		return invokeObjcSelf!(void, "setBidiProcessingEnabled:", bool)(flag);
+	}
+
+	void setAttributedString (NSAttributedString attrString)
+	{
+		return invokeObjcSelf!(void, "setAttributedString:", NSAttributedString)(attrString);
+	}
+
+	NSAttributedString attributedString ()
+	{
+		return invokeObjcSelf!(NSAttributedString, "attributedString");
+	}
+
+	void setParagraphGlyphRange (NSRange paragraphRange, NSRange paragraphSeparatorRange)
+	{
+		return invokeObjcSelf!(void, "setParagraphGlyphRange:separatorGlyphRange:", NSRange, NSRange)(paragraphRange, paragraphSeparatorRange);
+	}
+
+	NSRange paragraphGlyphRange ()
+	{
+		return invokeObjcSelf!(NSRange, "paragraphGlyphRange");
+	}
+
+	NSRange paragraphSeparatorGlyphRange ()
+	{
+		return invokeObjcSelf!(NSRange, "paragraphSeparatorGlyphRange");
+	}
+
+	NSRange paragraphCharacterRange ()
+	{
+		return invokeObjcSelf!(NSRange, "paragraphCharacterRange");
+	}
+
+	NSRange paragraphSeparatorCharacterRange ()
+	{
+		return invokeObjcSelf!(NSRange, "paragraphSeparatorCharacterRange");
+	}
+
+	NSUInteger layoutParagraphAtPoint (NSPointPointer lineFragmentOrigin)
+	{
+		return invokeObjcSelf!(NSUInteger, "layoutParagraphAtPoint:", NSPointPointer)(lineFragmentOrigin);
+	}
+
+	void beginParagraph ()
+	{
+		return invokeObjcSelf!(void, "beginParagraph");
+	}
+
+	void endParagraph ()
+	{
+		return invokeObjcSelf!(void, "endParagraph");
+	}
+
+	void beginLineWithGlyphAtIndex (NSUInteger glyphIndex)
+	{
+		return invokeObjcSelf!(void, "beginLineWithGlyphAtIndex:", NSUInteger)(glyphIndex);
+	}
+
+	void endLineWithGlyphRange (NSRange lineGlyphRange)
+	{
+		return invokeObjcSelf!(void, "endLineWithGlyphRange:", NSRange)(lineGlyphRange);
+	}
+
+	CGFloat lineSpacingAfterGlyphAtIndex (NSUInteger glyphIndex, NSRect rect)
+	{
+		return invokeObjcSelf!(CGFloat, "lineSpacingAfterGlyphAtIndex:withProposedLineFragmentRect:", NSUInteger, NSRect)(glyphIndex, rect);
+	}
+
+	CGFloat paragraphSpacingBeforeGlyphAtIndex (NSUInteger glyphIndex, NSRect rect)
+	{
+		return invokeObjcSelf!(CGFloat, "paragraphSpacingBeforeGlyphAtIndex:withProposedLineFragmentRect:", NSUInteger, NSRect)(glyphIndex, rect);
+	}
+
+	CGFloat paragraphSpacingAfterGlyphAtIndex (NSUInteger glyphIndex, NSRect rect)
+	{
+		return invokeObjcSelf!(CGFloat, "paragraphSpacingAfterGlyphAtIndex:withProposedLineFragmentRect:", NSUInteger, NSRect)(glyphIndex, rect);
+	}
+
+	NSDictionary attributesForExtraLineFragment ()
+	{
+		return invokeObjcSelf!(NSDictionary, "attributesForExtraLineFragment");
+	}
+
+	uint actionForControlCharacterAtIndex (NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(uint, "actionForControlCharacterAtIndex:", NSUInteger)(charIndex);
+	}
+
+	NSLayoutManager layoutManager ()
+	{
+		return invokeObjcSelf!(NSLayoutManager, "layoutManager");
+	}
+
+	NSArray textContainers ()
+	{
+		return invokeObjcSelf!(NSArray, "textContainers");
+	}
+
+	NSTextContainer currentTextContainer ()
+	{
+		return invokeObjcSelf!(NSTextContainer, "currentTextContainer");
+	}
+
+	NSParagraphStyle currentParagraphStyle ()
+	{
+		return invokeObjcSelf!(NSParagraphStyle, "currentParagraphStyle");
+	}
+
+	void setHardInvalidation (bool flag, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setHardInvalidation:forGlyphRange:", bool, NSRange)(flag, glyphRange);
+	}
+
+	void layoutGlyphsInLayoutManager (NSLayoutManager layoutManager, NSUInteger startGlyphIndex, NSUInteger maxNumLines, NSUInteger* nextGlyph)
+	{
+		return invokeObjcSelf!(void, "layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:nextGlyphIndex:", NSLayoutManager, NSUInteger, NSUInteger, NSUInteger*)(layoutManager, startGlyphIndex, maxNumLines, nextGlyph);
+	}
+
+	NSRange layoutCharactersInRange (NSRange characterRange, NSLayoutManager layoutManager, NSUInteger maxNumLines)
+	{
+		return invokeObjcSelf!(NSRange, "layoutCharactersInRange:forLayoutManager:maximumNumberOfLineFragments:", NSRange, NSLayoutManager, NSUInteger)(characterRange, layoutManager, maxNumLines);
+	}
+
+	static NSSize printingAdjustmentInLayoutManager (NSLayoutManager layoutMgr, NSRange nominallySpacedGlyphsRange, char* packedGlyphs, NSUInteger packedGlyphsCount)
+	{
+		return invokeObjcSelfClass!(NSSize, "printingAdjustmentInLayoutManager:forNominallySpacedGlyphRange:packedGlyphs:count:", NSLayoutManager, NSRange, char*, NSUInteger)(layoutMgr, nominallySpacedGlyphsRange, packedGlyphs, packedGlyphsCount);
+	}
+
+	CGFloat baselineOffsetInLayoutManager (NSLayoutManager layoutMgr, NSUInteger glyphIndex)
+	{
+		return invokeObjcSelf!(CGFloat, "baselineOffsetInLayoutManager:glyphIndex:", NSLayoutManager, NSUInteger)(layoutMgr, glyphIndex);
+	}
+
+	static Object sharedSystemTypesetter ()
+	{
+		return invokeObjcSelfClass!(Object, "sharedSystemTypesetter");
+	}
+
+	static Object sharedSystemTypesetterForBehavior (int theBehavior)
+	{
+		return invokeObjcSelfClass!(Object, "sharedSystemTypesetterForBehavior:", int)(theBehavior);
+	}
+
+	static int defaultTypesetterBehavior ()
+	{
+		return invokeObjcSelfClass!(int, "defaultTypesetterBehavior");
+	}
+	
+	// NSLayoutPhaseInterface
+	void willSetLineFragmentRect (NSRectPointer lineRect, NSRange glyphRange, NSRectPointer usedRect, CGFloat* baselineOffset)
+	{
+		return invokeObjcSelf!(void, "willSetLineFragmentRect:forGlyphRange:usedRect:baselineOffset:", NSRectPointer, NSRange, NSRectPointer, CGFloat*)(lineRect, glyphRange, usedRect, baselineOffset);
+	}
+
+	bool shouldBreakLineByWordBeforeCharacterAtIndex (NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(bool, "shouldBreakLineByWordBeforeCharacterAtIndex:", NSUInteger)(charIndex);
+	}
+
+	bool shouldBreakLineByHyphenatingBeforeCharacterAtIndex (NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(bool, "shouldBreakLineByHyphenatingBeforeCharacterAtIndex:", NSUInteger)(charIndex);
+	}
+
+	float hyphenationFactorForGlyphAtIndex (NSUInteger glyphIndex)
+	{
+		return invokeObjcSelf!(float, "hyphenationFactorForGlyphAtIndex:", NSUInteger)(glyphIndex);
+	}
+
+	uint hyphenCharacterForGlyphAtIndex (NSUInteger glyphIndex)
+	{
+		return invokeObjcSelf!(uint, "hyphenCharacterForGlyphAtIndex:", NSUInteger)(glyphIndex);
+	}
+
+	NSRect boundingBoxForControlGlyphAtIndex (NSUInteger glyphIndex, NSTextContainer textContainer, NSRect proposedRect, NSPoint glyphPosition, NSUInteger charIndex)
+	{
+		return invokeObjcSelf!(NSRect, "boundingBoxForControlGlyphAtIndex:forTextContainer:proposedLineFragment:glyphPosition:characterIndex:", NSUInteger, NSTextContainer, NSRect, NSPoint, NSUInteger)(glyphIndex, textContainer, proposedRect, glyphPosition, charIndex);
+	}
+	
+	// NSGlyphStorageInterface
+	NSRange characterRangeForGlyphRange (NSRange glyphRange, NSRangePointer actualGlyphRange)
+	{
+		return invokeObjcSelf!(NSRange, "characterRangeForGlyphRange:actualGlyphRange:", NSRange, NSRangePointer)(glyphRange, actualGlyphRange);
+	}
+
+	NSRange glyphRangeForCharacterRange (NSRange charRange, NSRangePointer actualCharRange)
+	{
+		return invokeObjcSelf!(NSRange, "glyphRangeForCharacterRange:actualCharacterRange:", NSRange, NSRangePointer)(charRange, actualCharRange);
+	}
+
+	NSUInteger getGlyphsInRange (NSRange glyphsRange, NSGlyph* glyphBuffer, NSUInteger* charIndexBuffer, NSGlyphInscription* inscribeBuffer, bool* elasticBuffer, char* bidiLevelBuffer)
+	{
+		return invokeObjcSelf!(NSUInteger, "getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:bidiLevels:", NSRange, NSGlyph*, NSUInteger*, NSGlyphInscription*, bool*, char*)(glyphsRange, glyphBuffer, charIndexBuffer, inscribeBuffer, elasticBuffer, bidiLevelBuffer);
+	}
+
+	void getLineFragmentRect (NSRectPointer lineFragmentRect, NSRectPointer lineFragmentUsedRect, NSRectPointer remainingRect, NSUInteger startingGlyphIndex, NSRect proposedRect, CGFloat lineSpacing, CGFloat paragraphSpacingBefore, CGFloat paragraphSpacingAfter)
+	{
+		return invokeObjcSelf!(void, "getLineFragmentRect:usedRect:remainingRect:forStartingGlyphAtIndex:proposedRect:lineSpacing:paragraphSpacingBefore:paragraphSpacingAfter:", NSRectPointer, NSRectPointer, NSRectPointer, NSUInteger, NSRect, CGFloat, CGFloat, CGFloat)(lineFragmentRect, lineFragmentUsedRect, remainingRect, startingGlyphIndex, proposedRect, lineSpacing, paragraphSpacingBefore, paragraphSpacingAfter);
+	}
+
+	void setLineFragmentRect (NSRect fragmentRect, NSRange glyphRange, NSRect usedRect, CGFloat baselineOffset)
+	{
+		return invokeObjcSelf!(void, "setLineFragmentRect:forGlyphRange:usedRect:baselineOffset:", NSRect, NSRange, NSRect, CGFloat)(fragmentRect, glyphRange, usedRect, baselineOffset);
+	}
+
+	void substituteGlyphsInRange (NSRange glyphRange, NSGlyph* glyphs)
+	{
+		return invokeObjcSelf!(void, "substituteGlyphsInRange:withGlyphs:", NSRange, NSGlyph*)(glyphRange, glyphs);
+	}
+
+	void insertGlyph (uint glyph, NSUInteger glyphIndex, NSUInteger characterIndex)
+	{
+		return invokeObjcSelf!(void, "insertGlyph:atGlyphIndex:characterIndex:", uint, NSUInteger, NSUInteger)(glyph, glyphIndex, characterIndex);
+	}
+
+	void deleteGlyphsInRange (NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "deleteGlyphsInRange:", NSRange)(glyphRange);
+	}
+
+	void setNotShownAttribute (bool flag, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setNotShownAttribute:forGlyphRange:", bool, NSRange)(flag, glyphRange);
+	}
+
+	void setDrawsOutsideLineFragment (bool flag, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setDrawsOutsideLineFragment:forGlyphRange:", bool, NSRange)(flag, glyphRange);
+	}
+
+	void setLocation (NSPoint location, CGFloat* advancements, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setLocation:withAdvancements:forStartOfGlyphRange:", NSPoint, CGFloat*, NSRange)(location, advancements, glyphRange);
+	}
+
+	void setAttachmentSize (NSSize attachmentSize, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setAttachmentSize:forGlyphRange:", NSSize, NSRange)(attachmentSize, glyphRange);
+	}
+
+	void setBidiLevels (char* levels, NSRange glyphRange)
+	{
+		return invokeObjcSelf!(void, "setBidiLevels:forGlyphRange:", char*, NSRange)(levels, glyphRange);
+	}
+}
\ No newline at end of file