C++ (Qt)float Image::GetPixel( int x, int y ){// номер страницы в файле подкачки int pageNo = (y / mPixelPageY) * mNumPageX + x / mPixelPageX; // загрузили страницу if (!mPage[pageNo].IsLoaded()) LoadPage(pageNo, mBaseOffsetInFile + pageNo * mPageSizeBytes); // координаты пикселя внутри страницы x %= mPixelPageX; y %= mPixelPageY; // данные return mPage[pageNo].mData[y * mPixelPageX + x];}
C++ (Qt)const float * Image::GetComplexPixel( int iX, int iY, int * oNumPix );
C++ (Qt)#define VPAGE_PIX_X 32#define VPAGE_PIX_Y 32#define VPAGE_PIXELS (VPAGE_PIX_X * VPAGE_PIX_Y) class CVPage { struct CPoint { int mCount; float mData[1]; }; struct CData { const float * GetPixel( int iX, int iY, int * oNumPix ) const { int offset = mLookup[iY * VPAGE_PIX_X + iX]; if (offset < 0) { // empty point *oNumPix = 0; return 0; } CPoint * pt = (CPoint *)(mBase + offset); *oNumPix = pt->mCount; return pt->mData; } int mLookup[VPAGE_PIXELS]; char mBase[1]; }; public: CVPage( void ); const float * GetPixel( int iX, int iY, int * oNumPix ) const { return mData->GetPixel(iX, iY, oNumPix); } void * Alloc( void ) { mData = (CData *) malloc(mLoadSize); return mData; } void Free( void ) { if (mData) { free(mData); mData = 0; } } private: long long mFilePos; unsigned int mLoadSize; CData * mData; volatile int mSpin;};