#include "vesa.h";
#include <math.h>;
#include "bmp.h";

void BMP_PutFromFile(TMode m, int x, int y, char * fname) {
    FILE* fp;
    struct BMPHeader bmp;
    TPallete pal[256];  // Палитра
    char paloffset;     // Смещение в палитре;

    if (x>m.w || y>m.h) return; // Если не влезает в экран.

    fp=fopen(fname,"rb");
    fread(&bmp,54,1,fp);

    if (bmp.ID==0x4D42) { // Проверим ID

        int rw=m.w-x-1; if (rw>bmp.Width)  rw=bmp.Width;  // Требуемая ширина
        int rh=m.h-y-1; if (rh>bmp.Height) rh=bmp.Height; // Требуемая высота
        int bpl=bmp.ISize/bmp.Height;                   // Байт на строку у BMP

        ul pnt=(ul)m.VLFB;
        pnt=pnt+(y+rh)*m.bpl+x*m.bytespp; // Установим указатель на нижнюю строку картинки

        // 24 бита не пакованая ##############################################
        if (bmp.Bits==24 && bmp.Comp==0) {
            if (bmp.Height-rh!=0) fseek(fp, (bmp.Height-rh)*bpl ,SEEK_CUR);

            int fseeksize=bpl-rw*3; // Пропускаемая часть в файле
            int pntmove=m.bpl+rw*4; // Смещене указателя на экране
            for (int i=0;i<rh;i++) {
                for (int j=0;j<rw;j++) {
                    fread((void *)pnt, 3, 1, fp);
                    pnt+=4;
                    }
                fseek(fp, fseeksize, SEEK_CUR);
                pnt-=pntmove;
                }
            }
        // 8 бит не пакованая ################################################
        if (bmp.Bits==8 && bmp.Comp==0) {
            if (bpl==0) bpl=bmp.Width;
            fread(&pal,1024,1,fp);  // Читаем палитру

            if (bmp.Height-rh!=0) fseek(fp, (bmp.Height-rh)*bpl ,SEEK_CUR);

            int fseeksize=bpl-rw;   // Пропускаемая часть в файле
            int pntmove=m.bpl+rw*4; // Смещене указателя на экране
            char * pnto;
            for (int i=0;i<rh;i++) {
                for (int j=0;j<rw;j++) {
                    fread(&paloffset, 1, 1, fp);
                    pnto=(char *)pnt;
                    pnto[2]=pal[paloffset].r;
                    pnto[1]=pal[paloffset].g;
                    pnto[0]=pal[paloffset].b;
                    pnt+=4;
                    }
                fseek(fp, fseeksize, SEEK_CUR);
                pnt-=pntmove;
                }
            } // end of 8 bit
        }
    fclose(fp);
    }
