⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nbmp.h

📁 NEO SDK是一个跨平台的免费开源图形软件开发包。它支持基本绘图、多种格式图形显示、鼠标操 作、扩展内存和扩充内存的操作、时钟、音频播放、多种字体的汉字及英文显示等等特性;更激动人心的是
💻 H
📖 第 1 页 / 共 3 页
字号:
               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 + -