2 * FreeRDP: A Remote Desktop Protocol Client
5 * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 #include <freerdp/utils/stream.h>
21 #include <freerdp/utils/memory.h>
23 #include <freerdp/cache/pointer.h>
25 void update_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position)
30 void update_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system)
35 void update_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color)
40 void update_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new)
43 rdpCache* cache = context->cache;
45 pointer = Pointer_Alloc(context);
49 pointer->xorBpp = pointer_new->xorBpp;
50 pointer->xPos = pointer_new->colorPtrAttr.xPos;
51 pointer->yPos = pointer_new->colorPtrAttr.yPos;
52 pointer->width = pointer_new->colorPtrAttr.width;
53 pointer->height = pointer_new->colorPtrAttr.height;
54 pointer->lengthAndMask = pointer_new->colorPtrAttr.lengthAndMask;
55 pointer->lengthXorMask = pointer_new->colorPtrAttr.lengthXorMask;
56 pointer->xorMaskData = pointer_new->colorPtrAttr.xorMaskData;
57 pointer->andMaskData = pointer_new->colorPtrAttr.andMaskData;
59 pointer->New(context, pointer);
60 pointer_cache_put(cache->pointer, pointer_new->colorPtrAttr.cacheIndex, pointer);
61 Pointer_Set(context, pointer);
65 void update_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached)
68 rdpCache* cache = context->cache;
70 pointer = pointer_cache_get(cache->pointer, pointer_cached->cacheIndex);
73 Pointer_Set(context, pointer);
76 rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache, uint32 index)
80 if (index >= pointer_cache->cacheSize)
82 printf("invalid pointer index:%d\n", index);
86 pointer = pointer_cache->entries[index];
91 void pointer_cache_put(rdpPointerCache* pointer_cache, uint32 index, rdpPointer* pointer)
93 rdpPointer* prevPointer;
95 if (index >= pointer_cache->cacheSize)
97 printf("invalid pointer index:%d\n", index);
101 prevPointer = pointer_cache->entries[index];
103 if (prevPointer != NULL)
104 Pointer_Free(pointer_cache->update->context, prevPointer);
106 pointer_cache->entries[index] = pointer;
109 void pointer_cache_register_callbacks(rdpUpdate* update)
111 rdpPointerUpdate* pointer = update->pointer;
113 pointer->PointerPosition = update_pointer_position;
114 pointer->PointerSystem = update_pointer_system;
115 pointer->PointerColor = update_pointer_color;
116 pointer->PointerNew = update_pointer_new;
117 pointer->PointerCached = update_pointer_cached;
120 rdpPointerCache* pointer_cache_new(rdpSettings* settings)
122 rdpPointerCache* pointer_cache;
124 pointer_cache = (rdpPointerCache*) xzalloc(sizeof(rdpPointerCache));
126 if (pointer_cache != NULL)
128 pointer_cache->settings = settings;
129 pointer_cache->cacheSize = settings->pointer_cache_size;
130 pointer_cache->update = ((freerdp*) settings->instance)->update;
131 pointer_cache->entries = (rdpPointer**) xzalloc(sizeof(rdpPointer*) * pointer_cache->cacheSize);
134 return pointer_cache;
137 void pointer_cache_free(rdpPointerCache* pointer_cache)
139 if (pointer_cache != NULL)
144 for (i = 0; i < (int) pointer_cache->cacheSize; i++)
146 pointer = pointer_cache->entries[i];
149 Pointer_Free(pointer_cache->update->context, pointer);
152 xfree(pointer_cache->entries);
153 xfree(pointer_cache);