BOOL FASTCALL co_IntInitializeDesktopGraphics(VOID) { TEXTMETRICW tmw; UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY"); PDESKTOP pdesk; ScreenDeviceContext = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE); if (NULL == ScreenDeviceContext) { IntDestroyPrimarySurface(); return FALSE; } GreSetDCOwner(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC); if (! IntCreatePrimarySurface()) { return FALSE; } hSystemBM = NtGdiCreateCompatibleDC(ScreenDeviceContext); NtGdiSelectFont(hSystemBM, NtGdiGetStockObject(SYSTEM_FONT)); GreSetDCOwner(hSystemBM, GDI_OBJ_HMGR_PUBLIC); /* Update the SERVERINFO */ gpsi->aiSysMet[SM_CXSCREEN] = gppdevPrimary->gdiinfo.ulHorzRes; gpsi->aiSysMet[SM_CYSCREEN] = gppdevPrimary->gdiinfo.ulVertRes; gpsi->Planes = NtGdiGetDeviceCaps(ScreenDeviceContext, PLANES); gpsi->BitsPixel = NtGdiGetDeviceCaps(ScreenDeviceContext, BITSPIXEL); gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel; gpsi->dmLogPixels = NtGdiGetDeviceCaps(ScreenDeviceContext, LOGPIXELSY); if (NtGdiGetDeviceCaps(ScreenDeviceContext, RASTERCAPS) & RC_PALETTE) { gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY; } else gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY; // Font is realized and this dc was previously set to internal DC_ATTR. gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar); gpsi->tmSysFont = tmw; /* Put the pointer in the center of the screen */ gpsi->ptCursor.x = gpsi->aiSysMet[SM_CXSCREEN] / 2; gpsi->ptCursor.y = gpsi->aiSysMet[SM_CYSCREEN] / 2; /* Attach monitor */ UserAttachMonitor((HDEV)gppdevPrimary); /* Setup the cursor */ co_IntLoadDefaultCursors(); /* Show the desktop */ pdesk = IntGetActiveDesktop(); ASSERT(pdesk); co_IntShowDesktop(pdesk, gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN], TRUE); return TRUE; }
HFONT WINAPI GdiSelectFont( _In_ HDC hdc, _In_ HFONT hfont) { PDC_ATTR pdcattr; HFONT hfontOld; HANDLE_METADC(HFONT, SelectFont, NULL, hdc, hfont); /* Get the DC attribute */ pdcattr = GdiGetDcAttr(hdc); if (pdcattr == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return NULL; } /* Get the current font. If it matches the new font, we're done */ hfontOld = pdcattr->hlfntNew; if (hfontOld == hfont) return hfontOld; /* Set the new font and update dirty flags */ pdcattr->hlfntNew = hfont; pdcattr->ulDirty_ &= ~SLOW_WIDTHS; pdcattr->ulDirty_ |= DIRTY_CHARSET; /* If the DC does not have a DIB section selected, try a batch command */ if (!(pdcattr->ulDirty_ & DC_DIBSECTION)) { PGDIBSOBJECT pgO; pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj); if (pgO) { pgO->hgdiobj = hfont; return hfontOld; } } /* We could not use the batch command, call win32k */ return NtGdiSelectFont(hdc, hfont); }
INT Test_NtGdiSelectFont(PTESTINFO pti) { HDC hDC; HFONT hFont, hOldFont; hDC = CreateDCW(L"DISPLAY", NULL, NULL, NULL); hFont = GetStockObject(DEFAULT_GUI_FONT); /* Test NULL DC */ SetLastError(ERROR_SUCCESS); hOldFont = NtGdiSelectFont(NULL, hFont); TEST(hOldFont == NULL); TEST(GetLastError() == ERROR_SUCCESS); /* Test invalid DC */ SetLastError(ERROR_SUCCESS); hOldFont = NtGdiSelectFont((HDC)((ULONG_PTR)hDC & 0x0000ffff), hFont); TEST(hOldFont == NULL); TEST(GetLastError() == ERROR_SUCCESS); /* Test NULL font */ SetLastError(ERROR_SUCCESS); hOldFont = NtGdiSelectFont(hDC, NULL); TEST(hOldFont == NULL); TEST(GetLastError() == ERROR_SUCCESS); /* Test invalid font */ SetLastError(ERROR_SUCCESS); hOldFont = NtGdiSelectFont(hDC, (HFONT)((ULONG_PTR)hFont & 0x0000ffff)); TEST(hOldFont == NULL); TEST(GetLastError() == ERROR_SUCCESS); SetLastError(ERROR_SUCCESS); hOldFont = NtGdiSelectFont(hDC, hFont); TEST(hOldFont != NULL); hOldFont = NtGdiSelectFont(hDC, hOldFont); TEST(hOldFont == hFont); TEST(GetLastError() == ERROR_SUCCESS); DeleteDC(hDC); return APISTATUS_NORMAL; }
BOOL FASTCALL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags) { LOGFONTW lf; HFONT hFont, hOldFont; WCHAR Symbol; switch(uFlags & 0xff) { case DFCS_MENUARROWUP: Symbol = '5'; break; case DFCS_MENUARROWDOWN: Symbol = '6'; break; case DFCS_MENUARROW: Symbol = '8'; break; case DFCS_MENUARROWRIGHT: Symbol = 'w'; // FIXME: needs to confirm break; case DFCS_MENUBULLET: Symbol = 'h'; break; case DFCS_MENUCHECK: Symbol = 'a'; break; default: /* DbgPrint("Invalid menu; flags=0x%04x\n", uFlags); */ return FALSE; } /* acquire ressources only if valid menu */ RtlZeroMemory(&lf, sizeof(LOGFONTW)); lf.lfHeight = r->bottom - r->top; lf.lfWidth = 0; lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; RtlCopyMemory(lf.lfFaceName, L"Marlett", sizeof(L"Marlett")); hFont = GreCreateFontIndirectW(&lf); /* save font */ hOldFont = NtGdiSelectFont(dc, hFont); if ((uFlags & 0xff) == DFCS_MENUARROWUP || (uFlags & 0xff) == DFCS_MENUARROWDOWN ) { #if 0 if (uFlags & DFCS_INACTIVE) { /* draw shadow */ IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT)); GreTextOutW(dc, r->left + 1, r->top + 1, &Symbol, 1); } #endif IntGdiSetTextColor(dc, IntGetSysColor((uFlags & DFCS_INACTIVE) ? COLOR_BTNSHADOW : COLOR_BTNTEXT)); } /* draw selected symbol */ GreTextOutW(dc, r->left, r->top, &Symbol, 1); /* restore previous settings */ NtGdiSelectFont(dc, hOldFont); GreDeleteObject(hFont); return TRUE; }
BOOL FASTCALL UITOOLS95_DrawFrameScroll(HDC dc, LPRECT r, UINT uFlags) { LOGFONTW lf; HFONT hFont, hOldFont; COLORREF clrsave; RECT myr; INT bkmode; WCHAR Symbol; switch(uFlags & 0xff) { case DFCS_SCROLLCOMBOBOX: case DFCS_SCROLLDOWN: Symbol = '6'; break; case DFCS_SCROLLUP: Symbol = '5'; break; case DFCS_SCROLLLEFT: Symbol = '3'; break; case DFCS_SCROLLRIGHT: Symbol = '4'; break; case DFCS_SCROLLSIZEGRIP: case DFCS_SCROLLSIZEGRIPRIGHT: RtlZeroMemory(&lf, sizeof(LOGFONTW)); UITOOLS_MakeSquareRect(r, &myr); lf.lfHeight = myr.bottom - myr.top; lf.lfWidth = 0; lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; RtlCopyMemory(lf.lfFaceName, L"Marlett", sizeof(L"Marlett")); hFont = GreCreateFontIndirectW(&lf); /* save font and text color */ hOldFont = NtGdiSelectFont(dc, hFont); clrsave = GreGetTextColor(dc); bkmode = GreGetBkMode(dc); /* set color and drawing mode */ IntGdiSetBkMode(dc, TRANSPARENT); if (!(uFlags & (DFCS_MONO | DFCS_FLAT))) { IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT)); /* draw selected symbol */ Symbol = ((uFlags & 0xff) == DFCS_SCROLLSIZEGRIP) ? 'o' : 'x'; GreTextOutW(dc, myr.left, myr.top, &Symbol, 1); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNSHADOW)); } else IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME)); /* draw selected symbol */ Symbol = ((uFlags & 0xff) == DFCS_SCROLLSIZEGRIP) ? 'p' : 'y'; GreTextOutW(dc, myr.left, myr.top, &Symbol, 1); /* restore previous settings */ IntGdiSetTextColor(dc, clrsave); NtGdiSelectFont(dc, hOldFont); IntGdiSetBkMode(dc, bkmode); GreDeleteObject(hFont); return TRUE; default: return FALSE; } IntDrawRectEdge(dc, r, (uFlags & DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED, (uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT); RtlZeroMemory(&lf, sizeof(LOGFONTW)); UITOOLS_MakeSquareRect(r, &myr); myr.left += 1; myr.top += 1; myr.right -= 1; myr.bottom -= 1; if(uFlags & DFCS_PUSHED) RECTL_vOffsetRect(&myr,1,1); lf.lfHeight = myr.bottom - myr.top; lf.lfWidth = 0; lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; RtlCopyMemory(lf.lfFaceName, L"Marlett", sizeof(L"Marlett")); hFont = GreCreateFontIndirectW(&lf); /* save font and text color */ hOldFont = NtGdiSelectFont(dc, hFont); clrsave = GreGetTextColor(dc); bkmode = GreGetBkMode(dc); /* set color and drawing mode */ IntGdiSetBkMode(dc, TRANSPARENT); if(uFlags & DFCS_INACTIVE) { /* draw shadow */ IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT)); GreTextOutW(dc, myr.left + 1, myr.top + 1, &Symbol, 1); } IntGdiSetTextColor(dc, IntGetSysColor((uFlags & DFCS_INACTIVE) ? COLOR_BTNSHADOW : COLOR_BTNTEXT)); /* draw selected symbol */ GreTextOutW(dc, myr.left, myr.top, &Symbol, 1); /* restore previous settings */ IntGdiSetTextColor(dc, clrsave); NtGdiSelectFont(dc, hOldFont); IntGdiSetBkMode(dc, bkmode); GreDeleteObject(hFont); return TRUE; }
BOOL FASTCALL UITOOLS95_DrawFrameCaption(HDC dc, LPRECT r, UINT uFlags) { LOGFONTW lf; HFONT hFont, hOldFont; COLORREF clrsave; RECT myr; INT bkmode; WCHAR Symbol; switch(uFlags & 0xff) { case DFCS_CAPTIONCLOSE: Symbol = 'r'; break; case DFCS_CAPTIONHELP: Symbol = 's'; break; case DFCS_CAPTIONMIN: Symbol = '0'; break; case DFCS_CAPTIONMAX: Symbol = '1'; break; case DFCS_CAPTIONRESTORE: Symbol = '2'; break; default: return FALSE; } IntDrawRectEdge(dc,r,(uFlags&DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED, BF_RECT | BF_MIDDLE | BF_SOFT); RtlZeroMemory(&lf, sizeof(LOGFONTW)); UITOOLS_MakeSquareRect(r, &myr); myr.left += 1; myr.top += 1; myr.right -= 1; myr.bottom -= 1; if(uFlags & DFCS_PUSHED) RECTL_vOffsetRect(&myr,1,1); lf.lfHeight = myr.bottom - myr.top; lf.lfWidth = 0; lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; lf.lfQuality = NONANTIALIASED_QUALITY; RtlCopyMemory(lf.lfFaceName, L"Marlett", sizeof(L"Marlett")); hFont = GreCreateFontIndirectW(&lf); /* save font and text color */ hOldFont = NtGdiSelectFont(dc, hFont); clrsave = GreGetTextColor(dc); bkmode = GreGetBkMode(dc); /* set color and drawing mode */ IntGdiSetBkMode(dc, TRANSPARENT); if(uFlags & DFCS_INACTIVE) { /* draw shadow */ IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT)); GreTextOutW(dc, myr.left + 1, myr.top + 1, &Symbol, 1); } IntGdiSetTextColor(dc, IntGetSysColor((uFlags & DFCS_INACTIVE) ? COLOR_BTNSHADOW : COLOR_BTNTEXT)); /* draw selected symbol */ GreTextOutW(dc, myr.left, myr.top, &Symbol, 1); /* restore previous settings */ IntGdiSetTextColor(dc, clrsave); NtGdiSelectFont(dc, hOldFont); IntGdiSetBkMode(dc, bkmode); GreDeleteObject(hFont); return TRUE; }
BOOL FASTCALL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT uFlags, BOOL Radio) { LOGFONTW lf; HFONT hFont, hOldFont; int i; WCHAR OutRight, OutLeft, InRight, InLeft, Center; if (Radio) { OutRight = 'j'; // Outer right OutLeft = 'k'; // Outer left InRight = 'l'; // inner left InLeft = 'm'; // inner right Center = 'n'; // center } else { OutRight = 'c'; // Outer right OutLeft = 'd'; // Outer left InRight = 'e'; // inner left InLeft = 'f'; // inner right Center = 'g'; // center } RtlZeroMemory(&lf, sizeof(LOGFONTW)); lf.lfHeight = r->top - r->bottom; lf.lfWidth = 0; lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; RtlCopyMemory(lf.lfFaceName, L"Marlett", sizeof(L"Marlett")); hFont = GreCreateFontIndirectW(&lf); hOldFont = NtGdiSelectFont(dc, hFont); if(Radio && ((uFlags & 0xff) == DFCS_BUTTONRADIOMASK)) { IntGdiSetBkMode(dc, OPAQUE); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME)); GreTextOutW(dc, r->left, r->top, &Center, 1); IntGdiSetBkMode(dc, TRANSPARENT); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME)); GreTextOutW(dc, r->left, r->top, &OutRight, 1); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME)); GreTextOutW(dc, r->left, r->top, &OutLeft, 1); } else { IntGdiSetBkMode(dc, TRANSPARENT); /* Center section, white for active, grey for inactive */ i= !(uFlags & (DFCS_INACTIVE|DFCS_PUSHED)) ? COLOR_WINDOW : COLOR_BTNFACE; IntGdiSetTextColor(dc, IntGetSysColor(i)); GreTextOutW(dc, r->left, r->top, &Center, 1); if(uFlags & (DFCS_FLAT | DFCS_MONO)) { IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME)); GreTextOutW(dc, r->left, r->top, &OutRight, 1); GreTextOutW(dc, r->left, r->top, &OutLeft, 1); GreTextOutW(dc, r->left, r->top, &InRight, 1); GreTextOutW(dc, r->left, r->top, &InLeft, 1); } else { IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNSHADOW)); GreTextOutW(dc, r->left, r->top, &OutRight, 1); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT)); GreTextOutW(dc, r->left, r->top, &OutLeft, 1); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_3DDKSHADOW)); GreTextOutW(dc, r->left, r->top, &InRight, 1); IntGdiSetTextColor(dc, IntGetSysColor(COLOR_3DLIGHT)); GreTextOutW(dc, r->left, r->top, &InLeft, 1); } } if(uFlags & DFCS_CHECKED) { WCHAR Check = (Radio) ? 'i' : 'b'; IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWTEXT)); GreTextOutW(dc, r->left, r->top, &Check, 1); } IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWTEXT)); NtGdiSelectFont(dc, hOldFont); GreDeleteObject(hFont); return TRUE; }