libfreerdp-cache: started offscreen bitmap cache
This commit is contained in:
parent
0c981407e5
commit
1dcc1c2be2
@ -89,6 +89,7 @@ add_subdirectory(include)
|
|||||||
add_subdirectory(libfreerdp-utils)
|
add_subdirectory(libfreerdp-utils)
|
||||||
add_subdirectory(libfreerdp-kbd)
|
add_subdirectory(libfreerdp-kbd)
|
||||||
add_subdirectory(libfreerdp-gdi)
|
add_subdirectory(libfreerdp-gdi)
|
||||||
|
add_subdirectory(libfreerdp-cache)
|
||||||
add_subdirectory(libfreerdp-chanman)
|
add_subdirectory(libfreerdp-chanman)
|
||||||
add_subdirectory(libfreerdp-core)
|
add_subdirectory(libfreerdp-core)
|
||||||
add_subdirectory(channels)
|
add_subdirectory(channels)
|
||||||
|
@ -94,10 +94,36 @@ boolean df_check_fds(freerdp* instance, fd_set* set)
|
|||||||
boolean df_pre_connect(freerdp* instance)
|
boolean df_pre_connect(freerdp* instance)
|
||||||
{
|
{
|
||||||
dfInfo* dfi;
|
dfInfo* dfi;
|
||||||
|
rdpSettings* settings;
|
||||||
|
|
||||||
dfi = (dfInfo*) xzalloc(sizeof(dfInfo));
|
dfi = (dfInfo*) xzalloc(sizeof(dfInfo));
|
||||||
SET_DFI(instance, dfi);
|
SET_DFI(instance, dfi);
|
||||||
|
|
||||||
|
settings = instance->settings;
|
||||||
|
|
||||||
|
settings->order_support[NEG_DSTBLT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_PATBLT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_SCRBLT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_OPAQUE_RECT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_DRAWNINEGRID_INDEX] = False;
|
||||||
|
settings->order_support[NEG_MULTIDSTBLT_INDEX] = False;
|
||||||
|
settings->order_support[NEG_MULTIPATBLT_INDEX] = False;
|
||||||
|
settings->order_support[NEG_MULTISCRBLT_INDEX] = False;
|
||||||
|
settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = False;
|
||||||
|
settings->order_support[NEG_LINETO_INDEX] = True;
|
||||||
|
settings->order_support[NEG_POLYLINE_INDEX] = True;
|
||||||
|
settings->order_support[NEG_MEMBLT_INDEX] = False;
|
||||||
|
settings->order_support[NEG_MEM3BLT_INDEX] = False;
|
||||||
|
settings->order_support[NEG_SAVEBITMAP_INDEX] = False;
|
||||||
|
settings->order_support[NEG_GLYPH_INDEX_INDEX] = True;
|
||||||
|
settings->order_support[NEG_FAST_INDEX_INDEX] = True;
|
||||||
|
settings->order_support[NEG_FAST_GLYPH_INDEX] = True;
|
||||||
|
settings->order_support[NEG_POLYGON_SC_INDEX] = False;
|
||||||
|
settings->order_support[NEG_POLYGON_CB_INDEX] = False;
|
||||||
|
settings->order_support[NEG_ELLIPSE_SC_INDEX] = False;
|
||||||
|
settings->order_support[NEG_ELLIPSE_CB_INDEX] = False;
|
||||||
|
|
||||||
freerdp_chanman_pre_connect(GET_CHANMAN(instance), instance);
|
freerdp_chanman_pre_connect(GET_CHANMAN(instance), instance);
|
||||||
|
|
||||||
return True;
|
return True;
|
||||||
|
@ -52,6 +52,30 @@
|
|||||||
/* Auto Reconnect Version */
|
/* Auto Reconnect Version */
|
||||||
#define AUTO_RECONNECT_VERSION_1 0x00000001
|
#define AUTO_RECONNECT_VERSION_1 0x00000001
|
||||||
|
|
||||||
|
/* Order Support */
|
||||||
|
#define NEG_DSTBLT_INDEX 0x00
|
||||||
|
#define NEG_PATBLT_INDEX 0x01
|
||||||
|
#define NEG_SCRBLT_INDEX 0x02
|
||||||
|
#define NEG_MEMBLT_INDEX 0x03
|
||||||
|
#define NEG_MEM3BLT_INDEX 0x04
|
||||||
|
#define NEG_DRAWNINEGRID_INDEX 0x07
|
||||||
|
#define NEG_LINETO_INDEX 0x08
|
||||||
|
#define NEG_MULTI_DRAWNINEGRID_INDEX 0x09
|
||||||
|
#define NEG_OPAQUE_RECT_INDEX 0x0A
|
||||||
|
#define NEG_SAVEBITMAP_INDEX 0x0B
|
||||||
|
#define NEG_MULTIDSTBLT_INDEX 0x0F
|
||||||
|
#define NEG_MULTIPATBLT_INDEX 0x10
|
||||||
|
#define NEG_MULTISCRBLT_INDEX 0x11
|
||||||
|
#define NEG_MULTIOPAQUERECT_INDEX 0x12
|
||||||
|
#define NEG_FAST_INDEX_INDEX 0x13
|
||||||
|
#define NEG_POLYGON_SC_INDEX 0x14
|
||||||
|
#define NEG_POLYGON_CB_INDEX 0x15
|
||||||
|
#define NEG_POLYLINE_INDEX 0x16
|
||||||
|
#define NEG_FAST_GLYPH_INDEX 0x18
|
||||||
|
#define NEG_ELLIPSE_SC_INDEX 0x19
|
||||||
|
#define NEG_ELLIPSE_CB_INDEX 0x1A
|
||||||
|
#define NEG_GLYPH_INDEX_INDEX 0x1B
|
||||||
|
|
||||||
/* SYSTEM_TIME */
|
/* SYSTEM_TIME */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
31
libfreerdp-cache/CMakeLists.txt
Normal file
31
libfreerdp-cache/CMakeLists.txt
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# FreeRDP: A Remote Desktop Protocol Client
|
||||||
|
# libfreerdp-cache cmake build script
|
||||||
|
#
|
||||||
|
# Copyright 2011 O.S. Systems Software Ltda.
|
||||||
|
# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
|
||||||
|
# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
set(FREERDP_CACHE_SRCS
|
||||||
|
offscreen.c
|
||||||
|
offscreen.h
|
||||||
|
cache.c
|
||||||
|
cache.h)
|
||||||
|
|
||||||
|
add_library(freerdp-cache SHARED ${FREERDP_CACHE_SRCS})
|
||||||
|
|
||||||
|
set_target_properties(freerdp-cache PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION})
|
||||||
|
|
||||||
|
install(TARGETS freerdp-cache DESTINATION lib)
|
||||||
|
|
46
libfreerdp-cache/cache.c
Normal file
46
libfreerdp-cache/cache.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
* FreeRDP: A Remote Desktop Protocol Client
|
||||||
|
* RDP Caches
|
||||||
|
*
|
||||||
|
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <freerdp/utils/stream.h>
|
||||||
|
#include <freerdp/utils/memory.h>
|
||||||
|
|
||||||
|
#include "cache.h"
|
||||||
|
|
||||||
|
rdpCache* cache_new()
|
||||||
|
{
|
||||||
|
rdpCache* cache;
|
||||||
|
|
||||||
|
cache = (rdpCache*) xzalloc(sizeof(rdpCache));
|
||||||
|
|
||||||
|
if (cache != NULL)
|
||||||
|
{
|
||||||
|
cache->offscreen = offscreen_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cache_free(rdpCache* cache)
|
||||||
|
{
|
||||||
|
if (cache != NULL)
|
||||||
|
{
|
||||||
|
offscreen_free(cache->offscreen);
|
||||||
|
xfree(cache);
|
||||||
|
}
|
||||||
|
}
|
38
libfreerdp-cache/cache.h
Normal file
38
libfreerdp-cache/cache.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* FreeRDP: A Remote Desktop Protocol Client
|
||||||
|
* RDP Caches
|
||||||
|
*
|
||||||
|
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CACHE_H
|
||||||
|
#define __CACHE_H
|
||||||
|
|
||||||
|
#include "offscreen.h"
|
||||||
|
|
||||||
|
#include <freerdp/types.h>
|
||||||
|
#include <freerdp/utils/stream.h>
|
||||||
|
|
||||||
|
typedef struct rdp_cache rdpCache;
|
||||||
|
|
||||||
|
struct rdp_cache
|
||||||
|
{
|
||||||
|
rdpOffscreen* offscreen;
|
||||||
|
};
|
||||||
|
|
||||||
|
rdpCache* cache_new();
|
||||||
|
void cache_free(rdpCache* cache);
|
||||||
|
|
||||||
|
#endif /* __CACHE_H */
|
87
libfreerdp-cache/offscreen.c
Normal file
87
libfreerdp-cache/offscreen.c
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/**
|
||||||
|
* FreeRDP: A Remote Desktop Protocol Client
|
||||||
|
* Offscreen Bitmap Cache
|
||||||
|
*
|
||||||
|
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <freerdp/utils/stream.h>
|
||||||
|
#include <freerdp/utils/memory.h>
|
||||||
|
|
||||||
|
#include "offscreen.h"
|
||||||
|
|
||||||
|
void* offscreen_get(rdpOffscreen* offscreen, uint16 index)
|
||||||
|
{
|
||||||
|
void* bitmap;
|
||||||
|
|
||||||
|
if (index < offscreen->maxEntries)
|
||||||
|
{
|
||||||
|
printf("invalid offscreen bitmap index: 0x%04X\n", index);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bitmap = offscreen->entries[index].bitmap;
|
||||||
|
|
||||||
|
if (bitmap == NULL)
|
||||||
|
{
|
||||||
|
printf("invalid offscreen bitmap at index: 0x%04X\n", index);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void offscreen_put(rdpOffscreen* offscreen, uint16 index, void* bitmap)
|
||||||
|
{
|
||||||
|
if (index < offscreen->maxEntries)
|
||||||
|
{
|
||||||
|
printf("invalid offscreen bitmap index: 0x%04X\n", index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
offscreen->entries[index].bitmap = bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
rdpOffscreen* offscreen_new(rdpSettings* settings)
|
||||||
|
{
|
||||||
|
rdpOffscreen* offscreen;
|
||||||
|
|
||||||
|
offscreen = (rdpOffscreen*) xzalloc(sizeof(rdpOffscreen));
|
||||||
|
|
||||||
|
if (offscreen != NULL)
|
||||||
|
{
|
||||||
|
offscreen->settings = settings;
|
||||||
|
|
||||||
|
offscreen->maxSize = 7680;
|
||||||
|
offscreen->maxEntries = 100;
|
||||||
|
|
||||||
|
settings->offscreen_bitmap_cache = True;
|
||||||
|
settings->offscreen_bitmap_cache_size = offscreen->maxSize;
|
||||||
|
settings->offscreen_bitmap_cache_entries = offscreen->maxEntries;
|
||||||
|
|
||||||
|
offscreen->entries = (OFFSCREEN_ENTRY*) xzalloc(sizeof(OFFSCREEN_ENTRY) * offscreen->maxEntries);
|
||||||
|
}
|
||||||
|
|
||||||
|
return offscreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void offscreen_free(rdpOffscreen* offscreen)
|
||||||
|
{
|
||||||
|
if (offscreen != NULL)
|
||||||
|
{
|
||||||
|
xfree(offscreen->entries);
|
||||||
|
xfree(offscreen);
|
||||||
|
}
|
||||||
|
}
|
47
libfreerdp-cache/offscreen.h
Normal file
47
libfreerdp-cache/offscreen.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* FreeRDP: A Remote Desktop Protocol Client
|
||||||
|
* Offscreen Bitmap Cache
|
||||||
|
*
|
||||||
|
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __OFFSCREEN_CACHE_H
|
||||||
|
#define __OFFSCREEN_CACHE_H
|
||||||
|
|
||||||
|
#include <freerdp/types.h>
|
||||||
|
#include <freerdp/utils/stream.h>
|
||||||
|
|
||||||
|
struct _OFFSCREEN_ENTRY
|
||||||
|
{
|
||||||
|
void* bitmap;
|
||||||
|
};
|
||||||
|
typedef struct _OFFSCREEN_ENTRY OFFSCREEN_ENTRY;
|
||||||
|
|
||||||
|
struct rdp_offscreen
|
||||||
|
{
|
||||||
|
uint16 maxSize;
|
||||||
|
uint16 maxEntries;
|
||||||
|
rdpSettings* settings;
|
||||||
|
OFFSCREEN_ENTRY* entries;
|
||||||
|
};
|
||||||
|
typedef struct rdp_offscreen rdpOffscreen;
|
||||||
|
|
||||||
|
void* offscreen_get(rdpOffscreen* offscreen, uint16 index);
|
||||||
|
void offscreen_put(rdpOffscreen* offscreen, uint16 index, void* bitmap);
|
||||||
|
|
||||||
|
rdpOffscreen* offscreen_new();
|
||||||
|
void offscreen_free(rdpOffscreen* offscreen);
|
||||||
|
|
||||||
|
#endif /* __OFFSCREEN_CACHE_H */
|
@ -1558,7 +1558,7 @@ void rdp_write_confirm_active(STREAM* s, rdpSettings* settings)
|
|||||||
stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
|
stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
|
||||||
|
|
||||||
/* Capability Sets */
|
/* Capability Sets */
|
||||||
numberCapabilities = 15;
|
numberCapabilities = 14;
|
||||||
rdp_write_general_capability_set(s, settings);
|
rdp_write_general_capability_set(s, settings);
|
||||||
rdp_write_bitmap_capability_set(s, settings);
|
rdp_write_bitmap_capability_set(s, settings);
|
||||||
rdp_write_order_capability_set(s, settings);
|
rdp_write_order_capability_set(s, settings);
|
||||||
@ -1567,7 +1567,6 @@ void rdp_write_confirm_active(STREAM* s, rdpSettings* settings)
|
|||||||
rdp_write_input_capability_set(s, settings);
|
rdp_write_input_capability_set(s, settings);
|
||||||
rdp_write_brush_capability_set(s, settings);
|
rdp_write_brush_capability_set(s, settings);
|
||||||
rdp_write_glyph_cache_capability_set(s, settings);
|
rdp_write_glyph_cache_capability_set(s, settings);
|
||||||
rdp_write_offscreen_bitmap_cache_capability_set(s, settings);
|
|
||||||
rdp_write_virtual_channel_capability_set(s, settings);
|
rdp_write_virtual_channel_capability_set(s, settings);
|
||||||
rdp_write_sound_capability_set(s, settings);
|
rdp_write_sound_capability_set(s, settings);
|
||||||
rdp_write_share_capability_set(s, settings);
|
rdp_write_share_capability_set(s, settings);
|
||||||
|
@ -86,29 +86,6 @@
|
|||||||
#define CACHE_BITMAP_V3_SUPPORT 0x0002
|
#define CACHE_BITMAP_V3_SUPPORT 0x0002
|
||||||
#define ALTSEC_FRAME_MARKER_SUPPORT 0x0004
|
#define ALTSEC_FRAME_MARKER_SUPPORT 0x0004
|
||||||
|
|
||||||
/* Order Support */
|
|
||||||
#define NEG_DSTBLT_INDEX 0x00
|
|
||||||
#define NEG_PATBLT_INDEX 0x01
|
|
||||||
#define NEG_SCRBLT_INDEX 0x02
|
|
||||||
#define NEG_MEMBLT_INDEX 0x03
|
|
||||||
#define NEG_MEM3BLT_INDEX 0x04
|
|
||||||
#define NEG_DRAWNINEGRID_INDEX 0x07
|
|
||||||
#define NEG_LINETO_INDEX 0x08
|
|
||||||
#define NEG_MULTI_DRAWNINEGRID_INDEX 0x09
|
|
||||||
#define NEG_SAVEBITMAP_INDEX 0x0B
|
|
||||||
#define NEG_MULTIDSTBLT_INDEX 0x0F
|
|
||||||
#define NEG_MULTIPATBLT_INDEX 0x10
|
|
||||||
#define NEG_MULTISCRBLT_INDEX 0x11
|
|
||||||
#define NEG_MULTIOPAQUERECT_INDEX 0x12
|
|
||||||
#define NEG_FAST_INDEX_INDEX 0x13
|
|
||||||
#define NEG_POLYGON_SC_INDEX 0x14
|
|
||||||
#define NEG_POLYGON_CB_INDEX 0x15
|
|
||||||
#define NEG_POLYLINE_INDEX 0x16
|
|
||||||
#define NEG_FAST_GLYPH_INDEX 0x18
|
|
||||||
#define NEG_ELLIPSE_SC_INDEX 0x19
|
|
||||||
#define NEG_ELLIPSE_CB_INDEX 0x1A
|
|
||||||
#define NEG_INDEX_INDEX 0x1B
|
|
||||||
|
|
||||||
/* Sound Flags */
|
/* Sound Flags */
|
||||||
#define SOUND_BEEPS_FLAG 0x0001
|
#define SOUND_BEEPS_FLAG 0x0001
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ uint8 PRIMARY_DRAWING_ORDER_STRINGS[][20] =
|
|||||||
"LineTo",
|
"LineTo",
|
||||||
"OpaqueRect",
|
"OpaqueRect",
|
||||||
"SaveBitmap",
|
"SaveBitmap",
|
||||||
|
"",
|
||||||
"MemBlt",
|
"MemBlt",
|
||||||
"Mem3Blt",
|
"Mem3Blt",
|
||||||
"MultiDstBlt",
|
"MultiDstBlt",
|
||||||
@ -40,6 +41,7 @@ uint8 PRIMARY_DRAWING_ORDER_STRINGS[][20] =
|
|||||||
"PolygonSC",
|
"PolygonSC",
|
||||||
"PolygonCB",
|
"PolygonCB",
|
||||||
"Polyline",
|
"Polyline",
|
||||||
|
"",
|
||||||
"FastGlyph",
|
"FastGlyph",
|
||||||
"EllipseSC",
|
"EllipseSC",
|
||||||
"EllipseCB",
|
"EllipseCB",
|
||||||
@ -1750,13 +1752,11 @@ void update_recv_secondary_order(rdpUpdate* update, STREAM* s, uint8 flags)
|
|||||||
uint16 extraFlags;
|
uint16 extraFlags;
|
||||||
uint16 orderLength;
|
uint16 orderLength;
|
||||||
|
|
||||||
stream_get_mark(s, next);
|
|
||||||
stream_read_uint16(s, orderLength); /* orderLength (2 bytes) */
|
stream_read_uint16(s, orderLength); /* orderLength (2 bytes) */
|
||||||
stream_read_uint16(s, extraFlags); /* extraFlags (2 bytes) */
|
stream_read_uint16(s, extraFlags); /* extraFlags (2 bytes) */
|
||||||
stream_read_uint8(s, orderType); /* orderType (1 byte) */
|
stream_read_uint8(s, orderType); /* orderType (1 byte) */
|
||||||
|
|
||||||
orderLength += 13; /* adjust length (13 bytes less than actual length) */
|
next = s->p + ((sint16) orderLength) + 7;
|
||||||
next += orderLength;
|
|
||||||
|
|
||||||
if (orderType < SECONDARY_DRAWING_ORDER_COUNT)
|
if (orderType < SECONDARY_DRAWING_ORDER_COUNT)
|
||||||
printf("%s Secondary Drawing Order (0x%02X)\n", SECONDARY_DRAWING_ORDER_STRINGS[orderType], orderType);
|
printf("%s Secondary Drawing Order (0x%02X)\n", SECONDARY_DRAWING_ORDER_STRINGS[orderType], orderType);
|
||||||
@ -1817,7 +1817,7 @@ void update_recv_secondary_order(rdpUpdate* update, STREAM* s, uint8 flags)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream_set_mark(s, next);
|
s->p = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_recv_altsec_order(rdpUpdate* update, STREAM* s, uint8 flags)
|
void update_recv_altsec_order(rdpUpdate* update, STREAM* s, uint8 flags)
|
||||||
@ -1910,19 +1910,11 @@ void update_recv_order(rdpUpdate* update, STREAM* s)
|
|||||||
|
|
||||||
stream_read_uint8(s, controlFlags); /* controlFlags (1 byte) */
|
stream_read_uint8(s, controlFlags); /* controlFlags (1 byte) */
|
||||||
|
|
||||||
switch (controlFlags & ORDER_CLASS_MASK)
|
if (!(controlFlags & ORDER_STANDARD))
|
||||||
{
|
|
||||||
case ORDER_PRIMARY_CLASS:
|
|
||||||
update_recv_primary_order(update, s, controlFlags);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ORDER_SECONDARY_CLASS:
|
|
||||||
update_recv_secondary_order(update, s, controlFlags);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ORDER_ALTSEC_CLASS:
|
|
||||||
update_recv_altsec_order(update, s, controlFlags);
|
update_recv_altsec_order(update, s, controlFlags);
|
||||||
break;
|
else if (controlFlags & ORDER_SECONDARY)
|
||||||
}
|
update_recv_secondary_order(update, s, controlFlags);
|
||||||
|
else
|
||||||
|
update_recv_primary_order(update, s, controlFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,12 +99,6 @@
|
|||||||
|
|
||||||
#define SCREEN_BITMAP_SURFACE 0xFFFF
|
#define SCREEN_BITMAP_SURFACE 0xFFFF
|
||||||
|
|
||||||
/* Order Classes */
|
|
||||||
#define ORDER_PRIMARY_CLASS 0x01
|
|
||||||
#define ORDER_SECONDARY_CLASS 0x03
|
|
||||||
#define ORDER_ALTSEC_CLASS 0x02
|
|
||||||
#define ORDER_CLASS_MASK 0x03
|
|
||||||
|
|
||||||
/* Primary Drawing Orders */
|
/* Primary Drawing Orders */
|
||||||
#define ORDER_TYPE_DSTBLT 0x00
|
#define ORDER_TYPE_DSTBLT 0x00
|
||||||
#define ORDER_TYPE_PATBLT 0x01
|
#define ORDER_TYPE_PATBLT 0x01
|
||||||
|
@ -61,42 +61,45 @@ rdpSettings* settings_new()
|
|||||||
settings->encryption_method = ENCRYPTION_METHOD_NONE;
|
settings->encryption_method = ENCRYPTION_METHOD_NONE;
|
||||||
settings->encryption_level = ENCRYPTION_LEVEL_NONE;
|
settings->encryption_level = ENCRYPTION_LEVEL_NONE;
|
||||||
|
|
||||||
|
/*
|
||||||
settings->order_support[NEG_DSTBLT_INDEX] = True;
|
settings->order_support[NEG_DSTBLT_INDEX] = True;
|
||||||
settings->order_support[NEG_PATBLT_INDEX] = True;
|
settings->order_support[NEG_PATBLT_INDEX] = True;
|
||||||
settings->order_support[NEG_SCRBLT_INDEX] = True;
|
settings->order_support[NEG_SCRBLT_INDEX] = True;
|
||||||
settings->order_support[NEG_MEMBLT_INDEX] = True;
|
settings->order_support[NEG_OPAQUE_RECT_INDEX] = True;
|
||||||
settings->order_support[NEG_MEM3BLT_INDEX] = True;
|
|
||||||
settings->order_support[NEG_DRAWNINEGRID_INDEX] = True;
|
settings->order_support[NEG_DRAWNINEGRID_INDEX] = True;
|
||||||
settings->order_support[NEG_LINETO_INDEX] = True;
|
|
||||||
settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = True;
|
|
||||||
settings->order_support[NEG_SAVEBITMAP_INDEX] = True;
|
|
||||||
settings->order_support[NEG_MULTIDSTBLT_INDEX] = True;
|
settings->order_support[NEG_MULTIDSTBLT_INDEX] = True;
|
||||||
settings->order_support[NEG_MULTIPATBLT_INDEX] = True;
|
settings->order_support[NEG_MULTIPATBLT_INDEX] = True;
|
||||||
settings->order_support[NEG_MULTISCRBLT_INDEX] = True;
|
settings->order_support[NEG_MULTISCRBLT_INDEX] = True;
|
||||||
settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = True;
|
settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = True;
|
||||||
|
settings->order_support[NEG_LINETO_INDEX] = True;
|
||||||
|
settings->order_support[NEG_POLYLINE_INDEX] = True;
|
||||||
|
settings->order_support[NEG_MEMBLT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_MEM3BLT_INDEX] = True;
|
||||||
|
settings->order_support[NEG_SAVEBITMAP_INDEX] = True;
|
||||||
|
settings->order_support[NEG_GLYPH_INDEX_INDEX] = True;
|
||||||
settings->order_support[NEG_FAST_INDEX_INDEX] = True;
|
settings->order_support[NEG_FAST_INDEX_INDEX] = True;
|
||||||
|
settings->order_support[NEG_FAST_GLYPH_INDEX] = True;
|
||||||
settings->order_support[NEG_POLYGON_SC_INDEX] = True;
|
settings->order_support[NEG_POLYGON_SC_INDEX] = True;
|
||||||
settings->order_support[NEG_POLYGON_CB_INDEX] = True;
|
settings->order_support[NEG_POLYGON_CB_INDEX] = True;
|
||||||
settings->order_support[NEG_POLYLINE_INDEX] = True;
|
|
||||||
settings->order_support[NEG_FAST_GLYPH_INDEX] = True;
|
|
||||||
settings->order_support[NEG_ELLIPSE_SC_INDEX] = True;
|
settings->order_support[NEG_ELLIPSE_SC_INDEX] = True;
|
||||||
settings->order_support[NEG_ELLIPSE_CB_INDEX] = True;
|
settings->order_support[NEG_ELLIPSE_CB_INDEX] = True;
|
||||||
settings->order_support[NEG_INDEX_INDEX] = True;
|
*/
|
||||||
|
|
||||||
settings->color_pointer = True;
|
settings->color_pointer = True;
|
||||||
settings->large_pointer = True;
|
settings->large_pointer = True;
|
||||||
|
|
||||||
settings->draw_gdi_plus = True;
|
settings->draw_gdi_plus = False;
|
||||||
|
|
||||||
settings->frame_marker = False;
|
settings->frame_marker = False;
|
||||||
settings->bitmap_cache_v3 = False;
|
settings->bitmap_cache_v3 = False;
|
||||||
|
|
||||||
settings->bitmap_cache = True;
|
settings->bitmap_cache = False;
|
||||||
settings->persistent_bitmap_cache = False;
|
settings->persistent_bitmap_cache = False;
|
||||||
|
|
||||||
settings->offscreen_bitmap_cache = True;
|
settings->offscreen_bitmap_cache = False;
|
||||||
settings->offscreen_bitmap_cache_size = 7680;
|
settings->offscreen_bitmap_cache_size = 0;
|
||||||
settings->offscreen_bitmap_cache_entries = 100;
|
settings->offscreen_bitmap_cache_entries = 0;
|
||||||
|
|
||||||
settings->draw_nine_grid_cache_size = 2560;
|
settings->draw_nine_grid_cache_size = 2560;
|
||||||
settings->draw_nine_grid_cache_entries = 256;
|
settings->draw_nine_grid_cache_entries = 256;
|
||||||
|
@ -36,6 +36,8 @@ void update_recv_orders(rdpUpdate* update, STREAM* s)
|
|||||||
stream_read_uint16(s, numberOrders); /* numberOrders (2 bytes) */
|
stream_read_uint16(s, numberOrders); /* numberOrders (2 bytes) */
|
||||||
stream_seek_uint16(s); /* pad2OctetsB (2 bytes) */
|
stream_seek_uint16(s); /* pad2OctetsB (2 bytes) */
|
||||||
|
|
||||||
|
printf("numberOrders:%d\n", numberOrders);
|
||||||
|
|
||||||
while (numberOrders > 0)
|
while (numberOrders > 0)
|
||||||
{
|
{
|
||||||
update_recv_order(update, s);
|
update_recv_order(update, s);
|
||||||
|
@ -1237,8 +1237,42 @@ void gdi_line_to(rdpUpdate* update, LINE_TO_ORDER* line_to)
|
|||||||
gdi_DeleteObject((HGDIOBJECT) hPen);
|
gdi_DeleteObject((HGDIOBJECT) hPen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gdi_polyline(rdpUpdate* update, POLYLINE_ORDER* polyline)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint32 color;
|
||||||
|
HGDI_PEN hPen;
|
||||||
|
DELTA_POINT* points;
|
||||||
|
GDI *gdi = GET_GDI(update);
|
||||||
|
|
||||||
|
color = gdi_color_convert(polyline->penColor, gdi->srcBpp, 32, gdi->clrconv);
|
||||||
|
hPen = gdi_CreatePen(0, 1, (GDI_COLOR) color);
|
||||||
|
gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen);
|
||||||
|
gdi_SetROP2(gdi->drawing->hdc, polyline->bRop2);
|
||||||
|
|
||||||
|
points = polyline->points;
|
||||||
|
for (i = 0; i < polyline->numPoints; i++)
|
||||||
|
{
|
||||||
|
gdi_MoveToEx(gdi->drawing->hdc, points[i].x, points[i].y, NULL);
|
||||||
|
gdi_LineTo(gdi->drawing->hdc, points[i + 1].x, points[i + 1].y);
|
||||||
|
}
|
||||||
|
|
||||||
|
gdi_DeleteObject((HGDIOBJECT) hPen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gdi_create_offscreen_bitmap(rdpUpdate* update, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap)
|
||||||
|
{
|
||||||
|
printf("create_offscreen_bitmap: id:%d cx:%d cy:%d\n",
|
||||||
|
create_offscreen_bitmap->id, create_offscreen_bitmap->cx, create_offscreen_bitmap->cy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gdi_switch_surface(rdpUpdate* update, SWITCH_SURFACE_ORDER* switch_surface)
|
||||||
|
{
|
||||||
|
printf("switch surface: 0x%04X\n", switch_surface->bitmapId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register GDI callbacks with libfreerdp.
|
* Register GDI callbacks with libfreerdp-core.
|
||||||
* @param inst current instance
|
* @param inst current instance
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -1259,7 +1293,7 @@ void gdi_register_update_callbacks(rdpUpdate* update)
|
|||||||
update->MultiOpaqueRect = gdi_multi_opaque_rect;
|
update->MultiOpaqueRect = gdi_multi_opaque_rect;
|
||||||
update->MultiDrawNineGrid = NULL;
|
update->MultiDrawNineGrid = NULL;
|
||||||
update->LineTo = gdi_line_to;
|
update->LineTo = gdi_line_to;
|
||||||
update->Polyline = NULL;
|
update->Polyline = gdi_polyline;
|
||||||
update->MemBlt = NULL;
|
update->MemBlt = NULL;
|
||||||
update->Mem3Blt = NULL;
|
update->Mem3Blt = NULL;
|
||||||
update->SaveBitmap = NULL;
|
update->SaveBitmap = NULL;
|
||||||
@ -1270,6 +1304,8 @@ void gdi_register_update_callbacks(rdpUpdate* update)
|
|||||||
update->PolygonCB = NULL;
|
update->PolygonCB = NULL;
|
||||||
update->EllipseSC = NULL;
|
update->EllipseSC = NULL;
|
||||||
update->EllipseCB = NULL;
|
update->EllipseCB = NULL;
|
||||||
|
update->CreateOffscreenBitmap = gdi_create_offscreen_bitmap;
|
||||||
|
update->SwitchSurface = gdi_switch_surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user