chart-svg-dev
is a development environment for chart-svg.
:r
:set -Wno-type-defaults
:set -Wno-name-shadowing
:set -XOverloadedLabels
:set -XOverloadedStrings
:set -XTupleSections
:set -XQuasiQuotes
import Lib
import Prelude
import Control.Category ((>>>))
import Data.Function
import Data.Maybe
import Data.Bool
import Faker.Lorem
import Chart
import Prettychart
import Chart.Examples
import Optics.Core
import Data.ByteString.Char8 qualified as C
import Data.Text qualified as T
import Control.Monad
import NumHask.Prelude qualified as NH
import Data.Functor.Identity
import Data.Bifunctor
import Prettyprinter
import Text.Pretty.Simple
import MarkupParse
import DotParse
import DotParse.Examples
import Data.String.Interpolate
(display, quit) <- startChartServer (Just "chart-svg-dev")
writeAllExamples
display lineExample
co = rectExample
asp = view (#markupOptions % #chartAspect) co
csAndHud = addHud asp (view #hudOptions co) (view #chartTree co)
viewbox = finalCanvas asp (Just csAndHud)
ctFinal = set styleBox' (Just viewbox) csAndHud
view box' ctFinal
view styleBox' ctFinal
view safeBox' ctFinal
view safeStyleBox' ctFinal
padSingletons <$> view styleBox' ctFinal
viewbox
- [ ] check examples, nh, base
- [X] nodeSize, nodeHeight
- [X] boxes
cfg = defaultChartConfig
exGraph = defaultGraph & addStatements (toStatements Directed (C.pack . show <$> exAGraph)) & set (attL NodeType (ID "shape")) (Just $ ID "box")
exGraphAugmented <- processGraph exGraph
exChart = graphToChartWith cfg (T.pack . label) exGraphAugmented & set (#markupOptions % #chartAspect) ChartAspect
display exChart
pPrint defaultChartConfig
pPrint exGraphAugmented
- [X] simpler example
- [X] direct
:{
ex1 = [i|
digraph {
node [height=0.5;shape=circle]
graph [overlap=false;size="1!";splines=spline]
edge [arrowsize=0.5]
rankdir="TB"
1
2
1 -> 2
}
|]
:}
Graph
g1 = runDotParser ex1 :: Graph
g1
g1' <- processGraph g1
pPrint $ dotPrint defaultDotConfig g1'
c1 = graphToChartWith defaultChartConfig g1' & set (#markupOptions % #chartAspect) ChartAspect & set (#chartTree % charts' % each % #chartStyle % #scaleP) ScalePArea
display c1
pPrint c1
-- :t c1 & view #chartTree & view safeStyleBox'
c1 & forgetHud & view #chartTree & view safeStyleBox'
import Data.Proxy
testDotParser (Proxy :: Proxy Graph) defaultDotConfig ex0
testAll
import DotParse.Examples.NumHask qualified as NH
g <- processGraph (NH.dotGraphNH Directed)
display $ (graphToChartWith defaultChartConfig NH.toLink g)
import DotParse.Examples.NumHask qualified as NH
g <- processGraph (NH.dotGraphNH Directed)
display $ (graphToChartWith (defaultChartConfig & set #textSize 12 & set #chartVshift (-4)) (T.pack . label) g)
toLink
import DotParse.Examples.NumHask qualified as NH
g <- processGraph (NH.dotGraphNH Directed)
cNH = graphToChartWith (defaultChartConfig & set #textSize 12 & set #vshift (-4)) NH.toLink g & over (#chartTree % charts' % each) (\c -> c & bool (set (#chartStyle % #size) 0) id (isNothing . view (#chartData % textData') $ c))
cNH' = forgetHud cNH & set (#markupOptions % #chartAspect) UnscaledAspect & over (#chartTree % charts' % each) (\c -> c & bool (set (#chartStyle % #size) 0.03) id (isNothing . view (#chartData % textData') $ c))
display cNH'
import DotParse.Examples.NumHask qualified as NH
g <- processGraph (NH.dotGraphNH Directed)
cNH = graphToChartWith (defaultChartConfig & set #textSize 12 & set #chartVshift (-4)) NH.toLinkNH g & set (#markupOptions % #chartAspect) ChartAspect
display cNH
ss = cNH & toListOf (#chartTree % charts' % each) & fmap sbox
l = cNH & toListOf (#chartTree % charts' % each)
z = reverse l & drop 1
view styleBox' (unnamed z)
sbox <$> take 1 z
take 1 z
pPrint cNH
import DotParse.Examples.AST
gAST = dotAST allSC componentEdges
C.writeFile "other/ast.dot" $ dotPrint defaultDotConfig gAST
bsSvg <- processDotWith Directed ["-Tsvg"] (dotPrint defaultDotConfig gAST)
C.writeFile "other/ast.svg" bsSvg
showRGB light
pPrint $ chartSocketPage (Just "test")
Chart.Compound
Chart.Bar
barTextCharts textShiftVert
Chart.Hud
- defaultPriority
- HudBox
- CanvasBox
- ChartBox
- canvasBox’
- canvasStyleBox’
- hudBox’
- hudStyleBox’
- runHud
- HudChartSection
- hudChartBox’
- closes
- fromEffect
- applyChartAspect
- getHudBox
- appendHud
- makeHuds
- projectChartTreeWith
- addHud
- finalCanvas
- defaultAxisOptions
- defaultXAxisOptions
- defaultYAxisOptions
- placeText
- flipPlace
Title ==> TitleOptions
- defaultGlyphTick
- defaultGlyphTickStyleX
- defaultGlyphTickStyleY
- defaultTicks
- defaultXTicks
- defaultTick
TickStyle ==> Tick
formatN’ numTicks’ tickExtend’
- axisHud
- titleHud
- legend
- legendFrame
- freezeAxes
- freezeTicks
Priority refactor Hud refactor
Chart.Markup
- forgetHud
CssPreferColorScheme ==> PreferColorScheme CssShapeRendering ==> ShapeRendering
- defaultCssFontFamilies
Primitive
- ChartData (..),
- rectData’,
- lineData’,
- glyphData’,
- textData’,
- pathData’,
- blankData’,
- pattern RectChart,
- pattern LineChart,
- pattern GlyphChart,
- pattern TextChart,
- pattern PathChart,
- pattern BlankChart,
- pattern LineChart1,
- scaleP
- projectChartDataWith
- scaleStyle,
- colourChart,
- scaleChartData,
- colourStyle
- safeBox’
- safeStyleBox’
- overText
- blankChart
Chart.Style
- Style (..),
- defaultStyle,
- scaleStyle,
gpalette <== gpalette1
- ScaleP
- scaleRatio
Data.Colour
palette <== palette1 paletteO <== palette1a
Chart.Surface
- surfaceLegendChart,
- surfaceAxisOptions,
- surfaceLegendAxisOptions,
- gridReferenceChart,
- addSurfaceLegend,
Chart.Data
- singletonGuard
- isSingleton
axis –> axisHud title –> titleHud legend –> legendHud
display $ pathExample & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #anchorTo) CanvasStyleSection & set (#hudOptions % #axes % each % #item % #bar %? #anchorTo) CanvasStyleSection
ps = [ StartP (Point 0 0), LineP (Point 1 0), CubicP (Point 0.2 0) (Point 0.25 1) (Point 1 1), QuadP (Point (-1) 2) (Point 0 1), ArcP (ArcInfo (Point 1 1) (-pi / 6) False False) (Point 0 0)]
ts = [ "StartP (Point 0 0)", "LineP (Point 1 0)", "CubicP (Point 0.2 0) (Point 0.25 1) (Point 1 1)", "QuadP (Point (-1) 2) (Point 0 1)", "ArcP (ArcInfo (Point 1 1) (-pi / 6) False False) (Point 0 0)"]
path' = PathChart (defaultPathStyle & #color .~ palette1a 0 0.05 & #borderColor .~ palette1a 1 0.3) ps
c0 = GlyphChart defaultGlyphStyle ((SquareGlyph,) . pointPath <$> ps)
midp = Point 0 0 : zipWith (\(Point x y) (Point x' y') -> Point ((x + x') / 2) ((y + y') / 2)) (drop 1 (pointPath <$> ps)) (pointPath <$> ps)
offp = [Point (-0.35) 0.05, Point 0 0.05, Point (-0.2) 0, Point (-0.1) 0.1, Point 0 (-0.1)]
t0 = TextChart (defaultTextStyle & set #size 0.025) (zip ts (zipWith addp offp midp))
display $ mempty & #charts .~ named "path" [path', c0] <> named "pathtext" [t0] & #hudOptions .~ defaultHudOptions & #markupOptions % #chartAspect .~ ChartAspect & #markupOptions % #cssOptions % #preferColorScheme .~ PreferHud & #markupOptions % #cssOptions % #cssExtra .~ fillSwitch (dark, light) "dark" "pathtext"
co = lineExample & set (#hudOptions % #legends % each % _2 % #size) 0.2 & set (#hudOptions % #legends % each % _2 % #frame) (Just defaultRectStyle) & set (#hudOptions % #legends % each % _2 % #vgap) 0 & set (#hudOptions % #legends % each % _2 % #outerPad) 0 & set (#hudOptions % #legends % each % _2 % #innerPad) 0 & set (#hudOptions % #legends % each % _2 % #textStyle % #frame) (Just defaultRectStyle) & set (#hudOptions % #legends % each % _2 % #overallScale) 0.5 & set (#hudOptions % #legends % each % _2 % #scaleP) ScalePX
writeChartOptions "other/line.svg" co
display co
- [X] add scaleP for legendoptions
lineExample legend with zero gaps and padding highlights that:
- charts scale independently in the X and Y dimensions
- chart styles scale proportionately.
Thus legends have to choose to compromise by adopting X, Y, Area or MinDim
lo0 = defaultLegendOptions & set (#textStyle % #frame) (Just defaultRectStyle) & set #vgap 0 & set #hgap 0 & set #outerPad 0 & set #innerPad 0 & set #overallScale 0.2 & set #size 0.3 & set #legendCharts (take 3 $ fromMaybe undefined $ preview (#hudOptions % #legends % ix 0 % _2 % #legendCharts) lineExample) & set #buffer 0
-- manual construction
cs = legendChart lo0
view styleBox' cs
c0 = unnamed [RectChart defaultRectStyle [one]]
cs'' = cs & over (charts' % each) (scaleChart 0.3)
cs''' = placeLegend lo0 one cs'' & set (charts' % each % #style % #scaleP) ScalePX
view styleBox' $ set styleBox' (Just one) (c0 <> cs''')
-- automated construction via HudOptions
display $ (mempty :: ChartOptions) & set #charts c0 & set (#markupOptions % #chartAspect) ChartAspect & set #hudOptions (mempty & set #legends [(100,lo0 & set #scaleP ScalePArea)]) -- defaultHudOptions
- State “Done” from “Next” [2023-11-30 Thu 10:59]
Manual construction and placement for a legend, using ScalePX.
A slight space opens up between the horizontal elements.
lo0 = defaultLegendOptions & set (#textStyle % #frame) (Just defaultRectStyle) & set (#textStyle % #size) 0.16 & set #vgap 0 & set #hgap 0 & set #outerPad 0 & set #innerPad 0 & set #overallScale 0.2 & set #size 0.2 & set #legendCharts (take 3 $ fromMaybe undefined $ preview (#hudOptions % #legends % ix 0 % _2 % #legendCharts) lineExample) & set #buffer 0 & set #scaleP ScalePX
-- manual construction
cs = legendChart lo0 & set (charts' % each % #style % #scaleP) (view #scaleP lo0)
view styleBox' cs
c0 = unnamed [RectChart defaultRectStyle [one]]
cs'' = cs & over (charts' % each) (scaleChart 0.3)
cs''' = placeLegend lo0 one cs''
view styleBox' $ set styleBox' (Just one) (c0 <> cs''')
display $ (mempty :: ChartOptions) & set #charts (c0 <> cs''') & set (#markupOptions % #chartAspect) (FixedAspect 1) & set #hudOptions defaultHudOptions
:t legendEntry lo0 "palette #0"
:t fmap (legendizeChart lo0) <$> (toListOf (#charts % charts') lineExample)
:t view #legendCharts lo0
:t legendText lo0
l = defaultLegendOptions & set (#textStyle % #frame) (Just defaultRectStyle) & set (#textStyle % #size) 0.12 & set #vgap 0 & set #hgap 0 & set #outerPad 0 & set #innerPad 0 & set #overallScale 0.2 & set #size 0.2 & set #legendCharts (take 3 $ fromMaybe undefined $ preview (#hudOptions % #legends % ix 0 % _2 % #legendCharts) lineExample) & set #buffer 0
es = reverse $ uncurry (legendEntry l) <$> view #legendCharts l
twidth = maybe zero (\(Rect x z _ _) -> z - x) (styleBoxes (fst <$> es))
gapwidth t = maybe 0 (\(Rect x z _ _) -> z - x) (sbox t)
twidth
x1 = vert 0 $ hori 0 <$> (\(t,a) -> [unnamed [t], unnamed a]) <$> es
x2 = x1 & set (charts' % each % #style % #scaleP) ScalePArea
display $ (mempty :: ChartOptions) & set #charts x2 & set (#markupOptions % #chartAspect) ChartAspect & set #hudOptions defaultHudOptions
display surfaceExample
scale and move basic charts
c' = [RectChart (defaultRectStyle & set #scaleP NoScaleP) [one]]
cs = (mconcat [named "left" c', named "right" c' & over (charts' % each) (scaleChart 0.5 >>> moveChart (Point 0.8 0.25))])
display $ (mempty :: ChartOptions) & set #charts cs & set #hudOptions defaultHudOptions
scale and move legend
slc = surfaceLegendChart (Range (-0.5) 0.5) (defaultSurfaceLegendOptions dark "surface" & set (#sloLegendOptions % #vgap) 0.1 & set (#sloLegendOptions % #size) 0.6 & set (#sloLegendOptions % #hgap) 0 & set (#sloLegendOptions % #textStyle % #frame) (Just defaultRectStyle) & set (#sloAxisOptions % #ticks % #gtick) (Just (defaultGlyphTick, HLineGlyph, (-0.014))) & set (#sloAxisOptions % #ticks % #ttick) (Just (defaultTextTick, -0.005))) & set (charts' % each % #style % #scaleP) ScaleMinDim
display $ (mempty :: ChartOptions) & set #charts (mconcat [named "proxy" c', slc & set (charts' % each % #style % #scaleP) ScalePArea & over (charts' % each) (scaleChart 1 >>> moveChart (Point 0.6 (-0.3)))]) & set #hudOptions defaultHudOptions
grain = Point 100 100
r = one
f = fst . bimap ((-1.0) *) (fmap ((-1.0) *)) . rosenbrock 1 10
evenColors = trimColour . over lightness' (const 0.55) . palette1 <$> [0 .. 5]
so = defaultSurfaceOptions & #soGrain .~ grain & #soRange .~ r & #soStyle % #surfaceColors .~ evenColors
(cs, rangef) = surfacef f so
slo = defaultSurfaceLegendOptions dark "surface" & set #sloWidth 0.1 & set (#sloStyle % #surfaceColors) evenColors & set (#sloLegendOptions % #vgap) 0.1 & set (#sloLegendOptions % #size) 0.6 & set (#sloLegendOptions % #hgap) 0 & set (#sloLegendOptions % #textStyle % #frame) (Just defaultRectStyle) & set (#sloAxisOptions % #ticks % #gtick) (Just (defaultGlyphTick, HLineGlyph, (-0.014))) & set (#sloAxisOptions % #ticks % #ttick) (Just (defaultTextTick, -0.005))
slc = surfaceLegendChart rangef slo & set (charts' % each % #style % #scaleP) ScaleMinDim
-- display $ (mempty :: ChartOptions) & set #charts (mconcat [named "surface" cs, slc & set (charts' % each % #style % #scaleP) ScalePArea & over (charts' % each) (scaleChart 1 >>> moveChart (Point 0.6 (-0.3)))]) & set #hudOptions defaultHudOptions
display $ (mempty :: ChartOptions) & set #charts (mconcat [slc]) & set #hudOptions defaultHudOptions & #markupOptions .~ (defaultMarkupOptions & #cssOptions % #shapeRendering .~ UseCssCrisp)
addSurfaceLegend version
grain = Point 100 100
r = one
f = fst . bimap ((-1.0) *) (fmap ((-1.0) *)) . rosenbrock 1 10
evenColors = trimColour . over lightness' (const 0.55) . palette1 <$> [0 .. 5]
so = defaultSurfaceOptions & #soGrain .~ grain & #soRange .~ r & #soStyle % #surfaceColors .~ evenColors
(cs, rangef) = surfacef f so
slo = defaultSurfaceLegendOptions dark "surface" & set #sloWidth 0.1 & set (#sloStyle % #surfaceColors) evenColors & set (#sloLegendOptions % #vgap) 0.1 & set (#sloLegendOptions % #size) 0.6 & set (#sloLegendOptions % #hgap) 0 & set (#sloLegendOptions % #textStyle % #frame) (Just defaultRectStyle) & set (#sloAxisOptions % #ticks % #gtick) (Just (defaultGlyphTick, HLineGlyph, (-0.014))) & set (#sloAxisOptions % #ticks % #ttick) (Just (defaultTextTick, -0.005))
slc = surfaceLegendChart rangef slo & set (charts' % each % #style % #scaleP) ScaleMinDim
-- display $ (mempty :: ChartOptions) & set #charts (mconcat [named "surface" cs, slc & set (charts' % each % #style % #scaleP) ScalePArea & over (charts' % each) (scaleChart 1 >>> moveChart (Point 0.6 (-0.3)))]) & set #hudOptions defaultHudOptions
display $ (mempty :: ChartOptions) & set #charts (mconcat [slc]) & set #hudOptions defaultHudOptions & #markupOptions .~ (defaultMarkupOptions & #cssOptions % #shapeRendering .~ UseCssCrisp)
- [ ] addHud
- [ ] projectChartTree
- [ ] mconcat with main chart
co version
display $ (mempty :: ChartOptions) & set #charts (gridReferenceChart rangef slo) & set #hudOptions (mempty & set #axes [(1, view #sloAxisOptions slo & set #place PlaceRight)]) & set #markupOptions (defaultMarkupOptions & set (#cssOptions % #shapeRendering) UseCssCrisp) & set (#markupOptions % #chartAspect) (FixedAspect 0.2)
charttree version
grain = Point 100 100
r = one
f = fst . bimap ((-1.0) *) (fmap ((-1.0) *)) . rosenbrock 1 10
evenColors = trimColour . over lightness' (const 0.55) . palette1 <$> [0 .. 5]
so = defaultSurfaceOptions & #soGrain .~ grain & #soRange .~ r & #soStyle % #surfaceColors .~ evenColors
(cs, rangef) = surfacef f so
slo = defaultSurfaceLegendOptions & set (#sloSurfaceStyle % #surfaceColors) evenColors
grc = gridReferenceChart rangef slo
hoLegend = (mempty :: HudOptions) & set #axes [(1, view #sloAxisOptions slo)]
grcLegend = addHud (FixedAspect (view #sloWidth slo)) hoLegend grc
ct = view #charts surfaceExample
ctbox = fromMaybe one (view styleBox' ct)
legbox = projectOnR ctbox one (view #sloRect slo)
ctBoth = mconcat [projectChartTree legbox grcLegend, ct]
display $ (mempty :: ChartOptions) & set #charts ctBoth & set #markupOptions (defaultMarkupOptions & set (#cssOptions % #shapeRendering) UseCssCrisp) & set (#markupOptions % #chartAspect) ChartAspect & set #hudOptions defaultHudOptions
addSurfaceLegend version
grain = Point 20 20
r = one
f = fst . bimap ((-1.0)
slo = defaultSurfaceLegendOptions & set (#sloSurfaceStyle % #surfaceColors) evenColors & set (#sloDataRange) rangef
cs' = addSurfaceLegend slo (unnamed cs)
display $ (mempty :: ChartOptions) & set #charts cs' & set #markupOptions (defaultMarkupOptions & set (#cssOptions % #shapeRendering) UseCssCrisp) & set (#markupOptions % #chartAspect) ChartAspect & set #hudOptions defaultHudOptions
display compoundExample
- [X] try a no extend
- [X] try a ScalePArea
- [X] simplest decompose
ts = TickRound (FormatN FSCommaPrec (Just 1) 4 True True) 5 TickExtend
tsf = set (#hudOptions % #axes % each % _2 % #ticks % #style) ts
sap = set (#charts % charts' % each % #style % #scaleP) ScalePArea
co = compoundMerge [lineExample & tsf & sap, unitExample & tsf & sap & #hudOptions % #axes %~ fmap (_2 % #place %~ flipPlace)]
display co
- [X] titles ok
- [X] noextend axes ok
- [X] extend axes
ts = TickRound (FormatN FSCommaPrec (Just 1) 4 True True) 4 NoTickExtend
tse = TickRound (FormatN FSCommaPrec (Just 1) 4 True True) 4 TickExtend
tsf = set (#axes % each % _2 % #ticks % #style)
sap = set (#charts % charts' % each % #style % #scaleP) ScalePArea
ho1 = (mempty :: HudOptions) & set #titles [(3,defaultTitle "chart1")] & set #axes [(2,defaultXAxisOptions), (2,defaultYAxisOptions)] & tsf ts & colourHudOptions (const (palette1 0))
c1 = (mempty :: ChartOptions) & set #hudOptions ho1 & set #charts (named "c1" [Chart defaultRectStyle (RectData [fmap (2*) one])])
ho2 = (mempty :: HudOptions) & set #titles [(3.1,defaultTitle "chart2")] & set #axes [(2,defaultXAxisOptions & set #place PlaceTop), (2,defaultYAxisOptions & set #place PlaceRight)] & tsf ts & colourHudOptions (const (palette1 3))
c2 = (mempty :: ChartOptions) & set #hudOptions ho2 & set #charts (named "c2" [Chart (blob (set opac' 0.3 $ palette1 3)) (RectData [fmap (*0.8) one]), BlankChart defaultStyle [one]])
co = compoundMerge [c1,c2]
display co
ho1 = (mempty :: HudOptions) & set #titles [(3,defaultTitle "chart1")] & set #axes [(2,defaultXAxisOptions), (2,defaultYAxisOptions)] & colourHudOptions (const (palette1 0))
c1 = (mempty :: ChartOptions) & set #hudOptions ho1 & set #charts (named "c1" [Chart defaultRectStyle (RectData [fmap (2*) one])])
ho2 = (mempty :: HudOptions) & set #titles [(3.1,defaultTitle "chart2")] & set #axes [(2,defaultXAxisOptions & set #place PlaceTop), (2,defaultYAxisOptions & set #place PlaceRight)] & colourHudOptions (const (palette1 3))
c2 = (mempty :: ChartOptions) & set #hudOptions ho2 & set #charts (named "c2" [Chart (blob (set opac' 0.3 $ palette1 3)) (RectData [fmap (*0.8) one]), BlankChart defaultStyle [one]])
co = compoundMerge [c1,c2]
display co
display $ mempty & set #charts (stack 4 0.1 (replicate 16 $ (view #charts $ (set (#charts % charts' % each % #style % #scaleP) ScalePArea) $ forgetHud lineExample)))
- [X] numbers are badly placed on both X and Y axis
- [X] Not due to negative
- [X] numbers a bit small
- [X] vgap on legend
- [X] legend skewif
- [X] bar Hori text is still Vert
- [X] Stacked not showing second series
- [X] bar Hori axis is wrong, extending beyond the original
zeroised
e1 = barDataExample & over #barData (fmap (fmap (max 1))) & over #barData (fmap (take 4))
display $ barChart (defaultBarOptions & set (#barTextStyles % each % #anchor) AnchorMiddle & set (#barTextStyles % each % #size) 0.2 & set #textGap 0 & set #textGapNegative 0) e1 & set (#markupOptions % #chartAspect) (FixedAspect 1) & set (#charts % charts' % each % #style % #scaleP) ScalePArea
too dependent on original barRect scale
Hori
n = 1
barDataExample' = barDataExample & over #barData (fmap (fmap (*n)))
bo = (defaultBarOptions & set (#barOrientation) Hori & set (#barTextStyles % each % #anchor) AnchorMiddle & set (#barTextStyles % each % #size) 0.03 & set #textGap 0.03 & set #textGapNegative 0.05) & set #textShiftVert (-0.008)
display $ barChart bo barDataExample'
Vert
n = 1
barDataExample' = barDataExample & over #barData (fmap (fmap (*n)))
bo = (defaultBarOptions & set (#barOrientation) Vert & set (#barTextStyles % each % #size) 0.03 & set #textGap 0.03 & set #textGapNegative 0.05) & set #textShiftVert (-0.008)
display $ barChart bo barDataExample' & set (#markupOptions % #chartAspect) (FixedAspect 1.5) & set (#charts % charts' % each % #style % #scaleP) ScalePArea & set (#hudOptions % #frames) [(101, defaultFrameOptions & set #buffer 0.02)] & set (#hudOptions % #legends) []
barRects bo (view #barData barDataExample')
barTexts bo (view #barData barDataExample')
- [X] title
- [X] yaxis ticks
- [X] quad
- [X] cubic
- [X] bad y axis ticks
- [X] funny axis bar
co = textExample
display co
co & view #chartTree & view box'
forgetHud co & toListOf (#chartTree % charts' % each % #style % #scaleP)
co = unitExample & set (#hudOptions % #axes % each % _2 % #ticks % #style % numTicks') (Just 8) & over (#charts % charts' % each % #chartData) (scaleChartData 1)
display co
- [X] y axis ticks being cut off
display $ dateExample & set (#hudOptions % #frames) [(100,defaultFrameOptions & set #buffer 0.05)]
Scaling of style elements is proportional to the ratio of areas of the before and after rectangle. This means that individual elements do not scale to the exact proportions of the overall projections.
The effect is typically small but in pathological instances can cause irritation.
An extreme example, where:
- tick and text marks fail to scale properly, if NoScaleP (the default) is used.
- tick marks (almost) scale on ScalePArea, but text tick fails, because of an auto change in format
scale = NoScaleP
asp = FixedAspect 2
cszero = (unnamed [blankChart1 one]) & over (charts' % each % #chartData) (scaleChartData 1)
r1 = fmap (*1) (Rect 0 1 0 1)
bar' = (AxisBar (border 0.001 (grey 0.3 1)) 0.05 0 0)
rs1 = border 0.001 (grey 0.3 1)
tt = (defaultTextTick & set #scaleP scale,0)
gt = defaultGlyphTick & set #scaleP scale & set #borderSize 0.001 & set #color (grey 0.3 1) & set #size 0.1
axes0 = [(5,defaultYAxisOptions & set #place PlaceLeft), (5,defaultXAxisOptions & set #place PlaceBottom)] & set (each % _2 % #ticks % #ltick) Nothing & set (each % _2 % #bar) (Just bar') & set (each % _2 % #ticks % #ttick) (Just tt) & set (each % _2 % #ticks % #ttick %? _2) 0 & set (each % _2 % #ticks % #gtick %? _1) gt & set (each % _2 % #ticks % #gtick %? _3) 0.0 & set (each % _2 % #ticks % #ttick %? _1 % #frame) (Just (border 0.005 black))
cozero = (mempty :: ChartOptions) & set #charts cs & set (#hudOptions % #axes) axes0 & set (#hudOptions % #frames) [(1,defaultFrameOptions & set #frame (Just rs1))] & set (#markupOptions % #chartAspect) asp
display cozero
- [X] get CanvasAspect working
- [X] find a non-exact single projection
- [X] styleRebox using jam
styleRebox is projectWith (r - (styleBox - box)) box
projectChartTree is projectWith r styleBox
styleBox_ :: ChartTree -> Maybe (Rect Double)
styleBox_ = styleBoxes . foldOf charts'
styleRebox_ :: ChartTree -> Maybe (Rect Double) -> ChartTree
styleRebox_ cs r =
cs
& over chart' (fromMaybe id $ projectWith <$> r' <*> box_ cs)
where
r' = (NH.-) <$> r <*> ((NH.-) <$> styleBox_ cs <*> box_ cs)
-- | Lens between a style bounding box and a ChartTree tree.
--
-- Note that a round trip may be only approximately isomorphic ie
--
-- > forall c r. \c -> view styleBox' . set styleBox' r c ~= r
styleBox' :: Lens' ChartTree (Maybe (Rect Double))
styleBox' =
lens styleBox_ styleRebox_
-- | Project a chart tree to a new bounding box, guarding against singleton bounds.
projectChartTree :: Rect Double -> ChartTree -> ChartTree
projectChartTree new ct = case view styleBox' ct of
Nothing -> ct
Just b -> ct & over charts' (fmap (projectWith new b))
-- | projects a Chart to a new space from an old rectangular space, preserving linear metric structure.
--
-- FIXME: test singleton protections
--
-- >>> projectWith (fmap (2*) one) one r
-- RectChart (RectStyle {borderSize = 1.0e-2, borderColor = Colour 0.02 0.29 0.48 1.00, color = Colour 0.02 0.73 0.80 0.10}) [Rect -1.0 1.0 -1.0 1.0]
projectWith :: Rect Double -> Rect Double -> Chart -> Chart
projectWith new old (Chart s a) =
Chart (scaleStyle (scaleRatio (view #scaleP s) new old) s) (projectChartDataWith new old a)
projectChartDataWith :: Rect Double -> Rect Double -> ChartData -> ChartData
projectChartDataWith new old (RectData a) = RectData (projectOnR new old <$> a)
projectChartDataWith new old (TextData a) = TextData (second (projectOnP new old) <$> a)
projectChartDataWith new old (LineData a) = LineData (fmap (projectOnP new old) <$> a)
projectChartDataWith new old (GlyphData a) = GlyphData (fmap (second (projectOnP new old)) a)
projectChartDataWith new old (PathData a) = PathData (projectPaths new old a)
projectChartDataWith new old (BlankData a) = BlankData (projectOnR new old <$> a)
co = jal
-- co = tandp
-- co = lineExample & set (#hudOptions % #legends % each % _2 % #place) PlaceRight & set (#markupOptions % #chartAspect) (CanvasAspect 1.5)
asp = co & view (#markupOptions % #chartAspect)
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
finalCT = projectChartTreeN 4 viewbox csAndHud
boxs' = sbox <$> (mconcat $ toListOf charts' finalCT)
ct' = projectChartTree viewbox csAndHud
ct'' = set styleBox' (Just viewbox) csAndHud
putStrLn ("initial: " <> show (initialCanvas asp Nothing))
putStrLn ("csAndHud: " <> maybe "" show (view styleBox' csAndHud))
putStrLn ("single: " <> maybe "" show (view styleBox' ct'))
putStrLn ("final: " <> maybe "" show (view styleBox' finalCT))
putStrLn ("rebox: " <> maybe "" show (view styleBox' (set styleBox' (Just viewbox) csAndHud)))
ct' == ct''
display (mempty & set #charts csAndHud & set (#markupOptions % #chartAspect) ChartAspect)
pPrint $ filter ((\(x,_,_) -> not x) . snd) $ second (sameMulti) <$> pathChartOptions
exampleText = ["jam"]
tsScale = defaultTextStyle & set #frame (Just defaultRectStyle) & set #anchor AnchorMiddle & set #scaleP ScaleMinDim
textScale = zipWith (\t x -> TextChart tsScale [(t, Point 0 x)]) exampleText [0..]
ct = unnamed textScale
jam = mempty & #charts .~ ct & set (#hudOptions % #frames) [(100,defaultFrameOptions & set #buffer 0 & set #frame (Just $ blob (grey 0.5 0.1)))] & set (#markupOptions % #chartAspect) (FixedAspect 2) :: ChartOptions
display jam
- State “Done” from [2023-11-24 Fri 18:03]
co = jam & set (#markupOptions % #chartAspect) UnscaledAspect & set #hudOptions mempty
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
- State “Done” from [2023-11-24 Fri 18:03]
co = jam & set (#markupOptions % #chartAspect) UnscaledAspect & set #hudOptions mempty & set (#hudOptions % #frames) [(100,defaultFrameOptions & set #buffer 0 & set #frame (Just $ blob (grey 0.5 0.1)))]
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
- State “Done” from [2023-11-26 Sun 07:50]
- State “Done” from [2023-11-24 Fri 18:03]
- [X] border cool as!
co = jam & set (#markupOptions % #chartAspect) ChartAspect & set #hudOptions mempty
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
- State “Done” from “Next” [2023-11-26 Sun 07:59]
- State “Done” from [2023-11-26 Sun 07:50]
- State “Done” from [2023-11-24 Fri 18:03]
co = jam & set (#markupOptions % #chartAspect) ChartAspect & set #hudOptions mempty & set (#hudOptions % #frames) [(100,defaultFrameOptions & set #buffer 0 & set #frame (Just $ blob (grey 0.5 0.1)))]
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
- State “Done” from “Next” [2023-11-26 Sun 12:04]
- State “Done” from “Next” [2023-11-26 Sun 07:59]
- State “Done” from [2023-11-26 Sun 07:50]
- State “Done” from [2023-11-24 Fri 18:03]
With no hud, the viewbox is keyed off of the styleBox of the chart, which is different to the FixedAspect 1 requested.
co = jam & set (#markupOptions % #chartAspect) (FixedAspect 1) & set #hudOptions mempty & set (#charts % charts' % each % #style % #scaleP) ScaleMinDim & set (#charts % charts' % each % #style % #anchor) AnchorMiddle
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
toListOf (each % #chartData) csPaddeds
toListOf (each % #chartData) pwData
exp1 = csPaddeds & over (each % #chartData) id & over (each % #style) (\s -> scaleStyle 6 (set #scaleP ScaleMinDim s))
- State “Done” from “Next” [2023-11-26 Sun 12:08]
- State “Done” from “Next” [2023-11-26 Sun 12:04]
- State “Done” from “Next” [2023-11-26 Sun 07:59]
- State “Done” from [2023-11-26 Sun 07:50]
- State “Done” from [2023-11-24 Fri 18:03]
co = jam & set (#markupOptions % #chartAspect) (FixedAspect 1) & set #hudOptions mempty & set (#charts % charts' % each % #style % #scaleP) ScaleMinDim & set (#charts % charts' % each % #style % #anchor) AnchorMiddle & set (#hudOptions % #frames) [(100,defaultFrameOptions & set #buffer 0 & set #frame (Just $ blob (grey 0.5 0.1)))]
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
- State “Done” from “Next” [2023-11-26 Sun 12:08]
- State “Done” from “Next” [2023-11-26 Sun 12:04]
- State “Done” from “Next” [2023-11-26 Sun 07:59]
- State “Done” from [2023-11-26 Sun 07:50]
- State “Done” from [2023-11-24 Fri 18:03]
co = jam & set (#markupOptions % #chartAspect) (CanvasAspect 1) & set #hudOptions mempty & set (#charts % charts' % each % #style % #scaleP) ScaleMinDim & set (#charts % charts' % each % #style % #anchor) AnchorMiddle & set (#hudOptions % #frames) [(100,defaultFrameOptions & set #buffer 0 & set #frame (Just $ blob (grey 0.5 0.1)))]
display co
asp = co & view (#markupOptions % #chartAspect)
icanvas = initialCanvas asp Nothing
cs = view #charts co
csAndHud = addHud (view (#markupOptions % #chartAspect) co) (view #hudOptions co) (view #charts co)
viewbox = finalCanvas asp (Just csAndHud)
csAndHudSingle = set styleBox' (Just viewbox) csAndHud
csm = set (styleBoxN' 10) (Just viewbox) csAndHud
csp = projectChartWith (view (#markupOptions % #repeatAspect) co) (view (#markupOptions % #chartAspect) co) (view #hudOptions co) cs
-- addHud
ho = view #hudOptions co
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
csPadded = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
ivb = initialCanvas asp (Just csPadded)
db' = fromMaybe db mdb
csAndHud' = runHudWith ivb db' hs csPadded
hc0 = cs & set styleBox' (Just ivb)
-- projectWith
new = ivb
old = fromMaybe one $ view styleBox' csPadded
csPaddeds = toListOf charts' csPadded & mconcat
pwData = csPaddeds & over (each % #chartData) (projectChartDataWith new old)
pwC = pwData & over (each % #style) (\s -> scaleStyle (scaleRatio (view #scaleP s) new old) s)
pwRatio = scaleRatio (view #scaleP (head $ view #style <$> pwC)) new old
pwStyle = view #style (head pwC)
pwC' = unnamed pwC
csp & view styleBox' & NH.traverse_ (show >>> ("co:" <>) >>> putStrLn)
icanvas & (show >>> ("initial canvas:" <>) >>> putStrLn)
cs & view styleBox' & NH.traverse_ (show >>> ("initial chart:" <>) >>> putStrLn)
csAndHud & view styleBox' & NH.traverse_ (show >>> ("csAndHud:" <>) >>> putStrLn)
viewbox & (show >>> ("final canvas:" <>) >>> putStrLn)
csAndHudSingle & view styleBox' & NH.traverse_ (show >>> ("single proj:" <>) >>> putStrLn)
csm & view styleBox' & NH.traverse_ (show >>> ("multi proj:" <>) >>> putStrLn)
csPadded & view styleBox' & NH.traverse_ (show >>> ("padding:" <>) >>> putStrLn)
ivb & (show >>> ("initial padded canvas:" <>) >>> putStrLn)
hc0 & view styleBox' & NH.traverse_ (show >>> ("hc0:" <>) >>> putStrLn)
csAndHud' & view styleBox' & NH.traverse_ (show >>> ("runHudWith:" <>) >>> putStrLn)
-- projectWith
ratio new & (show >>> ("ratio new:" <>) >>> putStrLn)
ratio old & (show >>> ("ratio old:" <>) >>> putStrLn)
pwRatio & (show >>> ("scale ratio:" <>) >>> putStrLn)
db' & (show >>> ("data box padded:" <>) >>> putStrLn)
svgViewbox (Rect x z y w) = (x, (-w), (z-x), (w-y))
svgvb = svgViewbox <$> (view styleBox' csm)
svgvb & NH.traverse_ (show >>> ("svg viewbox:" <>) >>> putStrLn)
- State “Done” from [2023-11-26 Sun 07:37]
- Anchors ok
- scaleps ok
s0 = defaultTextStyle & set #frame (Just $ defaultRectStyle) & set #anchor AnchorStart & set #scaleP NoScaleP
r0 = styleBoxText s0 "jam" (Point 0 0)
r1 = styleBoxText (scaleStyle 2 s0) "jam" (Point 0 0)
r0
r1
(\x y -> x - 2 * y) <$> r1 <*> r0
import Data.Text qualified as Text
t = "jam"
o = s0
p = Point 0 0
s = o ^. #size
h = o ^. #hsize
v = o ^. #vsize
n1 = o ^. #vshift
x' = s * h * fromIntegral (Text.length t)
y' = s * v
n1' = (-s) * n1
a' = case o ^. #anchor of; AnchorStart -> 0.5; AnchorEnd -> -0.5; AnchorMiddle -> 0.0
mpad = maybe id (\f -> padRect (0.5 * view #borderSize f * view #size o)) (view #frame o)
flat = Rect ((-x' / 2.0) + x' * a') (x' / 2 + x' * a') (-y' / 2 + n1') (y' / 2 + n1')
mpad $ move p $ maybe flat (`rotationBound` flat) (o ^. #rotation)
flat
import Data.Text qualified as Text
t = "jam"
o = scaleStyle 2 s0
p = Point 0 0
s = o ^. #size
h = o ^. #hsize
v = o ^. #vsize
n1 = o ^. #vshift
x' = s * h * fromIntegral (Text.length t)
y' = s * v
n1' = (-s) * n1
a' = case o ^. #anchor of; AnchorStart -> 0.5; AnchorEnd -> -0.5; AnchorMiddle -> 0.0
mpad = maybe id (\f -> padRect (0.5 * view #borderSize f * view #size o)) (view #frame o)
flat = Rect ((-x' / 2.0) + x' * a') (x' / 2 + x' * a') (-y' / 2 + n1') (y' / 2 + n1')
mpad $ move p $ maybe flat (`rotationBound` flat) (o ^. #rotation)
flat
- [X] initial padded canvas
view styleBox' csPadded & fmap (ratio * 0.5 >>> (== (let (Rect _ z _ _) = ivb in z)))
- [X] viewbox svg (x,y,width,height): -0.0003 -0.0483 0.1086 0.0666
- [X] height: 300
- [X] width: 489 = 0.1086 / 0.0666 * 300
- [X] font-size: 0.06 * 15.015015015015013 = .9009
- [X] border-size: 0.0090 (border-size 0.01 * font-size)
- [X] text rect: viewbox - 1/2 * border size
pPrint $ markupChartOptions co
exampleText <- fmap T.pack <$> replicateM 2 (unwords <$> replicateM 3 word)
exampleText
exampleText <- fmap T.pack <$> replicateM 2 (unwords <$> replicateM 3 word)
tsNoScale = defaultTextStyle & set #frame (Just $ defaultRectStyle) & set #anchor AnchorStart & set #scaleP NoScaleP
tsScale = defaultTextStyle & set #frame (Just $ defaultRectStyle) & set #anchor AnchorStart & set #scaleP ScalePArea
textNoScale = zipWith (\t x -> TextChart tsNoScale [(t, Point 0 x)]) exampleText [0..]
textScale = zipWith (\t x -> TextChart tsScale [(t, Point 0 (x+0.2))]) exampleText [0..]
points = Chart defaultGlyphStyle $ GlyphData ((CircleGlyph,) <$> (Point 0 0 :corners4 (Rect 0 1 (-0.5) 0.5)))
cs = textScale <> [points]
csNo = textNoScale <> [points]
ct = unnamed cs
tandp = mempty & #charts .~ ct & #markupOptions % #chartAspect .~ FixedAspect 1 :: ChartOptions
tandpNo = mempty & #charts .~ unnamed csNo & #markupOptions % #chartAspect .~ FixedAspect 1 :: ChartOptions
display tandpNo
system-ui,-apple-system,”Segoe UI”,Roboto,”Helvetica Neue”,Arial,”Noto Sans”,”Liberation Sans”,sans-serif,”Apple Color Emoji”,”Segoe UI Emoji”,”Segoe UI Symbol”,”Noto Color Emoji”;
SFMono-Regular,Menlo,Monaco,Consolas,”Liberation Mono”,”Courier New”,monospace;
co = (mempty :: ChartOptions) & set #charts (unnamed [TextChart defaultTextStyle [("jim", Point 0 0), ("jam",Point 1 1)]]) & set (#charts % charts' % each % #style % #frame) (Just defaultRectStyle) & set #hudOptions defaultHudOptions & set (#charts % charts' % each % #style % #size) 0.2 & set (#charts % charts' % each % #style % #vshift) 0
display co
canvasBox’ makeAxisBar tickGlyph tickText tickLine
hudStyleBox’ frameHud makeAxisBar title tickText legendHud
hudBox’ tickGlyph makeTick
- State “Done” from [2023-11-30 Thu 14:36]
display $ glyphsExample & set (#markupOptions % #chartAspect) (FixedAspect 6) & set (#markupOptions % #markupHeight) (Just 200)
:t glyphsExample & over (#charts % charts' % _last) (fmap id) -- ((\(PathGlyph p _, pt) -> (PathGlyph p NoScaleBorder,pt))))
- State “Done” from “Next” [2023-12-02 Sat 16:31]
- [X] axis bar
- [X] lens with AnchoredTo option
- [X] distortion in tickGlyphs due to NoScaleP
- [X] glyph ticks are a consistent hair away from the axis bar
- [X] textExample and others are a long way away
- [X] decide on axis bar and glyph tick buffers and section anchors 0.01 0.015
display $ unitExample & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #buffer) 0.01 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #anchorTo) CanvasSection
UnscaledAspect is perfect, and then ChartAspect stuffs everything up:
sec = CanvasStyleSection
asp = UnscaledAspect
co = unitExample & set (#hudOptions % #axes % each % #item % #bar %? #buffer) 0.0 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #buffer) 0.0 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #anchorTo) sec & set (#markupOptions % #chartAspect) asp & set (#hudOptions % #axes % each % #item % #ticks % #style % tickExtend' % _Just) TickExtend & set (#hudOptions % #axes % each % #item % #bar %? #anchorTo) sec & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #item % #size) 0.10 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #item % #shape) SquareGlyph & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #item % #scaleP) NoScaleP & set (#hudOptions % #axes % each % #item % #ticks % #lineTick) Nothing & set (#hudOptions % #axes % each % #item % #ticks % #textTick) Nothing & set (#hudOptions % #frames) []
display co
co & view (#hudOptions % #frames)
:set -Wno-incomplete-uni-patterns
-- pPrint $ (forgetHud co) & view (#chartTree % #tree) & fmap (second (toListOf (each % #chartData)))
co' = forgetHud co
display co'
xs = filter (/=[]) $ (forgetHud co) & toListOf (#chartTree % charts') & fmap (fmap (view #chartData))
(Just b') = view styleBox' (view #chartTree co')
(Just bca') = view styleBox' (view #chartTree (forgetHud $ co & set (#markupOptions % #chartAspect) ChartAspect))
b'
bca'
ratio b'
ratio bca'
csUnscaled = addHud UnscaledAspect (view #hudOptions co) (view #chartTree co)
csChartScaled = addHud ChartAspect (view #hudOptions co) (view #chartTree co)
view styleBox' csUnscaled
view styleBox' csChartScaled
(initialCanvas UnscaledAspect (Just (view #chartTree co)))
(initialCanvas ChartAspect (Just (view #chartTree co)))
unscaled runHudWith breakup
cs = view #chartTree co
ho = view #hudOptions co
asp = UnscaledAspect
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
cs' = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
asp0 = initialCanvas asp (Just cs')
csAndHud = runHudWith asp0 hs cs'
view styleBox' cs'
asp0
view styleBox' csAndHud
unscaledCSsAndHud = csAndHud
ChartAspect runHudWith breakup
cs = view #chartTree co
ho = view #hudOptions co
asp = ChartAspect
db = maybe one padSingletons (view box' cs)
(mdb, hs) = toHuds ho db
cs' = cs <> maybe mempty (\r -> bool (named "datapadding" [BlankChart defaultStyle [r]]) mempty (r == db)) mdb
asp0 = initialCanvas asp (Just cs')
csAndHud = runHudWith asp0 hs cs'
view styleBox' cs'
asp0
view styleBox' csAndHud
vb = finalCanvas asp (Just csAndHud)
vb
view styleBox' (projectChartWith asp ho cs)
display $ (mempty :: ChartOptions) & set #chartTree csAndHud & set (#markupOptions % #chartAspect) UnscaledAspect
The problem is in the final set styleBox’, which is operating on NoScaleP styled charts:
ctFinal = set styleBox' (Just vb) $ csAndHud & set (charts' % each % #style % #scaleP) ScalePY
display $ (mempty :: ChartOptions) & set #chartTree ctFinal & set (#markupOptions % #chartAspect) (FixedAspect 1.5)
csAndHud & toListOf (charts' % each % #style % #scaleP)
Scale the xaxis by ScalePX etc:
sec = CanvasSection
asp = FixedAspect 1.5
co = unitExample & set (#hudOptions % #axes % each % #item % #bar %? #buffer) 0.0 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #buffer) 0.0 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #anchorTo) sec & set (#markupOptions % #chartAspect) asp & set (#hudOptions % #axes % each % #item % #ticks % #style % tickExtend' % _Just) TickExtend & set (#hudOptions % #axes % each % #item % #bar %? #anchorTo) sec & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #item % #size) 0.10 & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #item % #shape) SquareGlyph & set (#hudOptions % #axes % each % #item % #ticks % #glyphTick %? #style % #item % #scaleP) NoScaleP & set (#hudOptions % #axes % each % #item % #ticks % #lineTick) Nothing & set (#hudOptions % #axes % each % #item % #ticks % #textTick) Nothing & set (#hudOptions % #frames) [] & set (#hudOptions % #axes % ix 0 % #item % #ticks % #glyphTick %? #style % #item % #scaleP) ScalePX & set (#hudOptions % #axes % ix 1 % #item % #ticks % #glyphTick %? #style % #item % #scaleP) ScalePY
display co
display $ unitExample & set (#markupOptions % #chartAspect) UnscaledAspect
- State “Done” from “Next” [2023-12-02 Sat 19:07]
display $ mempty & set #chartTree (view #chartTree unitExample)
pPrint $ mempty & set #chartTree (view #chartTree unitExample) & markupChartOptions
- State “Done” from “Next” [2023-12-03 Sun 08:02]
- [X] rerun whole org file and observe results
- [X] styleBox’ versus projectChartTree
- [X] text box bug
- [X] scaling text example
- [X] examples audit
- [X] NoScaleP needs to be the default for HudOption elements
- [X] audit ScaleP usage
- [X] toggle to switch to ScalePArea when the hud is forgotten
- [X] surface legend
- [X] check & fix examples
- [X] fix compound code and compoundExample
- [X] v06candidate1
- [X] Revisit anal all in one
- [X] diff test back
- [X] code ToDos
- [X] remove canvasStyleBox’
- [X] remove multiple reboxing
- [X] palette1 ==> palette
- [X] #charts -> #chartTree
- [X] move GlyphShape back to Style
- [X] fix Rect show instance
- [X] priority refactor
- [X] buffered
- [X] better names for tick elements
- [X] remove placeText
- [X] tick lenses
- [X] remove Buffered, TextTickStyle, LineTickStyle
- [X] FrameOption anchorTo
- [X] review ScaleP
- [X] look at mempty examples for redundant markup snippets
- [X] mempty & set #hudOptions defaultHudOptions & set #chartTree mempty produces a hud still?
- [X] replace .~ ~% ^.
data ChartOptions = ChartOptions
{ markupOptions :: MarkupOptions,
hudOptions :: HudOptions,
chartTree :: ChartTree
}
data MarkupOptions = MarkupOptions
{ markupHeight :: Maybe Double,
chartAspect :: ChartAspect,
cssOptions :: CssOptions,
renderStyle :: RenderStyle
}
data ChartAspect
= FixedAspect Double
| CanvasAspect Double
| ChartAspect
| UnscaledAspect
data CssOptions = CssOptions
{ shapeRendering :: CssShapeRendering,
preferColorScheme :: CssPreferColorScheme,
fontFamilies :: ByteString,
cssExtra :: ByteString}
data RenderStyle = Compact | Indented Int
data CssShapeRendering = UseGeometricPrecision | UseCssCrisp | NoShapeRendering
data CssPreferColorScheme
= -- | includes css that switches approriate hud elements between light and dark.
PreferHud
| PreferDark
| PreferLight
| PreferNormal
data HudOptions = HudOptions
{ axes :: [Priority AxisOptions],
frames :: [Priority FrameOptions],
legends :: [Priority LegendOptions],
titles :: [Priority Title]
}
data Priority a = Priority {priority :: Double, item :: a}
data AxisOptions = AxisOptions
{ bar :: Maybe AxisBar,
adjust :: Maybe Adjustments,
ticks :: Ticks,
place :: Place
}
data AxisBar = AxisBar
{ style :: Style,
size :: Double,
buffer :: Double,
overhang :: Double,
anchorTo :: HudChartSection
}
data HudChartSection = CanvasSection | CanvasStyleSection | HudSection | HudStyleSection deriving (Eq, Show, Generic)
data Adjustments = Adjustments
{ maxXRatio :: Double,
maxYRatio :: Double,
angledRatio :: Double,
allowDiagonal :: Bool
}
data Ticks = Ticks
{ tick :: Tick,
glyphTick :: Maybe TickStyle,
textTick :: Maybe TickStyle,
lineTick :: Maybe TickStyle
}
data Tick
= TickNone
| TickLabels [Text]
| TickRound FormatN Int TickExtend
| TickExact FormatN Int
| TickPlaced [(Double, Text)]
data FormatN = FormatN {fstyle :: FStyle, sigFigs :: Maybe Int, maxDistinguishIterations :: Int, addLPad :: Bool, cutRightZeros :: Bool} deriving (Eq, Show, Generic)
data FStyle
= FSDecimal
| FSExponent (Maybe Int)
| FSComma
| FSFixed Int
| FSPercent
| FSDollar
| FSPrec
| FSCommaPrec
| FSNone
data TickExtend = TickExtend | NoTickExtend deriving (Eq, Show, Generic)
data TickStyle = TickStyle
{ style :: Style,
anchorTo :: HudChartSection,
buffer :: Double
}
data Place
= PlaceLeft
| PlaceRight
| PlaceTop
| PlaceBottom
| PlaceAbsolute (Point Double)
data FrameOptions = FrameOptions
{ frame :: Maybe Style,
anchorTo :: HudChartSection,
buffer :: Double
}
data LegendOptions = LegendOptions
{ size :: Double,
buffer :: Double,
vgap :: Double,
hgap :: Double,
textStyle :: Style,
innerPad :: Double,
outerPad :: Double,
frame :: Maybe Style,
place :: Place,
overallScale :: Double,
scaleP :: ScaleP,
legendCharts :: [(Text, [Chart])]
}
data Title = Title
{ text :: Text,
style :: Style,
place :: Place,
anchor :: Anchor,
buffer :: Double
}
data Anchor = AnchorMiddle | AnchorStart | AnchorEnd
newtype ChartTree = ChartTree {tree :: Tree (Maybe Text, [Chart])} deriving (Eq, Show, Generic)
data Chart = Chart {style :: Style, chartData :: ChartData} deriving (Eq, Show, Generic)
data ChartData
= RectData [Rect Double]
| LineData [[Point Double]]
| GlyphData [Point Double]
| TextData [(Text, Point Double)]
| PathData [PathData Double]
| BlankData [Rect Double]
newtype Rect a = Rect' (Compose Point Range a)
-- | pattern of Rect lowerx upperx lowery uppery
pattern Rect :: a -> a -> a -> a -> Rect a
pattern Rect a b c d = Rect' (Compose (Point (Range a b) (Range c d)))
data Point a = Point
{ _x :: a,
_y :: a
}
data Range a = Range a a
data PathData a
= StartP (Point a)
| LineP (Point a)
| CubicP (Point a) (Point a) (Point a)
| QuadP (Point a) (Point a)
| ArcP (ArcInfo a) (Point a)
data ArcInfo a = ArcInfo
{ radii :: Point a,
phi :: a,
large :: Bool,
clockwise :: Bool
}
data Style = Style
{ size :: Double,
borderSize :: Double,
color :: Colour,
borderColor :: Colour,
scaleP :: ScaleP,
anchor :: Anchor,
rotation :: Maybe Double,
translate :: Maybe (Point Double),
escapeText :: EscapeText,
frame :: Maybe Style,
linecap :: Maybe LineCap,
linejoin :: Maybe LineJoin,
dasharray :: Maybe [Double],
dashoffset :: Maybe Double,
hsize :: Double,
vsize :: Double,
vshift :: Double,
shape :: GlyphShape
}
newtype Colour = Colour'
{ color' :: Color (Alpha RGB) Double
}
pattern Colour :: Double -> Double -> Double -> Double -> Colour
pattern Colour r g b a = Colour' (ColorRGBA r g b a)
data ScaleP
= NoScaleP
| ScalePX
| ScalePY
| ScalePMinDim
| ScalePArea
data Anchor = AnchorMiddle | AnchorStart | AnchorEnd
data EscapeText = EscapeText | NoEscapeText
data LineCap = LineCapButt | LineCapRound | LineCapSquare deriving (Eq, Show, Generic)
data LineJoin = LineJoinMiter | LineJoinBevel | LineJoinRound deriving (Eq, Show, Generic)
data GlyphShape
= CircleGlyph
| SquareGlyph
| EllipseGlyph Double
| RectSharpGlyph Double
| RectRoundedGlyph Double Double Double
| -- | line width is determined by borderSize
TriangleGlyph (Point Double) (Point Double) (Point Double)
| VLineGlyph
| HLineGlyph
| PathGlyph ByteString