39
39
local setmetatableindex = table.setmetatableindex
40
40
local loaddata = io.loaddata
42
local bpfactor = number.dimenfactors.bp
42
local bpfactor <const> = number.dimenfactors.bp
44
44
local osuuid = os.uuid
45
45
local zlibcompresssize = xzip.compresssize
129
129
local getxformname, getximagename
130
130
local boundingbox, shippingmode, objectnumber
131
131
local tmrx, tmry, tmsx, tmsy, tmtx, tmty
132
local cmrx, cmry, cmsx, cmsy, cmtx, cmty
132
----- cmrx, cmry, cmsx, cmsy, cmtx, cmty
133
local cmrx, cmry, cmtx, cmty
135
137
local function usefont(t,k) -- a bit redundant hash
136
138
-- local v = pdfgetfontname(k)
264
267
-- helpers (maybe in collapse mode we have to go %.9N)
266
269
local f_cm = formatters["%.6N %.6N %.6N %.6N %.6N %.6N cm"]
270
local f_cz = formatters["%.6N 0 0 %.6N %.6N %.6N cm"]
267
271
local f_tm = formatters["%.6N %.6N %.6N %.6N %.6N %.6N Tm"]
269
273
local saved_text_pos_v = 0
298
local saved_chararray_pos_h
299
local saved_chararray_pos_v
303
local function begin_chararray()
304
saved_chararray_pos_h = pdf_h
305
saved_chararray_pos_v = pdf_v
306
cw = horizontalmode and saved_chararray_pos_h or - saved_chararray_pos_v
309
b = b + 1 ; buffer[b] = " ["
313
local function end_chararray()
314
b = b + 1 ; buffer[b] = "] TJ"
315
buffer[saved_b] = concat(buffer,"",saved_b,b)
317
pdf_h = saved_chararray_pos_h
318
pdf_v = saved_chararray_pos_v
303
local begin_chararray, end_chararray do
305
local saved_chararray_pos_h
306
local saved_chararray_pos_v
310
begin_chararray = function()
311
saved_chararray_pos_h = pdf_h
312
saved_chararray_pos_v = pdf_v
313
cw = horizontalmode and saved_chararray_pos_h or - saved_chararray_pos_v
316
b = b + 1 ; buffer[b] = " ["
320
end_chararray = function()
321
b = b + 1 ; buffer[b] = "] TJ"
322
buffer[saved_b] = concat(buffer,"",saved_b,b)
324
pdf_h = saved_chararray_pos_h
325
pdf_v = saved_chararray_pos_v
322
331
local function begin_charmode()
353
362
local function pdf_set_pos(h,v)
354
363
local move = calc_pdfpos(h,v)
356
b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
365
-- b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
366
b = b + 1 ; buffer[b] = f_cz(cmrx, cmry, cmtx*bpfactor, cmty*bpfactor)
357
367
pdf_h = pdf_h + cmtx
358
368
pdf_v = pdf_v + cmty
388
b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
398
-- b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
399
b = b + 1 ; buffer[b] = f_cz(cmrx, cmry, cmtx*bpfactor, cmty*bpfactor)
389
400
pdf_h = pdf_h + cmtx
390
401
pdf_v = pdf_v + cmty
393
404
local function pdf_set_pos_temp(h,v)
394
405
local move = calc_pdfpos(h,v)
396
b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
407
-- b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
408
b = b + 1 ; buffer[b] = f_cz(cmrx, cmry, cmtx*bpfactor, cmty*bpfactor)
525
local function setup_fontparameters(font,factor,sx,sy)
526
local slant = fontparameters.slantfactor or 0
527
local extend = fontparameters.extendfactor or 1
528
local squeeze = fontparameters.squeezefactor or 1
529
local expand = 1 + factor / 1000000
530
local format = fontproperties.format
532
tmrx = expand * extend
535
need_width = fontparameters.width or 0
536
need_mode = fontparameters.mode or 0
537
local function setup_fontparameters(font,factor,sx,sy,effect)
538
local format = fontproperties.format
539
local expand = 1 + factor / 1000000
542
-- local slant = fontparameters.slantfactor or 0
543
-- local squeeze = fontparameters.squeezefactor or 1
544
-- local extend = fontparameters.extendfactor or 1
545
-- tmrx = extend * expand
548
-- need_width = fontparameters.width or 0
549
-- need_mode = fontparameters.mode or 0
552
if effect ~= c_effect then
553
tmsy = effect.slant or fontparameters.slantfactor or 0
554
tmry = effect.squeeze or fontparameters.squeezefactor or 1
555
tmrx = effect.extend or fontparameters.extendfactor or 1
556
need_mode = effect.mode or fontparameters.mode or 0
557
need_width = effect.line or fontparameters.width or 0
560
-- we could check if effects have changed but effects use unique tables; for
561
-- now they win over font effects (only used in math)
564
tmsy = fontparameters.slantfactor or 0
565
tmry = fontparameters.squeezefactor or 1
566
tmrx = fontparameters.extendfactor or 1
567
need_mode = fontparameters.mode or 0
568
need_width = fontparameters.width or 0
538
574
f_pdf = usedfonts[font] -- cache
539
575
cur_factor = factor
717
local effect = data.effect
682
719
-- if sx ~= f_x_scale or sy ~= f_y_scale or need_tf or font ~= f_cur or f_pdf ~= f_pdf_cur or fs ~= fs_cur then
683
if sx ~= f_x_scale or sy ~= f_y_scale or need_tf or font ~= f_cur or f_pdf ~= f_pdf_cur or fs ~= fs_cur or mode == "page" then
720
if sx ~= f_x_scale or sy ~= f_y_scale or need_tf or font ~= f_cur or f_pdf ~= f_pdf_cur or fs ~= fs_cur
722
or effect ~= c_effect
684
724
pdf_goto_textmode()
685
setup_fontparameters(font,factor,sx,sy) -- too often due to page
725
setup_fontparameters(font,factor,sx,sy,effect) -- too often due to page
687
727
-- elseif mode == "page" then
688
728
-- pdf_goto_textmode()
690
730
elseif cur_tmrx ~= tmrx or cur_factor ~= factor then
691
setup_fontparameters(font,factor,sx,sy)
731
setup_fontparameters(font,factor,sx,sy,effect)
1121
1161
local pdfcollectedresources = lpdf.collectedresources
1123
function codeinjections.saveboxresource(box,attributes,resources,immediate,kind,margin)
1163
function codeinjections.saveboxresource(box,attributes,resources,immediate,kind,margin,onum)
1125
1165
local immediate = true
1126
1166
local margin = margin or 0 -- or dimension
1127
local objnum = pdfreserveobject()
1167
local objnum = onum or pdfreserveobject()
1128
1168
local list = tonut(type(box) == "number" and tex.takebox(box) or box)
1130
1170
if resources == true then
1225
1269
tx = cmtx * bpfactor
1226
1270
ty = cmty * bpfactor
1227
1271
b = b + 1 ; buffer[b] = s_b
1228
b = b + 1 ; buffer[b] = f_cm(rx,0,0,ry,tx,ty)
1272
-- b = b + 1 ; buffer[b] = f_cm(rx,0,0,ry,tx,ty)
1273
b = b + 1 ; buffer[b] = f_cz(rx, ry,tx,ty)
1229
1274
b = b + 1 ; buffer[b] = f_fm(name)
1230
1275
b = b + 1 ; buffer[b] = s_e
1483
1526
b = b + 1 ; buffer[b] = rule
1484
1527
b = b + 1 ; buffer[b] = s_e
1486
-- buffer[saved_b] = concat(buffer," ",saved_b,b)
1491
1531
flushers.simplerule = function(pos_h,pos_v,pos_r,size_h,size_v)
1584
function lpdf.setpageorder(mapping)
1624
function lpdf.setpageorder(mapping,p)
1585
1625
-- mapping can be a hash so:
1586
1626
local list = table.sortedkeys(mapping)
1587
1627
local n = #list
1588
if n == nofpages then
1628
local nop = p or nofpages
1589
1630
local done = { }
1590
1631
local hash = { }