void NgonGridDataDecomposer::fillDirectGridColors(float* buffer, int bufferLength, int elementsSize, double* colormap, int colormapSize, double* z, int numX, int numY) { int currentPointIndex = 0; int bufferOffset = 0; #if PER_VERTEX_VALUES for (int j = 0; j < numY; j++) { for (int i = 0; i < numX; i++) { currentPointIndex = getPointIndex(numX, numY, i, j); ColorComputer::getDirectColor(z[currentPointIndex] - 1.0, colormap, colormapSize, &buffer[bufferOffset]); if (elementsSize == 4) { buffer[bufferOffset +3] = 1.0; } bufferOffset += elementsSize; } } #else for (int j = 0; j < numY-1; j++) { for (int i = 0; i < numX-1; i++) { float facetColor[3]; currentPointIndex = getPointIndex(numX, numY, i, j); ColorComputer::getDirectColor(z[currentPointIndex] - 1.0, colormap, colormapSize, facetColor); writeFacetColorToBuffer(buffer, bufferOffset, facetColor, elementsSize); bufferOffset += 4*elementsSize; } } #endif }
void NgonGridDataDecomposer::fillNormalizedZGridColors(float* buffer, int bufferLength, int elementsSize, double* colormap, int colormapSize, double* z, int numX, int numY) { double zMin = 0.; double zMax = 0.; double zRange = 0.; double minDoubleValue = 0.; int bufferOffset = 0; computeMinMaxZValues(z, numX, numY, &zMin, &zMax); minDoubleValue = DecompositionUtils::getMinDoubleValue(); /* To be verified */ if ((zMax - zMin) < minDoubleValue) { zRange = 1.0; } else { zRange = zMax - zMin; } #if PER_VERTEX_VALUES for (int j = 0; j < numY; j++) { for (int i = 0; i < numX; i++) { int currentPointIndex = getPointIndex(numX, numY, i, j); ColorComputer::getColor(z[currentPointIndex], zMin, zRange, Z_COLOR_OFFSET, colormap, colormapSize, &buffer[bufferOffset]); if (elementsSize == 4) { buffer[bufferOffset +3] = 1.0; } bufferOffset += elementsSize; } } #else for (int j = 0; j < numY-1; j++) { for (int i = 0; i < numX-1; i++) { double avgz; float facetColor[3]; avgz = computeFacetAverageZValue(z, numX, numY, i, j); ColorComputer::getColor(avgz, zMin, zRange, Z_COLOR_OFFSET, colormap, colormapSize, facetColor); writeFacetColorToBuffer(buffer, bufferOffset, facetColor, elementsSize); bufferOffset += 4*elementsSize; } } #endif }
/* * To do: * -clean-up: replace explicitely computed z indices by getPointIndex calls * -remove the per-vertex color fill code */ void NgonGridMatplotDataDecomposer::fillColors(char* id, float* buffer, int bufferLength, int elementsSize) { char* parent = NULL; char* parentFigure = NULL; double* z = NULL; double* colormap = NULL; double currentZ = 0.; int numX = 0; int* piNumX = &numX; int numY = 0; int* piNumY = &numY; int colormapSize = 0; int* piColormapSize = &colormapSize; int bufferOffset = 0; getGraphicObjectProperty(id, __GO_PARENT__, jni_string, (void**) &parent); /* Temporary: to avoid getting a null parent_figure property when the object is built */ if (strcmp(parent, "") == 0) { return; } getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_string, (void**) &parentFigure); getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_X__, jni_int, (void**) &piNumX); getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**) &piNumY); getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &z); /* In order not to access invalid data when reading the last line's last element */ if (numX < 2) { return; } getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap); getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize); #if PER_VERTEX_VALUES for (int j = 0; j < numY - 1; j++) { for (int i = 0; i < numX - 1; i++) { currentZ = z[i * (numY - 1) + (numY - 2 - j)]; ColorComputer::getDirectColor((double) currentZ - 1.0, colormap, colormapSize, &buffer[bufferOffset]); if (elementsSize == 4) { buffer[bufferOffset + 3] = 1.0; } bufferOffset += elementsSize; } /* Last element (same as the above loop's last) */ currentZ = z[(numX - 2) * (numY - 1) + (numY - 2 - j)]; ColorComputer::getDirectColor((double) currentZ - 1.0, colormap, colormapSize, &buffer[bufferOffset]); if (elementsSize == 4) { buffer[bufferOffset + 3] = 1.0; } bufferOffset += elementsSize; } /* Last line */ for (int i = 0; i < numX - 1; i++) { currentZ = z[(numY - 1) * i + 0]; ColorComputer::getDirectColor((double) currentZ - 1.0, colormap, colormapSize, &buffer[bufferOffset]); bufferOffset += elementsSize; if (elementsSize == 4) { buffer[bufferOffset + 3] = 1.0; } } /* Last element (same as the above loop's last) */ currentZ = z[(numX - 2) * (numY - 1) + 0]; ColorComputer::getDirectColor((double) currentZ - 1.0, colormap, colormapSize, &buffer[bufferOffset]); if (elementsSize == 4) { buffer[bufferOffset + 3] = 1.0; } #else for (int j = 0; j < numY - 1; j++) { for (int i = 0; i < numX - 1; i++) { float facetColor[3]; currentZ = z[i * (numY - 1) + (numY - 2 - j)]; ColorComputer::getDirectColor((double) currentZ - 1.0, colormap, colormapSize, facetColor); writeFacetColorToBuffer(buffer, bufferOffset, facetColor, elementsSize); bufferOffset += 4 * elementsSize; } } #endif releaseGraphicObjectProperty(__GO_COLORMAP__, colormap, jni_double_vector, colormapSize); }