예제 #1
0
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);
			}
		}
	}
}
예제 #2
0
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);
		}		
	}

}
예제 #3
0
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;
}
예제 #4
0
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;
		}
	}
}
예제 #5
0
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);
}
예제 #6
0
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);
}
예제 #8
0
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);
}