Ejemplo n.º 1
0
void bitmap_cache_free(rdpBitmapCache* bitmap_cache)
{
    int i, j;
    rdpBitmap* bitmap;

    if (bitmap_cache != NULL)
    {
        for (i = 0; i < (int) bitmap_cache->maxCells; i++)
        {
            for (j = 0; j < (int) bitmap_cache->cells[i].number; j++)
            {
                bitmap = bitmap_cache->cells[i].entries[j];

                if (bitmap != NULL)
                {
                    Bitmap_Free(bitmap_cache->context, bitmap);
                }
            }

            xfree(bitmap_cache->cells[i].entries);
        }

        if (bitmap_cache->bitmap != NULL)
            Bitmap_Free(bitmap_cache->context, bitmap_cache->bitmap);

        xfree(bitmap_cache->cells);
        xfree(bitmap_cache);
    }
}
Ejemplo n.º 2
0
static BOOL update_gdi_cache_bitmap_v2(rdpContext* context,
				       CACHE_BITMAP_V2_ORDER* cacheBitmapV2)

{
	rdpBitmap* bitmap;
	rdpBitmap* prevBitmap;
	rdpCache* cache = context->cache;
	rdpSettings* settings = context->settings;
	bitmap = Bitmap_Alloc(context);

	if (!bitmap)
		return FALSE;

	if (!cacheBitmapV2->bitmapBpp)
		cacheBitmapV2->bitmapBpp = settings->ColorDepth;

	if ((settings->ColorDepth == 15) && (cacheBitmapV2->bitmapBpp == 16))
		cacheBitmapV2->bitmapBpp = settings->ColorDepth;

	Bitmap_SetDimensions(bitmap, cacheBitmapV2->bitmapWidth,
			     cacheBitmapV2->bitmapHeight);

	if (!bitmap->Decompress(context, bitmap,
				cacheBitmapV2->bitmapDataStream,
				cacheBitmapV2->bitmapWidth,
				cacheBitmapV2->bitmapHeight,
				cacheBitmapV2->bitmapBpp,
				cacheBitmapV2->bitmapLength,
				cacheBitmapV2->compressed,
				RDP_CODEC_ID_NONE))
	{
		Bitmap_Free(context, bitmap);
		return FALSE;
	}

	prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV2->cacheId,
				      cacheBitmapV2->cacheIndex);

	if (!bitmap->New(context, bitmap))
	{
		Bitmap_Free(context, bitmap);
		return FALSE;
	}

	Bitmap_Free(context, prevBitmap);
	return bitmap_cache_put(cache->bitmap, cacheBitmapV2->cacheId,
				cacheBitmapV2->cacheIndex, bitmap);
}
Ejemplo n.º 3
0
void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2)
{
    rdpBitmap* bitmap;
    rdpBitmap* prevBitmap;
    rdpCache* cache = context->cache;

    bitmap = Bitmap_Alloc(context);

    Bitmap_SetDimensions(context, bitmap, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight);

    if (cache_bitmap_v2->bitmapBpp == 0)
    {
        /* Workaround for Windows 8 bug where bitmapBpp is not set */
        cache_bitmap_v2->bitmapBpp = context->instance->settings->color_depth;
    }

    bitmap->Decompress(context, bitmap,
                       cache_bitmap_v2->bitmapDataStream, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight,
                       cache_bitmap_v2->bitmapBpp, cache_bitmap_v2->bitmapLength,
                       cache_bitmap_v2->compressed, CODEC_ID_NONE);

    bitmap->New(context, bitmap);

    prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex);

    if (prevBitmap != NULL)
        Bitmap_Free(context, prevBitmap);

    bitmap_cache_put(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex, bitmap);
}
Ejemplo n.º 4
0
void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3)
{
    rdpBitmap* bitmap;
    rdpBitmap* prevBitmap;
    rdpCache* cache = context->cache;
    BITMAP_DATA_EX* bitmapData = &cache_bitmap_v3->bitmapData;

    bitmap = Bitmap_Alloc(context);

    Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height);

    if (cache_bitmap_v3->bitmapData.bpp == 0)
    {
        /* Workaround for Windows 8 bug where bitmapBpp is not set */
        cache_bitmap_v3->bitmapData.bpp = context->instance->settings->color_depth;
    }

    bitmap->Decompress(context, bitmap,
                       bitmapData->data, bitmap->width, bitmap->height,
                       bitmapData->bpp, bitmapData->length, true,
                       bitmapData->codecID);

    bitmap->New(context, bitmap);

    prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v3->cacheId, cache_bitmap_v3->cacheIndex);

    if (prevBitmap != NULL)
        Bitmap_Free(context, prevBitmap);

    bitmap_cache_put(cache->bitmap, cache_bitmap_v3->cacheId, cache_bitmap_v3->cacheIndex, bitmap);
}
Ejemplo n.º 5
0
void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3)
{
	rdpBitmap* bitmap;
	rdpBitmap* prevBitmap;
	BOOL compressed = TRUE;
	rdpCache* cache = context->cache;
	rdpSettings* settings = context->settings;
	BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData;

	bitmap = Bitmap_Alloc(context);

	Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height);

	if (!cacheBitmapV3->bpp)
		cacheBitmapV3->bpp = settings->ColorDepth;

	compressed = (bitmapData->codecID != RDP_CODEC_ID_NONE);

	bitmap->Decompress(context, bitmap,
			bitmapData->data, bitmap->width, bitmap->height,
			bitmapData->bpp, bitmapData->length, compressed,
			bitmapData->codecID);

	bitmap->New(context, bitmap);

	prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex);

	if (prevBitmap)
		Bitmap_Free(context, prevBitmap);

	bitmap_cache_put(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex, bitmap);
}
Ejemplo n.º 6
0
BOOL gdi_bitmap_update(rdpContext* context,
                       const BITMAP_UPDATE* bitmapUpdate)
{
	UINT32 index;

	if (!context || !bitmapUpdate || !context->gdi || !context->codecs)
		return FALSE;

	for (index = 0; index < bitmapUpdate->number; index++)
	{
		const BITMAP_DATA* bitmap = &(bitmapUpdate->rectangles[index]);
		rdpBitmap* bmp = Bitmap_Alloc(context);

		if (!bmp)
			return FALSE;

		Bitmap_SetDimensions(bmp, bitmap->width, bitmap->height);
		Bitmap_SetRectangle(bmp, bitmap->destLeft, bitmap->destTop, bitmap->destRight,
		                    bitmap->destBottom);

		if (!bmp->Decompress(context, bmp, bitmap->bitmapDataStream,
		                     bitmap->width, bitmap->height, bitmap->bitsPerPixel,
		                     bitmap->bitmapLength, bitmap->compressed,
		                     RDP_CODEC_ID_NONE))
		{
			Bitmap_Free(context, bmp);
			return FALSE;
		}

		if (!bmp->New(context, bmp))
		{
			Bitmap_Free(context, bmp);
			return FALSE;
		}

		if (!bmp->Paint(context, bmp))
		{
			Bitmap_Free(context, bmp);
			return FALSE;
		}

		Bitmap_Free(context, bmp);
	}

	return TRUE;
}
Ejemplo n.º 7
0
static BOOL update_gdi_cache_bitmap(rdpContext* context,
				    const CACHE_BITMAP_ORDER* cacheBitmap)
{
	rdpBitmap* bitmap;
	rdpBitmap* prevBitmap;
	rdpCache* cache = context->cache;
	bitmap = Bitmap_Alloc(context);

	if (!bitmap)
		return FALSE;

	Bitmap_SetDimensions(bitmap, cacheBitmap->bitmapWidth,
			     cacheBitmap->bitmapHeight);

	if (!bitmap->Decompress(context, bitmap,
				cacheBitmap->bitmapDataStream, cacheBitmap->bitmapWidth,
				cacheBitmap->bitmapHeight,
				cacheBitmap->bitmapBpp, cacheBitmap->bitmapLength,
				cacheBitmap->compressed, RDP_CODEC_ID_NONE))
	{
		Bitmap_Free(context, bitmap);
		return FALSE;
	}

	if (!bitmap->New(context, bitmap))
	{
		Bitmap_Free(context, bitmap);
		return FALSE;
	}

	prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmap->cacheId,
				      cacheBitmap->cacheIndex);
	Bitmap_Free(context, prevBitmap);
	return bitmap_cache_put(cache->bitmap, cacheBitmap->cacheId,
				cacheBitmap->cacheIndex,
				bitmap);
}
Ejemplo n.º 8
0
void offscreen_cache_delete(rdpOffscreenCache* offscreen, uint32 index)
{
	rdpBitmap* prevBitmap;

	if (index >= offscreen->maxEntries)
	{
		printf("invalid offscreen bitmap index (delete): 0x%04X\n", index);
		return;
	}

	prevBitmap = offscreen->entries[index];

	if (prevBitmap != NULL)
		Bitmap_Free(offscreen->update->context, prevBitmap);

	offscreen->entries[index] = NULL;
}
Ejemplo n.º 9
0
void offscreen_cache_delete(rdpOffscreenCache* offscreenCache, UINT32 index)
{
	rdpBitmap* prevBitmap;

	if (index >= offscreenCache->maxEntries)
	{
		WLog_ERR(TAG,  "invalid offscreen bitmap index (delete): 0x%04X", index);
		return;
	}

	prevBitmap = offscreenCache->entries[index];

	if (prevBitmap != NULL)
		Bitmap_Free(offscreenCache->update->context, prevBitmap);

	offscreenCache->entries[index] = NULL;
}
Ejemplo n.º 10
0
void offscreen_cache_free(rdpOffscreenCache* offscreen_cache)
{
	int i;
	rdpBitmap* bitmap;

	if (offscreen_cache != NULL)
	{
		for (i = 0; i < offscreen_cache->maxEntries; i++)
		{
			bitmap = offscreen_cache->entries[i];

			if (bitmap != NULL)
				Bitmap_Free(offscreen_cache->update->context, bitmap);
		}

		xfree(offscreen_cache->entries);
		xfree(offscreen_cache);
	}
}
Ejemplo n.º 11
0
void bitmap_cache_free(rdpBitmapCache* bitmapCache)
{
	int i, j;
	rdpBitmap* bitmap;

	if (bitmapCache)
	{
		for (i = 0; i < (int) bitmapCache->maxCells; i++)
		{
			for (j = 0; j < (int) bitmapCache->cells[i].number + 1; j++)
			{
				bitmap = bitmapCache->cells[i].entries[j];
				Bitmap_Free(bitmapCache->context, bitmap);
			}

			free(bitmapCache->cells[i].entries);
		}

		free(bitmapCache->cells);
		free(bitmapCache);
	}
}
Ejemplo n.º 12
0
void update_gdi_create_offscreen_bitmap(rdpUpdate* update, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap)
{
	rdpBitmap* bitmap;
	rdpBitmap* prevBitmap;
	rdpCache* cache = update->context->cache;

	bitmap = Bitmap_Alloc(update->context);

	bitmap->width = create_offscreen_bitmap->cx;
	bitmap->height = create_offscreen_bitmap->cy;

	bitmap->New(update->context, bitmap);

	prevBitmap = offscreen_cache_get(cache->offscreen, create_offscreen_bitmap->id);

	if (prevBitmap != NULL)
		Bitmap_Free(update->context, prevBitmap);

	offscreen_cache_put(cache->offscreen, create_offscreen_bitmap->id, bitmap);

	if(cache->offscreen->currentSurface == create_offscreen_bitmap->id)
		Bitmap_SetSurface(update->context, bitmap, False);
}
Ejemplo n.º 13
0
void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap)
{
    rdpBitmap* bitmap;
    rdpBitmap* prevBitmap;
    rdpCache* cache = context->cache;

    bitmap = Bitmap_Alloc(context);

    Bitmap_SetDimensions(context, bitmap, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight);

    bitmap->Decompress(context, bitmap,
                       cache_bitmap->bitmapDataStream, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight,
                       cache_bitmap->bitmapBpp, cache_bitmap->bitmapLength,
                       cache_bitmap->compressed, CODEC_ID_NONE);

    bitmap->New(context, bitmap);

    prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex);

    if (prevBitmap != NULL)
        Bitmap_Free(context, prevBitmap);

    bitmap_cache_put(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex, bitmap);
}
Ejemplo n.º 14
0
void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3)
{
	rdpBitmap* bitmap;
	rdpBitmap* prevBitmap;
	BOOL isCompressed = TRUE;
	rdpCache* cache = context->cache;
	BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData;

	bitmap = Bitmap_Alloc(context);

	Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height);

	if (cacheBitmapV3->bitmapData.bpp == 0)
	{
		/* Workaround for Windows 8 bug where bitmapBpp is not set */
		cacheBitmapV3->bitmapData.bpp = context->instance->settings->ColorDepth;
	}

	/* According to http://msdn.microsoft.com/en-us/library/gg441209.aspx
	 * CACHE_BITMAP_REV3_ORDER::bitmapData::codecID = 0x00 (uncompressed) */
	isCompressed = (bitmapData->codecID != RDP_CODEC_ID_NONE);

	bitmap->Decompress(context, bitmap,
			bitmapData->data, bitmap->width, bitmap->height,
			bitmapData->bpp, bitmapData->length, isCompressed,
			bitmapData->codecID);

	bitmap->New(context, bitmap);

	prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex);

	if (prevBitmap)
		Bitmap_Free(context, prevBitmap);

	bitmap_cache_put(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex, bitmap);
}
Ejemplo n.º 15
0
void	Scene_Raytrace_Cmd(int argc, char *argv[])
{
#ifndef _S2_DONT_INCLUDE_GL
	int x, y;
	int width, height;
	float ratio_x, ratio_y;
	bitmap_t bmp;
	float msec;


	if (!scene_cam)
		return;

	if (argc < 2)
	{
		width = 640;
		height = 480;
	}
	else
	{
		width = atoi(argv[0]);
		height = atoi(argv[1]);
	}

	ratio_x = scene_cam->width / (float)width;
	ratio_y = scene_cam->height / (float)height;

	Bitmap_Alloc(&bmp, width, height, BITMAP_RGBA);

	msec = System_Milliseconds();

	for (y=0; y<height; y++)
	{

		for (x=0; x<width; x++)
		{

			vec3_t dir;
			vec3_t end;
			float light;
			traceinfo_t trace;

			Cam_ConstructRay(scene_cam, (float)x*ratio_x, (float)y*ratio_y, dir);
			M_PointOnLine(scene_cam->origin, dir, gfx_farclip.value, end);
			WT_TraceBox_Client(&trace, scene_cam->origin, end, zero_vec, zero_vec, 0);//SURF_TERRAIN);
			if (trace.fraction < 1)
			{
				if (argc == 3)
					light = trace.fraction;
				else
					light = ABS(M_DotProduct(trace.normal, scene_cam->viewaxis[AXIS_FORWARD]));
			}
			else
			{
				light = 0;
			}
			Bitmap_SetPixel4b(&bmp, x, y, (byte)((trace.flags & SURF_TERRAIN) ? 0 : 255)*light, (byte)((trace.flags & SURF_FOLIAGE) ? 255 : 0)*light, (byte)((trace.flags & SURF_TERRAIN) ? 255 : 0)*light, 255);
		}
	
	}

	Console_Printf("raytrace took %f msec\n", System_Milliseconds() - msec);

	Bitmap_WritePNG("raytrace.png", &bmp);

	Bitmap_Free(&bmp);
#endif
}