local common  = fonts.goodies.load("common-math.lfg")
local presets = common.mathematics.tweaks.presets

local integral_variants = { bottomright = -0.20 }
local integral_bottom   = { bottomright = -0.25 }

return {
    name = "dejavu-math",
    version = "1.00",
    comment = "Goodies that complement dejavu.",
    author = "Hans Hagen & Mikael Sundqvist",
    copyright = "ConTeXt development team",
    mathematics = {
        parameters = {
            FractionRuleThickness             =   60,
            AccentTopShiftUp                  =  -25,
            FlattenedAccentTopShiftUp         =  -25,
            AccentBaseDepth                   =   30,
            DelimiterPercent                  =   85,
            DelimiterShortfall                =  400,
            DelimiterDisplayPercent           =   90,
            DelimiterDisplayShortfall         =  400,
            DisplayOperatorMinHeight          = 1800, -- 1333 in font
            SubscriptShiftDown                = 177, -- 277 in font
            SuperscriptShiftUp                = 428, -- 381 in font
            SubscriptShiftDownWithSuperscript = "1.3*SubscriptShiftDown", -- trial and error
            PrimeShiftUp                      = "1.4*SuperscriptShiftUp",
            PrimeShiftUpCramped               = "1.4*SuperscriptShiftUp",
            PrimeBaselineDropMax              = "0.5*SuperscriptBaselineDropMax",
        },
        tweaks = {
            aftercopying = {
                {
                    tweak    = "fontname",
                    expected = "TeXGyreDejaVuMath-Regular",
                    abort    = true,
                },
                {
                    tweak    = "version",
                    expected = "Version 1.106",
                },
                presets.braille { },
                {
                    tweak   = "fixprimes",
                    factor  = 0.63,
                },
                {
                    tweak = "addmirrors",
                },
                {
                    tweak = "addcomposites",
                },
                presets.scripttocalligraphic { },
                presets.rsfstoscript         { rscale = 1.02 },
                presets.rsfsuprighttoscript  { rscale = 1.02 },
                presets.moderntocalligraphic { rscale = 1.02 },
                presets.eulertocalligraphic  { rscale = 1.02 },
                presets.xitsarabic           { rscale = 1.05 },
                presets.fallbacks            { },
                presets.moveitalics          { correct = true },
                presets.moveitalics          { correct = true, letters = true },
                presets.moveintegrals        { factor = 1.5 }, -- we need to check this
                presets.wipeitalics          { },
                -- We don't have italic correction in for instance math italic f which means that
                -- we also didn't fix it. Therefore we need at least some reasonable kerns. Using
                -- a dimension tweak before the above (e.g. 0.2 italic and 0.8 width) doesn't work
                -- because once the advance is set the move is blocked and the ic stil wiped. So,
                -- we kern. Actually the upright (ascii) f has italic correction.
                {
                    tweak = "checkaccents",
                },
                {
                    tweak = "wipecues",
                },
                --
                {
                    tweak = "kerns",
                    list  = {
                        [0x002F]                = { topleft  = -0.2,  bottomright = -0.2  },
                        ["0x7D.parts.top"]      = { topright = -0.15,                     }, -- right brace top
                        ["0x7D.parts.bottom"]   = {                   bottomright = -0.15 }, -- right brace bottom
                        ["0x7D.variants.*"]     = { topright = -0.05, bottomright = -0.05 }, -- right brace variants
                        ["0x29.parts.top"]      = { topright = -0.15,                     }, -- right parenthesis top
                        ["0x29.parts.bottom"]   = {                   bottomright = -0.15 }, -- right parenthesis bottom
                        ["0x29.variants.*"]     = { topright = -0.1,  bottomright = -0.1  }, -- right parenthesis variants
                        ["0x221A.parts.top"]    = { topright =  0.2,                      }, -- right radical top
                        ["0x221A.parts.bottom"] = {                   bottomright =  0.2  }, -- right radical bottom
                        ["0x221A.variants.*"]   = { topright =  0.2,  bottomright =  0.2  }, -- right radical variants
                        [0x27E9]                = { topright = -0.1,  bottomright = -0.1  }, -- angle
                        ["0x27E9.variants.*"]   = { topright = -0.2,  bottomright = -0.2  },
                        [0x27EB]                = { topright = -0.1,  bottomright = -0.1  },
                        ["0x27EB.variants.*"]   = { topright = -0.2,  bottomright = -0.2  },
                        --
                        -- The font lacks italic correction and corner kerns
                        -- It is probably meant to be "spacy", but we add bottomright
                        -- to a few of the most used latin and greek letters
                        --
                        [0x1D435] = { bottomright = -.05 },   -- italic B
                        [0x1D436] = { bottomright = -.1 },    -- italic C
                        [0x1D437] = { bottomright = -.05 },   -- italic D
                        [0x1D438] = { bottomright = -.1 },    -- italic E
                        [0x1D439] = { bottomright = -.1 },    -- italic F
                        [0x1D43A] = { bottomright = -.05 },   -- italic G
                        [0x1D43B] = { bottomright = -.1 },    -- italic H
                        [0x1D43C] = { bottomright = -.15 },   -- italic I
                        [0x1D43D] = { bottomright = -.15 },   -- italic J
                        [0x1D43E] = { bottomright = -.1 },    -- italic K
                        [0x1D440] = { bottomright = -.1 },    -- italic M
                        [0x1D441] = { bottomright = -.1 },    -- italic N
                        [0x1D443] = { bottomright = -.1 },    -- italic P
                        [0x1D446] = { bottomright = -.05 },   -- italic S
                        [0x1D447] = { bottomright = -.3 },    -- italic T
                        [0x1D448] = { bottomright = -.2 },    -- italic U
                        [0x1D449] = { bottomright = -.25 },   -- italic V
                        [0x1D44A] = { bottomright = -.2 },    -- italic W
                        [0x1D44B] = { bottomright = -.1 },    -- italic X
                        [0x1D44C] = { bottomright = -.25 },   -- italic Y
                        [0x1D44D] = { bottomright = -.1 },    -- italic Z
                        [0x1D451] = { bottomright = -.1 },    -- italic d
                        [0x1D453] = { bottomright = -.2 },    -- italic f
                        [0x1D45F] = { bottomright = -.1 },    -- italic r
                        [0x1D461] = { bottomright = -.1 },    -- italic t
                        [0x1D463] = { bottomright = -.1 },    -- italic v
                        [0x1D464] = { bottomright = -.05 },   -- italic w
                        [0x1D465] = { bottomright = -.05 },   -- italic x
                        [0x1D466] = { bottomright = -.05 },   -- italic y
                        [0x1D467] = { bottomright = -.05 },   -- italic z
                        [0x00393] = { bottomright = -0.3, },  -- upright Gamma
                        [0x003A5] = { bottomright = -0.2, },  -- upright Upsilon
                        [0x003A8] = { bottomright = -0.1, },  -- upright Psi
                        [0x02207] = { bottomright = -0.2, },  -- upright Nabla
                        [0x1D6FB] = { bottomright = -0.2, },  -- italic Nabla
                        [0x1D701] = { bottomright = -.15 },   -- italic zeta
                        [0x1D703] = { bottomright = -.05 },   -- italic theta
                        [0x1D705] = { bottomright = -.05 },   -- italic kappa
                        [0x1D709] = { bottomright = -.15 },   -- italic xi
                        [0x1D70B] = { bottomright = -.1 },    -- italic pi
                        [0x1D70E] = { bottomright = -.15 },   -- italic sigma
                        [0x1D70F] = { bottomright = -.15 },   -- italic tau
                        [0x1D712] = { bottomright = -.15 },   -- italic chi
                        [0x1D713] = { bottomright = -.1 },    -- italic psi
                        [0x1D718] = { bottomright = -.05 },   -- italic varkappa
                        --
                        ["0x222B.parts.bottom"] = { bottomright = -0.20 }, -- int
                        ["0x222C.parts.bottom"] = { bottomright = -0.15 }, -- iint
                        ["0x222D.parts.bottom"] = { bottomright = -0.10 }, -- iiint
                        ["0x2A0C.parts.bottom"] = { bottomright = -0.05 }, -- iiiint
                    },
                },
                -- Accents are a mess. We migrate the extensibles from the combiners to the base accent
                -- and then need to tweak the width (which is auto set because it was zero with a large
                -- accent anchor offset). First we copy and fix.
                {
                    tweak = "extendaccents",
                },
                {
                    tweak   = "radicaldegreeanchors",
                    list = {
                        [0x221A]                = { location = "left", hfactor  = .1, vfactor  = .65 },
                        ["0x221A.variants.*"]   = { location = "left", hfactor  = .1, vfactor  = .6 },
                        ["0x221A.variants.1"]   = { location = "left", hfactor  = .1, vfactor  = .65 },
                        ["0x221A.variants.2"]   = { location = "left", hfactor  = .1, vfactor  = .65 },
                        ["0x221A.parts.bottom"] = { location = "left", hfactor  = .1, vfactor  = 1.1 },
                    }
                },
                {
                    tweak = "flattenaccents",
                },
                {
                    tweak = "fixaccents",
                },
                -- First we set the dimensions of the initial accent which started out as zero but we want
                -- a proper width.
                -- {
                --     tweak = "dimensions",
                --     list  = {
                --         [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat
                --         [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde
                --         [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve
                --         [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck
                --     },
                -- },
                -- Then we deal with all offsets and heights in one go. So we treat the initial accent
                -- as well as the variants here.
                {
                    tweak = "dimensions",
                    list  = {
                        [0x020DB] = { yoffset =  0.015, height = .95, all = true }, -- widedddot : 0x20DB (self)
                    },
                },
                -- We now copy these to the not wide slots so that we can set these to stretch as well,
                -- if only because it is less confusing and more consistent.
                {
                    tweak = "copyaccents",
                },
                presets.addmathkerns { },
                {
                    tweak = "checkspacing",
                },
                {
                    tweak = "addscripts",
                },
                {
                    tweak = "accentdimensions",
                },
                {
                    tweak = "addrules",
                },
                {
                    tweak    = "replacerules",
                    fraction = { height = .254, yoffset = .746, leftoffset = .1, rightoffset = .1,  },
                    radical  = { height = .17, leftoffset = .1, rightoffset = .1, yoffset = .485, yscale = .65  },
                    stacker  = { height = .254, yoffset = .746 },
                },
                {
                    tweak = "wipecues",
                },
                {
                    tweak   = "addbars",
                    advance = 0.175,
                },
                {
                    tweak = "addactuarian",
                },
                {
                    tweak = "addequals",
                },
                {
                    tweak   = "addfourier",
                    variant = 1,
                },
                {
                    tweak = "addprimed",
                },
                -- this is the mkiv section
                {
                    tweak   = "emulatelmtx",
                    feature = "emulatelmtx",
                    comment = "this is for mkiv",
                },
            },
        },
        alternates = {
            dotless = { feature = 'dtls', value = 1, comment = "Mathematical Dotless Forms" },
        },
        bigslots = {
            1, 3, 5, 7
        },
    },
}
