Positioning of text
Positioning of text
- Subject: Positioning of text
- From: eric g <email@hidden>
- Date: Wed, 16 Dec 2015 13:02:02 -0500
I am trying to understand how Cocoa's text drawing system positions text
on OS X.
I have setup some text attributes as follows:
let emojiFont = NSFont.systemFontOfSize( 18 )
let emojiStyle =
NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as!
NSMutableParagraphStyle
self.emojiAttributes[ NSFontAttributeName ] = emojiFont
self.emojiAttributes[ NSParagraphStyleAttributeName] = emojiStyle
The drawing code looks like:
let kSquareSize = CGFloat( 50 )
let nRows = 1
let nColumns = 1
let nBins = nRows * nColumns
let binImageFrame = NSMakeRect( 0, 0, CGFloat(nBins) *
self.kSquareSize, self.kSquareSize )
let binImage = NSBitmapImageRep.init( bitmapDataPlanes: nil,
pixelsWide: Int(NSWidth( binImageFrame )),
pixelsHigh: Int(NSHeight( binImageFrame )),
bitsPerSample: 8,
samplesPerPixel: 4,
hasAlpha: true,
isPlanar: false,
colorSpaceName: NSDeviceRGBColorSpace,
bytesPerRow: 0,
bitsPerPixel: 0 )!
let binContext = NSGraphicsContext.init( bitmapImageRep: binImage )!
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext( binContext )
//
// Draw
//
NSColor.lightGrayColor().setFill()
NSRectFill( binImageFrame )
let coordinates = NSMakeRect( 0, 0, kSquareSize, kSquareSize )
self.drawEmoji( 0, coordinates: coordinates )
//
// Close Out
//
NSGraphicsContext.restoreGraphicsState()
let emojiImage = NSImage.init( size: binImageFrame.size )
emojiImage.addRepresentation( binImage )
//
// Save
//
let imageData: NSData = emojiImage.TIFFRepresentation!
imageData.writeToFile( "/Users/eric/Desktop/bin.tiff", atomically: true )
and the drawEmoji function is:
func drawEmoji( emojiIndex: Int, coordinates: NSRect )
{
NSRectFill( coordinates )
let textStorage = NSTextStorage.init( string: "😁",
attributes: self.emojiAttributes )
let layoutManager = NSLayoutManager.init()
let textContainer = NSTextContainer.init( containerSize:
NSMakeSize( kSquareSize, kSquareSize ) )
layoutManager.addTextContainer( textContainer )
textStorage.addLayoutManager( layoutManager )
let emoji = textStorage
let emojiLayout = emoji.layoutManagers[0]
let glyphRange = NSMakeRange( 0,
emojiLayout.numberOfGlyphs )
let emojiCoordinates =
emojiLayout.lineFragmentUsedRectForGlyphAtIndex( 0,
effectiveRange: nil )
let emojiLocation = emojiLayout.locationForGlyphAtIndex( 0 )
let emojiLocationFrame = NSMakeRect( emojiLocation.x,
emojiLocation.y, emojiCoordinates.size.width,
emojiCoordinates.size.height )
let emojiBoundingFrame = emojiLayout.boundingRectForGlyphRange(
NSMakeRange( 0, emoji.length ), inTextContainer:
emojiLayout.textContainers[0] )
let emojiUsedFrame = emojiLayout.usedRectForTextContainer(
emojiLayout.textContainers[0] )
NSColor.redColor().set()
NSFrameRect( emojiCoordinates )
NSColor.greenColor().set()
NSFrameRect( emojiLocationFrame )
NSColor.blueColor().set()
NSFrameRect( emojiBoundingFrame )
self.lightBlue.set()
NSFrameRect( emojiUsedFrame )
NSLog( "lineFragmentUsedRectForGlyphAtIndex %@", NSStringFromRect(
emojiCoordinates ) )
NSLog( "locationForGlyphAtIndex %@",
NSStringFromPoint( emojiLocation ) )
NSLog( "boundingRectForGlyphRange %@", NSStringFromRect(
emojiBoundingFrame ) )
NSLog( "usedRectForTextContainer %@", NSStringFromRect(
emojiUsedFrame ) )
emojiLayout.drawGlyphsForGlyphRange( glyphRange, atPoint:
NSMakePoint( 0, 0 ) )
}
The output from the logs is:
lineFragmentUsedRectForGlyphAtIndex {{0, 0}, {32, 28}}
locationForGlyphAtIndex {5, 21}
boundingRectForGlyphRange {{5, 0}, {22, 28}}
usedRectForTextContainer {{0, 0}, {32, 28}}
The image is:
http://i.stack.imgur.com/F1eRA.png
I was expecting the emoji to be drawn in the lower left corner and do not
understand why is the character drawn so high. Why is the emoji drawn
where it is drawn?
I would like to understand how the text is being positioned so I can take
control over it and position the text where I need it to be positioned.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden