On 8/13/2023 12:56 AM, Hamid,Idris wrote:
On Aug 12, 2023, 4:20 PM -0600, Hans Hagen <j.ha...@xs4all.nl>, wrote:

btw, no need for squeezine as there are virtual commands for scaling; not for 
rotating

 From your original CLD template:

local function topthing(characters,target,base,accent)
--    if not characters[target] then
         local data1 = characters[base]
         local data2 = characters[accent]
         if data1 and data2 then
             characters[target] = { -- "Ḥ"
                 height   = (data1.height or 0) + 0.5*(data2.height or 0),
                 depth    = data1.depth,
                 width    = data1.width,
                 unicode  = target,
                 commands = {
                     { "slot", 0, 0x048 },
                     { "left", 0.5*(data2.width  or 0) + 0.5*(data1.width  or 
0) },
                     { "up",   0.5*(data2.height or 0) },
                     { "slot", 0, 0x2D9, },
                 },
             }
         end
--    end
end
a little lesson in efficiency attached

Hans

-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
       tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
\startluacode

-- Ṯṯ Ḥḥ Ḫḫ Ḏḏ Šš Ṣṣ Ḍḍ Ṭṭ Ẓẓ Ġġ Āā Īī Ūū ʿ ʾ

local function process(characters,target,value)
    if value == "force" then
        return true
    elseif characters[target] then
        return false
    else
        return true
    end
end

local function below(characters,value,target,base,accent,left,down,depth)
    if process(characters,target,value) then
        local data1 = characters[base]
        local data2 = characters[accent]
        if data1 and data2 then
            characters[target] = {
                height   = data1.height,
                depth    = depth*data2.height,
                width    = data1.width,
                unicode  = target,
                commands = {
                    { "slot", 0, base },
                    { "left", left*(data2.width  or 0) + 0.5*(data1.width  or 
0) },
                    { "down", down*(data2.height or 0) +     (data2.height or 
0) },
                    { "slot", 0, accent },
                },
            }
        end
    end
end

local function ccrap(characters,value,target,base,template,scale,mirror)
    if process(characters,target,value) then
        local data1 = characters[base]
        local data2 = characters[template]
        if data1 and data2 then
            local height1 = data1.height
            local height2 = data2.height
            local width1  = scale * data1.width
            characters[target] = {
                height   = height2,
                depth    = 0,
                width    = width1,
                unicode  = target,
                commands = {
                    {
                        "offset",
                        mirror and width1 or 0,
                        height2 - (mirror and 0 or scale*height1),
                        base,
                        mirror and -scale or scale,
                        mirror and -scale or scale
                    },
                },
            }
        end
    end
end

-- in principle one can have some extra parameters for shifts but this
-- is suboptimal anyway and only meant for minion

local function initialize(tfmdata,feature,value)
    if value then
        local characters = tfmdata.characters

        below (characters,value,0x1E6E,0x054,0x0AF,0.50,0.07,0.20) -- Tlinebelow
        below (characters,value,0x1E6F,0x074,0x0AF,0.45,0.07,0.20) -- tlinebelow
        below (characters,value,0x1E24,0x048,0x2D9,0.50,0.10,0.30) -- Hdotbelow
        below (characters,value,0x1E25,0x068,0x2D9,0.50,0.10,0.30) -- hdotbelow
        below (characters,value,0x1E2A,0x048,0x2D8,0.50,0.10,0.35) -- 
Hbrevebelow
        below (characters,value,0x1E2B,0x068,0x2D8,0.50,0.10,0.35) -- 
hbrevebelow
        below (characters,value,0x1E0E,0x044,0x0AF,0.50,0.07,0.20) -- Dlinebelow
        below (characters,value,0x1E0F,0x064,0x0AF,0.40,0.07,0.20) -- dlinebelow
        below (characters,value,0x1E62,0x053,0x2D9,0.50,0.12,0.30) -- Sdotbelow
        below (characters,value,0x1E63,0x073,0x2D9,0.40,0.12,0.30) -- sdotbelow
        below (characters,value,0x1E0C,0x044,0x2D9,0.50,0.12,0.30) -- Ddotbelow
        below (characters,value,0x1E0D,0x064,0x2D9,0.40,0.12,0.30) -- ddotbelow
        below (characters,value,0x1E6C,0x054,0x2D9,0.50,0.12,0.30) -- Tdotbelow
        below (characters,value,0x1E6D,0x074,0x2D9,0.40,0.12,0.30) -- tdotbelow
        below (characters,value,0x1E92,0x05A,0x2D9,0.50,0.12,0.30) -- Zdotbelow
        below (characters,value,0x1E93,0x07A,0x2D9,0.40,0.12,0.30) -- zdotbelow

        ccrap (characters,value,0x02BE,0x063,0x043,0.5,false) -- some fake
        ccrap (characters,value,0x02BF,0x063,0x043,0.5,true)  -- some fake
    end
end

local specification = {
    name        = "idrify",
    description = "idrify",
    manipulators = {
        base = initialize,
        node = initialize,
    }
}

fonts.handlers.otf.features.register(specification)
\stopluacode

% \definefontfeature[default][default][idrify=yes]
\definefontfeature[default][default][idrify=force]

\showglyphs

\startTEXpage[offset=1ts]
    \definedfont[MinionPro-Regular.otf*default @ 12pt]%
    Ṯṯ Ḥḥ Ḫḫ Ḏḏ Šš Ṣṣ Ḍḍ Ṭṭ Ẓẓ Ġġ Āā Īī Ūū ʿ ʾ
\stopTEXpage

\stoptext
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / https://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : https://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : https://contextgarden.net
___________________________________________________________________________________

Reply via email to