AtmoZoneDefinition.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. #include "AtmoDefs.h"
  2. #if defined (WIN32)
  3. #  include <windows.h>
  4. #else
  5. #  include <vlc_codecs.h>
  6. #endif
  7. #include <math.h>
  8. #include <stdio.h>
  9. #include "AtmoZoneDefinition.h"
  10. CAtmoZoneDefinition::CAtmoZoneDefinition(void)
  11. {
  12. }
  13. CAtmoZoneDefinition::~CAtmoZoneDefinition(void)
  14. {
  15. }
  16. void CAtmoZoneDefinition::Fill(unsigned char value)
  17. {
  18.   for(int i=0; i < IMAGE_SIZE; i++)
  19.       m_BasicWeight[i] = value;
  20. }
  21. // max weight to left
  22. void CAtmoZoneDefinition::FillGradientFromLeft()
  23. {
  24.    int index = 0;
  25.    unsigned char col_norm;
  26.    for(int row=0; row < CAP_HEIGHT; row++) {
  27.        for(int col=0; col < CAP_WIDTH; col++) {
  28.            // should be a value between 0 .. 255?
  29.            col_norm = (255 * (CAP_WIDTH-col-1)) / (CAP_WIDTH-1);
  30.            m_BasicWeight[index++] = col_norm;
  31.        }
  32.    }
  33. }
  34. // max weight to right
  35. void CAtmoZoneDefinition::FillGradientFromRight()
  36. {
  37.    int index = 0;
  38.    unsigned char col_norm;
  39.    for(int row=0; row < CAP_HEIGHT; row++) {
  40.       for(int col=0; col < CAP_WIDTH; col++) {
  41.           col_norm = (255 * col) / (CAP_WIDTH-1); // should be a value between 0 .. 255?
  42.           m_BasicWeight[index++] = col_norm;
  43.        }
  44.    }
  45. }
  46. // max weight from top
  47. void CAtmoZoneDefinition::FillGradientFromTop()
  48. {
  49.    int index = 0;
  50.    unsigned char row_norm;
  51.    for(int row=0; row < CAP_HEIGHT; row++) {
  52.        row_norm = (255 * (CAP_HEIGHT-row-1)) / (CAP_HEIGHT-1); // should be a value between 0 .. 255?
  53.        for(int col=0; col < CAP_WIDTH; col++) {
  54.            m_BasicWeight[index++] = row_norm;
  55.        }
  56.    }
  57. }
  58. // max weight from bottom
  59. void CAtmoZoneDefinition::FillGradientFromBottom()
  60. {
  61.    int index = 0;
  62.    unsigned char row_norm;
  63.    for(int row=0; row < CAP_HEIGHT; row++) {
  64.        row_norm = (255 * row) / (CAP_HEIGHT-1); // should be a value between 0 .. 255?
  65.        for(int col=0; col < CAP_WIDTH; col++) {
  66.            m_BasicWeight[index++] = row_norm;
  67.        }
  68.    }
  69. }
  70. int CAtmoZoneDefinition::LoadGradientFromBitmap(char *pszBitmap)
  71. {
  72.   // transform 256 color image (gray scale!)
  73.   // into m_basicWeight or use the GREEN value of a 24bit image!
  74.   // channel of a true color bitmap!
  75.   BITMAPINFO bmpInfo;
  76.   BITMAPFILEHEADER  bmpFileHeader;
  77.   /*
  78. #define ATMO_LOAD_GRADIENT_OK  0
  79. #define ATMO_LOAD_GRADIENT_FAILED_SIZE    1
  80. #define ATMO_LOAD_GRADIENT_FAILED_HEADER  2
  81.   */
  82.    FILE *bmp = fopen(pszBitmap, "rb");
  83.    if(!bmp)
  84.      return ATMO_LOAD_GRADIENT_FILENOTFOND;
  85.     if(fread(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, bmp) != 1)
  86.     {
  87.         fclose(bmp);
  88.         return ATMO_LOAD_GRADIENT_FAILED_SIZE;
  89.     }
  90. #ifdef _ATMO_VLC_PLUGIN_
  91.     if(bmpFileHeader.bfType != VLC_TWOCC('M','B'))
  92. #else
  93.     if(bmpFileHeader.bfType != MakeWord('M','B'))
  94. #endif
  95.     {
  96.         fclose(bmp);
  97.         return ATMO_LOAD_GRADIENT_FAILED_HEADER;
  98.     }
  99.     if(fread(&bmpInfo, sizeof(BITMAPINFO), 1, bmp) != 1)
  100.     {
  101.         fclose(bmp);
  102.         return ATMO_LOAD_GRADIENT_FAILED_SIZE;
  103.     }
  104.     if(bmpInfo.bmiHeader.biCompression != BI_RGB)
  105.     {
  106.         fclose(bmp);
  107.         return ATMO_LOAD_GRADIENT_FAILED_FORMAT;
  108.     }
  109.     if((bmpInfo.bmiHeader.biBitCount != 8) && (bmpInfo.bmiHeader.biBitCount != 24))
  110.     {
  111.         fclose(bmp);
  112.         return ATMO_LOAD_GRADIENT_FAILED_FORMAT;
  113.     }
  114.     int width = bmpInfo.bmiHeader.biWidth;
  115.     int height = bmpInfo.bmiHeader.biHeight;
  116.     ATMO_BOOL invertDirection = (height > 0);
  117.     height = abs(height);
  118.     if((width != CAP_WIDTH) || (height != CAP_HEIGHT))
  119.     {
  120.         fclose(bmp);
  121.         return ATMO_LOAD_GRADIENT_FAILED_SIZE;
  122.     }
  123.     fseek(bmp, bmpFileHeader.bfOffBits, SEEK_SET);
  124.     int imageSize = width * height * bmpInfo.bmiHeader.biBitCount/8;
  125.     unsigned char *pixelBuffer = (unsigned char *)malloc(imageSize);
  126.     if(fread(pixelBuffer,imageSize,1,bmp) != 1)
  127.     {
  128.         fclose(bmp);
  129.         return ATMO_LOAD_GRADIENT_FAILED_SIZE;
  130.     }
  131.     if(bmpInfo.bmiHeader.biBitCount == 8)
  132.     {
  133.         int ydest;
  134.         for(int y=0;y < CAP_HEIGHT; y++) {
  135.             if(invertDirection) {
  136.                 ydest = (CAP_HEIGHT - y - 1);
  137.             } else {
  138.                 ydest = y;
  139.             }
  140.             for(int x=0;x < CAP_WIDTH; x++) {
  141.                 // palette should be grey scale - so that index 0 is black and
  142.                 // index 255 means white!
  143.                 // everything else would produce funny results!
  144.                 m_BasicWeight[ydest * CAP_WIDTH + x] =
  145.                     pixelBuffer[y * CAP_WIDTH + x];
  146.             }
  147.         }
  148.     }
  149.     if(bmpInfo.bmiHeader.biBitCount == 24)
  150.     {
  151.         int ydest;
  152.         for(int y=0;y < CAP_HEIGHT; y++) {
  153.             if(invertDirection) {
  154.                 ydest = (CAP_HEIGHT - y - 1);
  155.             } else {
  156.                 ydest = y;
  157.             }
  158.             for(int x=0;x < CAP_WIDTH; x++) {
  159.                 // use the green value as reference...
  160.                 m_BasicWeight[ydest * CAP_WIDTH + x] =
  161.                     pixelBuffer[y * CAP_WIDTH * 3 + (x*3) + 1 ];
  162.             }
  163.         }
  164.     }
  165.     free(pixelBuffer);
  166.     fclose(bmp);
  167.     return ATMO_LOAD_GRADIENT_OK;
  168. }
  169. void CAtmoZoneDefinition::UpdateWeighting(int *destWeight,
  170.                                           int WidescreenMode,
  171.                                           int newEdgeWeightning)
  172. {
  173.   /*
  174.     use the values in m_BasicWeight and newWeightning to
  175.     update the direct control array for the output thread!
  176.   */
  177.   int index = 0;
  178.   for(int row=0; row < CAP_HEIGHT; row++) {
  179.       for(int col=0; col < CAP_WIDTH; col++) {
  180.           if ((WidescreenMode == 1) && ((row <= CAP_HEIGHT/8) || (row >= (7*CAP_HEIGHT)/8)))
  181.           {
  182.              destWeight[index] = 0;
  183.           } else {
  184.          destWeight[index] = (int)(255.0 * (float)pow( ((float)m_BasicWeight[index])/255.0 , newEdgeWeightning));
  185.           }
  186.           index++;
  187.       }
  188.   }
  189. }
  190. void CAtmoZoneDefinition::setZoneNumber(int num)
  191. {
  192.     m_zonenumber = num;
  193. }
  194. int CAtmoZoneDefinition::getZoneNumber()
  195. {
  196.     return m_zonenumber;
  197. }