GRASS 8 Programmer's Manual 8.6.0dev(2026)-ddf66e9d5c
Loading...
Searching...
No Matches
getblock.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3#include <sys/types.h>
4#include <unistd.h>
5
6#include <grass/raster.h>
7#include "raster3d_intern.h"
8
9/*---------------------------------------------------------------------------*/
10
11void Rast3d_get_block_nocache(RASTER3D_Map *map, int x0, int y0, int z0, int nx,
12 int ny, int nz, void *block, int type)
13{
14 void *tile = NULL;
17 int tx, ty, tz, dx, dy, dz, x, y, z, rows, cols, depths;
18 int tileIndex;
19
20 /* The tile is read in the map's internal type and only converted to
21 * the requested type when copied into the block, so it must be
22 * allocated in the internal type: a DCELL map read as FCELL would
23 * otherwise overflow the buffer. */
24 if (!map->useCache)
26 if (tile == NULL)
28 "Rast3d_get_block_nocache: error in Rast3d_alloc_tiles");
29
32 Rast3d_coord2tile_coord(map, x0 + nx - 1, y0 + ny - 1, z0 + nz - 1, &tileX1,
34 &tileOffsZ1);
35
36 for (tz = tileZ0; tz <= tileZ1; tz++) {
37 dz = (tz - tileZ0) * map->tileZ - tileOffsZ0;
38 for (ty = tileY0; ty <= tileY1; ty++) {
39 dy = (ty - tileY0) * map->tileY - tileOffsY0;
40 for (tx = tileX0; tx <= tileX1; tx++) {
41 dx = (tx - tileX0) * map->tileX - tileOffsX0;
42
44
46 if (map->useCache) {
48 if (tile == NULL)
49 Rast3d_fatal_error("Rast3d_get_block_nocache: "
50 "error in Rast3d_get_tile_ptr");
51 }
52 else {
54 map->typeIntern))
55 Rast3d_fatal_error("Rast3d_get_block_nocache: "
56 "error in Rast3d_read_tile");
57 }
58
59 else
61
62 cols = (tx == tileX1 ? tileOffsX1 : map->tileX - 1);
63 rows = (ty == tileY1 ? tileOffsY1 : map->tileY - 1);
64 depths = (tz == tileZ1 ? tileOffsZ1 : map->tileZ - 1);
65
66 x = (tx == tileX0 ? tileOffsX0 : 0);
67
68 for (z = (tz == tileZ0 ? tileOffsZ0 : 0); z <= depths; z++)
69 for (y = (ty == tileY0 ? tileOffsY0 : 0); y <= rows; y++) {
71 tile, z * map->tileXY + y * map->tileX + x,
72 map->typeIntern, block,
73 (z + dz) * nx * ny + (y + dy) * nx + (x + dx), type,
74 cols - x + 1);
75 }
76 }
77 }
78 }
79
80 if (!map->useCache)
82}
83
84/*---------------------------------------------------------------------------*/
85
86/*!
87 * \brief
88 *
89 * Copies the cells contained in the block (cube) with vertices
90 * <em>(x0, y0, z0)</em> and <em>(x0 + nx - 1, y0 + ny - 1, z0 + nz - 1)</em>
91 * into <em>block</em>. The cell-values in <em>block</em> are of <em>type</em>.
92 * The source code can be found in <em>getblock.c</em>.
93 *
94 * \param map
95 * \param x0
96 * \param y0
97 * \param z0
98 * \param nx
99 * \param ny
100 * \param nz
101 * \param block
102 * \param type
103 * \return void
104 */
105void Rast3d_get_block(RASTER3D_Map *map, int x0, int y0, int z0, int nx, int ny,
106 int nz, void *block, int type)
107{
108 int x, y, z, nNull, x1, y1, z1, length;
109
110 if (!map->useCache) {
111 Rast3d_get_block_nocache(map, x0, y0, z0, nx, ny, nz, block, type);
112 return;
113 }
114
115 x1 = RASTER3D_MIN(x0 + nx, map->region.cols);
116 y1 = RASTER3D_MIN(y0 + ny, map->region.rows);
117 z1 = RASTER3D_MIN(z0 + nz, map->region.depths);
118
119 length = Rast3d_length(type);
120
121 for (z = z0; z < z1; z++) {
122 for (y = y0; y < y1; y++) {
123 for (x = x0; x < x1; x++) {
124 Rast3d_get_value_region(map, x, y, z, block, type);
125 block = G_incr_void_ptr(block, length);
126 }
127 nNull = x0 + nx - x;
128 Rast3d_set_null_value(block, nNull, type);
129 block = G_incr_void_ptr(block, length * nNull);
130 }
131 nNull = (y0 + ny - y) * nx;
132 Rast3d_set_null_value(block, nNull, type);
133 block = G_incr_void_ptr(block, length * nNull);
134 }
135 nNull = (z0 + nz - z) * ny * nx;
136 Rast3d_set_null_value(block, nNull, type);
137}
#define NULL
Definition ccmath.h:32
#define G_incr_void_ptr(ptr, size)
Definition defs/gis.h:78
void Rast3d_copy_values(const void *, int, int, void *, int, int, int)
int Rast3d_tile_index_in_range(RASTER3D_Map *, int)
Returns 1 if tileIndex is a valid index for map. Returns 0 otherwise.
Definition tilemath.c:196
void * Rast3d_get_tile_ptr(RASTER3D_Map *, int)
This function returns a pointer to a tile which contains the data for the tile with index tileIndex....
Definition tileio.c:78
void Rast3d_set_null_value(void *, int, int)
Fills the vector pointed to by c with nofElts NULL-values of type.
Definition null.c:33
void Rast3d_free_tiles(void *)
Is equivalent to Rast3d_free (tiles);
Definition tilealloc.c:70
void Rast3d_set_null_tile(RASTER3D_Map *, void *)
Is equivalent to Rast3d_set_null_tile_type (map, tile, Rast3d_file_type_map (map)).
Definition tilenull.c:38
int Rast3d_tile2tile_index(RASTER3D_Map *, int, int, int)
Returns tile-index corresponding to tile-coordinates (xTile, yTile, zTile).
Definition tilemath.c:47
void Rast3d_get_value_region(RASTER3D_Map *, int, int, int, void *, int)
Returns in *value the cell-value of the cell with region-coordinate (x, y, z). The value returned is ...
Definition getvalue.c:249
void Rast3d_coord2tile_coord(RASTER3D_Map *, int, int, int, int *, int *, int *, int *, int *, int *)
Converts cell-coordinates (x, y, z) into tile-coordinates (xTile, yTile, zTile) and the coordinate of...
Definition tilemath.c:124
int Rast3d_length(int)
void * Rast3d_alloc_tiles_type(RASTER3D_Map *, int, int)
Allocates a vector of nofTiles tiles with the same dimensions as the tiles of map and large enough to...
Definition tilealloc.c:22
int Rast3d_read_tile(RASTER3D_Map *, int, void *, int)
Reads tile with index tileIndex into the tile buffer. The cells are stored with type type which must ...
Definition tileread.c:150
void Rast3d_fatal_error(const char *,...) __attribute__((format(printf
void Rast3d_get_block(RASTER3D_Map *map, int x0, int y0, int z0, int nx, int ny, int nz, void *block, int type)
Copies the cells contained in the block (cube) with vertices (x0, y0, z0) and (x0 + nx - 1,...
Definition getblock.c:105
void Rast3d_get_block_nocache(RASTER3D_Map *map, int x0, int y0, int z0, int nx, int ny, int nz, void *block, int type)
Definition getblock.c:11
#define RASTER3D_MIN(a, b)
RASTER3D_Region region
Definition raster3d.h:82
#define x