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: 2025-01-18 12:42:00 Functions: 3 3 100.0 %

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

Generated by: LCOV version 1.14