Dear gang,

I. In Context, as is well known, scaling a character is not independent of switching the font:

=======
\startTEXpage[offset=1em]
\definefont[Times][times @ 14pt]
\Times Test \tfx Test
\setupinterlinespace

\Times Test \switchtobodyfont[x]Test

\Times Test \high{Test}
\stopTEXpage
=======

\tfx causes a switch to computer modern.

Of course, with the right typescripts and \setupbodyfont, one can maintain stylistic consistency when switching fonts.

But what if we want to scale independently of font switching? 

II. One approach might be to use symbols:

\startTEXpage
\definesymbol[Tee][\getglyph{times}{T}]
\symbol[Tee]est \tfx \symbol[Tee]est \tfa \symbol[Tee]est
\stopTEXpage

In this example, \tfa does scale the symbol Tee. But \tfx does not scale the symbol!

Why does \tfa (or higher such as \tfb etc.) work, but not \tfx (or lower)?

III. The best approach would be to do it in CLD (Context Lua Code). That is mostly beyond my skill to write from scratch without a template, but there are some experiments in the system file font-imp-effects.lua. There we will find, e.g., 

local specification = {
    name        = "extend",
    description = "scale glyphs horizontally",
    initializers = {
        base = initializeextend,
        node = initializeextend,
    }
}

local specification = {
    name        = "squeeze",
    description = "scale glyphs vertically",
    initializers = {
        base = initializesqueeze,
        node = initializesqueeze,
    }
}

This seems hopeful:

\definecolor [transparentgreen]  [g=1,t=.7,a=1]
\definecolor [transparentred]    [r=1,t=.7,a=1]
\definecolor [transparentyellow] [y=1,t=.7,a=1]

\startTEXpage[offset=1em]
\definefontfeature[scale][default][extend=yes,squeeze=yes]
\hbox{\rlap{\definedfont[times @ 14pt]\transparentgreen Test}%
            \definedfont[times*scale @ 14pt]\transparentred Test}
\stopTEXpage

But there is no scaling of the character, extend=yes shifts the glyphs to the left, and squeeze=yes appears to do nothing at all.

Here is a file collecting these experiments:

https://www.dropbox.com/scl/fi/dggj3ypgjjeia1bo4eelb/test-scaling.tex?rlkey=hcky6ol594mw8u0j2j1z22heh&dl=0
https://www.dropbox.com/scl/fi/o2u1tsq515ycyoeup43qg/test-scaling.pdf?rlkey=h7gof1vyq3r0bh72qynh71apc&dl=0

IV. Objective:

I need to be able to define a couple of characters in CLD -- glottal stops --, and add commands to scale and/or rotate a character without triggering a font switch. Again, writing this from scratch is beyond my current skill set - although I've recently started to study CLD. Something like this -- some of the semantics is almost certainly wrong and/or clumsy -)

==============
-- ʿ ringhalfleft
local function ringhalfleft (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,
                depth    = (data1.depth or 0) + 0.5*(data2.height or 0),
                width    = data1.width,
                unicode  = target,
                commands = {
                    { "slot", 0, 0 },
                    { "left", -0.5*(data2.width  or 0) + 0.5*(data2.width  or 0)},
                    -- { "down", 0.2*(data2.height or 0) +   (data2.height or 0) },
                    { "up", 0.0*(data2.height or 0) +        (data2.height or 0) },
                    { "slot", 0, 0x063, },
                    { "squeeze", 0.75*(data2.height or 0) },
                    { "extend",  0.75*(data2.width or 0) },
                },
            }
        end
--    end
end

-- ʾ ringhalfright
local function ringhalfright (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,
                depth    = (data1.depth or 0) + 0.5*(data2.height or 0),
                width    = data1.width,
                unicode  = target,
                commands = {
                    { "slot", 0, 0 },
                    { "left", -0.35*(data2.width  or 0) + 0.5*(data2.width  or 0)},
                    { "down", 0.0*(data2.height or 0) +       (data2.height or 0) },
                    -- { "up", 0.0*(data2.height or 0) +   (data2.height or 0) },
                    { "slot", 0, 0x063, },
                    { "squeeze", 0.75*(data2.height or 0) },
                    { "extend",  0.75*(data2.width or 0) },
                },
            }
        end
--    end
end

local function initialize(tfmdata,value)
    if value then        
        -- Hdotbelow(tfmdata.characters,0x02BF,0x063,0) -- 
        ringhalfleft (tfmdata.characters,0x02BF,0x063,0x063) 
        ringhalfright(tfmdata.characters,0x02BE,0x063,0x063) 
           -- (i.e., tfmdata.characters,target,base,accent)
        -- hdotbelow(tfmdata.characters,0x1E25,0x068,0x2D9)
    end
end

local function scale (ringhalfleft,ringhalfright)       
    for v in next, ringhalfleft do
        v.height = 0.75 * (v.height or 0)
        v.width  = 0.75 * (v.width or 0)
        v.depth  = 0.75 * (v.depth  or 0)
    end      
    for v in next, ringhalfright do
        v.height = 0.75 * (v.height or 0)
        v.width  = 0.75 * (v.width or 0)
        v.depth  = 0.75 * (v.depth  or 0)
    end
end

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

Rotation for one of the characters is also needed. Here is an experimental test file:

https://www.dropbox.com/scl/fi/wi81e23wg17k8jasqpeon/transliteration-glottal-lua.tex?rlkey=gfwgjduhta1iemouwvjp1n6v3&dl=0
https://www.dropbox.com/scl/fi/rca5v6uusyj6mogyklfpd/transliteration-glottal-lua.pdf?rlkey=ou1lbfdkwec4tpbgkkk3kh9b9&dl=0

Thank you in advance for your guidance.

Best wishes
Idris

--
Professor Idris Samawi Hamid
Department of Philosophy
Colorado State University
Fort Collins, CO 80523