Fixed #7745: Progressive surface cleanup

This commit is contained in:
Armin Novak 2022-04-06 10:10:07 +02:00 committed by akallabeth
parent 66c7228643
commit edcb8284e7

View File

@ -365,13 +365,11 @@ static INLINE PROGRESSIVE_SURFACE_CONTEXT*
progressive_get_surface_data(PROGRESSIVE_CONTEXT* progressive, UINT16 surfaceId) progressive_get_surface_data(PROGRESSIVE_CONTEXT* progressive, UINT16 surfaceId)
{ {
void* key = (void*)(((ULONG_PTR)surfaceId) + 1); void* key = (void*)(((ULONG_PTR)surfaceId) + 1);
void* pData = NULL;
if (!progressive) if (!progressive)
return NULL; return NULL;
pData = HashTable_GetItemValue(progressive->SurfaceContexts, key); return HashTable_GetItemValue(progressive->SurfaceContexts, key);
return pData;
} }
static void progressive_tile_free(RFX_PROGRESSIVE_TILE* tile) static void progressive_tile_free(RFX_PROGRESSIVE_TILE* tile)
@ -384,10 +382,14 @@ static void progressive_tile_free(RFX_PROGRESSIVE_TILE* tile)
} }
} }
static void progressive_surface_context_free(PROGRESSIVE_SURFACE_CONTEXT* surface) static void progressive_surface_context_free(void* ptr)
{ {
PROGRESSIVE_SURFACE_CONTEXT* surface = ptr;
UINT32 index; UINT32 index;
if (!surface)
return;
for (index = 0; index < surface->gridSize; index++) for (index = 0; index < surface->gridSize; index++)
{ {
RFX_PROGRESSIVE_TILE* tile = &(surface->tiles[index]); RFX_PROGRESSIVE_TILE* tile = &(surface->tiles[index]);
@ -609,13 +611,7 @@ INT32 progressive_create_surface_context(PROGRESSIVE_CONTEXT* progressive, UINT1
int progressive_delete_surface_context(PROGRESSIVE_CONTEXT* progressive, UINT16 surfaceId) int progressive_delete_surface_context(PROGRESSIVE_CONTEXT* progressive, UINT16 surfaceId)
{ {
PROGRESSIVE_SURFACE_CONTEXT* surface = progressive_get_surface_data(progressive, surfaceId); progressive_set_surface_data(progressive, surfaceId, NULL);
if (surface)
{
progressive_set_surface_data(progressive, surfaceId, NULL);
progressive_surface_context_free(surface);
}
return 1; return 1;
} }
@ -1110,7 +1106,7 @@ static INLINE INT16 progressive_rfx_srl_read(RFX_PROGRESSIVE_UPGRADE_STATE* stat
if (k) if (k)
{ {
bs->mask = ((1 << k) - 1); bs->mask = ((1 << k) - 1);
state->nz = ((bs->accumulator >> (32 - k)) & bs->mask); state->nz = ((bs->accumulator >> (32u - k)) & bs->mask);
BitStream_Shift(bs, k); BitStream_Shift(bs, k);
} }
@ -1661,6 +1657,9 @@ static void CALLBACK progressive_process_tiles_tile_work_callback(PTP_CALLBACK_I
{ {
PROGRESSIVE_TILE_PROCESS_WORK_PARAM* param = (PROGRESSIVE_TILE_PROCESS_WORK_PARAM*)context; PROGRESSIVE_TILE_PROCESS_WORK_PARAM* param = (PROGRESSIVE_TILE_PROCESS_WORK_PARAM*)context;
WINPR_UNUSED(instance);
WINPR_UNUSED(work);
switch (param->tile->blockType) switch (param->tile->blockType)
{ {
case PROGRESSIVE_WBT_TILE_SIMPLE: case PROGRESSIVE_WBT_TILE_SIMPLE:
@ -1939,11 +1938,11 @@ static INLINE BOOL progressive_write_region(PROGRESSIVE_CONTEXT* progressive, wS
for (i = 0, qv = msg->quantVals; i < msg->numQuant; i++, qv += 10) for (i = 0, qv = msg->quantVals; i < msg->numQuant; i++, qv += 10)
{ {
/* RFX_COMPONENT_CODEC_QUANT */ /* RFX_COMPONENT_CODEC_QUANT */
Stream_Write_UINT8(s, qv[0] + (qv[2] << 4)); /* LL3 (4-bit), HL3 (4-bit) */ Stream_Write_UINT8(s, (UINT8)(qv[0] + (qv[2] << 4))); /* LL3 (4-bit), HL3 (4-bit) */
Stream_Write_UINT8(s, qv[1] + (qv[3] << 4)); /* LH3 (4-bit), HH3 (4-bit) */ Stream_Write_UINT8(s, (UINT8)(qv[1] + (qv[3] << 4))); /* LH3 (4-bit), HH3 (4-bit) */
Stream_Write_UINT8(s, qv[5] + (qv[4] << 4)); /* HL2 (4-bit), LH2 (4-bit) */ Stream_Write_UINT8(s, (UINT8)(qv[5] + (qv[4] << 4))); /* HL2 (4-bit), LH2 (4-bit) */
Stream_Write_UINT8(s, qv[6] + (qv[8] << 4)); /* HH2 (4-bit), HL1 (4-bit) */ Stream_Write_UINT8(s, (UINT8)(qv[6] + (qv[8] << 4))); /* HH2 (4-bit), HL1 (4-bit) */
Stream_Write_UINT8(s, qv[7] + (qv[9] << 4)); /* LH1 (4-bit), HH1 (4-bit) */ Stream_Write_UINT8(s, (UINT8)(qv[7] + (qv[9] << 4))); /* LH1 (4-bit), HH1 (4-bit) */
} }
return TRUE; return TRUE;
} }
@ -2545,8 +2544,8 @@ INT32 progressive_decompress(PROGRESSIVE_CONTEXT* progressive, const BYTE* pSrcD
{ {
RECTANGLE_16 clippingRect; RECTANGLE_16 clippingRect;
const RFX_RECT* rect = &(region->rects[i]); const RFX_RECT* rect = &(region->rects[i]);
clippingRect.left = nXDst + rect->x; clippingRect.left = (UINT16)nXDst + rect->x;
clippingRect.top = nYDst + rect->y; clippingRect.top = (UINT16)nYDst + rect->y;
clippingRect.right = clippingRect.left + rect->width; clippingRect.right = clippingRect.left + rect->width;
clippingRect.bottom = clippingRect.top + rect->height; clippingRect.bottom = clippingRect.top + rect->height;
region16_union_rect(&clippingRects, &clippingRects, &clippingRect); region16_union_rect(&clippingRects, &clippingRects, &clippingRect);
@ -2796,6 +2795,11 @@ PROGRESSIVE_CONTEXT* progressive_context_new(BOOL Compressor)
if (!progressive->SurfaceContexts) if (!progressive->SurfaceContexts)
goto fail; goto fail;
{
wObject* obj = HashTable_ValueObject(progressive->SurfaceContexts);
WINPR_ASSERT(obj);
obj->fnObjectFree = progressive_surface_context_free;
}
return progressive; return progressive;
fail: fail:
progressive_context_free(progressive); progressive_context_free(progressive);
@ -2804,11 +2808,6 @@ fail:
void progressive_context_free(PROGRESSIVE_CONTEXT* progressive) void progressive_context_free(PROGRESSIVE_CONTEXT* progressive)
{ {
int count;
int index;
ULONG_PTR* pKeys = NULL;
PROGRESSIVE_SURFACE_CONTEXT* surface;
if (!progressive) if (!progressive)
return; return;
@ -2817,21 +2816,7 @@ void progressive_context_free(PROGRESSIVE_CONTEXT* progressive)
rfx_context_free(progressive->rfx_context); rfx_context_free(progressive->rfx_context);
BufferPool_Free(progressive->bufferPool); BufferPool_Free(progressive->bufferPool);
HashTable_Free(progressive->SurfaceContexts);
if (progressive->SurfaceContexts)
{
count = HashTable_GetKeys(progressive->SurfaceContexts, &pKeys);
for (index = 0; index < count; index++)
{
surface = (PROGRESSIVE_SURFACE_CONTEXT*)HashTable_GetItemValue(
progressive->SurfaceContexts, (void*)pKeys[index]);
progressive_surface_context_free(surface);
}
free(pKeys);
HashTable_Free(progressive->SurfaceContexts);
}
free(progressive); free(progressive);
} }