1 |
from __future__ import nested_scopes |
from __future__ import nested_scopes |
2 |
from gzz.index import XuLink |
from gzz.index import XuLink |
3 |
from gzz.gfx.gl import Stencil |
from gzz.gfx.gl import Stencil |
4 |
|
from gzz.vob.buoy import NadirAngler |
5 |
|
|
6 |
|
from gzz.view import pagespanview |
7 |
|
from gfx.libutil import effects |
8 |
|
reload(pagespanview) |
9 |
|
|
10 |
# Now, this is the start of the REAL demo, the one |
# Now, this is the start of the REAL demo, the one |
11 |
# with Xanadu links between PDF and text. |
# with Xanadu links between PDF and text. |
20 |
AbstractUpdateManager.fractCalc = AbstractUpdateManager.LinearCalculator() |
AbstractUpdateManager.fractCalc = AbstractUpdateManager.LinearCalculator() |
21 |
|
|
22 |
from test.tools import tools |
from test.tools import tools |
|
execfile("gfx/libutil/effects.py") |
|
|
execfile("gfx/libpaper/papermill.py") |
|
23 |
|
|
24 |
space = gzz.impl.ModularSpace(*tools.spaceArgList()) |
space = gzz.impl.ModularSpace(*tools.spaceArgList()) |
25 |
xuindexer = gzz.index.impl.TransientXuIndexer() |
xuindexer = gzz.index.impl.TransientXuIndexer() |
74 |
globalx = 0 |
globalx = 0 |
75 |
globaly = 0 |
globaly = 0 |
76 |
|
|
77 |
globalusefancypaper = 0 |
globalusefancypaper = 1 |
|
globalseedoffs = 8 |
|
78 |
|
|
79 |
globalcurlinks = {} |
globalcurlinks = {} |
80 |
|
|
|
globalLOD = 1 |
|
81 |
|
|
82 |
def takeLink(toenf, tocell): |
def takeLink(toenf, tocell): |
83 |
"""Move along a xu connection to given cell (with given enf). |
"""Move along a xu connection to given cell (with given enf). |
90 |
p = s.getLocation() |
p = s.getLocation() |
91 |
d = s.getSize() |
d = s.getSize() |
92 |
scale = 1 / 72.0 / 6 |
scale = 1 / 72.0 / 6 |
93 |
x = (p.x + 0.5*d.width) * scale + globalpap[0][1][1] * 1.02 * page |
x = (p.x + 0.5*d.width) |
94 |
y = (p.y + 0.5*d.height) * scale |
y = (p.y + 0.5*d.height) |
95 |
|
(x,y) = globalview.paperpoint(page, x, y) |
96 |
print "Takelink: to ",x,y |
print "Takelink: to ",x,y |
97 |
print ": ",page, p, d, scale, s |
print ": ",page, p, d, scale, s |
98 |
return (x,y) |
return (x,y) |
124 |
AbstractUpdateManager.chg() |
AbstractUpdateManager.chg() |
125 |
|
|
126 |
def getCellPDFView(cell): |
def getCellPDFView(cell): |
127 |
return CellPDFView(cell) |
return pagespanview.CellPDFView(cell) |
|
|
|
|
class CellPDFView: |
|
|
def __init__(self, cell): |
|
|
self.white = getDListNocoords("Color 1 1 1") |
|
|
self.black = getDListNocoords("Color 0 0 0") |
|
|
self.cell = cell |
|
|
self.content = space.cellTexter.getEnfilade(cell, None) |
|
|
self.pap = getPDFPapers(self.content) |
|
|
self.irregu = IrreguFrame(0, 0, self.pap[0][1] / self.pap[0][2] * len(self.pap), 1, |
|
|
0.06, 0.5) |
|
|
self.papersize = (self.pap[0][1] * len(self.pap), self.pap[0][2]) |
|
|
# self.irregu = IrreguFrame(-1, -1, 1, 1, 0.06, 0.5) |
|
|
# Height = always 1. |
|
|
# Start = always (0,0) |
|
|
def placepapers(self, vs, |
|
|
cs1into, onlypages=None, depth=10, |
|
|
cliprect = None): |
|
|
key = self.cell.getId() |
|
|
# The height in coords |
|
|
h = 1 |
|
|
papers = self.pap |
|
|
ph = papers[0][2] |
|
|
scale = h/ph |
|
|
self.curx = 0 |
|
|
ycoord = 0 |
|
|
# print "x,y for place: ",curx, ycoord |
|
|
# print papers |
|
|
grid = 13 |
|
|
corners = (0, 0, papers[0][1], papers[0][2]) |
|
|
cs2 = vs.coords.affineCoordsys(0, 0, 0, 0, 1, 0, 0, 1) |
|
|
vs.matcher.add(cs2, key+"_p2_") |
|
|
|
|
|
class PutPapers(java.lang.Runnable): |
|
|
def run(rself): |
|
|
for i in range(0, len(papers)): |
|
|
# create always all cs, gets interpolation better |
|
|
cs1 = vs.coords.affineCoordsys(cs1into, 100, |
|
|
self.curx, ycoord, scale, 0, 0, scale) |
|
|
vs.matcher.add(cs1, key+"_p_"+str(i)) |
|
|
if onlypages == None or i in onlypages: |
|
|
if globalusefancypaper: |
|
|
pq = GLRen.createPaperQuad( |
|
|
papers[i][3], *corners) |
|
|
vs.map.put(pq, cs1, cs2) |
|
|
else: |
|
|
pq = GLRen.createPaperQuad( |
|
|
papers[i][0], *corners) |
|
|
vs.map.put(pq, cs1, cs2) |
|
|
self.curx += papers[i][1] * scale |
|
|
|
|
|
pp = PutPapers() |
|
|
if cliprect and 0: |
|
|
irr = vs.coords.affineCoordsys(0, 0, |
|
|
(cliprect[0]+cliprect[2])/2, |
|
|
(cliprect[1]+cliprect[3])/2, |
|
|
(cliprect[2]-cliprect[0])/2, |
|
|
0, 0, |
|
|
(cliprect[3]-cliprect[1])/2) |
|
|
vs.matcher.add(irr, key+"_irr") |
|
|
|
|
|
class FrameR(java.lang.Runnable): |
|
|
def run(rself): |
|
|
vs.map.put(self.black) |
|
|
vs.map.put(self.irregu.frame, cs1into, irr) |
|
|
class ContentR(java.lang.Runnable): |
|
|
def run(rself): |
|
|
vs.map.put(self.white) |
|
|
vs.map.put(self.irregu.content, cs1into, irr) |
|
|
|
|
|
if 0: |
|
|
vs.map.put(getDListNocoords(""" |
|
|
PolygonMode FRONT_AND_BACK LINE |
|
|
""")) |
|
|
ContentR().run() |
|
|
|
|
|
if 1: |
|
|
Stencil.drawStenciled(vs, |
|
|
ContentR(), |
|
|
None, |
|
|
FrameR(), |
|
|
pp, |
|
|
0) |
|
|
|
|
|
else: |
|
|
pp.run() |
|
|
def paperpoint(self, page, pointx, pointy): |
|
|
return ( |
|
|
page * self.papersize[0] + pointx/72.0/6, pointy/72.0/6 |
|
|
) |
|
128 |
|
|
129 |
|
|
130 |
|
|
|
globalscrollblockPapers = {} |
|
|
def getScrollblockPaper(sb): |
|
|
"""Get the paper object for a given scrollblock. |
|
|
""" |
|
|
hashkey = sb.hashCode() + globalseedoffs |
|
|
ret = globalscrollblockPapers.get(hashkey, None) |
|
|
if ret == None: |
|
|
ret = ThePaperMill().getPaper(hashkey) |
|
|
ret.setNPasses(3) |
|
|
globalscrollblockPapers[hashkey] = ret |
|
|
return ret |
|
|
|
|
|
def getPDFPapers(content): |
|
|
contentspan = enf2span(content) |
|
|
scrollblockPaper = getScrollblockPaper(contentspan.getScrollBlock()) |
|
|
ret = [] |
|
|
for i in range(0, content.length()): |
|
|
rect = GLSpans.getRect(contentspan.subSpan(i,i+1), globalLOD) |
|
|
print "Rect: ",globalLOD, rect |
|
|
ret.append( pdfpaper(rect, scrollblockPaper) ) |
|
|
return ret |
|
|
|
|
|
|
|
|
|
|
131 |
def globalkey(key): |
def globalkey(key): |
132 |
global globalusefancypaper, globalseedoffs, globalLOD |
global globalusefancypaper |
133 |
if '1' <= key <= '9': |
if '1' <= key <= '9': |
134 |
moveToCell(cells[int(key)-1]) |
moveToCell(cells[int(key)-1]) |
135 |
elif key == 'l': |
elif key == 'l': |
136 |
globalLOD = 1 - globalLOD |
pagespanview.globalLOD = 1 - pagespanview.globalLOD |
137 |
print "Lod: ",globalLOD |
print "Lod: ",pagespanview.globalLOD |
138 |
AbstractUpdateManager.chg() |
AbstractUpdateManager.chg() |
139 |
elif key == 'p': |
elif key == 'p': |
140 |
globalusefancypaper = not globalusefancypaper |
globalusefancypaper = not globalusefancypaper |
141 |
elif key == ',': |
elif key == ',': |
142 |
globalseedoffs -= 1 |
pagespanview.globalseedoffs -= 1 |
143 |
moveToCell(globalcursor) |
moveToCell(globalcursor) |
144 |
elif key == '.': |
elif key == '.': |
145 |
globalseedoffs += 1 |
pagespanview.globalseedoffs += 1 |
146 |
moveToCell(globalcursor) |
moveToCell(globalcursor) |
147 |
|
|
148 |
def pdfpaper(pdfrect, background): |
# Show the intended screen size |
|
"""Get the papers for the pages. |
|
|
|
|
|
Returns: (pdf on white background, width, height, |
|
|
pdf on given background paper) |
|
|
""" |
|
|
# Papercoords: (0,0) .. (w,h) where |
|
|
# w = pdfrect.w / 72 / 6, same for h |
|
|
# ret: (paper, w, h) |
|
|
pw = pdfrect.w / 72.0 / 6 |
|
|
ph = pdfrect.h / 72.0 / 6 |
|
|
wm = (pdfrect.x1-pdfrect.x0) / pw |
|
|
hm = (pdfrect.y1-pdfrect.y0) / ph |
|
|
def mpap(blend, pap = None): |
|
|
if pap == None: |
|
|
pap = Paper() |
|
|
pap.setNPasses(1) |
|
|
ppass = pap.getPass(0) |
|
|
else: |
|
|
p = pap.getNPasses() |
|
|
pap.setNPasses(p+1) |
|
|
ppass = pap.getPass(p) |
|
|
|
|
|
texid = pdfrect.texId |
|
|
ppass.setSetupcode(""" |
|
|
PushAttrib ENABLE_BIT TEXTURE_BIT COLOR_BUFFER_BIT |
|
|
ActiveTexture TEXTURE1 |
|
|
Disable TEXTURE_2D |
|
|
ActiveTexture TEXTURE0 |
|
|
Enable BLEND |
|
|
Disable REGISTER_COMBINERS_NV |
|
|
%(blend)s |
|
|
Disable DEPTH_TEST |
|
|
Color 1 1 1 |
|
|
SecondaryColorEXT 0 0 0 |
|
|
Enable TEXTURE_2D |
|
|
Disable ALPHA_TEST |
|
|
|
|
|
BindTexture TEXTURE_2D %(texid)s |
|
|
TexParameter TEXTURE_2D TEXTURE_WRAP_S REPEAT |
|
|
TexParameter TEXTURE_2D TEXTURE_WRAP_T REPEAT |
|
|
TexParameter TEXTURE_2D TEXTURE_MIN_FILTER LINEAR_MIPMAP_LINEAR |
|
|
TexParameter TEXTURE_2D TEXTURE_MAG_FILTER LINEAR |
|
|
""" % locals()) |
|
|
|
|
|
ppass.setTeardowncode("""PopAttrib""") |
|
|
ppass.setNTexGens(1) |
|
|
ppass.putNormalTexGen(0, [wm, 0, 0, pdfrect.x0, |
|
|
0, hm, 0, pdfrect.y0, |
|
|
0, 0, 1, 0, |
|
|
0, 0, 0, 1]) |
|
|
return pap |
|
|
papw = mpap("BlendFunc SRC_COLOR ZERO") |
|
|
papo = mpap(nvcode.combinercode(""" |
|
|
Enable REGISTER_COMBINERS_NV |
|
|
CombinerParameterNV NUM_GENERAL_COMBINERS_NV 1 |
|
|
FCI A TEXTURE0 UNSIGNED_INVERT_NV RGB |
|
|
FCI B ZERO UNSIGNED_INVERT_NV RGB |
|
|
FCI C ZERO UNSIGNED_IDENTITY_NV RGB |
|
|
FCI D ZERO UNSIGNED_IDENTITY_NV RGB |
|
|
FCI G ZERO UNSIGNED_IDENTITY_NV ALPHA |
|
|
BlendFunc ONE ONE_MINUS_SRC_COLOR |
|
|
BlendEquation FUNC_REVERSE_SUBTRACT |
|
|
"""), pap = background.clone()) |
|
|
return (papw, pw, ph, papo) |
|
|
|
|
149 |
def bg(vs): |
def bg(vs): |
150 |
putnoc(vs, background((0.3,0.5,0.4))) |
putnoc(vs, background((0.3,0.5,0.4))) |
151 |
putnoc(vs, getDListNocoords(""" |
putnoc(vs, getDListNocoords(""" |
182 |
p0 = view.paperpoint(linkspan.offset(), p.x, p.y) |
p0 = view.paperpoint(linkspan.offset(), p.x, p.y) |
183 |
p1 = view.paperpoint(linkspan.offset(), p.x+d.width, p.y+d.height) |
p1 = view.paperpoint(linkspan.offset(), p.x+d.width, p.y+d.height) |
184 |
|
|
185 |
|
print "page, loc, size: ", linkspan.offset(), p, d |
186 |
|
print "P0, P1: ",p0, p1 |
187 |
|
|
188 |
cs1 = floater.addBuoy(anchorX, anchorY, importance, m.getId(), 0, 0) |
cs1 = floater.addBuoy(anchorX, anchorY, importance, m.getId(), 0, 0) |
189 |
eye = 0.2 |
eye = 0.2 |
190 |
cs1_zoom= vs.coords.distort(cs1, 0, 0, eye, eye, 100, 100) |
buoyscale = 200 |
191 |
|
cs1_zoom= vs.coords.distort(cs1, 0, 0, eye, eye, buoyscale, buoyscale) |
192 |
vs.matcher.add(cs1_zoom, cell.getId()+"__bulg") |
vs.matcher.add(cs1_zoom, cell.getId()+"__bulg") |
193 |
|
|
194 |
# cs1_trans = vs.coords.translateXY(cs1_zoom, - (p0[0]+p1[0])/2, - (p0[1]+p1[1])/2) |
cs1_trans = vs.coords.translateXY(cs1_zoom, - (p0[0]+p1[0])/2, - (p0[1]+p1[1])/2) |
195 |
cs1_trans = vs.coords.translateXY(cs1_zoom, 0, 0) |
# cs1_trans = vs.coords.translateXY(cs1_zoom, 0, 0) |
196 |
vs.matcher.add(cs1_trans, cell.getId()+"__trans") |
vs.matcher.add(cs1_trans, cell.getId()+"__trans") |
197 |
|
|
198 |
view.placepapers(vs, cs1_trans, cliprect = (p0[0], p0[1], p1[0], p1[1])) |
view.placepapers(vs, cs1_trans, cliprect = (p0[0], p0[1], p1[0], p1[1]), |
199 |
|
fancy = globalusefancypaper) |
200 |
|
|
201 |
|
|
202 |
class XuPDFScene_PDFContext: |
class XuPDFScene_PDFContext: |
206 |
self.ctry = screensize[1]/2 |
self.ctry = screensize[1]/2 |
207 |
self.rad = screensize[1]/2 |
self.rad = screensize[1]/2 |
208 |
self.nadir = NadirAngler(self.ctrx, screensize[1]*2) |
self.nadir = NadirAngler(self.ctrx, screensize[1]*2) |
209 |
self.showcontext = 0 |
self.showcontext = 1 |
210 |
self.clip = 0 |
self.clip = 0 |
211 |
def key(self, key): |
def key(self, key): |
212 |
global currentScene |
global currentScene |
228 |
AbstractUpdateManager.chg() |
AbstractUpdateManager.chg() |
229 |
def scene(self, vs): |
def scene(self, vs): |
230 |
bg(vs) |
bg(vs) |
231 |
bf = NadirCircleFloater_NoAnchor(vs, (self.ctrx, self.ctry), self.rad, |
bf = effects.NadirCircleFloater_NoAnchor(vs, (self.ctrx, self.ctry), self.rad, |
232 |
self.nadir, 1) |
self.nadir, 1) |
233 |
bfforw = NadirCircleFloater_NoAnchor(vs, (self.ctrx, self.ctry), self.rad, |
bfforw = effects.NadirCircleFloater_NoAnchor(vs, (self.ctrx, self.ctry), self.rad, |
234 |
self.nadir, -1) |
self.nadir, -1) |
235 |
print "Context" |
print "Context" |
236 |
|
|
251 |
extray = 0.1 |
extray = 0.1 |
252 |
clip = (0-extrax, -extray, w+extrax, 1+extray) |
clip = (0-extrax, -extray, w+extrax, 1+extray) |
253 |
|
|
254 |
globalview.placepapers(vs, cs1_trans, cliprect = clip) |
globalview.placepapers(vs, cs1_trans, cliprect = clip, |
255 |
|
fancy = globalusefancypaper) |
256 |
|
|
257 |
if self.showcontext: |
if self.showcontext: |
258 |
for forwlink in globalforw: |
for forwlink in globalforw: |
284 |
AbstractUpdateManager.chg() |
AbstractUpdateManager.chg() |
285 |
def scene(self, vs): |
def scene(self, vs): |
286 |
bg(vs) |
bg(vs) |
287 |
bf = NadirCircleFloater_NoAnchor(vs, |
bf = effects.NadirCircleFloater_NoAnchor(vs, |
288 |
screenctr, 100, None, 1) |
screenctr, 100, None, 1) |
289 |
cs1 = bf.addCentralBuoy(globalcursor.getId()) |
cs1 = bf.addCentralBuoy(globalcursor.getId()) |
290 |
# cs1_zoom = vs.coords.affineCoordsys(cs1, 0, 0, 0, |
# cs1_zoom = vs.coords.affineCoordsys(cs1, 0, 0, 0, |
307 |
# placepapers(vs, cs1_trans, globalpap, globalcursor.getId()) |
# placepapers(vs, cs1_trans, globalpap, globalcursor.getId()) |
308 |
|
|
309 |
|
|
310 |
currentScene = XuPDFScene_PDFZoom() |
currentScene = XuPDFScene_PDFContext() |
311 |
moveToCell(cells[0]) |
moveToCell(cells[0]) |
312 |
|
|