[NTG-context] MetaFun - "remove the paths of text" from a rectangle to let the background visible

Garulfo garulfo at azules.eu
Mon Dec 21 16:09:35 CET 2020


Hi,


* I try to "remove the paths of text" from a metapost pictures to let
   the background visible.

* Using
   https://mailman.ntg.nl/pipermail/ntg-context/2018/thread.html#92725

* I was able to get the following with one glyph (MVE code below)

   https://wiki.contextgarden.net/images/d/d2/test_extract_glyphs.pdf


2 questions:

1/ for some fonts (e.g. dejavu vs latin modern) the "encompassing" path
    of the B glyph can switch from B[1] to B[Bn]. Is there a trick to
    identify which id match with "the encompassing" path ?

2/ now, I would like to do the same, but for text... a kind of
    derivative of "textext" or "outlinetext".
    Would you please give me some guidelines ?
	does it already exist ?
	should I use something like \handletokens, \scantokens ?
	do you have examples where I can get inspiration ?


Thanks again for your help,
Garulfo


%==============================================================================




\starttext

%------------------------------------------------------------------------------

\startluacode

function document.outlinepaths(character)
     local chardata  = fonts.hashes.characters[true] -- by unicode
     local shapedata = fonts.hashes.shapes[true] -- by index
     local c         = chardata[character]
     if c and c.index and shapedata then
         local shapeglyphs = shapedata.glyphs or { }
         local glyph       = shapeglyphs[c.index]
         if glyph and (glyph.segments or glyph.sequence) then
             local units  = shapedata.units or 1000
             local factor = 100/units
             return fonts.metapost.paths(glyph,factor)
         end
     end
     return { }
end

function document.defineoutline(char,target)
     local outlines = document.outlinepaths(char)
     local nofpaths = #outlines
     context("path %s[] ;",target)
     context("numeric %sn ; %sn := %s ;",target,target,nofpaths)
     for i=1,nofpaths do
         context("%s[%i] := %s ; ",target,i,outlines[i])
     end
end

\stopluacode

%------------------------------------------------------------------------------

\def\mpdefineoutlines#1#2{\ctxlua{document.defineoutline(\number`#1,"#2")}}

%------------------------------------------------------------------------------

\startMPpage

numeric dimA ; dimA := 20cm;

path pathbackground ;
pathbackground :=  unitsquare scaled dimA ;
fill pathbackground withshademethod "linear" withshadedirection(0,1) 
withshadecolors (red,blue);

%--------------------------------------

\mpdefineoutlines{B}{B}

%--------------------------------------

numeric dimB  ; dimB := 2cm;
numeric vratio ; vratio := 2;

path frame ;
frame :=  unitsquare
           xscaled (dimA - 2 * dimB)
           yscaled (dimA / vratio)
           shifted (dimB , (dimA - (dimA / vratio))/2 );

%--------------------------------------

pair shift ; shift := center frame;
numeric scal ; scal := (0.9) * (10cm / (bbheight B[1])) ;

picture monImageB; monImageB := nullpicture;
addto monImageB contour
       (B[1] shifted (- center B[1]) scaled scal)
       shifted shift
       withpostscript "collect";

addto monImageB contour
       frame
       withpostscript "evenodd";

for i=2 upto Bn :
   addto monImageB contour
         (B[i] shifted (- center B[1]) scaled scal)
         shifted shift;
endfor ;

%--------------------------------------

draw monImageB withcolor white;

\stopMPpage

\stoptext


More information about the ntg-context mailing list