Example #1
0
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");
   }
}
Example #2
0
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();
}
Example #3
0
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);

}
Example #4
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);
}
Example #5
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:
      ;
    }
}