|
1 | 1 | const firstAfter=(items,value,end)=>{let low=0,high=items.length;while(low<high){const middle=(low+high)>>>1;if(end(items[middle])<=value)low=middle+1;else high=middle;}return low;}; |
2 | 2 | export function buildReaderLayout(pages,scale=1,direction='vertical',columns=1,gap=24,border=2){ |
3 | | - const count=direction==='horizontal'?1:columns,rows=[],frames=[],columnWidths=Array(count).fill(0); |
4 | | - if(direction==='vertical')for(let i=0;i<pages.length;i++)columnWidths[i%count]=Math.max(columnWidths[i%count],pages[i].width*scale+border); |
5 | | - const xs=columnWidths.map((_,i)=>columnWidths.slice(0,i).reduce((sum,w)=>sum+w+gap,0)); |
| 3 | + const count=direction==='horizontal'?1:columns,rows=[],frames=[]; |
| 4 | + const rowWidths=[]; |
| 5 | + if(direction==='vertical')for(let start=0;start<pages.length;start+=count){const group=pages.slice(start,start+count);rowWidths.push(group.reduce((sum,p)=>sum+p.width*scale+border,0)+Math.max(0,group.length-1)*gap);} |
| 6 | + const layoutWidth=Math.max(0,...rowWidths); |
6 | 7 | let offset=0;const height=direction==='horizontal'?pages.reduce((max,p)=>Math.max(max,p.height*scale+border),0):0; |
7 | 8 | for(let start=0;start<pages.length;start+=count){ |
8 | 9 | const group=pages.slice(start,start+count),extent=direction==='horizontal'?group[0].width*scale+border:Math.max(...group.map(p=>p.height*scale+border)); |
9 | 10 | const row={start,end:start+group.length,offset,extent};rows.push(row); |
10 | | - for(let i=0;i<group.length;i++){const p=group[i],width=p.width*scale+border,h=p.height*scale+border;frames.push({number:p.number,row:rows.length-1,x:direction==='horizontal'?offset:xs[i],y:direction==='horizontal'?(height-h)/2:offset,width,height:h});} |
| 11 | + let rowX=(layoutWidth-(rowWidths[rows.length-1]||0))/2; |
| 12 | + for(let i=0;i<group.length;i++){const p=group[i],width=p.width*scale+border,h=p.height*scale+border;frames.push({number:p.number,row:rows.length-1,x:direction==='horizontal'?offset:rowX,y:direction==='horizontal'?(height-h)/2:offset,width,height:h});rowX+=width+gap;} |
11 | 13 | offset+=extent+gap; |
12 | 14 | } |
13 | 15 | const length=rows.length?offset-gap:0; |
14 | | - return {direction,columns:count,rows,frames,width:direction==='horizontal'?length:columnWidths.reduce((a,b)=>a+b,0)+Math.max(0,count-1)*gap,height:direction==='horizontal'?height:length}; |
| 16 | + return {direction,columns:count,rows,frames,width:direction==='horizontal'?length:layoutWidth,height:direction==='horizontal'?height:length}; |
15 | 17 | } |
16 | 18 | export function visibleReaderWindow(layout,bounds,active=1,buffer=4){ |
17 | 19 | const horizontal=layout.direction==='horizontal',start=horizontal?bounds.left:bounds.top,end=horizontal?bounds.right:bounds.bottom; |
|
0 commit comments