Hello,

I'm trying to implement a few missing capabilities which I think would make 
freerdp run faster for a few issues (like text scrolling, etc).

I'm having a hard time make FastIndex work. I wonder if anyone could help me 
with that. Please apply the attached diff, its code is similar to the 
GlyphIndex.


Thanks

Eduardo Fiss Beloni
bel...@ossystems.com.br
55 53 8117 8244


      
commit 8f3cb82097b1aea329a6a4a29bc8aca8407aa47f
Author: Eduardo Beloni <bel...@ossystems.com.br>
Date:   Tue Feb 1 11:31:22 2011 -0200

    libfreerdp: implement FastIndex

diff --git a/libfreerdp/capabilities.c b/libfreerdp/capabilities.c
index e89d0bb..bf71734 100644
--- a/libfreerdp/capabilities.c
+++ b/libfreerdp/capabilities.c
@@ -191,7 +191,7 @@ rdp_out_order_capset(rdpRdp * rdp, STREAM s)
 	// orderSupport[NEG_MULTIPATBLT_INDEX] = 1;
 	// orderSupport[NEG_MULTISCRBLT_INDEX] = 1;
 	// orderSupport[NEG_MULTIOPAQUERECT_INDEX] = 1;
-	// orderSupport[NEG_FAST_INDEX_INDEX] = 1;
+	orderSupport[NEG_FAST_INDEX_INDEX] = 1;
 	orderSupport[NEG_POLYGON_SC_INDEX] = (rdp->settings->polygon_ellipse_orders ? 1 : 0);
 	orderSupport[NEG_POLYGON_CB_INDEX] = (rdp->settings->polygon_ellipse_orders ? 1 : 0);
 	orderSupport[NEG_POLYLINE_INDEX] = 1;
diff --git a/libfreerdp/orders.c b/libfreerdp/orders.c
index 9f6cf75..6754fbc 100644
--- a/libfreerdp/orders.c
+++ b/libfreerdp/orders.c
@@ -1091,6 +1091,75 @@ hexdump(s->p, 32);
 		  &brush, os->bgcolor, os->fgcolor, os->text, os->length);
 }
 
+static void
+process_fast_index(rdpOrders * orders, STREAM s, FAST_INDEX_ORDER * os, uint32 present, RD_BOOL delta)
+{
+	printf("%s %x\n", __PRETTY_FUNCTION__, present);
+	hexdump(s->p, 32);
+
+	if (present & 0x000001)
+		in_uint8(s, os->font);
+
+	if (present & 0x000002)
+	{
+		in_uint8(s, os->opcode);
+		in_uint8(s, os->flags);
+	}
+
+	if (present & 0x000004)
+		rdp_in_color(s, &os->fgcolor);
+
+	if (present & 0x000008)
+		rdp_in_color(s, &os->bgcolor);
+
+	if (present & 0x000010)
+		rdp_in_coord(s, &os->clipleft, delta);
+
+	if (present & 0x000020)
+		rdp_in_coord(s, &os->cliptop, delta);
+
+	if (present & 0x000040)
+		rdp_in_coord(s, &os->clipright, delta);
+
+	if (present & 0x000080)
+		rdp_in_coord(s, &os->clipbottom, delta);
+
+	if (present & 0x000100)
+		rdp_in_coord(s, &os->boxleft, delta);
+
+	if (present & 0x000200)
+		rdp_in_coord(s, &os->boxtop, delta);
+
+	if (present & 0x000400)
+		rdp_in_coord(s, &os->boxright, delta);
+
+	if (present & 0x000800)
+		rdp_in_coord(s, &os->boxbottom, delta);
+
+	if (present & 0x001000)
+		in_uint16_le(s, os->x);
+
+	if (present & 0x002000)
+		in_uint16_le(s, os->y);
+
+	if (present & 0x004000)
+	{
+		in_uint8(s, os->length);
+		in_uint8a(s, os->text, os->length);
+	}
+
+	printf("FAST_INDEX(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,br=%d,bb=%d,bg=0x%x,fg=0x%x,font=%d,fl=0x%x,op=0x%x,n=%d)\n", os->x, os->y, os->clipleft, os->cliptop, os->clipright, os->clipbottom, os->boxleft, os->boxtop, os->boxright, os->boxbottom, os->bgcolor, os->fgcolor, os->font, os->flags, os->opcode, os->length);
+
+	memset(&os->brush, 0, sizeof(RD_BRUSH));
+
+	draw_text(orders, os->font, os->flags, os->opcode, 0, os->x, os->y,
+		  os->clipleft, os->cliptop, os->clipright - os->clipleft,
+		  os->clipbottom - os->cliptop, os->boxleft, os->boxtop,
+		  os->boxright - os->boxleft, os->boxbottom - os->boxtop,
+		  &os->brush, os->bgcolor, os->fgcolor, os->text, os->length);
+}
+
+
 /* Process a fast glyph order */
 static void
 process_fast_glyph(rdpOrders * orders, STREAM s, FAST_GLYPH_ORDER * os, uint32 present, RD_BOOL delta)
@@ -1727,6 +1796,7 @@ process_orders(rdpOrders * orders, STREAM s, uint16 num_orders)
 				case RDP_ORDER_LINETO:
 				case RDP_ORDER_POLYGON_CB:
 				case RDP_ORDER_ELLIPSE_CB:
+				case RDP_ORDER_FAST_INDEX:
 				case RDP_ORDER_FAST_GLYPH:
 					size = 2;
 					break;
@@ -1809,6 +1879,10 @@ process_orders(rdpOrders * orders, STREAM s, uint16 num_orders)
 					process_glyph_index(orders, s, &os->glyph_index, present, delta);
 					break;
 
+				case RDP_ORDER_FAST_INDEX:
+					process_fast_index(orders, s, &os->fast_index, present, delta);
+					break;
+
 				case RDP_ORDER_FAST_GLYPH:
 					process_fast_glyph(orders, s, &os->fast_glyph, present, delta);
 					break;
diff --git a/libfreerdp/orderstypes.h b/libfreerdp/orderstypes.h
index 5edd5c3..fe2b8d0 100644
--- a/libfreerdp/orderstypes.h
+++ b/libfreerdp/orderstypes.h
@@ -48,7 +48,7 @@ enum RDP_ORDER_TYPE
 	RDP_ORDER_MULTIPATBLT = 16,
 	RDP_ORDER_MULTISCRBLT = 17,
 	RDP_ORDER_MULTIOPAQUERECT = 18,
-	RDP_ORDER_FAST_GLYPH_INDEX = 19,
+	RDP_ORDER_FAST_INDEX = 19,
 	RDP_ORDER_POLYGON_SC = 20,
 	RDP_ORDER_POLYGON_CB = 21,
 	RDP_ORDER_POLYLINE = 22,
@@ -322,6 +322,29 @@ typedef struct _FAST_GLYPH_ORDER
 }
 FAST_GLYPH_ORDER;
 
+typedef struct _FAST_INDEX_ORDER
+{
+	uint8 font;
+	uint8 flags;
+	uint8 opcode;
+	uint32 bgcolor;
+	uint32 fgcolor;
+	sint16 clipleft;
+	sint16 cliptop;
+	sint16 clipright;
+	sint16 clipbottom;
+	sint16 boxleft;
+	sint16 boxtop;
+	sint16 boxright;
+	sint16 boxbottom;
+	RD_BRUSH brush;
+	sint16 x;
+	sint16 y;
+	uint8 length;
+	uint8 text[MAX_TEXT];
+}
+FAST_INDEX_ORDER;
+
 typedef struct _RDP_ORDER_STATE
 {
 	uint8 order_type;
@@ -342,6 +365,7 @@ typedef struct _RDP_ORDER_STATE
 	ELLIPSE_CB_ORDER ellipse_cb;
 	GLYPH_INDEX_ORDER glyph_index;
 	FAST_GLYPH_ORDER fast_glyph;
+	FAST_INDEX_ORDER fast_index;
 }
 RDP_ORDER_STATE;
 
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Freerdp-devel mailing list
Freerdp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel

Reply via email to