Blame libfreerdp/gdi/test/TestGdiClip.c

Packit Service fa4841
Packit Service fa4841
#include <freerdp/gdi/gdi.h>
Packit Service fa4841
Packit Service fa4841
#include <freerdp/gdi/dc.h>
Packit Service fa4841
#include <freerdp/gdi/pen.h>
Packit Service fa4841
#include <freerdp/gdi/region.h>
Packit Service fa4841
#include <freerdp/gdi/bitmap.h>
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
Packit Service fa4841
#include "line.h"
Packit Service fa4841
#include "brush.h"
Packit Service fa4841
#include "clipping.h"
Packit Service fa4841
Packit Service fa4841
static int test_gdi_ClipCoords(void)
Packit Service fa4841
{
Packit Service fa4841
	int rc = -1;
Packit Service fa4841
	BOOL draw;
Packit Service fa4841
	HGDI_DC hdc;
Packit Service fa4841
	HGDI_RGN rgn1 = NULL;
Packit Service fa4841
	HGDI_RGN rgn2 = NULL;
Packit Service fa4841
	HGDI_BITMAP bmp = NULL;
Packit Service fa4841
	const UINT32 format = PIXEL_FORMAT_ARGB32;
Packit Service fa4841
Packit Service fa4841
	if (!(hdc = gdi_GetDC()))
Packit Service fa4841
	{
Packit Service fa4841
		printf("failed to get gdi device context\n");
Packit Service fa4841
		return -1;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	hdc->format = format;
Packit Service fa4841
	bmp = gdi_CreateBitmapEx(1024, 768, PIXEL_FORMAT_XRGB32, 0, NULL, NULL);
Packit Service b1ea74
	gdi_SelectObject(hdc, (HGDIOBJECT)bmp);
Packit Service fa4841
	gdi_SetNullClipRgn(hdc);
Packit Service fa4841
	rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
Packit Service fa4841
	rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
Packit Service fa4841
	rgn1->null = TRUE;
Packit Service fa4841
	rgn2->null = TRUE;
Packit Service fa4841
	/* null clipping region */
Packit Service fa4841
	gdi_SetNullClipRgn(hdc);
Packit Service fa4841
	gdi_SetRgn(rgn1, 20, 20, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 20, 20, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* region all inside clipping region */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 0, 0, 1024, 768);
Packit Service fa4841
	gdi_SetRgn(rgn1, 20, 20, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 20, 20, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* region all outside clipping region, on the left */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 20, 20, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 0, 0, 0, 0);
Packit Service b1ea74
	draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (draw)
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* region all outside clipping region, on the right */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 420, 420, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 0, 0, 0, 0);
Packit Service b1ea74
	draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (draw)
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* region all outside clipping region, on top */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 20, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 0, 0, 0, 0);
Packit Service b1ea74
	draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (draw)
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* region all outside clipping region, at the bottom */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 420, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 0, 0, 0, 0);
Packit Service b1ea74
	draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (draw)
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* left outside, right = clip, top = clip, bottom = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 100, 300, 300, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* left outside, right inside, top = clip, bottom = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 100, 300, 250, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 50, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* left = clip, right outside, top = clip, bottom = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 300, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* left inside, right outside, top = clip, bottom = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 350, 300, 200, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 350, 300, 50, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* top outside, bottom = clip, left = clip, right = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 100, 300, 300);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* top = clip, bottom outside, left = clip, right = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 100, 200);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* top = clip, bottom = clip, top = clip, bottom = clip */
Packit Service fa4841
	gdi_SetClipRgn(hdc, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(rgn1, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	rc = 0;
Packit Service fa4841
fail:
Packit Service fa4841
	gdi_DeleteObject((HGDIOBJECT)rgn1);
Packit Service fa4841
	gdi_DeleteObject((HGDIOBJECT)rgn2);
Packit Service fa4841
	gdi_DeleteObject((HGDIOBJECT)bmp);
Packit Service fa4841
	gdi_DeleteDC(hdc);
Packit Service fa4841
	return rc;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static int test_gdi_InvalidateRegion(void)
Packit Service fa4841
{
Packit Service fa4841
	int rc = -1;
Packit Service fa4841
	HGDI_DC hdc;
Packit Service fa4841
	HGDI_RGN rgn1 = NULL;
Packit Service fa4841
	HGDI_RGN rgn2 = NULL;
Packit Service fa4841
	HGDI_RGN invalid = NULL;
Packit Service fa4841
	HGDI_BITMAP bmp = NULL;
Packit Service fa4841
	const UINT32 format = PIXEL_FORMAT_XRGB32;
Packit Service fa4841
Packit Service fa4841
	if (!(hdc = gdi_GetDC()))
Packit Service fa4841
	{
Packit Service fa4841
		printf("failed to get gdi device context\n");
Packit Service fa4841
		return -1;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	hdc->format = format;
Packit Service fa4841
	bmp = gdi_CreateBitmapEx(1024, 768, PIXEL_FORMAT_XRGB32, 0, NULL, NULL);
Packit Service b1ea74
	gdi_SelectObject(hdc, (HGDIOBJECT)bmp);
Packit Service fa4841
	gdi_SetNullClipRgn(hdc);
Packit Service b1ea74
	hdc->hwnd = (HGDI_WND)calloc(1, sizeof(GDI_WND));
Packit Service fa4841
	hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
Packit Service fa4841
	hdc->hwnd->invalid->null = TRUE;
Packit Service fa4841
	invalid = hdc->hwnd->invalid;
Packit Service fa4841
	hdc->hwnd->count = 16;
Packit Service b1ea74
	hdc->hwnd->cinvalid = (HGDI_RGN)calloc(hdc->hwnd->count, sizeof(GDI_RGN));
Packit Service fa4841
	rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
Packit Service fa4841
	rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
Packit Service fa4841
	rgn1->null = TRUE;
Packit Service fa4841
	rgn2->null = TRUE;
Packit Service fa4841
	/* no previous invalid region */
Packit Service fa4841
	invalid->null = TRUE;
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* region same as invalid region */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 100);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* left outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 100, 300, 300, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 100, 300, 300, 100);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* right outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 300, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 300, 100);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* top outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 100, 100, 300);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 100, 100, 300);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* bottom outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 300, 100, 300);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 300);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* left outside, right outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 100, 300, 600, 300);
Packit Service fa4841
	gdi_SetRgn(rgn2, 100, 300, 600, 300);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* top outside, bottom outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 100, 100, 500);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 100, 100, 500);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* all outside, left */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 100, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 100, 300, 300, 100);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* all outside, right */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 700, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 500, 100);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* all outside, top */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 100, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 100, 100, 300);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* all outside, bottom */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 300, 500, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn2, 300, 300, 100, 300);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* all outside */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 100, 100, 600, 600);
Packit Service fa4841
	gdi_SetRgn(rgn2, 100, 100, 600, 600);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	/* everything */
Packit Service fa4841
	gdi_SetRgn(invalid, 300, 300, 100, 100);
Packit Service fa4841
	gdi_SetRgn(rgn1, 0, 0, 1024, 768);
Packit Service fa4841
	gdi_SetRgn(rgn2, 0, 0, 1024, 768);
Packit Service fa4841
	gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi_EqualRgn(invalid, rgn2))
Packit Service fa4841
		goto fail;
Packit Service fa4841
Packit Service fa4841
	rc = 0;
Packit Service fa4841
fail:
Packit Service fa4841
	gdi_DeleteObject((HGDIOBJECT)rgn1);
Packit Service fa4841
	gdi_DeleteObject((HGDIOBJECT)rgn2);
Packit Service fa4841
	gdi_DeleteObject((HGDIOBJECT)bmp);
Packit Service fa4841
	gdi_DeleteDC(hdc);
Packit Service fa4841
	return 0;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
int TestGdiClip(int argc, char* argv[])
Packit Service fa4841
{
Packit Service b1ea74
	WINPR_UNUSED(argc);
Packit Service b1ea74
	WINPR_UNUSED(argv);
Packit Service fa4841
	fprintf(stderr, "test_gdi_ClipCoords()\n");
Packit Service fa4841
Packit Service fa4841
	if (test_gdi_ClipCoords() < 0)
Packit Service fa4841
		return -1;
Packit Service fa4841
Packit Service fa4841
	fprintf(stderr, "test_gdi_InvalidateRegion()\n");
Packit Service fa4841
Packit Service fa4841
	if (test_gdi_InvalidateRegion() < 0)
Packit Service fa4841
		return -1;
Packit Service fa4841
Packit Service fa4841
	return 0;
Packit Service fa4841
}