Converting a CFImageRef to a NSImage
Converting a CFImageRef to a NSImage
- Subject: Converting a CFImageRef to a NSImage
- From: "Felipe Monteiro de Carvalho" <email@hidden>
- Date: Thu, 5 Jun 2008 20:35:52 -0300
Hello,
I am trying to build a statusitem component for a Carbon based
library. Of course I can only use Cocoa for that, so I need to convert
my CFImageRef to a NSImage. Searching in the internet I found code to
do that.
I found the following code in the internet:
NSImage* image = [[NSImage alloc] initWithSize:rect.size];
[image lockFocus];
CGContextDrawImage([[NSGraphicsContext currentContext]
graphicsPort], *(CGRect*)&rect, imageRef);
[image unlockFocus];
And I converted and adapted it to Pascal in my full code bellow, but I
keep getting an error saying that the context is invalid. Does anyone
know why? Here is the debug output:
[DBGTGT] :>[TCarbonWSCustomTrayIcon.Show]
Jun 5 20:17:03 computador-de-felipe-monteiro-de-carvalho
/Users/felipe/Programas/lazarus/examples/trayicon/Wndtray.app/Contents/MacOS/Wndtray:
CGContextDrawImage: invalid context
[DBGTGT] :<[TCarbonWSCustomTrayIcon.Show] Handle: 01862980
ACGRect.size.width: 2.200000000E+01 ACGRect.size.height:
2.200000000E+01 ACGRect.origin.x: 0.000000000E+00 ACGRect.origin.y:
0.000000000E+00 TCarbonBitmap(ATrayIcon.Icon.Handle).CGImage 01B0BEC0
And my code:
class function TCarbonWSCustomTrayIcon.Show(const ATrayIcon:
TCustomTrayIcon): Boolean;
var
APrivateTrayIcon: TPrivateCocoaCarbonTrayIcon;
ASize: NSSize;
ACGRect: CGRect;
AcurrentContext: NSGraphicsContext;
begin
{$ifdef VerboseCarbonTrayIcon}
WriteLn(':>[TCarbonWSCustomTrayIcon.Show]');
{$endif VerboseCarbonTrayIcon}
Result := False;
{ Creates the handle }
APrivateTrayIcon := TPrivateCocoaCarbonTrayIcon.Create;
APrivateTrayIcon.bar := NSStatusBar.systemStatusBar();
ATrayIcon.Handle := PtrInt(APrivateTrayIcon);
{ Convert our CFImageRef to a NSImage }
ASize.width := TCarbonBitmap(ATrayIcon.Icon.Handle).Width;
ASize.height := TCarbonBitmap(ATrayIcon.Icon.Handle).Height;
ACGRect.size.width := ASize.width;
ACGRect.size.height := ASize.height;
ACGRect.origin.x := 0;
ACGRect.origin.y := 0;
APrivateTrayIcon.image := NSImage.initWithSize(ASize);
APrivateTrayIcon.image.lockFocus;
AcurrentContext := NSGraphicsContext.currentContext();
CGContextDrawImage(AcurrentContext.graphicsPort, ACGRect,
TCarbonBitmap(ATrayIcon.Icon.Handle).CGImage);
APrivateTrayIcon.image.unlockFocus;
{ Shows the icon }
if APrivateTrayIcon.item <> nil then Exit(True);
APrivateTrayIcon.item :=
APrivateTrayIcon.bar.statusItemWithLength(NSSquareStatusItemLength);
APrivateTrayIcon.item.retain();
APrivateTrayIcon.item.setImage(APrivateTrayIcon.image);
Result := True;
{$ifdef VerboseCarbonTrayIcon}
WriteLn(':<[TCarbonWSCustomTrayIcon.Show]',
' Handle: ', IntToHex(ATrayIcon.Handle, 8),
' ACGRect.size.width: ', ACGRect.size.width,
' ACGRect.size.height: ', ACGRect.size.height,
' ACGRect.origin.x: ', ACGRect.origin.x,
' ACGRect.origin.y: ', ACGRect.origin.y,
' TCarbonBitmap(ATrayIcon.Icon.Handle).CGImage ',
IntToHex(Int64(TCarbonBitmap(ATrayIcon.Icon.Handle).CGImage), 8)
);
{$endif VerboseCarbonTrayIcon}
end;
thanks,
--
Felipe Monteiro de Carvalho
_______________________________________________
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