@Section @Title { "@SetTexture" } @Tag { texture } @Begin @PP The @@SetTexture symbol settexture.sym @Index { @@SetTexture symbol } returns its right parameter in the texture specified by its left parameter. A texture is a pattern used when filling areas to get a texture rather than solid color. @PP In the PostScript world, textures are called patterns, and the relevant PostScript commands use this terminology. The author has preferred the term `texture' because it is more precise: a pattern could be a pattern for anything. @PP The @@SetTexture command accepts the special value {@Code "nochange"} for the left parameter. This value causes the right parameter to have the texture it would have had without the @@SetTexture command. An empty left parameter also has this effect. @PP Another special value is {@Code "LoutTextureSolid"}, which means no texture at all, just solid colour. It would be useful to change back to solid colour within an enclosing textured region. It is also the initial texture; thus there is no need to ensure that the root galley or each of its components is enclosed in a @@SetTexture symbol. @PP The form of the left parameter is implementation-dependent; in Basser Lout it must be an object whose value is a sequence of words comprising PostScript for setting a texture, up to and including the PostScript @Code "setpattern" command (or equivalent) which installs the texture into the graphics state. Lout makes no attempt to understand textures, it simply prints the PostScript commands when appropriate. Consult @Cite { $adobe1990ps } for information about PostScript patterns. You'll need to do that in order to make sense of the rest of this section. @PP Since building even a simple texture takes a lot of PostScript and is quite error-prone, Lout defines two symbols in the PostScript prologue called @Code "LoutMakeTexture" and @Code "LoutSetTexture" that you can use to make and set a texture, like this: @ID @Code @Verbatim { { "1 1 1 0 dg 0 pt 0 pt" "2 [0 0 2 pt 3 pt] 2 pt 3 pt { ... }" "LoutMakeTexture LoutSetTexture" } @SetTexture ... } We'll explain both symbols in detail in a moment, but just briefly, @Code "LoutMakeTexture" makes a texture, leaving a pattern dictionary as returned by @Code "makepattern" on the execution stack, and @Code "LoutSetTexture" installs this texture into the current graphics state, like @Code "setpattern" but without any mention of colour. @PP @Code "LoutMakeTexture" is just a convenience definition that constructs a pattern matrix and dictionary, populating them with the stack elements to its left, then calls {@Code makepattern}. You don't have to use it if you don't want to. The above example of @Code "LoutMakeTexture" sets the pattern matrix and dictionary as follows. @PP The first number is a scale factor, and the second and third are horizontal and vertical scale factors. The fourth ({@Code "0 dg"}) is an angle of rotation. The fifth and sixth are horizontal and vertical shifts. These six numbers determine the pattern transformation matrix passed to {@Code makepattern}. @PP The remaining elements go into the pattern dictionary. @Code "PaintType" is set to the first of them, or the seventh item overall (2 in our example, denoting an uncoloured pattern, which will usually be the best choice; the pattern will be painted in the current colour), @Code "BBox" is set to the eighth item, here {@Code "[0 0 2 pt 3 pt]"}, @Code "XStep" is set to the ninth item, here {@Code "2 pt"}, @Code "YStep" is set to the tenth item, here {@Code "3 pt"}, and @Code "PaintProc" is set to the eleventh and last item, which should be an executable array as shown. All non-zero lengths must be in absolute units, that is, followed by {@Code in}, {@Code cm}, {@Code pt}, or {@Code em}, otherwise the results will be unpredictable. @PP @Code "LoutSetTexture" installs the given texture into the graphics state, preserving the current colour. You must use @Code "LoutSetTexture" and you must not use {@Code setcolorspace}, @Code {setcolor}, and {@Code setpattern}, because Lout considers colour and texture to be independent of each other, and these PostScript commands don't. @PP Another advantage of @Code "LoutMakeTexture" and @Code "LoutSetTexture" is that they behave sensibly on Level 1 PostScript interpreters, which do not have patterns. Rather than failing altogether, these commands will make sure everything appears in solid colour. Be aware, though, that interpreters exist (e.g @Code gv ca. 1997) which appear to be Level 2 but actually leave textured areas blank. @PP For information on how these symbols are implemented, consult Appendix {@NumberOf tex}. @End @Section