34#include <libdap/Type.h>
35#include <libdap/BaseType.h>
36#include <libdap/Byte.h>
37#include <libdap/Int16.h>
38#include <libdap/UInt16.h>
39#include <libdap/Int32.h>
40#include <libdap/UInt32.h>
41#include <libdap/Float32.h>
42#include <libdap/Float64.h>
43#include <libdap/Str.h>
44#include <libdap/Url.h>
45#include <libdap/Array.h>
46#include <libdap/Error.h>
47#include <libdap/DDS.h>
49#include <libdap/DMR.h>
50#include <libdap/D4Group.h>
51#include <libdap/D4RValue.h>
53#include <libdap/debug.h>
54#include <libdap/util.h>
56#include <libdap/BaseTypeFactory.h>
60#include "DilateArrayFunction.h"
61#include "functions_util.h"
67string dilate_array_info =
68 string(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
69 +
"<function name=\"dilate_array\" version=\"1.0\" href=\"http://docs.opendap.org/index.php/Server_Side_Processing_Functions#dilate_array\">\n"
83void function_dilate_dap2_array(
int argc, BaseType * argv[], DDS &, BaseType **btpp)
86 Str *response =
new Str(
"info");
87 response->set_value(dilate_array_info);
92 BESDEBUG(
"functions",
"function_dilate_dap2_array() - argc: " << argc << endl);
94 BaseType *btp = argv[0];
96 if (btp->type() != dods_array_c)
97 throw Error(malformed_expr,
"dilate_array(): first argument must point to a Array variable.");
99 Array *mask =
static_cast<Array*
>(btp);
100 if (mask->var()->type() != dods_byte_c && mask->dimensions() == 2)
101 throw Error(malformed_expr,
"dilate_array(): first argument must point to a Two dimensional Byte Array variable.");
104 vector<dods_byte> mask_values(mask->length());
105 mask->value(mask_values.data());
108 vector<dods_byte> dest_values(mask->length());
111 if (!is_integer_type(argv[1]->type()))
112 throw Error(malformed_expr,
"dilate_array(): Expected an integer for the second argument.");
114 unsigned int dSize = extract_uint_value(argv[1]);
116 Array::Dim_iter itr = mask->dim_begin();
117 int maxI = mask->dimension_size(itr++);
118 int maxJ = mask->dimension_size(itr);
122 for (
unsigned int i=dSize; i<maxI-dSize; i++) {
123 for (
unsigned int j=dSize; j<maxJ-dSize; j++ ) {
124 int mask_offset = j + i * maxI;
125 if ( mask_values.at(mask_offset) == 1 ) {
129 for (
unsigned int x=i-dSize; x<=i+dSize; x++) {
130 for (
unsigned int y=j-dSize; y<=j+dSize; y++) {
131 int dest_offset = y + x * maxI;
132 dest_values.at(dest_offset) = 1;
140 Array *dest =
new Array(
"dilated_mask", 0);
143 dest->add_var_nocopy(btf.NewVariable(dods_byte_c));
145 dest->append_dim(maxI);
146 dest->append_dim(maxJ);
148 dest->set_value(dest_values, mask->length());
149 dest->set_send_p(
true);
150 dest->set_read_p(
true);