1 /** 2 * FreeRDP: A Remote Desktop Protocol Implementation 3 * Drawing Orders 4 * 5 * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> 6 * Copyright 2016 Armin Novak <armin.novak@thincast.com> 7 * Copyright 2016 Thincast Technologies GmbH 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 */ 21 22 #ifndef FREERDP_LIB_CORE_ORDERS_H 23 #define FREERDP_LIB_CORE_ORDERS_H 24 25 #include "rdp.h" 26 27 #include <freerdp/types.h> 28 #include <freerdp/update.h> 29 #include <freerdp/api.h> 30 31 #include <winpr/stream.h> 32 33 /* Order Control Flags */ 34 #define ORDER_STANDARD 0x01 35 #define ORDER_SECONDARY 0x02 36 #define ORDER_BOUNDS 0x04 37 #define ORDER_TYPE_CHANGE 0x08 38 #define ORDER_DELTA_COORDINATES 0x10 39 #define ORDER_ZERO_BOUNDS_DELTAS 0x20 40 #define ORDER_ZERO_FIELD_BYTE_BIT0 0x40 41 #define ORDER_ZERO_FIELD_BYTE_BIT1 0x80 42 43 /* Bound Field Flags */ 44 #define BOUND_LEFT 0x01 45 #define BOUND_TOP 0x02 46 #define BOUND_RIGHT 0x04 47 #define BOUND_BOTTOM 0x08 48 #define BOUND_DELTA_LEFT 0x10 49 #define BOUND_DELTA_TOP 0x20 50 #define BOUND_DELTA_RIGHT 0x40 51 #define BOUND_DELTA_BOTTOM 0x80 52 53 /* Field Presence Flags */ 54 #define ORDER_FIELD_01 0x000001 55 #define ORDER_FIELD_02 0x000002 56 #define ORDER_FIELD_03 0x000004 57 #define ORDER_FIELD_04 0x000008 58 #define ORDER_FIELD_05 0x000010 59 #define ORDER_FIELD_06 0x000020 60 #define ORDER_FIELD_07 0x000040 61 #define ORDER_FIELD_08 0x000080 62 #define ORDER_FIELD_09 0x000100 63 #define ORDER_FIELD_10 0x000200 64 #define ORDER_FIELD_11 0x000400 65 #define ORDER_FIELD_12 0x000800 66 #define ORDER_FIELD_13 0x001000 67 #define ORDER_FIELD_14 0x002000 68 #define ORDER_FIELD_15 0x004000 69 #define ORDER_FIELD_16 0x008000 70 #define ORDER_FIELD_17 0x010000 71 #define ORDER_FIELD_18 0x020000 72 #define ORDER_FIELD_19 0x040000 73 #define ORDER_FIELD_20 0x080000 74 #define ORDER_FIELD_21 0x100000 75 #define ORDER_FIELD_22 0x200000 76 #define ORDER_FIELD_23 0x400000 77 78 /* Bitmap Cache Flags */ 79 #define CBR2_8BPP 0x3 80 #define CBR2_16BPP 0x4 81 #define CBR2_24BPP 0x5 82 #define CBR2_32BPP 0x6 83 84 #define CBR23_8BPP 0x3 85 #define CBR23_16BPP 0x4 86 #define CBR23_24BPP 0x5 87 #define CBR23_32BPP 0x6 88 89 #define CBR3_IGNORABLE_FLAG 0x08 90 #define CBR3_DO_NOT_CACHE 0x10 91 92 /* Primary Drawing Orders */ 93 #define ORDER_TYPE_DSTBLT 0x00 94 #define ORDER_TYPE_PATBLT 0x01 95 #define ORDER_TYPE_SCRBLT 0x02 96 #define ORDER_TYPE_DRAW_NINE_GRID 0x07 97 #define ORDER_TYPE_MULTI_DRAW_NINE_GRID 0x08 98 #define ORDER_TYPE_LINE_TO 0x09 99 #define ORDER_TYPE_OPAQUE_RECT 0x0A 100 #define ORDER_TYPE_SAVE_BITMAP 0x0B 101 #define ORDER_TYPE_MEMBLT 0x0D 102 #define ORDER_TYPE_MEM3BLT 0x0E 103 #define ORDER_TYPE_MULTI_DSTBLT 0x0F 104 #define ORDER_TYPE_MULTI_PATBLT 0x10 105 #define ORDER_TYPE_MULTI_SCRBLT 0x11 106 #define ORDER_TYPE_MULTI_OPAQUE_RECT 0x12 107 #define ORDER_TYPE_FAST_INDEX 0x13 108 #define ORDER_TYPE_POLYGON_SC 0x14 109 #define ORDER_TYPE_POLYGON_CB 0x15 110 #define ORDER_TYPE_POLYLINE 0x16 111 #define ORDER_TYPE_FAST_GLYPH 0x18 112 #define ORDER_TYPE_ELLIPSE_SC 0x19 113 #define ORDER_TYPE_ELLIPSE_CB 0x1A 114 #define ORDER_TYPE_GLYPH_INDEX 0x1B 115 116 /* Primary Drawing Orders Fields */ 117 #define DSTBLT_ORDER_FIELDS 5 118 #define PATBLT_ORDER_FIELDS 12 119 #define SCRBLT_ORDER_FIELDS 7 120 #define DRAW_NINE_GRID_ORDER_FIELDS 5 121 #define MULTI_DRAW_NINE_GRID_ORDER_FIELDS 7 122 #define LINE_TO_ORDER_FIELDS 10 123 #define OPAQUE_RECT_ORDER_FIELDS 7 124 #define SAVE_BITMAP_ORDER_FIELDS 6 125 #define MEMBLT_ORDER_FIELDS 9 126 #define MEM3BLT_ORDER_FIELDS 16 127 #define MULTI_DSTBLT_ORDER_FIELDS 7 128 #define MULTI_PATBLT_ORDER_FIELDS 14 129 #define MULTI_SCRBLT_ORDER_FIELDS 9 130 #define MULTI_OPAQUE_RECT_ORDER_FIELDS 9 131 #define FAST_INDEX_ORDER_FIELDS 15 132 #define POLYGON_SC_ORDER_FIELDS 7 133 #define POLYGON_CB_ORDER_FIELDS 13 134 #define POLYLINE_ORDER_FIELDS 7 135 #define FAST_GLYPH_ORDER_FIELDS 15 136 #define ELLIPSE_SC_ORDER_FIELDS 7 137 #define ELLIPSE_CB_ORDER_FIELDS 13 138 #define GLYPH_INDEX_ORDER_FIELDS 22 139 140 /* Primary Drawing Orders Field Bytes */ 141 #define DSTBLT_ORDER_FIELD_BYTES 1 142 #define PATBLT_ORDER_FIELD_BYTES 2 143 #define SCRBLT_ORDER_FIELD_BYTES 1 144 #define DRAW_NINE_GRID_ORDER_FIELD_BYTES 1 145 #define MULTI_DRAW_NINE_GRID_ORDER_FIELD_BYTES 1 146 #define LINE_TO_ORDER_FIELD_BYTES 2 147 #define OPAQUE_RECT_ORDER_FIELD_BYTES 1 148 #define SAVE_BITMAP_ORDER_FIELD_BYTES 1 149 #define MEMBLT_ORDER_FIELD_BYTES 2 150 #define MEM3BLT_ORDER_FIELD_BYTES 3 151 #define MULTI_DSTBLT_ORDER_FIELD_BYTES 1 152 #define MULTI_PATBLT_ORDER_FIELD_BYTES 2 153 #define MULTI_SCRBLT_ORDER_FIELD_BYTES 2 154 #define MULTI_OPAQUE_RECT_ORDER_FIELD_BYTES 2 155 #define FAST_INDEX_ORDER_FIELD_BYTES 2 156 #define POLYGON_SC_ORDER_FIELD_BYTES 1 157 #define POLYGON_CB_ORDER_FIELD_BYTES 2 158 #define POLYLINE_ORDER_FIELD_BYTES 1 159 #define FAST_GLYPH_ORDER_FIELD_BYTES 2 160 #define ELLIPSE_SC_ORDER_FIELD_BYTES 1 161 #define ELLIPSE_CB_ORDER_FIELD_BYTES 2 162 #define GLYPH_INDEX_ORDER_FIELD_BYTES 3 163 164 /* Secondary Drawing Orders */ 165 #define ORDER_TYPE_BITMAP_UNCOMPRESSED 0x00 166 #define ORDER_TYPE_CACHE_COLOR_TABLE 0x01 167 #define ORDER_TYPE_CACHE_BITMAP_COMPRESSED 0x02 168 #define ORDER_TYPE_CACHE_GLYPH 0x03 169 #define ORDER_TYPE_BITMAP_UNCOMPRESSED_V2 0x04 170 #define ORDER_TYPE_BITMAP_COMPRESSED_V2 0x05 171 #define ORDER_TYPE_CACHE_BRUSH 0x07 172 #define ORDER_TYPE_BITMAP_COMPRESSED_V3 0x08 173 174 /* Alternate Secondary Drawing Orders */ 175 #define ORDER_TYPE_SWITCH_SURFACE 0x00 176 #define ORDER_TYPE_CREATE_OFFSCREEN_BITMAP 0x01 177 #define ORDER_TYPE_STREAM_BITMAP_FIRST 0x02 178 #define ORDER_TYPE_STREAM_BITMAP_NEXT 0x03 179 #define ORDER_TYPE_CREATE_NINE_GRID_BITMAP 0x04 180 #define ORDER_TYPE_GDIPLUS_FIRST 0x05 181 #define ORDER_TYPE_GDIPLUS_NEXT 0x06 182 #define ORDER_TYPE_GDIPLUS_END 0x07 183 #define ORDER_TYPE_GDIPLUS_CACHE_FIRST 0x08 184 #define ORDER_TYPE_GDIPLUS_CACHE_NEXT 0x09 185 #define ORDER_TYPE_GDIPLUS_CACHE_END 0x0A 186 #define ORDER_TYPE_WINDOW 0x0B 187 #define ORDER_TYPE_COMPDESK_FIRST 0x0C 188 #define ORDER_TYPE_FRAME_MARKER 0x0D 189 190 #define CG_GLYPH_UNICODE_PRESENT 0x0010 191 192 FREERDP_LOCAL BYTE get_primary_drawing_order_field_bytes(UINT32 orderType, BOOL* pValid); 193 194 FREERDP_LOCAL BOOL update_recv_order(rdpUpdate* update, wStream* s); 195 196 FREERDP_LOCAL BOOL update_write_field_flags(wStream* s, UINT32 fieldFlags, BYTE flags, 197 BYTE fieldBytes); 198 199 FREERDP_LOCAL BOOL update_write_bounds(wStream* s, ORDER_INFO* orderInfo); 200 201 FREERDP_LOCAL int update_approximate_dstblt_order(ORDER_INFO* orderInfo, 202 const DSTBLT_ORDER* dstblt); 203 FREERDP_LOCAL BOOL update_write_dstblt_order(wStream* s, ORDER_INFO* orderInfo, 204 const DSTBLT_ORDER* dstblt); 205 206 FREERDP_LOCAL int update_approximate_patblt_order(ORDER_INFO* orderInfo, PATBLT_ORDER* patblt); 207 FREERDP_LOCAL BOOL update_write_patblt_order(wStream* s, ORDER_INFO* orderInfo, 208 PATBLT_ORDER* patblt); 209 210 FREERDP_LOCAL int update_approximate_scrblt_order(ORDER_INFO* orderInfo, 211 const SCRBLT_ORDER* scrblt); 212 FREERDP_LOCAL BOOL update_write_scrblt_order(wStream* s, ORDER_INFO* orderInfo, 213 const SCRBLT_ORDER* scrblt); 214 215 FREERDP_LOCAL int update_approximate_opaque_rect_order(ORDER_INFO* orderInfo, 216 const OPAQUE_RECT_ORDER* opaque_rect); 217 FREERDP_LOCAL BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, 218 const OPAQUE_RECT_ORDER* opaque_rect); 219 220 FREERDP_LOCAL int update_approximate_line_to_order(ORDER_INFO* orderInfo, 221 const LINE_TO_ORDER* line_to); 222 FREERDP_LOCAL BOOL update_write_line_to_order(wStream* s, ORDER_INFO* orderInfo, 223 const LINE_TO_ORDER* line_to); 224 225 FREERDP_LOCAL int update_approximate_memblt_order(ORDER_INFO* orderInfo, 226 const MEMBLT_ORDER* memblt); 227 FREERDP_LOCAL BOOL update_write_memblt_order(wStream* s, ORDER_INFO* orderInfo, 228 const MEMBLT_ORDER* memblt); 229 230 FREERDP_LOCAL int update_approximate_glyph_index_order(ORDER_INFO* orderInfo, 231 const GLYPH_INDEX_ORDER* glyph_index); 232 FREERDP_LOCAL BOOL update_write_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, 233 GLYPH_INDEX_ORDER* glyph_index); 234 235 FREERDP_LOCAL int update_approximate_cache_bitmap_order(const CACHE_BITMAP_ORDER* cache_bitmap, 236 BOOL compressed, UINT16* flags); 237 FREERDP_LOCAL BOOL update_write_cache_bitmap_order(wStream* s, 238 const CACHE_BITMAP_ORDER* cache_bitmap_order, 239 BOOL compressed, UINT16* flags); 240 241 FREERDP_LOCAL int update_approximate_cache_bitmap_v2_order(CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, 242 BOOL compressed, UINT16* flags); 243 FREERDP_LOCAL BOOL update_write_cache_bitmap_v2_order(wStream* s, 244 CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order, 245 BOOL compressed, UINT16* flags); 246 247 FREERDP_LOCAL int update_approximate_cache_bitmap_v3_order(CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, 248 UINT16* flags); 249 FREERDP_LOCAL BOOL update_write_cache_bitmap_v3_order(wStream* s, 250 CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order, 251 UINT16* flags); 252 253 FREERDP_LOCAL int 254 update_approximate_cache_color_table_order(const CACHE_COLOR_TABLE_ORDER* cache_color_table, 255 UINT16* flags); 256 FREERDP_LOCAL BOOL update_write_cache_color_table_order( 257 wStream* s, const CACHE_COLOR_TABLE_ORDER* cache_color_table_order, UINT16* flags); 258 259 FREERDP_LOCAL int update_approximate_cache_glyph_order(const CACHE_GLYPH_ORDER* cache_glyph, 260 UINT16* flags); 261 FREERDP_LOCAL BOOL update_write_cache_glyph_order(wStream* s, 262 const CACHE_GLYPH_ORDER* cache_glyph_order, 263 UINT16* flags); 264 265 FREERDP_LOCAL int 266 update_approximate_cache_glyph_v2_order(const CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags); 267 FREERDP_LOCAL BOOL update_write_cache_glyph_v2_order(wStream* s, 268 const CACHE_GLYPH_V2_ORDER* cache_glyph_v2, 269 UINT16* flags); 270 271 FREERDP_LOCAL int update_approximate_cache_brush_order(const CACHE_BRUSH_ORDER* cache_brush, 272 UINT16* flags); 273 FREERDP_LOCAL BOOL update_write_cache_brush_order(wStream* s, 274 const CACHE_BRUSH_ORDER* cache_brush_order, 275 UINT16* flags); 276 277 FREERDP_LOCAL int update_approximate_create_offscreen_bitmap_order( 278 const CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); 279 FREERDP_LOCAL BOOL update_write_create_offscreen_bitmap_order( 280 wStream* s, const CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); 281 282 FREERDP_LOCAL int 283 update_approximate_switch_surface_order(const SWITCH_SURFACE_ORDER* switch_surface); 284 FREERDP_LOCAL BOOL update_write_switch_surface_order(wStream* s, 285 const SWITCH_SURFACE_ORDER* switch_surface); 286 287 #endif /* FREERDP_LIB_CORE_ORDERS_H */ 288