API refactoring.

This commit is contained in:
Armin Novak 2016-07-19 16:15:38 +02:00
parent f680b62d03
commit 85bbe2a908
18 changed files with 702 additions and 640 deletions

View File

@ -122,6 +122,7 @@ static void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h)
double yScalingFactor;
int x2;
int y2;
rdpSettings* settings = xfc->context.settings;
if (xfc->scaledWidth <= 0 || xfc->scaledHeight <= 0)
{
@ -129,14 +130,14 @@ static void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h)
return;
}
if (xfc->sessionWidth <= 0 || xfc->sessionHeight <= 0)
if (settings->DesktopWidth <= 0 || settings->DesktopHeight <= 0)
{
WLog_ERR(TAG, "the window dimensions are invalid");
return;
}
xScalingFactor = xfc->sessionWidth / (double)xfc->scaledWidth;
yScalingFactor = xfc->sessionHeight / (double)xfc->scaledHeight;
xScalingFactor = settings->DesktopWidth / (double)xfc->scaledWidth;
yScalingFactor = settings->DesktopHeight / (double)xfc->scaledHeight;
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
XSetForeground(xfc->display, xfc->gc, 0);
/* Black out possible space between desktop and window borders */
@ -191,9 +192,11 @@ static void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h)
BOOL xf_picture_transform_required(xfContext* xfc)
{
rdpSettings* settings = xfc->context.settings;
if (xfc->offset_x || xfc->offset_y ||
xfc->scaledWidth != xfc->sessionWidth ||
xfc->scaledHeight != xfc->sessionHeight)
xfc->scaledWidth != settings->DesktopWidth ||
xfc->scaledHeight != settings->DesktopHeight)
{
return TRUE;
}
@ -236,7 +239,8 @@ static BOOL xf_desktop_resize(rdpContext* context)
if (!(xfc->primary = XCreatePixmap(
xfc->display, xfc->drawable,
xfc->sessionWidth, xfc->sessionHeight, xfc->depth)))
settings->DesktopWidth,
settings->DesktopHeight, xfc->depth)))
return FALSE;
if (same)
@ -247,8 +251,8 @@ static BOOL xf_desktop_resize(rdpContext* context)
if (!xfc->settings->SmartSizing)
{
xfc->scaledWidth = xfc->sessionWidth;
xfc->scaledHeight = xfc->sessionHeight;
xfc->scaledWidth = settings->DesktopWidth;
xfc->scaledHeight = settings->DesktopHeight;
}
#endif
@ -267,8 +271,8 @@ static BOOL xf_desktop_resize(rdpContext* context)
{
/* Update the saved width and height values the window will be
* resized to when toggling out of fullscreen */
xfc->savedWidth = xfc->sessionWidth;
xfc->savedHeight = xfc->sessionHeight;
xfc->savedWidth = settings->DesktopWidth;
xfc->savedHeight = settings->DesktopHeight;
}
XSetFunction(xfc->display, xfc->gc, GXcopy);
@ -357,12 +361,11 @@ static BOOL xf_sw_desktop_resize(rdpContext* context)
{
rdpGdi* gdi = context->gdi;
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = context->settings;
BOOL ret = FALSE;
xf_lock_x11(xfc, TRUE);
xfc->sessionWidth = context->settings->DesktopWidth;
xfc->sessionHeight = context->settings->DesktopHeight;
if (!gdi_resize(gdi, xfc->sessionWidth, xfc->sessionHeight))
if (!gdi_resize(gdi, settings->DesktopWidth, settings->DesktopHeight))
goto out;
if (xfc->image)
@ -459,11 +462,8 @@ static BOOL xf_hw_end_paint(rdpContext* context)
static BOOL xf_hw_desktop_resize(rdpContext* context)
{
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = xfc->settings;
BOOL ret;
xf_lock_x11(xfc, TRUE);
xfc->sessionWidth = settings->DesktopWidth;
xfc->sessionHeight = settings->DesktopHeight;
ret = xf_desktop_resize(context);
xf_unlock_x11(xfc, TRUE);
return ret;
@ -506,8 +506,8 @@ BOOL xf_create_window(xfContext* xfc)
char* windowTitle;
rdpSettings* settings = xfc->settings;
ZeroMemory(&xevent, sizeof(xevent));
width = xfc->sessionWidth;
height = xfc->sessionHeight;
width = settings->DesktopWidth;
height = settings->DesktopHeight;
if (!xfc->hdc)
if (!(xfc->hdc = gdi_CreateDC(xfc->format)))
@ -589,8 +589,9 @@ BOOL xf_create_window(xfContext* xfc)
xfc->gc = XCreateGC(xfc->display, xfc->drawable, GCGraphicsExposures, &gcv);
if (!xfc->primary)
xfc->primary = XCreatePixmap(xfc->display, xfc->drawable, xfc->sessionWidth,
xfc->sessionHeight, xfc->depth);
xfc->primary = XCreatePixmap(xfc->display, xfc->drawable,
settings->DesktopWidth,
settings->DesktopHeight, xfc->depth);
xfc->drawing = xfc->primary;
@ -604,8 +605,9 @@ BOOL xf_create_window(xfContext* xfc)
XSetFunction(xfc->display, xfc->gc, GXcopy);
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
XSetForeground(xfc->display, xfc->gc, BlackPixelOfScreen(xfc->screen));
XFillRectangle(xfc->display, xfc->primary, xfc->gc, 0, 0, xfc->sessionWidth,
xfc->sessionHeight);
XFillRectangle(xfc->display, xfc->primary, xfc->gc, 0, 0,
settings->DesktopWidth,
settings->DesktopHeight);
XFlush(xfc->display);
if (!xfc->image)
@ -614,7 +616,7 @@ BOOL xf_create_window(xfContext* xfc)
xfc->image = XCreateImage(xfc->display, xfc->visual,
xfc->depth,
ZPixmap, 0, (char*) gdi->primary_buffer,
xfc->sessionWidth, xfc->sessionHeight,
settings->DesktopWidth, settings->DesktopHeight,
xfc->scanline_pad, 0);
}
@ -1222,12 +1224,9 @@ static BOOL xf_post_connect(freerdp* instance)
xf_gdi_register_update_callbacks(update);
}
xfc->srcBpp = settings->ColorDepth;
xfc->sessionWidth = settings->DesktopWidth;
xfc->sessionHeight = settings->DesktopHeight;
#ifdef WITH_XRENDER
xfc->scaledWidth = xfc->sessionWidth;
xfc->scaledHeight = xfc->sessionHeight;
xfc->scaledWidth = settings->DesktopWidth;
xfc->scaledHeight = settings->DesktopHeight;
xfc->offset_x = 0;
xfc->offset_y = 0;
#endif
@ -1649,6 +1648,7 @@ static void xf_ZoomingChangeEventHandler(rdpContext* context,
ZoomingChangeEventArgs* e)
{
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = context->settings;
int w = xfc->scaledWidth + e->dx;
int h = xfc->scaledHeight + e->dy;
@ -1666,20 +1666,21 @@ static void xf_ZoomingChangeEventHandler(rdpContext* context,
xfc->scaledWidth = w;
xfc->scaledHeight = h;
xf_draw_screen(xfc, 0, 0, xfc->sessionWidth, xfc->sessionHeight);
xf_draw_screen(xfc, 0, 0, settings->DesktopWidth, settings->DesktopHeight);
}
static void xf_PanningChangeEventHandler(rdpContext* context,
PanningChangeEventArgs* e)
{
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = context->settings;
if (e->dx == 0 && e->dy == 0)
return;
xfc->offset_x += e->dx;
xfc->offset_y += e->dy;
xf_draw_screen(xfc, 0, 0, xfc->sessionWidth, xfc->sessionHeight);
xf_draw_screen(xfc, 0, 0, settings->DesktopWidth, settings->DesktopHeight);
}
#endif

View File

@ -91,14 +91,13 @@ BOOL xf_event_action_script_init(xfContext* xfc)
FILE* actionScript;
char buffer[1024] = { 0 };
char command[1024] = { 0 };
xfc->xevents = ArrayList_New(TRUE);
if (!xfc->xevents)
return FALSE;
ArrayList_Object(xfc->xevents)->fnObjectFree = free;
sprintf_s(command, sizeof(command), "%s xevent", xfc->actionScript);
actionScript = popen(command, "r");
if (!actionScript)
@ -108,6 +107,7 @@ BOOL xf_event_action_script_init(xfContext* xfc)
{
strtok(buffer, "\n");
xevent = _strdup(buffer);
if (!xevent || ArrayList_Add(xfc->xevents, xevent) < 0)
{
ArrayList_Free(xfc->xevents);
@ -117,7 +117,6 @@ BOOL xf_event_action_script_init(xfContext* xfc)
}
pclose(actionScript);
return TRUE;
}
@ -148,7 +147,6 @@ static BOOL xf_event_execute_action_script(xfContext* xfc, XEvent* event)
return FALSE;
xeventName = X11_EVENT_STRINGS[event->type];
count = ArrayList_Count(xfc->xevents);
for (index = 0; index < count; index++)
@ -166,8 +164,7 @@ static BOOL xf_event_execute_action_script(xfContext* xfc, XEvent* event)
return FALSE;
sprintf_s(command, sizeof(command), "%s xevent %s %d",
xfc->actionScript, xeventName, (int) xfc->window->handle);
xfc->actionScript, xeventName, (int) xfc->window->handle);
actionScript = popen(command, "r");
if (!actionScript)
@ -179,24 +176,33 @@ static BOOL xf_event_execute_action_script(xfContext* xfc, XEvent* event)
}
pclose(actionScript);
return TRUE;
}
void xf_event_adjust_coordinates(xfContext* xfc, int* x, int *y)
void xf_event_adjust_coordinates(xfContext* xfc, int* x, int* y)
{
rdpSettings* settings;
if (!xfc || !xfc->context.settings || !y || !x)
return;
settings = xfc->context.settings;
if (!xfc->remote_app)
{
#ifdef WITH_XRENDER
if (xf_picture_transform_required(xfc))
{
double xScalingFactor = xfc->sessionWidth / (double)xfc->scaledWidth;
double yScalingFactor = xfc->sessionHeight / (double)xfc->scaledHeight;
double xScalingFactor = settings->DesktopWidth / (double)xfc->scaledWidth;
double yScalingFactor = settings->DesktopHeight / (double)xfc->scaledHeight;
*x = (int)((*x - xfc->offset_x) * xScalingFactor);
*y = (int)((*y - xfc->offset_y) * yScalingFactor);
}
#endif
}
CLAMP_COORDINATES(*x, *y);
}
@ -204,13 +210,14 @@ static BOOL xf_event_Expose(xfContext* xfc, XEvent* event, BOOL app)
{
int x, y;
int w, h;
rdpSettings* settings = xfc->context.settings;
if (!app && (xfc->settings->SmartSizing || xfc->settings->MultiTouchGestures))
if (!app && (settings->SmartSizing || settings->MultiTouchGestures))
{
x = 0;
y = 0;
w = xfc->sessionWidth;
h = xfc->sessionHeight;
w = settings->DesktopWidth;
h = settings->DesktopHeight;
}
else
{
@ -233,7 +240,6 @@ static BOOL xf_event_Expose(xfContext* xfc, XEvent* event, BOOL app)
else
{
xfAppWindow* appWindow;
appWindow = xf_AppWindowFromX11Window(xfc, event->xany.window);
if (appWindow)
@ -251,11 +257,11 @@ static BOOL xf_event_VisibilityNotify(xfContext* xfc, XEvent* event, BOOL app)
return TRUE;
}
BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state, Window window, BOOL app)
BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state,
Window window, BOOL app)
{
rdpInput* input;
Window childWindow;
input = xfc->instance->input;
if (!xfc->settings->MouseMotion)
@ -272,17 +278,17 @@ BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state, Window win
/* Translate to desktop coordinates */
XTranslateCoordinates(xfc->display, window,
RootWindowOfScreen(xfc->screen),
x, y, &x, &y, &childWindow);
RootWindowOfScreen(xfc->screen),
x, y, &x, &y, &childWindow);
}
xf_event_adjust_coordinates(xfc, &x, &y);
input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
if (xfc->fullscreen && !app)
{
XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot, CurrentTime);
XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot,
CurrentTime);
}
return TRUE;
@ -294,17 +300,17 @@ static BOOL xf_event_MotionNotify(xfContext* xfc, XEvent* event, BOOL app)
return TRUE;
return xf_generic_MotionNotify(xfc, event->xmotion.x, event->xmotion.y,
event->xmotion.state, event->xmotion.window, app);
event->xmotion.state, event->xmotion.window, app);
}
BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window window, BOOL app)
BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button,
Window window, BOOL app)
{
int flags;
BOOL wheel;
BOOL extended;
rdpInput* input;
Window childWindow;
flags = 0;
wheel = FALSE;
extended = FALSE;
@ -315,7 +321,7 @@ BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window win
case Button1:
case Button2:
case Button3:
flags = PTR_FLAGS_DOWN | xfc->button_map[button-BUTTON_BASE];
flags = PTR_FLAGS_DOWN | xfc->button_map[button - BUTTON_BASE];
break;
case 4:
@ -342,14 +348,18 @@ BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window win
case 6: /* wheel left */
wheel = TRUE;
if (xfc->settings->HasHorizontalWheel)
flags = PTR_FLAGS_HWHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x0078;
break;
case 7: /* wheel right */
wheel = TRUE;
if (xfc->settings->HasHorizontalWheel)
flags = PTR_FLAGS_HWHEEL | 0x0078;
break;
default:
@ -375,9 +385,8 @@ BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window win
/* Translate to desktop coordinates */
XTranslateCoordinates(xfc->display, window,
RootWindowOfScreen(xfc->screen),
x, y, &x, &y, &childWindow);
RootWindowOfScreen(xfc->screen),
x, y, &x, &y, &childWindow);
}
xf_event_adjust_coordinates(xfc, &x, &y);
@ -398,17 +407,17 @@ static BOOL xf_event_ButtonPress(xfContext* xfc, XEvent* event, BOOL app)
return TRUE;
return xf_generic_ButtonPress(xfc, event->xbutton.x, event->xbutton.y,
event->xbutton.button, event->xbutton.window, app);
event->xbutton.button, event->xbutton.window, app);
}
BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button, Window window, BOOL app)
BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button,
Window window, BOOL app)
{
int flags;
BOOL wheel;
BOOL extended;
rdpInput* input;
Window childWindow;
flags = 0;
wheel = FALSE;
extended = FALSE;
@ -419,7 +428,7 @@ BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button, Window w
case Button1:
case Button2:
case Button3:
flags = xfc->button_map[button-BUTTON_BASE];
flags = xfc->button_map[button - BUTTON_BASE];
break;
case 6:
@ -451,8 +460,8 @@ BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button, Window w
/* Translate to desktop coordinates */
XTranslateCoordinates(xfc->display, window,
RootWindowOfScreen(xfc->screen),
x, y, &x, &y, &childWindow);
RootWindowOfScreen(xfc->screen),
x, y, &x, &y, &childWindow);
}
xf_event_adjust_coordinates(xfc, &x, &y);
@ -472,18 +481,15 @@ static BOOL xf_event_ButtonRelease(xfContext* xfc, XEvent* event, BOOL app)
return TRUE;
return xf_generic_ButtonRelease(xfc, event->xbutton.x, event->xbutton.y,
event->xbutton.button, event->xbutton.window, app);
event->xbutton.button, event->xbutton.window, app);
}
static BOOL xf_event_KeyPress(xfContext* xfc, XEvent* event, BOOL app)
{
KeySym keysym;
char str[256];
XLookupString((XKeyEvent*) event, str, sizeof(str), &keysym, NULL);
xf_keyboard_key_press(xfc, event->xkey.keycode, keysym);
return TRUE;
}
@ -504,7 +510,6 @@ static BOOL xf_event_KeyRelease(xfContext* xfc, XEvent* event, BOOL app)
}
xf_keyboard_key_release(xfc, event->xkey.keycode);
return TRUE;
}
@ -516,14 +521,13 @@ static BOOL xf_event_FocusIn(xfContext* xfc, XEvent* event, BOOL app)
xfc->focused = TRUE;
if (xfc->mouse_active && !app)
XGrabKeyboard(xfc->display, xfc->window->handle, TRUE, GrabModeAsync, GrabModeAsync, CurrentTime);
XGrabKeyboard(xfc->display, xfc->window->handle, TRUE, GrabModeAsync,
GrabModeAsync, CurrentTime);
if (app)
{
xfAppWindow* appWindow;
xf_rail_send_activate(xfc, event->xany.window, TRUE);
appWindow = xf_AppWindowFromX11Window(xfc, event->xany.window);
/* Update the server with any window changes that occurred while the window was not focused. */
@ -534,7 +538,6 @@ static BOOL xf_event_FocusIn(xfContext* xfc, XEvent* event, BOOL app)
}
xf_keyboard_focus_in(xfc);
return TRUE;
}
@ -578,7 +581,6 @@ static BOOL xf_event_ClientMessage(xfContext* xfc, XEvent* event, BOOL app)
if (app)
{
xfAppWindow* appWindow;
appWindow = xf_AppWindowFromX11Window(xfc, event->xany.window);
if (appWindow)
@ -605,15 +607,16 @@ static BOOL xf_event_EnterNotify(xfContext* xfc, XEvent* event, BOOL app)
xfc->mouse_active = TRUE;
if (xfc->fullscreen)
XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot, CurrentTime);
XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot,
CurrentTime);
if (xfc->focused)
XGrabKeyboard(xfc->display, xfc->window->handle, TRUE, GrabModeAsync, GrabModeAsync, CurrentTime);
XGrabKeyboard(xfc->display, xfc->window->handle, TRUE, GrabModeAsync,
GrabModeAsync, CurrentTime);
}
else
{
xfAppWindow* appWindow;
appWindow = xf_AppWindowFromX11Window(xfc, event->xany.window);
/* keep track of which window has focus so that we can apply pointer updates */
@ -642,6 +645,7 @@ static BOOL xf_event_ConfigureNotify(xfContext* xfc, XEvent* event, BOOL app)
{
Window childWindow;
xfAppWindow* appWindow;
rdpSettings* settings = xfc->context.settings;
if (!app)
{
@ -652,26 +656,29 @@ static BOOL xf_event_ConfigureNotify(xfContext* xfc, XEvent* event, BOOL app)
xfc->window->top = event->xconfigure.y;
if (xfc->window->width != event->xconfigure.width ||
xfc->window->height != event->xconfigure.height)
xfc->window->height != event->xconfigure.height)
{
xfc->window->width = event->xconfigure.width;
xfc->window->height = event->xconfigure.height;
#ifdef WITH_XRENDER
xfc->offset_x = 0;
xfc->offset_y = 0;
if (xfc->settings->SmartSizing || xfc->settings->MultiTouchGestures)
{
xfc->scaledWidth = xfc->window->width;
xfc->scaledHeight = xfc->window->height;
xf_draw_screen(xfc, 0, 0, xfc->sessionWidth, xfc->sessionHeight);
xf_draw_screen(xfc, 0, 0, settings->DesktopWidth, settings->DesktopHeight);
}
else
{
xfc->scaledWidth = xfc->sessionWidth;
xfc->scaledHeight = xfc->sessionHeight;
xfc->scaledWidth = settings->DesktopWidth;
xfc->scaledHeight = settings->DesktopHeight;
}
#endif
}
return TRUE;
}
@ -683,11 +690,9 @@ static BOOL xf_event_ConfigureNotify(xfContext* xfc, XEvent* event, BOOL app)
* ConfigureNotify coordinates are expressed relative to the window parent.
* Translate these to root window coordinates.
*/
XTranslateCoordinates(xfc->display, appWindow->handle,
RootWindowOfScreen(xfc->screen),
0, 0, &appWindow->x, &appWindow->y, &childWindow);
RootWindowOfScreen(xfc->screen),
0, 0, &appWindow->x, &appWindow->y, &childWindow);
appWindow->width = event->xconfigure.width;
appWindow->height = event->xconfigure.height;
@ -704,11 +709,11 @@ static BOOL xf_event_ConfigureNotify(xfContext* xfc, XEvent* event, BOOL app)
}
else
{
if ((!event->xconfigure.send_event || appWindow->local_move.state == LMS_NOT_ACTIVE)
&& !appWindow->rail_ignore_configure && xfc->focused)
if ((!event->xconfigure.send_event
|| appWindow->local_move.state == LMS_NOT_ACTIVE)
&& !appWindow->rail_ignore_configure && xfc->focused)
xf_rail_adjust_position(xfc, appWindow);
}
}
return TRUE;
@ -719,14 +724,14 @@ static BOOL xf_event_MapNotify(xfContext* xfc, XEvent* event, BOOL app)
RECTANGLE_16 rect;
xfAppWindow* appWindow;
rdpUpdate* update = xfc->instance->update;
rdpSettings* settings = xfc->context.settings;
if (!app)
{
rect.left = 0;
rect.top = 0;
rect.right = xfc->sessionWidth;
rect.bottom = xfc->sessionHeight;
rect.right = settings->DesktopWidth;
rect.bottom = settings->DesktopHeight;
update->SuppressOutput((rdpContext*) xfc, 1, &rect);
}
else
@ -736,12 +741,10 @@ static BOOL xf_event_MapNotify(xfContext* xfc, XEvent* event, BOOL app)
if (appWindow)
{
/* local restore event */
/* This is now handled as part of the PropertyNotify
* Doing this here would inhibit the ability to restore a maximized window
* that is minimized back to the maximized state
*/
//xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_RESTORE);
appWindow->is_mapped = TRUE;
}
@ -754,7 +757,6 @@ static BOOL xf_event_UnmapNotify(xfContext* xfc, XEvent* event, BOOL app)
{
xfAppWindow* appWindow;
rdpUpdate* update = xfc->instance->update;
xf_keyboard_release_all_keypress(xfc);
if (!app)
@ -781,43 +783,45 @@ static BOOL xf_event_PropertyNotify(xfContext* xfc, XEvent* event, BOOL app)
* when the window has been minimized, maximized, restored locally
* ie. not using the buttons on the rail window itself
*/
if (app)
{
xfAppWindow* appWindow;
xfAppWindow* appWindow;
appWindow = xf_AppWindowFromX11Window(xfc, event->xany.window);
if (!appWindow)
return TRUE;
if ((((Atom) event->xproperty.atom == xfc->_NET_WM_STATE) && (event->xproperty.state != PropertyDelete)) ||
(((Atom) event->xproperty.atom == xfc->WM_STATE) && (event->xproperty.state != PropertyDelete)))
{
int i;
BOOL status;
BOOL maxVert = FALSE;
BOOL maxHorz = FALSE;
BOOL minimized = FALSE;
unsigned long nitems;
unsigned long bytes;
unsigned char* prop;
if ((((Atom) event->xproperty.atom == xfc->_NET_WM_STATE)
&& (event->xproperty.state != PropertyDelete)) ||
(((Atom) event->xproperty.atom == xfc->WM_STATE)
&& (event->xproperty.state != PropertyDelete)))
{
int i;
BOOL status;
BOOL maxVert = FALSE;
BOOL maxHorz = FALSE;
BOOL minimized = FALSE;
unsigned long nitems;
unsigned long bytes;
unsigned char* prop;
if ((Atom) event->xproperty.atom == xfc->_NET_WM_STATE)
{
if ((Atom) event->xproperty.atom == xfc->_NET_WM_STATE)
{
status = xf_GetWindowProperty(xfc, event->xproperty.window,
xfc->_NET_WM_STATE, 12, &nitems, &bytes, &prop);
xfc->_NET_WM_STATE, 12, &nitems, &bytes, &prop);
if (status)
{
for (i = 0; i < nitems; i++)
{
if ((Atom) ((UINT16**) prop)[i] == XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_VERT", False))
if ((Atom)((UINT16**) prop)[i] == XInternAtom(xfc->display,
"_NET_WM_STATE_MAXIMIZED_VERT", False))
{
maxVert = TRUE;
}
if ((Atom) ((UINT16**) prop)[i] == XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False))
if ((Atom)((UINT16**) prop)[i] == XInternAtom(xfc->display,
"_NET_WM_STATE_MAXIMIZED_HORZ", False))
{
maxHorz = TRUE;
}
@ -825,12 +829,12 @@ static BOOL xf_event_PropertyNotify(xfContext* xfc, XEvent* event, BOOL app)
XFree(prop);
}
}
}
if ((Atom) event->xproperty.atom == xfc->WM_STATE)
{
if ((Atom) event->xproperty.atom == xfc->WM_STATE)
{
status = xf_GetWindowProperty(xfc, event->xproperty.window,
xfc->WM_STATE, 1, &nitems, &bytes, &prop);
xfc->WM_STATE, 1, &nitems, &bytes, &prop);
if (status)
{
@ -842,30 +846,33 @@ static BOOL xf_event_PropertyNotify(xfContext* xfc, XEvent* event, BOOL app)
XFree(prop);
}
}
}
if (maxVert && maxHorz && !minimized && (appWindow->rail_state != WINDOW_SHOW_MAXIMIZED))
{
appWindow->rail_state = WINDOW_SHOW_MAXIMIZED;
xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_MAXIMIZE);
}
else if (minimized && (appWindow->rail_state != WINDOW_SHOW_MINIMIZED))
{
appWindow->rail_state = WINDOW_SHOW_MINIMIZED;
xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_MINIMIZE);
}
else if (!minimized && !maxVert && !maxHorz && (appWindow->rail_state != WINDOW_SHOW))
{
appWindow->rail_state = WINDOW_SHOW;
xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_RESTORE);
}
}
}
if (maxVert && maxHorz && !minimized
&& (appWindow->rail_state != WINDOW_SHOW_MAXIMIZED))
{
appWindow->rail_state = WINDOW_SHOW_MAXIMIZED;
xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_MAXIMIZE);
}
else if (minimized && (appWindow->rail_state != WINDOW_SHOW_MINIMIZED))
{
appWindow->rail_state = WINDOW_SHOW_MINIMIZED;
xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_MINIMIZE);
}
else if (!minimized && !maxVert && !maxHorz
&& (appWindow->rail_state != WINDOW_SHOW))
{
appWindow->rail_state = WINDOW_SHOW;
xf_rail_send_client_system_command(xfc, appWindow->windowId, SC_RESTORE);
}
}
}
return TRUE;
}
static BOOL xf_event_suppress_events(xfContext* xfc, xfAppWindow* appWindow, XEvent* event)
static BOOL xf_event_suppress_events(xfContext* xfc, xfAppWindow* appWindow,
XEvent* event)
{
if (!xfc->remote_app)
return FALSE;
@ -873,51 +880,56 @@ static BOOL xf_event_suppress_events(xfContext* xfc, xfAppWindow* appWindow, XEv
switch (appWindow->local_move.state)
{
case LMS_NOT_ACTIVE:
/* No local move in progress, nothing to do */
/* Prevent Configure from happening during indeterminant state of Horz or Vert Max only */
if ((event->type == ConfigureNotify) && appWindow->rail_ignore_configure)
{
appWindow->rail_ignore_configure = FALSE;
return TRUE;
}
if ((event->type == ConfigureNotify) && appWindow->rail_ignore_configure)
{
appWindow->rail_ignore_configure = FALSE;
return TRUE;
}
break;
case LMS_STARTING:
/* Local move initiated by RDP server, but we have not yet seen any updates from the X server */
switch (event->type)
{
case ConfigureNotify:
/* Starting to see move events from the X server. Local move is now in progress. */
appWindow->local_move.state = LMS_ACTIVE;
/* Allow these events to be processed during move to keep our state up to date. */
break;
case ButtonPress:
case ButtonRelease:
case KeyPress:
case KeyRelease:
case UnmapNotify:
/*
* A button release event means the X window server did not grab the
* mouse before the user released it. In this case we must cancel the
* local move. The event will be processed below as normal, below.
*/
break;
/*
* A button release event means the X window server did not grab the
* mouse before the user released it. In this case we must cancel the
* local move. The event will be processed below as normal, below.
*/
break;
case VisibilityNotify:
case PropertyNotify:
case Expose:
/* Allow these events to pass */
break;
default:
/* Eat any other events */
return TRUE;
}
break;
case LMS_ACTIVE:
/* Local move is in progress */
switch (event->type)
{
@ -928,11 +940,13 @@ static BOOL xf_event_suppress_events(xfContext* xfc, xfAppWindow* appWindow, XEv
case GravityNotify:
/* Keep us up to date on position */
break;
default:
/* Any other event terminates move */
xf_rail_end_local_move(xfc, appWindow);
break;
}
break;
case LMS_TERMINATING:
@ -967,7 +981,8 @@ BOOL xf_event_process(freerdp* instance, XEvent* event)
xf_event_execute_action_script(xfc, event);
if (event->type != MotionNotify)
DEBUG_X11("%s Event(%d): wnd=0x%04X", X11_EVENT_STRINGS[event->type], event->type, (UINT32) event->xany.window);
DEBUG_X11("%s Event(%d): wnd=0x%04X", X11_EVENT_STRINGS[event->type],
event->type, (UINT32) event->xany.window);
switch (event->type)
{
@ -1047,7 +1062,6 @@ BOOL xf_event_process(freerdp* instance, XEvent* event)
case PropertyNotify:
status = xf_event_PropertyNotify(xfc, event, xfc->remote_app);
break;
}
if (!xfc->remote_app)
@ -1056,8 +1070,6 @@ BOOL xf_event_process(freerdp* instance, XEvent* event)
}
xf_input_handle_event(xfc, event);
XSync(xfc->display, FALSE);
return status;
}

View File

@ -268,39 +268,28 @@ static Pixmap xf_mono_bitmap_new(xfContext* xfc, int width, int height,
BOOL xf_gdi_bitmap_update(rdpContext* context,
const BITMAP_UPDATE* bitmapUpdate)
{
int nXDst;
int nYDst;
int nXSrc;
int nYSrc;
int nWidth;
int nHeight;
UINT32 index;
XImage* image;
BYTE* pSrcData;
BYTE* pDstData;
UINT32 SrcSize;
BOOL compressed;
UINT32 SrcFormat;
BITMAP_DATA* bitmap;
rdpCodecs* codecs = context->codecs;
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = context->settings;
BOOL ret = TRUE;
for (index = 0; index < bitmapUpdate->number; index++)
{
UINT32 bitsPerPixel;
bitmap = &(bitmapUpdate->rectangles[index]);
nXSrc = 0;
nYSrc = 0;
nXDst = bitmap->destLeft;
nYDst = bitmap->destTop;
nWidth = bitmap->width;
nHeight = bitmap->height;
pSrcData = bitmap->bitmapDataStream;
SrcSize = bitmap->bitmapLength;
compressed = bitmap->compressed;
bitsPerPixel = bitmap->bitsPerPixel;
SrcFormat = gdi_get_pixel_format(bitsPerPixel, TRUE);
BYTE* pDstData;
XImage* image;
BITMAP_DATA* bitmap = &(bitmapUpdate->rectangles[index]);
UINT32 bitsPerPixel = bitmap->bitsPerPixel;
UINT32 nXDst = bitmap->destLeft;
UINT32 nYDst = bitmap->destTop;
UINT32 nWidth = MIN(bitmap->destRight,
settings->DesktopWidth - 1) - bitmap->destLeft + 1; /* clip width */
UINT32 nHeight = MIN(bitmap->destBottom,
settings->DesktopHeight - 1) - bitmap->destTop + 1; /* clip height */
const BYTE* pSrcData = bitmap->bitmapDataStream;
UINT32 SrcSize = bitmap->bitmapLength;
BOOL compressed = bitmap->compressed;
UINT32 SrcFormat = gdi_get_pixel_format(bitsPerPixel, TRUE);
if (compressed)
{
@ -310,6 +299,7 @@ BOOL xf_gdi_bitmap_update(rdpContext* context,
{
if (!interleaved_decompress(codecs->interleaved,
pSrcData, SrcSize,
bitmap->width, bitmap->height,
bitsPerPixel,
pDstData,
xfc->format, 0,
@ -320,7 +310,8 @@ BOOL xf_gdi_bitmap_update(rdpContext* context,
}
else
{
if (!planar_decompress(codecs->planar, pSrcData, SrcSize, pDstData,
if (!planar_decompress(codecs->planar, pSrcData, SrcSize,
bitmap->width, bitmap->height, pDstData,
xfc->format, 0, 0, 0, nWidth, nHeight, TRUE))
return FALSE;
}

View File

@ -151,7 +151,7 @@ static BOOL xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
if (bpp < 32)
{
if (!interleaved_decompress(context->codecs->interleaved,
pSrcData, SrcSize, bpp,
pSrcData, SrcSize, width, height, bpp,
pDstData, xfc->format,
0, 0, 0, width, height,
&context->gdi->palette))
@ -160,6 +160,7 @@ static BOOL xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
else
{
if (!planar_decompress(context->codecs->planar, pSrcData, SrcSize,
width, height,
pDstData, xfc->format, 0, 0, 0, width, height, TRUE))
return FALSE;
}

View File

@ -100,9 +100,7 @@ struct xf_context
GC gc;
int xfds;
int depth;
int sessionWidth;
int sessionHeight;
int srcBpp;
GC gc_mono;
BOOL invert;
UINT32 format;

View File

@ -44,10 +44,11 @@ extern "C" {
FREERDP_API BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
const BYTE* pSrcData, UINT32 SrcSize,
UINT32 nSrcWidth, UINT32 nSrcHeight,
UINT32 bpp,
BYTE* pDstData, UINT32 DstFormat,
UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
UINT32 nWidth, UINT32 nHeight,
UINT32 nDstWidth, UINT32 nDstHeight,
const gdiPalette* palette);
FREERDP_API BOOL interleaved_compress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
@ -57,8 +58,8 @@ FREERDP_API BOOL interleaved_compress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc,
const gdiPalette* palette, UINT32 bpp);
FREERDP_API BOOL bitmap_interleaved_context_reset(BITMAP_INTERLEAVED_CONTEXT*
interleaved);
FREERDP_API BOOL bitmap_interleaved_context_reset(
BITMAP_INTERLEAVED_CONTEXT* interleaved);
FREERDP_API BITMAP_INTERLEAVED_CONTEXT* bitmap_interleaved_context_new(
BOOL Compressor);

View File

@ -119,9 +119,10 @@ FREERDP_API void freerdp_bitmap_planar_context_free(
FREERDP_API BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
const BYTE* pSrcData, UINT32 SrcSize,
UINT32 nSrcWidth, UINT32 nSrcHeight,
BYTE* pDstData, UINT32 DstFormat,
UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
UINT32 nWidth, UINT32 nHeight, BOOL vFlip);
UINT32 nDstWidth, UINT32 nDstHeight, BOOL vFlip);
#ifdef __cplusplus
}

View File

@ -294,7 +294,6 @@ struct rdp_gdi
gdiBitmap* drawing;
UINT32 bitmap_size;
UINT32 bitmap_stride;
BYTE* bitmap_buffer;
BYTE* primary_buffer;
gdiPalette palette;
gdiBitmap* image;

View File

@ -24,19 +24,21 @@
#include <freerdp/gdi/gdi.h>
#ifdef __cplusplus
extern "C" {
extern "C" {
#endif
FREERDP_API BOOL gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
FREERDP_API BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect, HGDI_BRUSH hbr);
FREERDP_API BOOL gdi_Polygon(HGDI_DC hdc, GDI_POINT *lpPoints, int nCount);
FREERDP_API BOOL gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT *lpPoints, int *lpPolyCounts, int nCount);
FREERDP_API BOOL gdi_Rectangle(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
typedef BOOL (*p_FillRect)(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr);
FREERDP_API BOOL gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect,
int nRightRect, int nBottomRect);
FREERDP_API BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect,
HGDI_BRUSH hbr);
FREERDP_API BOOL gdi_Polygon(HGDI_DC hdc, GDI_POINT* lpPoints, int nCount);
FREERDP_API BOOL gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT* lpPoints,
int* lpPolyCounts, int nCount);
FREERDP_API BOOL gdi_Rectangle(HGDI_DC hdc, UINT32 nXDst, UINT32 nYDst,
UINT32 nWidth, UINT32 nHeight);
#ifdef __cplusplus
}
}
#endif
#endif /* FREERDP_GDI_SHAPE_H */

View File

@ -265,10 +265,11 @@ static INLINE UINT32 ExtractRunLength(UINT32 code, const BYTE* pbOrderHdr,
BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
const BYTE* pSrcData, UINT32 SrcSize,
UINT32 nSrcWidth, UINT32 nSrcHeight,
UINT32 bpp,
BYTE* pDstData, UINT32 DstFormat,
UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
UINT32 nWidth, UINT32 nHeight,
UINT32 nDstWidth, UINT32 nDstHeight,
const gdiPalette* palette)
{
UINT32 scanline;
@ -283,27 +284,27 @@ BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
return FALSE;
if (nDstStep <= 0)
nDstStep = nWidth * dstBytesPerPixel;
nDstStep = nDstWidth * dstBytesPerPixel;
switch (bpp)
{
case 24:
scanline = nWidth * 3;
scanline = nSrcWidth * 3;
SrcFormat = PIXEL_FORMAT_BGR24_VF;
break;
case 16:
scanline = nWidth * 2;
scanline = nSrcWidth * 2;
SrcFormat = PIXEL_FORMAT_RGB16_VF;
break;
case 15:
scanline = nWidth * 2;
scanline = nSrcWidth * 2;
SrcFormat = PIXEL_FORMAT_RGB15_VF;
break;
case 8:
scanline = nWidth;
scanline = nSrcWidth;
SrcFormat = PIXEL_FORMAT_RGB8_VF;
break;
@ -312,7 +313,7 @@ BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
return FALSE;
}
BufferSize = scanline * nHeight;
BufferSize = scanline * nSrcHeight;
if (BufferSize > interleaved->TempSize)
{
@ -329,18 +330,18 @@ BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
{
case 24:
RleDecompress24to24(pSrcData, SrcSize, interleaved->TempBuffer,
scanline, nWidth, nHeight);
scanline, nSrcWidth, nSrcHeight);
break;
case 16:
case 15:
RleDecompress16to16(pSrcData, SrcSize, interleaved->TempBuffer,
scanline, nWidth, nHeight);
scanline, nSrcWidth, nSrcHeight);
break;
case 8:
RleDecompress8to8(pSrcData, SrcSize, interleaved->TempBuffer,
scanline, nWidth, nHeight);
scanline, nSrcWidth, nSrcHeight);
break;
default:
@ -348,7 +349,7 @@ BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved,
}
return freerdp_image_copy(pDstData, DstFormat, nDstStep, nXDst, nYDst,
nWidth, nHeight, interleaved->TempBuffer,
nDstWidth, nDstHeight, interleaved->TempBuffer,
SrcFormat, scanline, 0, 0, palette);
}

View File

@ -43,9 +43,9 @@ static BOOL freerdp_bitmap_planar_delta_encode_planes(
BYTE* outPlanes[4]);
static INT32 planar_skip_plane_rle(const BYTE* pSrcData, UINT32 SrcSize,
int nWidth, int nHeight)
UINT32 nDstWidth, UINT32 nDstHeight)
{
int x, y;
UINT32 x, y;
int cRawBytes;
int nRunLength;
BYTE controlByte;
@ -287,9 +287,10 @@ static BOOL planar_decompress_planes_raw(const BYTE* pSrcData[4],
BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
const BYTE* pSrcData, UINT32 SrcSize,
UINT32 nSrcWidth, UINT32 nSrcHeight,
BYTE* pDstData, UINT32 DstFormat,
UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
UINT32 nWidth, UINT32 nHeight, BOOL vFlip)
UINT32 nDstWidth, UINT32 nDstHeight, BOOL vFlip)
{
BOOL cs;
BOOL rle;
@ -310,19 +311,21 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
UINT32 dstBytesPerPixel;
const BYTE* planes[4];
UINT32 UncompressedSize;
const UINT32 w = MIN(nSrcWidth, nDstWidth);
const UINT32 h = MIN(nSrcHeight, nDstHeight);
const primitives_t* prims = primitives_get();
if ((nWidth < 0) || (nHeight < 0))
if ((nSrcWidth < 0) || (nSrcHeight < 0))
return FALSE;
dstBitsPerPixel = GetBitsPerPixel(DstFormat);
dstBytesPerPixel = GetBytesPerPixel(DstFormat);
if (nDstStep <= 0)
nDstStep = nWidth * GetBytesPerPixel(DstFormat);
nDstStep = nDstWidth * GetBytesPerPixel(DstFormat);
srcp = pSrcData;
UncompressedSize = nWidth * nHeight * GetBytesPerPixel(DstFormat);
UncompressedSize = nSrcWidth * nSrcHeight * GetBytesPerPixel(DstFormat);
if (!pDstData)
{
@ -341,31 +344,31 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
if (!cll && cs)
return FALSE; /* Chroma subsampling requires YCoCg */
subWidth = (nWidth / 2) + (nWidth % 2);
subHeight = (nHeight / 2) + (nHeight % 2);
planeSize = nWidth * nHeight;
subWidth = (nSrcWidth / 2) + (nSrcWidth % 2);
subHeight = (nSrcHeight / 2) + (nSrcHeight % 2);
planeSize = nSrcWidth * nSrcHeight;
subSize = subWidth * subHeight;
if (!cs)
{
rawSizes[0] = planeSize; /* LumaOrRedPlane */
rawWidths[0] = nWidth;
rawHeights[0] = nHeight;
rawWidths[0] = nSrcWidth;
rawHeights[0] = nSrcHeight;
rawSizes[1] = planeSize; /* OrangeChromaOrGreenPlane */
rawWidths[1] = nWidth;
rawHeights[1] = nHeight;
rawWidths[1] = nSrcWidth;
rawHeights[1] = nSrcHeight;
rawSizes[2] = planeSize; /* GreenChromaOrBluePlane */
rawWidths[2] = nWidth;
rawHeights[2] = nHeight;
rawWidths[2] = nSrcWidth;
rawHeights[2] = nSrcHeight;
rawSizes[3] = planeSize; /* AlphaPlane */
rawWidths[3] = nWidth;
rawHeights[3] = nHeight;
rawWidths[3] = nSrcWidth;
rawHeights[3] = nSrcHeight;
}
else /* Chroma Subsampling */
{
rawSizes[0] = planeSize; /* LumaOrRedPlane */
rawWidths[0] = nWidth;
rawHeights[0] = nHeight;
rawWidths[0] = nSrcWidth;
rawHeights[0] = nSrcHeight;
rawSizes[1] = subSize; /* OrangeChromaOrGreenPlane */
rawWidths[1] = subWidth;
rawHeights[1] = subHeight;
@ -373,8 +376,8 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
rawWidths[2] = subWidth;
rawHeights[2] = subHeight;
rawSizes[3] = planeSize; /* AlphaPlane */
rawWidths[3] = nWidth;
rawHeights[3] = nHeight;
rawWidths[3] = nSrcWidth;
rawHeights[3] = nSrcHeight;
}
if (!rle) /* RAW */
@ -461,20 +464,35 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
if (!cll) /* RGB */
{
UINT32 TempFormat;
BYTE* pTempData = pDstData;
UINT32 nTempStep = nDstStep;
if (alpha)
TempFormat = PIXEL_FORMAT_BGRA32;
else
TempFormat = PIXEL_FORMAT_BGRX32;
if ((DstFormat != TempFormat) || (nSrcWidth != nDstWidth)
|| (nSrcHeight != nDstHeight))
{
pTempData = planar->pTempData;
}
if (!rle) /* RAW */
{
if (alpha)
{
if (!planar_decompress_planes_raw(planes, pDstData, DstFormat, nDstStep,
nXDst, nYDst, nWidth, nHeight, alpha, vFlip))
if (!planar_decompress_planes_raw(planes, pTempData, DstFormat, nDstStep,
nXDst, nYDst, nSrcWidth, nSrcHeight, alpha, vFlip))
return FALSE;
srcp += rawSizes[0] + rawSizes[1] + rawSizes[2] + rawSizes[3];
}
else /* NoAlpha */
{
if (!planar_decompress_planes_raw(planes, pDstData, DstFormat, nDstStep,
nXDst, nYDst, nWidth, nHeight, alpha, vFlip))
if (!planar_decompress_planes_raw(planes, pTempData, DstFormat, nDstStep,
nXDst, nYDst, nSrcWidth, nSrcHeight, alpha, vFlip))
return FALSE;
srcp += rawSizes[0] + rawSizes[1] + rawSizes[2];
@ -485,45 +503,31 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
}
else /* RLE */
{
UINT32 TempFormat;
BYTE* pTempData = pDstData;
UINT32 nTempStep = nDstStep;
if (alpha)
TempFormat = PIXEL_FORMAT_BGRA32;
else
TempFormat = PIXEL_FORMAT_BGRX32;
if (DstFormat != TempFormat)
{
pTempData = planar->pTempData;
}
if (alpha)
{
status = planar_decompress_plane_rle(planes[3], rleSizes[3],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 3,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 3,
vFlip); /* AlphaPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[0], rleSizes[0],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 2,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 2,
vFlip); /* RedPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[1], rleSizes[1],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 1,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 1,
vFlip); /* GreenPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[2], rleSizes[2],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 0,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 0,
vFlip); /* BluePlane */
if (status < 0)
@ -534,21 +538,21 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
else /* NoAlpha */
{
status = planar_decompress_plane_rle(planes[0], rleSizes[0],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 2,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 2,
vFlip); /* RedPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[1], rleSizes[1],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 1,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 1,
vFlip); /* GreenPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[2], rleSizes[2],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 0,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 0,
vFlip); /* BluePlane */
if (status < 0)
@ -556,15 +560,14 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
srcp += rleSizes[0] + rleSizes[1] + rleSizes[2];
}
}
if (pTempData != pDstData)
{
if (!freerdp_image_copy(pDstData, DstFormat, nDstStep, nXDst, nYDst, nWidth,
nHeight,
pTempData,
TempFormat, nTempStep, nXDst, nYDst, NULL))
return FALSE;
}
if (pTempData != pDstData)
{
if (!freerdp_image_copy(pDstData, DstFormat, nDstStep, nXDst, nYDst, w,
h, pTempData,
TempFormat, nTempStep, nXDst, nYDst, NULL))
return FALSE;
}
}
else /* YCoCg */
@ -587,7 +590,7 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
if (alpha)
{
if (!planar_decompress_planes_raw(planes, pTempData, TempFormat, nTempStep,
nXDst, nYDst, nWidth, nHeight, alpha, vFlip))
nXDst, nYDst, nSrcWidth, nSrcHeight, alpha, vFlip))
return FALSE;
srcp += rawSizes[0] + rawSizes[1] + rawSizes[2] + rawSizes[3];
@ -595,7 +598,7 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
else /* NoAlpha */
{
if (!planar_decompress_planes_raw(planes, pTempData, TempFormat, nTempStep,
nXDst, nYDst, nWidth, nHeight, alpha, vFlip))
nXDst, nYDst, nSrcWidth, nSrcHeight, alpha, vFlip))
return FALSE;
srcp += rawSizes[0] + rawSizes[1] + rawSizes[2];
@ -609,28 +612,28 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
if (alpha)
{
status = planar_decompress_plane_rle(planes[3], rleSizes[3],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 3,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 3,
vFlip); /* AlphaPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[0], rleSizes[0],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 2,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 2,
vFlip); /* LumaPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[1], rleSizes[1],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 1,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 1,
vFlip); /* OrangeChromaPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[2], rleSizes[2],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 0,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 0,
vFlip); /* GreenChromaPlane */
if (status < 0)
@ -641,21 +644,21 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
else /* NoAlpha */
{
status = planar_decompress_plane_rle(planes[0], rleSizes[0],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 2,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 2,
vFlip); /* LumaPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[1], rleSizes[1],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 1,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 1,
vFlip); /* OrangeChromaPlane */
if (status < 0)
return FALSE;
status = planar_decompress_plane_rle(planes[2], rleSizes[2],
pTempData, nTempStep, nXDst, nYDst, nWidth, nHeight, 0,
pTempData, nTempStep, nXDst, nYDst, nSrcWidth, nSrcHeight, 0,
vFlip); /* GreenChromaPlane */
if (status < 0)
@ -665,8 +668,10 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar,
}
}
prims->YCoCgToRGB_8u_AC4R(pTempData, nTempStep, pDstData, DstFormat, nDstStep,
nWidth, nHeight, cll, alpha);
if (prims->YCoCgToRGB_8u_AC4R(pTempData, nTempStep, pDstData, DstFormat,
nDstStep,
w, h, cll, alpha) != PRIMITIVES_SUCCESS)
return FALSE;
}
return (SrcSize == (srcp - pSrcData)) ? TRUE : FALSE;

View File

@ -3007,7 +3007,8 @@ int TestFreeRDPCodecPlanar(int argc, char* argv[])
pDstData = decompressedBitmap;
if (!planar_decompress(planar, compressedBitmap, dstSize, pDstData,
if (!planar_decompress(planar, compressedBitmap, dstSize,
width, height, pDstData,
PIXEL_FORMAT_XRGB32, width * 4, 0, 0, width, height, FALSE))
{
printf("failed to decompress white bitmap: width: %d height: %d\n", width,
@ -3054,7 +3055,8 @@ int TestFreeRDPCodecPlanar(int argc, char* argv[])
pDstData = decompressedBitmap;
if (!planar_decompress(planar, compressedBitmap, dstSize, pDstData,
if (!planar_decompress(planar, compressedBitmap, dstSize,
width, height, pDstData,
PIXEL_FORMAT_XRGB32, width * 4, 0, 0, width, height, FALSE))
{
printf("failed to decompress black bitmap: width: %d height: %d\n", width,
@ -3096,7 +3098,8 @@ int TestFreeRDPCodecPlanar(int argc, char* argv[])
pDstData = decompressedBitmap;
if (!planar_decompress(planar, compressedBitmap, dstSize, pDstData,
if (!planar_decompress(planar, compressedBitmap, dstSize, width, height,
pDstData,
PIXEL_FORMAT_XRGB32, width * 4, 0, 0, width, height, FALSE))
{
printf("failed to decompress experimental bitmap 01: width: %d height: %d\n",
@ -3142,7 +3145,8 @@ int TestFreeRDPCodecPlanar(int argc, char* argv[])
pDstData = decompressedBitmap;
if (!planar_decompress(planar, compressedBitmap, dstSize, pDstData,
if (!planar_decompress(planar, compressedBitmap, dstSize, width, height,
pDstData,
PIXEL_FORMAT_XRGB32, width * 4, 0, 0, width, height, FALSE))
{
printf("failed to decompress experimental bitmap 02: width: %d height: %d\n",
@ -3189,7 +3193,8 @@ int TestFreeRDPCodecPlanar(int argc, char* argv[])
pDstData = decompressedBitmap;
if (!planar_decompress(planar, compressedBitmap, dstSize, pDstData,
if (!planar_decompress(planar, compressedBitmap, dstSize, width, height,
pDstData,
PIXEL_FORMAT_XRGB32, width * 4, 0, 0, width, height, FALSE))
{
printf("failed to decompress experimental bitmap 03: width: %d height: %d\n",

File diff suppressed because it is too large Load Diff

View File

@ -491,8 +491,10 @@ static BOOL gdi_bitmap_update(rdpContext* context,
UINT32 nYSrc = 0;
UINT32 nXDst = bitmap->destLeft;
UINT32 nYDst = bitmap->destTop;
UINT32 nWidth = bitmap->width;
UINT32 nHeight = bitmap->height;
UINT32 nWidth = MIN(bitmap->destRight,
gdi->width - 1) - bitmap->destLeft + 1; /* clip width */
UINT32 nHeight = MIN(bitmap->destBottom,
gdi->height - 1) - bitmap->destTop + 1; /* clip height */
const BYTE* pSrcData = bitmap->bitmapDataStream;
UINT32 SrcSize = bitmap->bitmapLength;
BOOL compressed = bitmap->compressed;
@ -504,6 +506,7 @@ static BOOL gdi_bitmap_update(rdpContext* context,
{
if (!interleaved_decompress(codecs->interleaved,
pSrcData, SrcSize,
bitmap->width, bitmap->height,
bitsPerPixel,
gdi->primary_buffer,
gdi->primary->hdc->format,
@ -515,7 +518,8 @@ static BOOL gdi_bitmap_update(rdpContext* context,
else
{
if (!planar_decompress(codecs->planar, pSrcData,
SrcSize, gdi->primary_buffer,
SrcSize, bitmap->width, bitmap->height,
gdi->primary_buffer,
gdi->primary->hdc->format,
gdi->stride,
nXDst, nYDst, nWidth, nHeight, TRUE))
@ -526,10 +530,6 @@ static BOOL gdi_bitmap_update(rdpContext* context,
{
UINT32 SrcFormat = gdi_get_pixel_format(bitsPerPixel, TRUE);
UINT32 nSrcStep = nWidth * GetBytesPerPixel(SrcFormat);
nWidth = MIN(bitmap->destRight,
gdi->width - 1) - bitmap->destLeft + 1; /* clip width */
nHeight = MIN(bitmap->destBottom,
gdi->height - 1) - bitmap->destTop + 1; /* clip height */
if (!freerdp_image_copy(gdi->primary_buffer, gdi->primary->hdc->format,
gdi->stride,
@ -1117,7 +1117,7 @@ static BOOL gdi_surface_bits(rdpContext* context,
PIXEL_FORMAT_BGRX32,
cmd->bitmapDataLength,
0, 0,
gdi->bitmap_buffer, gdi->dstFormat,
gdi->primary_buffer, gdi->dstFormat,
cmd->width * GetBytesPerPixel(gdi->dstFormat),
cmd->height, NULL))
{

View File

@ -330,6 +330,7 @@ static UINT gdi_SurfaceCommand_Planar(rdpGdi* gdi, RdpgfxClientContext* context,
DstData = surface->data;
if (!planar_decompress(surface->codecs->planar, cmd->data, cmd->length,
cmd->width, cmd->height,
DstData, surface->format,
surface->scanline, cmd->left, cmd->top,
cmd->width, cmd->height, FALSE))

View File

@ -138,6 +138,8 @@ static BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
UINT32 SrcSize = length;
UINT32 SrcFormat;
UINT32 bytesPerPixel;
UINT32 DstWidth = MIN(width, bitmap->width);
UINT32 DstHeight = MIN(height, bitmap->height);
rdpGdi* gdi = context->gdi;
bytesPerPixel = (bpp + 7) / 8;
size = width * height * GetBytesPerPixel(gdi->dstFormat);
@ -156,15 +158,17 @@ static BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
{
if (!interleaved_decompress(context->codecs->interleaved,
pSrcData, SrcSize,
width, height,
bpp,
bitmap->data, bitmap->format,
0, 0, 0, width, height,
0, 0, 0, DstWidth, DstHeight,
&gdi->palette))
return FALSE;
}
else
{
if (!planar_decompress(context->codecs->planar, pSrcData, SrcSize,
width, height,
bitmap->data, bitmap->format, 0, 0, 0,
width, height, TRUE))
return FALSE;
@ -175,7 +179,7 @@ static BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
SrcFormat = gdi_get_pixel_format(bpp, TRUE);
if (!freerdp_image_copy(bitmap->data, bitmap->format, 0, 0, 0,
width, height, pSrcData, SrcFormat,
DstWidth, DstHeight, pSrcData, SrcFormat,
0, 0, 0, &gdi->palette))
return FALSE;
}

View File

@ -47,101 +47,106 @@
*/
static BOOL gdi_rop_color(UINT32 rop, BYTE* pixelPtr, UINT32 pen, UINT32 format)
{
UINT32 dstPixel;
const UINT32 srcPixel = ReadColor(pixelPtr, format);
UINT32 pixel = ReadColor(pixelPtr, format);
switch (rop)
{
case GDI_R2_BLACK: /* LineTo_BLACK */
dstPixel = GetColor(format, 0, 0, 0, 0xFF);
pixel = GetColor(format, 0, 0, 0, 0xFF);
break;
case GDI_R2_NOTMERGEPEN: /* LineTo_NOTMERGEPEN */
dstPixel = ~(srcPixel | pen);
pixel = ~(pixel | pen);
break;
case GDI_R2_MASKNOTPEN: /* LineTo_MASKNOTPEN */
dstPixel = srcPixel & ~pen;
pixel &= ~pen;
break;
case GDI_R2_NOTCOPYPEN: /* LineTo_NOTCOPYPEN */
dstPixel = ~pen;
pixel = ~pen;
break;
case GDI_R2_MASKPENNOT: /* LineTo_MASKPENNOT */
dstPixel = pen & ~srcPixel;
pixel = pen & ~pixel;
break;
case GDI_R2_NOT: /* LineTo_NOT */
dstPixel = ~srcPixel;
pixel = ~pixel;
break;
case GDI_R2_XORPEN: /* LineTo_XORPEN */
dstPixel = srcPixel ^ pen;
pixel = pixel ^ pen;
break;
case GDI_R2_NOTMASKPEN: /* LineTo_NOTMASKPEN */
dstPixel = ~(srcPixel & pen);
pixel = ~(pixel & pen);
break;
case GDI_R2_MASKPEN: /* LineTo_MASKPEN */
dstPixel = srcPixel & pen;
pixel &= pen;
break;
case GDI_R2_NOTXORPEN: /* LineTo_NOTXORPEN */
dstPixel = ~(srcPixel ^ pen);
pixel = ~(pixel ^ pen);
break;
case GDI_R2_NOP: /* LineTo_NOP */
break;
case GDI_R2_MERGENOTPEN: /* LineTo_MERGENOTPEN */
dstPixel = srcPixel | ~pen;
pixel |= ~pen;
break;
case GDI_R2_COPYPEN: /* LineTo_COPYPEN */
dstPixel = pen;
pixel = pen;
break;
case GDI_R2_MERGEPENNOT: /* LineTo_MERGEPENNOT */
dstPixel = srcPixel | ~pen;
pixel = pixel | ~pen;
break;
case GDI_R2_MERGEPEN: /* LineTo_MERGEPEN */
dstPixel = srcPixel | pen;
pixel = pixel | pen;
break;
case GDI_R2_WHITE: /* LineTo_WHITE */
dstPixel = GetColor(format, 0, 0, 0, 0xFF);
pixel = GetColor(format, 0, 0, 0, 0);
break;
default:
return FALSE;
}
WriteColor(pixelPtr, format, dstPixel);
WriteColor(pixelPtr, format, pixel);
return TRUE;
}
BOOL gdi_LineTo(HGDI_DC hdc, UINT32 nXEnd, UINT32 nYEnd)
{
INT64 e2;
INT64 bx1, by1;
INT64 bx2, by2;
HGDI_BITMAP bmp = (HGDI_BITMAP) hdc->selectedObject;
UINT32 x, y;
UINT32 x1, y1;
UINT32 x2, y2;
INT32 e, e2;
INT32 dx, dy;
INT32 sx, sy;
INT32 bx1, by1;
INT32 bx2, by2;
HGDI_BITMAP bmp;
UINT32 pen;
UINT32 rop2 = gdi_GetROP2(hdc);
UINT32 x1 = hdc->pen->posX;
UINT32 y1 = hdc->pen->posY;
UINT32 x2 = nXEnd;
UINT32 y2 = nYEnd;
INT64 dx = (x1 > x2) ? x1 - x2 : x2 - x1;
INT64 dy = (y1 > y2) ? y1 - y2 : y2 - y1;
INT64 sx = (x1 < x2) ? 1 : -1;
INT64 sy = (y1 < y2) ? 1 : -1;
INT64 e = dx - dy;
UINT32 x = x1;
UINT32 y = y1;
x1 = hdc->pen->posX;
y1 = hdc->pen->posY;
x2 = nXEnd;
y2 = nYEnd;
dx = (x1 > x2) ? x1 - x2 : x2 - x1;
dy = (y1 > y2) ? y1 - y2 : y2 - y1;
sx = (x1 < x2) ? 1 : -1;
sy = (y1 < y2) ? 1 : -1;
e = dx - dy;
x = x1;
y = y1;
bmp = (HGDI_BITMAP) hdc->selectedObject;
if (hdc->clip->null)
{

View File

@ -45,11 +45,9 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2)
INT32 e, e2;
INT32 dx, dy;
INT32 a, b, c;
a = (x1 < x2) ? x2 - x1 : x1 - x2;
b = (y1 < y2) ? y2 - y1 : y1 - y2;
c = b & 1;
dx = 4 * (1 - a) * b * b;
dy = 4 * (c + 1) * a * a;
e = dx + dy + c * a * a;
@ -65,7 +63,6 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2)
y1 += (b + 1) / 2;
y2 = y1 - c;
a *= 8 * a;
c = 8 * b * b;
@ -75,7 +72,6 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2)
gdi_SetPixel(hdc, x1, y1, 0);
gdi_SetPixel(hdc, x1, y2, 0);
gdi_SetPixel(hdc, x2, y2, 0);
e2 = 2 * e;
if (e2 >= dx)
@ -111,7 +107,8 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2)
* @param nBottomRect y2
* @return nonzero if successful, 0 otherwise
*/
BOOL gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect)
BOOL gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect,
int nBottomRect)
{
Ellipse_Bresenham(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect);
return TRUE;
@ -132,7 +129,6 @@ BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect, HGDI_BRUSH hbr)
UINT32 color;
UINT32 nXDest, nYDest;
UINT32 nWidth, nHeight;
gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight);
if (!gdi_ClipCoords(hdc, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL))
@ -145,7 +141,8 @@ BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect, HGDI_BRUSH hbr)
for (x = 0; x < nWidth; x++)
{
BYTE* dstp = gdi_get_bitmap_pointer(hdc, nXDest + x,
nYDest + y);
nYDest + y);
if (dstp)
WriteColor(dstp, hdc->format, color);
}
@ -166,7 +163,7 @@ BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect, HGDI_BRUSH hbr)
* @param nCount number of points
* @return nonzero if successful, 0 otherwise
*/
BOOL gdi_Polygon(HGDI_DC hdc, GDI_POINT *lpPoints, int nCount)
BOOL gdi_Polygon(HGDI_DC hdc, GDI_POINT* lpPoints, int nCount)
{
WLog_ERR(TAG, "Not implemented!");
return FALSE;
@ -181,24 +178,52 @@ BOOL gdi_Polygon(HGDI_DC hdc, GDI_POINT *lpPoints, int nCount)
* @param nCount count of number of points in lpPolyCounts
* @return nonzero if successful, 0 otherwise
*/
BOOL gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT *lpPoints, int *lpPolyCounts, int nCount)
BOOL gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT* lpPoints, int* lpPolyCounts,
int nCount)
{
WLog_ERR(TAG, "Not implemented!");
return FALSE;
}
/**
* Draw a rectangle
* @msdn{dd162898}
* @param hdc device context
* @param nLeftRect x1
* @param nTopRect y1
* @param nRightRect x2
* @param nBottomRect y2
* @return nonzero if successful, 0 otherwise
*/
BOOL gdi_Rectangle(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect)
BOOL gdi_Rectangle(HGDI_DC hdc, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth,
UINT32 nHeight)
{
WLog_ERR(TAG, "Not implemented!");
UINT32 x, y;
UINT32 color;
if (!gdi_ClipCoords(hdc, &nXDst, &nYDst, &nWidth, &nHeight, NULL, NULL))
return TRUE;
color = hdc->textColor;
color = GetColor(hdc->format, 0, 0xFF, 0, 0xFF);
for (y = 0; y < nHeight; y++)
{
BYTE* dstLeft = gdi_get_bitmap_pointer(hdc, nXDst,
nYDst + y);
BYTE* dstRight = gdi_get_bitmap_pointer(hdc, nXDst + nWidth - 1,
nYDst + y);
if (dstLeft)
WriteColor(dstLeft, hdc->format, color);
if (dstRight)
WriteColor(dstRight, hdc->format, color);
}
for (x = 0; x < nWidth; x++)
{
BYTE* dstTop = gdi_get_bitmap_pointer(hdc, nXDst + x,
nYDst);
BYTE* dstBottom = gdi_get_bitmap_pointer(hdc, nXDst + x,
nYDst + nHeight - 1);
if (dstTop)
WriteColor(dstTop, hdc->format, color);
if (dstBottom)
WriteColor(dstBottom, hdc->format, color);
}
return FALSE;
}