LCOV - code coverage report
Current view: top level - frmts/pcidsk - pcidskdataset2.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 9 9 100.0 %
Date: 2025-01-18 12:42:00 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  PCIDSK Database File
       4             :  * Purpose:  Read/write PCIDSK Database File used by the PCI software, using
       5             :  *           the external PCIDSK library.
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2009, Frank Warmerdam <warmerdam@pobox.com>
      10             :  * Copyright (c) 2009-2013, Even Rouault <even dot rouault at spatialys.com>
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef PCIDSKDATASET2_H_INCLUDED
      16             : #define PCIDSKDATASET2_H_INCLUDED
      17             : 
      18             : #define GDAL_PCIDSK_DRIVER
      19             : 
      20             : #include "cpl_string.h"
      21             : #include "gdal_pam.h"
      22             : #include "ogrsf_frmts.h"
      23             : #include "ogr_spatialref.h"
      24             : #include "pcidsk.h"
      25             : #include "pcidsk_pct.h"
      26             : #include "pcidsk_vectorsegment.h"
      27             : 
      28             : #include <unordered_map>
      29             : 
      30             : using namespace PCIDSK;
      31             : 
      32             : class OGRPCIDSKLayer;
      33             : 
      34             : /************************************************************************/
      35             : /*                              PCIDSK2Dataset                           */
      36             : /************************************************************************/
      37             : 
      38             : class PCIDSK2Dataset final : public GDALPamDataset
      39             : {
      40             :     friend class PCIDSK2Band;
      41             : 
      42             :     mutable OGRSpatialReference *m_poSRS = nullptr;
      43             : 
      44             :     std::unordered_map<std::string, std::string> m_oCacheMetadataItem{};
      45             :     char **papszLastMDListValue;
      46             : 
      47             :     PCIDSK::PCIDSKFile *poFile;
      48             : 
      49             :     std::vector<OGRPCIDSKLayer *> apoLayers;
      50             : 
      51             :     static GDALDataType PCIDSKTypeToGDAL(PCIDSK::eChanType eType);
      52             :     void ProcessRPC();
      53             : 
      54             :   public:
      55             :     PCIDSK2Dataset();
      56             :     virtual ~PCIDSK2Dataset();
      57             : 
      58             :     static GDALDataset *Open(GDALOpenInfo *);
      59             :     static GDALDataset *LLOpen(const char *pszFilename, PCIDSK::PCIDSKFile *,
      60             :                                GDALAccess eAccess,
      61             :                                char **papszSiblingFiles = nullptr);
      62             :     static GDALDataset *Create(const char *pszFilename, int nXSize, int nYSize,
      63             :                                int nBands, GDALDataType eType,
      64             :                                char **papszParamList);
      65             : 
      66             :     char **GetFileList() override;
      67             :     CPLErr GetGeoTransform(double *padfTransform) override;
      68             :     CPLErr SetGeoTransform(double *) override;
      69             : 
      70             :     const OGRSpatialReference *GetSpatialRef() const override;
      71             :     CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
      72             : 
      73             :     virtual char **GetMetadataDomainList() override;
      74             :     CPLErr SetMetadata(char **, const char *) override;
      75             :     char **GetMetadata(const char *) override;
      76             :     CPLErr SetMetadataItem(const char *, const char *, const char *) override;
      77             :     const char *GetMetadataItem(const char *, const char *) override;
      78             : 
      79             :     virtual CPLErr FlushCache(bool bAtClosing) override;
      80             : 
      81             :     virtual CPLErr IBuildOverviews(const char *, int, const int *, int,
      82             :                                    const int *, GDALProgressFunc, void *,
      83             :                                    CSLConstList papszOptions) override;
      84             : 
      85         740 :     virtual int GetLayerCount() override
      86             :     {
      87         740 :         return (int)apoLayers.size();
      88             :     }
      89             : 
      90             :     virtual OGRLayer *GetLayer(int) override;
      91             : 
      92             :     virtual int TestCapability(const char *) override;
      93             : 
      94             :     OGRLayer *ICreateLayer(const char *pszName,
      95             :                            const OGRGeomFieldDefn *poGeomFieldDefn,
      96             :                            CSLConstList papszOptions) override;
      97             : };
      98             : 
      99             : /************************************************************************/
     100             : /*                             PCIDSK2Band                              */
     101             : /************************************************************************/
     102             : 
     103             : class PCIDSK2Band final : public GDALPamRasterBand
     104             : {
     105             :     friend class PCIDSK2Dataset;
     106             : 
     107             :     PCIDSK::PCIDSKChannel *poChannel;
     108             :     PCIDSK::PCIDSKFile *poFile;
     109             : 
     110             :     void RefreshOverviewList();
     111             :     std::vector<PCIDSK2Band *> apoOverviews;
     112             : 
     113             :     std::unordered_map<std::string, std::string> m_oCacheMetadataItem{};
     114             :     char **papszLastMDListValue;
     115             : 
     116             :     bool CheckForColorTable();
     117             :     GDALColorTable *poColorTable;
     118             :     bool bCheckedForColorTable;
     119             :     int nPCTSegNumber;
     120             : 
     121             :     char **papszCategoryNames;
     122             : 
     123             :     void Initialize();
     124             : 
     125             :   public:
     126             :     PCIDSK2Band(PCIDSK::PCIDSKFile *poFileIn,
     127             :                 PCIDSK::PCIDSKChannel *poChannelIn);
     128             :     explicit PCIDSK2Band(PCIDSK::PCIDSKChannel *);
     129             :     virtual ~PCIDSK2Band();
     130             : 
     131             :     virtual CPLErr IReadBlock(int, int, void *) override;
     132             :     virtual CPLErr IWriteBlock(int, int, void *) override;
     133             : 
     134             :     virtual int GetOverviewCount() override;
     135             :     virtual GDALRasterBand *GetOverview(int) override;
     136             : 
     137             :     virtual GDALColorInterp GetColorInterpretation() override;
     138             :     virtual GDALColorTable *GetColorTable() override;
     139             :     virtual CPLErr SetColorTable(GDALColorTable *) override;
     140             : 
     141             :     virtual void SetDescription(const char *) override;
     142             : 
     143             :     virtual char **GetMetadataDomainList() override;
     144             :     CPLErr SetMetadata(char **, const char *) override;
     145             :     char **GetMetadata(const char *) override;
     146             :     CPLErr SetMetadataItem(const char *, const char *, const char *) override;
     147             :     const char *GetMetadataItem(const char *, const char *) override;
     148             : 
     149             :     virtual char **GetCategoryNames() override;
     150             : };
     151             : 
     152             : /************************************************************************/
     153             : /*                             OGRPCIDSKLayer                              */
     154             : /************************************************************************/
     155             : 
     156             : class OGRPCIDSKLayer final : public OGRLayer,
     157             :                              public OGRGetNextFeatureThroughRaw<OGRPCIDSKLayer>
     158             : {
     159             :     GDALDataset *m_poDS = nullptr;
     160             :     PCIDSK::PCIDSKVectorSegment *poVecSeg;
     161             :     PCIDSK::PCIDSKSegment *poSeg;
     162             : 
     163             :     OGRFeatureDefn *poFeatureDefn;
     164             : 
     165             :     OGRFeature *GetNextRawFeature();
     166             : 
     167             :     int iRingStartField;
     168             :     PCIDSK::ShapeId hLastShapeId;
     169             : 
     170             :     bool bUpdateAccess;
     171             : 
     172             :     OGRSpatialReference *poSRS;
     173             : 
     174             :     std::unordered_map<std::string, int> m_oMapFieldNameToIdx{};
     175             :     bool m_bEOF = false;
     176             : 
     177             :   public:
     178             :     OGRPCIDSKLayer(GDALDataset *poDS, PCIDSK::PCIDSKSegment *,
     179             :                    PCIDSK::PCIDSKVectorSegment *, bool bUpdate);
     180             :     virtual ~OGRPCIDSKLayer();
     181             : 
     182             :     void ResetReading() override;
     183         237 :     DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRPCIDSKLayer)
     184             : 
     185             :     OGRFeature *GetFeature(GIntBig nFeatureId) override;
     186             :     virtual OGRErr ISetFeature(OGRFeature *poFeature) override;
     187             : 
     188        2708 :     OGRFeatureDefn *GetLayerDefn() override
     189             :     {
     190        2708 :         return poFeatureDefn;
     191             :     }
     192             : 
     193             :     int TestCapability(const char *) override;
     194             : 
     195             :     OGRErr DeleteFeature(GIntBig nFID) override;
     196             :     virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
     197             :     virtual OGRErr CreateField(const OGRFieldDefn *poField,
     198             :                                int bApproxOK = TRUE) override;
     199             : 
     200             :     GIntBig GetFeatureCount(int) override;
     201             :     OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
     202             : 
     203          16 :     virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
     204             :                              int bForce) override
     205             :     {
     206          16 :         return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
     207             :     }
     208             : 
     209          17 :     GDALDataset *GetDataset() override
     210             :     {
     211          17 :         return m_poDS;
     212             :     }
     213             : };
     214             : 
     215             : #endif /*  PCIDSKDATASET2_H_INCLUDED */

Generated by: LCOV version 1.14