% !TeX program = LuaTeX % test for ga-canvas pdfliteral driver % % Copyright (C) 2020 Roberto Giacomelli % see LICENSE.txt file ---ga--- is a binary format as an istruction set similar to a sort of assembler language that describes simple graphic objects like lines and rectangles. This file contains tests aiming to check the pdfliteral driver capability to render such ga streams---usually a Lua array. The pdfliteral driver directly inserts PDF vector graphic primitives within the output and should be intented as the "native" driver of barracuda package. The complete reference of the ---ga--- format is available throgh out the content of the "ga-grammar.tex" file. Please note that all dimensions are in scaled point, the very small \TeX{} internal unit, in fact we have that 65536sp = 1pt. Running the source file with luatex. The typesetting engine executes the directlua macro, so vector graphics appear in the PDF output file. \newbox\mybox \directlua{ driver = require [[lib-driver.brcd-driver]] % global Lua variables pt = tex.sp [[1pt]] % 1pt = 65536sp } Let's start drawing an horizontal line 100pt long: \directlua{ local ga = {_data = {33, 0*pt, 100*pt, 0*pt}} driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox or two different parallel lines 24pt long: \directlua{ local ga = {_data = {33, 0*pt, 24*pt, 0*pt, 33, 0*pt, 24*pt, 5*pt}} driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox and again two horizontal lines 10pt thick, touching a corner: \directlua{ local ga = {_data = { 1, 10*pt, 33, -24*pt, 0*pt, -5*pt, 33, 0*pt, 24*pt, 5*pt, }} driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox Several vertical lines with its horizontal limits: \directlua{ local ga = { _data = { 34, -20*pt, 20*pt, 0*pt, 34, -15*pt, 15*pt, 5*pt, 34, -10*pt, 10*pt, 10*pt, 34, -5*pt, 5*pt, 15*pt, 34, -.5*pt, .5*pt, 20*pt, 34, -5*pt, 5*pt, 25*pt, 34, -10*pt, 10*pt, 30*pt, 34, -15*pt, 15*pt, 35*pt, 34, -20*pt, 20*pt, 40*pt, 1, .05*pt, 33, 0*pt, 40*pt, -20*pt, 33, 0*pt, 40*pt, 20*pt, }} driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox Finally a little rectangle: \directlua{ local ga = {_data = { 1, 5*pt, 48, 0*pt, 0*pt, 15*pt, 10*pt, }} driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox \bigskip Test number 1: a vbar 2pt width, 20pt height: \directlua{ % vbar: <36> y1 y2 x1 w1 x2 w2 ... xn wn local ga = {_data = {36, 0, 20*pt, 1, 0.0, 2*pt}} driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox \bigskip Test number 2: ten vbars in a row equally spaced by 10pt: \directlua{ local ga = {36, 0, 10*pt, 10,} for i = 0, 9 do ga[i*2 + 5] = 5*pt + i*20*pt ga[i*2 + 6] = 10*pt end driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 3: two series of vbars 10pt and 5pt large: \directlua{ local ga = {36, 0, 10*pt, 10,} for i = 0, 9 do ga[i*2 + 5] = 5*pt + i*20*pt ga[i*2 + 6] = 10*pt end ga[25] = 36 % vbar opcode ga[26] = 2.5*pt % y1 ga[27] = 7.5*pt % y2 ga[28] = 9 % number of bars for i = 0, 8 do ga[i*2 + 29] = 15*pt + i*20*pt ga[i*2 + 30] = 5*pt end driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 4: a bunch of thin vertical bars (25): \directlua{ local ga = {} ga[1] = 36 % vbar opcode ga[2] = 5*pt % y1 ga[3] = 25*pt % y2 ga[4] = 25 % number of bars for i = 0, 24 do ga[i*2 + 5] = 1*pt + i*4*pt ga[i*2 + 6] = 2*pt end driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule A\box\mybox A\vrule \bigskip Test number 5: two rows of a bunch of thin bars: \directlua{ local ga = {} ga[1] = 36 % vbar opcode ga[2] = 5*pt % y1 ga[3] = 25*pt % y2 ga[4] = 25 % number of bars for i = 0, 24 do ga[i*2 + 5] = 1*pt + i*4*pt ga[i*2 + 6] = 2*pt end ga[55] = 36 % vbar opcode ga[56] = 25*pt % y1 ga[57] = 45*pt % y2 ga[58] = 24 % number of bars for i = 0, 23 do ga[i*2 + 59] = 3*pt + i*4*pt ga[i*2 + 60] = 2*pt end driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 6: staircase of Vbars (manually data definition): \directlua{ local ga = { 36, % vbar opcode 0*pt, % y1 20*pt, % y2 1, % number of bars 5*pt, % x 10*pt, % w 36, % vbar opcode 20*pt, % y1 40*pt, % y2 1, % number of bars 15*pt, % x 10*pt, % w 36, % vbar opcode 40*pt, % y1 60*pt, % y2 1, % number of bars 25*pt, % x 10*pt, % w } driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 7: vbars with spaced text, in three different rows: \directlua{ local ga = {} ga[1] = 36 % vbar opcode ga[2] = 0*pt % y1 ga[3] = 20*pt % y2 ga[4] = 8 % number of bars for i = 1,8 do ga[3 + i*2] = i * 2 * 5*pt % x coordinate of bar axis ga[4 + i*2] = 5*pt % bar width end ga[21] = 36 % vbar opcode ga[22] = 30*pt % y1 ga[23] = 50*pt % y2 ga[24] = 8 % number of bars for i = 1,8 do ga[23 + i*2] = i * 2 * 5*pt % x coordinate of bar axis ga[24 + i*2] = 5*pt % bar width end % 131 ga[41] = 131 % opcode text_xspaced ga[42] = 10*pt % x coordinate of the first glyph axis ga[43] = 10*pt % x gap among glyphs ga[44] = 0.5 % half height ga[45] = 25*pt % y coordinate of glyps ga[46] = 65 % A ga[47] = 66 % B ga[48] = 67 % C ga[49] = 68 % D ga[50] = 69 % E ga[51] = 70 % F ga[52] = 71 % G ga[53] = 72 % H ga[54] = 0 driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 8: spaced text (checking the correct vertical alignment): \directlua{ local ga = {} ga[1] = 36 % vbar opcode ga[2] = 0*pt % y1 ga[3] = 20*pt % y2 ga[4] = 8 % number of bars for i = 1,8 do ga[3 + i*2] = i * 2 * 5*pt % x coordinate of bar axis ga[4 + i*2] = 1*pt % bar width end ga[21] = 36 % vbar opcode ga[22] = 40*pt % y1 ga[23] = 60*pt % y2 ga[24] = 8 % number of bars for i = 1,8 do ga[23 + i*2] = i * 2 * 5*pt % x coordinate of bar axis ga[24 + i*2] = 1*pt % bar width end % 131 ga[41] = 131 % opcode text_xspaced ga[42] = 10*pt % x coordinate of the first glyph axis ga[43] = 10*pt % x gap among glyphs ga[44] = 0.0 % half height ga[45] = 30*pt % y coordinate of glyps ga[46] = 65 % A ga[47] = 66 % B ga[48] = 67 % C ga[49] = string.byte("Q") ga[50] = 69 % E ga[51] = 70 % F ga[52] = 71 % G ga[53] = 72 % H ga[54] = 0 ga[55] = 131 % opcode text_xspaced ga[56] = 10*pt % x coordinate of the first glyph axis ga[57] = 10*pt % x gap among glyphs ga[58] = 1.0 % half height ga[59] = 30*pt % y coordinate of glyps ga[60] = 49 % 1 ga[61] = 50 % 2 ga[62] = 51 % 3 ga[63] = 52 % 4 ga[64] = 53 % 5 ga[65] = 54 % 6 ga[66] = 55 % 7 ga[67] = 56 % 8 ga[68] = 0 driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 9: spaced text, check correct vertical alignment: \directlua{ local ga = {} ga[1] = 36 % vbar opcode ga[2] = 0*pt % y1 ga[3] = 20*pt % y2 ga[4] = 8 % number of bars for i = 1,8 do ga[3 + i*2] = i * 2 * 5*pt % x coordinate of bar axis ga[4 + i*2] = 8*pt % bar width end ga[21] = 36 % vbar opcode ga[22] = 40*pt % y1 ga[23] = 60*pt % y2 ga[24] = 8 % number of bars for i = 1,8 do ga[23 + i*2] = i * 2 * 5*pt % x coordinate of bar axis ga[24 + i*2] = 8*pt % bar width end % 131 ga[41] = 131 % opcode text_xspaced ga[42] = 10*pt % x coordinate of the first glyph axis ga[43] = 10*pt % x gap among glyphs ga[44] = 0.0 % half height ga[45] = 20*pt % y coordinate of glyps ga[46] = 65 % A ga[47] = 66 % B ga[48] = 67 % C ga[49] = 68 % D ga[50] = 69 % E ga[51] = 70 % F ga[52] = 71 % G ga[53] = 72 % H ga[54] = 0 ga[55] = 131 % opcode text_xspaced ga[56] = 10*pt % x coordinate of the first glyph axis ga[57] = 10*pt % x gap among glyphs ga[58] = 1.0 % half height ga[59] = 40*pt % y coordinate of glyps ga[60] = 49 % 1 ga[61] = 50 % 2 ga[62] = 51 % 3 ga[63] = 52 % 4 ga[64] = 53 % 5 ga[65] = 54 % 6 ga[66] = 55 % 7 ga[67] = 56 % 8 ga[68] = 0 driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 10: two centered texts aligned to the baseline: \directlua{ local ga = {} % 130 ga[ 1] = 130 % opcode text ga[ 2] = 0.5 % ax relative x coordinate ga[ 3] = 1.0 % ay relative y coordinate ga[ 4] = 0.0 % x position ga[ 5] = 0.0 % y position ga[ 6] = 65 % A ga[ 7] = string.byte("Q") % Q depth glyph ga[ 8] = 67 % C ga[ 9] = 0 ga[10] = 130 % opcode text ga[11] = 0.5 % ax ga[12] = 0.0 % ay ga[13] = 0.0 % x ga[14] = 0.0 % y ga[15] = 48 % 0 ga[16] = 49 % 1 ga[17] = 50 % 2 ga[18] = 51 % 3 ga[19] = 52 % 4 ga[20] = 53 % 5 ga[21] = 54 % 6 ga[22] = 55 % 7 ga[23] = 56 % 8 ga[24] = 57 % 9 ga[25] = 0 driver:ga_to_hbox({_data = ga}, [[mybox]]) }\vrule\box\mybox\vrule \bigskip So far, we have manually build data for ga stream. Next we are going to use the ga-canvas library. \bigskip In fact, all the previous tests are rebuild with the ga-canvas library. Test 1: a vbar 2pt width, 20pt height: \directlua{ gacanvas = require "lib-geo.brcd-gacanvas" local ga = gacanvas:new() local vbar = {_yline = {0.0, 2*pt}} local err = ga:encode_Vbar(vbar, 0.0, 0.0, 20*pt) % x, w assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\box\mybox \bigskip Test 2: ten vbars equally spaced by 10pt: \directlua{ local ga = gacanvas:new() local data = {} for i = 0, 9 do data[i*2 + 1] = 5*pt + i*20*pt % x data[i*2 + 2] = 10*pt % w end local bars = {_yline = data} local err = ga:encode_Vbar(bars, 0.0, 0.0, 10*pt) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test 3: two series of vbars 10pt and 5pt large: \directlua{ local b1 = {} for i = 0, 9 do b1[i*2 + 1] = i*20*pt b1[i*2 + 2] = 10*pt end local b2 = {} for i = 0, 8 do b2[i*2 + 1] = i*20*pt b2[i*2 + 2] = 5*pt end local ga = gacanvas:new() local err = ga:encode_Vbar({_yline=b1}, 0.0, 0.0, 10*pt) assert(not err, err) err = ga:encode_Vbar({_yline=b2}, 10.0*pt, 2.5*pt, 7.5*pt) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test 4: a bunch of thin bars: \directlua{ local b = {} for i = 0, 24 do b[i*2 + 1] = 1*pt + i*4*pt b[i*2 + 2] = 2*pt end local ga = gacanvas:new() local err = ga:encode_Vbar({_yline=b}, 0.0, 5*pt, 25*pt) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule{ }\box\mybox{ }\vrule \bigskip Test 5: two levels of a bunch of thin bars: \directlua{ local b = {} for i = 0, 24 do b[i*2 + 1] = i*4*pt b[i*2 + 2] = 2*pt end local b = {_yline=b} local ga = gacanvas:new() local err = ga:encode_Vbar(b, 0.0, 5*pt, 25*pt) assert(not err, err) err = ga:encode_Vbar(b, 2*pt, 25*pt, 45*pt, b) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 6: staircase of bars (manual insertion of data): \directlua{ local b = {_yline={0.0, 10*pt}} local ga = gacanvas:new() local err = ga:encode_Vbar(b, 0.0, 0.0, 20*pt) assert(not err, err) err = ga:encode_Vbar(b, 10*pt, 20*pt, 40*pt) assert(not err, err) err = ga:encode_Vbar(b, 20*pt, 40*pt, 60*pt) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 7: vbars with spaced text, all in three rows: \directlua{ local b = {} for i = 0,7 do b[i*2+1] = i*10*pt b[i*2+2] = 5*pt end local vb = {_yline=b} local ga = gacanvas:new() local err = ga:encode_Vbar(vb, 0.0, 0.0, 20*pt) assert(not err, err) local err = ga:encode_Vbar(vb, 0.0, 30*pt, 50*pt) assert(not err, err) local txt = {codepoint = { 65, % A 66, % B 67, % C 68, % D 69, % E 70, % F 71, % G 72, % H }} err = ga:encode_Text_xspaced(txt, 0.0, 10*pt, 25*pt, 0.5) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test 8: spaced text, check correct vertical alignment: \directlua{ local b = {} for i = 0,7 do b[i*2+1] = i*10*pt b[i*2+2] = 2*pt end b = {_yline=b} local ga = gacanvas:new() local err = ga:encode_Vbar(b, 0.0, 0.0, 20*pt) assert(not err, err) local err = ga:encode_Vbar(b, 0.0, 40*pt, 60*pt) assert(not err, err) local c = { codepoint = { 65, % A 66, % B 67, % C string.byte("Q"), 69, % E 70, % F 71, % G 72, % H }} err = ga:encode_Text_xspaced(c, 0.0, 10*pt, 30*pt, 0.0) assert(not err, err) local n = { codepoint = { 49, % 1 50, % 2 51, % 3 52, % 4 53, % 5 54, % 6 55, % 7 56, % 8 }} err = ga:encode_Text_xspaced(n, 0.0, 10*pt, 30*pt, 1.0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 9: spaced text, check correct vertical alignment: \directlua{ local b = {} for i = 0,7 do b[i*2+1] = i*10*pt b[i*2+2] = 8*pt end b = {_yline = b} local ga = gacanvas:new() local err = ga:encode_Vbar(b, 0.0, 0.0, 20*pt) assert(not err, err) local err = ga:encode_Vbar(b, 0.0, 40*pt, 60*pt) assert(not err, err) local c = { codepoint = { 65, % A 66, % B 67, % C string.byte("Q"), 69, % E 70, % F 71, % G 72, % H }} err = ga:encode_Text_xspaced(c, 0.0, 10*pt, 20*pt, 0.0) assert(not err, err) local n = { codepoint = { 49, % 1 50, % 2 51, % 3 52, % 4 53, % 5 54, % 6 55, % 7 56, % 8 }} err = ga:encode_Text_xspaced(n, 0.0, 10*pt, 40*pt, 1.0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule{ }\box\mybox{ }\vrule \bigskip Test number 10: two centered texts and baseline aligned: \directlua{ local n = { codepoint = { 48, % 0 49, % 1 50, % 2 51, % 3 52, % 4 53, % 5 54, % 6 55, % 7 56, % 8 57, % 9 }} local ga = gacanvas:new() local err = ga:encode_Text(n, 0, 0, 0.5, 0) assert(not err, err) local a = { codepoint = { 65, % A string.byte("Q"), % Q 67, % C }} err = ga:encode_Text(a, 0, 0, 0.5, 1) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 11: two centered texts aligned: \directlua{ local n = { codepoint = { 48, % 0 49, % 1 50, % 2 51, % 3 52, % 4 53, % 5 54, % 6 55, % 7 56, % 8 57, % 9 }} local ga = gacanvas:new() local err = ga:encode_Text(n, 0, 0, 0.5, 1) assert(not err, err) local a = { codepoint = { 65, % A string.byte("Q"), % Q 67, % C }} err = ga:encode_Text(a, 0, 0, 0.5, 0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 12: text\_xwidth opcode: \directlua{ local n = { codepoint = { 48, % 0 49, % 1 50, % 2 51, % 3 52, % 4 53, % 5 54, % 6 55, % 7 56, % 8 57, % 9 }} local ga = gacanvas:new() local err = ga:encode_Text_xwidth(n, 0, tex.sp "5cm", 0, 0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \vrule\hbox to 5cm{0 \hfill9}\vrule \bigskip Test number 13: text\_xwidth with different size: \smallskip \directlua{ local n = {codepoint = { 48, % 0 49, % 1 50, % 2 51, % 3 52, % 4 53, % 5 54, % 6 55, % 7 56, % 8 57, % 9 }} local ga = gacanvas:new() % (txt, x1, x2, ypos, ay) --> err local err = ga:encode_Text_xwidth(n, tex.sp "0mm", tex.sp "50mm", 0, 0) assert(not err, err) local err = ga:encode_Text_xwidth(n, tex.sp "5mm", tex.sp "45mm", tex.sp "3mm", 0) assert(not err, err) local err = ga:encode_Text_xwidth(n, tex.sp "10mm", tex.sp "40mm", tex.sp "6mm", 0) assert(not err, err) local err = ga:encode_Text_xwidth(n, tex.sp "15mm", tex.sp "35mm", tex.sp "9mm", 0) assert(not err, err) local err = ga:encode_Text_xwidth(n, tex.sp "20mm", tex.sp "30mm", tex.sp "12mm", 0) assert(not err, err) local err = ga:encode_Text_xwidth(n, tex.sp "24mm", tex.sp "26mm", tex.sp "15mm", 0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 14: place bars and text as text\_xwidth: \smallskip \directlua{ local b = {} for i = 0, 9 do b[i*2 + 1] = i*12*pt b[i*2 + 2] = 0.4*pt end b = {_yline = b} local n = {codepoint = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,}} local ga = gacanvas:new() % (vbar, x0, y1, y2) --> err local err = ga:encode_Vbar(b, 0.0, 0*pt, 25*pt) local err = ga:encode_Vbar(b, 0.0, 32*pt, 42*pt) assert(not err, err) % (txt, x1, x2, ypos, ay) --> err local err = ga:encode_Text_xwidth(n, 0*pt, 108*pt, 25*pt, 0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \smallskip \directlua{ local b = {} for i = 0, 8 do b[i*2 + 1] = i*12*pt b[i*2 + 2] = 0.2*pt end b = {_yline = b} local n = { 48, 49, 50, 51, string.byte([[x]]), 53, 54, 55, 56,} n = {codepoint = n} local ga = gacanvas:new() % x0, y1, y2, bars local err = ga:encode_Vbar(b, 0.0, 0*pt, 25*pt) local err = ga:encode_Vbar(b, 0.0, 32*pt, 42*pt) assert(not err, err) % (txt, x1, x2, ypos, ay) --> err local err = ga:encode_Text_xwidth(n, 0*pt, 96*pt, 25*pt, 0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bigskip Test number 15: place text\_xwidth when text is only two chars long: \directlua{ local n = {codepoint = { 48, 56,}} % 0 and 8 local ga = gacanvas:new() % (txt, x1, x2, ypos, ay) --> err local err = ga:encode_Text_xwidth(n, 0*pt, 32*pt, 25*pt, 0) assert(not err, err) driver:ga_to_hbox(ga, [[mybox]]) }\vrule\box\mybox\vrule \bye