`ifndef __BITMAP_DATA__
`define __BITMAP_DATA__
class bitmap_data;
//===============================================================
// typedef
//---------------------------------------------------------------
// little endian -> after byte data is MSB
typedef struct packed {
shortint unsigned bfType ; //
int unsigned bfSize ; //
shortint unsigned bfReserved1; //
shortint unsigned bfReserved2; //
int unsigned bfOffBits ; //
} BITMAP_FILE_HEADER; // 14 byte
typedef struct packed {
int unsigned biSize ; // info header size(byte)
int biWidth ; // picture width(pixel)
int biHeight ; // picture height(pixel)
shortint unsigned biPlanes ; // plane num
shortint unsigned biBitCount ; // data size(bit) par 1 pixel {1/4/8/24/32}
int unsigned biCompression ; // compression type 0:none 1:RLE8 2:RLE4 3:bitFields
int unsigned biSizeImage ; // pixel data size(byte)
int biXPixPerMeter; // H dpi
int biYPixPerMeter; // V dpi
int unsigned biClrUsed ; // palette depth
int unsigned biClrImporant ; // important palette index
} BITMAP_INFO_HEADER; // 40 byte
// picture data is Left_Bottom -> Right_Top
typedef struct packed {
byte unsigned rgbBlue;
byte unsigned rgbGreen;
byte unsigned rgbRed;
byte unsigned rgbReserved;
} RGB_QUAD;
//===============================================================
// member
//---------------------------------------------------------------
BITMAP_FILE_HEADER file_header;
BITMAP_INFO_HEADER info_header;
//RGB_QUAD pic[];
byte unsigned rgbBlue[];
byte unsigned rgbGreen[];
byte unsigned rgbRed[];
byte unsigned rgbReserved[];
int size_x;
int size_y;
//===============================================================
// function new()
//---------------------------------------------------------------
function new(int x,int y);
if(x<0) x=16;
if(x<0) y=16;
this.size_x = x;
this.size_y = y;
rgbBlue = new[x*y];
rgbGreen = new[x*y];
rgbRed = new[x*y];
rgbReserved = new[x*y];
for(int i=0;i<x*y;i++)begin
rgbReserved[i] = 0;
end
endfunction
//===============================================================
//---------------------------------------------------------------
task set_dot(
int x,
int y,
bit[7:0] r,
bit[7:0] g,
bit[7:0] b
);
if(x<0 || y<0 || x>size_x || y>size_y)begin
return;
end else begin
rgbBlue [y*size_x+x] = b;
rgbGreen[y*size_x+x] = g;
rgbRed [y*size_x+x] = r;
end
endtask
//===============================================================
//---------------------------------------------------------------
task file_write(
string filename
);
integer fp;
fp=$fopen(filename,"wb");
if(!fp)begin
$display("File Open Error.");
$finish;
end
file_header.bfType = "BM"; //
file_header.bfSize = 14+40+(size_x*size_y*3); // file size (byte)
file_header.bfReserved1 = 0; //
file_header.bfReserved2 = 0; //
file_header.bfOffBits = 14+40; //
info_header.biSize = 40; // info header size(byte)
info_header.biWidth = size_x; // picture width(pixel)
info_header.biHeight = size_y; // picture height(pixel)
info_header.biPlanes = 1; // plane num
info_header.biBitCount = 32; // data size(bit) par 1 pixel {1/4/8/24/32}
info_header.biCompression = 0; // compression type 0:none 1:RLE8 2:RLE4 3:bitFields
info_header.biSizeImage = 3780; // pixel data size(byte)
info_header.biXPixPerMeter= 3780; // H dpi
info_header.biYPixPerMeter= 3780; // V dpi
info_header.biClrUsed = 0; // palette depth
info_header.biClrImporant = 0; // important palette index
$fwrite(fp,"%c",file_header.bfType[15: 8] );
$fwrite(fp,"%c",file_header.bfType[ 7: 0] );
$fwrite(fp,"%c",file_header.bfSize[ 7: 0] );
$fwrite(fp,"%c",file_header.bfSize[15: 8] );
$fwrite(fp,"%c",file_header.bfSize[23:16] );
$fwrite(fp,"%c",file_header.bfSize[31:24] );
$fwrite(fp,"%c",file_header.bfReserved1[7:0] );
$fwrite(fp,"%c",file_header.bfReserved1[15:8] );
$fwrite(fp,"%c",file_header.bfReserved2[7:0] );
$fwrite(fp,"%c",file_header.bfReserved2[15:8] );
$fwrite(fp,"%c",file_header.bfOffBits[ 7: 0] );
$fwrite(fp,"%c",file_header.bfOffBits[15: 8] );
$fwrite(fp,"%c",file_header.bfOffBits[23:16] );
$fwrite(fp,"%c",file_header.bfOffBits[31:24] );
$fwrite(fp,"%c",info_header.biSize[ 7: 0] );
$fwrite(fp,"%c",info_header.biSize[15: 8] );
$fwrite(fp,"%c",info_header.biSize[23:16] );
$fwrite(fp,"%c",info_header.biSize[31:24] );
$fwrite(fp,"%c",info_header.biWidth[ 7: 0] );
$fwrite(fp,"%c",info_header.biWidth[15: 8] );
$fwrite(fp,"%c",info_header.biWidth[23:16] );
$fwrite(fp,"%c",info_header.biWidth[31:24] );
$fwrite(fp,"%c",info_header.biHeight[ 7: 0] );
$fwrite(fp,"%c",info_header.biHeight[15: 8] );
$fwrite(fp,"%c",info_header.biHeight[23:16] );
$fwrite(fp,"%c",info_header.biHeight[31:24] );
$fwrite(fp,"%c",info_header.biPlanes[ 7: 0] );
$fwrite(fp,"%c",info_header.biPlanes[15: 8] );
$fwrite(fp,"%c",info_header.biBitCount[ 7: 0] );
$fwrite(fp,"%c",info_header.biBitCount[15: 8] );
$fwrite(fp,"%c",info_header.biCompression[ 7: 0] );
$fwrite(fp,"%c",info_header.biCompression[15: 8] );
$fwrite(fp,"%c",info_header.biCompression[23:16] );
$fwrite(fp,"%c",info_header.biCompression[31:24] );
$fwrite(fp,"%c",info_header.biSizeImage[ 7: 0] );
$fwrite(fp,"%c",info_header.biSizeImage[15: 8] );
$fwrite(fp,"%c",info_header.biSizeImage[23:16] );
$fwrite(fp,"%c",info_header.biSizeImage[31:24] );
$fwrite(fp,"%c",info_header.biXPixPerMeter[ 7: 0]);
$fwrite(fp,"%c",info_header.biXPixPerMeter[15: 8]);
$fwrite(fp,"%c",info_header.biXPixPerMeter[23:16]);
$fwrite(fp,"%c",info_header.biXPixPerMeter[31:24]);
$fwrite(fp,"%c",info_header.biYPixPerMeter[ 7: 0]);
$fwrite(fp,"%c",info_header.biYPixPerMeter[15: 8]);
$fwrite(fp,"%c",info_header.biYPixPerMeter[23:16]);
$fwrite(fp,"%c",info_header.biYPixPerMeter[31:24]);
$fwrite(fp,"%c",info_header.biClrUsed[ 7: 0] );
$fwrite(fp,"%c",info_header.biClrUsed[15: 8] );
$fwrite(fp,"%c",info_header.biClrUsed[23:16] );
$fwrite(fp,"%c",info_header.biClrUsed[31:24] );
$fwrite(fp,"%c",info_header.biClrImporant[ 7: 0] );
$fwrite(fp,"%c",info_header.biClrImporant[15: 8] );
$fwrite(fp,"%c",info_header.biClrImporant[23:16] );
$fwrite(fp,"%c",info_header.biClrImporant[31:24] );
for(int y=size_y;y>0;y--)begin
for(int x=0;x<size_x;x++)begin
$fwrite(fp,"%c",rgbBlue [(y-1)*size_x+x]);
$fwrite(fp,"%c",rgbGreen [(y-1)*size_x+x]);
$fwrite(fp,"%c",rgbRed [(y-1)*size_x+x]);
$fwrite(fp,"%c",rgbReserved[(y-1)*size_x+x]);
end
end
endtask
endclass : bitmap_data
`endif // __BITMAP_DATA__