32
32
/* Returned size is in bytes or 0 if an error occured */
34
int ComputeDatasetRasterIOSize (int buf_xsize, int buf_ysize, int nPixelSize,
34
GIntBig ComputeDatasetRasterIOSize (int buf_xsize, int buf_ysize, int nPixelSize,
35
35
int nBands, int* bandMap, int nBandMapArrayLength,
36
36
int nPixelSpace, int nLineSpace, int nBandSpace,
37
37
int bSpacingShouldBeMultipleOfPixelSize )
39
const int MAX_INT = 0x7fffffff;
40
const GIntBig MAX_INT = (((GIntBig)0x7fffffff) << 32) | 0xffffffff;
42
const GIntBig MAX_INT = 0x7fffffff;
44
const GIntBig MAX_INT32 = 0x7fffffff;
40
45
if (buf_xsize <= 0 || buf_ysize <= 0)
42
47
CPLError(CE_Failure, CPLE_IllegalArg, "Illegal values for buffer size");
102
if ((buf_ysize - 1) > MAX_INT / nLineSpace ||
103
(buf_xsize - 1) > MAX_INT / nPixelSpace ||
104
(nBands - 1) > MAX_INT / nBandSpace ||
105
(buf_ysize - 1) * nLineSpace > MAX_INT - (buf_xsize - 1) * nPixelSpace ||
106
(buf_ysize - 1) * nLineSpace + (buf_xsize - 1) * nPixelSpace > MAX_INT - (nBands - 1) * nBandSpace ||
107
(buf_ysize - 1) * nLineSpace + (buf_xsize - 1) * nPixelSpace + (nBands - 1) * nBandSpace > MAX_INT - nPixelSize)
107
GIntBig nRet = (GIntBig)(buf_ysize - 1) * nLineSpace + (GIntBig)(buf_xsize - 1) * nPixelSpace + (GIntBig)(nBands - 1) * nBandSpace + nPixelSize;
109
110
CPLError(CE_Failure, CPLE_IllegalArg, "Integer overflow");
113
return (buf_ysize - 1) * nLineSpace + (buf_xsize - 1) * nPixelSpace + (nBands - 1) * nBandSpace + nPixelSize;
117
#if !defined(SWIGCSHARP) && !defined(SWIGJAVA)
118
#if !defined(SWIGCSHARP) && !defined(SWIGJAVA) && !defined(SWIGPYTHON)
120
121
CPLErr DSReadRaster_internal( GDALDatasetShadow *obj,
126
127
int pixel_space, int line_space, int band_space)
130
*buf_size = ComputeDatasetRasterIOSize (buf_xsize, buf_ysize, GDALGetDataTypeSize( buf_type ) / 8,
131
GIntBig nRequiredSize = ComputeDatasetRasterIOSize (buf_xsize, buf_ysize, GDALGetDataTypeSize( buf_type ) / 8,
131
132
band_list ? band_list : GDALGetRasterCount(obj), pband_list, band_list,
132
133
pixel_space, line_space, band_space, FALSE);
134
if (nRequiredSize > 0x7fffffff)
136
CPLError(CE_Failure, CPLE_IllegalArg, "Integer overflow");
139
*buf_size = (int)nRequiredSize;
133
140
if (*buf_size == 0)
164
//************************************************************************
171
//************************************************************************/
173
// Define the extensions for GDALAsyncReader (nee GDALAsyncReaderShadow)
175
//************************************************************************/
176
%rename (AsyncReader) GDALAsyncReaderShadow;
182
GDALAsyncReaderH hAsyncReader;
184
} GDALAsyncReaderWrapper;
186
typedef void* GDALAsyncReaderWrapperH;
188
static GDALAsyncReaderH AsyncReaderWrapperGetReader(GDALAsyncReaderWrapperH hWrapper)
190
GDALAsyncReaderWrapper* psWrapper = (GDALAsyncReaderWrapper*)hWrapper;
191
if (psWrapper->hAsyncReader == NULL)
193
CPLError(CE_Failure, CPLE_AppDefined, "AsyncReader object is defunct");
195
return psWrapper->hAsyncReader;
198
static void* AsyncReaderWrapperGetPyObject(GDALAsyncReaderWrapperH hWrapper)
200
GDALAsyncReaderWrapper* psWrapper = (GDALAsyncReaderWrapper*)hWrapper;
201
return psWrapper->pyObject;
204
static void DeleteAsyncReaderWrapper(GDALAsyncReaderWrapperH hWrapper)
206
GDALAsyncReaderWrapper* psWrapper = (GDALAsyncReaderWrapper*)hWrapper;
207
if (psWrapper->hAsyncReader != NULL)
209
CPLError(CE_Failure, CPLE_AppDefined,
210
"Native AsyncReader object will leak. EndAsyncReader() should have been called before");
217
#if defined(SWIGPYTHON)
219
static GDALAsyncReaderWrapper* CreateAsyncReaderWrapper(GDALAsyncReaderH hAsyncReader,
222
GDALAsyncReaderWrapper* psWrapper = (GDALAsyncReaderWrapper* )CPLMalloc(sizeof(GDALAsyncReaderWrapper));
223
psWrapper->hAsyncReader = hAsyncReader;
224
psWrapper->pyObject = pyObject;
225
Py_INCREF((PyObject*) psWrapper->pyObject);
229
static void DisableAsyncReaderWrapper(GDALAsyncReaderWrapperH hWrapper)
231
GDALAsyncReaderWrapper* psWrapper = (GDALAsyncReaderWrapper*)hWrapper;
232
if (psWrapper->pyObject)
234
Py_XDECREF((PyObject*) psWrapper->pyObject);
236
psWrapper->pyObject = NULL;
237
psWrapper->hAsyncReader = NULL;
243
class GDALAsyncReaderShadow {
245
GDALAsyncReaderShadow();
248
~GDALAsyncReaderShadow()
250
DeleteAsyncReaderWrapper(self);
253
%apply (int *OUTPUT) {(int *)};
254
GDALAsyncStatusType GetNextUpdatedRegion(double timeout, int* xoff, int* yoff, int* buf_xsize, int* buf_ysize )
256
GDALAsyncReaderH hReader = AsyncReaderWrapperGetReader(self);
265
return GDALARGetNextUpdatedRegion(hReader, timeout, xoff, yoff, buf_xsize, buf_ysize );
269
#if defined(SWIGPYTHON)
270
%apply ( void **outPythonObject ) { (void** ppRetPyObject ) };
271
void GetBuffer(void** ppRetPyObject)
273
GDALAsyncReaderH hReader = AsyncReaderWrapperGetReader(self);
276
*ppRetPyObject = NULL;
279
*ppRetPyObject = AsyncReaderWrapperGetPyObject(self);
280
Py_INCREF((PyObject*)*ppRetPyObject);
282
%clear (void** ppRetPyObject );
285
int LockBuffer( double timeout )
287
GDALAsyncReaderH hReader = AsyncReaderWrapperGetReader(self);
292
return GDALARLockBuffer(hReader,timeout);
297
GDALAsyncReaderH hReader = AsyncReaderWrapperGetReader(self);
302
GDALARUnlockBuffer(hReader);
306
}; /* GDALAsyncReaderShadow */
308
//************************************************************************/
166
310
// Define the extensions for Dataset (nee GDALDatasetShadow)
168
//************************************************************************
312
//************************************************************************/
170
314
%rename (Dataset) GDALDatasetShadow;
206
350
return GDALGetProjectionRef( self );
353
%apply Pointer NONNULL {char const *prj};
209
354
CPLErr SetProjection( char const *prj ) {
210
355
return GDALSetProjection( self, prj );
357
%clear char const *prj;
360
%feature("kwargs") GetGeoTransform;
361
%apply (int *optional_int) { (int*) };
362
void GetGeoTransform( double argout[6], int* isvalid, int* can_return_null = 0 ) {
363
if (can_return_null && *can_return_null)
365
*isvalid = (GDALGetGeoTransform( self, argout ) == CE_None );
370
if ( GDALGetGeoTransform( self, argout ) != CE_None ) {
213
382
void GetGeoTransform( double argout[6] ) {
214
if ( GDALGetGeoTransform( self, argout ) != 0 ) {
383
if ( GDALGetGeoTransform( self, argout ) != CE_None ) {
301
471
return GDALCreateDatasetMaskBand( self, nFlags );
304
#if defined(SWIGPYTHON) || defined (SWIGJAVA)
305
%apply (char **out_ppsz_and_free) {char **};
307
/* this is a required typemap (hi, Python and Java guys!) returned list is copied and CSLDestroy'ed */
308
474
%apply (char **CSL) {char **};
310
475
char **GetFileList() {
311
476
return GDALGetFileList( self );
315
#if !defined(SWIGCSHARP) && !defined(SWIGJAVA)
480
#if defined(SWIGPYTHON)
481
%feature("kwargs") WriteRaster;
482
%apply (GIntBig nLen, char *pBuf) { (GIntBig buf_len, char *buf_string) };
483
%apply (int *optional_int) { (int*) };
484
%apply (int *optional_int) { (GDALDataType *buf_type) };
485
%apply (int nList, int *pList ) { (int band_list, int *pband_list ) };
486
CPLErr WriteRaster( int xoff, int yoff, int xsize, int ysize,
487
GIntBig buf_len, char *buf_string,
488
int *buf_xsize = 0, int *buf_ysize = 0,
489
GDALDataType *buf_type = 0,
490
int band_list = 0, int *pband_list = 0,
491
int* buf_pixel_space = 0, int* buf_line_space = 0, int* buf_band_space = 0) {
493
int nxsize = (buf_xsize==0) ? xsize : *buf_xsize;
494
int nysize = (buf_ysize==0) ? ysize : *buf_ysize;
496
if ( buf_type != 0 ) {
497
ntype = (GDALDataType) *buf_type;
499
int lastband = GDALGetRasterCount( self ) - 1;
502
ntype = GDALGetRasterDataType( GDALGetRasterBand( self, lastband ) );
505
int pixel_space = (buf_pixel_space == 0) ? 0 : *buf_pixel_space;
506
int line_space = (buf_line_space == 0) ? 0 : *buf_line_space;
507
int band_space = (buf_band_space == 0) ? 0 : *buf_band_space;
509
GIntBig min_buffer_size =
510
ComputeDatasetRasterIOSize (nxsize, nysize, GDALGetDataTypeSize( ntype ) / 8,
511
band_list ? band_list : GDALGetRasterCount(self), pband_list, band_list,
512
pixel_space, line_space, band_space, FALSE);
513
if (min_buffer_size == 0)
516
if ( buf_len < min_buffer_size )
518
CPLError(CE_Failure, CPLE_AppDefined, "Buffer too small");
522
eErr = GDALDatasetRasterIO( self, GF_Write, xoff, yoff, xsize, ysize,
523
(void*) buf_string, nxsize, nysize, ntype,
524
band_list, pband_list, pixel_space, line_space, band_space );
528
%clear (int band_list, int *pband_list );
529
%clear (GDALDataType *buf_type);
531
%clear (GIntBig buf_len, char *buf_string);
532
#elif !defined(SWIGCSHARP) && !defined(SWIGJAVA)
316
533
%feature("kwargs") WriteRaster;
317
534
%apply (int nLen, char *pBuf) { (int buf_len, char *buf_string) };
318
535
%apply (int *optional_int) { (int*) };
319
536
%apply (int *optional_int) { (GDALDataType *buf_type) };
320
537
%apply (int nList, int *pList ) { (int band_list, int *pband_list ) };
321
538
CPLErr WriteRaster( int xoff, int yoff, int xsize, int ysize,
322
int buf_len, char *buf_string,
539
int buf_len, char *buf_string,
323
540
int *buf_xsize = 0, int *buf_ysize = 0,
324
541
GDALDataType *buf_type = 0,
325
542
int band_list = 0, int *pband_list = 0,
639
#if defined(SWIGPYTHON)
640
%feature("kwargs") BeginAsyncReader;
641
%newobject BeginAsyncReader;
642
%apply (int nList, int *pList ) { (int band_list, int *pband_list ) };
643
%apply (int nLenKeepObject, char *pBufKeepObject, void* pyObject) { (int buf_len, char *buf_string, void* pyObject) };
644
%apply (int *optional_int) { (int*) };
645
GDALAsyncReaderShadow* BeginAsyncReader(
646
int xOff, int yOff, int xSize, int ySize,
647
int buf_len, char *buf_string, void* pyObject,
648
int buf_xsize, int buf_ysize, GDALDataType bufType = (GDALDataType)0,
649
int band_list = 0, int *pband_list = 0, int nPixelSpace = 0,
650
int nLineSpace = 0, int nBandSpace = 0, char **options = 0) {
652
if ((options != NULL) && (buf_xsize ==0) && (buf_ysize == 0))
654
// calculate an appropriate buffer size
655
const char* pszLevel = CSLFetchNameValue(options, "LEVEL");
659
int nLevel = atoi(pszLevel);
660
int nRes = 2 << (nLevel - 1);
661
buf_xsize = ceil(xSize / (1.0 * nRes));
662
buf_ysize = ceil(ySize / (1.0 * nRes));
666
int nxsize = (buf_xsize == 0) ? xSize : buf_xsize;
667
int nysize = (buf_ysize == 0) ? ySize : buf_ysize;
671
ntype = (GDALDataType) bufType;
677
int nBCount = (band_list) != 0 ? band_list : GDALGetRasterCount(self);
678
int nMinSize = nxsize * nysize * nBCount * (GDALGetDataTypeSize(ntype) / 8);
679
if (buf_string == NULL || buf_len < nMinSize)
681
CPLError(CE_Failure, CPLE_AppDefined, "Buffer is too small");
685
bool myBandList = false;
690
pBandList = pband_list;
695
pBandList = (int*)CPLMalloc(sizeof(int) * nBCount);
696
for (int i = 0; i < nBCount; ++i) {
697
pBandList[i] = i + 1;
701
GDALAsyncReaderH hAsyncReader =
702
GDALBeginAsyncReader(self, xOff, yOff, xSize, ySize, (void*) buf_string, nxsize, nysize, ntype, nBCount, pBandList, nPixelSpace, nLineSpace,
703
nBandSpace, options);
706
return (GDALAsyncReader*) CreateAsyncReaderWrapper(hAsyncReader, pyObject);
714
CPLFree( pBandList );
719
%clear(int band_list, int *pband_list);
720
%clear (int buf_len, char *buf_string, void* pyObject);
723
void EndAsyncReader(GDALAsyncReaderShadow* ario){
724
GDALAsyncReaderH hReader = AsyncReaderWrapperGetReader(ario);
729
GDALEndAsyncReader(self, hReader);
730
DisableAsyncReaderWrapper(ario);
421
735
}; /* GDALDatasetShadow */