/[gzz]/gzz/gfx/demo/xupdf.py
ViewVC logotype

Diff of /gzz/gfx/demo/xupdf.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.30 by tjl, Sat Sep 28 19:01:20 2002 UTC revision 1.31 by tjl, Sun Sep 29 14:52:29 2002 UTC
# Line 1  Line 1 
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.
# Line 15  AbstractUpdateManager.defaultAnimationTi Line 20  AbstractUpdateManager.defaultAnimationTi
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()
# Line 71  globalcursor = None Line 74  globalcursor = None
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).
# Line 89  def takeLink(toenf, tocell): Line 90  def takeLink(toenf, tocell):
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)
# Line 122  def moveToCell(cell, nx=1, ny=1): Line 124  def moveToCell(cell, nx=1, ny=1):
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("""
# Line 358  def addbuoy(vs, anchorX, anchorY, import Line 182  def addbuoy(vs, anchorX, anchorY, import
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:
# Line 377  class XuPDFScene_PDFContext: Line 206  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
# Line 399  class XuPDFScene_PDFContext: Line 228  class XuPDFScene_PDFContext:
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    
# Line 422  class XuPDFScene_PDFContext: Line 251  class XuPDFScene_PDFContext:
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:
# Line 454  class XuPDFScene_PDFZoom: Line 284  class XuPDFScene_PDFZoom:
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,
# Line 477  class XuPDFScene_PDFZoom: Line 307  class XuPDFScene_PDFZoom:
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    

Legend:
Removed from v.1.30  
changed lines
  Added in v.1.31

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26