/* * @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; }
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; } }