Exemple #1
0
/*
 * @implemented
 *
 */
HGDIOBJ
WINAPI
SelectObject(
    _In_ HDC hdc,
    _In_ HGDIOBJ hobj)
{
    /* Fix up 16 bit handles */
    hobj = GdiFixUpHandle(hobj);
    if (!GdiIsHandleValid(hobj))
    {
        return NULL;
    }

    /* Call the appropriate select function */
    switch (GDI_HANDLE_GET_TYPE(hobj))
    {
        case GDILoObjType_LO_REGION_TYPE:
            return (HGDIOBJ)ExtSelectClipRgn(hdc, hobj, RGN_COPY);

        case GDILoObjType_LO_BITMAP_TYPE:
        case GDILoObjType_LO_DIBSECTION_TYPE:
            return GdiSelectBitmap(hdc, hobj);

        case GDILoObjType_LO_BRUSH_TYPE:
            return GdiSelectBrush(hdc, hobj);

        case GDILoObjType_LO_PEN_TYPE:
        case GDILoObjType_LO_EXTPEN_TYPE:
            return GdiSelectPen(hdc, hobj);

        case GDILoObjType_LO_FONT_TYPE:
            return GdiSelectFont(hdc, hobj);

        case GDILoObjType_LO_ICMLCS_TYPE:
            return SetColorSpace(hdc, hobj);

        case GDILoObjType_LO_PALETTE_TYPE:
            SetLastError(ERROR_INVALID_FUNCTION);

        default:
            return NULL;
    }

    return NULL;
}
Exemple #2
0
void
DisplayValidate(HDC32 hDC32,LPLSDS_PARAMS lpStruct,DWORD dwInvalidMask)
{
    LSDE_VALIDATE *lpvs = &lpStruct->lsde_validate;
    DWORD dwMask;
    LPBRUSHINFO lpBrushInfo;
    LPPENINFO lpPenInfo;
    SIZE sz;

    dwMask = hDC32->dwInvalid & dwInvalidMask;

    if (dwMask & IM_POLYFILLMODEMASK) 
	lpvs->PolyFillMode = hDC32->PolyFillMode;

    if (dwMask & IM_TEXTCOLORMASK) 
	if (hDC32->TextColor & PALETTE_MASK)
	    lpvs->TextColor = TWIN_PaletteRGB(hDC32,hDC32->TextColor);
	else
	    lpvs->TextColor = hDC32->TextColor;

    if (dwMask & IM_BKCOLORMASK) 
	if (hDC32->BackColor & PALETTE_MASK)
	    lpvs->BackColor = TWIN_PaletteRGB(hDC32,hDC32->BackColor);
	else
	    lpvs->BackColor = hDC32->BackColor;

    if (dwMask & IM_BKMODEMASK) 
	lpvs->BackMode = hDC32->BackMode;

    if (dwMask & IM_ROP2MASK)
	lpvs->ROP2 = hDC32->ROP2;

    if (dwMask & IM_STRETCHMODEMASK)
	lpvs->StretchMode = hDC32->StretchBltMode;

    if (dwMask & (IM_BRUSHDEPTHMASK|IM_BRUSHCOLORMASK|IM_BRUSHFILLMASK)) {
	lpBrushInfo = GETBRUSHINFO(hDC32->hBrush);
	if (lpBrushInfo) {
	    if (dwMask & IM_BRUSHDEPTHMASK)
		/* need to re-select the brush */
		GdiSelectBrush(hDC32,lpBrushInfo);
	    if (dwMask & (IM_BRUSHCOLORMASK|IM_BRUSHFILLMASK)) {
		lpvs->BrushFlag = LOWORD(lpBrushInfo->dwFlags);
		if (lpBrushInfo->lpBrush.lbColor & PALETTE_MASK)
		    lpvs->BrushColor = TWIN_PaletteRGB(hDC32,
						lpBrushInfo->lpBrush.lbColor);
		else
		    lpvs->BrushColor = lpBrushInfo->lpBrush.lbColor;
		lpvs->BrushPrivate = lpBrushInfo->lpPrivate;
	    }
	}
	RELEASEBRUSHINFO(lpBrushInfo);
    }

    if (dwMask & (IM_PENCOLORMASK|IM_PENSTYLEMASK|IM_PENWIDTHMASK)) {
	lpPenInfo = GETPENINFO(hDC32->hPen);
	if (lpPenInfo) {
	    lpvs->PenStyle = lpPenInfo->lpPen.lopnStyle;
	    if (lpPenInfo->lpPen.lopnColor & PALETTE_MASK)
		lpvs->PenColor = TWIN_PaletteRGB(hDC32,
						lpPenInfo->lpPen.lopnColor);
	    else
		lpvs->PenColor = lpPenInfo->lpPen.lopnColor;

	    /* pen width is re-scaled thru map mode */
	    sz.cx = lpPenInfo->lpPen.lopnWidth.x;
	    sz.cy = 0;
	    LEtoDE(hDC32, &sz);
	    lpvs->PenWidth = max(sz.cx, 1);   /* Pen is at least one pixel */
	    lpvs->PenHeight = max(sz.cx, 1);  /* Win 3.1 does not support pen height */
	}
	RELEASEPENINFO(lpPenInfo);
    }

    if (dwInvalidMask == IM_SRCBKCOLORMASK) { 
	/* This mask is used only by itself in StretchBlt; */
	/* By now lpvs is already filled, so we add on top */
	lpvs->SrcDCBkColor = hDC32->BackColor;
	if (hDC32->BackColor & PALETTE_MASK)
	    lpvs->SrcDCBkColor = TWIN_PaletteRGB(hDC32,hDC32->BackColor);
	else
	    lpvs->SrcDCBkColor = hDC32->BackColor;
	lpvs->dwInvalidMask |= IM_SRCBKCOLORMASK;
    }
    else {
	/* Clear the bits that the driver is going to validate */
	hDC32->dwInvalid &= ~dwMask;
	lpvs->dwInvalidMask = dwMask;
    }
}