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

📄 output.c

📁 关于rcp2c_v3.rar协议在LINUX下的实现程序
💻 C
📖 第 1 页 / 共 4 页
字号:
    fprintf(gv_pfOutput_C, "#define FORM_RESOURCE_DEFINE   \n");
  else
  {
    fprintf(gv_pfOutput_C, "#define FORM_RESOURCE_DEFINE   \\\n");
    for(i=0;i<nFormDefineInfoCount;i++)
    {
      WriteSpace(gv_pfOutput_C,StartColumn);
      if(i!=nFormDefineInfoCount-1)
        fprintf(gv_pfOutput_C, "%s   \\\n",pFormDefineInfo[i]);
      else
        fprintf(gv_pfOutput_C, "%s   \n",pFormDefineInfo[i]);
    }
  }
  //Menu Resource Define
  fprintf(gv_pfOutput_C, "\n//Menu Resource define\n");
  if(nMenuDefineInfoCount==0)
    fprintf(gv_pfOutput_C, "#define MENU_RESOURCE_DEFINE   \n");
  else
  {
    fprintf(gv_pfOutput_C, "#define MENU_RESOURCE_DEFINE   \\\n");
    for(i=0;i<nMenuDefineInfoCount;i++)
    {
      WriteSpace(gv_pfOutput_C,StartColumn);
      if(i!=nMenuDefineInfoCount-1)
        fprintf(gv_pfOutput_C, "%s   \\\n",pMenuDefineInfo[i]);
      else
        fprintf(gv_pfOutput_C, "%s   \n",pMenuDefineInfo[i]);
    }
  }
  //Alert Resurce Define
  fprintf(gv_pfOutput_C, "\n//Menu Resource define\n");
  if(nAlertDefineInfoCount==0)
    fprintf(gv_pfOutput_C, "#define ALERT_RESOURCE_DEFINE   \n");
  else
  {
    fprintf(gv_pfOutput_C, "#define ALERT_RESOURCE_DEFINE   \\\n");
    for(i=0;i<nAlertDefineInfoCount;i++)
    {
      WriteSpace(gv_pfOutput_C,StartColumn);
      if(i!=nAlertDefineInfoCount-1)
        fprintf(gv_pfOutput_C, "%s   \\\n",pAlertDefineInfo[i]);
      else
        fprintf(gv_pfOutput_C, "%s   \n",pAlertDefineInfo[i]);
    }
  }
  //Bitmap Resurce Define
  fprintf(gv_pfOutput_C, "\n//Bitmap Resource define\n");
  if(nBitmapDefineInfoCount==0)
    fprintf(gv_pfOutput_C, "#define BITMAP_RESOURCE_DEFINE   \n");
  else
  {
    fprintf(gv_pfOutput_C, "#define BITMAP_RESOURCE_DEFINE   \\\n");
    for(i=0;i<nBitmapDefineInfoCount;i++)
    {
      WriteSpace(gv_pfOutput_C,StartColumn);
      if(i!=nBitmapDefineInfoCount-1)
        fprintf(gv_pfOutput_C, "%s   \\\n",pBitmapDefineInfo[i]);
      else
        fprintf(gv_pfOutput_C, "%s   \n",pBitmapDefineInfo[i]);
    }
  }
}

#define AUTO_COLORS 1
#define EXCHANGE_BITS 1
//windows Type define
#define WORD unsigned short
#define DWORD unsigned long
#define LONG long
#define UINT unsigned int
#define INT int

#pragma pack(push,BitmapStructDefine,2)
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER;
#pragma pack(pop,BitmapStructDefine)

typedef struct _EOS_BitmapType	
{
    short            imWidth;        /* Pixel width (X)              */
    short            imHeight;       /* Pixel height (Y)             */
    unsigned char    imAlign;        /* Image alignment              */
    unsigned char    imFlags;        /* Image flags                  */
    short            imRowBytes;     /* Bytes per row                */
    short            imBits;         /* Bits per pixel               */
    short            imPlanes;       /* Planes per pixel             */
    unsigned char    imData[16384];  /* (image data, variable length)*/
} EOS_BitmapType;

char * gpszBitmapTypeName[100];     //已有的Bitmap类型
int gnBitmapTypeCount=0;

int WriteBitmapType2CFile(FILE * fBmp,BITMAPINFOHEADER *pBitmapHeader)
{
  char szBitmapTypeName[1024];
  int i;
  sprintf(szBitmapTypeName,"%s_Bitmap_%dx%dx2",gv_IDPrefix,pBitmapHeader->biWidth,pBitmapHeader->biHeight);
  for(i=0;i<gnBitmapTypeCount;i++)
  {
    if(strcmp(szBitmapTypeName,gpszBitmapTypeName[i])==0)
      return 1;
  }
  gpszBitmapTypeName[gnBitmapTypeCount++]=strdup(szBitmapTypeName);
  //xxx_h.h
  fprintf(gv_pfOutput_H,"\ntypedef struct _%s\n{\n",szBitmapTypeName);
  WriteSpace(gv_pfOutput_H,gv_StartColumn);
  fprintf(gv_pfOutput_H,"BitmapType	imghead;  // Image Header record structure\n");
  WriteSpace(gv_pfOutput_H,gv_StartColumn);
  fprintf(gv_pfOutput_H,"UInt8    imData[%d*%d]; // (image data, variable length)\n",
    (pBitmapHeader->biWidth+3)/4,pBitmapHeader->biHeight);
  fprintf(gv_pfOutput_H,"} %s;\n",szBitmapTypeName);
  return 0;
}

int CovertBitmap2CFile(FILE * fBmp,char *szBitmapIdName)
{
  BITMAPFILEHEADER bitmapFileHeader;
  BITMAPINFOHEADER bitmapHeader;
  EOS_BitmapType DstBmp;
  UINT u32ReadLen;
  int StartColumn;
  char szBitmapTypeName[1024];
  char szBitmapName[1024];
  unsigned char lpBuf[1024];
  int nRow,nCol;
  char lpTable[]="0123456789ABCDEF";
  unsigned int pnColors[4]={0,0,0,0};
  unsigned int nColorSum;
  unsigned char ucColor;
  unsigned char * pByte;
  int nNumColors=0;
  int i;
  int bAutoColors=AUTO_COLORS;
  int bXchBit=EXCHANGE_BITS;

  u32ReadLen=fread(&bitmapFileHeader,1,sizeof(BITMAPFILEHEADER),fBmp);
  u32ReadLen=fread(&bitmapHeader,1,sizeof(BITMAPINFOHEADER),fBmp);
  if(bitmapHeader.biBitCount!=24)
  {
      sprintf(lpBuf,"Error: %s: BMP file request 24bit color depth.",szBitmapIdName);
      Error(lpBuf);
  }
  DstBmp.imHeight=(short)bitmapHeader.biHeight;
  DstBmp.imWidth=(short)bitmapHeader.biWidth;
  DstBmp.imAlign=0;
  DstBmp.imFlags=0;
  DstBmp.imPlanes=1;
  DstBmp.imBits=2;
  DstBmp.imRowBytes=DstBmp.imWidth/4;
  if(DstBmp.imWidth%4)
      DstBmp.imRowBytes++;
  memset(DstBmp.imData,0,DstBmp.imRowBytes*DstBmp.imHeight);
  if(bAutoColors)
  {
    for(nRow=0;nRow<DstBmp.imHeight;nRow++)
    {
      for(nCol=0;nCol<DstBmp.imWidth;nCol++)
      {
        u32ReadLen=fread(lpBuf,1,3,fBmp);
        if(u32ReadLen!=3)
        {
//          MessageBox("Wrong BMP file!");
          sprintf(lpBuf,"Error: %s: Wrong BMP file!",szBitmapIdName);
          Error(lpBuf);
          return -1;
        }
        nColorSum=lpBuf[0]+lpBuf[1]+lpBuf[2];
        for(i=0;i<nNumColors;i++)
        {
          if(pnColors[i]==nColorSum)
            break;
        }
        if(i==nNumColors)
        {
          if(nNumColors<4)
            pnColors[nNumColors++]=nColorSum;
          else
          {
            sprintf(lpBuf,"Error: %s: BMP File has more colors! Max colors is 4!",szBitmapIdName);
            Error(lpBuf);
//            MessageBox("BMP文件颜色数太多,请修改BMP文件。");
          }
        }
      }
      if(DstBmp.imWidth*3 % 4)
      {
          u32ReadLen=fread(lpBuf,1,4-(DstBmp.imWidth*3 % 4),fBmp);
          if(u32ReadLen!=(UINT)(4-(DstBmp.imWidth*3 % 4)))
          {
//            MessageBox("Wrong BMP file!");
              sprintf(lpBuf,"Error: %s: Wrong BMP file!",szBitmapIdName);
              Error(lpBuf);
              return -1;
          }
      }
    }
    for(i=0;i<nNumColors;i++)
    {
      int j;
      for(j=0;j<nNumColors-1;j++)
        if(pnColors[j]<pnColors[j+1])
        {
          unsigned int TempColor;
          TempColor=pnColors[j];
          pnColors[j]=pnColors[j+1];
          pnColors[j+1]=TempColor;
        }
    }
    if(nNumColors==1)
    {
      nNumColors=4;
      if(pnColors[0]<=192)
        pnColors[3]=pnColors[0];
      else if(pnColors[0]<=384)
        pnColors[2]=pnColors[0];
      else if(pnColors[0]<=576)
        pnColors[1]=pnColors[0];
    }
    if(nNumColors==2)
    {
      nNumColors=4;
      if(pnColors[1]!=0)
      {
        if(pnColors[1]<384)
          pnColors[2]=pnColors[1];
      }
    }
    if(nNumColors==3)
    {
      nNumColors=4;
      if(pnColors[2]==0)
      {
        if((pnColors[1]-pnColors[2])<=(pnColors[0]-pnColors[1]))
          pnColors[2]=pnColors[1];
      }
    }
    fseek(fBmp,bitmapFileHeader.bfOffBits,0);
  }
  else
  {
    pnColors[0]=765;
    pnColors[1]=576;
    pnColors[2]=384;
    pnColors[3]=192;
  }
  
  for(nRow=0;nRow<DstBmp.imHeight;nRow++)
  {
    for(nCol=0;nCol<DstBmp.imWidth;nCol++)
    {
      u32ReadLen=fread(lpBuf,1,3,fBmp);
      if(u32ReadLen!=3)
      {
//        MessageBox("Wrong BMP file!");
        sprintf(lpBuf,"Error: %s: Wrong BMP file!",szBitmapIdName);
        Error(lpBuf);
        return -2;
      }
      nColorSum=lpBuf[0]+lpBuf[1]+lpBuf[2];
      if(nColorSum<=pnColors[3])
        ucColor=3;
      else if(nColorSum<=pnColors[2])
        ucColor=2;
      else if(nColorSum<=pnColors[1])
        ucColor=1;
      else if(nColorSum<=pnColors[0])
        ucColor=0;
      else
        ucColor=0;
      pByte=DstBmp.imData+(DstBmp.imRowBytes*(DstBmp.imHeight-nRow-1)+nCol/4);
      if(bXchBit)
        ucColor=ucColor<<((3-nCol%4)*2);
      else
        ucColor=ucColor<<(nCol%4*2);
      *pByte=*pByte|ucColor;
    }
    if(DstBmp.imWidth*3 % 4)
    {
        u32ReadLen=fread(lpBuf,1,4-(DstBmp.imWidth*3 % 4),fBmp);
        if(u32ReadLen!=(UINT)(4-(DstBmp.imWidth*3 % 4)))
        {
//          MessageBox("Wrong BMP file!");
            sprintf(lpBuf,"Error: %s: Wrong BMP file!",szBitmapIdName);
            Error(lpBuf);
            return -1;
        }
    }
  }
  WriteBitmapType2CFile(fBmp,&bitmapHeader);
  sprintf(szBitmapTypeName,"%s_Bitmap_%dx%dx2",gv_IDPrefix,bitmapHeader.biWidth,bitmapHeader.biHeight);
  sprintf(szBitmapName,"%s_Bitmap_%s",gv_IDPrefix,szBitmapIdName);

  //save Bitmap define info for resource
  sprintf(szDefineInfoBuf,"{kBitmapRscType,%s_ID_BITMAP_%s,(void*)&%s,sizeof(%s)},",gv_IDPrefix,
    szBitmapIdName,szBitmapName,szBitmapName);
  if(nBitmapDefineInfoCount==MAX_OBJECT)
  {
      sprintf(lpBuf,"Error: %s: Exceed Bitmap number limit,max number is %d.",
          szBitmapIdName,MAX_OBJECT);
      Error(lpBuf);
      return -3;
  }
  pBitmapDefineInfo[nBitmapDefineInfoCount]=strdup(szDefineInfoBuf);
  nBitmapDefineInfoCount++;

  //xxx_c.h
  fprintf(gv_pfOutput_C,"const %s  %s=\n",szBitmapTypeName,szBitmapName);
  fprintf(gv_pfOutput_C,"{\n");
  StartColumn=gv_StartColumn;
  WriteSpace(gv_pfOutput_C,StartColumn);
  fprintf(gv_pfOutput_C,"\t%d,%d,\t//imWidth,imHeight\n",DstBmp.imWidth,DstBmp.imHeight);
  WriteSpace(gv_pfOutput_C,StartColumn);
  fprintf(gv_pfOutput_C,"\t%d,%d,\t//imAlign,imFlags\n",DstBmp.imAlign,DstBmp.imFlags);
  WriteSpace(gv_pfOutput_C,StartColumn);
  fprintf(gv_pfOutput_C,"\t%d,\t//imRowBytes\n",DstBmp.imRowBytes);
  WriteSpace(gv_pfOutput_C,StartColumn);
  fprintf(gv_pfOutput_C,"\t%d,\t//imBits\n",DstBmp.imBits);
  WriteSpace(gv_pfOutput_C,StartColumn);
  fprintf(gv_pfOutput_C,"\t%d,\t//imPlanes\n",DstBmp.imPlanes);
  WriteSpace(gv_pfOutput_C,StartColumn);
  fprintf(gv_pfOutput_C,"\t//Bmp Datas\n",DstBmp.imPlanes);
  WriteSpace(gv_pfOutput_C,StartColumn);
  for(nRow=0;nRow<DstBmp.imHeight;nRow++)
  {
    fprintf(gv_pfOutput_C,"\t");
    for(i=0;i<DstBmp.imRowBytes;i++)
    {
      lpBuf[0]='0';
      lpBuf[1]='x';
      lpBuf[2]=lpTable[(DstBmp.imData[nRow*DstBmp.imRowBytes+i]>>4)&0xf];
      lpBuf[3]=lpTable[DstBmp.imData[nRow*DstBmp.imRowBytes+i]&0xf];
      lpBuf[4]=',';
      lpBuf[5]='\0';
      fprintf(gv_pfOutput_C,lpBuf);
    }
    fprintf(gv_pfOutput_C,"\n");
    if(nRow!=DstBmp.imHeight-1)
      WriteSpace(gv_pfOutput_C,StartColumn);
  }
  fprintf(gv_pfOutput_C,"};\n");
  return 0;
}

void DumpBitmap2CFile(char * szBitmapFileName,char *szBitmapIdName,int idBitmap)
{
  FILE * fBmp;
  char lpBuf[1024];
  fBmp=fopen(szBitmapFileName,"rb");
  if(!fBmp)
  {
    sprintf(lpBuf,"Error: %s: File not found or can't not be open!",szBitmapFileName);
    Error(lpBuf);
    return;
  }
  CovertBitmap2CFile(fBmp,szBitmapIdName);
  //xxx_def.h
  WriteDefineInfo(NULL,0,"%s_ID_BITMAP_%s %d",gv_IDPrefix,szBitmapIdName,idBitmap);
  fclose(fBmp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -