boolean ploticonfromodb (const Rect *r, short align, short transform, bigstring bsadricon) { #if defined (MACVERSION) //bigstring bsadricon = "\psystem.verbs.builtins.Frontier.tools.data.nodeTypes.link.icon.mac"; IconRef iconRef; IconFamilyHandle iconHand; SInt32 theSize; OSStatus theErr; Handle hicon; bigstring bsadriconpart; theErr = noErr; theSize = sizeof(OSType) + sizeof(OSType); newhandle(theSize, (Handle*) &iconHand); //iconHand = (IconFamilyHandle) getnewhandle(theSize, false); if (iconHand == NULL) theErr = memFullErr; if (theErr == noErr) { (*iconHand)->resourceType = EndianU32_NtoB(kIconFamilyType); (*iconHand)->resourceSize = EndianU32_NtoB(theSize); } if (theErr == noErr) { setemptystring(bsadriconpart); copystring(bsadricon, bsadriconpart); pushstring(BIGSTRING("\x05" ".ics4"), bsadriconpart); theErr = loadicondatafromodb(bsadriconpart, BIGSTRING("\x04" "ics4"), &hicon); if (theErr == noErr) { theErr = SetIconFamilyData(iconHand, kSmall4BitData, hicon); disposehandle(hicon); } } if (theErr == noErr) { setemptystring(bsadriconpart); copystring(bsadricon, bsadriconpart); pushstring(BIGSTRING("\x05" ".ics8"), bsadriconpart); theErr = loadicondatafromodb(bsadriconpart, BIGSTRING("\x04" "ics8"), &hicon); if (theErr == noErr) { theErr = SetIconFamilyData(iconHand, kSmall8BitData, hicon); disposehandle(hicon); } } if (theErr == noErr) { setemptystring(bsadriconpart); copystring(bsadricon, bsadriconpart); pushstring(BIGSTRING("\x09" ".icspound"), bsadriconpart); theErr = loadicondatafromodb(bsadriconpart, BIGSTRING("\x08" "icspound"), &hicon); if (theErr == noErr) { theErr = SetIconFamilyData(iconHand, kSmall1BitMask, hicon); disposehandle(hicon); } } if (theErr == noErr) { theErr = GetIconRefFromIconFamilyPtr(*iconHand, GetHandleSize((Handle) iconHand), &iconRef); } if (theErr == noErr) { theErr = PlotIconRef(r, align, transform, kIconServicesNormalUsageFlag, iconRef); } setemptystring(bsadriconpart); ReleaseIconRef(iconRef); disposehandle((Handle) iconHand); return theErr == noErr; #else if defined (WIN95VERSION) return FALSE; #endif }
static IconRef CreateIconRefFromImage (CGImageRef srcImage, CGRect srcRect) { OSStatus err; CGContextRef cctx, actx; CGColorSpaceRef color; CGRect dstRect; IconRef iconRef; IconFamilyHandle icns; Handle hdl; SInt32 size; UInt32 rgb[kIconSize * kIconSize]; UInt8 alp[kIconSize * kIconSize]; srcRect.origin.y = CGImageGetHeight(srcImage) - srcRect.origin.y - kIconSize; color = CGColorSpaceCreateDeviceRGB(); if (color) { cctx = CGBitmapContextCreate(rgb, kIconSize, kIconSize, 8, kIconSize * 4, color, kCGImageAlphaNoneSkipFirst); if (cctx) { dstRect = CGRectMake(0, 0, kIconSize, kIconSize); DrawSubCGImage(cctx, srcImage, srcRect, dstRect); actx = CGBitmapContextCreate(alp, kIconSize, kIconSize, 8, kIconSize, NULL, kCGImageAlphaOnly); if (actx) { DrawSubCGImage(actx, srcImage, srcRect, dstRect); CGContextRelease(actx); } CGContextRelease(cctx); } CGColorSpaceRelease(color); } iconRef = NULL; size = sizeof(OSType) + sizeof(SInt32); icns = (IconFamilyHandle) NewHandle(size); if (icns) { // Big-endian: Panther is for PowerPC only (*icns)->resourceType = kIconFamilyType; (*icns)->resourceSize = size; err = PtrToHand(rgb, &hdl, sizeof(rgb)); if (err == noErr) { err = SetIconFamilyData(icns, kSmall32BitData, hdl); DisposeHandle(hdl); if (err == noErr) { err = PtrToHand(alp, &hdl, sizeof(alp)); if (err == noErr) { err = SetIconFamilyData(icns, kSmall8BitMask, hdl); DisposeHandle(hdl); } } } if (err == noErr) err = GetIconRefFromIconFamilyPtr(*icns, GetHandleSize((Handle) icns), &iconRef); DisposeHandle((Handle) icns); } return (iconRef); }