📄 nbmp.h
字号:
cnt++;
continue; /*图象垂直溢出*/
}
else if (cnt)
{
lseek(fp, cnt * len2, SEEK_CUR);
cnt = 0;
}
read_scan_line(fp, buffer, len2);
page1 = (char)((addr1 = ((Uint32)yy + g_sl_offset) * g_screen_h + x) >> 16);
if (page1 == ((addr1 + length) >> 16))
{
int far *d_tmp = (int far *)(g_videoptr + (unsigned)(addr1 & 0xffff));
set_vbe_page(page1);
/*#if HIGH_COMPILE_MODE && NEO_draw_optimization_beused
memcpy(d_tmp, s_tmp, (len - origin)<<1);
#else*/
if (!g_mask_flag_)
{
for (start = temp, k = origin; k < len; ++k, ++start)
{
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = s_tmp[start]; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ s_tmp[start]; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | s_tmp[start]; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & s_tmp[start]; break;
}
#else
d_tmp[k] = s_tmp[start];
/*movedata(s_tmp, start, d_tmp, k, (len - origin)<<1);*/
#endif
}
/*#endif*/
}
else
{
char far *dd = (char far *)d_tmp;
char *ss = (char *)s_tmp;
for (start = (temp << 1), k = (origin << 1); k < (len << 1); ++k, ++start)
{
if (ss[start] != MASK_COLOR_)
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : dd[k] = ss[start]; break;
case XOR_PUT : dd[k] = dd[k] ^ ss[start]; break;
case NOT_PUT : dd[k] = ~dd[k]; break;
case OR_PUT : dd[k] = dd[k] | ss[start]; break;
case AND_PUT : dd[k] = dd[k] & ss[start]; break;
}
#else
dd[k] = ss[start];
#endif
}
}
}
else
{
i = 0;
if (!g_mask_flag_)
{
for(; i < masklen; ++i)
{
dot(i + xx, yy, buffer[i]);
}
}
else
{
for(; i < masklen; ++i)
{
if (buffer[i] != MASK_COLOR_)
dot(i + xx, yy, buffer[i]);
}
}
}
}
free(buffer);
close(fp);
return 1;
#endif
}
else if (g_bmpbits == 24) /*打开的是24位真彩位图*/
{
#ifndef NEO_24bit_bmp_unused
RGB24 *buffer, *b_tmp;
lseek(fp, 54, SEEK_SET);
if ((buffer=(RGB24 *)malloc(len2 = g_bmp_wid*sizeof(RGB24) + (wid_fix = (g_bmp_wid & 3))))==NULL)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"show_bmp", NO_MEMORY, 0};
close(fp);
throw_error(error);
#endif
}
b_tmp = buffer - offset;
len <<= 1;
for(j = real_hig; j >= 0; j--)
{
if (((yy = y + (g_v_flip_?real_hig - j : j) )<g_rect_top) || (yy > g_rect_bottom))
{
cnt++;
continue; /*图象垂直溢出*/
}
else if (cnt)
{
lseek(fp, cnt * len2, SEEK_CUR);
cnt = 0;
}
read_scan_line(fp, buffer, len2);
page1 = (Uint8)((addr1 = ((Uint32)yy + g_sl_offset) * g_screen_h + x) >> 16);
if (page1 == ((addr1 + length) >> 16))
{
char far *d_tmp = (char far *)(g_videoptr+ (unsigned)(addr1 & 0xffff));
start = temp; k = origin;
set_vbe_page(page1);
if (!g_mask_flag_)
{
for (; k < len; ++start ,++k)
{
#ifndef NEO_draw_mode_unused
color = makecol(b_tmp[start].b, b_tmp[start].g, b_tmp[start].r);
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = color; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & color; break;
}
#else
d_tmp[k] = makecol(b_tmp[start].b, b_tmp[start].g, b_tmp[start].r);
#endif
}
}
else
{
for (; k < len; ++start ,++k)
{
if (!(b_tmp[start].b == 0xff && b_tmp[start].r == b_tmp[start].b && b_tmp[start].g == 0))
#ifndef NEO_draw_mode_unused
{
color = makecol(b_tmp[start].b, b_tmp[start].g, b_tmp[start].r);
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = color; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & color; break;
}
}
#else
d_tmp[k] = makecol(b_tmp[start].b, b_tmp[start].g, b_tmp[start].r);
#endif
}
}
}
else /*处理发生换页的扫描线*/
{
i = 0;
if (!g_mask_flag_)
{
for(; i < masklen; ++i)
{
if (!(buffer[start].b == 0xff && buffer[start].r == buffer[start].b && buffer[start].g == 0))
dot(xx + i, yy, makecol(buffer[i].b, buffer[i].g, buffer[i].r));
}
}
else
{
for(; i < masklen; ++i)
{
dot(xx + i, yy, makecol(buffer[i].b, buffer[i].g, buffer[i].r));
}
}
}
}
free(buffer);
close(fp);
return 1;
#endif
}
else
{
close(fp);
return -2;
}
#else
wid_fix = x = y = xx = 0;
bmpfile += 0;
#endif
}
else if (g_color_depth == 15 || g_color_depth == 16) /*在高彩(16位色)模式下*/
{
#ifndef NEO_color_depth_16_unused
if (start < 0) start = g_rect_left - fix;
temp = start;
lseek(fp, 54, SEEK_SET);
if (g_bmpbits == 24) /*打开的是24位真彩位图*/
{
#ifndef NEO_24bit_bmp_unused
RGB24 *buffer, *b_tmp;
if ((buffer=(RGB24 *)malloc(len2 = g_bmp_wid * sizeof(RGB24) + (wid_fix = (g_bmp_wid & 3))))==NULL)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"show_bmp", NO_MEMORY, 0};
close(fp);
throw_error(error);
#endif
}
b_tmp = buffer-offset;
for(j = real_hig; j >= 0; j--)
{
if (((yy = y + (g_v_flip_?real_hig - j : j) )<g_rect_top) || (yy > g_rect_bottom))
{
cnt++;
continue; /*图象垂直溢出*/
}
else if (cnt)
{
lseek(fp, cnt * len2, SEEK_CUR);
cnt = 0;
}
read_scan_line(fp, buffer, len2);
page1 = (char)((addr1 = ((Uint32)yy + g_sl_offset) * g_screen_h + x) >> 15);
if (page1 == ((addr1 + length) >> 15))
{
int far *d_tmp = (int far *)(g_videoptr+ (unsigned)((addr1<<1) & 0xffff));
start = temp; k = g_rect_left - fix;
set_vbe_page(page1);
if (!g_mask_flag_)
{
for (; k < len; ++start ,++k)
{
#ifndef NEO_draw_mode_unused
color = (b_tmp[start].r>>3)|((b_tmp[start].g>>g_green_bit)<<5)|((b_tmp[start].b>>3)<<11);
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = color; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & color; break;
}
#else
d_tmp[k] = (b_tmp[start].r>>3)|((b_tmp[start].g>>g_green_bit)<<5)|((b_tmp[start].b>>3)<<11);
#endif
}
}
else
{
for (; k < len; ++start ,++k)
{
if ((color = (b_tmp[start].r>>3)|((b_tmp[start].g>>g_green_bit)<<5)|((b_tmp[start].b>>3)<<11)) != MASK_COLOR_)
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = color; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & color; break;
}
#else
d_tmp[k] = color;
#endif
}
}
}
else
{
i = 0;
if (!g_mask_flag_)
{
for(; i < masklen; ++i)
{
color = ((((buffer[i].b>>3)<<g_green_mask)+(buffer[i].g>>g_green_bit))<<5)+(buffer[i].r>>3);
dot(xx + i, yy, color);
}
}
else
{
for(; i < masklen; ++i)
{
color = ((((buffer[i].b>>3)<<g_green_mask)+(buffer[i].g>>g_green_bit))<<5)+(buffer[i].r>>3);
if (color != MASK_COLOR_)
dot(xx+i, yy, color);
}
}
}
}
free(buffer);
close(fp);
return 1;
#endif
}
else if (g_bmpbits == 16) /*打开的是16位高彩位图*/
{
#ifndef NEO_16bit_bmp_unused
RGB16 *buffer, *b_tmp;
if ((buffer=(RGB16 *)malloc(len2 = g_bmp_wid*sizeof(RGB16) + (wid_fix = (g_bmp_wid & 3))))==NULL)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"show_bmp", NO_MEMORY, 0};
close(fp);
throw_error(error);
#endif
}
b_tmp = buffer-offset;
for(j = real_hig; j >= 0; j--)
{
if (((yy = y + (g_v_flip_?real_hig - j : j) ) < g_rect_top) || (yy > g_rect_bottom))
{
cnt++;
continue; /*图象垂直溢出*/
}
else if (cnt)
{
lseek(fp, cnt * len2, SEEK_CUR);
cnt = 0;
}
read_scan_line(fp, buffer, len2);
page1 = (char)((addr1 = ((Uint32)yy + g_sl_offset) * g_screen_h + x) >> 15);
if (page1 == ((addr1 + length) >> 15))
{
int far *d_tmp = (int far *)(g_videoptr+ (unsigned)((addr1<<1) & 0xffff));
start = temp; k = g_rect_left - fix;
set_vbe_page(page1);
if (!g_mask_flag_)
{
for (; k < len; ++start ,++k)
{
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = b_tmp[k].color; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ b_tmp[k].color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | b_tmp[k].color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & b_tmp[k].color; break;
}
#else
d_tmp[k] = b_tmp[k].color;
#endif
}
}
else
{
for (; k < len; ++start ,++k)
{
if (b_tmp[k].color != MASK_COLOR_)
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = b_tmp[k].color; break;
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ b_tmp[k].color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | b_tmp[k].color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & b_tmp[k].color; break;
}
#else
d_tmp[k] = b_tmp[k].color;
#endif
}
}
}
else
{
i = 0;
if (!g_mask_flag_)
{
for(; i < masklen; ++i)
{
dot(xx + i, yy, buffer[i].color);
}
}
else
{
for(; i < masklen; ++i)
{
if (buffer[i].color != MASK_COLOR_)
dot(xx+i, yy, buffer[i].color);
}
}
}
}
free(buffer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -