Use less ugly (and faster) code for content origin calculations.

Specifically, use a union rather than pointer-based type punning to convert the Long value returned by GetContentOrigin() to a Point. This makes for more readable code and should also generate somewhat better assembly code.
This commit is contained in:
Stephen Heumann 2016-05-28 23:58:04 -05:00
parent aa15c60672
commit d281a30f98
7 changed files with 57 additions and 60 deletions

View File

@ -35,8 +35,7 @@ segment "VNCview GS";
void DoCopyRect (void) { void DoCopyRect (void) {
/* For use with GetContentOrigin() */ /* For use with GetContentOrigin() */
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
Rect srcRect; Rect srcRect;
unsigned int *dataPtr; /* Pointer to TCP data that was read */ unsigned int *dataPtr; /* Pointer to TCP data that was read */
@ -46,11 +45,11 @@ void DoCopyRect (void) {
if (! DoReadTCP ((unsigned long) 4)) if (! DoReadTCP ((unsigned long) 4))
return; /* Not ready yet; wait */ return; /* Not ready yet; wait */
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
dataPtr = (unsigned int *) ((char *) (*readBufferHndl)); dataPtr = (unsigned int *) ((char *) (*readBufferHndl));
srcRect.h1 = SwapBytes2(dataPtr[0]) - contentOriginPtr->h; srcRect.h1 = SwapBytes2(dataPtr[0]) - contentOrigin.pt.h;
srcRect.v1 = SwapBytes2(dataPtr[1]) - contentOriginPtr->v; srcRect.v1 = SwapBytes2(dataPtr[1]) - contentOrigin.pt.v;
srcRect.h2 = srcRect.h1 + rectWidth; srcRect.h2 = srcRect.h1 + rectWidth;
srcRect.v2 = srcRect.v1 + rectHeight; srcRect.v2 = srcRect.v1 + rectHeight;
@ -67,7 +66,7 @@ void DoCopyRect (void) {
* with a grafPort structure, which in turn starts with a LocInfo structure. * with a grafPort structure, which in turn starts with a LocInfo structure.
*/ */
PPToPort((struct LocInfo *) vncWindow, &srcRect, PPToPort((struct LocInfo *) vncWindow, &srcRect,
rectX - contentOriginPtr->h, rectY - contentOriginPtr->v, modeCopy); rectX - contentOrigin.pt.h, rectY - contentOrigin.pt.v, modeCopy);
done: done:
NextRect(); /* Prepare for next rect */ NextRect(); /* Prepare for next rect */

View File

@ -38,8 +38,7 @@ extern pascal void SetContentOrigin2(Word, Word, Word, GrafPortPtr) inline(0x570
void DoDesktopSize (void) { void DoDesktopSize (void) {
#define screenTooBigError 2010 #define screenTooBigError 2010
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
unsigned int newX, newY; unsigned int newX, newY;
Boolean changeOrigin = FALSE; Boolean changeOrigin = FALSE;
unsigned int oldWinHeight, oldWinWidth; unsigned int oldWinHeight, oldWinWidth;
@ -64,15 +63,15 @@ void DoDesktopSize (void) {
SizeWindow(winWidth, winHeight, vncWindow); SizeWindow(winWidth, winHeight, vncWindow);
/* Scroll if area displayed is going away */ /* Scroll if area displayed is going away */
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
newX = contentOriginPtr->h; newX = contentOrigin.pt.h;
newY = contentOriginPtr->v; newY = contentOrigin.pt.v;
if (contentOriginPtr->h + winWidth > fbWidth) { if (contentOrigin.pt.h + winWidth > fbWidth) {
newX = fbWidth - winWidth; newX = fbWidth - winWidth;
changeOrigin = TRUE; changeOrigin = TRUE;
} }
if (contentOriginPtr->v + winHeight > fbHeight) { if (contentOrigin.pt.v + winHeight > fbHeight) {
newY = fbHeight - winHeight; newY = fbHeight - winHeight;
changeOrigin = TRUE; changeOrigin = TRUE;
} }

View File

@ -70,7 +70,7 @@ static void HexNextTile (void) {
} }
static void HexRawDraw (Point *contentOriginPtr, int rectWidth, int rectHeight) { static void HexRawDraw (Origin contentOrigin, int rectWidth, int rectHeight) {
unsigned int i, j; /* Loop indices */ unsigned int i, j; /* Loop indices */
unsigned int n = 0; unsigned int n = 0;
unsigned char *dataPtr; unsigned char *dataPtr;
@ -164,8 +164,8 @@ static void HexRawDraw (Point *contentOriginPtr, int rectWidth, int rectHeight)
srcRect.h2 = hexTileWidth; srcRect.h2 = hexTileWidth;
PPToPort(&srcLocInfo, &srcRect, PPToPort(&srcLocInfo, &srcRect,
rectX + hexXTileNum * 16 - contentOriginPtr->h, rectX + hexXTileNum * 16 - contentOrigin.pt.h,
rectY + hexYTileNum * 16 - contentOriginPtr->v, modeCopy); rectY + hexYTileNum * 16 - contentOrigin.pt.v, modeCopy);
} }
/* The macros below are used in HexDispatch() */ /* The macros below are used in HexDispatch() */
@ -180,10 +180,10 @@ static void HexRawDraw (Point *contentOriginPtr, int rectWidth, int rectHeight)
#define HexDispatch_DrawRect(color, X, Y, width, height) do { \ #define HexDispatch_DrawRect(color, X, Y, width, height) do { \
SetSolidPenPat((color)); \ SetSolidPenPat((color)); \
drawingRect.h1 = rectX + hexXTileNum * 16 + (X) - contentOriginPtr->h; \ drawingRect.h1 = rectX + hexXTileNum * 16 + (X) - contentOrigin.pt.h; \
drawingRect.v1 = rectY + hexYTileNum * 16 + (Y) - contentOriginPtr->v; \ drawingRect.v1 = rectY + hexYTileNum * 16 + (Y) - contentOrigin.pt.v; \
drawingRect.h2 = rectX + hexXTileNum * 16 + (X) + (width) - contentOriginPtr->h; \ drawingRect.h2 = rectX + hexXTileNum * 16 + (X) + (width) - contentOrigin.pt.h; \
drawingRect.v2 = rectY + hexYTileNum * 16 + (Y) + (height) - contentOriginPtr->v; \ drawingRect.v2 = rectY + hexYTileNum * 16 + (Y) + (height) - contentOrigin.pt.v; \
PaintRect(&drawingRect); \ PaintRect(&drawingRect); \
} while (0) } while (0)
@ -197,15 +197,14 @@ void HexDispatch (void) {
static unsigned int numSubrects; static unsigned int numSubrects;
int i; int i;
/* For use with GetContentOrigin() */ /* For use with GetContentOrigin() */
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
int tileBytes; int tileBytes;
unsigned int srX, srY, srWidth, srHeight; unsigned int srX, srY, srWidth, srHeight;
Rect drawingRect; Rect drawingRect;
static unsigned char pixels[128]; static unsigned char pixels[128];
unsigned char *dataPtr; unsigned char *dataPtr;
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
SetPort(vncWindow); SetPort(vncWindow);
/* If we don't have the next bit of needed data yet, return. */ /* If we don't have the next bit of needed data yet, return. */
@ -237,7 +236,7 @@ void HexDispatch (void) {
break; break;
case hexWaitingForRawData: case hexWaitingForRawData:
HexRawDraw(contentOriginPtr, hexTileWidth, hexTileHeight); HexRawDraw(contentOrigin, hexTileWidth, hexTileHeight);
HexDispatch_NextTile(); HexDispatch_NextTile();
break; break;

View File

@ -46,8 +46,7 @@ void DoPointerEvent (void) {
} pointerEventStruct = { 5 /* message type */ }; } pointerEventStruct = { 5 /* message type */ };
Point mouseCoords; Point mouseCoords;
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
RegionHndl contentRgnHndl; RegionHndl contentRgnHndl;
unsigned int oldButtonMask; unsigned int oldButtonMask;
GrafPortPtr winPtr; GrafPortPtr winPtr;
@ -73,9 +72,9 @@ void DoPointerEvent (void) {
GlobalToLocal(&mouseCoords); GlobalToLocal(&mouseCoords);
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
mouseCoords.h += contentOriginPtr->h; mouseCoords.h += contentOrigin.pt.h;
mouseCoords.v += contentOriginPtr->v; mouseCoords.v += contentOrigin.pt.v;
mouseCoords.h = SwapBytes2(mouseCoords.h); mouseCoords.h = SwapBytes2(mouseCoords.h);
mouseCoords.v = SwapBytes2(mouseCoords.v); mouseCoords.v = SwapBytes2(mouseCoords.v);

51
raw.cc
View File

@ -72,8 +72,7 @@ void RawDraw (void) {
static EventRecord unusedEventRec; static EventRecord unusedEventRec;
/* For use with GetContentOrigin() */ /* For use with GetContentOrigin() */
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
SetPort(vncWindow); /* Drawing in VNC window */ SetPort(vncWindow); /* Drawing in VNC window */
dataPtr = (unsigned char *) *readBufferHndl; dataPtr = (unsigned char *) *readBufferHndl;
@ -84,28 +83,28 @@ void RawDraw (void) {
if (checkBounds) { if (checkBounds) {
Rect drawingRect; Rect drawingRect;
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
drawingRect.h1 = rectX - contentOriginPtr->h; drawingRect.h1 = rectX - contentOrigin.pt.h;
drawingRect.h2 = rectX - contentOriginPtr->h + rectWidth; drawingRect.h2 = rectX - contentOrigin.pt.h + rectWidth;
drawingRect.v1 = rectY - contentOriginPtr->v + drawingLine; drawingRect.v1 = rectY - contentOrigin.pt.v + drawingLine;
drawingRect.v2 = rectY - contentOriginPtr->v + rectHeight; drawingRect.v2 = rectY - contentOrigin.pt.v + rectHeight;
if (!RectInRgn(&drawingRect, GetVisHandle())) { if (!RectInRgn(&drawingRect, GetVisHandle())) {
StopRawDrawing(); StopRawDrawing();
return; return;
} }
else if (rectY + drawingLine < contentOriginPtr->v) { else if (rectY + drawingLine < contentOrigin.pt.v) {
destPtr += (unsigned long)lineBytes * destPtr += (unsigned long)lineBytes *
(contentOriginPtr->v - rectY - drawingLine); (contentOrigin.pt.v - rectY - drawingLine);
drawingLine = contentOriginPtr->v - rectY; drawingLine = contentOrigin.pt.v - rectY;
if (drawingLine >= rectHeight) { /* Sanity check */ if (drawingLine >= rectHeight) { /* Sanity check */
StopRawDrawing(); StopRawDrawing();
return; return;
} }
} }
else if (rectY + rectHeight - 1 > contentOriginPtr->v + winHeight) else if (rectY + rectHeight - 1 > contentOrigin.pt.v + winHeight)
rectHeight = contentOriginPtr->v + winHeight - rectY + 1; rectHeight = contentOrigin.pt.v + winHeight - rectY + 1;
checkBounds = FALSE; checkBounds = FALSE;
} }
@ -149,9 +148,9 @@ void RawDraw (void) {
if (pixels > 613 && !(drawingLine & 0x03)) { /* Draw every 4th line */ if (pixels > 613 && !(drawingLine & 0x03)) { /* Draw every 4th line */
srcRect.v2 = drawingLine; srcRect.v2 = drawingLine;
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
PPToPort(&srcLocInfo, &srcRect, rectX - contentOriginPtr->h, PPToPort(&srcLocInfo, &srcRect, rectX - contentOrigin.pt.h,
rectY + srcRect.v1 - contentOriginPtr->v, modeCopy); rectY + srcRect.v1 - contentOrigin.pt.v, modeCopy);
srcRect.v1 = drawingLine; srcRect.v1 = drawingLine;
} }
@ -160,9 +159,9 @@ void RawDraw (void) {
/* Draw final rect, if necessary */ /* Draw final rect, if necessary */
if (drawingLine > srcRect.v1) { if (drawingLine > srcRect.v1) {
srcRect.v2 = drawingLine; srcRect.v2 = drawingLine;
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
PPToPort(&srcLocInfo, &srcRect, rectX - contentOriginPtr->h, PPToPort(&srcLocInfo, &srcRect, rectX - contentOrigin.pt.h,
rectY + srcRect.v1 - contentOriginPtr->v, modeCopy); rectY + srcRect.v1 - contentOrigin.pt.v, modeCopy);
} }
StopRawDrawing(); StopRawDrawing();
return; return;
@ -189,8 +188,7 @@ void RawDraw (void) {
static void RawDrawLine (void) { static void RawDrawLine (void) {
unsigned int i; unsigned int i;
unsigned char *dataPtr; unsigned char *dataPtr;
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
if (hRez == 640) { if (hRez == 640) {
if (rectWidth & 0x03) /* Width not an exact multiple of 4 */ if (rectWidth & 0x03) /* Width not an exact multiple of 4 */
@ -262,9 +260,9 @@ static void RawDrawLine (void) {
} }
DoneWithReadBuffer(); DoneWithReadBuffer();
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
PPToPort(&srcLocInfo, &srcRect, rectX - contentOriginPtr->h, PPToPort(&srcLocInfo, &srcRect, rectX - contentOrigin.pt.h,
rectY - contentOriginPtr->v, modeCopy); rectY - contentOrigin.pt.v, modeCopy);
free(srcLocInfo.ptrToPixImage); /* Allocated as destPtr */ free(srcLocInfo.ptrToPixImage); /* Allocated as destPtr */
TCPIPPoll(); TCPIPPoll();
@ -315,11 +313,10 @@ void DoRawRect (void) {
* update requests for multiple screen regions due to scrolling. * update requests for multiple screen regions due to scrolling.
*/ */
if (lineBytes * rectHeight >= DESTBUF_SIZE) { if (lineBytes * rectHeight >= DESTBUF_SIZE) {
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
SendFBUpdateRequest(FALSE, contentOriginPtr->h, contentOriginPtr->v, SendFBUpdateRequest(FALSE, contentOrigin.pt.h, contentOrigin.pt.v,
winWidth, winHeight); winWidth, winHeight);
StopRawDrawing(); StopRawDrawing();
return; return;

View File

@ -279,13 +279,12 @@ void NextRect (void) {
//printf("New Rect: X = %u, Y = %u, Width = %u, Height = %u\n", rectX, rectY, rectWidth, rectHeight); //printf("New Rect: X = %u, Y = %u, Width = %u, Height = %u\n", rectX, rectY, rectWidth, rectHeight);
} }
else { /* No more rectangles from last update */ else { /* No more rectangles from last update */
unsigned long contentOrigin; Origin contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
DoneWithReadBuffer(); DoneWithReadBuffer();
contentOrigin = GetContentOrigin(vncWindow); contentOrigin.l = GetContentOrigin(vncWindow);
SendFBUpdateRequest(TRUE, contentOriginPtr->h, contentOriginPtr->v, SendFBUpdateRequest(TRUE, contentOrigin.pt.h, contentOrigin.pt.v,
winWidth, winHeight); winWidth, winHeight);
} }
} }

View File

@ -1,3 +1,8 @@
typedef union Origin {
unsigned long l;
Point pt;
} Origin;
extern unsigned int fbHeight; extern unsigned int fbHeight;
extern unsigned int fbWidth; extern unsigned int fbWidth;