// // GetIconPict.cpp // Version 1.0 // // Created by GREIF Software on 08/03/13. // Copyright GREIF Software 2008. All rights reserved. // #include "rb_plugin.h" #include "REALplugin.h" static REALpicture GetIconFromFile( REALfolderItem f, int iconID ) { FSRef theFSRef; char theFlg; HFSUniStr255 outName; REALpicture destPic = 0; GWorldPtr GWorld, gwptr; GDHandle ghd; IconRef iconRef; IconFamilyHandle iconFamily; Handle hndl = NULL; CTabHandle cTab = NULL; Rect theRect; OSErr theErr; int iPix = 0, iSize = 0, iOffset = 0, w = 0, h = 0; OSType pixFormat[] = { k32ARGBPixelFormat,k24RGBPixelFormat,k16BE555PixelFormat,k8IndexedPixelFormat,k4IndexedPixelFormat,k2IndexedPixelFormat,k1MonochromePixelFormat, k8IndexedGrayPixelFormat,k4IndexedGrayPixelFormat,k2IndexedGrayPixelFormat,k1IndexedGrayPixelFormat}; OSType iconType[] = { kThumbnail32BitData,kHuge32BitData,kHuge8BitData,kLarge32BitData,kLarge8BitData,kSmall32BitData,kSmall8BitData,kMini8BitData, kThumbnail8BitMask,kHuge8BitMask,kHuge1BitMask,kLarge8BitMask,kLarge1BitMask,kSmall8BitMask,kSmall1BitMask,kMini1BitMask}; theFlg = REALFSRefFromFolderItem( f, &theFSRef, &outName ); GetIconRefFromFileInfo( &theFSRef, 0, NULL, kFSCatInfoNone, NULL, kIconServicesNormalUsageFlag, &iconRef, NULL ); theErr = IconRefToIconFamily( iconRef, kSelectorAllAvailableData, &iconFamily ); hndl = NewHandle(0); theErr = GetIconFamilyData( iconFamily, iconType[iconID], hndl ); if ( theErr != noErr || GetHandleSize(hndl) == 0 ) { DisposeHandle( hndl ); return 0; } HLock( hndl ); iOffset = 0; cTab = NULL; switch (iconID) { case 0: // kThumbnail32BitData w = 128; h = 128; iPix = 0; iSize = w*4; break; case 1: // kHuge32BitData w = 48; h = 48; iPix = 0; iSize = w*4; break; case 2: // kHuge8BitData w = 48; h = 48; iPix = 3; iSize = w*1; break; case 3: // kLarge32BitData w = 32; h = 32; iPix = 0; iSize = w*4; break; case 4: // kLarge8BitData w = 32; h = 32; iPix = 3; iSize = w*1; break; case 5: // kSmall32BitData w = 16; h = 16; iPix = 0; iSize = w*4; break; case 6: // kSmall8BitData w = 16; h = 16; iPix = 3; iSize = w*1; break; case 7: // kMini8BitData w = 16; h = 12; iPix = 3; iSize = w*4; break; case 8: // kThumbnail8BitMask w = 128; h = 128; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 9: // kHuge8BitMask w = 48; h = 48; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 10: // kHuge1BitMask w = 48; h = 48; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 288; break; case 11: // kLarge8BitMask w = 32; h = 32; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 12: // kLarge1BitMask w = 32; h = 32; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 128; break; case 13: // kSmall8BitMask w = 16; h = 16; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 14: // kSmall1BitMask w = 16; h = 16; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 32; break; case 15: // kMini1BitMask w = 16; h = 12; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 24; break; } SetRect( &theRect, 0, 0, w, h ); theErr = NewGWorldFromPtr( &GWorld, pixFormat[iPix], &theRect, cTab, NULL, 0, *hndl+iOffset, iSize ); if ( theErr != noErr || GWorld == NULL ) { HUnlock( hndl ); DisposeHandle( hndl ); return 0; } GetGWorld( &gwptr, &ghd ); SetGWorld( GWorld, NULL ); destPic = REALBuildPictureFromGWorld( GWorld, true ); SetGWorld( gwptr, ghd ); HUnlock( hndl ); return destPic; } static REALpicture GetIconFromSystem( int iconNo, int iconID ) { REALpicture destPic = 0; GWorldPtr GWorld, gwptr; GDHandle ghd; IconRef iconRef; IconFamilyHandle iconFamily; Handle hndl = NULL; CTabHandle cTab = NULL; Rect theRect; OSErr theErr; int iPix = 0, iSize = 0, iOffset = 0, w = 0, h = 0; OSType pixFormat[] = { k32ARGBPixelFormat,k24RGBPixelFormat,k16BE555PixelFormat,k8IndexedPixelFormat,k4IndexedPixelFormat,k2IndexedPixelFormat,k1MonochromePixelFormat, k8IndexedGrayPixelFormat,k4IndexedGrayPixelFormat,k2IndexedGrayPixelFormat,k1IndexedGrayPixelFormat}; OSType iconType[] = { kThumbnail32BitData,kHuge32BitData,kHuge8BitData,kLarge32BitData,kLarge8BitData,kSmall32BitData,kSmall8BitData,kMini8BitData,kThumbnail8BitMask, kHuge8BitMask,kHuge1BitMask,kLarge8BitMask,kLarge1BitMask,kSmall8BitMask,kSmall1BitMask,kMini1BitMask}; OSType SystemIcon[] = { kGenericFolderIcon,kDropFolderIcon,kMountedFolderIcon,kOpenFolderIcon,kOwnedFolderIcon,kPrivateFolderIcon,kSharedFolderIcon, kClipboardIcon,kClippingUnknownTypeIcon,kClippingPictureTypeIcon,kClippingTextTypeIcon,kClippingSoundTypeIcon, kDesktopIcon,kFinderIcon,kComputerIcon,kFontSuitcaseIcon,kFullTrashIcon,kGenericApplicationIcon,kGenericCDROMIcon, kGenericControlPanelIcon,kGenericControlStripModuleIcon,kGenericComponentIcon,kGenericDeskAccessoryIcon, kGenericDocumentIcon,kGenericEditionFileIcon,kGenericExtensionIcon,kGenericFileServerIcon,kGenericFontIcon, kGenericFontScalerIcon,kGenericFloppyIcon,kGenericHardDiskIcon,kGenericIDiskIcon,kGenericRemovableMediaIcon, kGenericMoverObjectIcon,kGenericPCCardIcon,kGenericPreferencesIcon,kGenericQueryDocumentIcon,kGenericRAMDiskIcon, kGenericSharedLibaryIcon,kGenericStationeryIcon,kGenericSuitcaseIcon,kGenericURLIcon,kGenericWORMIcon, kInternationalResourcesIcon,kKeyboardLayoutIcon,kSoundFileIcon,kSystemSuitcaseIcon,kTrashIcon,kTrueTypeFontIcon, kTrueTypeFlatFontIcon,kTrueTypeMultiFlatFontIcon,kUserIDiskIcon,kUnknownFSObjectIcon,kInternationResourcesIcon}; theErr = GetIconRef( kOnSystemDisk, kSystemIconsCreator, SystemIcon[iconNo], &iconRef ); theErr = IconRefToIconFamily( iconRef, kSelectorAllAvailableData, &iconFamily ); hndl = NewHandle(0); theErr = GetIconFamilyData( iconFamily, iconType[iconID], hndl ); if ( theErr != noErr || GetHandleSize(hndl) == 0 ) { DisposeHandle( hndl ); return 0; } HLock( hndl ); iOffset = 0; cTab = NULL; switch (iconID) { case 0: // kThumbnail32BitData w = 128; h = 128; iPix = 0; iSize = w*4; break; case 1: // kHuge32BitData w = 48; h = 48; iPix = 0; iSize = w*4; break; case 2: // kHuge8BitData w = 48; h = 48; iPix = 3; iSize = w*1; break; case 3: // kLarge32BitData w = 32; h = 32; iPix = 0; iSize = w*4; break; case 4: // kLarge8BitData w = 32; h = 32; iPix = 3; iSize = w*1; break; case 5: // kSmall32BitData w = 16; h = 16; iPix = 0; iSize = w*4; break; case 6: // kSmall8BitData w = 16; h = 16; iPix = 3; iSize = w*1; break; case 7: // kMini8BitData w = 16; h = 12; iPix = 3; iSize = w*4; break; case 8: // kThumbnail8BitMask w = 128; h = 128; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 9: // kHuge8BitMask w = 48; h = 48; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 10: // kHuge1BitMask w = 48; h = 48; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 288; break; case 11: // kLarge8BitMask w = 32; h = 32; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 12: // kLarge1BitMask w = 32; h = 32; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 128; break; case 13: // kSmall8BitMask w = 16; h = 16; iPix = 7; iSize = w*1; cTab = GetCTable( pixFormat[iPix] ); break; case 14: // kSmall1BitMask w = 16; h = 16; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 32; break; case 15: // kMini1BitMask w = 16; h = 12; iPix = 6; iSize = w/8; cTab = GetCTable( pixFormat[iPix] ); iOffset = 24; break; } SetRect( &theRect, 0, 0, w, h ); theErr = NewGWorldFromPtr( &GWorld, pixFormat[iPix], &theRect, cTab, NULL, 0, *hndl+iOffset, iSize ); if ( theErr != noErr || GWorld == NULL ) { HUnlock( hndl ); DisposeHandle( hndl ); return 0; } GetGWorld( &gwptr, &ghd ); SetGWorld( GWorld, NULL ); destPic = REALBuildPictureFromGWorld( GWorld, true ); SetGWorld( gwptr, ghd ); HUnlock( hndl ); return destPic; } REALmethodDefinition GetIconFromFileDefn = { (REALproc) GetIconFromFile, REALnoImplementation, "GetIconFromFile(f As FolderItem, iconID As Integer) As Picture" }; REALmethodDefinition GetIconFromSystemDefn = { (REALproc) GetIconFromSystem, REALnoImplementation, "GetIconFromSystem(iconNo As Integer, iconID As Integer) As Picture" }; void PluginEntry(void) { REALRegisterMethod(&GetIconFromFileDefn); REALRegisterMethod(&GetIconFromSystemDefn); }