svgawin.c

来自「远程桌面登陆软件 用rdesktop 但不基于Xwindows 可基于(nano」· C语言 代码 · 共 1,924 行 · 第 1/4 页

C
1,924
字号
    // left button    if (mouseb & 4)      if (!(ob & 4))        rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1,                       mousex + mcursor.x, mousey + mcursor.y);    if (ob & 4)      if (!(mouseb & 4))        rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1,                       mousex + mcursor.x, mousey + mcursor.y);  }  if (mousex != ox || mousey != oy) // movement  {    rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE,                   mousex + mcursor.x, mousey + mcursor.y);    draw_cursor_under(ox, oy);    draw_cursor();  }}/*****************************************************************************/void process_keyboard(void){  if (!UpAndRunning)    return;}/*****************************************************************************/BOOL ui_main_loop(void){  int sel;  fd_set rfds;  if (!rdp_connect(g_servername, RDP_LOGON_NORMAL, "", "", "", ""))    return False;  UpAndRunning = 1;  FD_ZERO(&rfds);  FD_SET(g_sock, &rfds);  sel = vga_waitevent(3, &rfds, NULL, NULL, NULL);  while (sel >= 0)  {    if (sel & 1) /* mouse */    {      process_mouse();    }    else if (sel & 2) /* keyboard */    {      process_keyboard();    }    else    {      if (!rdp_loop(&deactivated, &ext_disc_reason))        return True; /* ok */    }    FD_ZERO(&rfds);    FD_SET(g_sock, &rfds);    sel = vga_waitevent(3, &rfds, NULL, NULL, NULL);  }  return True;}/*****************************************************************************/void ui_bell(void){}/*****************************************************************************/int ui_select(int in){  g_sock = in;  return 1;}/*****************************************************************************/void* ui_create_glyph(int width, int height, uint8* data){  int i, j;  uint8* glyph_data;  bitmap* the_glyph;  glyph_data = (uint8*)xmalloc(width * height);  the_glyph = (bitmap*)xmalloc(sizeof(bitmap));  the_glyph->width = width;  the_glyph->height = height;  the_glyph->data = glyph_data;  memset(glyph_data, 0, width * height);  for (i = 0; i < height; i++)    for (j = 0; j < width; j++)      if (is_pixel_on(data, j, i, width, 1))        set_pixel_on(glyph_data, j, i, width, 8, 255);  return the_glyph;}/*****************************************************************************/void ui_destroy_glyph(void* glyph){  bitmap* the_glyph;  the_glyph = (bitmap*)glyph;  if (the_glyph != NULL)  {    if (the_glyph->data != NULL)      xfree(the_glyph->data);    xfree(the_glyph);  }}/*****************************************************************************/void ui_destroy_bitmap(void* bmp){  bitmap* b;  b = (bitmap*)bmp;  xfree(b->data);  xfree(b);}/*****************************************************************************/void ui_reset_clip(void){  clip_startx = 0;  clip_starty = 0;  clip_endx = g_width;  clip_endy = g_height;}/*****************************************************************************/void ui_set_clip(int x, int y, int cx, int cy){  clip_startx = x;  clip_starty = y;  clip_endx = x + cx;  clip_endy = y + cy;}/*****************************************************************************/void* ui_create_colourmap(COLOURMAP * colours){  int i = 0;  int n = colours->ncolours;  COLOURENTRY* c = colours->colours;  int* cmap = (int*)xmalloc(3 * 256 * sizeof (int));  if (n > 256)    n = 256;  bzero(cmap, 256 * 3 * sizeof (int));  for (i = 0; i < (3 * n); c++)  {    cmap[i++] = (c->red) >> 2;    cmap[i++] = (c->green) >> 2;    cmap[i++] = (c->blue) >> 2;  }  return cmap;}/*****************************************************************************/void ui_destroy_colourmap(HCOLOURMAP map){  if (colmap == map)    colmap = 0;  xfree(map);}/*****************************************************************************/void ui_set_colourmap(void* map){  if (colmap != 0)    xfree(colmap);  vga_setpalvec(0, 256, (int*)map);  colmap = map;}/*****************************************************************************/HBITMAP ui_create_bitmap(int width, int height, uint8* data){  bitmap* b;  b = (bitmap*)xmalloc(sizeof(bitmap));  b->data = (uint8*)xmalloc(width * height * g_server_Bpp);  b->width = width;  b->height = height;  b->Bpp = g_server_Bpp;  copy_mem(b->data, data, width * height * g_server_Bpp);  return (void*)b;}//*****************************************************************************void draw_glyph (int x, int y, HGLYPH glyph, int fgcolour){  bitmap* the_glyph;  int i, j;  the_glyph = (bitmap*)glyph;  if (the_glyph == NULL)    return;  for (i = 0; i < the_glyph->height; i++)    for (j = 0; j < the_glyph->width; j++)      if (is_pixel_on(the_glyph->data, j, i, the_glyph->width, 8))        set_pixel(x + j, y + i, fgcolour, 0xc);}#define DO_GLYPH(ttext,idx) \{\  glyph = cache_get_font (font, ttext[idx]);\  if (!(flags & TEXT2_IMPLICIT_X))\    {\      xyoffset = ttext[++idx];\      if ((xyoffset & 0x80))\	{\	  if (flags & TEXT2_VERTICAL) \	    y += ttext[idx+1] | (ttext[idx+2] << 8);\	  else\	    x += ttext[idx+1] | (ttext[idx+2] << 8);\	  idx += 2;\	}\      else\	{\	  if (flags & TEXT2_VERTICAL) \	    y += xyoffset;\	  else\	    x += xyoffset;\	}\    }\  if (glyph != NULL)\    {\      draw_glyph (x + glyph->offset, y + glyph->baseline, glyph->pixmap, fgcolour);\      if (flags & TEXT2_IMPLICIT_X)\	x += glyph->width;\    }\}/*****************************************************************************/void ui_draw_text(uint8 font, uint8 flags, uint8 opcode, int mixmode,                  int x, int y,                  int clipx, int clipy, int clipcx, int clipcy,                  int boxx, int boxy, int boxcx, int boxcy, BRUSH * brush,                  int bgcolour, int fgcolour, uint8* text, uint8 length){  int i;  int j;  int xyoffset;  DATABLOB* entry;  FONTGLYPH* glyph;  if (boxcx > 1)  {    if (contains_mouse(boxx, boxy, boxcx, boxcy))      draw_cursor_under(mousex, mousey);    fill_rect(boxx, boxy, boxcx, boxcy, bgcolour, 0xc);  }  else  {    if (contains_mouse(clipx, clipy, clipcx, clipcy))      draw_cursor_under(mousex, mousey);    if (mixmode == MIX_OPAQUE)      fill_rect(clipx, clipy, clipcx, clipcy, bgcolour, 0xc);  }  /* Paint text, character by character */  for (i = 0; i < length;)  {    switch (text[i])    {      case 0xff:        if (i + 2 < length)          cache_put_text(text[i + 1], text, text[i + 2]);        else        {          error("this shouldn't be happening\n");          exit(1);        }        /* this will move pointer from start to first character after FF command */        length -= i + 3;        text = &(text[i + 3]);        i = 0;        break;      case 0xfe:        entry = cache_get_text(text[i + 1]);        if (entry != NULL)        {          if ((((uint8 *) (entry->data))[1] == 0) && (!(flags & TEXT2_IMPLICIT_X)))          {            if (flags & TEXT2_VERTICAL)              y += text[i + 2];            else              x += text[i + 2];          }          for (j = 0; j < entry->size; j++)            DO_GLYPH(((uint8 *) (entry->data)), j);        }        if (i + 2 < length)          i += 3;        else          i += 2;        length -= i;        /* this will move pointer from start to first character after FE command */        text = &(text[i]);        i = 0;        break;      default:        DO_GLYPH(text, i);        i++;        break;    }  }  if (boxcx > 1)    cache_rect(boxx, boxy, boxcx, boxcy, True);  else    cache_rect(clipx, clipy, clipcx, clipcy, True);}//*****************************************************************************// Bresenham's line drawing algorithmvoid ui_line(uint8 opcode, int startx, int starty, int endx,             int endy, PEN* pen){  int dx;  int dy;  int incx;  int incy;  int dpr;  int dpru;  int p;  int left;  int top;  int right;  int bottom;  if (startx > endx)  {    dx = startx - endx;    incx = -1;    left = endx;    right = startx;  }  else  {    dx = endx - startx;    incx = 1;    left = startx;    right = endx;  }  if (starty > endy)  {    dy = starty - endy;    incy = -1;    top = endy;    bottom = starty;  }  else  {    dy = endy - starty;    incy = 1;    top = starty;    bottom = endy;  }  if (contains_mouse(left, top, (right - left) + 1, (bottom - top) + 1))    draw_cursor_under(mousex, mousey);  if (dx >= dy)  {    dpr = dy << 1;    dpru = dpr - (dx << 1);    p = dpr - dx;    for (; dx >= 0; dx--)    {      set_pixel(startx, starty, pen->colour, opcode);      if (p > 0)      {        startx += incx;        starty += incy;        p += dpru;      }      else      {        startx += incx;        p += dpr;      }    }  }  else  {    dpr = dx << 1;    dpru = dpr - (dy << 1);    p = dpr - dy;    for (; dy >= 0; dy--)    {      set_pixel(startx, starty, pen->colour, opcode);      if (p > 0)      {        startx += incx;        starty += incy;        p += dpru;      }      else      {        starty += incy;        p += dpr;      }    }  }  cache_rect(left, top, (right - left) + 1, (bottom - top) + 1, True);}/*****************************************************************************/void ui_triblt(uint8 opcode, int x, int y, int cx, int cy,               HBITMAP src, int srcx, int srcy,               BRUSH* brush, int bgcolour, int fgcolour){  // non used}/*****************************************************************************/void ui_memblt(uint8 opcode, int x, int y, int cx, int cy,               HBITMAP src, int srcx, int srcy){  bitmap* b;  int i;  int j;  int pixel;  if (warp_coords(&x, &y, &cx, &cy, &srcx, &srcy))  {    if (contains_mouse(x, y, cx, cy))      draw_cursor_under(mousex, mousey);    b = (bitmap*)src;    if (opcode == 0xc)      accel_draw_box(x, y, cx, cy, get_ptr(srcx, srcy, b->data, b->width, g_server_bpp),                     b->width * g_server_Bpp);    else    {      for (i = 0; i < cy; i++)      {        for (j = 0; j < cx; j++)        {          pixel = get_pixel2(srcx + j, srcy + i, b->data, b->width, g_server_bpp);          set_pixel(x + j, y + i, pixel, opcode);        }      }    }    cache_rect(x, y, cx, cy, False);  }}/*****************************************************************************/void ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy){  uint8* p;  if (offset > 0x38400)    offset = 0;  if (offset + cx * cy > 0x38400)    return;  p = desk_save + offset * g_server_Bpp;  ui_paint_bitmap(x, y, cx, cy, cx, cy, p);}/*****************************************************************************/void ui_desktop_save(uint32 offset, int x, int y, int cx, int cy){  uint8* p;  if (offset > 0x38400)    offset = 0;  if (offset + cx * cy > 0x38400)    return;  if (contains_mouse(x, y, cx, cy))    draw_cursor_under(mousex, mousey);  p = desk_save + offset * g_server_Bpp;  get_rect(x, y, cx, cy, p);}/*****************************************************************************/void ui_rect(int x, int y, int cx, int cy, int colour){  if (warp_coords(&x, &y, &cx, &cy, NULL, NULL))  {    if (contains_mouse(x, y, cx, cy))      draw_cursor_under(mousex, mousey);    accel_fill_rect(x, y, cx, cy, colour);    cache_rect(x, y, cx, cy, False);  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?