MacOSLib - Graphics Methods

Does anyone have COCOA replacements for MacOSLib items such as

SetLineDash and SetLineCap

I would like to be able to draw dotted/dashed lines and have flat and round endcaps, but don’t wish to use Carbon Functions :frowning:

Dang… figured it out myself (of course if anyone can make this BETTER I’d appreciate it)
Based on code culled from MacOSLib and converted from CARBON to COCOA

  Dim lengths(-1) As Double 
  lengths=Array(1.,3.,4.,2.)
  Declare Sub CGContextSetLineDash Lib "Cocoa" ( context As Integer, phase As Single, lengths As Ptr, count As UInt32)
  
  If UBound(lengths) > -1 Then
    Dim lengthArray As MemoryBlock 
    lengthArray= CFloatArray(lengths)
    If lengthArray Is Nil Then Return
    CGContextSetLineDash g.handle( g.HandleTypeCGContextRef ), 0,lengthArray,lengths.Ubound+1
  Else
    CGContextSetLineDash g.handle( g.HandleTypeCGContextRef ),0, Nil, 0 ' solid line
  End If
  
  g.drawline 0,0,g.Width,g.Height
FUNCTION CFLoatArray(theList() as double) as MemoryBlock
  If UBound(theList) = -1 Then
    Return Nil
  End If
  
  Const sizeOfSingle = 4
  Dim theArray As New MemoryBlock(sizeOfSingle*(1 + UBound(theList)))
  Dim offset As Integer = 0
  For i As Integer = 0 To UBound(theList)
    theArray.SingleValue(offset) = theList(i)
    offset = offset + sizeOfSingle
  Next
  
  Return theArray
END FUNCTION

And if someone could explain why this version bombs

  Dim lengths(-1) As Double 
  Dim lengthArray As MemoryBlock 
 // DO NOT DEFINE A PATTERN lengths=Array(1.,3.,4.,2.)
  Declare Sub CGContextSetLineDash Lib "Cocoa" ( context As Integer, phase As Single, lengths As Ptr, count As UInt32)
 lengthArray= CFloatArray(lengths)
 CGContextSetLineDash g.handle( g.HandleTypeCGContextRef ), 0,lengthArray,lengths.Ubound+1
  
  
  g.drawline 0,0,g.Width,g.Height

In this shorter version, I would have ASSUMED (and the debugger seems to bear me out)
it that LengthArray is NIL and Lengths.Ubound+1 is Zero
matching the parameters in the 2nd call from the first (working) code…
but 2nd version bombs with a NilException (and I expect LengthArray to be NIL)

These calls only appear to work if the line width is 1… does that sound correct?

Works for any PenWidth I have thrown at it… you just need to adjust the values in the pattern array to be larger

Here is a Function I just added to my PaintDS program to support this

SUB myLineStyle(g as graphics,pattern_id as integer=0)

  Dim lengths(-1) As Double
  Dim x As Integer
  Dim lengthArray As MemoryBlock
  Declare Sub CGContextSetLineDash Lib "Cocoa" ( context As Integer, phase As Single, lengths As Ptr, count As UInt32)
  
  x=g.penwidth
  Select Case pattern_id
  case -1 ' for lasso
    lengths=Array(x*4.,x*4.) '
  Case 1
    lengths=Array(Ceil(x/2.),x*2.) ' dotted line [.......]
  Case 2
    lengths=Array(x*8.,x*4.) ' dashed line [- - - -]
  Case 3
    lengths=Array(x*6.,x*3.,Ceil(x/2.),x*3.) ' dashed dot dash line [- . -]
  case 4
    lengths=Array(x*6.,x*3.,Ceil(x/2.),x*3.,Ceil(x/2.),x*3.) ' dashed dot dot line [-..-..]
  End Select
  //
  If UBound(lengths) > -1 Then
    lengthArray= CFloatArray(lengths)
    If lengthArray Is Nil Then Return
    CGContextSetLineDash g.handle( g.HandleTypeCGContextRef ), 0,lengthArray,lengths.Ubound+1
  Else
    CGContextSetLineDash g.handle( g.HandleTypeCGContextRef ),0, Nil, 0 ' solid line
  End If

END SUB

Should have guessed that. Cheers.