2 * FreeRDP: A Remote Desktop Protocol Client
3 * DirectFB Graphical Objects
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/memory.h>
22 #include "df_graphics.h"
26 void df_Pointer_New(rdpContext* context, rdpPointer* pointer)
30 dfPointer* df_pointer;
31 DFBSurfaceDescription dsc;
33 dfi = ((dfContext*) context)->dfi;
34 df_pointer = (dfPointer*) pointer;
36 dsc.flags = DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
37 dsc.caps = DSCAPS_SYSTEMONLY;
38 dsc.width = pointer->width;
39 dsc.height = pointer->height;
40 dsc.pixelformat = DSPF_ARGB;
42 result = dfi->dfb->CreateSurface(dfi->dfb, &dsc, &(df_pointer->surface));
49 df_pointer->xhot = pointer->xPos;
50 df_pointer->yhot = pointer->yPos;
52 result = df_pointer->surface->Lock(df_pointer->surface,
53 DSLF_WRITE, (void**) &point, &pitch);
57 DirectFBErrorFatal("Error while creating pointer surface", result);
61 if ((pointer->andMaskData != 0) && (pointer->xorMaskData != 0))
63 freerdp_alpha_cursor_convert(point, pointer->xorMaskData, pointer->andMaskData,
64 pointer->width, pointer->height, pointer->xorBpp, dfi->clrconv);
67 if (pointer->xorBpp > 24)
69 freerdp_image_swap_color_order(point, pointer->width, pointer->height);
72 df_pointer->surface->Unlock(df_pointer->surface);
76 void df_Pointer_Free(rdpContext* context, rdpPointer* pointer)
78 dfPointer* df_pointer = (dfPointer*) pointer;
79 df_pointer->surface->Release(df_pointer->surface);
82 void df_Pointer_Set(rdpContext* context, rdpPointer* pointer)
86 dfPointer* df_pointer;
88 dfi = ((dfContext*) context)->dfi;
89 df_pointer = (dfPointer*) pointer;
91 dfi->layer->SetCooperativeLevel(dfi->layer, DLSCL_ADMINISTRATIVE);
93 result = dfi->layer->SetCursorShape(dfi->layer,
94 df_pointer->surface, df_pointer->xhot, df_pointer->yhot);
98 DirectFBErrorFatal("SetCursorShape Error", result);
102 dfi->layer->SetCooperativeLevel(dfi->layer, DLSCL_SHARED);
105 /* Graphics Module */
107 void df_register_graphics(rdpGraphics* graphics)
111 pointer = xnew(rdpPointer);
112 pointer->size = sizeof(dfPointer);
114 pointer->New = df_Pointer_New;
115 pointer->Free = df_Pointer_Free;
116 pointer->Set = df_Pointer_Set;
118 graphics_register_pointer(graphics, pointer);