コード例 #1
0
ファイル: lsm_reader.cpp プロジェクト: jefferis/fluorender
void LSMReader::Preprocess()
{
    FILE* pfile = 0;
    if (!WFOPEN(&pfile, m_path_name.c_str(), L"rb"))
        return;

    m_lsm_info.clear();
    m_l4gb = false;

    int i, j;

    unsigned int ioffset = 0;
    fread(&ioffset, sizeof(unsigned int), 1, pfile);
    if (ioffset!=0x002A4949)
    {
        fclose(pfile);
        return;
    }

    int cnt_image = 0;
    bool full_image = false;

    //first offset
    if (fread(&ioffset, sizeof(unsigned int), 1, pfile)<1)
    {
        fclose(pfile);
        return;
    }

    unsigned int prev_offset = 0;
    unsigned int offset_high = 0;

    //images
    while (fseek(pfile, ioffset, SEEK_SET)==0)
    {
        unsigned short entry_num;
        //entry number
        if (fread(&entry_num, sizeof(unsigned short), 1, pfile)<1)
        {
            fclose(pfile);
            return;
        }

        vector<unsigned int> offsets;
        vector<unsigned int> offset_highs;
        vector<unsigned int> sizes;

        for (i=0; i<entry_num; i++)
        {
            unsigned short tag;
            if (fread(&tag, sizeof(unsigned short), 1, pfile)<1)
            {
                fclose(pfile);
                return;
            }
            unsigned short type;
            if (fread(&type, sizeof(unsigned short), 1, pfile)<1)
            {
                fclose(pfile);
                return;
            }
            unsigned int length;
            if (fread(&length, sizeof(unsigned int), 1, pfile)<1)
            {
                fclose(pfile);
                return;
            }
            unsigned int value;
            if (fread(&value, sizeof(unsigned int), 1, pfile)<1)
            {
                fclose(pfile);
                return;
            }

            //remember current position
            long cur_pos = ftell(pfile);

            switch (tag)
            {
            case 0x00FE://254, new subfile type
                if (value==0)
                {
                    full_image = true;
                    cnt_image++;
                }
                else
                    full_image = false;
                break;
            case 0x0100://256, image width
                if (full_image && cnt_image == 1)
                    m_x_size = value;
                break;
            case 0x0101://257, image length
                if (full_image && cnt_image == 1)
                    m_y_size = value;
                break;
            case 0x0102://258, bits per sample
                break;
            case 0x0103://259, compression
                if (full_image && cnt_image == 1)
                    m_compression = value<<16>>16;
                break;
            case 0x0106://262, photometric interpretation
                break;
            case 0x0111://273, strip offsets
                if (full_image)
                {
                    if (length==1)
                    {
                        offsets.push_back(value);
                        if (value < prev_offset)
                        {
                            m_l4gb = true;
                            offset_high++;
                        }
                        prev_offset = value;
                        offset_highs.push_back(offset_high);
                    }
                    else
                    {
                        if (fseek(pfile, value, SEEK_SET)==0)
                        {
                            unsigned int vtemp;
                            for (j=0; j<(int)length; j++)
                            {
                                if (fread(&vtemp, sizeof(unsigned int), 1, pfile)==1)
                                {
                                    offsets.push_back(vtemp);
                                    if (vtemp < prev_offset)
                                    {
                                        m_l4gb = true;
                                        offset_high++;
                                    }
                                    prev_offset = vtemp;
                                    offset_highs.push_back(offset_high);
                                }
                            }
                        }
                    }
                }
                break;
            case 0x0115://277, samples per pixel
                if (full_image && cnt_image == 1)
                    m_chan_num = value<<16>>16;
                break;
            case 0x0117://279, strip byte counts
                if (full_image)
                {
                    if (length==1)
                    {
                        sizes.push_back(value);
                    }
                    else
                    {
                        if (fseek(pfile, value, SEEK_SET)==0)
                        {
                            unsigned int vtemp;
                            for (j=0; j<(int)length; j++)
                            {
                                if (fread(&vtemp, sizeof(unsigned int), 1, pfile)==1)
                                    sizes.push_back(vtemp);
                            }
                        }
                    }
                }
                break;
            case 0x011C://284, planar configuration
                break;
            case 0x013D://317, predictor
                if (full_image && cnt_image == 1)
                    m_predictor = value<<16>>16;
                break;
                break;
            case 0x0140://320, colormap
                break;
            case 0x866C://34412, zeiss lsm info
                if (type == 1)
                {
                    if (fseek(pfile, value, SEEK_SET)!=0)
                    {
                        fclose(pfile);
                        return;
                    }
                    unsigned char* pdata = new unsigned char[length];
                    if (fread(pdata, sizeof(unsigned char), length, pfile)!=length)
                    {
                        fclose(pfile);
                        return;
                    }
                    //read lsm info
                    ReadLsmInfo(pfile, pdata, length);
                    //delete
                    delete []pdata;
                }
                break;
            }

            //reset position
            if (fseek(pfile, cur_pos, SEEK_SET)!=0)
            {
                fclose(pfile);
                return;
            }
        }

        //build lsm info, which contains all offset values and sizes
        if (full_image)
        {
            int time = (cnt_image-1) / m_slice_num;
            if (time+1 > (int)m_lsm_info.size())
            {
                DatasetInfo dinfo;
                for (i=0; i<m_chan_num; i++)
                {
                    ChannelInfo cinfo;
                    dinfo.push_back(cinfo);
                }
                m_lsm_info.push_back(dinfo);
            }
            //int slice = (cnt_image-1) % m_slice_num;
            for (i=0; i<m_chan_num; i++)
            {
                SliceInfo sinfo;
                sinfo.offset = offsets[i];
                sinfo.offset_high = offset_highs[i];
                sinfo.size = sizes[i];
                //add slice info to lsm info
                m_lsm_info[time][i].push_back(sinfo);
            }
        }

        //next image
        if (fread(&ioffset, sizeof(unsigned int), 1, pfile)<1)
        {
            fclose(pfile);
            return;
        }
        if (!ioffset)
            break;
    }

    fclose(pfile);

    m_cur_time = 0;
    m_data_name = m_path_name.substr(m_path_name.find_last_of(GETSLASH())+1);
}