Jul 98 Tips
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