Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TCACHERESOURCE_INCLUDED
Toshihiro Shimizu 890ddd
#define TCACHERESOURCE_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
#include "tfilepath.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "traster.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qmutex></qmutex>
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
#include <qregion></qregion>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TFX_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  Forward declarations
Toshihiro Shimizu 890ddd
class TTile;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================
Toshihiro Shimizu 890ddd
//    Cache Resource class
Toshihiro Shimizu 890ddd
//----------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
The TCacheResource class models generic tile objects suitable for caching
Toshihiro Shimizu 890ddd
in render processes.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
Whereas common TTile instances can be used to represent images bounded on a
Shinya Kitaoka 120a6e
specific
Toshihiro Shimizu 890ddd
rect of the plane, the caching procedures in a render process require certain
Shinya Kitaoka 120a6e
generalizations of the tile model that are fulfilled by the TCacheResource
Shinya Kitaoka 120a6e
class:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  • A cache resource has a textual description of its content that we'll call
  • Shinya Kitaoka 120a6e
    'name'.
    Shinya Kitaoka 120a6e
    It is the associative key used to retrieve a resource among all the others
    Shinya Kitaoka 120a6e
    stored
    Toshihiro Shimizu 890ddd
    in the cache. <\li>
    Shinya Kitaoka 120a6e
  • The spatial domain of a cache resource is the entire plane, meaning that
  • Shinya Kitaoka 120a6e
    access
    Toshihiro Shimizu 890ddd
    methods are not bound to work on a specific rect.
    Shinya Kitaoka 120a6e
    This is necessary since the image data accessed on non-consecutive renders could
    Shinya Kitaoka 120a6e
    cover
    Toshihiro Shimizu 890ddd
    sparse regions of the plane. <\li>
    Shinya Kitaoka 120a6e
  • For simplicity, the pixel geometry of a cache is coherent to the plane
  • Shinya Kitaoka 120a6e
    origin - that is,
    Toshihiro Shimizu 890ddd
    pixel corners always have integer coordinates. <\li>
    Shinya Kitaoka 120a6e
  • Filled resources have a raster type <\b>, specifying the type of
  • Shinya Kitaoka 120a6e
    rasters that are
    Shinya Kitaoka 120a6e
    currently storing. It is forbidden to upload rasters to resources when their
    Shinya Kitaoka 120a6e
    raster type differs.
    Toshihiro Shimizu 890ddd
    Empty resources are compatible to all possible raster types. <\li>
    Shinya Kitaoka 120a6e
  • Cache resources provide reference counters to either the entire resource
  • Shinya Kitaoka 120a6e
    and each
    Shinya Kitaoka 120a6e
    piece of its internal memory model, in order to perform automatic release of
    Shinya Kitaoka 120a6e
    unnecessary
    Toshihiro Shimizu 890ddd
    data. <\li>
    Shinya Kitaoka 120a6e
  • The resource provides an accessible resume of its currently filled areas,
  • Shinya Kitaoka 120a6e
    in the form of
    Toshihiro Shimizu 890ddd
    a QRegion. <\li>
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
    In order to use or retrieve a cache resource, users must instantiate a smart
    Shinya Kitaoka 120a6e
    pointer reference
    Shinya Kitaoka 120a6e
    to the resource, providing its name. Please refer to the TCacheResourceP
    Shinya Kitaoka 120a6e
    documentation for this
    Toshihiro Shimizu 890ddd
    topic.
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    \sa TRaster, TTile classes.
    Toshihiro Shimizu 890ddd
    */
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
    class DVAPI TCacheResource {
    Shinya Kitaoka 120a6e
      TAtomicVar m_refCount;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      struct PointLess {
    Shinya Kitaoka 120a6e
        int x, y;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
        PointLess(int x_, int y_) : x(x_), y(y_) {}
    Shinya Kitaoka 120a6e
        bool operator<(const PointLess &p) const {
    Shinya Kitaoka 120a6e
          return x < p.x ? true : x > p.x ? false : y < p.y;
    Shinya Kitaoka 120a6e
        }
    Shinya Kitaoka 120a6e
      };
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      struct CellData {
    Shinya Kitaoka 120a6e
        int m_refsCount;
    Shinya Kitaoka 120a6e
        bool m_referenced;
    Shinya Kitaoka 120a6e
        bool m_modified;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
        CellData() : m_refsCount(0), m_modified(false), m_referenced(false) {}
    Shinya Kitaoka 120a6e
      };
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    private:
    Shinya Kitaoka 120a6e
      std::map<std::string, *="" tcacheresource="">::iterator m_pos;</std::string,>
    Shinya Kitaoka 120a6e
      TFilePath m_path;
    Shinya Kitaoka 120a6e
      unsigned long m_id;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      QRegion m_region;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      int m_tileType;
    Shinya Kitaoka 120a6e
      int m_cellsCount;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      TPaletteP m_palette;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      std::map<pointless, celldata=""> m_cellDatas;</pointless,>
    Shinya Kitaoka 120a6e
      int m_locksCount;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      QMutex m_mutex;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool m_backEnabled;
    Shinya Kitaoka 120a6e
      bool m_invalidated;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      friend class TCacheResourcePool;
    Shinya Kitaoka 120a6e
      friend class THDCacheResourcePool;
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    private:
    Shinya Kitaoka 120a6e
      TCacheResource();
    Shinya Kitaoka 120a6e
      ~TCacheResource();
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      friend class TCacheResourceP;
    Shinya Kitaoka 120a6e
      inline void addRef() { ++m_refCount; }
    Shinya Kitaoka 120a6e
      void release();
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    public:
    Shinya Kitaoka 120a6e
      const std::string &getName() const { return m_pos->first; }
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      QMutex *getMutex() { return &m_mutex; }
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      enum Type { NONE, RGBM32, RGBM64, CM32 };
    Shinya Kitaoka 120a6e
      int getRasterType() const { return m_tileType; }
    Shinya Kitaoka 120a6e
      TRasterP buildCompatibleRaster(const TDimension &size);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      QRegion getAvailableRegion() const { return m_region; }
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool upload(const TPoint &pos, TRasterP ras);
    Shinya Kitaoka 120a6e
      bool upload(const TTile &tile);
    Shinya Kitaoka 120a6e
      QRegion download(const TPoint &pos, TRasterP ras);
    Shinya Kitaoka 120a6e
      QRegion download(TTile &tile);
    Shinya Kitaoka 120a6e
      bool downloadAll(const TPoint &pos, TRasterP ras);
    Shinya Kitaoka 120a6e
      bool downloadAll(TTile &tile);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool uploadPalette(TPaletteP palette);
    Shinya Kitaoka 120a6e
      void downloadPalette(TPaletteP &palette);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      void clear(QRegion region);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool canUpload(const TTile &tile) const;
    Shinya Kitaoka 120a6e
      bool canDownloadSome(const TTile &tile) const;
    Shinya Kitaoka 120a6e
      bool canDownloadAll(const TTile &tile) const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool canUpload(int rasType) const {
    Shinya Kitaoka 120a6e
        return m_tileType == NONE || m_tileType == rasType;
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
      bool canDownloadSome(const TRect &rect) const;
    Shinya Kitaoka 120a6e
      bool canDownloadAll(const TRect &rect) const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      void addRef2(const TRect &rect);
    Shinya Kitaoka 120a6e
      void release2(const TRect &rect);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      void addLock();
    Shinya Kitaoka 120a6e
      void releaseLock();
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      int size() const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      void enableBackup();
    Shinya Kitaoka 120a6e
      void invalidate();
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      void save(const TFilePath &fp);
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    private:
    Shinya Kitaoka 120a6e
      bool checkRasterType(const TRasterP &ras, int &rasType) const;
    Shinya Kitaoka 120a6e
      bool checkTile(const TTile &tile) const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      TRasterP createCellRaster(int rasterType, const std::string &cacheId);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      inline TPoint getCellPos(const TPoint &pos) const;
    Shinya Kitaoka 120a6e
      inline TPoint getCellPos(const TPointD &pos) const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      inline PointLess getCellIndex(const TPoint &pos) const;
    Shinya Kitaoka 120a6e
      inline TPoint getCellPos(const PointLess &cellIndex) const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      inline std::string getCellName(int idxX, int idxY) const;
    Shinya Kitaoka 120a6e
      inline std::string getCellCacheId(const TPoint &cellPos) const;
    Shinya Kitaoka 120a6e
      inline std::string getCellCacheId(int idxX, int idxY) const;
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    private:
    Shinya Kitaoka 120a6e
      void setPath(const TFilePath &path);
    Shinya Kitaoka 120a6e
      const TFilePath &getPath() const;
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      void clear();
    Shinya Kitaoka 120a6e
      void save();
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool save(const PointLess &cellIndex, TRasterP cellRas = 0) const;
    Shinya Kitaoka 120a6e
      TRasterP load(const PointLess &cellIndex);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      std::pair<trasterp, *="" celldata=""> touch(const PointLess &cellIndex);</trasterp,>
    Shinya Kitaoka 120a6e
      void releaseCell(const QRect &cellQRect, const PointLess &cellIndex,
    Shinya Kitaoka 120a6e
                       bool save);
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
      bool addMark(QString flag);
    Shinya Kitaoka 120a6e
      bool removeMark(QString flag);
    Shinya Kitaoka 120a6e
      bool hasMark(QString flag);
    Toshihiro Shimizu 890ddd
    };
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    //=========================================================================
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    //=====================================
    Toshihiro Shimizu 890ddd
    //    Cache Resource Smart pointer
    Toshihiro Shimizu 890ddd
    //-------------------------------------
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    /*!
    Shinya Kitaoka 120a6e
    The TCacheResourceP class implements 'smart' referenced pointers to
    Shinya Kitaoka 120a6e
    TCacheResource
    Toshihiro Shimizu 890ddd
    instances.
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
    Smart pointers are typically used to hold references to data that is
    Shinya Kitaoka 120a6e
    automatically freed
    Toshihiro Shimizu 890ddd
    once it is no more referenced by any smart pointer instance.
    Shinya Kitaoka 120a6e
    The TCacheResourceP is a specialized smart pointer-like class that references
    Shinya Kitaoka 120a6e
    TCacheResource
    Toshihiro Shimizu 890ddd
    instances.
    Toshihiro Shimizu 890ddd
    \n \n
    Shinya Kitaoka 120a6e
    In order to retrieve a Cache resource, it is sufficient to know the resource
    Shinya Kitaoka 120a6e
    name and invoke the
    Shinya Kitaoka 120a6e
    \c TCacheResourceP(const std::string&, bool) constructor. The bool optionally
    Shinya Kitaoka 120a6e
    specified as second
    Shinya Kitaoka 120a6e
    argument specifies whether the resource has to be created if none is found with
    Shinya Kitaoka 120a6e
    passed name.
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    \sa TCacheResource, TSmartPointer classes.
    Toshihiro Shimizu 890ddd
    */
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
    class DVAPI TCacheResourceP {
    Shinya Kitaoka 120a6e
      TCacheResource *m_pointer;
    Toshihiro Shimizu 890ddd
    Toshihiro Shimizu 890ddd
    public:
    Shinya Kitaoka 120a6e
      TCacheResourceP() : m_pointer(0) {}
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      TCacheResourceP(const TCacheResourceP &src) : m_pointer(src.m_pointer) {
    Shinya Kitaoka 120a6e
        if (m_pointer) m_pointer->addRef();
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      TCacheResourceP(const std::string &resourceName, bool createIfNone = false);
    Shinya Kitaoka 120a6e
      ~TCacheResourceP();
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      TCacheResourceP &operator=(const TCacheResourceP &src) {
    Shinya Kitaoka 120a6e
        TCacheResource *old = m_pointer;
    Shinya Kitaoka 120a6e
        m_pointer           = src.m_pointer;
    Shinya Kitaoka 120a6e
        if (m_pointer) m_pointer->addRef();
    Shinya Kitaoka 120a6e
        if (old) old->release();
    Shinya Kitaoka 120a6e
        return *this;
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      TCacheResource *operator->() const {
    Shinya Kitaoka 120a6e
        assert(m_pointer);
    Shinya Kitaoka 120a6e
        return m_pointer;
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      TCacheResource &operator*() const {
    Shinya Kitaoka 120a6e
        assert(m_pointer);
    Shinya Kitaoka 120a6e
        return *m_pointer;
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      TCacheResource *getPointer() const { return m_pointer; }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      bool operator!() const { return m_pointer == 0; }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      operator bool() const { return m_pointer != 0; }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      bool operator<(const TCacheResourceP &res) const {
    Shinya Kitaoka 120a6e
        return m_pointer < res.m_pointer;
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      bool operator==(const TCacheResourceP &p) const {
    Shinya Kitaoka 120a6e
        return m_pointer == p.m_pointer;
    Shinya Kitaoka 120a6e
      }
    Shinya Kitaoka 120a6e
    Shinya Kitaoka 120a6e
      bool operator!=(const TCacheResourceP &p) const { return !(operator==(p)); }
    Toshihiro Shimizu 890ddd
    };
    Toshihiro Shimizu 890ddd
    Shinya Kitaoka 120a6e
    #endif  // TCACHERESOURCE_INCLUDED