summaryrefslogtreecommitdiffstats
path: root/xorg/X11R7.6/rdp/rdpup.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg/X11R7.6/rdp/rdpup.c')
-rw-r--r--xorg/X11R7.6/rdp/rdpup.c3051
1 files changed, 1613 insertions, 1438 deletions
diff --git a/xorg/X11R7.6/rdp/rdpup.c b/xorg/X11R7.6/rdp/rdpup.c
index b9b5b92f..4cc1b683 100644
--- a/xorg/X11R7.6/rdp/rdpup.c
+++ b/xorg/X11R7.6/rdp/rdpup.c
@@ -24,9 +24,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define LOG_LEVEL 1
#define LLOG(_level, _args) \
- do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
#define LLOGLN(_level, _args) \
- do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
int g_con_number = 0; /* increments for each connection */
@@ -40,8 +40,8 @@ static int g_dis_listen_sck = 0;
//static int g_dis_connected = 0;
static int g_begin = 0;
-static struct stream* g_out_s = 0;
-static struct stream* g_in_s = 0;
+static struct stream *g_out_s = 0;
+static struct stream *g_in_s = 0;
static int g_button_mask = 0;
static int g_cursor_x = 0;
static int g_cursor_y = 0;
@@ -65,13 +65,13 @@ extern rdpPixmapRec g_screenPriv; /* in rdpmain.c */
struct rdpup_os_bitmap
{
- int used;
- PixmapPtr pixmap;
- rdpPixmapPtr priv;
- int stamp;
+ int used;
+ PixmapPtr pixmap;
+ rdpPixmapPtr priv;
+ int stamp;
};
-static struct rdpup_os_bitmap* g_os_bitmaps = 0;
+static struct rdpup_os_bitmap *g_os_bitmaps = 0;
static int g_max_os_bitmaps = 0;
static int g_os_bitmap_stamp = 0;
@@ -80,8 +80,8 @@ static int g_pixmap_num_used = 0;
struct rdpup_top_window
{
- WindowPtr wnd;
- struct rdpup_top_window* next;
+ WindowPtr wnd;
+ struct rdpup_top_window *next;
};
/*
@@ -105,328 +105,363 @@ f GXset 1
static int g_rdp_opcodes[16] =
{
- 0x00, /* GXclear 0x0 0 */
- 0x88, /* GXand 0x1 src AND dst */
- 0x44, /* GXandReverse 0x2 src AND NOT dst */
- 0xcc, /* GXcopy 0x3 src */
- 0x22, /* GXandInverted 0x4 NOT src AND dst */
- 0xaa, /* GXnoop 0x5 dst */
- 0x66, /* GXxor 0x6 src XOR dst */
- 0xee, /* GXor 0x7 src OR dst */
- 0x11, /* GXnor 0x8 NOT src AND NOT dst */
- 0x99, /* GXequiv 0x9 NOT src XOR dst */
- 0x55, /* GXinvert 0xa NOT dst */
- 0xdd, /* GXorReverse 0xb src OR NOT dst */
- 0x33, /* GXcopyInverted 0xc NOT src */
- 0xbb, /* GXorInverted 0xd NOT src OR dst */
- 0x77, /* GXnand 0xe NOT src OR NOT dst */
- 0xff /* GXset 0xf 1 */
+ 0x00, /* GXclear 0x0 0 */
+ 0x88, /* GXand 0x1 src AND dst */
+ 0x44, /* GXandReverse 0x2 src AND NOT dst */
+ 0xcc, /* GXcopy 0x3 src */
+ 0x22, /* GXandInverted 0x4 NOT src AND dst */
+ 0xaa, /* GXnoop 0x5 dst */
+ 0x66, /* GXxor 0x6 src XOR dst */
+ 0xee, /* GXor 0x7 src OR dst */
+ 0x11, /* GXnor 0x8 NOT src AND NOT dst */
+ 0x99, /* GXequiv 0x9 NOT src XOR dst */
+ 0x55, /* GXinvert 0xa NOT dst */
+ 0xdd, /* GXorReverse 0xb src OR NOT dst */
+ 0x33, /* GXcopyInverted 0xc NOT src */
+ 0xbb, /* GXorInverted 0xd NOT src OR dst */
+ 0x77, /* GXnand 0xe NOT src OR NOT dst */
+ 0xff /* GXset 0xf 1 */
};
/*****************************************************************************/
static int
rdpup_disconnect(void)
{
- int index;
-
- RemoveEnabledDevice(g_sck);
- g_connected = 0;
- g_tcp_close(g_sck);
- g_sck = 0;
- g_sck_closed = 1;
- g_pixmap_byte_total = 0;
- g_pixmap_num_used = 0;
- if (g_max_os_bitmaps > 0)
- {
- for (index = 0; index < g_max_os_bitmaps; index++)
- {
- if (g_os_bitmaps[index].used)
- {
- if (g_os_bitmaps[index].priv != 0)
+ int index;
+
+ RemoveEnabledDevice(g_sck);
+ g_connected = 0;
+ g_tcp_close(g_sck);
+ g_sck = 0;
+ g_sck_closed = 1;
+ g_pixmap_byte_total = 0;
+ g_pixmap_num_used = 0;
+
+ if (g_max_os_bitmaps > 0)
+ {
+ for (index = 0; index < g_max_os_bitmaps; index++)
{
- g_os_bitmaps[index].priv->status = 0;
+ if (g_os_bitmaps[index].used)
+ {
+ if (g_os_bitmaps[index].priv != 0)
+ {
+ g_os_bitmaps[index].priv->status = 0;
+ }
+ }
}
- }
- }
- }
- g_max_os_bitmaps = 0;
- g_free(g_os_bitmaps);
- g_os_bitmaps = 0;
- g_use_rail = 0;
- return 0;
+ }
+
+ g_max_os_bitmaps = 0;
+ g_free(g_os_bitmaps);
+ g_os_bitmaps = 0;
+ g_use_rail = 0;
+ return 0;
}
/*****************************************************************************/
int
rdpup_add_os_bitmap(PixmapPtr pixmap, rdpPixmapPtr priv)
{
- int index;
- int rv;
- int oldest;
- int oldest_index;
-
- if (!g_connected)
- {
- return -1;
- }
- if (g_os_bitmaps == 0)
- {
- return -1;
- }
- rv = -1;
- index = 0;
- while (index < g_max_os_bitmaps)
- {
- if (g_os_bitmaps[index].used == 0)
- {
- g_os_bitmaps[index].used = 1;
- g_os_bitmaps[index].pixmap = pixmap;
- g_os_bitmaps[index].priv = priv;
- g_os_bitmaps[index].stamp = g_os_bitmap_stamp;
- g_os_bitmap_stamp++;
- g_pixmap_num_used++;
- rv = index;
- break;
- }
- index++;
- }
- if (rv == -1)
- {
- /* find oldest */
- oldest = 0x7fffffff;
- oldest_index = 0;
+ int index;
+ int rv;
+ int oldest;
+ int oldest_index;
+
+ if (!g_connected)
+ {
+ return -1;
+ }
+
+ if (g_os_bitmaps == 0)
+ {
+ return -1;
+ }
+
+ rv = -1;
index = 0;
+
while (index < g_max_os_bitmaps)
{
- if (g_os_bitmaps[index].stamp < oldest)
- {
- oldest = g_os_bitmaps[index].stamp;
- oldest_index = index;
- }
- index++;
- }
- LLOGLN(10, ("rdpup_add_os_bitmap: evicting old, oldest_index %d", oldest_index));
- /* evict old */
- g_os_bitmaps[oldest_index].priv->status = 0;
- /* set new */
- g_os_bitmaps[oldest_index].pixmap = pixmap;
- g_os_bitmaps[oldest_index].priv = priv;
- g_os_bitmaps[oldest_index].stamp = g_os_bitmap_stamp;
- g_os_bitmap_stamp++;
- rv = oldest_index;
- }
- LLOGLN(10, ("rdpup_add_os_bitmap: new bitmap index %d", rv));
- LLOGLN(10, (" g_pixmap_num_used %d", g_pixmap_num_used));
- return rv;
+ if (g_os_bitmaps[index].used == 0)
+ {
+ g_os_bitmaps[index].used = 1;
+ g_os_bitmaps[index].pixmap = pixmap;
+ g_os_bitmaps[index].priv = priv;
+ g_os_bitmaps[index].stamp = g_os_bitmap_stamp;
+ g_os_bitmap_stamp++;
+ g_pixmap_num_used++;
+ rv = index;
+ break;
+ }
+
+ index++;
+ }
+
+ if (rv == -1)
+ {
+ /* find oldest */
+ oldest = 0x7fffffff;
+ oldest_index = 0;
+ index = 0;
+
+ while (index < g_max_os_bitmaps)
+ {
+ if (g_os_bitmaps[index].stamp < oldest)
+ {
+ oldest = g_os_bitmaps[index].stamp;
+ oldest_index = index;
+ }
+
+ index++;
+ }
+
+ LLOGLN(10, ("rdpup_add_os_bitmap: evicting old, oldest_index %d", oldest_index));
+ /* evict old */
+ g_os_bitmaps[oldest_index].priv->status = 0;
+ /* set new */
+ g_os_bitmaps[oldest_index].pixmap = pixmap;
+ g_os_bitmaps[oldest_index].priv = priv;
+ g_os_bitmaps[oldest_index].stamp = g_os_bitmap_stamp;
+ g_os_bitmap_stamp++;
+ rv = oldest_index;
+ }
+
+ LLOGLN(10, ("rdpup_add_os_bitmap: new bitmap index %d", rv));
+ LLOGLN(10, (" g_pixmap_num_used %d", g_pixmap_num_used));
+ return rv;
}
/*****************************************************************************/
int
rdpup_remove_os_bitmap(int rdpindex)
{
- LLOGLN(10, ("rdpup_remove_os_bitmap: index %d stamp %d",
- rdpindex, g_os_bitmaps[rdpindex].stamp));
- if (g_os_bitmaps == 0)
- {
- return 1;
- }
- if ((rdpindex < 0) && (rdpindex >= g_max_os_bitmaps))
- {
- return 1;
- }
- if (g_os_bitmaps[rdpindex].used)
- {
- g_os_bitmaps[rdpindex].used = 0;
- g_os_bitmaps[rdpindex].pixmap = 0;
- g_os_bitmaps[rdpindex].priv = 0;
- g_pixmap_num_used--;
- }
- LLOGLN(10, (" g_pixmap_num_used %d", g_pixmap_num_used));
- return 0;
+ LLOGLN(10, ("rdpup_remove_os_bitmap: index %d stamp %d",
+ rdpindex, g_os_bitmaps[rdpindex].stamp));
+
+ if (g_os_bitmaps == 0)
+ {
+ return 1;
+ }
+
+ if ((rdpindex < 0) && (rdpindex >= g_max_os_bitmaps))
+ {
+ return 1;
+ }
+
+ if (g_os_bitmaps[rdpindex].used)
+ {
+ g_os_bitmaps[rdpindex].used = 0;
+ g_os_bitmaps[rdpindex].pixmap = 0;
+ g_os_bitmaps[rdpindex].priv = 0;
+ g_pixmap_num_used--;
+ }
+
+ LLOGLN(10, (" g_pixmap_num_used %d", g_pixmap_num_used));
+ return 0;
}
/*****************************************************************************/
/* returns error */
static int
-rdpup_send(char* data, int len)
+rdpup_send(char *data, int len)
{
- int sent;
+ int sent;
- LLOGLN(10, ("rdpup_send - sending %d bytes", len));
- if (g_sck_closed)
- {
- return 1;
- }
- while (len > 0)
- {
- sent = g_tcp_send(g_sck, data, len, 0);
- if (sent == -1)
- {
- if (g_tcp_last_error_would_block(g_sck))
- {
- g_sleep(1);
- }
- else
- {
- rdpup_disconnect();
- return 1;
- }
- }
- else if (sent == 0)
+ LLOGLN(10, ("rdpup_send - sending %d bytes", len));
+
+ if (g_sck_closed)
{
- rdpup_disconnect();
- return 1;
+ return 1;
}
- else
+
+ while (len > 0)
{
- data += sent;
- len -= sent;
+ sent = g_tcp_send(g_sck, data, len, 0);
+
+ if (sent == -1)
+ {
+ if (g_tcp_last_error_would_block(g_sck))
+ {
+ g_sleep(1);
+ }
+ else
+ {
+ rdpup_disconnect();
+ return 1;
+ }
+ }
+ else if (sent == 0)
+ {
+ rdpup_disconnect();
+ return 1;
+ }
+ else
+ {
+ data += sent;
+ len -= sent;
+ }
}
- }
- return 0;
+
+ return 0;
}
/******************************************************************************/
static int
-rdpup_send_msg(struct stream* s)
+rdpup_send_msg(struct stream *s)
{
- int len;
- int rv;
-
- rv = 1;
- if (s != 0)
- {
- len = (int)(s->end - s->data);
- if (len > s->size)
- {
- rdpLog("overrun error len %d count %d\n", len, g_count);
- }
- s_pop_layer(s, iso_hdr);
- out_uint16_le(s, 3);
- out_uint16_le(s, g_count);
- out_uint32_le(s, len - 8);
- rv = rdpup_send(s->data, len);
- }
- if (rv != 0)
- {
- rdpLog("error in rdpup_send_msg\n");
- }
- return rv;
+ int len;
+ int rv;
+
+ rv = 1;
+
+ if (s != 0)
+ {
+ len = (int)(s->end - s->data);
+
+ if (len > s->size)
+ {
+ rdpLog("overrun error len %d count %d\n", len, g_count);
+ }
+
+ s_pop_layer(s, iso_hdr);
+ out_uint16_le(s, 3);
+ out_uint16_le(s, g_count);
+ out_uint32_le(s, len - 8);
+ rv = rdpup_send(s->data, len);
+ }
+
+ if (rv != 0)
+ {
+ rdpLog("error in rdpup_send_msg\n");
+ }
+
+ return rv;
}
/******************************************************************************/
static int
rdpup_send_pending(void)
{
- if (g_connected && g_begin)
- {
- LLOGLN(10, ("end %d", g_count));
- out_uint16_le(g_out_s, 2);
- out_uint16_le(g_out_s, 4);
- g_count++;
- s_mark_end(g_out_s);
- rdpup_send_msg(g_out_s);
- }
- g_count = 0;
- g_begin = 0;
- return 0;
+ if (g_connected && g_begin)
+ {
+ LLOGLN(10, ("end %d", g_count));
+ out_uint16_le(g_out_s, 2);
+ out_uint16_le(g_out_s, 4);
+ g_count++;
+ s_mark_end(g_out_s);
+ rdpup_send_msg(g_out_s);
+ }
+
+ g_count = 0;
+ g_begin = 0;
+ return 0;
}
/******************************************************************************/
static CARD32
rdpDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg)
{
- LLOGLN(10, ("rdpDeferredUpdateCallback"));
- if (g_do_dirty_ons)
- {
- rdpup_check_dirty_screen(&g_screenPriv);
- }
- else
- {
- rdpup_send_pending();
- }
- g_scheduled = 0;
- return 0;
+ LLOGLN(10, ("rdpDeferredUpdateCallback"));
+
+ if (g_do_dirty_ons)
+ {
+ rdpup_check_dirty_screen(&g_screenPriv);
+ }
+ else
+ {
+ rdpup_send_pending();
+ }
+
+ g_scheduled = 0;
+ return 0;
}
/******************************************************************************/
void
rdpScheduleDeferredUpdate(void)
{
- if (!g_scheduled)
- {
- g_scheduled = 1;
- g_timer = TimerSet(g_timer, 0, 40, rdpDeferredUpdateCallback, 0);
- }
+ if (!g_scheduled)
+ {
+ g_scheduled = 1;
+ g_timer = TimerSet(g_timer, 0, 40, rdpDeferredUpdateCallback, 0);
+ }
}
/******************************************************************************/
/* returns error */
static int
-rdpup_recv(char* data, int len)
+rdpup_recv(char *data, int len)
{
- int rcvd;
+ int rcvd;
- if (g_sck_closed)
- {
- return 1;
- }
- while (len > 0)
- {
- rcvd = g_tcp_recv(g_sck, data, len, 0);
- if (rcvd == -1)
- {
- if (g_tcp_last_error_would_block(g_sck))
- {
- g_sleep(1);
- }
- else
- {
- rdpup_disconnect();
- return 1;
- }
- }
- else if (rcvd == 0)
+ if (g_sck_closed)
{
- rdpup_disconnect();
- return 1;
+ return 1;
}
- else
+
+ while (len > 0)
{
- data += rcvd;
- len -= rcvd;
+ rcvd = g_tcp_recv(g_sck, data, len, 0);
+
+ if (rcvd == -1)
+ {
+ if (g_tcp_last_error_would_block(g_sck))
+ {
+ g_sleep(1);
+ }
+ else
+ {
+ rdpup_disconnect();
+ return 1;
+ }
+ }
+ else if (rcvd == 0)
+ {
+ rdpup_disconnect();
+ return 1;
+ }
+ else
+ {
+ data += rcvd;
+ len -= rcvd;
+ }
}
- }
- return 0;
+
+ return 0;
}
/******************************************************************************/
static int
-rdpup_recv_msg(struct stream* s)
+rdpup_recv_msg(struct stream *s)
{
- int len;
- int rv;
-
- rv = 1;
- if (s != 0)
- {
- init_stream(s, 4);
- rv = rdpup_recv(s->data, 4);
- if (rv == 0)
- {
- in_uint32_le(s, len);
- if (len > 3)
- {
- init_stream(s, len);
- rv = rdpup_recv(s->data, len - 4);
- }
- }
- }
- if (rv != 0)
- {
- rdpLog("error in rdpup_recv_msg\n");
- }
- return rv;
+ int len;
+ int rv;
+
+ rv = 1;
+
+ if (s != 0)
+ {
+ init_stream(s, 4);
+ rv = rdpup_recv(s->data, 4);
+
+ if (rv == 0)
+ {
+ in_uint32_le(s, len);
+
+ if (len > 3)
+ {
+ init_stream(s, len);
+ rv = rdpup_recv(s->data, len - 4);
+ }
+ }
+ }
+
+ if (rv != 0)
+ {
+ rdpLog("error in rdpup_recv_msg\n");
+ }
+
+ return rv;
}
/******************************************************************************/
@@ -438,1057 +473,1161 @@ rdpup_recv_msg(struct stream* s)
static int
process_screen_size_msg(int width, int height, int bpp)
{
- RRScreenSizePtr pSize;
- int mmwidth;
- int mmheight;
- Bool ok;
-
- LLOGLN(0, ("process_screen_size_msg: set width %d height %d bpp %d",
- width, height, bpp));
- g_rdpScreen.rdp_width = width;
- g_rdpScreen.rdp_height = height;
- g_rdpScreen.rdp_bpp = bpp;
- if (bpp < 15)
- {
- g_rdpScreen.rdp_Bpp = 1;
- g_rdpScreen.rdp_Bpp_mask = 0xff;
- }
- else if (bpp == 15)
- {
- g_rdpScreen.rdp_Bpp = 2;
- g_rdpScreen.rdp_Bpp_mask = 0x7fff;
- }
- else if (bpp == 16)
- {
- g_rdpScreen.rdp_Bpp = 2;
- g_rdpScreen.rdp_Bpp_mask = 0xffff;
- }
- else if (bpp > 16)
- {
- g_rdpScreen.rdp_Bpp = 4;
- g_rdpScreen.rdp_Bpp_mask = 0xffffff;
- }
- mmwidth = PixelToMM(width);
- mmheight = PixelToMM(height);
-
- pSize = RRRegisterSize(g_pScreen, width, height, mmwidth, mmheight);
- RRSetCurrentConfig(g_pScreen, RR_Rotate_0, 0, pSize);
- if ((g_rdpScreen.width != width) || (g_rdpScreen.height != height))
- {
- LLOGLN(0, (" calling RRScreenSizeSet"));
- ok = RRScreenSizeSet(g_pScreen, width, height, mmwidth, mmheight);
- LLOGLN(0, (" RRScreenSizeSet ok=[%d]", ok));
- }
- return 0;
+ RRScreenSizePtr pSize;
+ int mmwidth;
+ int mmheight;
+ Bool ok;
+
+ LLOGLN(0, ("process_screen_size_msg: set width %d height %d bpp %d",
+ width, height, bpp));
+ g_rdpScreen.rdp_width = width;
+ g_rdpScreen.rdp_height = height;
+ g_rdpScreen.rdp_bpp = bpp;
+
+ if (bpp < 15)
+ {
+ g_rdpScreen.rdp_Bpp = 1;
+ g_rdpScreen.rdp_Bpp_mask = 0xff;
+ }
+ else if (bpp == 15)
+ {
+ g_rdpScreen.rdp_Bpp = 2;
+ g_rdpScreen.rdp_Bpp_mask = 0x7fff;
+ }
+ else if (bpp == 16)
+ {
+ g_rdpScreen.rdp_Bpp = 2;
+ g_rdpScreen.rdp_Bpp_mask = 0xffff;
+ }
+ else if (bpp > 16)
+ {
+ g_rdpScreen.rdp_Bpp = 4;
+ g_rdpScreen.rdp_Bpp_mask = 0xffffff;
+ }
+
+ mmwidth = PixelToMM(width);
+ mmheight = PixelToMM(height);
+
+ pSize = RRRegisterSize(g_pScreen, width, height, mmwidth, mmheight);
+ RRSetCurrentConfig(g_pScreen, RR_Rotate_0, 0, pSize);
+
+ if ((g_rdpScreen.width != width) || (g_rdpScreen.height != height))
+ {
+ LLOGLN(0, (" calling RRScreenSizeSet"));
+ ok = RRScreenSizeSet(g_pScreen, width, height, mmwidth, mmheight);
+ LLOGLN(0, (" RRScreenSizeSet ok=[%d]", ok));
+ }
+
+ return 0;
}
/******************************************************************************/
static int
l_bound_by(int val, int low, int high)
{
- if (val > high)
- {
- val = high;
- }
- if (val < low)
- {
- val = low;
- }
- return val;
+ if (val > high)
+ {
+ val = high;
+ }
+
+ if (val < low)
+ {
+ val = low;
+ }
+
+ return val;
}
/******************************************************************************/
static int
rdpup_send_caps(void)
{
- struct stream* ls;
- int len;
- int rv;
- int cap_count;
- int cap_bytes;
+ struct stream *ls;
+ int len;
+ int rv;
+ int cap_count;
+ int cap_bytes;
- make_stream(ls);
- init_stream(ls, 8192);
- s_push_layer(ls, iso_hdr, 8);
+ make_stream(ls);
+ init_stream(ls, 8192);
+ s_push_layer(ls, iso_hdr, 8);
- cap_count = 0;
- cap_bytes = 0;
+ cap_count = 0;
+ cap_bytes = 0;
#if 0
- out_uint16_le(ls, 0);
- out_uint16_le(ls, 4);
- cap_count++;
- cap_bytes += 4;
-
- out_uint16_le(ls, 1);
- out_uint16_le(ls, 4);
- cap_count++;
- cap_bytes += 4;
+ out_uint16_le(ls, 0);
+ out_uint16_le(ls, 4);
+ cap_count++;
+ cap_bytes += 4;
+
+ out_uint16_le(ls, 1);
+ out_uint16_le(ls, 4);
+ cap_count++;
+ cap_bytes += 4;
#endif
- s_mark_end(ls);
- len = (int)(ls->end - ls->data);
- s_pop_layer(ls, iso_hdr);
- out_uint16_le(ls, 2); /* caps */
- out_uint16_le(ls, cap_count); /* num caps */
- out_uint32_le(ls, cap_bytes); /* caps len after header */
-
- rv = rdpup_send(ls->data, len);
- if (rv != 0)
- {
- LLOGLN(0, ("rdpup_send_caps: rdpup_send failed"));
- }
- free_stream(ls);
- return rv;
+ s_mark_end(ls);
+ len = (int)(ls->end - ls->data);
+ s_pop_layer(ls, iso_hdr);
+ out_uint16_le(ls, 2); /* caps */
+ out_uint16_le(ls, cap_count); /* num caps */
+ out_uint32_le(ls, cap_bytes); /* caps len after header */
+
+ rv = rdpup_send(ls->data, len);
+
+ if (rv != 0)
+ {
+ LLOGLN(0, ("rdpup_send_caps: rdpup_send failed"));
+ }
+
+ free_stream(ls);
+ return rv;
}
/******************************************************************************/
static int
process_version_msg(int param1, int param2, int param3, int param4)
{
- LLOGLN(0, ("process_version_msg: version %d %d %d %d", param1, param2,
- param3, param4));
- if ((param1 > 0) || (param2 > 0) || (param3 > 0) || (param4 > 0))
- {
- rdpup_send_caps();
- }
- return 0;
+ LLOGLN(0, ("process_version_msg: version %d %d %d %d", param1, param2,
+ param3, param4));
+
+ if ((param1 > 0) || (param2 > 0) || (param3 > 0) || (param4 > 0))
+ {
+ rdpup_send_caps();
+ }
+
+ return 0;
}
/******************************************************************************/
static int
rdpup_send_rail(void)
{
- WindowPtr wnd;
- rdpWindowRec* priv;
-
- wnd = g_pScreen->root;
- if (wnd != 0)
- {
- wnd = wnd->lastChild;
- while (wnd != 0)
- {
- if (wnd->realized)
- {
- priv = GETWINPRIV(wnd);
- priv->status = 1;
- rdpup_create_window(wnd, priv);
- }
- wnd = wnd->prevSib;
- }
- }
- return 0;
+ WindowPtr wnd;
+ rdpWindowRec *priv;
+
+ wnd = g_pScreen->root;
+
+ if (wnd != 0)
+ {
+ wnd = wnd->lastChild;
+
+ while (wnd != 0)
+ {
+ if (wnd->realized)
+ {
+ priv = GETWINPRIV(wnd);
+ priv->status = 1;
+ rdpup_create_window(wnd, priv);
+ }
+
+ wnd = wnd->prevSib;
+ }
+ }
+
+ return 0;
}
/******************************************************************************/
static int
-rdpup_process_msg(struct stream* s)
+rdpup_process_msg(struct stream *s)
{
- int msg_type;
- int msg;
- int param1;
- int param2;
- int param3;
- int param4;
- int bytes;
- int i1;
-
- in_uint16_le(s, msg_type);
- if (msg_type == 103)
- {
- in_uint32_le(s, msg);
- in_uint32_le(s, param1);
- in_uint32_le(s, param2);
- in_uint32_le(s, param3);
- in_uint32_le(s, param4);
- LLOGLN(10, ("rdpup_process_msg - msg %d param1 %d param2 %d param3 %d "
- "param4 %d", msg, param1, param2, param3, param4));
- switch (msg)
- {
- case 15: /* key down */
- case 16: /* key up */
- KbdAddEvent(msg == 15, param1, param2, param3, param4);
- break;
- case 17: /* from RDP_INPUT_SYNCHRONIZE */
- KbdSync(param1);
- break;
- case 100:
- /* without the minus 2, strange things happen when dragging
- past the width or height */
- g_cursor_x = l_bound_by(param1, 0, g_rdpScreen.width - 2);
- g_cursor_y = l_bound_by(param2, 0, g_rdpScreen.height - 2);
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 101:
- g_button_mask = g_button_mask & (~1);
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 102:
- g_button_mask = g_button_mask | 1;
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 103:
- g_button_mask = g_button_mask & (~4);
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 104:
- g_button_mask = g_button_mask | 4;
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 105:
- g_button_mask = g_button_mask & (~2);
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 106:
- g_button_mask = g_button_mask | 2;
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 107:
- g_button_mask = g_button_mask & (~8);
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 108:
- g_button_mask = g_button_mask | 8;
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 109:
- g_button_mask = g_button_mask & (~16);
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 110:
- g_button_mask = g_button_mask | 16;
- PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
- break;
- case 200:
- rdpup_begin_update();
- rdpup_send_area(0, (param1 >> 16) & 0xffff, param1 & 0xffff,
- (param2 >> 16) & 0xffff, param2 & 0xffff);
- rdpup_end_update();
- break;
- case 300:
- process_screen_size_msg(param1, param2, param3);
- break;
- case 301:
- process_version_msg(param1, param2, param3, param4);
- break;
- }
- }
- else if (msg_type == 104)
- {
- in_uint32_le(s, bytes);
- if (bytes > sizeof(g_rdpScreen.client_info))
- {
- bytes = sizeof(g_rdpScreen.client_info);
- }
- memcpy(&(g_rdpScreen.client_info), s->p - 4, bytes);
- g_rdpScreen.client_info.size = bytes;
- LLOGLN(0, ("rdpup_process_msg: got client info bytes %d", bytes));
- LLOGLN(0, (" jpeg support %d", g_rdpScreen.client_info.jpeg));
- i1 = g_rdpScreen.client_info.offscreen_support_level;
- LLOGLN(0, (" offscreen support %d", i1));
- i1 = g_rdpScreen.client_info.offscreen_cache_size;
- LLOGLN(0, (" offscreen size %d", i1));
- i1 = g_rdpScreen.client_info.offscreen_cache_entries;
- LLOGLN(0, (" offscreen entries %d", i1));
- if (g_rdpScreen.client_info.offscreen_support_level > 0)
- {
- if (g_rdpScreen.client_info.offscreen_cache_entries > 0)
- {
- g_max_os_bitmaps = g_rdpScreen.client_info.offscreen_cache_entries;
- g_free(g_os_bitmaps);
- g_os_bitmaps = (struct rdpup_os_bitmap*)
- g_malloc(sizeof(struct rdpup_os_bitmap) * g_max_os_bitmaps, 1);
- }
- }
- if (g_rdpScreen.client_info.rail_support_level > 0)
- {
- g_use_rail = 1;
- rdpup_send_rail();
- }
- }
- else
- {
- rdpLog("unknown message type in rdpup_process_msg %d\n", msg_type);
- }
- return 0;
+ int msg_type;
+ int msg;
+ int param1;
+ int param2;
+ int param3;
+ int param4;
+ int bytes;
+ int i1;
+
+ in_uint16_le(s, msg_type);
+
+ if (msg_type == 103)
+ {
+ in_uint32_le(s, msg);
+ in_uint32_le(s, param1);
+ in_uint32_le(s, param2);
+ in_uint32_le(s, param3);
+ in_uint32_le(s, param4);
+ LLOGLN(10, ("rdpup_process_msg - msg %d param1 %d param2 %d param3 %d "
+ "param4 %d", msg, param1, param2, param3, param4));
+
+ switch (msg)
+ {
+ case 15: /* key down */
+ case 16: /* key up */
+ KbdAddEvent(msg == 15, param1, param2, param3, param4);
+ break;
+ case 17: /* from RDP_INPUT_SYNCHRONIZE */
+ KbdSync(param1);
+ break;
+ case 100:
+ /* without the minus 2, strange things happen when dragging
+ past the width or height */
+ g_cursor_x = l_bound_by(param1, 0, g_rdpScreen.width - 2);
+ g_cursor_y = l_bound_by(param2, 0, g_rdpScreen.height - 2);
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 101:
+ g_button_mask = g_button_mask & (~1);
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 102:
+ g_button_mask = g_button_mask | 1;
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 103:
+ g_button_mask = g_button_mask & (~4);
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 104:
+ g_button_mask = g_button_mask | 4;
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 105:
+ g_button_mask = g_button_mask & (~2);
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 106:
+ g_button_mask = g_button_mask | 2;
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 107:
+ g_button_mask = g_button_mask & (~8);
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 108:
+ g_button_mask = g_button_mask | 8;
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 109:
+ g_button_mask = g_button_mask & (~16);
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 110:
+ g_button_mask = g_button_mask | 16;
+ PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
+ break;
+ case 200:
+ rdpup_begin_update();
+ rdpup_send_area(0, (param1 >> 16) & 0xffff, param1 & 0xffff,
+ (param2 >> 16) & 0xffff, param2 & 0xffff);
+ rdpup_end_update();
+ break;
+ case 300:
+ process_screen_size_msg(param1, param2, param3);
+ break;
+ case 301:
+ process_version_msg(param1, param2, param3, param4);
+ break;
+ }
+ }
+ else if (msg_type == 104)
+ {
+ in_uint32_le(s, bytes);
+
+ if (bytes > sizeof(g_rdpScreen.client_info))
+ {
+ bytes = sizeof(g_rdpScreen.client_info);
+ }
+
+ memcpy(&(g_rdpScreen.client_info), s->p - 4, bytes);
+ g_rdpScreen.client_info.size = bytes;
+ LLOGLN(0, ("rdpup_process_msg: got client info bytes %d", bytes));
+ LLOGLN(0, (" jpeg support %d", g_rdpScreen.client_info.jpeg));
+ i1 = g_rdpScreen.client_info.offscreen_support_level;
+ LLOGLN(0, (" offscreen support %d", i1));
+ i1 = g_rdpScreen.client_info.offscreen_cache_size;
+ LLOGLN(0, (" offscreen size %d", i1));
+ i1 = g_rdpScreen.client_info.offscreen_cache_entries;
+ LLOGLN(0, (" offscreen entries %d", i1));
+
+ if (g_rdpScreen.client_info.offscreen_support_level > 0)
+ {
+ if (g_rdpScreen.client_info.offscreen_cache_entries > 0)
+ {
+ g_max_os_bitmaps = g_rdpScreen.client_info.offscreen_cache_entries;
+ g_free(g_os_bitmaps);
+ g_os_bitmaps = (struct rdpup_os_bitmap *)
+ g_malloc(sizeof(struct rdpup_os_bitmap) * g_max_os_bitmaps, 1);
+ }
+ }
+
+ if (g_rdpScreen.client_info.rail_support_level > 0)
+ {
+ g_use_rail = 1;
+ rdpup_send_rail();
+ }
+ }
+ else
+ {
+ rdpLog("unknown message type in rdpup_process_msg %d\n", msg_type);
+ }
+
+ return 0;
}
/******************************************************************************/
void
-rdpup_get_screen_image_rect(struct image_data* id)
+rdpup_get_screen_image_rect(struct image_data *id)
{
- id->width = g_rdpScreen.width;
- id->height = g_rdpScreen.height;
- id->bpp = g_rdpScreen.rdp_bpp;
- id->Bpp = g_rdpScreen.rdp_Bpp;
- id->lineBytes = g_rdpScreen.paddedWidthInBytes;
- id->pixels = g_rdpScreen.pfbMemory;
+ id->width = g_rdpScreen.width;
+ id->height = g_rdpScreen.height;
+ id->bpp = g_rdpScreen.rdp_bpp;
+ id->Bpp = g_rdpScreen.rdp_Bpp;
+ id->lineBytes = g_rdpScreen.paddedWidthInBytes;
+ id->pixels = g_rdpScreen.pfbMemory;
}
/******************************************************************************/
void
-rdpup_get_pixmap_image_rect(PixmapPtr pPixmap, struct image_data* id)
+rdpup_get_pixmap_image_rect(PixmapPtr pPixmap, struct image_data *id)
{
- id->width = pPixmap->drawable.width;
- id->height = pPixmap->drawable.height;
- id->bpp = g_rdpScreen.rdp_bpp;
- id->Bpp = g_rdpScreen.rdp_Bpp;
- id->lineBytes = pPixmap->devKind;
- id->pixels = (char*)(pPixmap->devPrivate.ptr);
+ id->width = pPixmap->drawable.width;
+ id->height = pPixmap->drawable.height;
+ id->bpp = g_rdpScreen.rdp_bpp;
+ id->Bpp = g_rdpScreen.rdp_Bpp;
+ id->lineBytes = pPixmap->devKind;
+ id->pixels = (char *)(pPixmap->devPrivate.ptr);
}
/******************************************************************************/
int
rdpup_init(void)
{
- char text[256];
- int i;
+ char text[256];
+ int i;
- if (!g_directory_exist("/tmp/.xrdp"))
- {
- if (!g_create_dir("/tmp/.xrdp"))
+ if (!g_directory_exist("/tmp/.xrdp"))
{
- LLOGLN(0, ("rdpup_init: g_create_dir failed"));
- return 0;
+ if (!g_create_dir("/tmp/.xrdp"))
+ {
+ LLOGLN(0, ("rdpup_init: g_create_dir failed"));
+ return 0;
+ }
+
+ g_chmod_hex("/tmp/.xrdp", 0x1777);
}
- g_chmod_hex("/tmp/.xrdp", 0x1777);
- }
- i = atoi(display);
- if (i < 1)
- {
- return 0;
- }
- if (g_in_s == 0)
- {
- make_stream(g_in_s);
- init_stream(g_in_s, 8192);
- }
- if (g_out_s == 0)
- {
- make_stream(g_out_s);
- init_stream(g_out_s, 8192 * g_Bpp + 100);
- }
- if (g_use_uds)
- {
- g_sprintf(g_uds_data, "/tmp/.xrdp/xrdp_display_%s", display);
- if (g_listen_sck == 0)
- {
- g_listen_sck = g_tcp_local_socket_stream();
- if (g_tcp_local_bind(g_listen_sck, g_uds_data) != 0)
- {
- LLOGLN(0, ("rdpup_init: g_tcp_local_bind failed"));
- return 0;
- }
- g_tcp_listen(g_listen_sck);
- AddEnabledDevice(g_listen_sck);
- }
- }
- else
- {
- g_sprintf(text, "62%2.2d", i);
- if (g_listen_sck == 0)
- {
- g_listen_sck = g_tcp_socket();
- if (g_tcp_bind(g_listen_sck, text) != 0)
- {
+
+ i = atoi(display);
+
+ if (i < 1)
+ {
return 0;
- }
- g_tcp_listen(g_listen_sck);
- AddEnabledDevice(g_listen_sck);
}
- }
- g_dis_listen_sck = g_tcp_local_socket_dgram();
- if (g_dis_listen_sck != 0)
- {
- g_sprintf(text, "/tmp/.xrdp/xrdp_disconnect_display_%s", display);
- if (g_tcp_local_bind(g_dis_listen_sck, text) == 0)
+
+ if (g_in_s == 0)
{
- AddEnabledDevice(g_dis_listen_sck);
+ make_stream(g_in_s);
+ init_stream(g_in_s, 8192);
+ }
+
+ if (g_out_s == 0)
+ {
+ make_stream(g_out_s);
+ init_stream(g_out_s, 8192 * g_Bpp + 100);
+ }
+
+ if (g_use_uds)
+ {
+ g_sprintf(g_uds_data, "/tmp/.xrdp/xrdp_display_%s", display);
+
+ if (g_listen_sck == 0)
+ {
+ g_listen_sck = g_tcp_local_socket_stream();
+
+ if (g_tcp_local_bind(g_listen_sck, g_uds_data) != 0)
+ {
+ LLOGLN(0, ("rdpup_init: g_tcp_local_bind failed"));
+ return 0;
+ }
+
+ g_tcp_listen(g_listen_sck);
+ AddEnabledDevice(g_listen_sck);
+ }
}
else
{
- rdpLog("g_tcp_local_bind failed [%s]\n", text);
+ g_sprintf(text, "62%2.2d", i);
+
+ if (g_listen_sck == 0)
+ {
+ g_listen_sck = g_tcp_socket();
+
+ if (g_tcp_bind(g_listen_sck, text) != 0)
+ {
+ return 0;
+ }
+
+ g_tcp_listen(g_listen_sck);
+ AddEnabledDevice(g_listen_sck);
+ }
+ }
+
+ g_dis_listen_sck = g_tcp_local_socket_dgram();
+
+ if (g_dis_listen_sck != 0)
+ {
+ g_sprintf(text, "/tmp/.xrdp/xrdp_disconnect_display_%s", display);
+
+ if (g_tcp_local_bind(g_dis_listen_sck, text) == 0)
+ {
+ AddEnabledDevice(g_dis_listen_sck);
+ }
+ else
+ {
+ rdpLog("g_tcp_local_bind failed [%s]\n", text);
+ }
}
- }
- return 1;
+
+ return 1;
}
/******************************************************************************/
int
rdpup_check(void)
{
- int sel;
- int new_sck;
- char buf[8];
+ int sel;
+ int new_sck;
+ char buf[8];
+
+ sel = g_tcp_select(g_listen_sck, g_sck, g_dis_listen_sck);
- sel = g_tcp_select(g_listen_sck, g_sck, g_dis_listen_sck);
- if (sel & 1)
- {
- new_sck = g_tcp_accept(g_listen_sck);
- if (new_sck == -1)
+ if (sel & 1)
{
+ new_sck = g_tcp_accept(g_listen_sck);
+
+ if (new_sck == -1)
+ {
+ }
+ else
+ {
+ if (g_sck != 0)
+ {
+ /* should maybe ask is user wants to allow here with timeout */
+ rdpLog("replacing connection, already got a connection\n");
+ rdpup_disconnect();
+ }
+
+ rdpLog("got a connection\n");
+ g_sck = new_sck;
+ g_tcp_set_non_blocking(g_sck);
+ g_tcp_set_no_delay(g_sck);
+ g_connected = 1;
+ g_sck_closed = 0;
+ g_begin = 0;
+ g_con_number++;
+ AddEnabledDevice(g_sck);
+ }
}
- else
+
+ if (sel & 2)
{
- if (g_sck != 0)
- {
- /* should maybe ask is user wants to allow here with timeout */
- rdpLog("replacing connection, already got a connection\n");
- rdpup_disconnect();
- }
- rdpLog("got a connection\n");
- g_sck = new_sck;
- g_tcp_set_non_blocking(g_sck);
- g_tcp_set_no_delay(g_sck);
- g_connected = 1;
- g_sck_closed = 0;
- g_begin = 0;
- g_con_number++;
- AddEnabledDevice(g_sck);
- }
- }
- if (sel & 2)
- {
- if (rdpup_recv_msg(g_in_s) == 0)
- {
- rdpup_process_msg(g_in_s);
- }
- }
- if (sel & 4)
- {
- if (g_tcp_recv(g_dis_listen_sck, buf, 4, 0) > 0)
- {
- if (g_sck != 0)
- {
- rdpLog("disconnecting session via user request\n");
- rdpup_disconnect();
- }
- }
- }
- return 0;
+ if (rdpup_recv_msg(g_in_s) == 0)
+ {
+ rdpup_process_msg(g_in_s);
+ }
+ }
+
+ if (sel & 4)
+ {
+ if (g_tcp_recv(g_dis_listen_sck, buf, 4, 0) > 0)
+ {
+ if (g_sck != 0)
+ {
+ rdpLog("disconnecting session via user request\n");
+ rdpup_disconnect();
+ }
+ }
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_begin_update(void)
{
- LLOGLN(10, ("rdpup_begin_update"));
- if (g_connected)
- {
- if (g_begin)
- {
- return 0;
- }
- init_stream(g_out_s, 0);
- s_push_layer(g_out_s, iso_hdr, 8);
- out_uint16_le(g_out_s, 1); /* begin update */
- out_uint16_le(g_out_s, 4); /* size */
- LLOGLN(10, ("begin %d", g_count));
- g_begin = 1;
- g_count = 1;
- }
- return 0;
+ LLOGLN(10, ("rdpup_begin_update"));
+
+ if (g_connected)
+ {
+ if (g_begin)
+ {
+ return 0;
+ }
+
+ init_stream(g_out_s, 0);
+ s_push_layer(g_out_s, iso_hdr, 8);
+ out_uint16_le(g_out_s, 1); /* begin update */
+ out_uint16_le(g_out_s, 4); /* size */
+ LLOGLN(10, ("begin %d", g_count));
+ g_begin = 1;
+ g_count = 1;
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_end_update(void)
{
- LLOGLN(10, ("rdpup_end_update"));
- if (g_connected && g_begin)
- {
- if (g_do_dirty_ons)
- {
- rdpup_send_pending();
- }
- else
+ LLOGLN(10, ("rdpup_end_update"));
+
+ if (g_connected && g_begin)
{
- rdpScheduleDeferredUpdate();
+ if (g_do_dirty_ons)
+ {
+ rdpup_send_pending();
+ }
+ else
+ {
+ rdpScheduleDeferredUpdate();
+ }
}
- }
- return 0;
+
+ return 0;
}
/******************************************************************************/
int
rdpup_pre_check(int in_size)
{
- if (!g_begin)
- {
- rdpup_begin_update();
- }
- if ((g_out_s->p - g_out_s->data) > (g_out_s->size - (in_size + 20)))
- {
- s_mark_end(g_out_s);
- rdpup_send_msg(g_out_s);
- g_count = 0;
- init_stream(g_out_s, 0);
- s_push_layer(g_out_s, iso_hdr, 8);
- }
- return 0;
+ if (!g_begin)
+ {
+ rdpup_begin_update();
+ }
+
+ if ((g_out_s->p - g_out_s->data) > (g_out_s->size - (in_size + 20)))
+ {
+ s_mark_end(g_out_s);
+ rdpup_send_msg(g_out_s);
+ g_count = 0;
+ init_stream(g_out_s, 0);
+ s_push_layer(g_out_s, iso_hdr, 8);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_fill_rect(short x, short y, int cx, int cy)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_fill_rect"));
- rdpup_pre_check(12);
- out_uint16_le(g_out_s, 3); /* fill rect */
- out_uint16_le(g_out_s, 12); /* size */
- g_count++;
- out_uint16_le(g_out_s, x);
- out_uint16_le(g_out_s, y);
- out_uint16_le(g_out_s, cx);
- out_uint16_le(g_out_s, cy);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_fill_rect"));
+ rdpup_pre_check(12);
+ out_uint16_le(g_out_s, 3); /* fill rect */
+ out_uint16_le(g_out_s, 12); /* size */
+ g_count++;
+ out_uint16_le(g_out_s, x);
+ out_uint16_le(g_out_s, y);
+ out_uint16_le(g_out_s, cx);
+ out_uint16_le(g_out_s, cy);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_screen_blt(short x, short y, int cx, int cy, short srcx, short srcy)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_screen_blt"));
- rdpup_pre_check(16);
- out_uint16_le(g_out_s, 4); /* screen blt */
- out_uint16_le(g_out_s, 16); /* size */
- g_count++;
- out_uint16_le(g_out_s, x);
- out_uint16_le(g_out_s, y);
- out_uint16_le(g_out_s, cx);
- out_uint16_le(g_out_s, cy);
- out_uint16_le(g_out_s, srcx);
- out_uint16_le(g_out_s, srcy);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_screen_blt"));
+ rdpup_pre_check(16);
+ out_uint16_le(g_out_s, 4); /* screen blt */
+ out_uint16_le(g_out_s, 16); /* size */
+ g_count++;
+ out_uint16_le(g_out_s, x);
+ out_uint16_le(g_out_s, y);
+ out_uint16_le(g_out_s, cx);
+ out_uint16_le(g_out_s, cy);
+ out_uint16_le(g_out_s, srcx);
+ out_uint16_le(g_out_s, srcy);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_set_clip(short x, short y, int cx, int cy)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_set_clip"));
- rdpup_pre_check(12);
- out_uint16_le(g_out_s, 10); /* set clip */
- out_uint16_le(g_out_s, 12); /* size */
- g_count++;
- out_uint16_le(g_out_s, x);
- out_uint16_le(g_out_s, y);
- out_uint16_le(g_out_s, cx);
- out_uint16_le(g_out_s, cy);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_set_clip"));
+ rdpup_pre_check(12);
+ out_uint16_le(g_out_s, 10); /* set clip */
+ out_uint16_le(g_out_s, 12); /* size */
+ g_count++;
+ out_uint16_le(g_out_s, x);
+ out_uint16_le(g_out_s, y);
+ out_uint16_le(g_out_s, cx);
+ out_uint16_le(g_out_s, cy);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_reset_clip(void)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_reset_clip"));
- rdpup_pre_check(4);
- out_uint16_le(g_out_s, 11); /* reset clip */
- out_uint16_le(g_out_s, 4); /* size */
- g_count++;
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_reset_clip"));
+ rdpup_pre_check(4);
+ out_uint16_le(g_out_s, 11); /* reset clip */
+ out_uint16_le(g_out_s, 4); /* size */
+ g_count++;
+ }
+
+ return 0;
}
#define COLOR8(r, g, b) \
- ((((r) >> 5) << 0) | (((g) >> 5) << 3) | (((b) >> 6) << 6))
+ ((((r) >> 5) << 0) | (((g) >> 5) << 3) | (((b) >> 6) << 6))
#define COLOR15(r, g, b) \
- ((((r) >> 3) << 10) | (((g) >> 3) << 5) | (((b) >> 3) << 0))
+ ((((r) >> 3) << 10) | (((g) >> 3) << 5) | (((b) >> 3) << 0))
#define COLOR16(r, g, b) \
- ((((r) >> 3) << 11) | (((g) >> 2) << 5) | (((b) >> 3) << 0))
+ ((((r) >> 3) << 11) | (((g) >> 2) << 5) | (((b) >> 3) << 0))
#define COLOR24(r, g, b) \
- ((((r) >> 0) << 0) | (((g) >> 0) << 8) | (((b) >> 0) << 16))
+ ((((r) >> 0) << 0) | (((g) >> 0) << 8) | (((b) >> 0) << 16))
#define SPLITCOLOR32(r, g, b, c) \
-{ \
- r = ((c) >> 16) & 0xff; \
- g = ((c) >> 8) & 0xff; \
- b = (c) & 0xff; \
-}
+ { \
+ r = ((c) >> 16) & 0xff; \
+ g = ((c) >> 8) & 0xff; \
+ b = (c) & 0xff; \
+ }
int
convert_pixel(int in_pixel)
{
- int red;
- int green;
- int blue;
- int rv;
+ int red;
+ int green;
+ int blue;
+ int rv;
- rv = 0;
- if (g_rdpScreen.depth == 24)
- {
- if (g_rdpScreen.rdp_bpp == 24)
+ rv = 0;
+
+ if (g_rdpScreen.depth == 24)
{
- rv = in_pixel;
- SPLITCOLOR32(red, green, blue, rv);
- rv = COLOR24(red, green, blue);
+ if (g_rdpScreen.rdp_bpp == 24)
+ {
+ rv = in_pixel;
+ SPLITCOLOR32(red, green, blue, rv);
+ rv = COLOR24(red, green, blue);
+ }
+ else if (g_rdpScreen.rdp_bpp == 16)
+ {
+ rv = in_pixel;
+ SPLITCOLOR32(red, green, blue, rv);
+ rv = COLOR16(red, green, blue);
+ }
+ else if (g_rdpScreen.rdp_bpp == 15)
+ {
+ rv = in_pixel;
+ SPLITCOLOR32(red, green, blue, rv);
+ rv = COLOR15(red, green, blue);
+ }
+ else if (g_rdpScreen.rdp_bpp == 8)
+ {
+ rv = in_pixel;
+ SPLITCOLOR32(red, green, blue, rv);
+ rv = COLOR8(red, green, blue);
+ }
}
- else if (g_rdpScreen.rdp_bpp == 16)
+ else if (g_rdpScreen.depth == g_rdpScreen.rdp_bpp)
{
- rv = in_pixel;
- SPLITCOLOR32(red, green, blue, rv);
- rv = COLOR16(red, green, blue);
+ return in_pixel;
}
- else if (g_rdpScreen.rdp_bpp == 15)
+
+ return rv;
+}
+
+int
+convert_pixels(void *src, void *dst, int num_pixels)
+{
+ unsigned int pixel;
+ unsigned int red;
+ unsigned int green;
+ unsigned int blue;
+ unsigned int *src32;
+ unsigned int *dst32;
+ unsigned short *dst16;
+ unsigned char *dst8;
+ int index;
+
+ if (g_rdpScreen.depth == g_rdpScreen.rdp_bpp)
{
- rv = in_pixel;
- SPLITCOLOR32(red, green, blue, rv);
- rv = COLOR15(red, green, blue);
+ memcpy(dst, src, num_pixels * g_Bpp);
+ return 0;
}
- else if (g_rdpScreen.rdp_bpp == 8)
+
+ if (g_rdpScreen.depth == 24)
{
- rv = in_pixel;
- SPLITCOLOR32(red, green, blue, rv);
- rv = COLOR8(red, green, blue);
+ src32 = (unsigned int *)src;
+
+ if (g_rdpScreen.rdp_bpp == 24)
+ {
+ dst32 = (unsigned int *)dst;
+
+ for (index = 0; index < num_pixels; index++)
+ {
+ pixel = *src32;
+ *dst32 = pixel;
+ dst32++;
+ src32++;
+ }
+ }
+ else if (g_rdpScreen.rdp_bpp == 16)
+ {
+ dst16 = (unsigned short *)dst;
+
+ for (index = 0; index < num_pixels; index++)
+ {
+ pixel = *src32;
+ SPLITCOLOR32(red, green, blue, pixel);
+ pixel = COLOR16(red, green, blue);
+ *dst16 = pixel;
+ dst16++;
+ src32++;
+ }
+ }
+ else if (g_rdpScreen.rdp_bpp == 15)
+ {
+ dst16 = (unsigned short *)dst;
+
+ for (index = 0; index < num_pixels; index++)
+ {
+ pixel = *src32;
+ SPLITCOLOR32(red, green, blue, pixel);
+ pixel = COLOR15(red, green, blue);
+ *dst16 = pixel;
+ dst16++;
+ src32++;
+ }
+ }
+ else if (g_rdpScreen.rdp_bpp == 8)
+ {
+ dst8 = (unsigned char *)dst;
+
+ for (index = 0; index < num_pixels; index++)
+ {
+ pixel = *src32;
+ SPLITCOLOR32(red, green, blue, pixel);
+ pixel = COLOR8(red, green, blue);
+ *dst8 = pixel;
+ dst8++;
+ src32++;
+ }
+ }
}
- }
- else if (g_rdpScreen.depth == g_rdpScreen.rdp_bpp)
- {
- return in_pixel;
- }
- return rv;
-}
-int
-convert_pixels(void* src, void* dst, int num_pixels)
-{
- unsigned int pixel;
- unsigned int red;
- unsigned int green;
- unsigned int blue;
- unsigned int* src32;
- unsigned int* dst32;
- unsigned short* dst16;
- unsigned char* dst8;
- int index;
-
- if (g_rdpScreen.depth == g_rdpScreen.rdp_bpp)
- {
- memcpy(dst, src, num_pixels * g_Bpp);
return 0;
- }
- if (g_rdpScreen.depth == 24)
- {
- src32 = (unsigned int*)src;
- if (g_rdpScreen.rdp_bpp == 24)
- {
- dst32 = (unsigned int*)dst;
- for (index = 0; index < num_pixels; index++)
- {
- pixel = *src32;
- *dst32 = pixel;
- dst32++;
- src32++;
- }
- }
- else if (g_rdpScreen.rdp_bpp == 16)
- {
- dst16 = (unsigned short*)dst;
- for (index = 0; index < num_pixels; index++)
- {
- pixel = *src32;
- SPLITCOLOR32(red, green, blue, pixel);
- pixel = COLOR16(red, green, blue);
- *dst16 = pixel;
- dst16++;
- src32++;
- }
- }
- else if (g_rdpScreen.rdp_bpp == 15)
- {
- dst16 = (unsigned short*)dst;
- for (index = 0; index < num_pixels; index++)
- {
- pixel = *src32;
- SPLITCOLOR32(red, green, blue, pixel);
- pixel = COLOR15(red, green, blue);
- *dst16 = pixel;
- dst16++;
- src32++;
- }
- }
- else if (g_rdpScreen.rdp_bpp == 8)
- {
- dst8 = (unsigned char*)dst;
- for (index = 0; index < num_pixels; index++)
- {
- pixel = *src32;
- SPLITCOLOR32(red, green, blue, pixel);
- pixel = COLOR8(red, green, blue);
- *dst8 = pixel;
- dst8++;
- src32++;
- }
- }
- }
- return 0;
}
/******************************************************************************/
int
rdpup_set_fgcolor(int fgcolor)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_set_fgcolor"));
- rdpup_pre_check(8);
- out_uint16_le(g_out_s, 12); /* set fgcolor */
- out_uint16_le(g_out_s, 8); /* size */
- g_count++;
- fgcolor = fgcolor & g_Bpp_mask;
- fgcolor = convert_pixel(fgcolor) & g_rdpScreen.rdp_Bpp_mask;
- out_uint32_le(g_out_s, fgcolor);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_set_fgcolor"));
+ rdpup_pre_check(8);
+ out_uint16_le(g_out_s, 12); /* set fgcolor */
+ out_uint16_le(g_out_s, 8); /* size */
+ g_count++;
+ fgcolor = fgcolor & g_Bpp_mask;
+ fgcolor = convert_pixel(fgcolor) & g_rdpScreen.rdp_Bpp_mask;
+ out_uint32_le(g_out_s, fgcolor);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_set_bgcolor(int bgcolor)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_set_bgcolor"));
- rdpup_pre_check(8);
- out_uint16_le(g_out_s, 13); /* set bg color */
- out_uint16_le(g_out_s, 8); /* size */
- g_count++;
- bgcolor = bgcolor & g_Bpp_mask;
- bgcolor = convert_pixel(bgcolor) & g_rdpScreen.rdp_Bpp_mask;
- out_uint32_le(g_out_s, bgcolor);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_set_bgcolor"));
+ rdpup_pre_check(8);
+ out_uint16_le(g_out_s, 13); /* set bg color */
+ out_uint16_le(g_out_s, 8); /* size */
+ g_count++;
+ bgcolor = bgcolor & g_Bpp_mask;
+ bgcolor = convert_pixel(bgcolor) & g_rdpScreen.rdp_Bpp_mask;
+ out_uint32_le(g_out_s, bgcolor);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_set_opcode(int opcode)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_set_opcode"));
- rdpup_pre_check(6);
- out_uint16_le(g_out_s, 14); /* set opcode */
- out_uint16_le(g_out_s, 6); /* size */
- g_count++;
- out_uint16_le(g_out_s, g_rdp_opcodes[opcode & 0xf]);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_set_opcode"));
+ rdpup_pre_check(6);
+ out_uint16_le(g_out_s, 14); /* set opcode */
+ out_uint16_le(g_out_s, 6); /* size */
+ g_count++;
+ out_uint16_le(g_out_s, g_rdp_opcodes[opcode & 0xf]);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_set_pen(int style, int width)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_set_pen"));
- rdpup_pre_check(8);
- out_uint16_le(g_out_s, 17); /* set pen */
- out_uint16_le(g_out_s, 8); /* size */
- g_count++;
- out_uint16_le(g_out_s, style);
- out_uint16_le(g_out_s, width);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_set_pen"));
+ rdpup_pre_check(8);
+ out_uint16_le(g_out_s, 17); /* set pen */
+ out_uint16_le(g_out_s, 8); /* size */
+ g_count++;
+ out_uint16_le(g_out_s, style);
+ out_uint16_le(g_out_s, width);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_draw_line(short x1, short y1, short x2, short y2)
{
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_draw_line"));
- rdpup_pre_check(12);
- out_uint16_le(g_out_s, 18); /* draw line */
- out_uint16_le(g_out_s, 12); /* size */
- g_count++;
- out_uint16_le(g_out_s, x1);
- out_uint16_le(g_out_s, y1);
- out_uint16_le(g_out_s, x2);
- out_uint16_le(g_out_s, y2);
- }
- return 0;
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_draw_line"));
+ rdpup_pre_check(12);
+ out_uint16_le(g_out_s, 18); /* draw line */
+ out_uint16_le(g_out_s, 12); /* size */
+ g_count++;
+ out_uint16_le(g_out_s, x1);
+ out_uint16_le(g_out_s, y1);
+ out_uint16_le(g_out_s, x2);
+ out_uint16_le(g_out_s, y2);
+ }
+
+ return 0;
}
/******************************************************************************/
int
-rdpup_set_cursor(short x, short y, char* cur_data, char* cur_mask)
+rdpup_set_cursor(short x, short y, char *cur_data, char *cur_mask)
{
- int size;
-
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_set_cursor"));
- size = 8 + 32 * (32 * 3) + 32 * (32 / 8);
- rdpup_pre_check(size);
- out_uint16_le(g_out_s, 19); /* set cursor */
- out_uint16_le(g_out_s, size); /* size */
- g_count++;
- x = MAX(0, x);
- x = MIN(31, x);
- y = MAX(0, y);
- y = MIN(31, y);
- out_uint16_le(g_out_s, x);
- out_uint16_le(g_out_s, y);
- out_uint8a(g_out_s, cur_data, 32 * (32 * 3));
- out_uint8a(g_out_s, cur_mask, 32 * (32 / 8));
- }
- return 0;
+ int size;
+
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_set_cursor"));
+ size = 8 + 32 * (32 * 3) + 32 * (32 / 8);
+ rdpup_pre_check(size);
+ out_uint16_le(g_out_s, 19); /* set cursor */
+ out_uint16_le(g_out_s, size); /* size */
+ g_count++;
+ x = MAX(0, x);
+ x = MIN(31, x);
+ y = MAX(0, y);
+ y = MIN(31, y);
+ out_uint16_le(g_out_s, x);
+ out_uint16_le(g_out_s, y);
+ out_uint8a(g_out_s, cur_data, 32 * (32 * 3));
+ out_uint8a(g_out_s, cur_mask, 32 * (32 / 8));
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_create_os_surface(int rdpindex, int width, int height)
{
- LLOGLN(10, ("rdpup_create_os_surface:"));
- if (g_connected)
- {
- LLOGLN(10, (" rdpup_create_os_surface width %d height %d", width, height));
- rdpup_pre_check(12);
- out_uint16_le(g_out_s, 20);
- out_uint16_le(g_out_s, 12);
- g_count++;
- out_uint32_le(g_out_s, rdpindex);
- out_uint16_le(g_out_s, width);
- out_uint16_le(g_out_s, height);
- }
- return 0;
+ LLOGLN(10, ("rdpup_create_os_surface:"));
+
+ if (g_connected)
+ {
+ LLOGLN(10, (" rdpup_create_os_surface width %d height %d", width, height));
+ rdpup_pre_check(12);
+ out_uint16_le(g_out_s, 20);
+ out_uint16_le(g_out_s, 12);
+ g_count++;
+ out_uint32_le(g_out_s, rdpindex);
+ out_uint16_le(g_out_s, width);
+ out_uint16_le(g_out_s, height);
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_switch_os_surface(int rdpindex)
{
- LLOGLN(10, ("rdpup_switch_os_surface:"));
- if (g_connected)
- {
- if (g_rdpindex == rdpindex)
- {
- return 0;
- }
- g_rdpindex = rdpindex;
- LLOGLN(10, ("rdpup_switch_os_surface: rdpindex %d", rdpindex));
- /* switch surface */
- rdpup_pre_check(8);
- out_uint16_le(g_out_s, 21);
- out_uint16_le(g_out_s, 8);
- out_uint32_le(g_out_s, rdpindex);
- g_count++;
- }
- return 0;
+ LLOGLN(10, ("rdpup_switch_os_surface:"));
+
+ if (g_connected)
+ {
+ if (g_rdpindex == rdpindex)
+ {
+ return 0;
+ }
+
+ g_rdpindex = rdpindex;
+ LLOGLN(10, ("rdpup_switch_os_surface: rdpindex %d", rdpindex));
+ /* switch surface */
+ rdpup_pre_check(8);
+ out_uint16_le(g_out_s, 21);
+ out_uint16_le(g_out_s, 8);
+ out_uint32_le(g_out_s, rdpindex);
+ g_count++;
+ }
+
+ return 0;
}
/******************************************************************************/
int
rdpup_delete_os_surface(int rdpindex)
{
- LLOGLN(10, ("rdpup_delete_os_surface: rdpindex %d", rdpindex));
- if (g_connected)
- {
LLOGLN(10, ("rdpup_delete_os_surface: rdpindex %d", rdpindex));
- rdpup_pre_check(8);
- out_uint16_le(g_out_s, 22);
- out_uint16_le(g_out_s, 8);
- g_count++;
- out_uint32_le(g_out_s, rdpindex);
- }
- return 0;
+
+ if (g_connected)
+ {
+ LLOGLN(10, ("rdpup_delete_os_surface: rdpindex %d", rdpindex));
+ rdpup_pre_check(8);
+ out_uint16_le(g_out_s, 22);
+ out_uint16_le(g_out_s, 8);
+ g_count++;
+ out_uint32_le(g_out_s, rdpindex);
+ }
+
+ return 0;
}
/******************************************************************************/
static int
-get_single_color(struct image_data* id, int x, int y, int w, int h)
+get_single_color(struct image_data *id, int x, int y, int w, int h)
{
- int rv;
- int i;
- int j;
- int p;
- unsigned char* i8;
- unsigned short* i16;
- unsigned int* i32;
-
- p = 0;
- rv = -1;
- if (g_Bpp == 1)
- {
- for (i = 0; i < h; i++)
- {
- i8 = (unsigned char*)(id->pixels +
- ((y + i) * id->lineBytes) + (x * g_Bpp));
- if (i == 0)
- {
- p = *i8;
- }
- for (j = 0; j < w; j++)
- {
- if (i8[j] != p)
+ int rv;
+ int i;
+ int j;
+ int p;
+ unsigned char *i8;
+ unsigned short *i16;
+ unsigned int *i32;
+
+ p = 0;
+ rv = -1;
+
+ if (g_Bpp == 1)
+ {
+ for (i = 0; i < h; i++)
{
- return -1;
+ i8 = (unsigned char *)(id->pixels +
+ ((y + i) * id->lineBytes) + (x * g_Bpp));
+
+ if (i == 0)
+ {
+ p = *i8;
+ }
+
+ for (j = 0; j < w; j++)
+ {
+ if (i8[j] != p)
+ {
+ return -1;
+ }
+ }
}
- }
- }
- rv = p;
- }
- else if (g_Bpp == 2)
- {
- for (i = 0; i < h; i++)
- {
- i16 = (unsigned short*)(id->pixels +
- ((y + i) * id->lineBytes) + (x * g_Bpp));
- if (i == 0)
- {
- p = *i16;
- }
- for (j = 0; j < w; j++)
- {
- if (i16[j] != p)
+
+ rv = p;
+ }
+ else if (g_Bpp == 2)
+ {
+ for (i = 0; i < h; i++)
{
- return -1;
+ i16 = (unsigned short *)(id->pixels +
+ ((y + i) * id->lineBytes) + (x * g_Bpp));
+
+ if (i == 0)
+ {
+ p = *i16;
+ }
+
+ for (j = 0; j < w; j++)
+ {
+ if (i16[j] != p)
+ {
+ return -1;
+ }
+ }
}
- }
- }
- rv = p;
- }
- else if (g_Bpp == 4)
- {
- for (i = 0; i < h; i++)
- {
- i32 = (unsigned int*)(id->pixels +
- ((y + i) * id->lineBytes) + (x * g_Bpp));
- if (i == 0)
- {
- p = *i32;
- }
- for (j = 0; j < w; j++)
- {
- if (i32[j] != p)
+
+ rv = p;
+ }
+ else if (g_Bpp == 4)
+ {
+ for (i = 0; i < h; i++)
{
- return -1;
+ i32 = (unsigned int *)(id->pixels +
+ ((y + i) * id->lineBytes) + (x * g_Bpp));
+
+ if (i == 0)
+ {
+ p = *i32;
+ }
+
+ for (j = 0; j < w; j++)
+ {
+ if (i32[j] != p)
+ {
+ return -1;
+ }
+ }
}
- }
+
+ rv = p;
}
- rv = p;
- }
- return rv;
+
+ return rv;
}
/******************************************************************************/
/* split the bitmap up into 64 x 64 pixel areas */
void
-rdpup_send_area(struct image_data* id, int x, int y, int w, int h)
+rdpup_send_area(struct image_data *id, int x, int y, int w, int h)
{
- char* s;
- int i;
- int single_color;
- int lx;
- int ly;
- int lh;
- int lw;
- int size;
- struct image_data lid;
-
- LLOGLN(10, ("rdpup_send_area: id %p x %d y %d w %d h %d", id, x, y, w, h));
- if (id == 0)
- {
- rdpup_get_screen_image_rect(&lid);
- id = &lid;
- }
-
- if (x >= id->width)
- {
- return;
- }
- if (y >= id->height)
- {
- return;
- }
- if (x < 0)
- {
- w += x;
- x = 0;
- }
- if (y < 0)
- {
- h += y;
- y = 0;
- }
- if (w <= 0)
- {
- return;
- }
- if (h <= 0)
- {
- return;
- }
- if (x + w > id->width)
- {
- w = id->width - x;
- }
- if (y + h > id->height)
- {
- h = id->height - y;
- }
- LLOGLN(10, ("%d", w * h));
- if (g_connected && g_begin)
- {
- LLOGLN(10, (" rdpup_send_area"));
- ly = y;
- while (ly < y + h)
- {
- lx = x;
- while (lx < x + w)
- {
- lw = MIN(64, (x + w) - lx);
- lh = MIN(64, (y + h) - ly);
- single_color = get_single_color(id, lx, ly, lw, lh);
- if (single_color != -1)
- {
- LLOGLN(10, ("%d sending single color", g_count));
- rdpup_set_fgcolor(single_color);
- rdpup_fill_rect(lx, ly, lw, lh);
- }
- else
+ char *s;
+ int i;
+ int single_color;
+ int lx;
+ int ly;
+ int lh;
+ int lw;
+ int size;
+ struct image_data lid;
+
+ LLOGLN(10, ("rdpup_send_area: id %p x %d y %d w %d h %d", id, x, y, w, h));
+
+ if (id == 0)
+ {
+ rdpup_get_screen_image_rect(&lid);
+ id = &lid;
+ }
+
+ if (x >= id->width)
+ {
+ return;
+ }
+
+ if (y >= id->height)
+ {
+ return;
+ }
+
+ if (x < 0)
+ {
+ w += x;
+ x = 0;
+ }
+
+ if (y < 0)
+ {
+ h += y;
+ y = 0;
+ }
+
+ if (w <= 0)
+ {
+ return;
+ }
+
+ if (h <= 0)
+ {
+ return;
+ }
+
+ if (x + w > id->width)
+ {
+ w = id->width - x;
+ }
+
+ if (y + h > id->height)
+ {
+ h = id->height - y;
+ }
+
+ LLOGLN(10, ("%d", w * h));
+
+ if (g_connected && g_begin)
+ {
+ LLOGLN(10, (" rdpup_send_area"));
+ ly = y;
+
+ while (ly < y + h)
{
- size = lw * lh * id->Bpp + 24;
- rdpup_pre_check(size);
- out_uint16_le(g_out_s, 5);
- out_uint16_le(g_out_s, size);
- g_count++;
- out_uint16_le(g_out_s, lx);
- out_uint16_le(g_out_s, ly);
- out_uint16_le(g_out_s, lw);
- out_uint16_le(g_out_s, lh);
- out_uint32_le(g_out_s, lw * lh * id->Bpp);
- for (i = 0; i < lh; i++)
- {
- s = (id->pixels +
- ((ly + i) * id->lineBytes) + (lx * g_Bpp));
- convert_pixels(s, g_out_s->p, lw);
- g_out_s->p += lw * id->Bpp;
- }
- out_uint16_le(g_out_s, lw);
- out_uint16_le(g_out_s, lh);
- out_uint16_le(g_out_s, 0);
- out_uint16_le(g_out_s, 0);
+ lx = x;
+
+ while (lx < x + w)
+ {
+ lw = MIN(64, (x + w) - lx);
+ lh = MIN(64, (y + h) - ly);
+ single_color = get_single_color(id, lx, ly, lw, lh);
+
+ if (single_color != -1)
+ {
+ LLOGLN(10, ("%d sending single color", g_count));
+ rdpup_set_fgcolor(single_color);
+ rdpup_fill_rect(lx, ly, lw, lh);
+ }
+ else
+ {
+ size = lw * lh * id->Bpp + 24;
+ rdpup_pre_check(size);
+ out_uint16_le(g_out_s, 5);
+ out_uint16_le(g_out_s, size);
+ g_count++;
+ out_uint16_le(g_out_s, lx);
+ out_uint16_le(g_out_s, ly);
+ out_uint16_le(g_out_s, lw);
+ out_uint16_le(g_out_s, lh);
+ out_uint32_le(g_out_s, lw * lh * id->Bpp);
+
+ for (i = 0; i < lh; i++)
+ {
+ s = (id->pixels +
+ ((ly + i) * id->lineBytes) + (lx * g_Bpp));
+ convert_pixels(s, g_out_s->p, lw);
+ g_out_s->p += lw * id->Bpp;
+ }
+
+ out_uint16_le(g_out_s, lw);
+ out_uint16_le(g_out_s, lh);
+ out_uint16_le(g_out_s, 0);
+ out_uint16_le(g_out_s, 0);
+ }
+
+ lx += 64;
+ }
+
+ ly += 64;
}
- lx += 64;
- }
- ly += 64;
}
- }
}
/******************************************************************************/
@@ -1496,374 +1635,410 @@ void
rdpup_paint_rect_os(int x, int y, int cx, int cy,
int rdpindex, int srcx, int srcy)
{
- if (g_connected)
- {
- rdpup_pre_check(20);
- out_uint16_le(g_out_s, 23);
- out_uint16_le(g_out_s, 20);
- g_count++;
- out_uint16_le(g_out_s, x);
- out_uint16_le(g_out_s, y);
- out_uint16_le(g_out_s, cx);
- out_uint16_le(g_out_s, cy);
- out_uint32_le(g_out_s, rdpindex);
- out_uint16_le(g_out_s, srcx);
- out_uint16_le(g_out_s, srcy);
- }
+ if (g_connected)
+ {
+ rdpup_pre_check(20);
+ out_uint16_le(g_out_s, 23);
+ out_uint16_le(g_out_s, 20);
+ g_count++;
+ out_uint16_le(g_out_s, x);
+ out_uint16_le(g_out_s, y);
+ out_uint16_le(g_out_s, cx);
+ out_uint16_le(g_out_s, cy);
+ out_uint32_le(g_out_s, rdpindex);
+ out_uint16_le(g_out_s, srcx);
+ out_uint16_le(g_out_s, srcy);
+ }
}
/******************************************************************************/
void
rdpup_set_hints(int hints, int mask)
{
- if (g_connected)
- {
- rdpup_pre_check(12);
- out_uint16_le(g_out_s, 24);
- out_uint16_le(g_out_s, 12);
- g_count++;
- out_uint32_le(g_out_s, hints);
- out_uint32_le(g_out_s, mask);
- }
+ if (g_connected)
+ {
+ rdpup_pre_check(12);
+ out_uint16_le(g_out_s, 24);
+ out_uint16_le(g_out_s, 12);
+ g_count++;
+ out_uint32_le(g_out_s, hints);
+ out_uint32_le(g_out_s, mask);
+ }
}
/******************************************************************************/
void
-rdpup_create_window(WindowPtr pWindow, rdpWindowRec* priv)
+rdpup_create_window(WindowPtr pWindow, rdpWindowRec *priv)
{
- int bytes;
- int index;
- int flags;
- int num_window_rects;
- int num_visibility_rects;
- int title_bytes;
- int style;
- int ext_style;
- int root_id;
- char title[256];
-
- LLOGLN(10, ("rdpup_create_window: id 0x%8.8x", pWindow->drawable.id));
- if (g_connected)
- {
- root_id = pWindow->drawable.pScreen->root->drawable.id;
-
- if (pWindow->overrideRedirect)
- {
- style = XR_STYLE_TOOLTIP;
- ext_style = XR_EXT_STYLE_TOOLTIP;
- }
- else
+ int bytes;
+ int index;
+ int flags;
+ int num_window_rects;
+ int num_visibility_rects;
+ int title_bytes;
+ int style;
+ int ext_style;
+ int root_id;
+ char title[256];
+
+ LLOGLN(10, ("rdpup_create_window: id 0x%8.8x", pWindow->drawable.id));
+
+ if (g_connected)
{
- style = XR_STYLE_NORMAL;
- ext_style = XR_EXT_STYLE_NORMAL;
- }
-
- flags = WINDOW_ORDER_TYPE_WINDOW | WINDOW_ORDER_STATE_NEW;
- strcpy(title, "title");
- title_bytes = strlen(title);
-
- num_window_rects = 1;
- num_visibility_rects = 1;
-
- /* calculate bytes */
- bytes = (2 + 2) + (5 * 4) + (2 + title_bytes) + (12 * 4) +
- (2 + num_window_rects * 8) + (4 + 4) +
- (2 + num_visibility_rects * 8) + 4;
-
- rdpup_pre_check(bytes);
- out_uint16_le(g_out_s, 25);
- out_uint16_le(g_out_s, bytes);
- g_count++;
- out_uint32_le(g_out_s, pWindow->drawable.id); /* window_id */
- out_uint32_le(g_out_s, pWindow->parent->drawable.id); /* owner_window_id */
- flags |= WINDOW_ORDER_FIELD_OWNER;
- out_uint32_le(g_out_s, style); /* style */
- out_uint32_le(g_out_s, ext_style); /* extended_style */
- flags |= WINDOW_ORDER_FIELD_STYLE;
- out_uint32_le(g_out_s, 0); /* show_state */
- flags |= WINDOW_ORDER_FIELD_SHOW;
- out_uint16_le(g_out_s, title_bytes); /* title_info */
- out_uint8a(g_out_s, title, title_bytes);
- flags |= WINDOW_ORDER_FIELD_TITLE;
- out_uint32_le(g_out_s, 0); /* client_offset_x */
- out_uint32_le(g_out_s, 0); /* client_offset_y */
- flags |= WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET;
- out_uint32_le(g_out_s, pWindow->drawable.width); /* client_area_width */
- out_uint32_le(g_out_s, pWindow->drawable.height); /* client_area_height */
- flags |= WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE;
- out_uint32_le(g_out_s, 0); /* rp_content */
- out_uint32_le(g_out_s, root_id); /* root_parent_handle */
- flags |= WINDOW_ORDER_FIELD_ROOT_PARENT;
- out_uint32_le(g_out_s, pWindow->drawable.x); /* window_offset_x */
- out_uint32_le(g_out_s, pWindow->drawable.y); /* window_offset_y */
- flags |= WINDOW_ORDER_FIELD_WND_OFFSET;
- out_uint32_le(g_out_s, 0); /* window_client_delta_x */
- out_uint32_le(g_out_s, 0); /* window_client_delta_y */
- flags |= WINDOW_ORDER_FIELD_WND_CLIENT_DELTA;
- out_uint32_le(g_out_s, pWindow->drawable.width); /* window_width */
- out_uint32_le(g_out_s, pWindow->drawable.height); /* window_height */
- flags |= WINDOW_ORDER_FIELD_WND_SIZE;
- out_uint16_le(g_out_s, num_window_rects); /* num_window_rects */
- for (index = 0; index < num_window_rects; index++)
- {
- out_uint16_le(g_out_s, 0); /* left */
- out_uint16_le(g_out_s, 0); /* top */
- out_uint16_le(g_out_s, pWindow->drawable.width); /* right */
- out_uint16_le(g_out_s, pWindow->drawable.height); /* bottom */
- }
- flags |= WINDOW_ORDER_FIELD_WND_RECTS;
- out_uint32_le(g_out_s, pWindow->drawable.x); /* visible_offset_x */
- out_uint32_le(g_out_s, pWindow->drawable.y); /* visible_offset_y */
- flags |= WINDOW_ORDER_FIELD_VIS_OFFSET;
- out_uint16_le(g_out_s, num_visibility_rects); /* num_visibility_rects */
- for (index = 0; index < num_visibility_rects; index++)
- {
- out_uint16_le(g_out_s, 0); /* left */
- out_uint16_le(g_out_s, 0); /* top */
- out_uint16_le(g_out_s, pWindow->drawable.width); /* right */
- out_uint16_le(g_out_s, pWindow->drawable.height); /* bottom */
- }
- flags |= WINDOW_ORDER_FIELD_VISIBILITY;
-
- out_uint32_le(g_out_s, flags); /* flags */
- }
+ root_id = pWindow->drawable.pScreen->root->drawable.id;
+
+ if (pWindow->overrideRedirect)
+ {
+ style = XR_STYLE_TOOLTIP;
+ ext_style = XR_EXT_STYLE_TOOLTIP;
+ }
+ else
+ {
+ style = XR_STYLE_NORMAL;
+ ext_style = XR_EXT_STYLE_NORMAL;
+ }
+
+ flags = WINDOW_ORDER_TYPE_WINDOW | WINDOW_ORDER_STATE_NEW;
+ strcpy(title, "title");
+ title_bytes = strlen(title);
+
+ num_window_rects = 1;
+ num_visibility_rects = 1;
+
+ /* calculate bytes */
+ bytes = (2 + 2) + (5 * 4) + (2 + title_bytes) + (12 * 4) +
+ (2 + num_window_rects * 8) + (4 + 4) +
+ (2 + num_visibility_rects * 8) + 4;
+
+ rdpup_pre_check(bytes);
+ out_uint16_le(g_out_s, 25);
+ out_uint16_le(g_out_s, bytes);
+ g_count++;
+ out_uint32_le(g_out_s, pWindow->drawable.id); /* window_id */
+ out_uint32_le(g_out_s, pWindow->parent->drawable.id); /* owner_window_id */
+ flags |= WINDOW_ORDER_FIELD_OWNER;
+ out_uint32_le(g_out_s, style); /* style */
+ out_uint32_le(g_out_s, ext_style); /* extended_style */
+ flags |= WINDOW_ORDER_FIELD_STYLE;
+ out_uint32_le(g_out_s, 0); /* show_state */
+ flags |= WINDOW_ORDER_FIELD_SHOW;
+ out_uint16_le(g_out_s, title_bytes); /* title_info */
+ out_uint8a(g_out_s, title, title_bytes);
+ flags |= WINDOW_ORDER_FIELD_TITLE;
+ out_uint32_le(g_out_s, 0); /* client_offset_x */
+ out_uint32_le(g_out_s, 0); /* client_offset_y */
+ flags |= WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET;
+ out_uint32_le(g_out_s, pWindow->drawable.width); /* client_area_width */
+ out_uint32_le(g_out_s, pWindow->drawable.height); /* client_area_height */
+ flags |= WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE;
+ out_uint32_le(g_out_s, 0); /* rp_content */
+ out_uint32_le(g_out_s, root_id); /* root_parent_handle */
+ flags |= WINDOW_ORDER_FIELD_ROOT_PARENT;
+ out_uint32_le(g_out_s, pWindow->drawable.x); /* window_offset_x */
+ out_uint32_le(g_out_s, pWindow->drawable.y); /* window_offset_y */
+ flags |= WINDOW_ORDER_FIELD_WND_OFFSET;
+ out_uint32_le(g_out_s, 0); /* window_client_delta_x */
+ out_uint32_le(g_out_s, 0); /* window_client_delta_y */
+ flags |= WINDOW_ORDER_FIELD_WND_CLIENT_DELTA;
+ out_uint32_le(g_out_s, pWindow->drawable.width); /* window_width */
+ out_uint32_le(g_out_s, pWindow->drawable.height); /* window_height */
+ flags |= WINDOW_ORDER_FIELD_WND_SIZE;
+ out_uint16_le(g_out_s, num_window_rects); /* num_window_rects */
+
+ for (index = 0; index < num_window_rects; index++)
+ {
+ out_uint16_le(g_out_s, 0); /* left */
+ out_uint16_le(g_out_s, 0); /* top */
+ out_uint16_le(g_out_s, pWindow->drawable.width); /* right */
+ out_uint16_le(g_out_s, pWindow->drawable.height); /* bottom */
+ }
+
+ flags |= WINDOW_ORDER_FIELD_WND_RECTS;
+ out_uint32_le(g_out_s, pWindow->drawable.x); /* visible_offset_x */
+ out_uint32_le(g_out_s, pWindow->drawable.y); /* visible_offset_y */
+ flags |= WINDOW_ORDER_FIELD_VIS_OFFSET;
+ out_uint16_le(g_out_s, num_visibility_rects); /* num_visibility_rects */
+
+ for (index = 0; index < num_visibility_rects; index++)
+ {
+ out_uint16_le(g_out_s, 0); /* left */
+ out_uint16_le(g_out_s, 0); /* top */
+ out_uint16_le(g_out_s, pWindow->drawable.width); /* right */
+ out_uint16_le(g_out_s, pWindow->drawable.height); /* bottom */
+ }
+
+ flags |= WINDOW_ORDER_FIELD_VISIBILITY;
+
+ out_uint32_le(g_out_s, flags); /* flags */
+ }
}
/******************************************************************************/
void
-rdpup_delete_window(WindowPtr pWindow, rdpWindowRec* priv)
+rdpup_delete_window(WindowPtr pWindow, rdpWindowRec *priv)
{
- LLOGLN(10, ("rdpup_delete_window: id 0x%8.8x", pWindow->drawable.id));
- if (g_connected)
- {
- rdpup_pre_check(8);
- out_uint16_le(g_out_s, 26);
- out_uint16_le(g_out_s, 8);
- g_count++;
- out_uint32_le(g_out_s, pWindow->drawable.id); /* window_id */
- }
+ LLOGLN(10, ("rdpup_delete_window: id 0x%8.8x", pWindow->drawable.id));
+
+ if (g_connected)
+ {
+ rdpup_pre_check(8);
+ out_uint16_le(g_out_s, 26);
+ out_uint16_le(g_out_s, 8);
+ g_count++;
+ out_uint32_le(g_out_s, pWindow->drawable.id); /* window_id */
+ }
}
/******************************************************************************/
int
-rdpup_check_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec* pDirtyPriv)
+rdpup_check_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec *pDirtyPriv)
{
- int index;
- int clip_index;
- int count;
- int num_clips;
- BoxRec box;
- xSegment* seg;
- struct image_data id;
- struct rdp_draw_item* di;
-
- if (pDirtyPriv == 0)
- {
- return 0;
- }
- if (pDirtyPriv->is_dirty == 0)
- {
- return 0;
- }
-
- /* update use time / count */
- g_os_bitmaps[pDirtyPriv->rdpindex].stamp = g_os_bitmap_stamp;
- g_os_bitmap_stamp++;
-
- LLOGLN(10, ("-----------------got dirty"));
- rdpup_switch_os_surface(pDirtyPriv->rdpindex);
- rdpup_get_pixmap_image_rect(pDirtyPixmap, &id);
- rdpup_begin_update();
- draw_item_pack(pDirtyPriv);
- di = pDirtyPriv->draw_item_head;
- while (di != 0)
- {
- LLOGLN(10, ("rdpup_check_dirty: type %d", di->type));
- switch (di->type)
- {
- case RDI_FILL:
- rdpup_set_fgcolor(di->u.fill.fg_color);
- rdpup_set_opcode(di->u.fill.opcode);
- count = REGION_NUM_RECTS(di->reg);
- for (index = 0; index < count; index++)
- {
- box = REGION_RECTS(di->reg)[index];
- LLOGLN(10, (" RDI_FILL %d %d %d %d", box.x1, box.y1,
- box.x2, box.y2));
- rdpup_fill_rect(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_set_opcode(GXcopy);
- break;
- case RDI_IMGLL:
- rdpup_set_hints(1, 1);
- rdpup_set_opcode(di->u.img.opcode);
- count = REGION_NUM_RECTS(di->reg);
- for (index = 0; index < count; index++)
- {
- box = REGION_RECTS(di->reg)[index];
- LLOGLN(10, (" RDI_IMGLL %d %d %d %d", box.x1, box.y1,
- box.x2, box.y2));
- rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
- box.y2 - box.y1);
- }
- rdpup_set_opcode(GXcopy);
- rdpup_set_hints(0, 1);
- break;
- case RDI_IMGLY:
- rdpup_set_opcode(di->u.img.opcode);
- count = REGION_NUM_RECTS(di->reg);
- for (index = 0; index < count; index++)
- {
- box = REGION_RECTS(di->reg)[index];
- LLOGLN(10, (" RDI_IMGLY %d %d %d %d", box.x1, box.y1,
- box.x2, box.y2));
- rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
- box.y2 - box.y1);
- }
- rdpup_set_opcode(GXcopy);
- break;
- case RDI_LINE:
- LLOGLN(10, (" RDI_LINE"));
- num_clips = REGION_NUM_RECTS(di->reg);
- if (num_clips > 0)
+ int index;
+ int clip_index;
+ int count;
+ int num_clips;
+ BoxRec box;
+ xSegment *seg;
+ struct image_data id;
+ struct rdp_draw_item *di;
+
+ if (pDirtyPriv == 0)
+ {
+ return 0;
+ }
+
+ if (pDirtyPriv->is_dirty == 0)
+ {
+ return 0;
+ }
+
+ /* update use time / count */
+ g_os_bitmaps[pDirtyPriv->rdpindex].stamp = g_os_bitmap_stamp;
+ g_os_bitmap_stamp++;
+
+ LLOGLN(10, ("-----------------got dirty"));
+ rdpup_switch_os_surface(pDirtyPriv->rdpindex);
+ rdpup_get_pixmap_image_rect(pDirtyPixmap, &id);
+ rdpup_begin_update();
+ draw_item_pack(pDirtyPriv);
+ di = pDirtyPriv->draw_item_head;
+
+ while (di != 0)
+ {
+ LLOGLN(10, ("rdpup_check_dirty: type %d", di->type));
+
+ switch (di->type)
{
- rdpup_set_fgcolor(di->u.line.fg_color);
- rdpup_set_opcode(di->u.line.opcode);
- rdpup_set_pen(0, di->u.line.width);
- for (clip_index = num_clips - 1; clip_index >= 0; clip_index--)
- {
- box = REGION_RECTS(di->reg)[clip_index];
- rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- for (index = 0; index < di->u.line.nseg; index++)
- {
- seg = di->u.line.segs + index;
- LLOGLN(10, (" RDI_LINE %d %d %d %d", seg->x1, seg->y1,
- seg->x2, seg->y2));
- rdpup_draw_line(seg->x1, seg->y1, seg->x2, seg->y2);
- }
- }
+ case RDI_FILL:
+ rdpup_set_fgcolor(di->u.fill.fg_color);
+ rdpup_set_opcode(di->u.fill.opcode);
+ count = REGION_NUM_RECTS(di->reg);
+
+ for (index = 0; index < count; index++)
+ {
+ box = REGION_RECTS(di->reg)[index];
+ LLOGLN(10, (" RDI_FILL %d %d %d %d", box.x1, box.y1,
+ box.x2, box.y2));
+ rdpup_fill_rect(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+
+ rdpup_set_opcode(GXcopy);
+ break;
+ case RDI_IMGLL:
+ rdpup_set_hints(1, 1);
+ rdpup_set_opcode(di->u.img.opcode);
+ count = REGION_NUM_RECTS(di->reg);
+
+ for (index = 0; index < count; index++)
+ {
+ box = REGION_RECTS(di->reg)[index];
+ LLOGLN(10, (" RDI_IMGLL %d %d %d %d", box.x1, box.y1,
+ box.x2, box.y2));
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
+ box.y2 - box.y1);
+ }
+
+ rdpup_set_opcode(GXcopy);
+ rdpup_set_hints(0, 1);
+ break;
+ case RDI_IMGLY:
+ rdpup_set_opcode(di->u.img.opcode);
+ count = REGION_NUM_RECTS(di->reg);
+
+ for (index = 0; index < count; index++)
+ {
+ box = REGION_RECTS(di->reg)[index];
+ LLOGLN(10, (" RDI_IMGLY %d %d %d %d", box.x1, box.y1,
+ box.x2, box.y2));
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
+ box.y2 - box.y1);
+ }
+
+ rdpup_set_opcode(GXcopy);
+ break;
+ case RDI_LINE:
+ LLOGLN(10, (" RDI_LINE"));
+ num_clips = REGION_NUM_RECTS(di->reg);
+
+ if (num_clips > 0)
+ {
+ rdpup_set_fgcolor(di->u.line.fg_color);
+ rdpup_set_opcode(di->u.line.opcode);
+ rdpup_set_pen(0, di->u.line.width);
+
+ for (clip_index = num_clips - 1; clip_index >= 0; clip_index--)
+ {
+ box = REGION_RECTS(di->reg)[clip_index];
+ rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+
+ for (index = 0; index < di->u.line.nseg; index++)
+ {
+ seg = di->u.line.segs + index;
+ LLOGLN(10, (" RDI_LINE %d %d %d %d", seg->x1, seg->y1,
+ seg->x2, seg->y2));
+ rdpup_draw_line(seg->x1, seg->y1, seg->x2, seg->y2);
+ }
+ }
+ }
+
+ rdpup_reset_clip();
+ rdpup_set_opcode(GXcopy);
+ break;
+ case RDI_SCRBLT:
+ LLOGLN(10, (" RDI_SCRBLT"));
+ break;
}
- rdpup_reset_clip();
- rdpup_set_opcode(GXcopy);
- break;
- case RDI_SCRBLT:
- LLOGLN(10, (" RDI_SCRBLT"));
- break;
- }
- di = di->next;
- }
- draw_item_remove_all(pDirtyPriv);
- rdpup_end_update();
- pDirtyPriv->is_dirty = 0;
- rdpup_switch_os_surface(-1);
- return 0;
+
+ di = di->next;
+ }
+
+ draw_item_remove_all(pDirtyPriv);
+ rdpup_end_update();
+ pDirtyPriv->is_dirty = 0;
+ rdpup_switch_os_surface(-1);
+ return 0;
}
/******************************************************************************/
int
-rdpup_check_dirty_screen(rdpPixmapRec* pDirtyPriv)
+rdpup_check_dirty_screen(rdpPixmapRec *pDirtyPriv)
{
- int index;
- int clip_index;
- int count;
- int num_clips;
- BoxRec box;
- xSegment* seg;
- struct image_data id;
- struct rdp_draw_item* di;
-
- if (pDirtyPriv == 0)
- {
- return 0;
- }
- if (pDirtyPriv->is_dirty == 0)
- {
- return 0;
- }
-
- LLOGLN(10, ("-----------------got dirty"));
- rdpup_get_screen_image_rect(&id);
- rdpup_begin_update();
- draw_item_pack(pDirtyPriv);
- di = pDirtyPriv->draw_item_head;
- while (di != 0)
- {
- LLOGLN(10, ("rdpup_check_dirty_screen: type %d", di->type));
- switch (di->type)
- {
- case RDI_FILL:
- rdpup_set_fgcolor(di->u.fill.fg_color);
- rdpup_set_opcode(di->u.fill.opcode);
- count = REGION_NUM_RECTS(di->reg);
- for (index = 0; index < count; index++)
- {
- box = REGION_RECTS(di->reg)[index];
- LLOGLN(10, (" RDI_FILL %d %d %d %d", box.x1, box.y1,
- box.x2, box.y2));
- rdpup_fill_rect(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_set_opcode(GXcopy);
- break;
- case RDI_IMGLL:
- rdpup_set_hints(1, 1);
- rdpup_set_opcode(di->u.img.opcode);
- count = REGION_NUM_RECTS(di->reg);
- for (index = 0; index < count; index++)
- {
- box = REGION_RECTS(di->reg)[index];
- LLOGLN(10, (" RDI_IMGLL %d %d %d %d", box.x1, box.y1,
- box.x2, box.y2));
- rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
- box.y2 - box.y1);
- }
- rdpup_set_opcode(GXcopy);
- rdpup_set_hints(0, 1);
- break;
- case RDI_IMGLY:
- rdpup_set_opcode(di->u.img.opcode);
- count = REGION_NUM_RECTS(di->reg);
- for (index = 0; index < count; index++)
- {
- box = REGION_RECTS(di->reg)[index];
- LLOGLN(10, (" RDI_IMGLY %d %d %d %d", box.x1, box.y1,
- box.x2, box.y2));
- rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
- box.y2 - box.y1);
- }
- rdpup_set_opcode(GXcopy);
- break;
- case RDI_LINE:
- LLOGLN(10, (" RDI_LINE"));
- num_clips = REGION_NUM_RECTS(di->reg);
- if (num_clips > 0)
+ int index;
+ int clip_index;
+ int count;
+ int num_clips;
+ BoxRec box;
+ xSegment *seg;
+ struct image_data id;
+ struct rdp_draw_item *di;
+
+ if (pDirtyPriv == 0)
+ {
+ return 0;
+ }
+
+ if (pDirtyPriv->is_dirty == 0)
+ {
+ return 0;
+ }
+
+ LLOGLN(10, ("-----------------got dirty"));
+ rdpup_get_screen_image_rect(&id);
+ rdpup_begin_update();
+ draw_item_pack(pDirtyPriv);
+ di = pDirtyPriv->draw_item_head;
+
+ while (di != 0)
+ {
+ LLOGLN(10, ("rdpup_check_dirty_screen: type %d", di->type));
+
+ switch (di->type)
{
- rdpup_set_fgcolor(di->u.line.fg_color);
- rdpup_set_opcode(di->u.line.opcode);
- rdpup_set_pen(0, di->u.line.width);
- for (clip_index = num_clips - 1; clip_index >= 0; clip_index--)
- {
- box = REGION_RECTS(di->reg)[clip_index];
- rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- for (index = 0; index < di->u.line.nseg; index++)
- {
- seg = di->u.line.segs + index;
- LLOGLN(10, (" RDI_LINE %d %d %d %d", seg->x1, seg->y1,
- seg->x2, seg->y2));
- rdpup_draw_line(seg->x1, seg->y1, seg->x2, seg->y2);
- }
- }
+ case RDI_FILL:
+ rdpup_set_fgcolor(di->u.fill.fg_color);
+ rdpup_set_opcode(di->u.fill.opcode);
+ count = REGION_NUM_RECTS(di->reg);
+
+ for (index = 0; index < count; index++)
+ {
+ box = REGION_RECTS(di->reg)[index];
+ LLOGLN(10, (" RDI_FILL %d %d %d %d", box.x1, box.y1,
+ box.x2, box.y2));
+ rdpup_fill_rect(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+
+ rdpup_set_opcode(GXcopy);
+ break;
+ case RDI_IMGLL:
+ rdpup_set_hints(1, 1);
+ rdpup_set_opcode(di->u.img.opcode);
+ count = REGION_NUM_RECTS(di->reg);
+
+ for (index = 0; index < count; index++)
+ {
+ box = REGION_RECTS(di->reg)[index];
+ LLOGLN(10, (" RDI_IMGLL %d %d %d %d", box.x1, box.y1,
+ box.x2, box.y2));
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
+ box.y2 - box.y1);
+ }
+
+ rdpup_set_opcode(GXcopy);
+ rdpup_set_hints(0, 1);
+ break;
+ case RDI_IMGLY:
+ rdpup_set_opcode(di->u.img.opcode);
+ count = REGION_NUM_RECTS(di->reg);
+
+ for (index = 0; index < count; index++)
+ {
+ box = REGION_RECTS(di->reg)[index];
+ LLOGLN(10, (" RDI_IMGLY %d %d %d %d", box.x1, box.y1,
+ box.x2, box.y2));
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1,
+ box.y2 - box.y1);
+ }
+
+ rdpup_set_opcode(GXcopy);
+ break;
+ case RDI_LINE:
+ LLOGLN(10, (" RDI_LINE"));
+ num_clips = REGION_NUM_RECTS(di->reg);
+
+ if (num_clips > 0)
+ {
+ rdpup_set_fgcolor(di->u.line.fg_color);
+ rdpup_set_opcode(di->u.line.opcode);
+ rdpup_set_pen(0, di->u.line.width);
+
+ for (clip_index = num_clips - 1; clip_index >= 0; clip_index--)
+ {
+ box = REGION_RECTS(di->reg)[clip_index];
+ rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+
+ for (index = 0; index < di->u.line.nseg; index++)
+ {
+ seg = di->u.line.segs + index;
+ LLOGLN(10, (" RDI_LINE %d %d %d %d", seg->x1, seg->y1,
+ seg->x2, seg->y2));
+ rdpup_draw_line(seg->x1, seg->y1, seg->x2, seg->y2);
+ }
+ }
+ }
+
+ rdpup_reset_clip();
+ rdpup_set_opcode(GXcopy);
+ break;
+ case RDI_SCRBLT:
+ LLOGLN(10, (" RDI_SCRBLT"));
+ break;
}
- rdpup_reset_clip();
- rdpup_set_opcode(GXcopy);
- break;
- case RDI_SCRBLT:
- LLOGLN(10, (" RDI_SCRBLT"));
- break;
- }
- di = di->next;
- }
- draw_item_remove_all(pDirtyPriv);
- rdpup_end_update();
- pDirtyPriv->is_dirty = 0;
- return 0;
+
+ di = di->next;
+ }
+
+ draw_item_remove_all(pDirtyPriv);
+ rdpup_end_update();
+ pDirtyPriv->is_dirty = 0;
+ return 0;
}