示例#1
0
文件: gui.cpp 项目: Evengard/UniMod
int __cdecl uniWindowDrawFn(void *Window,void *WindowDD) // Специальная фн рисования, что бы была и прозрачность
{
    BYTE *Wnd=(BYTE*) Window;
    wddControl *Wdd=(wddControl*) WindowDD;
    int x;
    int y;
    int *px=&x;
    int *py=&y;
    noxWndGetPostion(Window,px,py);
    if ((*(int*)(Wnd+4)) & 0x80) // если есть этот флаг => рисуем картинку
    {
        x+=Wdd->offsetX;
        y+=Wdd->offsetY;
        if (Wdd->flags0 & 2)
            drawImage(Wdd->imageHiliteH,x,y);
        else
            drawImage(Wdd->imageH,x,y);
        return 1;
    }
    if (Wdd->BgColor==0x80000000)
        return 1; //
    noxSetRectColorMB(Wdd->BgColor);
    int Top=lua_gettop(L);
    lua_pushlightuserdata(L,&noxWndLoad);
    lua_gettable(L,LUA_REGISTRYINDEX);
    lua_pushlightuserdata(L,Window);
    lua_gettable(L,-2);
    if (lua_type(L,-1)!=LUA_TTABLE)
    {
        noxDrawRect(x,y,*((int*)(Wnd+8)),*((int*)(Wnd+0xC)));
        return 1;
    }
    lua_getfield(L,-1,"alpha");
    if (lua_toboolean(L,-1))
        noxDrawRectAlpha(x,y,*((int*)(Wnd+8)),*((int*)(Wnd+0xC)));
    else
        noxDrawRect(x,y,*((int*)(Wnd+8)),*((int*)(Wnd+0xC)));
    lua_settop(L,Top);
    return 1;
}
示例#2
0
// еще надо относительно курсора сделать
void FxBuffer_t::drawBuffers()
{
	int State=0;
	int Cnt=0;
	int OfsX=0,OfsY=0;
	int X1,Y1,X2,Y2;
	int Idx=0;
	char Stop[sizeof(FxBuffer_t)]={0};
	FxBuffer_t *StopBuf=(FxBuffer_t *)&Stop;

	for (FxBuffer_t *Buf=FxFirstBuffer;Buf!=NULL;Buf=Buf->Next)
	{
		for (DWORD *P=Buf->Data,*E=P + (Buf->Size - Buf->FreeSize) ;P<E; Idx++)
		{
			switch(State)///!!! не менее 2х
			{
			case 0: // читаем данные 
				State=1 + *(P++);
				break;
			case 1:
				State = 0;
				P++;
				break;
			case 2:
				Cnt=*(P++);
				State = 103;
				break;
			case 103:
				if ((--Cnt)==0)
					State = 0;
				P++;
				break;
			case 9:
				noxSetRectColorMB(*(P++));
				State = 0;
				break;
			case 10: // начинаем рисовать линию
				State=105;
				Cnt=*(P++);
				break;
			case 105: // совсем первая точка X
				if (--Cnt==0)
					State = 0;
				else
					State = 106;
				X1 = *((int*)(P++)) - OfsX;
				break;
			case 106: // совсем первая точка Y
				if (--Cnt==0)
					State = 0;
				else
					State = 107;
				Y1 = *((int*)(P++)) - OfsY;
				break;
			case 107: // совсем первая точка X
				if (--Cnt==0)
					State = 0;
				else
					State = 108;
				X2 = *((int*)(P++)) - OfsX;
				break;
			case 108: // совсем первая точка Y
				if (--Cnt==0)
					State = 0;
				else
					State = 107;
				Y2 = *((int*)(P++)) - OfsY;
				noxRasterPoint(X1,Y1);
				noxRasterPoint(X2,Y2);
				noxRasterDrawLines();
				X1=X2;Y1=Y2;
				break;
			case 11:// нулевое смещение
				OfsX=0;
				OfsY=0;
				State = 0;
				break;
			case 12:// смещение от вьюпорта
				OfsX=*noxScreenX;
				OfsY=*noxScreenY;
				State = 0;
				break;
			case 13:// остановка
				Buf=StopBuf;
				P=E;
				State = 0;
				break;
			case 14: // сдвиг [сколько, dX, dY , откуда, куда], проверить
				State=110;
				Cnt=*(P++);
				break;
			case 110:
				State=111;
				Y1=*(P++);
				break;
			case 111:
				State=112;
				Y2=*(P++);
				break;
			case 112:
				State=113;
				X1=*(P++);
				break;
			case 113:
				State = 0;
				X2=*(P++);
				{
					FxBuffer_t *db=FxFirstBuffer;
					DWORD *sp=0,*dp=0;
					for( int Base=0 ; db!=NULL ; db= db->Next,Base+=db->Size)
					{
						if ( X1 > Base && X1 < Base + db->Size ) // в этом буфере лежит источник
						{
							X1 -=Base;
							sp = db->Data;
						}
						if ( X2 > Base && X2 < Base + db->Size ) // в этом буфере лежит назначение
						{
							X2 -=Base;
							dp = db->Data;
						}
					}
					while ( Cnt-- )
					{
						*dp = *sp + Y1;
						dp++;
						sp++;
						if (!Cnt--)
							break;
						*dp = *sp + Y2;
						dp++;
						sp++;

					}
					State=0;
				}
				break;
			case 15: //line to cursor
				X1 = *((int*)(P++));
				State=114;
				break;
			case 114:
				Y1 = *((int*)(P++));
				State=115;
				break;
			case 115:
				if ((*GameFlags&1)==0) //client
				{
					int *pI=(int*)(*clientPlayerInfoPtr+0x8EC);
					X2=*(pI++);
					Y2=*pI;
				}
				else 
				{
					X2=-1;
					for (bigUnitStruct *Pl=playerFirstUnit();Pl!=NULL;Pl=playerNextUnit(Pl))
					{
						char *Uc=(char *)Pl->unitController;
						Uc=*((char **)(Uc+0x114));
						if (Uc[0x810]!=*P)
							continue;
						int *pI=(int*)(Uc+0x8EC);
						X2=*(pI++);
						Y2=*pI;
						break;
					}
				}
				P++;
				if (X2>0)
				{
					noxRasterPoint(X1 - OfsX,Y1 - OfsY);
					noxRasterPoint(X2 - OfsX,Y2 - OfsY);
					noxRasterDrawLines();				
				}
				State=0;
				break;
			case 16:
			default:
				P++;
				break;
			}
		}
	}
}