📄 qtewin.cpp
字号:
else if (g_server_bpp == 24)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
if ((i + srcy) < the_bitmap->h && (j + srcx) < the_bitmap->w)
set_pixel(x + j, y + i,
*(((uint32*)the_bitmap->data) + ((i + srcy) * the_bitmap->w + (j + srcx))),
opcode);
}
}
redraw(x, y, cx, cy);
}
/******************************************************************************/
// not used
void ui_triblt(uint8 opcode, int x, int y, int cx, int cy,
HBITMAP src, int srcx, int srcy, BRUSH * brush,
int bgcolour, int fgcolour)
{
}
/******************************************************************************/
/* Bresenham's line drawing algorithm */
void ui_line(uint8 opcode, int startx, int starty, int endx,
int endy, PEN * pen)
{
int dx, dy, incx, incy, dpr, dpru, p, left, top, right, bottom;
if (startx > endx)
{
dx = startx - endx;
incx = -1;
left = endx;
right = startx;
}
else
{
dx = endx - startx;
incx = 1;
left = startx;
right = endx;
}
if (starty > endy)
{
dy = starty - endy;
incy = -1;
top = endy;
bottom = starty;
}
else
{
dy = endy - starty;
incy = 1;
top = starty;
bottom = endy;
}
if (dx >= dy)
{
dpr = dy << 1;
dpru = dpr - (dx << 1);
p = dpr - dx;
for (; dx >= 0; dx--)
{
set_pixel(startx, starty, pen->colour, opcode);
if (p > 0)
{
startx += incx;
starty += incy;
p += dpru;
}
else
{
startx += incx;
p += dpr;
}
}
}
else
{
dpr = dx << 1;
dpru = dpr - (dy << 1);
p = dpr - dy;
for (; dy >= 0; dy--)
{
set_pixel(startx, starty, pen->colour, opcode);
if (p > 0)
{
startx += incx;
starty += incy;
p += dpru;
}
else
{
starty += incy;
p += dpr;
}
}
}
redraw(left, top, (right - left) + 1, (bottom - top) + 1);
}
/******************************************************************************/
void draw_glyph (int x, int y, HGLYPH glyph, int fgcolour)
{
struct bitmap *the_glyph;
int i, j;
the_glyph = (struct bitmap*)glyph;
if (the_glyph == NULL)
return;
for (i = 0; i < the_glyph->h; i++)
for (j = 0; j < the_glyph->w; j++)
if (is_pixel_on(the_glyph->data, j, i, the_glyph->w, 8))
set_pixel(x + j, y + i, fgcolour);
}
#define DO_GLYPH(ttext,idx) \
{\
glyph = cache_get_font (font, ttext[idx]);\
if (!(flags & TEXT2_IMPLICIT_X))\
{\
xyoffset = ttext[++idx];\
if ((xyoffset & 0x80))\
{\
if (flags & TEXT2_VERTICAL) \
y += ttext[idx+1] | (ttext[idx+2] << 8);\
else\
x += ttext[idx+1] | (ttext[idx+2] << 8);\
idx += 2;\
}\
else\
{\
if (flags & TEXT2_VERTICAL) \
y += xyoffset;\
else\
x += xyoffset;\
}\
}\
if (glyph != NULL)\
{\
draw_glyph (x + glyph->offset, y + glyph->baseline, glyph->pixmap, fgcolour);\
if (flags & TEXT2_IMPLICIT_X)\
x += glyph->width;\
}\
}
/******************************************************************************/
//*****************************************************************************
void ui_draw_text(uint8 font, uint8 flags, uint8 opcode, int mixmode,
int x, int y, int clipx, int clipy,
int clipcx, int clipcy, int boxx,
int boxy, int boxcx, int boxcy, BRUSH * brush,
int bgcolour, int fgcolour, uint8 * text, uint8 length)
{
FONTGLYPH * glyph;
int i, j, xyoffset;
DATABLOB * entry;
if (boxx + boxcx > g_width)
boxcx = g_width - boxx;
if (boxy + boxcy > g_height)
boxcy = g_height - boxy;
if (boxcx > 1)
fill_rect(boxx, boxy, boxcx, boxcy, bgcolour);
else if (mixmode == MIX_OPAQUE)
fill_rect(clipx, clipy, clipcx, clipcy, bgcolour);
/* Paint text, character by character */
for (i = 0; i < length;)
{
switch (text[i])
{
case 0xff:
if (i + 2 < length)
cache_put_text(text[i + 1], text, text[i + 2]);
else
{
error("this shouldn't be happening\n");
exit(1);
}
/* this will move pointer from start to first character after FF command */
length -= i + 3;
text = &(text[i + 3]);
i = 0;
break;
case 0xfe:
entry = cache_get_text(text[i + 1]);
if (entry != NULL)
{
if ((((uint8 *) (entry->data))[1] == 0) && (!(flags & TEXT2_IMPLICIT_X)))
{
if (flags & TEXT2_VERTICAL)
y += text[i + 2];
else
x += text[i + 2];
}
for (j = 0; j < entry->size; j++)
DO_GLYPH(((uint8 *) (entry->data)), j);
}
if (i + 2 < length)
i += 3;
else
i += 2;
length -= i;
/* this will move pointer from start to first character after FE command */
text = &(text[i]);
i = 0;
break;
default:
DO_GLYPH(text, i);
i++;
break;
}
}
if (boxcx > 1)
redraw(boxx, boxy, boxcx, boxcy);
else
redraw(clipx, clipy, clipcx, clipcy);
}
/******************************************************************************/
void ui_desktop_save(uint32 offset, int x, int y, int cx, int cy)
{
uint8 * data;
int i, j, Bpp, pixel;
Bpp = 4;
switch (g_server_bpp)
{
case 8: Bpp = 1; break;
case 15: Bpp = 2; break;
case 16: Bpp = 2; break;
}
data = (uint8*)xmalloc(cx * cy * Bpp);
if (g_server_bpp == 8)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
{
pixel = get_pixel(x + j, y + i);
SETPIXEL8(data, j, i, cx, pixel);
}
}
else if (g_server_bpp == 16)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
{
pixel = get_pixel(x + j, y + i);
SETPIXEL16(data, j, i, cx, pixel);
}
}
else if (g_server_bpp == 24)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
*(((uint32*)data) + (i * cx + j)) = get_pixel(x + j, y + i);
}
offset *= Bpp;
cache_put_desktop(offset, cx, cy, cx * Bpp, Bpp, data);
xfree(data);
}
/******************************************************************************/
void ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy)
{
uint8 * data;
int i, j;
int Bpp;
Bpp = 4;
switch (g_server_bpp)
{
case 8: Bpp = 1; break;
case 15: Bpp = 2; break;
case 16: Bpp = 2; break;
}
offset *= Bpp;
data = cache_get_desktop(offset, cx, cy, Bpp);
if (g_server_bpp == 8)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
set_pixel(x + j, y + i, data[i * cx + j]);
}
else if (g_server_bpp == 16)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
set_pixel(x + j, y + i, *(((uint16*)data) + (i * cx + j)));
}
else if (g_server_bpp == 24)
{
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
set_pixel(x + j, y + i, *(((uint32*)data) + (i * cx + j)));
}
redraw(x, y, cx, cy);
}
/*****************************************************************************/
void * xrealloc(void * in_val, int size)
{
if (size < 1)
{
size = 1;
}
return realloc(in_val, size);
}
/*****************************************************************************/
void * xmalloc(int size)
{
return malloc(size);
}
/*****************************************************************************/
void xfree(void * in_val)
{
if (in_val != NULL)
{
free(in_val);
}
}
/*****************************************************************************/
char * xstrdup(const char * s)
{
char * mem = strdup(s);
if (mem == NULL)
{
perror("strdup");
exit(1);
}
return mem;
}
/*****************************************************************************/
void warning(char * format, ...)
{
va_list ap;
fprintf(stderr, "WARNING: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/*****************************************************************************/
void unimpl(char * format, ...)
{
va_list ap;
fprintf(stderr, "NOT IMPLEMENTED: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/*****************************************************************************/
void error(char * format, ...)
{
va_list ap;
fprintf(stderr, "ERROR: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/*****************************************************************************/
BOOL rd_pstcache_mkdir(void)
{
return 0;
}
/*****************************************************************************/
int rd_open_file(char * filename)
{
return 0;
}
/*****************************************************************************/
void rd_close_file(int fd)
{
return;
}
/*****************************************************************************/
int rd_read_file(int fd, void * ptr, int len)
{
return 0;
}
/*****************************************************************************/
int rd_write_file(int fd, void * ptr, int len)
{
return 0;
}
/*****************************************************************************/
int rd_lseek_file(int fd, int offset)
{
return 0;
}
/*****************************************************************************/
BOOL rd_lock_file(int fd, int start, int len)
{
return False;
}
/*****************************************************************************/
int load_licence(uint8 ** data)
{
return 0;
}
/*****************************************************************************/
void save_licence(uint8 * data, int length)
{
}
/*****************************************************************************/
void generate_random(uint8 * random)
{
QFile File("/dev/random");
File.open(IO_ReadOnly);
if (File.readBlock((char*)random, 32) == 32)
{
return;
}
warning("no /dev/random\n");
memcpy(random, "12345678901234567890123456789012", 32);
}
/*****************************************************************************/
/* produce a hex dump */
void hexdump(uint8 * p, uint32 len)
{
uint8 * line = p;
int i, thisline;
uint32 offset = 0;
while (offset < len)
{
printf("%04x ", offset);
thisline = len - offset;
if (thisline > 16)
{
thisline = 16;
}
for (i = 0; i < thisline; i++)
{
printf("%02x ", line[i]);
}
for (; i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -