Merge pull request #11157 from akallabeth/function-size-fix

Function size refactor
This commit is contained in:
akallabeth
2025-02-11 11:50:29 +01:00
committed by GitHub
4 changed files with 1162 additions and 1077 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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;
}

View File

@@ -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));

View File

@@ -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)
{