summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua')
-rw-r--r--Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua98
1 files changed, 98 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua b/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua
new file mode 100644
index 00000000000..28fd6ddd56b
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua
@@ -0,0 +1,98 @@
+--
+-- This file contains parts of pgfplotscolormap.code.tex
+--
+
+local math=math
+local pgfplotsmath = pgfplots.pgfplotsmath
+local io=io
+local type=type
+local tostring=tostring
+local error=error
+local table=table
+
+do
+-- all globals will be read from/defined in pgfplots:
+local _ENV = pgfplots
+-----------------------------------
+
+ColorSpace = newClass()
+function ColorSpace:constructor(numComponents)
+ self.numComponents=numComponents
+end
+
+rgb = ColorSpace.new(3)
+cmyk = ColorSpace.new(4)
+gray = ColorSpace.new(1)
+
+
+ColorMap = newClass()
+
+ColorMap.range =1000
+
+-- h: mesh width between adjacent values
+-- colorspace: an instance of ColorSpace
+-- values: an array (1-based table) with color components. Each color component is supposed to be a table with K entries where K is colorspace:numComponents
+function ColorMap:constructor( h, colorspace, values)
+ if not h or not colorspace or not values then error("arguments must not be nil")end
+
+ self.name = name
+ self.h = h
+ self.invh = 1/h
+ self.colorspace = colorspace
+ self.values = values
+
+ local numComponents = self.colorspace.numComponents
+ for i = 1,#self.values do
+ local value = self.values[i]
+ if #value ~= numComponents then
+ error("Some value has an unexpected number of color components, expected " .. self.colorspace.numComponents .. " but was ".. #value);
+ end
+ end
+end
+
+function ColorMap:findPrecomputed(inMin, inMax, x)
+ local transformed
+ if inMin == 0 and inMax == ColorMap.range then
+ transformed = x
+ else
+ local scale = ColorMap.range / (inMax - inMin)
+
+ transformed = (x - inMin) * scale
+ end
+ transformed = math.max(0, transformed)
+ transformed = math.min(ColorMap.range, transformed)
+
+ local divh = transformed * self.invh
+ local intervalno = math.floor(divh)
+ local factor = divh - intervalno
+ local factor_two = 1-factor
+
+
+ -- Step 2: interpolate the desired RGB value using vector valued interpolation on the identified interval
+ if intervalno+1 == #self.values then
+ -- ah- we are at the right end!
+ return self.values[#self.values]
+ end
+
+ local left = self.values[intervalno+1]
+ local right = self.values[intervalno+2]
+ if not left or not right then error("Internal error: the color map does not have enough values for interval no " .. intervalno )end
+
+ local result = {}
+ for i = 1,self.colorspace.numComponents do
+ local result_i = factor_two * left[i] + factor * right[i]
+
+ result[i] = result_i
+ end
+
+ return result
+end
+
+-----------------------------------
+
+-- global registry of all colormaps.
+-- Key: colormap name
+-- Value: an instance of ColorMap
+ColorMaps = {}
+
+end