// Get colour associated with value supplied (as Vec4<GLfloat>) void ColourScale::colour(double value, Vec4<GLfloat>& target) const { // Step through points associated to scale and find the two that we are inbetween. // Check for no points being defined if (points_.nItems() == 0) { target.x = 0.0; target.y = 0.0; target.z = 0.0; target.w = 1.0; return; } ColourScalePoint* csp = points_.first(); // Is supplied value less than the value at the first point? if (value < csp->value()) { csp->colour(target); return; } // Find the correct delta to use for (ColourScaleDelta* delta = deltas_.first(); delta != NULL; delta = delta->next) { if (delta->containsValue(value)) { delta->colour(interpolated_ ? value : delta->start(), useHSV_, target); return; } } // If we get to here then the supplied value is outside the range of all values, so take colour from the endpoint //printf("OUTSIDE RANGE\n"); points_.last()->colour(target); }
// Set all alpha values to that specified void ColourScale::setAllAlpha(double alpha) { QColor color; for (ColourScalePoint* csp = points_.first(); csp != NULL; csp = csp->next) { color = csp->colour(); int alphai = alpha*255; if (alphai < 0) alphai = 0; else if (alphai > 255) alphai = 255; color.setAlpha(alphai); csp->setColour(color); } calculateDeltas(); }
// Return colour associated with value provided QColor ColourScale::colour(double value) const { // Step through points associated to scale and find the two that we are inbetween. // Check for no points being defined if (points_.nItems() == 0) return QColor(0,0,0); ColourScalePoint* csp = points_.first(); // Is supplied value less than the value at the first point? if (value < csp->value()) return csp->colour(); // Find the correct delta to use for (ColourScaleDelta* delta = deltas_.first(); delta != NULL; delta = delta->next) { if (delta->containsValue(value)) return delta->colour(interpolated_ ? value : delta->start(), useHSV_); } // If we get to here then the supplied value is outside the range of all values, so take colour from the endpoint return points_.last()->colour(); }
// Assignment operator void ColourScale::operator=(const ColourScale& source) { clear(); useHSV_ = source.useHSV_; for (ColourScalePoint* csp = source.points_.first(); csp != NULL; csp = csp->next) addPoint( csp->value(), csp->colour() ); interpolated_ = source.interpolated_; }
// Write CollectionBlock keywords bool UChromaSession::writeCollectionBlock(LineParser& parser, Collection* collection, Collection::CollectionType type, int indentLevel) { // Construct indent string char* indent = new char[indentLevel*2+1]; for (int n=0; n<indentLevel*2; ++n) indent[n] = ' '; indent[indentLevel*2] = '\0'; if (type == Collection::MasterCollection) parser.writeLineF("%s%s '%s'\n", indent, UChromaSession::inputBlock(UChromaSession::CollectionBlock), qPrintable(collection->name())); else if (type == Collection::FitCollection) parser.writeLineF("%s%s '%s'\n", indent, UChromaSession::collectionKeyword(UChromaSession::FitBlockKeyword), qPrintable(collection->name())); else if (type == Collection::ExtractedCollection) parser.writeLineF("%s%s '%s'\n", indent, UChromaSession::collectionKeyword(UChromaSession::SliceBlockKeyword), qPrintable(collection->name())); parser.writeLineF("%s %s \"%s\"\n", indent, UChromaSession::collectionKeyword(UChromaSession::DataDirectoryKeyword), qPrintable(collection->dataFileDirectory().absolutePath())); // -- Transforms parser.writeLineF("%s %s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::TransformXKeyword), stringBool(collection->transformEnabled(0)), qPrintable(collection->transformEquation(0))); parser.writeLineF("%s %s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::TransformYKeyword), stringBool(collection->transformEnabled(1)), qPrintable(collection->transformEquation(1))); parser.writeLineF("%s %s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::TransformZKeyword), stringBool(collection->transformEnabled(2)), qPrintable(collection->transformEquation(2))); // -- Interpolation parser.writeLineF("%s %s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::InterpolateKeyword), stringBool(collection->interpolate(0)), stringBool(collection->interpolate(2))); parser.writeLineF("%s %s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::InterpolateConstrainKeyword), stringBool(collection->interpolateConstrained(0)), stringBool(collection->interpolateConstrained(2))); parser.writeLineF("%s %s %f %f\n", indent, UChromaSession::collectionKeyword(UChromaSession::InterpolateStepKeyword), collection->interpolationStep(0), collection->interpolationStep(2)); // Colour Setup parser.writeLineF("%s %s '%s'\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourSourceKeyword), Collection::colourSource(collection->colourSource())); ColourScalePoint* csp; QColor colour; double value; // -- Single Colour colour = collection->colourScalePointColour(Collection::SingleColourSource); parser.writeLineF("%s %s %i %i %i %i\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourSingleKeyword), colour.red(), colour.green(), colour.blue(), colour.alpha()); // -- RGB Gradient colour = collection->colourScalePointColour(Collection::RGBGradientSource, 0); value = collection->colourScalePointValue(Collection::RGBGradientSource, 0); parser.writeLineF("%s %s %f %i %i %i %i\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourRGBGradientAKeyword), value, colour.red(), colour.green(), colour.blue(), colour.alpha()); colour = collection->colourScalePointColour(Collection::RGBGradientSource, 1); value = collection->colourScalePointValue(Collection::RGBGradientSource, 1); parser.writeLineF("%s %s %f %i %i %i %i\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourRGBGradientBKeyword), value, colour.red(), colour.green(), colour.blue(), colour.alpha()); // -- HSV Gradient colour = collection->colourScalePointColour(Collection::HSVGradientSource, 0); value = collection->colourScalePointValue(Collection::HSVGradientSource, 0); parser.writeLineF("%s %s %f %i %i %i %i\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourHSVGradientAKeyword), value, colour.hue(), colour.saturation(), colour.value(), colour.alpha()); colour = collection->colourScalePointColour(Collection::HSVGradientSource, 1); value = collection->colourScalePointValue(Collection::HSVGradientSource, 1); parser.writeLineF("%s %s %f %i %i %i %i\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourHSVGradientBKeyword), value, colour.hue(), colour.saturation(), colour.value(), colour.alpha()); // -- Custom Gradient for (csp = collection->customColourScalePoints(); csp != NULL; csp = csp->next) { parser.writeLineF("%s %s %f %i %i %i %i\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourCustomGradientKeyword), csp->value(), csp->colour().red(), csp->colour().green(), csp->colour().blue(), csp->colour().alpha()); } // -- Alpha control parser.writeLineF("%s %s '%s'\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourAlphaControlKeyword), Collection::alphaControl(collection->alphaControl())); parser.writeLineF("%s %s %f\n", indent, UChromaSession::collectionKeyword(UChromaSession::ColourAlphaFixedKeyword), collection->fixedAlpha()); // Display parser.writeLineF("%s %s %f '%s'\n", indent, UChromaSession::collectionKeyword(UChromaSession::LineStyleKeyword), collection->displayLineStyle().width(), LineStipple::stipple[collection->displayLineStyle().stipple()].name); parser.writeLineF("%s %s %f\n", indent, UChromaSession::collectionKeyword(UChromaSession::ShininessKeyword), collection->displaySurfaceShininess()); parser.writeLineF("%s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::StyleKeyword), Collection::displayStyle(collection->displayStyle())); parser.writeLineF("%s %s %s\n", indent, UChromaSession::collectionKeyword(UChromaSession::VisibleCollectionKeyword), stringBool(collection->visible())); // Loop over datasets for (DataSet* dataSet = collection->dataSets(); dataSet != NULL; dataSet = dataSet->next) writeDataSetBlock(parser, dataSet, indentLevel); // Write FitKernel data if present if (collection->fitKernel()) writeFitParametersBlock(parser, collection->fitKernel(), indentLevel); // Additional data // -- Fits for (Collection* fit = collection->fits(); fit != NULL; fit = fit->next) writeCollectionBlock(parser, fit, Collection::FitCollection, indentLevel+1); // -- Extracted Data for (Collection* extract = collection->slices(); extract != NULL; extract = extract->next) writeCollectionBlock(parser, extract, Collection::ExtractedCollection, indentLevel+1); parser.writeLineF("%s%s\n", indent, UChromaSession::collectionKeyword(UChromaSession::EndCollectionKeyword)); return true; }