56 #include <BaseTypeFactory.h>
60 #include "DilateArrayFunction.h"
61 #include "functions_util.h"
67 string 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"
83 void 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[0]);
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);