I use ‘Outline’ as an attribute (or as one of the attributes).
Everything is okay up to a certain outline width. Depending on font I’ll get the joint-spikes like with a W and Arial.
Is there a way to use ‘miterLimit’ or ‘lineJoinStyle’ here?
Thanks in advance for any hints on that & stay safe!
It’s just a Bezier specific issue with any vector path drawn, not a specific font issue.
The Arial capital ‘W’ is just a very obvious example. That’s why there are ‘miter limits’ and ‘join types’
Here an example where obviously a miter limit is applied
You see the effect on the upper left edge of the W.
Probably it’s a kind of ‘post process’ since outline text needs 2 strings stacked upon each other to work.
This is totally independent from the font - any font where a character has edges is affected. The miter length grows bigger as the angle of the corner gets smaller.
Here the base parts of the script.
Assuming that theATS is an attributed string.
set theStrokedATS to theATS's mutableCopy()
theStrokedATS's addAttribute:(cA's NSStrokeColorAttributeName) value:(strokeClrVal) range:({0, theATS's |length|()})
theStrokedATS's addAttribute:(cA's NSStrokeWidthAttributeName) value:(strokeWidthVal) range:({0, theATS's |length|()})
set tmpImg1 to my makeImg(bgrWidth, bgrHeight, edgeRadius, fillColor)
set tmpImg2 to my stringOnImg(tmpImg1, theStrokedATS, xPos, yPos)
# to make the fill work correctly
set tmpImg2 to my stringOnImg(tmpImg2, theATS, xPos, yPos)
#-----------------------------------------------------------------------
on makeNSColor(zValueType, clrComps)
# clrComps/type can be like {1, 1, 1, 1} = 1 or {255, 255, 255, 255} = 255
if count of clrComps = 3
set end of clrComps to (zValueType as integer)
end
set {redValue, greenValue, blueValue, alphaValue} to clrComps
set zValueType to zValueType as integer
set aRedCocoa to (redValue / zValueType) as real
set aGreenCocoa to (greenValue / zValueType) as real
set aBlueCocoa to (blueValue / zValueType) as real
set aAlphaCocoa to (alphaValue / zValueType) as real
set aColor to cA's NSColor's colorWithCalibratedRed:aRedCocoa green:aGreenCocoa blue:aBlueCocoa alpha:aAlphaCocoa
return aColor
end makeNSColor
#-----------------------------------------------------------------------
on stringOnImg(someImage, someAttrStr, xPos, yPos)
someImage's lockFocus()
someAttrStr's drawAtPoint:(cA's NSMakePoint(xPos, yPos))
someImage's unlockFocus()
return someImage
end stringOnImg
on makeImg(aWidth, aHeight, aRadius, aFillColor)
set someImage to cA's NSImage's alloc()'s initWithSize:(cA's NSMakeSize(aWidth, aHeight))
someImage's lockFocus()
set aRect to {{x:0, y:0}, {width:aWidth, height:aHeight}}
set theNSBezierPath to cA's NSBezierPath's bezierPath
if aRadius = 0 then
theNSBezierPath's appendBezierPathWithRect:aRect
else
theNSBezierPath's appendBezierPathWithRoundedRect:aRect xRadius:aRadius yRadius:aRadius
end if
aFillColor's |set|()
theNSBezierPath's fill()
someImage's unlockFocus()
return someImage
end makeImg