/* * @implemented * */ HGDIOBJ WINAPI GetCurrentObject( _In_ HDC hdc, _In_ UINT uObjectType) { PDC_ATTR pdcattr = NULL; /* Check if this is a user mode object */ if ((uObjectType == OBJ_PEN) || (uObjectType == OBJ_EXTPEN) || (uObjectType == OBJ_BRUSH) || (uObjectType == OBJ_COLORSPACE)) { /* Get the DC attribute */ pdcattr = GdiGetDcAttr(hdc); if (pdcattr == NULL) { return NULL; } } /* Check what object was requested */ switch (uObjectType) { case OBJ_EXTPEN: case OBJ_PEN: return pdcattr->hpen; case OBJ_BRUSH: return pdcattr->hbrush; case OBJ_COLORSPACE: return pdcattr->hColorSpace; case OBJ_PAL: uObjectType = GDI_OBJECT_TYPE_PALETTE; break; case OBJ_FONT: uObjectType = GDI_OBJECT_TYPE_FONT; break; case OBJ_BITMAP: uObjectType = GDI_OBJECT_TYPE_BITMAP; break; /* All others are invalid */ default: SetLastError(ERROR_INVALID_PARAMETER); return NULL; } /* Pass the request to win32k */ return NtGdiGetDCObject(hdc, uObjectType); }
HBITMAP WINAPI CreateCompatibleBitmap( HDC hDC, INT Width, INT Height) { PDC_ATTR pDc_Attr; if (!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr)) return NULL; if (!Width || !Height) return GetStockObject(DEFAULT_BITMAP); if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)) { return NtGdiCreateCompatibleBitmap(hDC, Width, Height); } else { HBITMAP hBmp = NULL; struct { BITMAP bitmap; BITMAPINFOHEADER bmih; RGBQUAD rgbquad[256]; } buffer; DIBSECTION* pDIBs = (DIBSECTION*) &buffer; BITMAPINFO* pbmi = (BITMAPINFO*) &buffer.bmih; hBmp = NtGdiGetDCObject(hDC, GDI_OBJECT_TYPE_BITMAP); if (GetObjectA(hBmp, sizeof(DIBSECTION), pDIBs) != sizeof(DIBSECTION)) return NULL; if (pDIBs->dsBm.bmBitsPixel <= 8) GetDIBColorTable(hDC, 0, 256, buffer.rgbquad); pDIBs->dsBmih.biWidth = Width; pDIBs->dsBmih.biHeight = Height; return CreateDIBSection(hDC, pbmi, DIB_RGB_COLORS, NULL, NULL, 0); } return NULL; }