Mercurial > projects > dstep
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