Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
Common Files/EndianUtilities.c
////////// |
// |
// File: EndianUtilities.c |
// |
// Contains: Utilities for managing the endian differences between operating systems. |
// |
// Written by: Tim Monroe |
// Based on existing endian functions by various QT engineers. |
// |
// Copyright: © 1998 by Apple Computer, Inc., all rights reserved. |
// |
// Change History (most recent first): |
// |
// <1> 03/27/98 rtm first file |
// |
////////// |
#ifndef __ENDIANUTILITIES__ |
#include "EndianUtilities.h" |
#endif |
////////// |
// |
// EndianUtils_FlipImageDescription |
// Convert an image description to big- or native-endian format. |
// |
////////// |
static void EndianUtils_FlipImageDescription (Boolean theNtoB, ImageDescriptionHandle theIDH) |
{ |
(**theIDH).idSize = EndianU32_NtoB((**theIDH).idSize); |
(**theIDH).cType = EndianU32_NtoB((**theIDH).cType); |
(**theIDH).resvd1 = EndianU32_NtoB((**theIDH).resvd1); |
(**theIDH).resvd2 = EndianU16_NtoB((**theIDH).resvd2); |
(**theIDH).dataRefIndex = EndianU16_NtoB((**theIDH).dataRefIndex); |
(**theIDH).version = EndianU16_NtoB((**theIDH).version); |
(**theIDH).revisionLevel = EndianU16_NtoB((**theIDH).revisionLevel); |
(**theIDH).vendor = EndianU32_NtoB((**theIDH).vendor); |
(**theIDH).temporalQuality = EndianU32_NtoB((**theIDH).temporalQuality); |
(**theIDH).spatialQuality = EndianU32_NtoB((**theIDH).spatialQuality); |
(**theIDH).width = EndianU16_NtoB((**theIDH).width); |
(**theIDH).height = EndianU16_NtoB((**theIDH).height); |
(**theIDH).hRes = EndianU32_NtoB((**theIDH).hRes); |
(**theIDH).vRes = EndianU32_NtoB((**theIDH).vRes); |
(**theIDH).dataSize = EndianU32_NtoB((**theIDH).dataSize); |
(**theIDH).frameCount = EndianU16_NtoB((**theIDH).frameCount); |
(**theIDH).depth = EndianU16_NtoB((**theIDH).depth); |
(**theIDH).clutID = EndianU16_NtoB((**theIDH).clutID); |
if ((**theIDH).clutID == 0 ) { |
ImDesc **myHandle = (ImDesc **)theIDH; |
short i; |
// make sure there really is a color table following the image description |
if (GetHandleSize((Handle)theIDH) == sizeof(ImageDescription)) { |
(**theIDH).clutID = -1; |
} else { |
short ctSize = (**myHandle).ct.ctSize; |
if (!theNtoB) // not already native endian |
ctSize = EndianS16_NtoB(ctSize); |
(**myHandle).ct.ctSeed = EndianU16_NtoB((**myHandle).ct.ctSeed); |
(**myHandle).ct.ctSize = EndianU16_NtoB((**myHandle).ct.ctSize); |
(**myHandle).ct.ctFlags = EndianU16_NtoB((**myHandle).ct.ctFlags); |
for (i = 0; i < ctSize + 1; i++) { |
(**myHandle).ct.ctTable[i].value = EndianU16_NtoB((**myHandle).ct.ctTable[i].value); |
(**myHandle).ct.ctTable[i].rgb.red = EndianU16_NtoB((**myHandle).ct.ctTable[i].rgb.red); |
(**myHandle).ct.ctTable[i].rgb.green = EndianU16_NtoB((**myHandle).ct.ctTable[i].rgb.green); |
(**myHandle).ct.ctTable[i].rgb.blue = EndianU16_NtoB((**myHandle).ct.ctTable[i].rgb.blue); |
} |
} |
} |
} |
////////// |
// |
// EndianUtils_ImageDescription_NtoB |
// Convert an image description to big-endian format. |
// |
////////// |
void EndianUtils_ImageDescription_NtoB (ImageDescriptionHandle theIDH) |
{ |
EndianUtils_FlipImageDescription(kNtoB, theIDH); |
} |
////////// |
// |
// EndianUtils_ImageDescription_BtoN |
// Convert an image description from big- to native-endian format. |
// |
////////// |
void EndianUtils_ImageDescription_BtoN (ImageDescriptionHandle theIDH) |
{ |
EndianUtils_FlipImageDescription(kBtoN, theIDH); |
} |
////////// |
// |
// EndianUtils_MatrixRecord_NtoB |
// Convert a matrix record to big-endian format. |
// |
////////// |
void EndianUtils_MatrixRecord_NtoB (MatrixRecord *theMatrix) |
{ |
#if TARGET_RT_LITTLE_ENDIAN |
int i, j; |
for (i = 0; i < 3; i++) |
for (j = 0; j < 3; j++) |
theMatrix->matrix[j][i] = EndianS32_NtoB(theMatrix->matrix[j][i]); |
#endif |
} |
////////// |
// |
// EndianUtils_RgnHandle_NtoB |
// Convert a region handle to big-endian format. |
// |
// We know that a region consists of a size, followed by a Rect, followed possibly by a stream of SInt16s, |
// so we can just flip size of region/sizeof(SInt16) SInt16s from native- to big-endian format. |
// |
////////// |
void EndianUtils_RgnHandle_NtoB (RgnHandle theRgn) |
{ |
#if TARGET_RT_LITTLE_ENDIAN |
short mySize; |
SInt16 *mySInt16Ptr; |
if (theRgn && *theRgn) { |
HLock((Handle)theRgn); |
mySize = (**((short **)theRgn))/2; |
for (mySInt16Ptr = (SInt16*)*theRgn; mySize > 0; mySize--, mySInt16Ptr++) |
*mySInt16Ptr = EndianU16_NtoB(*mySInt16Ptr); |
HUnlock((Handle)theRgn); |
} |
#endif |
} |
////////// |
// |
// EndianUtils_Float_NtoB |
// Convert a floating-point value to big-endian format. |
// |
////////// |
void EndianUtils_Float_NtoB (float *theFloat) |
{ |
#if TARGET_RT_LITTLE_ENDIAN |
unsigned long *myLongPtr; |
myLongPtr = (unsigned long *)theFloat; |
*myLongPtr = EndianU32_NtoB(*myLongPtr); |
#endif |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-02-25