|
Volume Number: 14 (1998)
Issue Number: 7
Column Tag: Tips & Tidbits
Jul 98 Tips & Tidbits
by Steve Sisak
Here is a code to draw rotated QuickDraw picture without QuickDraw GX.
You can find the project files at http://www.bekkoame.or.jp/~iimori/tmp/StdPix.hqx
// // Rotate QuickDraw picture with StdPix bottleneck procedure. // #include <ImageCompression.h> #include <GXMath.h> // fl(),ff() macros #include <stdio.h> // use SIOUX window to draw on void main() { enum { kBWSmallMacOSLogo = -16501, // use MacOS Logo kSmallMacOSLogo = -16503, kBigMacOSLogo = -16506 }; PicHandle picHnd = nil; ImageDescriptionHandle descHnd = nil; printf("\n"); // initialize Toolbox ::SetPort(::FrontWindow()); long response; // examine QuickTime existence OSErr err = ::Gestalt(gestaltQuickTime,&response); if ( err ) goto rtn; CodecInfo codecInfo; // examine QuickDrawCodec existence err = ::GetCodecInfo(&codecInfo,kQuickDrawCodecType,anyCodec); if ( err ) goto rtn; picHnd = ::GetPicture(kSmallMacOSLogo); if (picHnd == nil) goto rtn; ::HNoPurge((Handle)picHnd); ::DetachResource((Handle)picHnd); Rect picRect = (**picHnd).picFrame; MatrixRecord matrix; ::SetIdentityMatrix(&matrix); Rect r(picRect); ::OffsetRect(&r,40 - r.left,40 - r.top); ::RectMatrix(&matrix,&picRect,&r); // move to (40,40) ::RotateMatrix(&matrix,ff(30), // rotate 30 degree ff((r.left + r.right)/2), ff((r.top + r.bottom)/2)); descHnd = (ImageDescriptionHandle)::NewHandleClear (sizeof(ImageDescription)); if (descHnd == nil) goto rtn; { ImageDescription& desc = **descHnd; desc.idSize = sizeof(ImageDescription); desc.cType = kQuickDrawCodecType; desc.temporalQuality = codecLosslessQuality; desc.spatialQuality = codecLosslessQuality; desc.width = picRect.right - picRect.left; desc.height = picRect.bottom - picRect.top; desc.hRes = ff(72); desc.vRes = ff(72); desc.dataSize = ::GetHandleSize((Handle)picHnd); desc.frameCount = 1; desc.depth = 32; desc.clutID = -1; } ::HLock((Handle)picHnd); PixMap pixMap; err = ::SetCompressedPixMapInfo (&pixMap,descHnd,*(Handle)picHnd,0,nil,nil); if ( err ) goto rtn; StdPixUPP uppStdPix; const CQDProcs *CQDProcPtr = ((CGrafPtr)qd.thePort)->grafProcs; if ( CQDProcPtr ) { uppStdPix = (StdPixUPP)CQDProcPtr->newProc1; }else{ CQDProcs stdProcs; ::SetStdCProcs(&stdProcs); uppStdPix = (StdPixUPP)stdProcs.newProc1; } CallStdPixProc(uppStdPix,&pixMap,&picRect,&matrix,ditherCopy, nil,nil,nil,callOldBits|callStdBits); rtn: if ( descHnd ) { ::DisposeHandle((Handle)descHnd); } if ( picHnd ) { ::KillPicture(picHnd); } }
Hideaki Iimori
iimori@lib.bekkoame.or.jp
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine