static BOOL gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { rdpGdi* gdi = context->gdi; if (bounds) { gdi_SetClipRgn(gdi->drawing->hdc, bounds->left, bounds->top, bounds->right - bounds->left + 1, bounds->bottom - bounds->top + 1); } else { gdi_SetNullClipRgn(gdi->drawing->hdc); } return TRUE; }
static BOOL gdi_Glyph_BeginDraw(rdpContext* context, UINT32 x, UINT32 y, UINT32 width, UINT32 height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) { rdpGdi* gdi; if (!context || !context->gdi) return FALSE; gdi = context->gdi; if (!gdi->drawing || !gdi->drawing->hdc) return FALSE; if (!gdi_decode_color(gdi, bgcolor, &bgcolor, NULL)) return FALSE; if (!gdi_decode_color(gdi, fgcolor, &fgcolor, NULL)) return FALSE; gdi_SetTextColor(gdi->drawing->hdc, bgcolor); gdi_SetBkColor(gdi->drawing->hdc, fgcolor); if (1) { GDI_RECT rect = { 0 }; HGDI_BRUSH brush = gdi_CreateSolidBrush(fgcolor); if (!brush) return FALSE; if (x > 0) rect.left = x; if (y > 0) rect.top = y; rect.right = x + width - 1; rect.bottom = y + height - 1; if ((x + width > rect.left) && (y + height > rect.top)) gdi_FillRect(gdi->drawing->hdc, &rect, brush); gdi_DeleteObject((HGDIOBJECT)brush); } return gdi_SetClipRgn(gdi->drawing->hdc, x, y, width, height); }
static BOOL test_line(HGDI_DC hdc, const gdiPalette* hPalette, UINT32 mX, UINT32 mY, UINT32 lX, UINT32 lY, HGDI_BITMAP hBmp, HGDI_BITMAP hOrgBmp, UINT32 cX, UINT32 cY, UINT32 cW, UINT32 cH) { if (!gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS, hPalette)) return FALSE; if ((cX > 0) || (cY > 0) || (cW > 0) || (cH > 0)) gdi_SetClipRgn(hdc, cX, cY, cW, cH); gdi_MoveToEx(hdc, mX, mY, NULL); gdi_LineTo(hdc, lX, lY); if (!test_assert_bitmaps_equal(hBmp, hOrgBmp, "Case 10", hPalette)) return FALSE; return TRUE; }
static void gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) { int i, j; int tx, ty; BYTE* pSrcData; BYTE* pDstData; RFX_MESSAGE* message; rdpGdi* gdi = context->gdi; DEBUG_GDI("destLeft %d destTop %d destRight %d destBottom %d " "bpp %d codecID %d width %d height %d length %d", cmd->destLeft, cmd->destTop, cmd->destRight, cmd->destBottom, cmd->bpp, cmd->codecID, cmd->width, cmd->height, cmd->bitmapDataLength); if (cmd->codecID == RDP_CODEC_ID_REMOTEFX) { freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_REMOTEFX); message = rfx_process_message(gdi->codecs->rfx, cmd->bitmapData, cmd->bitmapDataLength); /* blit each tile */ for (i = 0; i < message->numTiles; i++) { tx = message->tiles[i]->x + cmd->destLeft; ty = message->tiles[i]->y + cmd->destTop; pSrcData = message->tiles[i]->data; pDstData = gdi->tile->bitmap->data; if (!gdi->invert && (gdi->dstBpp == 32)) { gdi->tile->bitmap->data = pSrcData; } else { freerdp_image_copy(pDstData, gdi->format, -1, 0, 0, 64, 64, pSrcData, PIXEL_FORMAT_XRGB32, -1, 0, 0, gdi->palette); } for (j = 0; j < message->numRects; j++) { gdi_SetClipRgn(gdi->primary->hdc, cmd->destLeft + message->rects[j].x, cmd->destTop + message->rects[j].y, message->rects[j].width, message->rects[j].height); gdi_BitBlt(gdi->primary->hdc, tx, ty, 64, 64, gdi->tile->hdc, 0, 0, GDI_SRCCOPY); } gdi->tile->bitmap->data = pDstData; } gdi_SetNullClipRgn(gdi->primary->hdc); rfx_message_free(gdi->codecs->rfx, message); } else if (cmd->codecID == RDP_CODEC_ID_NSCODEC) { freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_NSCODEC); nsc_process_message(gdi->codecs->nsc, cmd->bpp, cmd->width, cmd->height, cmd->bitmapData, cmd->bitmapDataLength); if (gdi->bitmap_size < (cmd->width * cmd->height * 4)) { gdi->bitmap_size = cmd->width * cmd->height * 4; gdi->bitmap_buffer = (BYTE*) _aligned_realloc(gdi->bitmap_buffer, gdi->bitmap_size, 16); if (!gdi->bitmap_buffer) return; } pDstData = gdi->bitmap_buffer; pSrcData = gdi->codecs->nsc->BitmapData; freerdp_image_copy(pDstData, gdi->format, -1, 0, 0, cmd->width, cmd->height, pSrcData, PIXEL_FORMAT_XRGB32_VF, -1, 0, 0, gdi->palette); gdi->image->bitmap->width = cmd->width; gdi->image->bitmap->height = cmd->height; gdi->image->bitmap->bitsPerPixel = cmd->bpp; gdi->image->bitmap->bytesPerPixel = cmd->bpp / 8; gdi->image->bitmap->data = gdi->bitmap_buffer; gdi_BitBlt(gdi->primary->hdc, cmd->destLeft, cmd->destTop, cmd->width, cmd->height, gdi->image->hdc, 0, 0, GDI_SRCCOPY); } else if (cmd->codecID == RDP_CODEC_ID_NONE) { if (gdi->bitmap_size < (cmd->width * cmd->height * 4)) { gdi->bitmap_size = cmd->width * cmd->height * 4; gdi->bitmap_buffer = (BYTE*) _aligned_realloc(gdi->bitmap_buffer, gdi->bitmap_size, 16); if (!gdi->bitmap_buffer) return; } pDstData = gdi->bitmap_buffer; pSrcData = cmd->bitmapData; freerdp_image_copy(pDstData, gdi->format, -1, 0, 0, cmd->width, cmd->height, pSrcData, PIXEL_FORMAT_XRGB32_VF, -1, 0, 0, gdi->palette); gdi->image->bitmap->width = cmd->width; gdi->image->bitmap->height = cmd->height; gdi->image->bitmap->bitsPerPixel = cmd->bpp; gdi->image->bitmap->bytesPerPixel = cmd->bpp / 8; gdi->image->bitmap->data = gdi->bitmap_buffer; gdi_BitBlt(gdi->primary->hdc, cmd->destLeft, cmd->destTop, cmd->width, cmd->height, gdi->image->hdc, 0, 0, GDI_SRCCOPY); } else { WLog_ERR(TAG, "Unsupported codecID %d", cmd->codecID); } }
int TestGdiLine(int argc, char* argv[]) { int rc = -1; UINT32 x, i; gdiPalette g; const UINT32 RawFormat = PIXEL_FORMAT_RGB8; const UINT32 colorFormats[] = { PIXEL_FORMAT_RGB15, PIXEL_FORMAT_ARGB15, PIXEL_FORMAT_RGB16, PIXEL_FORMAT_RGB24, PIXEL_FORMAT_ARGB32, PIXEL_FORMAT_XRGB32, PIXEL_FORMAT_RGBA32, PIXEL_FORMAT_RGBX32, PIXEL_FORMAT_BGR15, PIXEL_FORMAT_ABGR15, PIXEL_FORMAT_BGR16, PIXEL_FORMAT_BGR24, PIXEL_FORMAT_ABGR32, PIXEL_FORMAT_XBGR32, PIXEL_FORMAT_BGRA32, PIXEL_FORMAT_BGRX32 }; const UINT32 number_formats = sizeof(colorFormats) / sizeof(colorFormats[0]); for (i = 0; i < number_formats; i++) { HGDI_DC hdc = NULL; HGDI_PEN pen = NULL; HGDI_BITMAP hBmp = NULL; struct ropMap rop_map[] = { {GDI_R2_BLACK, NULL, line_to_R2_BLACK}, {GDI_R2_NOTMERGEPEN, NULL, line_to_R2_NOTMERGEPEN}, {GDI_R2_MASKNOTPEN, NULL, line_to_R2_MASKNOTPEN}, {GDI_R2_NOTCOPYPEN, NULL, line_to_R2_NOTCOPYPEN}, {GDI_R2_MASKPENNOT, NULL, line_to_R2_MASKPENNOT}, {GDI_R2_NOT, NULL, line_to_R2_NOT}, {GDI_R2_XORPEN, NULL, line_to_R2_XORPEN}, {GDI_R2_NOTMASKPEN, NULL, line_to_R2_NOTMASKPEN}, {GDI_R2_MASKPEN, NULL, line_to_R2_MASKPEN}, {GDI_R2_NOTXORPEN, NULL, line_to_R2_NOTXORPEN}, {GDI_R2_NOP, NULL, line_to_R2_NOP}, {GDI_R2_MERGENOTPEN, NULL, line_to_R2_MERGENOTPEN}, {GDI_R2_COPYPEN, NULL, line_to_R2_COPYPEN}, {GDI_R2_MERGEPENNOT, NULL, line_to_R2_MERGEPENNOT}, {GDI_R2_MERGEPEN, NULL, line_to_R2_MERGEPEN}, {GDI_R2_WHITE, NULL, line_to_R2_WHITE} }; const UINT32 map_size = sizeof(rop_map) / sizeof(rop_map[0]); HGDI_BITMAP hBmp_LineTo[LINTETO_NUMBER] = {NULL}; gdiPalette* hPalette = &g; UINT32 penColor; const UINT32 format = colorFormats[i]; g.format = format; for (i = 0; i < 256; i++) g.palette[i] = GetColor(format, i, i, i, 0xFF); rc = -1; if (!(hdc = gdi_GetDC())) { printf("failed to get gdi device context\n"); goto fail; } hdc->format = format; gdi_SetNullClipRgn(hdc); penColor = GetColor(format, 0xFF, 0xFF, 0xFF, 0xFF); if (!(pen = gdi_CreatePen(1, 1, penColor, format, hPalette))) { printf("gdi_CreatePen failed\n"); goto fail; } gdi_SelectObject(hdc, (HGDIOBJECT) pen); hBmp = gdi_CreateCompatibleBitmap(hdc, 16, 16); gdi_SelectObject(hdc, (HGDIOBJECT) hBmp); for (x = 0; x < LINTETO_NUMBER; x++) { hBmp_LineTo[x] = test_convert_to_bitmap(line_to_case[x], RawFormat, 0, 0, 0, format, 0, 0, 0, 16, 16, hPalette); if (!hBmp_LineTo[x]) goto fail; } for (x = 0; x < map_size; x++) { rop_map[x].bmp = test_convert_to_bitmap(rop_map[x].src, RawFormat, 0, 0, 0, format, 0, 0, 0, 16, 16, hPalette); if (!rop_map[x].bmp) goto fail; } if (!test_line(hdc, hPalette, 0, 0, 15, 15, hBmp, hBmp_LineTo[0], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 15, 15, 0, 0, hBmp, hBmp_LineTo[1], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 15, 0, 0, 15, hBmp, hBmp_LineTo[2], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 0, 15, 15, 0, hBmp, hBmp_LineTo[3], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 0, 8, 15, 8, hBmp, hBmp_LineTo[4], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 15, 8, 0, 8, hBmp, hBmp_LineTo[5], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 8, 0, 8, 15, hBmp, hBmp_LineTo[6], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 8, 15, 8, 0, hBmp, hBmp_LineTo[7], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 4, 4, 12, 12, hBmp, hBmp_LineTo[8], 0, 0, 16, 16)) goto fail; if (!test_line(hdc, hPalette, 0, 0, 16, 16, hBmp, hBmp_LineTo[9], 5, 5, 8, 8)) goto fail; if (!test_line(hdc, hPalette, 0, 0, 26, 26, hBmp, hBmp_LineTo[10], 0, 0, 16, 16)) goto fail; for (x = 0; x < map_size; x++) { char name[1024]; _snprintf(name, sizeof(name), "%s [%s]", gdi_rop_to_string(rop_map[x].rop), GetColorFormatName(hdc->format)); /* Test Case 13: (0,0) -> (16,16), R2_NOTMERGEPEN */ if (!gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS, hPalette)) { printf("gdi_BitBlt failed (line #%u)\n", __LINE__); goto fail; } gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, rop_map[x].rop); gdi_LineTo(hdc, 16, 16); if (!test_assert_bitmaps_equal(hBmp, rop_map[x].bmp, name, hPalette)) goto fail; } rc = 0; fail: for (x = 0; x < LINTETO_NUMBER; x++) gdi_DeleteObject((HGDIOBJECT) hBmp_LineTo[x]); for (x = 0; x < map_size; x++) gdi_DeleteObject((HGDIOBJECT) rop_map[x].bmp); gdi_DeleteObject((HGDIOBJECT) pen); gdi_DeleteDC(hdc); if (rc != 0) break; } return rc; }
int TestGdiLine(int argc, char* argv[]) { HGDI_DC hdc; HGDI_PEN pen; BYTE* data; HGDI_BITMAP hBmp; HGDI_BITMAP hBmp_LineTo_1; HGDI_BITMAP hBmp_LineTo_2; HGDI_BITMAP hBmp_LineTo_3; HGDI_BITMAP hBmp_LineTo_4; HGDI_BITMAP hBmp_LineTo_5; HGDI_BITMAP hBmp_LineTo_6; HGDI_BITMAP hBmp_LineTo_7; HGDI_BITMAP hBmp_LineTo_8; HGDI_BITMAP hBmp_LineTo_9; HGDI_BITMAP hBmp_LineTo_10; HGDI_BITMAP hBmp_LineTo_11; HGDI_BITMAP hBmp_LineTo_R2_BLACK; HGDI_BITMAP hBmp_LineTo_R2_NOTMERGEPEN; HGDI_BITMAP hBmp_LineTo_R2_MASKNOTPEN; HGDI_BITMAP hBmp_LineTo_R2_NOTCOPYPEN; HGDI_BITMAP hBmp_LineTo_R2_MASKPENNOT; HGDI_BITMAP hBmp_LineTo_R2_NOT; HGDI_BITMAP hBmp_LineTo_R2_XORPEN; HGDI_BITMAP hBmp_LineTo_R2_NOTMASKPEN; HGDI_BITMAP hBmp_LineTo_R2_MASKPEN; HGDI_BITMAP hBmp_LineTo_R2_NOTXORPEN; HGDI_BITMAP hBmp_LineTo_R2_NOP; HGDI_BITMAP hBmp_LineTo_R2_MERGENOTPEN; HGDI_BITMAP hBmp_LineTo_R2_COPYPEN; HGDI_BITMAP hBmp_LineTo_R2_MERGEPENNOT; HGDI_BITMAP hBmp_LineTo_R2_MERGEPEN; HGDI_BITMAP hBmp_LineTo_R2_WHITE; rdpPalette* hPalette; HCLRCONV clrconv; int bitsPerPixel = 8; int bytesPerPixel = 1; hdc = gdi_GetDC(); hdc->bitsPerPixel = bitsPerPixel; hdc->bytesPerPixel = bytesPerPixel; gdi_SetNullClipRgn(hdc); pen = gdi_CreatePen(1, 1, 0); gdi_SelectObject(hdc, (HGDIOBJECT) pen); hBmp = gdi_CreateCompatibleBitmap(hdc, 16, 16); gdi_SelectObject(hdc, (HGDIOBJECT) hBmp); hPalette = (rdpPalette*) gdi_GetSystemPalette(); clrconv = (HCLRCONV) malloc(sizeof(CLRCONV)); clrconv->alpha = 1; clrconv->invert = 0; clrconv->palette = hPalette; data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_1, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_1 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_2, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_2 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_3, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_3 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_4, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_4 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_5, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_5 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_5, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_5 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_6, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_6 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_7, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_7 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_8, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_8 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_9, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_9 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_10, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_10 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_case_11, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_11 = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_BLACK, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_BLACK = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_NOTMERGEPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_NOTMERGEPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_MASKNOTPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_MASKNOTPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_NOTCOPYPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_NOTCOPYPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_MASKPENNOT, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_MASKPENNOT = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_NOT, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_NOT = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_XORPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_XORPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_NOTMASKPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_NOTMASKPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_MASKPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_MASKPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_NOTXORPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_NOTXORPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_NOP, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_NOP = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_MERGENOTPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_MERGENOTPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_COPYPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_COPYPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_MERGEPENNOT, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_MERGEPENNOT = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_MERGEPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_MERGEPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data); data = (BYTE*) freerdp_image_convert((BYTE*) line_to_R2_WHITE, NULL, 16, 16, 8, bitsPerPixel, clrconv); hBmp_LineTo_R2_WHITE = gdi_CreateBitmap(16, 16, bitsPerPixel, data); /* Test Case 1: (0,0) -> (15, 15) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_LineTo(hdc, 15, 15); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_1, "Case 1") < 0) return -1; /* Test Case 2: (15,15) -> (0,0) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 15, 15, NULL); gdi_LineTo(hdc, 0, 0); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_2, "Case 2") < 0) return -1; /* Test Case 3: (15,0) -> (0,15) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 15, 0, NULL); gdi_LineTo(hdc, 0, 15); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_3, "Case 3") < 0) return -1; /* Test Case 4: (0,15) -> (15,0) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 0, 15, NULL); gdi_LineTo(hdc, 15, 0); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_4, "Case 4") < 0) return -1; /* Test Case 5: (0,8) -> (15,8) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 0, 8, NULL); gdi_LineTo(hdc, 15, 8); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_5, "Case 5") < 0) return -1; /* Test Case 6: (15,8) -> (0,8) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 15, 8, NULL); gdi_LineTo(hdc, 0, 8); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_6, "Case 6") < 0) return -1; /* Test Case 7: (8,0) -> (8,15) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 8, 0, NULL); gdi_LineTo(hdc, 8, 15); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_7, "Case 7") < 0) return -1; /* Test Case 8: (8,15) -> (8,0) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 8, 15, NULL); gdi_LineTo(hdc, 8, 0); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_8, "Case 8") < 0) return -1; /* Test Case 9: (4,4) -> (12,12) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 4, 4, NULL); gdi_LineTo(hdc, 12, 12); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_9, "Case 9") < 0) return -1; /* Test Case 10: (12,12) -> (4,4) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_MoveToEx(hdc, 12, 12, NULL); gdi_LineTo(hdc, 4, 4); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_10, "Case 10") < 0) return -1; /* Test Case 11: (0,0) -> (+10,+10) */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_LineTo(hdc, 16 + 10, 16 + 10); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_11, "Case 11") < 0) return -1; /* Test Case 12: (0,0) -> (16,16), R2_BLACK */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_BLACK); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_BLACK, "Case 12") < 0) return -1; /* Test Case 13: (0,0) -> (16,16), R2_NOTMERGEPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_NOTMERGEPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_NOTMERGEPEN, "Case 13") < 0) return -1; /* Test Case 14: (0,0) -> (16,16), R2_MASKNOTPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_MASKNOTPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_MASKNOTPEN, "Case 14") < 0) return -1; /* Test Case 15: (0,0) -> (16,16), R2_NOTCOPYPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_NOTCOPYPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_NOTCOPYPEN, "Case 15") < 0) return -1; /* Test Case 16: (0,0) -> (16,16), R2_MASKPENNOT */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_MASKPENNOT); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_MASKPENNOT, "Case 16") < 0) return -1; /* Test Case 17: (0,0) -> (16,16), R2_NOT */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_NOT); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_NOT, "Case 17") < 0) return -1; /* Test Case 18: (0,0) -> (16,16), R2_XORPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_XORPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_XORPEN, "Case 18") < 0) return -1; /* Test Case 19: (0,0) -> (16,16), R2_NOTMASKPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_NOTMASKPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_NOTMASKPEN, "Case 19") < 0) return -1; /* Test Case 20: (0,0) -> (16,16), R2_MASKPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_MASKPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_MASKPEN, "Case 20") < 0) return -1; /* Test Case 21: (0,0) -> (16,16), R2_NOTXORPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_NOTXORPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_NOTXORPEN, "Case 21") < 0) return -1; /* Test Case 22: (0,0) -> (16,16), R2_NOP */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_NOP); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_NOP, "Case 22") < 0) return -1; /* Test Case 23: (0,0) -> (16,16), R2_MERGENOTPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_MERGENOTPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_MERGENOTPEN, "Case 23") < 0) return -1; /* Test Case 24: (0,0) -> (16,16), R2_COPYPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_COPYPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_COPYPEN, "Case 24") < 0) return -1; /* Test Case 25: (0,0) -> (16,16), R2_MERGEPENNOT */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_MERGEPENNOT); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_MERGEPENNOT, "Case 25") < 0) return -1; /* Test Case 26: (0,0) -> (16,16), R2_MERGEPEN */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_MERGEPEN); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_MERGEPEN, "Case 26") < 0) return -1; /* Test Case 27: (0,0) -> (16,16), R2_WHITE */ gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS); gdi_SetClipRgn(hdc, 0, 0, 16, 16); gdi_MoveToEx(hdc, 0, 0, NULL); gdi_SetROP2(hdc, GDI_R2_WHITE); gdi_LineTo(hdc, 16, 16); if (test_assert_bitmaps_equal(hBmp, hBmp_LineTo_R2_WHITE, "Case 27") < 0) return -1; return 0; }
int test_gdi_ClipCoords(void) { BOOL draw; HGDI_DC hdc; HGDI_RGN rgn1; HGDI_RGN rgn2; HGDI_BITMAP bmp; if (!(hdc = gdi_GetDC())) { printf("failed to get gdi device context\n"); return -1; } hdc->bytesPerPixel = 4; hdc->bitsPerPixel = 32; bmp = gdi_CreateBitmapEx(1024, 768, 4, NULL, NULL); gdi_SelectObject(hdc, (HGDIOBJECT) bmp); gdi_SetNullClipRgn(hdc); rgn1 = gdi_CreateRectRgn(0, 0, 0, 0); rgn2 = gdi_CreateRectRgn(0, 0, 0, 0); rgn1->null = 1; rgn2->null = 1; /* null clipping region */ gdi_SetNullClipRgn(hdc); gdi_SetRgn(rgn1, 20, 20, 100, 100); gdi_SetRgn(rgn2, 20, 20, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* region all inside clipping region */ gdi_SetClipRgn(hdc, 0, 0, 1024, 768); gdi_SetRgn(rgn1, 20, 20, 100, 100); gdi_SetRgn(rgn2, 20, 20, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* region all outside clipping region, on the left */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 20, 20, 100, 100); gdi_SetRgn(rgn2, 0, 0, 0, 0); draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (draw) return -1; /* region all outside clipping region, on the right */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 420, 420, 100, 100); gdi_SetRgn(rgn2, 0, 0, 0, 0); draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (draw) return -1; /* region all outside clipping region, on top */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 300, 20, 100, 100); gdi_SetRgn(rgn2, 0, 0, 0, 0); draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (draw) return -1; /* region all outside clipping region, at the bottom */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 300, 420, 100, 100); gdi_SetRgn(rgn2, 0, 0, 0, 0); draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (draw) return -1; /* left outside, right = clip, top = clip, bottom = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 100, 300, 300, 100); gdi_SetRgn(rgn2, 300, 300, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* left outside, right inside, top = clip, bottom = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 100, 300, 250, 100); gdi_SetRgn(rgn2, 300, 300, 50, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* left = clip, right outside, top = clip, bottom = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 300, 300, 300, 100); gdi_SetRgn(rgn2, 300, 300, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* left inside, right outside, top = clip, bottom = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 350, 300, 200, 100); gdi_SetRgn(rgn2, 350, 300, 50, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* top outside, bottom = clip, left = clip, right = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 300, 100, 300, 300); gdi_SetRgn(rgn2, 300, 300, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* top = clip, bottom outside, left = clip, right = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 300, 300, 100, 200); gdi_SetRgn(rgn2, 300, 300, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; /* top = clip, bottom = clip, top = clip, bottom = clip */ gdi_SetClipRgn(hdc, 300, 300, 100, 100); gdi_SetRgn(rgn1, 300, 300, 100, 100); gdi_SetRgn(rgn2, 300, 300, 100, 100); gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL); if (!gdi_EqualRgn(rgn1, rgn2)) return -1; return 0; }
BOOL gdi_SetNullClipRgn(HGDI_DC hdc) { gdi_SetClipRgn(hdc, 0, 0, 0, 0); hdc->clip->null = TRUE; return TRUE; }
int gdi_SetNullClipRgn(HGDI_DC hdc) { gdi_SetClipRgn(hdc, 0, 0, 0, 0); hdc->clip->null = 1; return 0; }