Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2010-10

Canvas.ClipRect on Darwin

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

EarMaster - Bent Normann Olsen

Hi,

I'm on MacOSX 10.5.8, and Lazarus 0.9.29 (r27648M, i386-darwin-carbon(beta)).

I often use InvalidateRect to speed up things, and do drawings on a canvas limited with a rect, so I like to use the Canvas.ClipRect on a paint event, but the function TCarbonDeviceContext.GetClipRect uses the CGContextGetClipBoundingBox to return the rect of a clipping area.

  Result := CGRectToRect(CGContextGetClipBoundingBox(CGContext));

I read somewhere on Apple Mailings Lists that due to the way it is implemented (not in Lazarus), it will often return a rect that is much larger than the actual bounds of a clipping shape - which always is the case on a paint event after an InvalidateRect.

I also read that I could use HIShapeGetBounds on a HIShapeRef in kEventParamShape to get the bounds of the dirty area, but before I can do that I also need to call GetEventParameter with an EventRef, which I don't have because I use OnPaint/Paint to do the drawings, and I only have access to a TCanvas.

I tried to add a few lines of test codes in the CarbonCommon_Draw() to see if I could get a rect I could save somewhere, but none of the rects from HIShapeGetBounds returned recognizable rectangles.

I might be using these in a wrong way:

var
  FShape: HIShapeRef;
  FRect: TRect;
  FHIRect: HIRect;
...
  GetEventParameter(AEvent, kEventParamShape, typeHIShapeRef, nil,
SizeOf(FShape), nil, @FShape);
  HIShapeGetBounds(FShape, FHIRect);
  FRect := CGRectToRect(FHIRect);
...

I also don't have any idea how to redirect this FRect to the OnPaint event, but since it don't return a rect I invalidated, I haven't look at this yet.

The InvalidateRect truly invalidate a rectangle with right dimensions (only a partial area of the canvas is paintable).

Any ideas on how to implement Canvas.ClipRect with correct rects?

Best regards,
Normann

Reply by email