LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/gpkg - gpkgmbtilescommon.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 7 7 100.0 %
Date: 2024-11-21 22:18:42 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * $Id$
       3             :  *
       4             :  * Project:  GeoPackage/MBTiles Translator
       5             :  * Purpose:  Definition of common classes for GeoPackage and MBTiles drivers.
       6             :  * Author:   Even Rouault <even dot rouault at spatialys dot com>
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2014-2016, Even Rouault <even dot rouault at spatialys dot com>
      10             :  *
      11             :  * SPDX-License-Identifier: MIT
      12             :  ****************************************************************************/
      13             : 
      14             : #ifndef GPKGMBTILESCOMMON_H_INCLUDED
      15             : #define GPKGMBTILESCOMMON_H_INCLUDED
      16             : 
      17             : #include "cpl_string.h"
      18             : #include "gdal_pam.h"
      19             : #include <sqlite3.h>
      20             : 
      21             : typedef struct
      22             : {
      23             :     int nRow;
      24             :     int nCol;
      25             :     int nIdxWithinTileData;
      26             :     bool abBandDirty[4];
      27             : } CachedTileDesc;
      28             : 
      29             : typedef enum
      30             : {
      31             :     GPKG_TF_PNG_JPEG,
      32             :     GPKG_TF_PNG,
      33             :     GPKG_TF_PNG8,
      34             :     GPKG_TF_JPEG,
      35             :     GPKG_TF_WEBP,
      36             :     GPKG_TF_PNG_16BIT,        // For GPKG elevation data
      37             :     GPKG_TF_TIFF_32BIT_FLOAT  // For GPKG elevation data
      38             : } GPKGTileFormat;
      39             : 
      40             : GPKGTileFormat GDALGPKGMBTilesGetTileFormat(const char *pszTF);
      41             : const char *GDALMBTilesGetTileFormatName(GPKGTileFormat);
      42             : 
      43             : class GDALGPKGMBTilesLikePseudoDataset
      44             : {
      45             :     friend class GDALGPKGMBTilesLikeRasterBand;
      46             : 
      47             :     GDALGPKGMBTilesLikePseudoDataset(const GDALGPKGMBTilesLikePseudoDataset &) =
      48             :         delete;
      49             :     GDALGPKGMBTilesLikePseudoDataset &
      50             :     operator=(const GDALGPKGMBTilesLikePseudoDataset &) = delete;
      51             : 
      52             :   protected:
      53             :     bool m_bNew = false;
      54             :     bool m_bHasModifiedTiles = false;
      55             : 
      56             :     CPLString m_osRasterTable{};
      57             :     GDALDataType m_eDT = GDT_Byte;
      58             :     int m_nDTSize = 1;
      59             :     double m_dfOffset = 0.0;
      60             :     double m_dfScale = 1.0;
      61             :     double m_dfPrecision = 1.0;
      62             :     GUInt16 m_usGPKGNull = 0;
      63             :     int m_nZoomLevel = -1;
      64             :     GByte *m_pabyCachedTiles = nullptr;
      65             :     CachedTileDesc m_asCachedTilesDesc[4];
      66             :     int m_nShiftXTiles = 0;
      67             :     int m_nShiftXPixelsMod = 0;
      68             :     int m_nShiftYTiles = 0;
      69             :     int m_nShiftYPixelsMod = 0;
      70             :     int m_nTileMatrixWidth = 0;
      71             :     int m_nTileMatrixHeight = 0;
      72             : 
      73             :     GPKGTileFormat m_eTF = GPKG_TF_PNG_JPEG;
      74             :     bool m_bPNGSupports2Bands =
      75             :         true;  // for test/debug purposes only. true is the nominal value
      76             :     bool m_bPNGSupportsCT =
      77             :         true;  // for test/debug purposes only. true is the nominal value
      78             :     int m_nZLevel = 6;
      79             :     int m_nQuality = 75;
      80             :     bool m_bDither = false;
      81             : 
      82             :     GDALColorTable *m_poCT = nullptr;
      83             :     bool m_bTriedEstablishingCT = false;
      84             :     void *m_pabyHugeColorArray = nullptr;
      85             : 
      86             :     CPLString m_osWHERE{};
      87             : 
      88             :     sqlite3_vfs *m_pMyVFS = nullptr;
      89             :     sqlite3 *m_hTempDB = nullptr;
      90             :     CPLString m_osTempDBFilename{};
      91             :     time_t m_nLastSpaceCheckTimestamp = 0;
      92             :     bool m_bForceTempDBCompaction = false;
      93             :     GIntBig m_nAge = 0;
      94             : 
      95             :     int m_nTileInsertionCount = 0;
      96             : 
      97             :     GDALGPKGMBTilesLikePseudoDataset *m_poParentDS = nullptr;
      98             : 
      99             :   private:
     100             :     bool m_bInWriteTile = false;
     101             :     CPLErr WriteTileInternal(); /* should only be called by WriteTile() */
     102             :     GIntBig GetTileId(int nRow, int nCol);
     103             :     bool DeleteTile(int nRow, int nCol);
     104             :     bool DeleteFromGriddedTileAncillary(GIntBig nTileId);
     105             :     void GetTileOffsetAndScale(GIntBig nTileId, double &dfTileOffset,
     106             :                                double &dfTileScale);
     107             :     void FillBuffer(GByte *pabyData, size_t nPixels);
     108             :     void FillEmptyTile(GByte *pabyData);
     109             :     void FillEmptyTileSingleBand(GByte *pabyData);
     110             : 
     111             :   public:
     112             :     GDALGPKGMBTilesLikePseudoDataset();
     113             :     virtual ~GDALGPKGMBTilesLikePseudoDataset();
     114             : 
     115             :     void SetDataType(GDALDataType eDT);
     116             :     void SetGlobalOffsetScale(double dfOffset, double dfScale);
     117             : 
     118             :     CPLErr ReadTile(const CPLString &osMemFileName, GByte *pabyTileData,
     119             :                     double dfTileOffset, double dfTileScale,
     120             :                     bool *pbIsLossyFormat = nullptr);
     121             :     GByte *ReadTile(int nRow, int nCol);
     122             :     GByte *ReadTile(int nRow, int nCol, GByte *pabyData,
     123             :                     bool *pbIsLossyFormat = nullptr);
     124             : 
     125             :     CPLErr WriteTile();
     126             : 
     127             :     CPLErr FlushTiles();
     128             :     CPLErr FlushRemainingShiftedTiles(bool bPartialFlush);
     129             :     CPLErr WriteShiftedTile(int nRow, int nCol, int iBand, int nDstXOffset,
     130             :                             int nDstYOffset, int nDstXSize, int nDstYSize);
     131             :     CPLErr DoPartialFlushOfPartialTilesIfNecessary();
     132             : 
     133             :     virtual CPLErr IFlushCacheWithErrCode(bool bAtClosing) = 0;
     134             :     virtual int IGetRasterCount() = 0;
     135             :     virtual GDALRasterBand *IGetRasterBand(int nBand) = 0;
     136             :     virtual sqlite3 *IGetDB() = 0;
     137             :     virtual bool IGetUpdate() = 0;
     138             :     virtual bool ICanIWriteBlock() = 0;
     139             :     virtual OGRErr IStartTransaction() = 0;
     140             :     virtual OGRErr ICommitTransaction() = 0;
     141             :     virtual const char *IGetFilename() = 0;
     142             :     virtual int GetRowFromIntoTopConvention(int nRow) = 0;
     143             : };
     144             : 
     145             : class GDALGPKGMBTilesLikeRasterBand : public GDALPamRasterBand
     146             : {
     147             :     GDALGPKGMBTilesLikeRasterBand(const GDALGPKGMBTilesLikeRasterBand &) =
     148             :         delete;
     149             :     GDALGPKGMBTilesLikeRasterBand &
     150             :     operator=(const GDALGPKGMBTilesLikeRasterBand &) = delete;
     151             : 
     152             :   protected:
     153             :     GDALGPKGMBTilesLikePseudoDataset *m_poTPD = nullptr;
     154             :     int m_nDTSize = 0;
     155             :     bool m_bHasNoData = false;
     156             :     double m_dfNoDataValue = 0;
     157             :     CPLString m_osUom{};
     158             : 
     159             :   public:
     160             :     GDALGPKGMBTilesLikeRasterBand(GDALGPKGMBTilesLikePseudoDataset *poTPD,
     161             :                                   int nTileWidth, int nTileHeight);
     162             : 
     163             :     virtual CPLErr IReadBlock(int nBlockXOff, int nBlockYOff,
     164             :                               void *pData) override;
     165             :     virtual CPLErr IWriteBlock(int nBlockXOff, int nBlockYOff,
     166             :                                void *pData) override;
     167             :     virtual CPLErr FlushCache(bool bAtClosing) override;
     168             : 
     169             :     int IGetDataCoverageStatus(int nXOff, int nYOff, int nXSize, int nYSize,
     170             :                                int nMaskFlagStop, double *pdfDataPct) override;
     171             : 
     172             :     virtual GDALColorTable *GetColorTable() override;
     173             :     virtual CPLErr SetColorTable(GDALColorTable *poCT) override;
     174             : 
     175             :     void AssignColorTable(const GDALColorTable *poCT);
     176             : 
     177             :     virtual GDALColorInterp GetColorInterpretation() override;
     178             :     virtual CPLErr SetColorInterpretation(GDALColorInterp) override;
     179             : 
     180             :     virtual double GetNoDataValue(int *pbSuccess = nullptr) override;
     181             : 
     182           1 :     virtual const char *GetUnitType() override
     183             :     {
     184           1 :         return m_osUom.c_str();
     185             :     }
     186             : 
     187             :     void SetNoDataValueInternal(double dfNoDataValue);
     188             : 
     189           2 :     void SetUnitTypeInternal(const CPLString &osUom)
     190             :     {
     191           2 :         m_osUom = osUom;
     192           2 :     }
     193             : 
     194        4263 :     GDALRasterBlock *AccessibleTryGetLockedBlockRef(int nBlockXOff,
     195             :                                                     int nBlockYOff)
     196             :     {
     197        4263 :         return TryGetLockedBlockRef(nBlockXOff, nBlockYOff);
     198             :     }
     199             : };
     200             : 
     201             : #endif  // GPKGMBTILESCOMMON_H_INCLUDED

Generated by: LCOV version 1.14