void SKY_BOX::update_position() //centers the sky box around the camera { Wpt eye = VIEW::eye(); if (eye.dist_sqrd(xform().origin()) > 0) { //only update when really needed set_xform(Wtransf(eye)); err_adv(debug, "SKY_BOX::update_position: updated skybox"); } }
static void create_window(ws_state_list *p) { Rect screenRect, wRect; CGrafPtr screenPort; screenPort = CreateNewPort(); GetPortBounds(screenPort, &screenRect); DisposePort(screenPort); p->width = p->height = 500; p->swidth = screenRect.right - screenRect.left; p->sheight = screenRect.bottom - screenRect.top; p->window[0] = p->window[2] = 0.0; p->window[1] = p->window[3] = 1.0; p->viewport[0] = p->viewport[2] = 0; p->viewport[1] = (double)p->width * MWIDTH / p->swidth; p->viewport[3] = (double)p->height * MWIDTH / p->sheight; SetRect(&wRect, 0, 0, p->width, p->height); CreateNewWindow( kDocumentWindowClass, kWindowStandardDocumentAttributes | kWindowStandardHandlerAttribute, &wRect, &p->win); SetWindowTitleWithCFString(p->win, CFSTR("GKS 5")); ChangeWindowAttributes(p->win, 0, kWindowCloseBoxAttribute | kWindowResizableAttribute); RepositionWindow(p->win, NULL, kWindowCascadeOnMainScreen); ShowWindow(p->win); GetWindowPortBounds(p->win, &wRect); ClipRect(&wRect); set_xform(); }
void Test_CombineTransform() { XFORM xform1, xform2, xform3; /* Test NULL paramters */ set_xform(&xform1, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); set_xform(&xform2, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); SetLastError(ERROR_SUCCESS); ok_int(CombineTransform(&xform3, &xform1, NULL), 0); ok_int(CombineTransform(&xform3, NULL, &xform2), 0); ok_int(CombineTransform(NULL, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); /* 2 zero matrices */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); SetLastError(ERROR_SUCCESS); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); ok_int(GetLastError(), ERROR_SUCCESS); /* 2 Identity matrices */ set_xform(&xform1, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); set_xform(&xform2, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); SetLastError(ERROR_SUCCESS); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 1.0, 0., 0., 1.0, 0., 0.); ok_int(GetLastError(), ERROR_SUCCESS); /* 2 Identity matrices with offsets */ set_xform(&xform1, 1.0, 0.0, 0.0, 1.0, 20.0, -100.0); set_xform(&xform2, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 1.0, 0., 0., 1.0, 20.0, -100.0); xform2.eDx = -60.0; xform2.eDy = -20; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_flt(xform3.eDx, -40.0); ok_flt(xform3.eDy, -120.0); /* add some stretching */ xform2.eM11 = 2; xform2.eM22 = 4; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 2.0, 0., 0., 4.0, -20.0, -420.0); /* add some more stretching */ xform1.eM11 = -2.5; xform1.eM22 = 0.5; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, -5.0, 0., 0., 2.0, -20.0, -420.0); xform1.eM12 = 2.0; xform1.eM21 = -0.5; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, -5.0, 8.0, -1.0, 2.0, -20.0, -420.0); xform2.eM12 = 4.0; xform2.eM21 = 6.5; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 8.0, -2.0, 2.25, 0.0, -670.0, -340.0); set_xform(&xform1, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); set_xform(&xform2, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); set_xform(&xform3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); xform1.eDx = (FLOAT)4294967167.999999761; ok(xform1.eDx == 4294967040.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 1.0, 0.0, 0.0, 1.0, 4294967040.0, 0.0); set_xform(&xform3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); xform1.eDx = (FLOAT)4294967167.999999762; ok(xform1.eDx == 4294967296.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); ok_xform(xform3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); xform1.eDx = (FLOAT)-4294967167.999999761; ok(xform1.eDx == -4294967040.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); xform1.eDx = (FLOAT)-4294967167.999999762; ok(xform1.eDx == -4294967296.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); xform1.eDx = 0; xform1.eDy = (FLOAT)4294967167.999999761; ok(xform1.eDy == 4294967040.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); xform2.eDy = 1; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_flt(xform3.eDy, 4294967040.0); xform1.eDy = (FLOAT)4294967167.999999762; ok(xform1.eDy == 4294967296.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); xform1.eDy = (FLOAT)-4294967167.999999761; ok(xform1.eDy == -4294967040.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); xform1.eDy = (FLOAT)-4294967167.999999762; ok(xform1.eDy == -4294967296.0, "float rounding error.\n"); ok_int(CombineTransform(&xform3, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); xform2.eDy = 10000; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); set_xform(&xform1, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0); xform1.eDx = (FLOAT)-4294967167.999999762; xform2.eM11 = 1000.0; ok_int(CombineTransform(&xform3, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); xform1.eDx = 100000.0; xform2.eM11 = 100000.0; ok_int(CombineTransform(&xform3, &xform1, &xform2), 0); ok_int(GetLastError(), ERROR_SUCCESS); /* Some undefined values */ set_xform(&xform1, geIND, 0.0, 0.0, geINF, 0.0, 0.0); xform2 = xform1; SetLastError(ERROR_SUCCESS); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, geIND, 0.0, 0.0, geINF, 0.0, 0.0); ok_int(GetLastError(), ERROR_SUCCESS); set_xform(&xform2, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, geIND, geIND, geINF, geINF, 0.0, 0.0); ok_int(GetLastError(), ERROR_SUCCESS); set_xform(&xform1, (FLOAT)18446743500000000000.0, 0.0, 1.0, 0.0, 0.0, 0.0); xform2 = xform1; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_flt(xform3.eM11, 340282326356119260000000000000000000000.0); xform1.eM11 = (FLOAT)18446745000000000000.0; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_flt(xform3.eM11, 340282346638528860000000000000000000000.0); xform1.eM11 = (FLOAT)18446746000000000000.0; ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_long(*(DWORD*)&xform3.eM11, 0x7f800000); /* zero matrix + 1 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); *(DWORD*)&xform2.eM22 = 0x7f800000; // (0.0F/0.0F) ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 0.0, 0.0, 0.0, geIND, 0.0, 0.0); /* zero matrix + 1 invalid */ xform2 = xform1; *(DWORD*)&xform2.eM12 = 0x7f800000; // (0.0F/0.0F) ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 0.0, geIND, 0.0, geIND, 0.0, 0.0); /* Some undefined values */ set_xform(&xform1, 0.0, geIND, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, geIND, 0.0, 0.0, geINF, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, geIND, geIND, geIND, geIND, 0.0, 0.0); }
void Test_CombineTransform_Inval(float eInval, float eOut) { XFORM xform1, xform2, xform3; /* zero matrix / M11 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, eInval, 0.0, 0.0, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, eOut, 0.0, 0.0, 0.0, 0.0, 0.0); // -> M21 ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, eOut, 0.0, 0.0, 0.0, 0.0, 0.0); // -> M12 /* zero matrix / M12 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, 0.0, eInval, 0.0, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 0.0, eOut, 0.0, eOut, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, eOut, eOut, 0.0, 0.0, 0.0, 0.0); /* zero matrix / M21 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, 0.0, 0.0, eInval, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, eOut, 0.0, eOut, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, 0.0, 0.0, eOut, eOut, 0.0, 0.0); /* zero matrix / M22 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, 0.0, 0.0, 0.0, eInval, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, 0.0, 0.0, 0.0, eOut, 0.0, 0.0); // -> M12 ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, 0.0, 0.0, 0.0, eOut, 0.0, 0.0); // -> M21 /* zero matrix / M11,M12 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, eInval, eInval, 0.0, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, eOut, eOut, eOut, eOut, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, eOut, eOut, 0.0, 0.0, 0.0, 0.0); /* zero matrix / M11,M21 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, eInval, 0.0, eInval, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, eOut, 0.0, eOut, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, eOut, eOut, eOut, eOut, 0.0, 0.0); /* zero matrix / M11,M22 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, eInval, 0.0, 0.0, eInval, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, eOut, 0.0, 0.0, eOut, 0.0, 0.0); // -> M12, M21 ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, eOut, 0.0, 0.0, eOut, 0.0, 0.0); /* zero matrix / M12,M21 invalid */ set_xform(&xform1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); set_xform(&xform2, 0.0, eInval, eInval, 0.0, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform1, &xform2), 1); ok_xform(xform3, eOut, eOut, eOut, eOut, 0.0, 0.0); ok_int(CombineTransform(&xform3, &xform2, &xform1), 1); ok_xform(xform3, eOut, eOut, eOut, eOut, 0.0, 0.0); }
void gks_drv_mac( int fctid, int dx, int dy, int dimx, int *ia, int lr1, double *r1, int lr2, double *r2, int lc, char *chars, void **ptr) { p = (ws_state_list *) *ptr; switch (fctid) { /* open workstation */ case 2: gkss = (gks_state_list_t *) *ptr; p = (ws_state_list *) calloc(1, sizeof(ws_state_list)); if (pthread_mutex_init(&p->mutex, NULL)) { perror("pthread_mutex_init"); exit(-1); } p->run = 0; if (pthread_create(&p->thread, NULL, exec, (void *) p)) { perror("pthread_create"); exit(-1); } while (!p->run) usleep(10000); p->port = GetWindowPort(p->win); SetPort(p->port); *ptr = p; break; /* close workstation */ case 3: p->run = 0; pthread_join(p->thread, NULL); pthread_mutex_destroy(&p->mutex); free(p); break; /* activate workstation */ case 4: p->state = GKS_K_WS_ACTIVE; break; /* deactivate workstation */ case 5: p->state = GKS_K_WS_INACTIVE; break; /* clear workstation */ case 6: clear_ws(); break; /* update workstation */ case 8: pthread_mutex_lock(&p->mutex); QDFlushPortBuffer(p->port, NULL); pthread_mutex_unlock(&p->mutex); break; /* polyline */ case 12: if (p->state == GKS_K_WS_ACTIVE) { pthread_mutex_lock(&p->mutex); LockPortBits(p->port); polyline(ia[0], r1, r2); UnlockPortBits(p->port); pthread_mutex_unlock(&p->mutex); } break; /* polymarker */ case 13: if (p->state == GKS_K_WS_ACTIVE) { pthread_mutex_lock(&p->mutex); LockPortBits(p->port); polymarker(ia[0], r1, r2); UnlockPortBits(p->port); pthread_mutex_unlock(&p->mutex); } break; /* text */ case 14: if (p->state == GKS_K_WS_ACTIVE) { pthread_mutex_lock(&p->mutex); LockPortBits(p->port); text(r1[0], r2[0], strlen(chars), chars); UnlockPortBits(p->port); pthread_mutex_unlock(&p->mutex); } break; /* fill area */ case 15: if (p->state == GKS_K_WS_ACTIVE) { pthread_mutex_lock(&p->mutex); LockPortBits(p->port); fillarea(ia[0], r1, r2); UnlockPortBits(p->port); pthread_mutex_unlock(&p->mutex); } break; /* cell array */ case 16: case DRAW_IMAGE: if (p->state == GKS_K_WS_ACTIVE) { int true_color = fctid == DRAW_IMAGE; pthread_mutex_lock(&p->mutex); LockPortBits(p->port); cellarray(r1[0], r1[1], r2[0], r2[1], dx, dy, dimx, ia, true_color); UnlockPortBits(p->port); pthread_mutex_unlock(&p->mutex); } break; /* set color representation */ case 48: set_color_rep(ia[1], r1[0], r1[1], r1[2]); break; case 49: /* set window */ set_norm_xform(*ia, gkss->window[*ia], gkss->viewport[*ia]); break; case 50: /* set viewport */ set_norm_xform(*ia, gkss->window[*ia], gkss->viewport[*ia]); if (*ia == gkss->cntnr) set_clip_rect(*ia); break; case 52: /* select normalization transformation */ case 53: /* set clipping inidicator */ set_clip_rect(gkss->cntnr); break; /* set workstation window */ case 54: p->window[0] = r1[0]; p->window[1] = r1[1]; p->window[2] = r2[0]; p->window[3] = r2[1]; set_xform(); init_norm_xform(); break; /* set workstation viewport */ case 55: p->viewport[0] = r1[0]; p->viewport[1] = r1[1]; p->viewport[2] = r2[0]; p->viewport[3] = r2[1]; if (p->state == GKS_K_WS_ACTIVE) { pthread_mutex_lock(&p->mutex); LockPortBits(p->port); resize_window(); set_xform(); init_norm_xform(); UnlockPortBits(p->port); pthread_mutex_unlock(&p->mutex); } break; /* request locator */ case 81: if (p->state == GKS_K_WS_ACTIVE) { pthread_mutex_lock(&p->mutex); QDFlushPortBuffer(p->port, NULL); get_pointer(r1, r2, &ia[0]); pthread_mutex_unlock(&p->mutex); } break; default: ; } }