home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 5257 / source.7z / x_bmp.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2012-03-23  |  3.3 KB  |  120 lines

  1. #include "xentax.h"
  2. #include "x_bmp.h"
  3.  
  4. BOOL CreateBMPHeaders(DWORD dx, DWORD dy, DWORD bpp, BITMAPFILEHEADER* fileHeader, BITMAPINFOHEADER* infoHeader)
  5. {
  6.  // validate
  7.  if(!fileHeader) return FALSE;
  8.  if(!infoHeader) return FALSE;
  9.  if(dx == 0) return FALSE;
  10.  if(dy == 0) return FALSE;
  11.  if(!(bpp == 1 || bpp == 4 || bpp == 8 || bpp == 16 || bpp == 24 || bpp == 32)) return FALSE;
  12.  
  13.  // set file header
  14.  fileHeader->bfType = 0x4D42; 
  15.  fileHeader->bfSize = 0;
  16.  fileHeader->bfReserved1 = 0;
  17.  fileHeader->bfReserved2 = 0;
  18.  fileHeader->bfOffBits = 0;
  19.  
  20.  // set info header
  21.  infoHeader->biSize = sizeof(BITMAPINFOHEADER);
  22.  infoHeader->biWidth = dx;
  23.  infoHeader->biHeight = dy;
  24.  infoHeader->biPlanes = 1;
  25.  infoHeader->biBitCount = (WORD)bpp;
  26.  infoHeader->biCompression = BI_RGB;
  27.  infoHeader->biSizeImage = 0;
  28.  infoHeader->biXPelsPerMeter = 0;
  29.  infoHeader->biYPelsPerMeter = 0;
  30.  infoHeader->biClrUsed = 0;
  31.  infoHeader->biClrImportant = 0;
  32.  
  33.  return TRUE;
  34. }
  35.  
  36. BOOL SaveYUV411ToBMP(const char* filename, DWORD dx, DWORD dy, const char* data, uint32 size)
  37. {
  38.  return TRUE;
  39. }
  40.  
  41. BOOL SaveYUV420ToBMP(const char* filename, DWORD dx, DWORD dy, const char* data, uint32 size)
  42. {
  43.  return TRUE;
  44. }
  45.  
  46. BOOL SaveYUV422ToBMP(const char* filename, DWORD dx, DWORD dy, const char* data, uint32 size)
  47. {
  48.  // validate
  49.  if(!filename || !strlen(filename)) return FALSE;
  50.  if(!dx) return FALSE;
  51.  if(!dy) return FALSE;
  52.  if(!data || !size) return FALSE;
  53.  
  54.  // TODO: validate size of data
  55.  
  56.  // create bitmap headers
  57.  BITMAPFILEHEADER fileHeader;
  58.  BITMAPINFOHEADER infoHeader;
  59.  if(!CreateBMPHeaders(dx, dy, 32, &fileHeader, &infoHeader)) return FALSE;
  60.  
  61.  // create BGRA data
  62.  uint32 n = dx*dy*4;
  63.  boost::shared_array<uint08> ptr(new uint08[n]);
  64.  
  65.  // for every 4 bytes
  66.  uint32 index1 = 0;
  67.  uint32 index2 = 0;
  68.  while(index1 < size)
  69.       {
  70.        // constants
  71.        real32 y1 = (real32)data[index1++];
  72.        real32  u = (real32)data[index1++];
  73.        real32 y2 = (real32)data[index1++];
  74.        real32  v = (real32)data[index1++];
  75.  
  76.        // convert pixel #1
  77.        real32 r1 = y1 + 1.13983f*v;
  78.        real32 g1 = y1 - 0.39465f*u - 0.58060f*v;
  79.        real32 b1 = y1 + 2.03211f*u;
  80.        ptr[index2++] = (uint08)clamp(b1, 0.0f, 255.0f);
  81.        ptr[index2++] = (uint08)clamp(g1, 0.0f, 255.0f);
  82.        ptr[index2++] = (uint08)clamp(r1, 0.0f, 255.0f);
  83.        ptr[index2++] = (uint08)255;
  84.  
  85.        // convert pixel #2
  86.        real32 r2 = y2 + 1.13983f*v;
  87.        real32 g2 = y2 - 0.39465f*u - 0.58060f*v;
  88.        real32 b2 = y2 + 2.03211f*u;
  89.        ptr[index2++] = (uint08)clamp(b2, 0.0f, 255.0f);
  90.        ptr[index2++] = (uint08)clamp(g2, 0.0f, 255.0f);
  91.        ptr[index2++] = (uint08)clamp(r2, 0.0f, 255.0f);
  92.        ptr[index2++] = (uint08)255;
  93.       }
  94.  
  95.  // create file
  96.  using namespace std;
  97.  ofstream ofile(filename, ios::binary);
  98.  if(!ofile) return FALSE;
  99.  
  100.  // save file header
  101.  ofile.write((char*)&fileHeader, sizeof(fileHeader));
  102.  if(ofile.fail()) return FALSE;
  103.  
  104.  // save info header
  105.  ofile.write((char*)&infoHeader, sizeof(infoHeader));
  106.  if(ofile.fail()) return FALSE;
  107.  
  108.  // save data
  109.  ofile.write((char*)ptr.get(), n);
  110.  if(ofile.fail()) return FALSE;
  111.  
  112.  // success
  113.  return TRUE;
  114. }
  115.  
  116. BOOL SaveYUV444ToBMP(const char* filename, DWORD dx, DWORD dy, const char* data, uint32 size)
  117. {
  118.  return TRUE;
  119. }
  120.