#include <conio.h>;
#include "vesa.h";
#include "bmp.h";

char VScreen[1024*768*4];


void DrawHistogram(char * scr, int size, char *s) {
     int R[256];
     int G[256];
     int B[256];
     int i,val;
     char value;

     memset (&R, 0, sizeof(R));
     memset (&G, 0, sizeof(G));
     memset (&B, 0, sizeof(B));
     for (i=0;i<size;i=i+4) { // Рассчитываются гистограммы
         value=scr[i];   R[value]=R[value]+1;//s[i]=255-value;
         value=scr[i+1]; G[value]=G[value]+1;//s[i+1]=255-value;
         value=scr[i+2]; B[value]=B[value]+1;//s[i+2]=255-value;
         }

     int sumR=0;for (i=0;i<255;i++) sumR=sumR+R[i];
     int maxR=sumR>>6;
     int sumG=0;for (i=0;i<255;i++) sumG=sumG+G[i];
     int maxG=sumG>>6;
     int sumB=0;for (i=0;i<255;i++) sumB=sumB+B[i];
     int maxB=sumB>>6;

     int maxM=(maxR+maxG+maxB)/3;
     maxR=maxM;
     maxG=maxM;
     maxB=maxM;


     // Вывод гистограммы для R
     Line(9,151,9,10,0xFFFFFF);Line(9,151,522,151,0xFFFFFF);
     for (i=0;i<256;i++) {
         val=(R[i]*140)/maxR;if (val>140) val=140;
         Line(10+(i<<1),150,10+(i<<1),150-val,i<<16);
         Line(11+(i<<1),150,11+(i<<1),150-val+1,0xC0C0C0);
         }

     Line(9,301,9,160,0xFFFFFF);Line(9,301,522,301,0xFFFFFF);
     for (i=0;i<256;i++) {
         val=(G[i]*140)/maxG;if (val>140) val=140;
         Line(10+(i<<1),300,10+(i<<1),300-val,i<<8);
         Line(11+(i<<1),300,11+(i<<1),300-val+1,0xC0C0C0);
         }

     Line(9,451,9,310,0xFFFFFF);Line(9,451,522,451,0xFFFFFF);
     for (i=0;i<256;i++) {
         val=(B[i]*140)/maxB;if (val>140) val=140;
         Line(10+(i<<1),450,10+(i<<1),450-val,i);
         Line(11+(i<<1),450,11+(i<<1),450-val+1,0xC0C0C0);
         }
     }

void main(void) {
     cm=SetVESAMode(640,480,32);    // Включение видеорежима.
     cm.VLFB=(uc *)VScreen;          // Установка виртуального экрана.
     InitGraph();

     BMP_PutFromFile(cm,0,0,"29sc091.bmp");

     DrawHistogram((char *)cm.VLFB, cm.w*cm.h*cm.bytespp, (char *)cm.LFB);
     blt(cm);

     getch();
     SetVGAMode(3);
     }
