tune code for 64-bit

This commit is contained in:
VincentWei
2018-01-18 09:57:50 +08:00
parent b59f0b6a93
commit 8b6731d706
19 changed files with 119 additions and 80 deletions
+1 -2
View File
@@ -5838,12 +5838,11 @@ static RECT4MASK* CalcXYBannedRects (HDC hdc, const void* mask, int * rect_size,
int pitch = bmp->bmAlphaPitch;
sA = bmp->bmAlphaMask[y * pitch + x/bmp->bmBytesPerPixel];
DISEMBLE_RGB (p, bpp, pixfmt, pixel, sR, sG, sB);
sR += sG + sB; /* suspend the warning */
}
else {
DISEMBLE_RGBA (p, bpp, pixfmt, pixel, sR, sG, sB, sA);
sR += sG + sB; /* suspend the warning */
}
sR ^= sG & sB; /* prevent unused-but-set-variable warning */
}
else {
pixel = bits [y * ((MYBITMAP*)mask)->pitch + x];
+1 -4
View File
@@ -1210,9 +1210,8 @@ static int RLEColorkeySurface(GAL_Surface *surface)
Uint8 *rlebuf, *dst;
int maxn;
int y;
Uint8 *srcbuf, *curbuf, *lastline;
Uint8 *srcbuf, *lastline;
int maxsize = 0;
int skip, run;
int bpp = surface->format->BytesPerPixel;
getpix_func getpix;
Uint32 ckey, rgbmask;
@@ -1246,9 +1245,7 @@ static int RLEColorkeySurface(GAL_Surface *surface)
/* Set up the conversion */
srcbuf = (Uint8 *)surface->pixels+surface->offset;
curbuf = srcbuf;
maxn = bpp == 4 ? 65535 : 255;
skip = run = 0;
dst = rlebuf;
rgbmask = ~surface->format->Amask;
ckey = surface->format->colorkey & rgbmask;
+5 -5
View File
@@ -55,7 +55,7 @@ static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
/* Execute the fill command */
tdfx_wait(6);
tdfx_out32(DSTBASE, (Uint32)dst_base);
tdfx_out32(DSTBASE, (UINT_PTR)dst_base);
tdfx_out32(DSTFORMAT, format);
tdfx_out32(COLORFORE, color);
tdfx_out32(COMMAND_2D, COMMAND_2D_FILLRECT);
@@ -73,7 +73,7 @@ static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
GAL_VideoDevice *this = current_video;
int bpp;
Uint32 src_format;
Uint32 dst_format;
/* Uint32 dst_format; */
char *src_base;
char *dst_base;
int srcX, srcY;
@@ -89,7 +89,7 @@ static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
src_format = src->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);
dst_base = (char *)((char *)dst->pixels - mapped_mem);
bpp = dst->format->BitsPerPixel;
dst_format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);
/* dst_format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13); */
srcX = srcrect->x;
srcY = srcrect->y;
@@ -120,9 +120,9 @@ static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
use_colorkey = 0;
}
tdfx_wait(9);
tdfx_out32(SRCBASE, (Uint32)src_base);
tdfx_out32(SRCBASE, (UINT_PTR)src_base);
tdfx_out32(SRCFORMAT, src_format);
tdfx_out32(DSTBASE, (Uint32)dst_base);
tdfx_out32(DSTBASE, (UINT_PTR)dst_base);
tdfx_out32(DSTFORMAT, src_format);
tdfx_out32(COMMAND_2D, blitop);
tdfx_out32(COMMANDEXTRA_2D, use_colorkey);
+1 -1
View File
@@ -99,7 +99,7 @@ static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
NEO_BC0_SRC_IS_FG |
NEO_BC3_SKIP_MAPPING | 0x0c0000;
neo2200->dstStart = (Uint32) dst_base +
neo2200->dstStart = (UINT_PTR) dst_base +
(rect->y * dst->pitch) +
(rect->x * dst->format->BytesPerPixel);
+8 -2
View File
@@ -516,7 +516,13 @@ static int PCXVFB_VideoInit (_THIS, GAL_PixelFormat *vformat)
return -1;
}
}
read(__mg_pcxvfb_client_sockfd, &shmid, sizeof(int));
if (read(__mg_pcxvfb_client_sockfd, &shmid, sizeof(int)) < sizeof (int)) {
GAL_SetError ("NEWGAL>PCXVFB: read error from client socket.\n");
close (__mg_pcxvfb_client_sockfd);
close (__mg_pcxvfb_server_sockfd);
return -1;
}
if (shmid != -1) {
data->shmrgn = (unsigned char *)shmat (shmid, 0, 0);
@@ -548,7 +554,7 @@ static int PCXVFB_VideoInit (_THIS, GAL_PixelFormat *vformat)
#endif
#endif //end of os (windows, cygwin, linux)
if ((int)data->shmrgn == -1 || data->shmrgn == NULL) {
if ((INT_PTR)data->shmrgn == -1 || data->shmrgn == NULL) {
GAL_SetError ("NEWGAL>PCXVFB: Unable to attach to "
"virtual FrameBuffer server.\n");
return -1;
-2
View File
@@ -157,7 +157,6 @@ int GAL_SoftStretch(GAL_Surface *src, GAL_Rect *srcrect,
GAL_Surface *dst, GAL_Rect *dstrect)
{
int pos, inc;
int dst_width;
int dst_maxrow;
int src_row, dst_row;
Uint8 *srcp = NULL;
@@ -209,7 +208,6 @@ int GAL_SoftStretch(GAL_Surface *src, GAL_Rect *srcrect,
inc = (srcrect->h << 16) / dstrect->h;
src_row = srcrect->y;
dst_row = dstrect->y;
dst_width = dstrect->w*bpp;
#ifdef USE_ASM_STRETCH
/* Write the opcodes for this stretch */
+1 -7
View File
@@ -925,13 +925,7 @@ static GAL_Surface *Slave_CreateSurface (GAL_VideoDevice *this,
int width, int height, int depth,
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
{
GAL_Surface *screen, *surface;
if (this) {
screen = this->screen;
} else {
screen = NULL;
}
GAL_Surface *surface;
surface = (GAL_Surface *)malloc(sizeof(*surface));
+6 -1
View File
@@ -364,11 +364,16 @@ static int _gdi_output_glyphs_direct(PDC pdc, const unsigned char* text,
int prev_len = 0;
const unsigned char* prev_mchar = NULL;
int i = 0;
int limit_width = -1, line_width = 0;
int line_width = 0;
DRAWTEXTEX2_CTXT* ctxt = (DRAWTEXTEX2_CTXT*)context;
#if 0
int limit_width = -1;
if(if_break){
limit_width = ctxt->max_extent;
}
#endif
while (left_bytes > 0){
if(mbc_devfont){
len_cur_char = mbc_devfont->charset_ops->len_first_char
+3 -5
View File
@@ -2486,14 +2486,14 @@ void GUIAPI ExpandPart16CBitmapEx (HDC hdc, BYTE* bits, Uint32 pitch, const BYTE
Uint32 x, y;
BYTE *dst, *dst_line;
const BYTE *src, *src_line;
int index, bpp;
int index;
//int bpp;
Uint32 pixel;
BYTE byte = 0;
int bnum,continum,i;
pdc = dc_HDC2PDC(hdc);
bpp = GAL_BytesPerPixel (pdc->surface);
// bpp = GAL_BytesPerPixel (pdc->surface);
dst_line = bits;
if (flags & MYBMP_FLOW_UP)
@@ -2945,7 +2945,6 @@ void GUIAPI HFlipBitmap (BITMAP* bmp, unsigned char* inter_buff)
void GUIAPI VFlipBitmap (BITMAP* bmp, unsigned char* inter_buff)
{
int y;
int bpp;
unsigned char* sline, *dline;
if (bmp->bmType & BMP_TYPE_ALPHA_MASK) {
@@ -2967,7 +2966,6 @@ void GUIAPI VFlipBitmap (BITMAP* bmp, unsigned char* inter_buff)
free(alpha_inter_buff);
}
bpp = bmp->bmBytesPerPixel;
sline = bmp->bmBits;
dline = bmp->bmBits + bmp->bmPitch * bmp->bmHeight;
+1 -1
View File
@@ -289,7 +289,7 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
int glyph_type)
{
DRAWTEXTEX2_CTXT* ctxt = (DRAWTEXTEX2_CTXT*)context;
int adv_x, adv_y;
int adv_x = 0, adv_y = 0;
BBOX bbox;
int bkmode;
+1 -1
View File
@@ -608,7 +608,7 @@ static void _dc_draw_pixel_span_set_2 (COMP_CTXT* comp_ctxt, int w)
| (Uint16)comp_ctxt->cur_pixel);
Uint32 * dest32;
int count;
if ((Uint32)comp_ctxt->cur_dst & 3) // Ensure 4-byte alignment.
if ((UINT_PTR)comp_ctxt->cur_dst & 3) // Ensure 4-byte alignment.
{
*dest16++ = (Uint16)comp_ctxt->cur_pixel;
--w;
+42 -20
View File
@@ -109,18 +109,18 @@ static void read_bmicolors_m (int ncols, RGB *pal, const Uint8 *p)
HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which)
{
FILE* fp;
WORD wTemp;
WORD16 wTemp;
BYTE bTemp;
int w, h, colornum;
DWORD size, offset;
DWORD imagesize, imagew, imageh;
DWORD32 offset;
DWORD32 imagesize;
BYTE* image;
HICON icon = 0;
RGB pal[256];
if( !(fp = fopen(filename, "rb")) ) return 0;
if (!(fp = fopen (filename, "rb"))) return 0;
fseek(fp, sizeof(WORD), SEEK_SET);
fseek (fp, sizeof (WORD16), SEEK_SET);
/* the cbType of struct ICONDIR.*/
wTemp = MGUI_ReadLE16FP (fp);
@@ -151,14 +151,25 @@ HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which)
wTemp = MGUI_ReadLE16FP (fp); /* the wBitCount*/
if(wTemp > 8) goto error;
#if 0
DWORD32 size;
size = MGUI_ReadLE32FP (fp);
#else
fseek(fp, sizeof(DWORD32), SEEK_CUR); /* skip the wSize member.*/
#endif
offset = MGUI_ReadLE32FP (fp);
/* read the cursor image info. */
fseek(fp, offset, SEEK_SET);
fseek(fp, sizeof(DWORD), SEEK_CUR); /* skip the biSize member.*/
fseek(fp, sizeof(DWORD32), SEEK_CUR); /* skip the biSize member.*/
#if 0
DWORD32 imagew, imageh;
imagew = MGUI_ReadLE32FP (fp);
imageh = MGUI_ReadLE32FP (fp);
#else
fseek(fp, sizeof(DWORD32), SEEK_CUR); /* skip the biWidth member.*/
fseek(fp, sizeof(DWORD32), SEEK_CUR); /* skip the biHeight member.*/
#endif
/* check the biPlanes member;*/
wTemp = MGUI_ReadLE16FP (fp);
@@ -169,7 +180,7 @@ HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which)
if(wTemp > 8) goto error;
colornum = (int)wTemp;
fseek(fp, sizeof(DWORD), SEEK_CUR); /* skip the biCompression members.*/
fseek(fp, sizeof(DWORD32), SEEK_CUR); /* skip the biCompression members.*/
if (colornum == 1)
imagesize = align_32_bits(w>>3) * h;
@@ -179,10 +190,10 @@ HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which)
imagesize = align_32_bits(w) * h;
imagesize += align_32_bits(w>>3) * h;
fseek(fp, sizeof(DWORD), SEEK_CUR);
fseek(fp, sizeof(DWORD32), SEEK_CUR);
/* skip the rest members and the color table.*/
fseek(fp, sizeof(DWORD)*4, SEEK_CUR);
fseek(fp, sizeof(DWORD32)*4, SEEK_CUR);
read_bmicolors_f (1 << colornum, pal, fp);
/* allocate memory for image.*/
@@ -195,12 +206,15 @@ HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which)
goto error;
/* read image*/
fread (image, imagesize, 1, fp);
if (fread (image, imagesize, 1, fp) < imagesize) {
goto error_free;
}
icon = CreateIconEx (hdc, w, h,
image + (imagesize - (align_32_bits(w>>3) * h)), image,
colornum, pal);
error_free:
#ifndef HAVE_ALLOCA
free (image);
#endif
@@ -213,15 +227,15 @@ error:
HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which)
{
const Uint8* p = (Uint8*)area;
WORD wTemp;
WORD16 wTemp;
BYTE bTemp;
int w, h, colornum;
DWORD size, offset;
DWORD imagesize, imagew, imageh;
DWORD32 offset;
DWORD32 imagesize;
RGB pal[256];
p += sizeof (WORD);
p += sizeof (WORD16);
/* the cbType of struct ICONDIR.*/
wTemp = MGUI_ReadLE16Mem (&p);
@@ -252,15 +266,25 @@ HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which)
if (wTemp != 0 && wTemp != 1) goto error;
wTemp = MGUI_ReadLE16Mem (&p); /* the wBitCount */
if (wTemp > 8) goto error;
#if 0
DWORD32 size;
size = MGUI_ReadLE32Mem (&p);
#else
p += sizeof(DWORD32);
#endif
offset = MGUI_ReadLE32Mem (&p);
/* read the cursor image info. */
p = (Uint8*)area + offset;
/* skip the biSize member. */
p += sizeof(DWORD);
p += sizeof(DWORD32);
#if 0
DWORD32 imagew, imageh;
imagew = MGUI_ReadLE32Mem (&p);
imageh = MGUI_ReadLE32Mem (&p);
#else
p += sizeof(DWORD32);
#endif
/* check the biPlanes member; */
wTemp = MGUI_ReadLE16Mem (&p);
if (wTemp != 1) goto error;
@@ -269,7 +293,7 @@ HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which)
if (wTemp > 8) goto error;
colornum = (int)wTemp;
/* skip the biCompression members. */
p += sizeof (DWORD);
p += sizeof (DWORD32);
if (colornum == 1)
imagesize = align_32_bits(w>>3) * h;
@@ -279,10 +303,10 @@ HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which)
imagesize = align_32_bits(w) * h;
imagesize += align_32_bits(w>>3) * h;
p += sizeof (DWORD);
p += sizeof (DWORD32);
/* skip the rest members and the color table. */
p += sizeof(DWORD)*4;
p += sizeof(DWORD32)*4;
read_bmicolors_m (1 << colornum, pal, p);
p += sizeof(BYTE)*(4<<colornum);
@@ -299,11 +323,9 @@ HICON GUIAPI CreateIconEx (HDC hdc, int w, int h, const BYTE* pAndBits,
{
PDC pdc;
PICON picon;
int bpp;
Uint32 image_size;
pdc = dc_HDC2PDC (hdc);
bpp = GAL_BytesPerPixel (pdc->surface);
if( (w%16) != 0 || (h%16) != 0 ) return 0;
+5 -2
View File
@@ -1,7 +1,7 @@
/* $Id: miarc.c 12871 2010-05-07 06:13:42Z wanzheng $ */
/***********************************************************
Copyright (C) 2005 ~ 2007 Feynman Software
Copyright (C) 2005 ~ 2018 FMSoft
Copyright 1987, 1998 The Open Group
@@ -1465,7 +1465,6 @@ static int miGetArcPts (SppArcPtr parc, int cpt, SppPointPtr *ppPts)
xc, yc; /* the center point */
int count, i;
SppPointPtr poly;
POINT last; /* last point on integer boundaries */
/* The spec says that positive angles indicate counterclockwise motion.
* Given our coordinate system (with 0,0 in the upper left corner),
@@ -1512,8 +1511,12 @@ static int miGetArcPts (SppArcPtr parc, int cpt, SppPointPtr *ppPts)
poly[cpt].x = (xc + x0);
poly[cpt].y = (yc + y0);
#if 0
POINT last; /* last point on integer boundaries */
last.x = ROUNDTOINT( poly[cpt + 1].x = (xc + x1) );
last.y = ROUNDTOINT( poly[cpt + 1].y = (yc + y1) );
#endif
for(i = 2; i < count; i++)
{
+6 -2
View File
@@ -1374,19 +1374,23 @@ static void miWideDashSegment (PDC pdc, SpanDataPtr spanData, int* pDashOffset,
double saveK = 0.0;
BOOL first = TRUE;
double lcenterx, lcentery, rcenterx = 0.0, rcentery = 0.0;
gal_pixel fgPixel, bgPixel;
dx = x2 - x1;
dy = y2 - y1;
dashIndex = *pDashIndex;
pDash = pdc->dash_list;
dashRemain = pDash[dashIndex] - *pDashOffset;
#if 0
gal_pixel fgPixel;
gal_pixel bgPixel;
fgPixel = pdc->pencolor;
bgPixel = pdc->bkcolor;
if (pdc->brush_type == BT_OPAQUE_STIPPLED || pdc->brush_type == BT_TILED) {
bgPixel = fgPixel;
}
#endif
l = ((double) pdc->pen_width) / 2.0;
if (dx == 0) {
+4 -2
View File
@@ -149,7 +149,7 @@ static void _parallelogram_map(HDC hdc, const BITMAP *bmp, fixed sx[4],
int right_index;
/* Loop variables. */
int index, i, y;
int index, i;
/* Coordinates in bmp ordered as top-right-bottom-left. */
fixed corner_dc_x[4], corner_dc_y[4];
@@ -329,7 +329,9 @@ static void _parallelogram_map(HDC hdc, const BITMAP *bmp, fixed sx[4],
}
fill_info.dst_rect.h = 1;
y = 0;
#if 0
int y = 0;
#endif
while (1) {
if (scanline > MIN(dc_maxh, fixtoi(bottom_dc_y)))
break;
+4 -2
View File
@@ -366,12 +366,14 @@ int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
int nTabs, int *pTabPos, int nTabOrig, POINT* cur_pos)
{
TABBEDTEXTOUTEX_CTXT ctxt;
DEVFONT* sbc_devfont;
DEVFONT* mbc_devfont;
int nr_delim_newline = 0, line_len = 0;
#if 0
DEVFONT* sbc_devfont;
DEVFONT* mbc_devfont;
sbc_devfont = pdc->pLogFont->sbc_devfont;
mbc_devfont = pdc->pLogFont->mbc_devfont;
#endif
ctxt.pdc = pdc;
ctxt.start_x = x;
+5 -10
View File
@@ -432,7 +432,7 @@ static int mTextBuffer_find(mTextBuffer* self, int start,
if(start >= self->char_len)
return -1;
if((int)str == TI_LINERETURN || (int) str == TI_EOF)
if((INT_PTR)str == TI_LINERETURN || (INT_PTR)str == TI_EOF)
{
pos = findnstr(self->buffer + start, self->char_len - start, "\n", 1);
}
@@ -1155,13 +1155,10 @@ static void textlayout_updateselection(mTextLayout* self)
&& self->old_height != self->new_height)
{
int max;
int min;
if(self->old_height > self->new_height)
{
min = self->new_height;
max = self->old_height;
}else{
min = self->old_height;
max = self->new_height;
}
@@ -1367,7 +1364,7 @@ static void textlayout_relayout(mTextLayout* self, int begin,
{
mTextLayoutNodeSearchInfo searchInfo;
mTextLayoutNode *begin_node=NULL, *end_node = NULL;
int begin_index, end_index;
int begin_index;
ITextIterator* txtit;
mCommBTreeLeafIterator node_it;
BOOL bHeightChanged = FALSE; /* Very important for unequal height*/
@@ -1393,7 +1390,7 @@ static void textlayout_relayout(mTextLayout* self, int begin,
if(begin_node == NULL)
{
end_node = begin_node = textlayout_get_last_node(self, FALSE);
end_index = begin_index = textlayout_get_str_count(self);
begin_index = textlayout_get_str_count(self);
}
else
{
@@ -6405,7 +6402,6 @@ static int mTextEditor_wndProc(mTextEditor *self, int message, WPARAM wParam, LP
static void mTextEditor_setTitle(mTextEditor* self, const char* buff, int len)
{
//repalce
int old_title_idx;
int slen ;
if(!(GetWindowStyle(self->hwnd) & NCSS_TE_TITLE))
@@ -6417,7 +6413,6 @@ static void mTextEditor_setTitle(mTextEditor* self, const char* buff, int len)
if(len <= 0)
len = -1;
old_title_idx = self->title_idx;
_c(pTextBuffer)->replace(pTextBuffer, 0, self->title_idx, buff, len);
if(buff == NULL || len <= 0)
{
@@ -6555,7 +6550,7 @@ static void init_textedit(void)
}
/*======== The following is textedit control implementation. =========*/
static int mTextEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
static LRESULT mTextEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
mTextEditor *self = NULL;
@@ -6565,7 +6560,7 @@ static int mTextEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lPar
switch(message)
{
case MSG_CREATE:
if (!(self = NEWEX(mTextEditor, hWnd)))
if (!(self = NEWEX(mTextEditor, (DWORD)hWnd)))
return -1;
SetWindowAdditionalData2 (hWnd, (DWORD)self);
+10 -5
View File
@@ -207,8 +207,13 @@ int ncsParseConstructParams(va_list args, const char* signature, ...)
int argc;
int i;
/*
** the implementation of GET_ARG_COUNT is bad, because some systems
** define va_list as a pointer, and others define it as an array of
** pointers (of length 1).
if(GET_ARG_COUNT(args) <= 0)
return 0;
*/
argc = va_arg(args, int);
if(argc <= 0)
@@ -226,11 +231,11 @@ int ncsParseConstructParams(va_list args, const char* signature, ...)
break;
case 'f': //float
/* FIXME gcc says:
* warning: 'float' is promoted to 'double' when passed through '...'
* warning: (so you should pass 'double' not 'float' to 'va_arg')
* note: if this code is reached, the program will abort.
*/
/* FIXME gcc says:
** warning: 'float' is promoted to 'double' when passed through '...'
** warning: (so you should pass 'double' not 'float' to 'va_arg')
** note: if this code is reached, the program will abort.
*/
*(va_arg(params, float*)) = va_arg(args, double);
break;
case 'i': //integer
+15 -6
View File
@@ -56,12 +56,13 @@ static ClassType(clss) * clss##ClassConstructor(ClassType(clss)* _class); \
ClassType(clss) Class(clss) = { (PClassConstructor)clss##ClassConstructor }; \
static const char* clss##_type_name = #clss; \
static ClassType(clss) * clss##ClassConstructor(ClassType(clss)* _class) { \
unsigned short * _pintfOffset; \
unsigned short * _pintfOffset = NULL; \
_pintfOffset = (PVOID)((UINT_PTR)_pintfOffset ^ 0); /* prevent unused-but-set-variable warning */ \
_class = (ClassType(clss)*)((PClassConstructor)(Class(superCls).classConstructor))((mObjectClass*)_class); \
_pintfOffset = &_class->intfOffset; \
_class->super = &Class(superCls); \
_class->typeName = clss##_type_name; \
_class->objSize = sizeof(clss); \
_pintfOffset = &_class->intfOffset;
_class->objSize = sizeof(clss);
#define END_MINI_CLASS return _class; }
@@ -126,9 +127,9 @@ static ClassType(clss) * clss##ClassConstructor(ClassType(clss)* _class) { \
struct _##Interface { Interface##VTable *_vtable; };
#define IMPLEMENT(Clss,Interface) \
_class->_##Interface##_obj_offset = (unsigned int)(void*)&(((Clss*)0)->Interface##_); \
_class->_##Interface##_obj_offset = (UINT_PTR)(void*)&(((Clss*)0)->Interface##_); \
_class->_##Interface##_next_offset = 0; \
*_pintfOffset = (unsigned short)(unsigned int)(void*)&(((ClassType(Clss)*)0)->_##Interface##_obj_offset); \
*_pintfOffset = (unsigned short)(UINT_PTR)(void*)&(((ClassType(Clss)*)0)->_##Interface##_obj_offset); \
_pintfOffset = &_class->_##Interface##_next_offset;
#define INTERFACE_CAST(Interface, pobj) \
@@ -266,12 +267,18 @@ MGNCS_EXPORT mObject* mgInitObjectArgs(mObject* pobj, mObjectClass* _class, ...)
#define INIT_OBJ(Clss, pobj) INIT_OBJEX(Clss, pobj, 0)
#define INIT_OBJV(Clss, pobj, ...) ((Clss* )initObjectArgs((mObject*)((void*)(pobj)), \
(mObjectClass*)((void*)(&(Class(Clss)))), ##__VA_ARGS__))
/*
** the implementation of GET_ARG_COUNT is bad, because some systems
** define va_list as a pointer, and others define it as an array of
** pointers (of length 1).
static inline int MGGET_ARG_COUNT(va_list va)
{
union {
va_list va;
DWORD dva;
}_va;
} _va;
_va.va = va;
if(_va.dva == 0)
return 0;
@@ -282,6 +289,8 @@ static inline int MGGET_ARG_COUNT(va_list va)
return 1;
}
#define GET_ARG_COUNT MGGET_ARG_COUNT
*/
#define UNIT_OBJ(pobj) (_c(pobj)->destroy(pobj))