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:
parent
aa15c60672
commit
d281a30f98
11
copyrect.cc
11
copyrect.cc
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
21
hextile.cc
21
hextile.cc
|
@ -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;
|
||||
|
||||
|
|
9
mouse.cc
9
mouse.cc
|
@ -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
51
raw.cc
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
typedef union Origin {
|
||||
unsigned long l;
|
||||
Point pt;
|
||||
} Origin;
|
||||
|
||||
extern unsigned int fbHeight;
|
||||
extern unsigned int fbWidth;
|
||||
|
||||
|
|
Loading…
Reference in New Issue