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

View File

@ -38,8 +38,7 @@ extern pascal void SetContentOrigin2(Word, Word, Word, GrafPortPtr) inline(0x570
void DoDesktopSize (void) {
#define screenTooBigError 2010
unsigned long contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
Origin contentOrigin;
unsigned int newX, newY;
Boolean changeOrigin = FALSE;
unsigned int oldWinHeight, oldWinWidth;
@ -64,15 +63,15 @@ void DoDesktopSize (void) {
SizeWindow(winWidth, winHeight, vncWindow);
/* Scroll if area displayed is going away */
contentOrigin = GetContentOrigin(vncWindow);
newX = contentOriginPtr->h;
newY = contentOriginPtr->v;
contentOrigin.l = GetContentOrigin(vncWindow);
newX = contentOrigin.pt.h;
newY = contentOrigin.pt.v;
if (contentOriginPtr->h + winWidth > fbWidth) {
if (contentOrigin.pt.h + winWidth > fbWidth) {
newX = fbWidth - winWidth;
changeOrigin = TRUE;
}
if (contentOriginPtr->v + winHeight > fbHeight) {
if (contentOrigin.pt.v + winHeight > fbHeight) {
newY = fbHeight - winHeight;
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 n = 0;
unsigned char *dataPtr;
@ -164,8 +164,8 @@ static void HexRawDraw (Point *contentOriginPtr, int rectWidth, int rectHeight)
srcRect.h2 = hexTileWidth;
PPToPort(&srcLocInfo, &srcRect,
rectX + hexXTileNum * 16 - contentOriginPtr->h,
rectY + hexYTileNum * 16 - contentOriginPtr->v, modeCopy);
rectX + hexXTileNum * 16 - contentOrigin.pt.h,
rectY + hexYTileNum * 16 - contentOrigin.pt.v, modeCopy);
}
/* 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 { \
SetSolidPenPat((color)); \
drawingRect.h1 = rectX + hexXTileNum * 16 + (X) - contentOriginPtr->h; \
drawingRect.v1 = rectY + hexYTileNum * 16 + (Y) - contentOriginPtr->v; \
drawingRect.h2 = rectX + hexXTileNum * 16 + (X) + (width) - contentOriginPtr->h; \
drawingRect.v2 = rectY + hexYTileNum * 16 + (Y) + (height) - contentOriginPtr->v; \
drawingRect.h1 = rectX + hexXTileNum * 16 + (X) - contentOrigin.pt.h; \
drawingRect.v1 = rectY + hexYTileNum * 16 + (Y) - contentOrigin.pt.v; \
drawingRect.h2 = rectX + hexXTileNum * 16 + (X) + (width) - contentOrigin.pt.h; \
drawingRect.v2 = rectY + hexYTileNum * 16 + (Y) + (height) - contentOrigin.pt.v; \
PaintRect(&drawingRect); \
} while (0)
@ -197,15 +197,14 @@ void HexDispatch (void) {
static unsigned int numSubrects;
int i;
/* For use with GetContentOrigin() */
unsigned long contentOrigin;
Point * contentOriginPtr = (void *) &contentOrigin;
Origin contentOrigin;
int tileBytes;
unsigned int srX, srY, srWidth, srHeight;
Rect drawingRect;
static unsigned char pixels[128];
unsigned char *dataPtr;
contentOrigin = GetContentOrigin(vncWindow);
contentOrigin.l = GetContentOrigin(vncWindow);
SetPort(vncWindow);
/* If we don't have the next bit of needed data yet, return. */
@ -237,7 +236,7 @@ void HexDispatch (void) {
break;
case hexWaitingForRawData:
HexRawDraw(contentOriginPtr, hexTileWidth, hexTileHeight);
HexRawDraw(contentOrigin, hexTileWidth, hexTileHeight);
HexDispatch_NextTile();
break;

View File

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

51
raw.cc
View File

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

View File

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