void Dialog::draw(GraphicsDevice *gfxDevice, const FontID defaultFont, const SamplerStateID linearClamp, const BlendStateID blendSrcAlpha, const DepthStateID depthState){ drawSoftBorderQuad(gfxDevice, linearClamp, blendSrcAlpha, depthState, xPos, yPos, xPos + width, yPos + height, borderWidth, 1, 1); vec4 black(0, 0, 0, 1); vec4 blue(0.3f, 0.4f, 1.0f, 0.65f); float x = xPos + 2 * borderWidth; float y = yPos + 2 * borderWidth; for (uint i = 0; i < tabs.getCount(); i++){ float tabWidth = 0.75f * tabHeight; float cw = gfxDevice->getTextWidth(defaultFont, tabs[i]->caption); float newX = x + tabWidth * cw + 6; if (i == currTab){ vec2 quad[] = { MAKEQUAD(x, y, newX, y + tabHeight, 2) }; gfxDevice->drawPlain(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), blendSrcAlpha, depthState, &blue); } vec2 rect[] = { MAKERECT(x, y, newX, y + tabHeight, 2) }; gfxDevice->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); gfxDevice->drawText(tabs[i]->caption, x + 3, y, tabWidth, tabHeight, defaultFont, linearClamp, blendSrcAlpha, depthState); tabs[i]->rightX = x = newX; } vec2 line[] = { MAKEQUAD(xPos + 2 * borderWidth, y + tabHeight - 1, xPos + width - 2 * borderWidth, y + tabHeight + 1, 0) }; gfxDevice->drawPlain(PRIM_TRIANGLE_STRIP, line, elementsOf(line), BS_NONE, depthState, &black); closeButton->draw(gfxDevice, defaultFont, linearClamp, blendSrcAlpha, depthState); if (currTab < tabs.getCount()){ DialogTab *tab = tabs[currTab]; if (tab->widgets.goToLast()){ do { Widget *widget = tab->widgets.getCurrent().widget; if (widget->isVisible()) widget->draw(gfxDevice, defaultFont, linearClamp, blendSrcAlpha, depthState); } while (tab->widgets.goToPrev()); } if (showSelection){ if (tab->widgets.goToFirst()){ Widget *w = tab->widgets.getCurrent().widget; float x = w->getX(); float y = w->getY(); vec2 rect[] = { MAKERECT(x - 5, y - 5, x + w->getWidth() + 5, y + w->getHeight() + 5, 1) }; gfxDevice->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); } } } }
void DropDownList::draw(Renderer *renderer, const FontID defaultFont, const SamplerStateID linearClamp, const BlendStateID blendSrcAlpha, const DepthStateID depthState){ vec4 col = enabled? color : vec4(color.xyz() * 0.5f, 1); vec4 black(0, 0, 0, 1); vec2 quad[] = { MAKEQUAD(xPos, yPos, xPos + width, yPos + height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), blendSrcAlpha, depthState, &col); vec2 rect[] = { MAKERECT(xPos, yPos, xPos + width, yPos + height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); vec2 line0[] = { MAKEQUAD(xPos + width - height, yPos + 2, xPos + width - height + 2, yPos + height - 2, 0) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, line0, elementsOf(line0), BS_NONE, depthState, &black); vec2 line1[] = { MAKEQUAD(xPos + width - height + 1, yPos + 0.5f * height - 1, xPos + width - 2, yPos + 0.5f * height + 1, 0) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, line1, elementsOf(line1), BS_NONE, depthState, &black); vec2 triangles[] = { vec2(xPos + width - 0.5f * height, yPos + 0.1f * height), vec2(xPos + width - 0.2f * height, yPos + 0.4f * height), vec2(xPos + width - 0.8f * height, yPos + 0.4f * height), vec2(xPos + width - 0.5f * height, yPos + 0.9f * height), vec2(xPos + width - 0.8f * height, yPos + 0.6f * height), vec2(xPos + width - 0.2f * height, yPos + 0.6f * height), }; renderer->drawPlain(PRIM_TRIANGLES, triangles, elementsOf(triangles), BS_NONE, depthState, &black); float textWidth = 0.75f * height; float w = width - 1.3f * height; if (selectedItem >= 0){ float tw = renderer->getTextWidth(defaultFont, items[selectedItem]); float maxW = w / tw; if (textWidth > maxW) textWidth = maxW; renderer->drawText(items[selectedItem], xPos + 0.15f * height, yPos, textWidth, height, defaultFont, linearClamp, blendSrcAlpha, depthState); } if (isDroppedDown){ vec2 quad[] = { MAKEQUAD(xPos, yPos - selectedItem * height, xPos + width - height + 2, yPos + (items.getCount() - selectedItem) * height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), blendSrcAlpha, depthState, &col); vec2 rect[] = { MAKERECT(xPos, yPos - selectedItem * height, xPos + width - height + 2, yPos + (items.getCount() - selectedItem) * height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); for (uint i = 0; i < items.getCount(); i++){ float tw = renderer->getTextWidth(defaultFont, items[i]); float maxW = w / tw; if (textWidth > maxW) textWidth = maxW; renderer->drawText(items[i], xPos + 0.15f * height, yPos + (int(i) - selectedItem) * height, textWidth, height, defaultFont, linearClamp, blendSrcAlpha, depthState); } } }
static M4Err DD_FlushVideo(VideoOutput *dr, M4Window *dest) { RECT rc; HRESULT hr; DDCONTEXT; if (!dd) return M4BadParam; if (dd->is_3D_out) { SwapBuffers(dd->gl_HDC); return M4OK; } if (!dd->ddraw_init) return M4BadParam; if (dest) { POINT pt; pt.x = dest->x; pt.y = dest->y; ClientToScreen(dd->hWnd, &pt); dest->x = pt.x; dest->y = pt.y; MAKERECT(rc, dest); hr = IDirectDrawSurface_Blt(dd->pPrimary, &rc, dd->pBack, NULL, DDBLT_WAIT, NULL ); } else { hr = IDirectDrawSurface_Blt(dd->pPrimary, NULL, dd->pBack, NULL, DDBLT_WAIT, NULL ); } if (hr == DDERR_SURFACELOST) { IDirectDrawSurface_Restore(dd->pPrimary); IDirectDrawSurface_Restore(dd->pBack); } return FAILED(hr) ? M4IOErr : M4OK; }
void CLyricsDlg::OnMouseMove(HWND hDlg, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(wParam); CLyricsDlg* pThis = (CLyricsDlg*)GetWindowLong(hDlg, GWL_USERDATA); int xPos = (int)LOWORD(lParam); int yPos = (int)HIWORD(lParam); RECT rect; //load from file link GetWindowRect(pThis->m_LoadFromFile.m_hWnd, &rect); POINT first = {rect.left, rect.top}, second = {rect.right, rect.bottom}; ScreenToClient(hDlg, &first); ScreenToClient(hDlg, &second); rect = MAKERECT(first.x, first.y, second.x, second.y); if ( xPos > first.x && xPos < second.x && yPos < second.y && yPos > first.y) { SetCursor(pThis->m_hHandCursor); if (pThis->m_bMoved == FALSE) InvalidateRect(hDlg, &rect, 1); pThis->m_bMoved = TRUE; } else { GetWindowRect(pThis->m_LoadFromWeb.m_hWnd, &rect); POINT first = {rect.left, rect.top}, second = {rect.right, rect.bottom}; ScreenToClient(hDlg, &first); ScreenToClient(hDlg, &second); rect = MAKERECT(first.x, first.y, second.x, second.y); if ( xPos > first.x && xPos < second.x && yPos < second.y && yPos > first.y) { SetCursor(pThis->m_hHandCursor); if (pThis->m_bMoved == FALSE) InvalidateRect(hDlg, &rect, 1); pThis->m_bMoved = TRUE; } else { SetCursor(pThis->m_hArrowCursor); if (pThis->m_bMoved == TRUE) InvalidateRect(hDlg, &rect, 1); pThis->m_bMoved = FALSE; } } }
void CLyricsDlg::OnLButtonUp(HWND hDlg, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(wParam); CLyricsDlg* pThis = (CLyricsDlg*)GetWindowLongPtrA(hDlg, GWL_USERDATA); int xPos = (int)LOWORD(lParam); int yPos = (int)HIWORD(lParam); RECT rect; //load from file GetWindowRect(pThis->m_LoadFromFile.m_hWnd, &rect); POINT first = {rect.left, rect.top}, second = {rect.right, rect.bottom}; ScreenToClient(hDlg, &first); ScreenToClient(hDlg, &second); rect = MAKERECT(first.x, first.y, second.x, second.y); if ( xPos > rect.left && xPos < rect.right && yPos < rect.bottom && yPos > rect.top) SetCursor(pThis->m_hHandCursor); else goto try_theother; pThis->m_bClicked = TRUE; InvalidateRect(hDlg, &rect, 1); LoadFromFile(hDlg); try_theother: //load from web GetWindowRect(pThis->m_LoadFromWeb.m_hWnd, &rect); first.x = rect.left; first.y = rect.top; second.x = rect.right; second.y = rect.bottom; ScreenToClient(hDlg, &first); ScreenToClient(hDlg, &second); rect = MAKERECT(first.x, first.y, second.x, second.y); if ( xPos > rect.left && xPos < rect.right && yPos < rect.bottom && yPos > rect.top) SetCursor(pThis->m_hHandCursor); else return; pThis->m_bClicked = TRUE; InvalidateRect(hDlg, &rect, 1); LoadFromWeb(hDlg); }
void Slider::draw(Renderer *renderer, const FontID defaultFont, const SamplerStateID linearClamp, const BlendStateID blendSrcAlpha, const DepthStateID depthState){ vec4 black(0, 0, 0, 1); vec2 quad[] = { MAKEQUAD(xPos, yPos, xPos + width, yPos + height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), blendSrcAlpha, depthState, &color); vec2 rect[] = { MAKERECT(xPos, yPos, xPos + width, yPos + height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); vec2 line[] = { MAKEQUAD(xPos + 0.5f * height, yPos + 0.5f * height - 1, xPos + width - 0.5f * height, yPos + 0.5f * height + 1, 0) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, line, elementsOf(line), BS_NONE, depthState, &black); float x = lerp(xPos + 0.5f * height, xPos + width - 0.5f * height, (value - minValue) / (maxValue - minValue)); vec2 marker[] = { MAKEQUAD(x - 0.2f * height, yPos + 0.2f * height, x + 0.2f * height, yPos + 0.8f * height, 0) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, marker, elementsOf(marker), BS_NONE, depthState, &black); }
void CheckBox::draw(Renderer *renderer, const FontID defaultFont, const SamplerStateID linearClamp, const BlendStateID blendSrcAlpha, const DepthStateID depthState){ if (check == TEXTURE_NONE){ uint32 checkPic[] = { 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xf5ffffff,0x9744619d,0xffffffff,0xffffffff, 0x25d8ffff,0xce1a0000,0xffffffff,0xffffffff,0x001adeff,0xffd81a00,0xffffffff,0xffffffff,0x00002aef,0xffffd81a, 0xffffffff,0xfcffffff,0x1000004a,0xffffffd5,0xffffffff,0x7cffffff,0xc9090000,0xffffffff,0xffffffff,0x01b3ffff, 0xffb30400,0xffffffff,0xf6d6f5ff,0x0011deff,0xffff9300,0xffffffff,0x6b000fa8,0x000035f6,0xffffff67,0xffffffff, 0x0c00004b,0x39000055,0xfffffff9,0xffffffff,0x00000075,0xe0130000,0xffffffff,0xffffffff,0x000000c9,0xffaf0000, 0xffffffff,0xffffffff,0x000034ff,0xffff5c00,0xffffffff,0xffffffff,0x4b5bdaff,0xfffff575,0xffffffff,0xffffffff, 0xffffffff,0xffffffff,0xffffffff,0xffffffff, }; Image img; img.loadFromMemory(checkPic, FORMAT_I8, 16, 16, 1, 1, false); img.convert(FORMAT_RGBA8); // For DX10 check = renderer->addTexture(img, false, linearClamp); } if (checked){ TexVertex quad[] = { MAKETEXQUAD(xPos, yPos + 0.2f * height, xPos + 0.6f * height, yPos + 0.8f * height, 3) }; renderer->drawTextured(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), check, linearClamp, BS_NONE, depthState); } else { vec2 quad[] = { MAKEQUAD(xPos, yPos + 0.2f * height, xPos + 0.6f * height, yPos + 0.8f * height, 3) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), BS_NONE, depthState); } vec2 rect[] = { MAKERECT(xPos, yPos + 0.2f * height, xPos + 0.6f * height, yPos + 0.8f * height, 3) }; vec4 black(0, 0, 0, 1); renderer->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); float textWidth = 0.75f * height; float w = width - 0.7f * height; float tw = renderer->getTextWidth(defaultFont, text); float maxW = w / tw; if (textWidth > maxW) textWidth = maxW; float x = 0.7f * height; renderer->drawText(text, xPos + x, yPos, textWidth, height, defaultFont, linearClamp, blendSrcAlpha, depthState); }
void PushButton::drawButton(Renderer *renderer, const char *text, const FontID defaultFont, const SamplerStateID linearClamp, const BlendStateID blendSrcAlpha, const DepthStateID depthState){ vec4 black(0, 0, 0, 1); vec4 col = color; if (pushed) col *= vec4(0.5f, 0.5f, 0.5f, 1); vec2 quad[] = { MAKEQUAD(xPos, yPos, xPos + width, yPos + height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, quad, elementsOf(quad), blendSrcAlpha, depthState, &col); vec2 rect[] = { MAKERECT(xPos, yPos, xPos + width, yPos + height, 2) }; renderer->drawPlain(PRIM_TRIANGLE_STRIP, rect, elementsOf(rect), BS_NONE, depthState, &black); float textWidth = 0.75f * height; float tw = renderer->getTextWidth(defaultFont, text); float maxW = width / tw; if (textWidth > maxW) textWidth = maxW; float x = 0.5f * (width - textWidth * tw); renderer->drawText(text, xPos + x, yPos, textWidth, height, defaultFont, linearClamp, blendSrcAlpha, depthState); }