mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
Merge pull request #11157 from akallabeth/function-size-fix
Function size refactor
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1480,149 +1480,174 @@ static SSIZE_T freerdp_client_write_setting_to_buffer(char** buffer, size_t* buf
|
||||
return len;
|
||||
}
|
||||
|
||||
size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, size_t size)
|
||||
static SSIZE_T write_int_parameters(const rdpFile* file, char* buffer, size_t size)
|
||||
{
|
||||
size_t totalSize = 0;
|
||||
WINPR_ASSERT(file);
|
||||
|
||||
if (!file)
|
||||
return 0;
|
||||
struct intentry_t
|
||||
{
|
||||
const char* key;
|
||||
DWORD val;
|
||||
};
|
||||
const struct intentry_t settings[] = {
|
||||
{ key_int_use_multimon, file->UseMultiMon },
|
||||
{ key_int_maximizetocurrentdisplays, file->MaximizeToCurrentDisplays },
|
||||
{ key_int_singlemoninwindowedmode, file->SingleMonInWindowedMode },
|
||||
{ key_int_screen_mode_id, file->ScreenModeId },
|
||||
{ key_int_span_monitors, file->SpanMonitors },
|
||||
{ key_int_smart_sizing, file->SmartSizing },
|
||||
{ key_int_dynamic_resolution, file->DynamicResolution },
|
||||
{ key_int_enablesuperpan, file->EnableSuperSpan },
|
||||
{ key_int_superpanaccelerationfactor, file->SuperSpanAccelerationFactor },
|
||||
{ key_int_desktopwidth, file->DesktopWidth },
|
||||
{ key_int_desktopheight, file->DesktopHeight },
|
||||
{ key_int_desktop_size_id, file->DesktopSizeId },
|
||||
{ key_int_session_bpp, file->SessionBpp },
|
||||
{ key_int_desktopscalefactor, file->DesktopScaleFactor },
|
||||
{ key_int_compression, file->Compression },
|
||||
{ key_int_keyboardhook, file->KeyboardHook },
|
||||
{ key_int_disable_ctrl_alt_del, file->DisableCtrlAltDel },
|
||||
{ key_int_audiomode, file->AudioMode },
|
||||
{ key_int_audioqualitymode, file->AudioQualityMode },
|
||||
{ key_int_audiocapturemode, file->AudioCaptureMode },
|
||||
{ key_int_encode_redirected_video_capture, file->EncodeRedirectedVideoCapture },
|
||||
{ key_int_redirected_video_capture_encoding_quality,
|
||||
file->RedirectedVideoCaptureEncodingQuality },
|
||||
{ key_int_videoplaybackmode, file->VideoPlaybackMode },
|
||||
{ key_int_connection_type, file->ConnectionType },
|
||||
{ key_int_networkautodetect, file->NetworkAutoDetect },
|
||||
{ key_int_bandwidthautodetect, file->BandwidthAutoDetect },
|
||||
{ key_int_pinconnectionbar, file->PinConnectionBar },
|
||||
{ key_int_displayconnectionbar, file->DisplayConnectionBar },
|
||||
{ key_int_workspaceid, file->WorkspaceId },
|
||||
{ key_int_enableworkspacereconnect, file->EnableWorkspaceReconnect },
|
||||
{ key_int_disable_wallpaper, file->DisableWallpaper },
|
||||
{ key_int_allow_font_smoothing, file->AllowFontSmoothing },
|
||||
{ key_int_allow_desktop_composition, file->AllowDesktopComposition },
|
||||
{ key_int_disable_full_window_drag, file->DisableFullWindowDrag },
|
||||
{ key_int_disable_menu_anims, file->DisableMenuAnims },
|
||||
{ key_int_disable_themes, file->DisableThemes },
|
||||
{ key_int_disable_cursor_setting, file->DisableCursorSetting },
|
||||
{ key_int_bitmapcachesize, file->BitmapCacheSize },
|
||||
{ key_int_bitmapcachepersistenable, file->BitmapCachePersistEnable },
|
||||
{ key_int_server_port, file->ServerPort },
|
||||
{ key_int_redirectdrives, file->RedirectDrives },
|
||||
{ key_int_redirectprinters, file->RedirectPrinters },
|
||||
{ key_int_redirectcomports, file->RedirectComPorts },
|
||||
{ key_int_redirectlocation, file->RedirectLocation },
|
||||
{ key_int_redirectsmartcards, file->RedirectSmartCards },
|
||||
{ key_int_redirectclipboard, file->RedirectClipboard },
|
||||
{ key_int_redirectposdevices, file->RedirectPosDevices },
|
||||
{ key_int_redirectdirectx, file->RedirectDirectX },
|
||||
{ key_int_disableprinterredirection, file->DisablePrinterRedirection },
|
||||
{ key_int_disableclipboardredirection, file->DisableClipboardRedirection },
|
||||
{ key_int_connect_to_console, file->ConnectToConsole },
|
||||
{ key_int_administrative_session, file->AdministrativeSession },
|
||||
{ key_int_autoreconnection_enabled, file->AutoReconnectionEnabled },
|
||||
{ key_int_autoreconnect_max_retries, file->AutoReconnectMaxRetries },
|
||||
{ key_int_public_mode, file->PublicMode },
|
||||
{ key_int_authentication_level, file->AuthenticationLevel },
|
||||
{ key_int_promptcredentialonce, file->PromptCredentialOnce },
|
||||
{ key_int_prompt_for_credentials, file->PromptForCredentials },
|
||||
{ key_int_negotiate_security_layer, file->NegotiateSecurityLayer },
|
||||
{ key_int_enablecredsspsupport, file->EnableCredSSPSupport },
|
||||
{ key_int_enablerdsaadauth, file->EnableRdsAadAuth },
|
||||
{ key_int_remoteapplicationmode, file->RemoteApplicationMode },
|
||||
{ key_int_remoteapplicationexpandcmdline, file->RemoteApplicationExpandCmdLine },
|
||||
{ key_int_remoteapplicationexpandworkingdir, file->RemoteApplicationExpandWorkingDir },
|
||||
{ key_int_disableconnectionsharing, file->DisableConnectionSharing },
|
||||
{ key_int_disableremoteappcapscheck, file->DisableRemoteAppCapsCheck },
|
||||
{ key_int_gatewayusagemethod, file->GatewayUsageMethod },
|
||||
{ key_int_gatewayprofileusagemethod, file->GatewayProfileUsageMethod },
|
||||
{ key_int_gatewaycredentialssource, file->GatewayCredentialsSource },
|
||||
{ key_int_use_redirection_server_name, file->UseRedirectionServerName },
|
||||
{ key_int_rdgiskdcproxy, file->RdgIsKdcProxy },
|
||||
{ key_int_redirectwebauthn, file->RedirectWebauthN }
|
||||
};
|
||||
|
||||
/* either buffer and size are null or non-null */
|
||||
if ((!buffer || !size) && (buffer || size))
|
||||
return 0;
|
||||
|
||||
#define WRITE_SETTING_(fmt_, ...) \
|
||||
{ \
|
||||
SSIZE_T res = freerdp_client_write_setting_to_buffer(&buffer, &size, fmt_, __VA_ARGS__); \
|
||||
if (res < 0) \
|
||||
return 0; \
|
||||
totalSize += (size_t)res; \
|
||||
SSIZE_T totalSize = 0;
|
||||
for (size_t x = 0; x < ARRAYSIZE(settings); x++)
|
||||
{
|
||||
const struct intentry_t* cur = &settings[x];
|
||||
if (~(size_t)(cur->val))
|
||||
{
|
||||
const SSIZE_T res = freerdp_client_write_setting_to_buffer(
|
||||
&buffer, &size, "%s:s:%" PRIu32, cur->key, cur->val);
|
||||
if (res < 0)
|
||||
return res;
|
||||
totalSize += res;
|
||||
}
|
||||
}
|
||||
|
||||
#define WRITE_SETTING_INT(key_, param_) \
|
||||
do \
|
||||
{ \
|
||||
if (~(param_)) \
|
||||
WRITE_SETTING_("%s:i:%" PRIu32, key_, param_) \
|
||||
} while (0)
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
#define WRITE_SETTING_STR(key_, param_) \
|
||||
do \
|
||||
{ \
|
||||
if (~(size_t)(param_)) \
|
||||
WRITE_SETTING_("%s:s:%s", key_, param_) \
|
||||
} while (0)
|
||||
static SSIZE_T write_string_parameters(const rdpFile* file, char* buffer, size_t size)
|
||||
{
|
||||
WINPR_ASSERT(file);
|
||||
|
||||
/* integer parameters */
|
||||
WRITE_SETTING_INT(key_int_use_multimon, file->UseMultiMon);
|
||||
WRITE_SETTING_INT(key_int_maximizetocurrentdisplays, file->MaximizeToCurrentDisplays);
|
||||
WRITE_SETTING_INT(key_int_singlemoninwindowedmode, file->SingleMonInWindowedMode);
|
||||
WRITE_SETTING_INT(key_int_screen_mode_id, file->ScreenModeId);
|
||||
WRITE_SETTING_INT(key_int_span_monitors, file->SpanMonitors);
|
||||
WRITE_SETTING_INT(key_int_smart_sizing, file->SmartSizing);
|
||||
WRITE_SETTING_INT(key_int_dynamic_resolution, file->DynamicResolution);
|
||||
WRITE_SETTING_INT(key_int_enablesuperpan, file->EnableSuperSpan);
|
||||
WRITE_SETTING_INT(key_int_superpanaccelerationfactor, file->SuperSpanAccelerationFactor);
|
||||
WRITE_SETTING_INT(key_int_desktopwidth, file->DesktopWidth);
|
||||
WRITE_SETTING_INT(key_int_desktopheight, file->DesktopHeight);
|
||||
WRITE_SETTING_INT(key_int_desktop_size_id, file->DesktopSizeId);
|
||||
WRITE_SETTING_INT(key_int_session_bpp, file->SessionBpp);
|
||||
WRITE_SETTING_INT(key_int_desktopscalefactor, file->DesktopScaleFactor);
|
||||
WRITE_SETTING_INT(key_int_compression, file->Compression);
|
||||
WRITE_SETTING_INT(key_int_keyboardhook, file->KeyboardHook);
|
||||
WRITE_SETTING_INT(key_int_disable_ctrl_alt_del, file->DisableCtrlAltDel);
|
||||
WRITE_SETTING_INT(key_int_audiomode, file->AudioMode);
|
||||
WRITE_SETTING_INT(key_int_audioqualitymode, file->AudioQualityMode);
|
||||
WRITE_SETTING_INT(key_int_audiocapturemode, file->AudioCaptureMode);
|
||||
WRITE_SETTING_INT(key_int_encode_redirected_video_capture, file->EncodeRedirectedVideoCapture);
|
||||
WRITE_SETTING_INT(key_int_redirected_video_capture_encoding_quality,
|
||||
file->RedirectedVideoCaptureEncodingQuality);
|
||||
WRITE_SETTING_INT(key_int_videoplaybackmode, file->VideoPlaybackMode);
|
||||
WRITE_SETTING_INT(key_int_connection_type, file->ConnectionType);
|
||||
WRITE_SETTING_INT(key_int_networkautodetect, file->NetworkAutoDetect);
|
||||
WRITE_SETTING_INT(key_int_bandwidthautodetect, file->BandwidthAutoDetect);
|
||||
WRITE_SETTING_INT(key_int_pinconnectionbar, file->PinConnectionBar);
|
||||
WRITE_SETTING_INT(key_int_displayconnectionbar, file->DisplayConnectionBar);
|
||||
WRITE_SETTING_INT(key_int_workspaceid, file->WorkspaceId);
|
||||
WRITE_SETTING_INT(key_int_enableworkspacereconnect, file->EnableWorkspaceReconnect);
|
||||
WRITE_SETTING_INT(key_int_disable_wallpaper, file->DisableWallpaper);
|
||||
WRITE_SETTING_INT(key_int_allow_font_smoothing, file->AllowFontSmoothing);
|
||||
WRITE_SETTING_INT(key_int_allow_desktop_composition, file->AllowDesktopComposition);
|
||||
WRITE_SETTING_INT(key_int_disable_full_window_drag, file->DisableFullWindowDrag);
|
||||
WRITE_SETTING_INT(key_int_disable_menu_anims, file->DisableMenuAnims);
|
||||
WRITE_SETTING_INT(key_int_disable_themes, file->DisableThemes);
|
||||
WRITE_SETTING_INT(key_int_disable_cursor_setting, file->DisableCursorSetting);
|
||||
WRITE_SETTING_INT(key_int_bitmapcachesize, file->BitmapCacheSize);
|
||||
WRITE_SETTING_INT(key_int_bitmapcachepersistenable, file->BitmapCachePersistEnable);
|
||||
WRITE_SETTING_INT(key_int_server_port, file->ServerPort);
|
||||
WRITE_SETTING_INT(key_int_redirectdrives, file->RedirectDrives);
|
||||
WRITE_SETTING_INT(key_int_redirectprinters, file->RedirectPrinters);
|
||||
WRITE_SETTING_INT(key_int_redirectcomports, file->RedirectComPorts);
|
||||
WRITE_SETTING_INT(key_int_redirectlocation, file->RedirectLocation);
|
||||
WRITE_SETTING_INT(key_int_redirectsmartcards, file->RedirectSmartCards);
|
||||
WRITE_SETTING_INT(key_int_redirectclipboard, file->RedirectClipboard);
|
||||
WRITE_SETTING_INT(key_int_redirectposdevices, file->RedirectPosDevices);
|
||||
WRITE_SETTING_INT(key_int_redirectdirectx, file->RedirectDirectX);
|
||||
WRITE_SETTING_INT(key_int_disableprinterredirection, file->DisablePrinterRedirection);
|
||||
WRITE_SETTING_INT(key_int_disableclipboardredirection, file->DisableClipboardRedirection);
|
||||
WRITE_SETTING_INT(key_int_connect_to_console, file->ConnectToConsole);
|
||||
WRITE_SETTING_INT(key_int_administrative_session, file->AdministrativeSession);
|
||||
WRITE_SETTING_INT(key_int_autoreconnection_enabled, file->AutoReconnectionEnabled);
|
||||
WRITE_SETTING_INT(key_int_autoreconnect_max_retries, file->AutoReconnectMaxRetries);
|
||||
WRITE_SETTING_INT(key_int_public_mode, file->PublicMode);
|
||||
WRITE_SETTING_INT(key_int_authentication_level, file->AuthenticationLevel);
|
||||
WRITE_SETTING_INT(key_int_promptcredentialonce, file->PromptCredentialOnce);
|
||||
WRITE_SETTING_INT(key_int_prompt_for_credentials, file->PromptForCredentials);
|
||||
WRITE_SETTING_INT(key_int_negotiate_security_layer, file->NegotiateSecurityLayer);
|
||||
WRITE_SETTING_INT(key_int_enablecredsspsupport, file->EnableCredSSPSupport);
|
||||
WRITE_SETTING_INT(key_int_enablerdsaadauth, file->EnableRdsAadAuth);
|
||||
WRITE_SETTING_INT(key_int_remoteapplicationmode, file->RemoteApplicationMode);
|
||||
WRITE_SETTING_INT(key_int_remoteapplicationexpandcmdline, file->RemoteApplicationExpandCmdLine);
|
||||
WRITE_SETTING_INT(key_int_remoteapplicationexpandworkingdir,
|
||||
file->RemoteApplicationExpandWorkingDir);
|
||||
WRITE_SETTING_INT(key_int_disableconnectionsharing, file->DisableConnectionSharing);
|
||||
WRITE_SETTING_INT(key_int_disableremoteappcapscheck, file->DisableRemoteAppCapsCheck);
|
||||
WRITE_SETTING_INT(key_int_gatewayusagemethod, file->GatewayUsageMethod);
|
||||
WRITE_SETTING_INT(key_int_gatewayprofileusagemethod, file->GatewayProfileUsageMethod);
|
||||
WRITE_SETTING_INT(key_int_gatewaycredentialssource, file->GatewayCredentialsSource);
|
||||
WRITE_SETTING_INT(key_int_use_redirection_server_name, file->UseRedirectionServerName);
|
||||
WRITE_SETTING_INT(key_int_rdgiskdcproxy, file->RdgIsKdcProxy);
|
||||
WRITE_SETTING_INT(key_int_redirectwebauthn, file->RedirectWebauthN);
|
||||
struct strentry_t
|
||||
{
|
||||
const char* key;
|
||||
const char* val;
|
||||
};
|
||||
const struct strentry_t settings[] = {
|
||||
{ key_str_username, file->Username },
|
||||
{ key_str_domain, file->Domain },
|
||||
{ key_str_password, file->Password },
|
||||
{ key_str_full_address, file->FullAddress },
|
||||
{ key_str_alternate_full_address, file->AlternateFullAddress },
|
||||
{ key_str_usbdevicestoredirect, file->UsbDevicesToRedirect },
|
||||
{ key_str_camerastoredirect, file->RedirectCameras },
|
||||
{ key_str_loadbalanceinfo, file->LoadBalanceInfo },
|
||||
{ key_str_remoteapplicationname, file->RemoteApplicationName },
|
||||
{ key_str_remoteapplicationicon, file->RemoteApplicationIcon },
|
||||
{ key_str_remoteapplicationprogram, file->RemoteApplicationProgram },
|
||||
{ key_str_remoteapplicationfile, file->RemoteApplicationFile },
|
||||
{ key_str_remoteapplicationguid, file->RemoteApplicationGuid },
|
||||
{ key_str_remoteapplicationcmdline, file->RemoteApplicationCmdLine },
|
||||
{ key_str_alternate_shell, file->AlternateShell },
|
||||
{ key_str_shell_working_directory, file->ShellWorkingDirectory },
|
||||
{ key_str_gatewayhostname, file->GatewayHostname },
|
||||
{ key_str_resourceprovider, file->ResourceProvider },
|
||||
{ key_str_wvd, file->WvdEndpointPool },
|
||||
{ key_str_geo, file->geo },
|
||||
{ key_str_armpath, file->armpath },
|
||||
{ key_str_aadtenantid, file->aadtenantid },
|
||||
{ key_str_diagnosticserviceurl, file->diagnosticserviceurl },
|
||||
{ key_str_hubdiscoverygeourl, file->hubdiscoverygeourl },
|
||||
{ key_str_activityhint, file->activityhint },
|
||||
{ key_str_gatewayaccesstoken, file->GatewayAccessToken },
|
||||
{ key_str_kdcproxyname, file->KdcProxyName },
|
||||
{ key_str_drivestoredirect, file->DrivesToRedirect },
|
||||
{ key_str_devicestoredirect, file->DevicesToRedirect },
|
||||
{ key_str_winposstr, file->WinPosStr },
|
||||
{ key_str_pcb, file->PreconnectionBlob },
|
||||
{ key_str_selectedmonitors, file->SelectedMonitors }
|
||||
};
|
||||
|
||||
/* string parameters */
|
||||
WRITE_SETTING_STR(key_str_username, file->Username);
|
||||
WRITE_SETTING_STR(key_str_domain, file->Domain);
|
||||
WRITE_SETTING_STR(key_str_password, file->Password);
|
||||
WRITE_SETTING_STR(key_str_full_address, file->FullAddress);
|
||||
WRITE_SETTING_STR(key_str_alternate_full_address, file->AlternateFullAddress);
|
||||
WRITE_SETTING_STR(key_str_usbdevicestoredirect, file->UsbDevicesToRedirect);
|
||||
WRITE_SETTING_STR(key_str_camerastoredirect, file->RedirectCameras);
|
||||
WRITE_SETTING_STR(key_str_loadbalanceinfo, file->LoadBalanceInfo);
|
||||
WRITE_SETTING_STR(key_str_remoteapplicationname, file->RemoteApplicationName);
|
||||
WRITE_SETTING_STR(key_str_remoteapplicationicon, file->RemoteApplicationIcon);
|
||||
WRITE_SETTING_STR(key_str_remoteapplicationprogram, file->RemoteApplicationProgram);
|
||||
WRITE_SETTING_STR(key_str_remoteapplicationfile, file->RemoteApplicationFile);
|
||||
WRITE_SETTING_STR(key_str_remoteapplicationguid, file->RemoteApplicationGuid);
|
||||
WRITE_SETTING_STR(key_str_remoteapplicationcmdline, file->RemoteApplicationCmdLine);
|
||||
WRITE_SETTING_STR(key_str_alternate_shell, file->AlternateShell);
|
||||
WRITE_SETTING_STR(key_str_shell_working_directory, file->ShellWorkingDirectory);
|
||||
WRITE_SETTING_STR(key_str_gatewayhostname, file->GatewayHostname);
|
||||
WRITE_SETTING_STR(key_str_resourceprovider, file->ResourceProvider);
|
||||
WRITE_SETTING_STR(key_str_wvd, file->WvdEndpointPool);
|
||||
WRITE_SETTING_STR(key_str_geo, file->geo);
|
||||
WRITE_SETTING_STR(key_str_armpath, file->armpath);
|
||||
WRITE_SETTING_STR(key_str_aadtenantid, file->aadtenantid);
|
||||
WRITE_SETTING_STR(key_str_diagnosticserviceurl, file->diagnosticserviceurl);
|
||||
WRITE_SETTING_STR(key_str_hubdiscoverygeourl, file->hubdiscoverygeourl);
|
||||
WRITE_SETTING_STR(key_str_activityhint, file->activityhint);
|
||||
WRITE_SETTING_STR(key_str_gatewayaccesstoken, file->GatewayAccessToken);
|
||||
WRITE_SETTING_STR(key_str_kdcproxyname, file->KdcProxyName);
|
||||
WRITE_SETTING_STR(key_str_drivestoredirect, file->DrivesToRedirect);
|
||||
WRITE_SETTING_STR(key_str_devicestoredirect, file->DevicesToRedirect);
|
||||
WRITE_SETTING_STR(key_str_winposstr, file->WinPosStr);
|
||||
WRITE_SETTING_STR(key_str_pcb, file->PreconnectionBlob);
|
||||
WRITE_SETTING_STR(key_str_selectedmonitors, file->SelectedMonitors);
|
||||
SSIZE_T totalSize = 0;
|
||||
for (size_t x = 0; x < ARRAYSIZE(settings); x++)
|
||||
{
|
||||
const struct strentry_t* cur = &settings[x];
|
||||
if (~(size_t)(cur->val))
|
||||
{
|
||||
const SSIZE_T res = freerdp_client_write_setting_to_buffer(&buffer, &size, "%s:s:%s",
|
||||
cur->key, cur->val);
|
||||
if (res < 0)
|
||||
return res;
|
||||
totalSize += res;
|
||||
}
|
||||
}
|
||||
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
static SSIZE_T write_custom_parameters(const rdpFile* file, char* buffer, size_t size)
|
||||
{
|
||||
WINPR_ASSERT(file);
|
||||
|
||||
SSIZE_T totalSize = 0;
|
||||
/* custom parameters */
|
||||
for (size_t i = 0; i < file->lineCount; ++i)
|
||||
{
|
||||
@@ -1636,11 +1661,40 @@ size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, s
|
||||
res = freerdp_client_write_setting_to_buffer(&buffer, &size, "%s:s:%s", curLine->name,
|
||||
curLine->sValue);
|
||||
if (res < 0)
|
||||
return 0;
|
||||
return res;
|
||||
|
||||
totalSize += (size_t)res;
|
||||
totalSize += res;
|
||||
}
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, size_t size)
|
||||
{
|
||||
size_t totalSize = 0;
|
||||
|
||||
if (!file)
|
||||
return 0;
|
||||
|
||||
/* either buffer and size are null or non-null */
|
||||
if ((!buffer || !size) && (buffer || size))
|
||||
return 0;
|
||||
|
||||
/* integer parameters */
|
||||
const SSIZE_T intsize = write_int_parameters(file, buffer, size);
|
||||
if (intsize < 0)
|
||||
return 0;
|
||||
totalSize += (size_t)intsize;
|
||||
|
||||
/* string parameters */
|
||||
const SSIZE_T stringsize = write_string_parameters(file, buffer, size);
|
||||
if (stringsize < 0)
|
||||
return 0;
|
||||
|
||||
/* custom parameters */
|
||||
const SSIZE_T customsize = write_custom_parameters(file, buffer, size);
|
||||
if (customsize < 0)
|
||||
return 0;
|
||||
totalSize += (size_t)customsize;
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,217 @@
|
||||
#include <winpr/crt.h>
|
||||
#include <winpr/sysinfo.h>
|
||||
|
||||
static inline size_t nsc_encode_next_rgba(UINT32 format, const BYTE* src, const BYTE* palette,
|
||||
__m128i* r_val, __m128i* g_val, __m128i* b_val,
|
||||
__m128i* a_val)
|
||||
{
|
||||
switch (format)
|
||||
{
|
||||
case PIXEL_FORMAT_BGRX32:
|
||||
*b_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16), *(src + 12),
|
||||
*(src + 8), *(src + 4), *src);
|
||||
*g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17), *(src + 13),
|
||||
*(src + 9), *(src + 5), *(src + 1));
|
||||
*r_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18), *(src + 14),
|
||||
*(src + 10), *(src + 6), *(src + 2));
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 32;
|
||||
|
||||
case PIXEL_FORMAT_BGRA32:
|
||||
*b_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16), *(src + 12),
|
||||
*(src + 8), *(src + 4), *src);
|
||||
*g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17), *(src + 13),
|
||||
*(src + 9), *(src + 5), *(src + 1));
|
||||
*r_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18), *(src + 14),
|
||||
*(src + 10), *(src + 6), *(src + 2));
|
||||
*a_val = _mm_set_epi16(*(src + 31), *(src + 27), *(src + 23), *(src + 19), *(src + 15),
|
||||
*(src + 11), *(src + 7), *(src + 3));
|
||||
return 32;
|
||||
|
||||
case PIXEL_FORMAT_RGBX32:
|
||||
*r_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16), *(src + 12),
|
||||
*(src + 8), *(src + 4), *src);
|
||||
*g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17), *(src + 13),
|
||||
*(src + 9), *(src + 5), *(src + 1));
|
||||
*b_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18), *(src + 14),
|
||||
*(src + 10), *(src + 6), *(src + 2));
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 32;
|
||||
|
||||
case PIXEL_FORMAT_RGBA32:
|
||||
*r_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16), *(src + 12),
|
||||
*(src + 8), *(src + 4), *src);
|
||||
*g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17), *(src + 13),
|
||||
*(src + 9), *(src + 5), *(src + 1));
|
||||
*b_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18), *(src + 14),
|
||||
*(src + 10), *(src + 6), *(src + 2));
|
||||
*a_val = _mm_set_epi16(*(src + 31), *(src + 27), *(src + 23), *(src + 19), *(src + 15),
|
||||
*(src + 11), *(src + 7), *(src + 3));
|
||||
return 32;
|
||||
|
||||
case PIXEL_FORMAT_BGR24:
|
||||
*b_val = _mm_set_epi16(*(src + 21), *(src + 18), *(src + 15), *(src + 12), *(src + 9),
|
||||
*(src + 6), *(src + 3), *src);
|
||||
*g_val = _mm_set_epi16(*(src + 22), *(src + 19), *(src + 16), *(src + 13), *(src + 10),
|
||||
*(src + 7), *(src + 4), *(src + 1));
|
||||
*r_val = _mm_set_epi16(*(src + 23), *(src + 20), *(src + 17), *(src + 14), *(src + 11),
|
||||
*(src + 8), *(src + 5), *(src + 2));
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 24;
|
||||
|
||||
case PIXEL_FORMAT_RGB24:
|
||||
*r_val = _mm_set_epi16(*(src + 21), *(src + 18), *(src + 15), *(src + 12), *(src + 9),
|
||||
*(src + 6), *(src + 3), *src);
|
||||
*g_val = _mm_set_epi16(*(src + 22), *(src + 19), *(src + 16), *(src + 13), *(src + 10),
|
||||
*(src + 7), *(src + 4), *(src + 1));
|
||||
*b_val = _mm_set_epi16(*(src + 23), *(src + 20), *(src + 17), *(src + 14), *(src + 11),
|
||||
*(src + 8), *(src + 5), *(src + 2));
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 24;
|
||||
|
||||
case PIXEL_FORMAT_BGR16:
|
||||
*b_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 15)) & 0xF8) | ((*(src + 15)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 13)) & 0xF8) | ((*(src + 13)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 11)) & 0xF8) | ((*(src + 11)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 9)) & 0xF8) | ((*(src + 9)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 7)) & 0xF8) | ((*(src + 7)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 5)) & 0xF8) | ((*(src + 5)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 3)) & 0xF8) | ((*(src + 3)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 1)) & 0xF8) | ((*(src + 1)) >> 5)));
|
||||
*g_val =
|
||||
_mm_set_epi16(WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 15)) & 0x07) << 5) |
|
||||
(((*(src + 14)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 13)) & 0x07) << 5) |
|
||||
(((*(src + 12)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 11)) & 0x07) << 5) |
|
||||
(((*(src + 10)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 9)) & 0x07) << 5) |
|
||||
(((*(src + 8)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 7)) & 0x07) << 5) |
|
||||
(((*(src + 6)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 5)) & 0x07) << 5) |
|
||||
(((*(src + 4)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 3)) & 0x07) << 5) |
|
||||
(((*(src + 2)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 1)) & 0x07) << 5) |
|
||||
(((*src) & 0xE0) >> 3)));
|
||||
*r_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 14)) & 0x1F) << 3) |
|
||||
(((*(src + 14)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 12)) & 0x1F) << 3) |
|
||||
(((*(src + 12)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 10)) & 0x1F) << 3) |
|
||||
(((*(src + 10)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 8)) & 0x1F) << 3) |
|
||||
(((*(src + 8)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 6)) & 0x1F) << 3) |
|
||||
(((*(src + 6)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 4)) & 0x1F) << 3) |
|
||||
(((*(src + 4)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 2)) & 0x1F) << 3) |
|
||||
(((*(src + 2)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*src) & 0x1F) << 3) | (((*src) >> 2) & 0x07)));
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 16;
|
||||
|
||||
case PIXEL_FORMAT_RGB16:
|
||||
*r_val =
|
||||
_mm_set_epi16(WINPR_ASSERTING_INT_CAST(INT16, ((src[15] & 0xF8) | (src[15] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[13] & 0xF8) | (src[13] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[11] & 0xF8) | (src[11] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[9] & 0xF8) | (src[9] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[7] & 0xF8) | (src[7] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[5] & 0xF8) | (src[5] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[3] & 0xF8) | (src[3] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[1] & 0xF8) | (src[1] >> 5))));
|
||||
*g_val =
|
||||
_mm_set_epi16(WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 15)) & 0x07) << 5) |
|
||||
(((*(src + 14)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 13)) & 0x07) << 5) |
|
||||
(((*(src + 12)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 11)) & 0x07) << 5) |
|
||||
(((*(src + 10)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 9)) & 0x07) << 5) |
|
||||
(((*(src + 8)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 7)) & 0x07) << 5) |
|
||||
(((*(src + 6)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 5)) & 0x07) << 5) |
|
||||
(((*(src + 4)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 3)) & 0x07) << 5) |
|
||||
(((*(src + 2)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 1)) & 0x07) << 5) |
|
||||
(((*src) & 0xE0) >> 3)));
|
||||
*b_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 14)) & 0x1F) << 3) |
|
||||
(((*(src + 14)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 12)) & 0x1F) << 3) |
|
||||
(((*(src + 12)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 10)) & 0x1F) << 3) |
|
||||
(((*(src + 10)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 8)) & 0x1F) << 3) |
|
||||
(((*(src + 8)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 6)) & 0x1F) << 3) |
|
||||
(((*(src + 6)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 4)) & 0x1F) << 3) |
|
||||
(((*(src + 4)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 2)) & 0x1F) << 3) |
|
||||
(((*(src + 2)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*src) & 0x1F) << 3) | (((*src) >> 2) & 0x07)));
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 16;
|
||||
|
||||
case PIXEL_FORMAT_A4:
|
||||
{
|
||||
BYTE idx[8] = { 0 };
|
||||
|
||||
for (int shift = 7; shift >= 0; shift--)
|
||||
{
|
||||
idx[shift] = ((*src) >> shift) & 1;
|
||||
idx[shift] |= (((*(src + 1)) >> shift) & 1) << 1;
|
||||
idx[shift] |= (((*(src + 2)) >> shift) & 1) << 2;
|
||||
idx[shift] |= (((*(src + 3)) >> shift) & 1) << 3;
|
||||
idx[shift] *= 3;
|
||||
}
|
||||
|
||||
*r_val =
|
||||
_mm_set_epi16(palette[idx[0]], palette[idx[1]], palette[idx[2]], palette[idx[3]],
|
||||
palette[idx[4]], palette[idx[5]], palette[idx[6]], palette[idx[7]]);
|
||||
*g_val = _mm_set_epi16(palette[idx[0] + 1], palette[idx[1] + 1], palette[idx[2] + 1],
|
||||
palette[idx[3] + 1], palette[idx[4] + 1], palette[idx[5] + 1],
|
||||
palette[idx[6] + 1], palette[idx[7] + 1]);
|
||||
*b_val = _mm_set_epi16(palette[idx[0] + 2], palette[idx[1] + 2], palette[idx[2] + 2],
|
||||
palette[idx[3] + 2], palette[idx[4] + 2], palette[idx[5] + 2],
|
||||
palette[idx[6] + 2], palette[idx[7] + 2]);
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 4;
|
||||
}
|
||||
|
||||
case PIXEL_FORMAT_RGB8:
|
||||
{
|
||||
*r_val = _mm_set_epi16(palette[(*(src + 7ULL)) * 3ULL], palette[(*(src + 6ULL)) * 3ULL],
|
||||
palette[(*(src + 5ULL)) * 3ULL], palette[(*(src + 4ULL)) * 3ULL],
|
||||
palette[(*(src + 3ULL)) * 3ULL], palette[(*(src + 2ULL)) * 3ULL],
|
||||
palette[(*(src + 1ULL)) * 3ULL], palette[(*src) * 3ULL]);
|
||||
*g_val = _mm_set_epi16(
|
||||
palette[(*(src + 7ULL)) * 3ULL + 1ULL], palette[(*(src + 6ULL)) * 3ULL + 1ULL],
|
||||
palette[(*(src + 5ULL)) * 3ULL + 1ULL], palette[(*(src + 4ULL)) * 3ULL + 1ULL],
|
||||
palette[(*(src + 3ULL)) * 3ULL + 1ULL], palette[(*(src + 2ULL)) * 3ULL + 1ULL],
|
||||
palette[(*(src + 1ULL)) * 3ULL + 1ULL], palette[(*src) * 3ULL + 1ULL]);
|
||||
*b_val = _mm_set_epi16(
|
||||
palette[(*(src + 7ULL)) * 3ULL + 2ULL], palette[(*(src + 6ULL)) * 3ULL + 2ULL],
|
||||
palette[(*(src + 5ULL)) * 3ULL + 2ULL], palette[(*(src + 4ULL)) * 3ULL + 2ULL],
|
||||
palette[(*(src + 3ULL)) * 3ULL + 2ULL], palette[(*(src + 2ULL)) * 3ULL + 2ULL],
|
||||
palette[(*(src + 1ULL)) * 3ULL + 2ULL], palette[(*src) * 3ULL + 2ULL]);
|
||||
*a_val = _mm_set1_epi16(0xFF);
|
||||
return 8;
|
||||
}
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static BOOL nsc_encode_argb_to_aycocg_sse2(NSC_CONTEXT* context, const BYTE* data, UINT32 scanline)
|
||||
{
|
||||
size_t y = 0;
|
||||
@@ -66,247 +277,9 @@ static BOOL nsc_encode_argb_to_aycocg_sse2(NSC_CONTEXT* context, const BYTE* dat
|
||||
__m128i b_val = { 0 };
|
||||
__m128i a_val = { 0 };
|
||||
|
||||
switch (context->format)
|
||||
{
|
||||
case PIXEL_FORMAT_BGRX32:
|
||||
b_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16),
|
||||
*(src + 12), *(src + 8), *(src + 4), *src);
|
||||
g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17),
|
||||
*(src + 13), *(src + 9), *(src + 5), *(src + 1));
|
||||
r_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18),
|
||||
*(src + 14), *(src + 10), *(src + 6), *(src + 2));
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
src += 32;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_BGRA32:
|
||||
b_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16),
|
||||
*(src + 12), *(src + 8), *(src + 4), *src);
|
||||
g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17),
|
||||
*(src + 13), *(src + 9), *(src + 5), *(src + 1));
|
||||
r_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18),
|
||||
*(src + 14), *(src + 10), *(src + 6), *(src + 2));
|
||||
a_val = _mm_set_epi16(*(src + 31), *(src + 27), *(src + 23), *(src + 19),
|
||||
*(src + 15), *(src + 11), *(src + 7), *(src + 3));
|
||||
src += 32;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_RGBX32:
|
||||
r_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16),
|
||||
*(src + 12), *(src + 8), *(src + 4), *src);
|
||||
g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17),
|
||||
*(src + 13), *(src + 9), *(src + 5), *(src + 1));
|
||||
b_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18),
|
||||
*(src + 14), *(src + 10), *(src + 6), *(src + 2));
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
src += 32;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_RGBA32:
|
||||
r_val = _mm_set_epi16(*(src + 28), *(src + 24), *(src + 20), *(src + 16),
|
||||
*(src + 12), *(src + 8), *(src + 4), *src);
|
||||
g_val = _mm_set_epi16(*(src + 29), *(src + 25), *(src + 21), *(src + 17),
|
||||
*(src + 13), *(src + 9), *(src + 5), *(src + 1));
|
||||
b_val = _mm_set_epi16(*(src + 30), *(src + 26), *(src + 22), *(src + 18),
|
||||
*(src + 14), *(src + 10), *(src + 6), *(src + 2));
|
||||
a_val = _mm_set_epi16(*(src + 31), *(src + 27), *(src + 23), *(src + 19),
|
||||
*(src + 15), *(src + 11), *(src + 7), *(src + 3));
|
||||
src += 32;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_BGR24:
|
||||
b_val = _mm_set_epi16(*(src + 21), *(src + 18), *(src + 15), *(src + 12),
|
||||
*(src + 9), *(src + 6), *(src + 3), *src);
|
||||
g_val = _mm_set_epi16(*(src + 22), *(src + 19), *(src + 16), *(src + 13),
|
||||
*(src + 10), *(src + 7), *(src + 4), *(src + 1));
|
||||
r_val = _mm_set_epi16(*(src + 23), *(src + 20), *(src + 17), *(src + 14),
|
||||
*(src + 11), *(src + 8), *(src + 5), *(src + 2));
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
src += 24;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_RGB24:
|
||||
r_val = _mm_set_epi16(*(src + 21), *(src + 18), *(src + 15), *(src + 12),
|
||||
*(src + 9), *(src + 6), *(src + 3), *src);
|
||||
g_val = _mm_set_epi16(*(src + 22), *(src + 19), *(src + 16), *(src + 13),
|
||||
*(src + 10), *(src + 7), *(src + 4), *(src + 1));
|
||||
b_val = _mm_set_epi16(*(src + 23), *(src + 20), *(src + 17), *(src + 14),
|
||||
*(src + 11), *(src + 8), *(src + 5), *(src + 2));
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
src += 24;
|
||||
break;
|
||||
case PIXEL_FORMAT_BGR16:
|
||||
b_val = _mm_set_epi16(WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 15)) & 0xF8) |
|
||||
((*(src + 15)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 13)) & 0xF8) |
|
||||
((*(src + 13)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 11)) & 0xF8) |
|
||||
((*(src + 11)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 9)) & 0xF8) |
|
||||
((*(src + 9)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 7)) & 0xF8) |
|
||||
((*(src + 7)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 5)) & 0xF8) |
|
||||
((*(src + 5)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 3)) & 0xF8) |
|
||||
((*(src + 3)) >> 5)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((*(src + 1)) & 0xF8) |
|
||||
((*(src + 1)) >> 5)));
|
||||
g_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 15)) & 0x07) << 5) |
|
||||
(((*(src + 14)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 13)) & 0x07) << 5) |
|
||||
(((*(src + 12)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 11)) & 0x07) << 5) |
|
||||
(((*(src + 10)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 9)) & 0x07) << 5) |
|
||||
(((*(src + 8)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 7)) & 0x07) << 5) |
|
||||
(((*(src + 6)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 5)) & 0x07) << 5) |
|
||||
(((*(src + 4)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 3)) & 0x07) << 5) |
|
||||
(((*(src + 2)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 1)) & 0x07) << 5) |
|
||||
(((*src) & 0xE0) >> 3)));
|
||||
r_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 14)) & 0x1F) << 3) |
|
||||
(((*(src + 14)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 12)) & 0x1F) << 3) |
|
||||
(((*(src + 12)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 10)) & 0x1F) << 3) |
|
||||
(((*(src + 10)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 8)) & 0x1F) << 3) |
|
||||
(((*(src + 8)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 6)) & 0x1F) << 3) |
|
||||
(((*(src + 6)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 4)) & 0x1F) << 3) |
|
||||
(((*(src + 4)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 2)) & 0x1F) << 3) |
|
||||
(((*(src + 2)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16,
|
||||
(((*src) & 0x1F) << 3) | (((*src) >> 2) & 0x07)));
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
src += 16;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_RGB16:
|
||||
r_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[15] & 0xF8) | (src[15] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[13] & 0xF8) | (src[13] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[11] & 0xF8) | (src[11] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[9] & 0xF8) | (src[9] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[7] & 0xF8) | (src[7] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[5] & 0xF8) | (src[5] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[3] & 0xF8) | (src[3] >> 5))),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, ((src[1] & 0xF8) | (src[1] >> 5))));
|
||||
g_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 15)) & 0x07) << 5) |
|
||||
(((*(src + 14)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 13)) & 0x07) << 5) |
|
||||
(((*(src + 12)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 11)) & 0x07) << 5) |
|
||||
(((*(src + 10)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 9)) & 0x07) << 5) |
|
||||
(((*(src + 8)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 7)) & 0x07) << 5) |
|
||||
(((*(src + 6)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 5)) & 0x07) << 5) |
|
||||
(((*(src + 4)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 3)) & 0x07) << 5) |
|
||||
(((*(src + 2)) & 0xE0) >> 3)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 1)) & 0x07) << 5) |
|
||||
(((*src) & 0xE0) >> 3)));
|
||||
b_val = _mm_set_epi16(
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 14)) & 0x1F) << 3) |
|
||||
(((*(src + 14)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 12)) & 0x1F) << 3) |
|
||||
(((*(src + 12)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 10)) & 0x1F) << 3) |
|
||||
(((*(src + 10)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 8)) & 0x1F) << 3) |
|
||||
(((*(src + 8)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 6)) & 0x1F) << 3) |
|
||||
(((*(src + 6)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 4)) & 0x1F) << 3) |
|
||||
(((*(src + 4)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16, (((*(src + 2)) & 0x1F) << 3) |
|
||||
(((*(src + 2)) >> 2) & 0x07)),
|
||||
WINPR_ASSERTING_INT_CAST(INT16,
|
||||
(((*src) & 0x1F) << 3) | (((*src) >> 2) & 0x07)));
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
src += 16;
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_A4:
|
||||
{
|
||||
BYTE idx[8] = { 0 };
|
||||
|
||||
for (int shift = 7; shift >= 0; shift--)
|
||||
{
|
||||
idx[shift] = ((*src) >> shift) & 1;
|
||||
idx[shift] |= (((*(src + 1)) >> shift) & 1) << 1;
|
||||
idx[shift] |= (((*(src + 2)) >> shift) & 1) << 2;
|
||||
idx[shift] |= (((*(src + 3)) >> shift) & 1) << 3;
|
||||
idx[shift] *= 3;
|
||||
}
|
||||
|
||||
r_val = _mm_set_epi16(context->palette[idx[0]], context->palette[idx[1]],
|
||||
context->palette[idx[2]], context->palette[idx[3]],
|
||||
context->palette[idx[4]], context->palette[idx[5]],
|
||||
context->palette[idx[6]], context->palette[idx[7]]);
|
||||
g_val =
|
||||
_mm_set_epi16(context->palette[idx[0] + 1], context->palette[idx[1] + 1],
|
||||
context->palette[idx[2] + 1], context->palette[idx[3] + 1],
|
||||
context->palette[idx[4] + 1], context->palette[idx[5] + 1],
|
||||
context->palette[idx[6] + 1], context->palette[idx[7] + 1]);
|
||||
b_val =
|
||||
_mm_set_epi16(context->palette[idx[0] + 2], context->palette[idx[1] + 2],
|
||||
context->palette[idx[2] + 2], context->palette[idx[3] + 2],
|
||||
context->palette[idx[4] + 2], context->palette[idx[5] + 2],
|
||||
context->palette[idx[6] + 2], context->palette[idx[7] + 2]);
|
||||
src += 4;
|
||||
}
|
||||
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
break;
|
||||
|
||||
case PIXEL_FORMAT_RGB8:
|
||||
{
|
||||
r_val = _mm_set_epi16(context->palette[(*(src + 7ULL)) * 3ULL],
|
||||
context->palette[(*(src + 6ULL)) * 3ULL],
|
||||
context->palette[(*(src + 5ULL)) * 3ULL],
|
||||
context->palette[(*(src + 4ULL)) * 3ULL],
|
||||
context->palette[(*(src + 3ULL)) * 3ULL],
|
||||
context->palette[(*(src + 2ULL)) * 3ULL],
|
||||
context->palette[(*(src + 1ULL)) * 3ULL],
|
||||
context->palette[(*src) * 3ULL]);
|
||||
g_val = _mm_set_epi16(context->palette[(*(src + 7ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*(src + 6ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*(src + 5ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*(src + 4ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*(src + 3ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*(src + 2ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*(src + 1ULL)) * 3ULL + 1ULL],
|
||||
context->palette[(*src) * 3ULL + 1ULL]);
|
||||
b_val = _mm_set_epi16(context->palette[(*(src + 7ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*(src + 6ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*(src + 5ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*(src + 4ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*(src + 3ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*(src + 2ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*(src + 1ULL)) * 3ULL + 2ULL],
|
||||
context->palette[(*src) * 3ULL + 2ULL]);
|
||||
src += 8;
|
||||
}
|
||||
|
||||
a_val = _mm_set1_epi16(0xFF);
|
||||
break;
|
||||
|
||||
default:
|
||||
r_val = g_val = b_val = a_val = _mm_set1_epi16(0);
|
||||
break;
|
||||
}
|
||||
const size_t rc = nsc_encode_next_rgba(context->format, src, context->palette, &r_val,
|
||||
&g_val, &b_val, &a_val);
|
||||
src += rc;
|
||||
|
||||
__m128i y_val = _mm_srai_epi16(r_val, 2);
|
||||
y_val = _mm_add_epi16(y_val, _mm_srai_epi16(g_val, 1));
|
||||
|
||||
@@ -149,6 +149,43 @@ static BOOL update_read_bitmap_data(rdpUpdate* update, wStream* s, BITMAP_DATA*
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL update_write_bitmap_data_header(const BITMAP_DATA* bitmapData, wStream* s)
|
||||
{
|
||||
WINPR_ASSERT(bitmapData);
|
||||
if (!Stream_EnsureRemainingCapacity(s, 18))
|
||||
return FALSE;
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destLeft));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destTop));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destRight));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destBottom));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->width));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->height));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->bitsPerPixel));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->flags));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->bitmapLength));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL update_write_bitmap_data_no_comp_header(const BITMAP_DATA* bitmapData, wStream* s)
|
||||
{
|
||||
WINPR_ASSERT(bitmapData);
|
||||
if (!Stream_EnsureRemainingCapacity(s, 8))
|
||||
return FALSE;
|
||||
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, bitmapData->cbCompFirstRowSize)); /* cbCompFirstRowSize (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, bitmapData->cbCompMainBodySize)); /* cbCompMainBodySize (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->cbScanWidth)); /* cbScanWidth (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, bitmapData->cbUncompressedSize)); /* cbUncompressedSize (2 bytes) */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL update_write_bitmap_data(rdpUpdate* update_pub, wStream* s, BITMAP_DATA* bitmapData)
|
||||
{
|
||||
rdp_update_internal* update = update_cast(update_pub);
|
||||
@@ -173,38 +210,20 @@ static BOOL update_write_bitmap_data(rdpUpdate* update_pub, wStream* s, BITMAP_D
|
||||
}
|
||||
}
|
||||
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destLeft));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destTop));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destRight));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->destBottom));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->width));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->height));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->bitsPerPixel));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->flags));
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, bitmapData->bitmapLength));
|
||||
if (!update_write_bitmap_data_header(bitmapData, s))
|
||||
return FALSE;
|
||||
|
||||
if (bitmapData->flags & BITMAP_COMPRESSION)
|
||||
{
|
||||
if (!(bitmapData->flags & NO_BITMAP_COMPRESSION_HDR))
|
||||
if ((bitmapData->flags & NO_BITMAP_COMPRESSION_HDR) == 0)
|
||||
{
|
||||
Stream_Write_UINT16(
|
||||
s,
|
||||
WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, bitmapData->cbCompFirstRowSize)); /* cbCompFirstRowSize (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s,
|
||||
WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, bitmapData->cbCompMainBodySize)); /* cbCompMainBodySize (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t,
|
||||
bitmapData->cbScanWidth)); /* cbScanWidth (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s,
|
||||
WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, bitmapData->cbUncompressedSize)); /* cbUncompressedSize (2 bytes) */
|
||||
if (!update_write_bitmap_data_no_comp_header(bitmapData, s))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Stream_EnsureRemainingCapacity(s, bitmapData->bitmapLength))
|
||||
return FALSE;
|
||||
Stream_Write(s, bitmapData->bitmapDataStream, bitmapData->bitmapLength);
|
||||
|
||||
return TRUE;
|
||||
@@ -2544,6 +2563,132 @@ static UINT16 update_calculate_new_or_existing_window(const WINDOW_ORDER_INFO* o
|
||||
return orderSize;
|
||||
}
|
||||
|
||||
static BOOL update_write_order_field_flags(UINT32 fieldFlags, const WINDOW_STATE_ORDER* stateOrder,
|
||||
wStream* s)
|
||||
{
|
||||
WINPR_ASSERT(stateOrder);
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_OWNER) != 0)
|
||||
Stream_Write_UINT32(s, stateOrder->ownerWindowId);
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_STYLE) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->style);
|
||||
Stream_Write_UINT32(s, stateOrder->extendedStyle);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_SHOW) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, stateOrder->showState));
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_TITLE) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, stateOrder->titleInfo.length);
|
||||
Stream_Write(s, stateOrder->titleInfo.string, stateOrder->titleInfo.length);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->clientOffsetX);
|
||||
Stream_Write_INT32(s, stateOrder->clientOffsetY);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->clientAreaWidth);
|
||||
Stream_Write_UINT32(s, stateOrder->clientAreaHeight);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_X) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginLeft);
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginRight);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginTop);
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginBottom);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, stateOrder->RPContent));
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->rootParentHandle);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->windowOffsetX);
|
||||
Stream_Write_INT32(s, stateOrder->windowOffsetY);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->windowClientDeltaX);
|
||||
Stream_Write_INT32(s, stateOrder->windowClientDeltaY);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->windowWidth);
|
||||
Stream_Write_UINT32(s, stateOrder->windowHeight);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, stateOrder->numWindowRects));
|
||||
Stream_Write(s, stateOrder->windowRects, stateOrder->numWindowRects * sizeof(RECTANGLE_16));
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->visibleOffsetX);
|
||||
Stream_Write_INT32(s, stateOrder->visibleOffsetY);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, stateOrder->numVisibilityRects));
|
||||
Stream_Write(s, stateOrder->visibilityRects,
|
||||
stateOrder->numVisibilityRects * sizeof(RECTANGLE_16));
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, stateOrder->OverlayDescription.length);
|
||||
Stream_Write(s, stateOrder->OverlayDescription.string,
|
||||
stateOrder->OverlayDescription.length);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_TASKBAR_BUTTON) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->TaskbarButton);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->EnforceServerZOrder);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_APPBAR_STATE) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->AppBarState);
|
||||
}
|
||||
|
||||
if ((fieldFlags & WINDOW_ORDER_FIELD_APPBAR_EDGE) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->AppBarEdge);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL update_send_new_or_existing_window(rdpContext* context,
|
||||
const WINDOW_ORDER_INFO* orderInfo,
|
||||
const WINDOW_STATE_ORDER* stateOrder)
|
||||
@@ -2573,123 +2718,8 @@ static BOOL update_send_new_or_existing_window(rdpContext* context,
|
||||
Stream_Write_UINT32(s, orderInfo->fieldFlags); /* FieldsPresentFlags (4 bytes) */
|
||||
Stream_Write_UINT32(s, orderInfo->windowId); /* WindowID (4 bytes) */
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OWNER) != 0)
|
||||
Stream_Write_UINT32(s, stateOrder->ownerWindowId);
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_STYLE) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->style);
|
||||
Stream_Write_UINT32(s, stateOrder->extendedStyle);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_SHOW) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, stateOrder->showState));
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TITLE) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, stateOrder->titleInfo.length);
|
||||
Stream_Write(s, stateOrder->titleInfo.string, stateOrder->titleInfo.length);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->clientOffsetX);
|
||||
Stream_Write_INT32(s, stateOrder->clientOffsetY);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->clientAreaWidth);
|
||||
Stream_Write_UINT32(s, stateOrder->clientAreaHeight);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_X) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginLeft);
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginRight);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginTop);
|
||||
Stream_Write_UINT32(s, stateOrder->resizeMarginBottom);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, stateOrder->RPContent));
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->rootParentHandle);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->windowOffsetX);
|
||||
Stream_Write_INT32(s, stateOrder->windowOffsetY);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->windowClientDeltaX);
|
||||
Stream_Write_INT32(s, stateOrder->windowClientDeltaY);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE) != 0)
|
||||
{
|
||||
Stream_Write_UINT32(s, stateOrder->windowWidth);
|
||||
Stream_Write_UINT32(s, stateOrder->windowHeight);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, stateOrder->numWindowRects));
|
||||
Stream_Write(s, stateOrder->windowRects, stateOrder->numWindowRects * sizeof(RECTANGLE_16));
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET) != 0)
|
||||
{
|
||||
Stream_Write_INT32(s, stateOrder->visibleOffsetX);
|
||||
Stream_Write_INT32(s, stateOrder->visibleOffsetY);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(uint16_t, stateOrder->numVisibilityRects));
|
||||
Stream_Write(s, stateOrder->visibilityRects,
|
||||
stateOrder->numVisibilityRects * sizeof(RECTANGLE_16));
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION) != 0)
|
||||
{
|
||||
Stream_Write_UINT16(s, stateOrder->OverlayDescription.length);
|
||||
Stream_Write(s, stateOrder->OverlayDescription.string,
|
||||
stateOrder->OverlayDescription.length);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TASKBAR_BUTTON) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->TaskbarButton);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->EnforceServerZOrder);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_STATE) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->AppBarState);
|
||||
}
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_EDGE) != 0)
|
||||
{
|
||||
Stream_Write_UINT8(s, stateOrder->AppBarEdge);
|
||||
}
|
||||
if (!update_write_order_field_flags(orderInfo->fieldFlags, stateOrder, s))
|
||||
return FALSE;
|
||||
|
||||
update->numberOrders++;
|
||||
return TRUE;
|
||||
@@ -2902,6 +2932,52 @@ static UINT16 update_calculate_new_or_existing_notification_icons_order(
|
||||
return orderSize;
|
||||
}
|
||||
|
||||
static BOOL update_send_new_or_existing_order_icon(const ICON_INFO* iconInfo, wStream* s)
|
||||
{
|
||||
WINPR_ASSERT(iconInfo);
|
||||
|
||||
if (!Stream_EnsureRemainingCapacity(s, 8))
|
||||
return FALSE;
|
||||
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->cacheEntry)); /* CacheEntry (2 bytes) */
|
||||
Stream_Write_UINT8(s,
|
||||
WINPR_ASSERTING_INT_CAST(uint8_t, iconInfo->cacheId)); /* CacheId (1 byte) */
|
||||
Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, iconInfo->bpp)); /* Bpp (1 byte) */
|
||||
Stream_Write_UINT16(s,
|
||||
WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->width)); /* Width (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->height)); /* Height (2 bytes) */
|
||||
|
||||
if (iconInfo->bpp <= 8)
|
||||
{
|
||||
if (!Stream_EnsureRemainingCapacity(s, 2))
|
||||
return FALSE;
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, iconInfo->cbColorTable)); /* CbColorTable (2 bytes) */
|
||||
}
|
||||
|
||||
if (!Stream_EnsureRemainingCapacity(s, 4ULL + iconInfo->cbBitsMask))
|
||||
return FALSE;
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->cbBitsMask)); /* CbBitsMask (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->cbBitsColor)); /* CbBitsColor (2 bytes) */
|
||||
Stream_Write(s, iconInfo->bitsMask, iconInfo->cbBitsMask); /* BitsMask (variable) */
|
||||
|
||||
if (iconInfo->bpp <= 8)
|
||||
{
|
||||
if (!Stream_EnsureRemainingCapacity(s, iconInfo->cbColorTable))
|
||||
return FALSE;
|
||||
Stream_Write(s, iconInfo->colorTable, iconInfo->cbColorTable); /* ColorTable (variable) */
|
||||
}
|
||||
|
||||
if (!Stream_EnsureRemainingCapacity(s, iconInfo->cbBitsColor))
|
||||
return FALSE;
|
||||
Stream_Write(s, iconInfo->bitsColor, iconInfo->cbBitsColor); /* BitsColor (variable) */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
update_send_new_or_existing_notification_icons(rdpContext* context,
|
||||
const WINDOW_ORDER_INFO* orderInfo,
|
||||
@@ -2974,37 +3050,10 @@ update_send_new_or_existing_notification_icons(rdpContext* context,
|
||||
|
||||
if ((orderInfo->fieldFlags & WINDOW_ORDER_ICON) != 0)
|
||||
{
|
||||
const ICON_INFO iconInfo = iconStateOrder->icon;
|
||||
const ICON_INFO* iconInfo = &iconStateOrder->icon;
|
||||
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo.cacheEntry)); /* CacheEntry (2 bytes) */
|
||||
Stream_Write_UINT8(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint8_t, iconInfo.cacheId)); /* CacheId (1 byte) */
|
||||
Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, iconInfo.bpp)); /* Bpp (1 byte) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo.width)); /* Width (2 bytes) */
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo.height)); /* Height (2 bytes) */
|
||||
|
||||
if (iconInfo.bpp <= 8)
|
||||
{
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t,
|
||||
iconInfo.cbColorTable)); /* CbColorTable (2 bytes) */
|
||||
}
|
||||
|
||||
Stream_Write_UINT16(
|
||||
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo.cbBitsMask)); /* CbBitsMask (2 bytes) */
|
||||
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(
|
||||
uint16_t, iconInfo.cbBitsColor)); /* CbBitsColor (2 bytes) */
|
||||
Stream_Write(s, iconInfo.bitsMask, iconInfo.cbBitsMask); /* BitsMask (variable) */
|
||||
|
||||
if (iconInfo.bpp <= 8)
|
||||
{
|
||||
Stream_Write(s, iconInfo.colorTable, iconInfo.cbColorTable); /* ColorTable (variable) */
|
||||
}
|
||||
|
||||
Stream_Write(s, iconInfo.bitsColor, iconInfo.cbBitsColor); /* BitsColor (variable) */
|
||||
if (!update_send_new_or_existing_order_icon(iconInfo, s))
|
||||
return FALSE;
|
||||
}
|
||||
else if ((orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON) != 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user