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; }
// еще надо относительно курсора сделать 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; } } } }