LCOV - code coverage report
Current view: top level - src/Util - BMP.H (source / functions) Coverage Total Hit
Test: coverage_merged.info Lines: 97.4 % 39 38
Test Date: 2025-06-26 20:08:28 Functions: 100.0 % 4 4

            Line data    Source code
       1              : #ifndef UTIL_BMP_H
       2              : #define UTIL_BMP_H
       3              : 
       4              : #include <string>
       5              : #include <iostream>
       6              : #include <vector>
       7              : #include <array>
       8              : #include "Util/Util.H"
       9              : 
      10              : namespace Util
      11              : {
      12              : class BMP
      13              : {
      14              : public:
      15            1 :     BMP () {};
      16              : 
      17            1 :     void Define (std::string filename)
      18              :     {
      19              :         FILE* f;
      20            1 :         int retcode = -1;
      21            1 :         if ((f = fopen(filename.c_str(), "rb")))
      22              :         {
      23              :             unsigned char info[54];
      24            1 :             retcode = fread(info, sizeof(unsigned char), 54, f); 
      25            1 :             if (retcode != 54) Util::Abort(INFO,"Error reading BMP file: 54 bytes expected but only ", retcode, " read.");
      26            1 :             nx = *(int*)&info[18];
      27            1 :             ny = *(int*)&info[22];
      28              :             
      29            1 :             data.resize(nx*ny);
      30              :             
      31            1 :             int row_padded = (nx*3 + 3) & (~3);
      32            1 :             unsigned char* chardata = new unsigned char[row_padded];
      33         1001 :             for (int j = 0; j < ny; j++)
      34              :             {
      35         1000 :                 retcode = fread(chardata, sizeof(unsigned char), row_padded, f);
      36         1000 :                 if (retcode != row_padded) Util::Abort(INFO,"Error reading BMP file: ",row_padded," bytes expected but only ", retcode, " read.");
      37      1001000 :                 for(int i = 0; i < nx*3; i += 3)
      38              :                 {
      39      1000000 :                     (*this)(i/3,j)[0] = (int)chardata[i+2]; // R
      40      1000000 :                     (*this)(i/3,j)[1] = (int)chardata[i+1]; // G
      41      1000000 :                     (*this)(i/3,j)[2] = (int)chardata[i];   // B
      42              :                 }
      43              :             }
      44            1 :             fclose(f);
      45            1 :             delete[] chardata;
      46              :         }
      47              :         else
      48              :         {
      49            0 :             Util::Abort(INFO,"File ", filename, " does not exist");
      50              :         }
      51            1 :     }
      52              : 
      53              :     AMREX_FORCE_INLINE
      54              :     std::array<int,3> & operator () (int i,int j)
      55              :     {
      56     24383296 :         Util::Assert(INFO,TEST(i < nx)," i = ",i," nx = ", nx);
      57     24383296 :         Util::Assert(INFO,TEST(j < ny)," j = ",j," ny = ", ny);
      58      3483328 :         return data[nx*j + i];
      59              :     }
      60            1 :     std::array<int,3> min()
      61              :     {
      62            1 :         std::array<int,3> _min = {std::numeric_limits<int>::max(), std::numeric_limits<int>::max(), std::numeric_limits<int>::max()};
      63      1000001 :         for (unsigned int i = 0; i < data.size(); i++)
      64              :         {
      65      1000000 :             if (_min[0] > data[i][0]) _min[0] = data[i][0];
      66      1000000 :             if (_min[1] > data[i][1]) _min[1] = data[i][1];
      67      1000000 :             if (_min[2] > data[i][2]) _min[2] = data[i][2];
      68              :         }
      69            1 :         return _min;
      70              :     }
      71            1 :     std::array<int,3> max()
      72              :     {
      73            1 :         std::array<int,3> _max = {0, 0, 0};
      74      1000001 :         for (unsigned int i = 0; i < data.size(); i++)
      75              :         {
      76      1000000 :             if (_max[0] < data[i][0]) _max[0] = data[i][0];
      77      1000000 :             if (_max[1] < data[i][1]) _max[1] = data[i][1];
      78      1000000 :             if (_max[2] < data[i][2]) _max[2] = data[i][2];
      79              :         }
      80            1 :         return _max;
      81              :     }
      82              : 
      83              : public:
      84              :     int nx, ny;
      85              : private:
      86              :     std::vector<std::array<int,3>> data;
      87              : };
      88              : }
      89              : 
      90              : 
      91              : #endif
        

Generated by: LCOV version 2.0-1