mirror of
https://github.com/ssb22/scan-reflow.git
synced 2023-06-16 10:02:22 +00:00
229 lines
7.8 KiB
Plaintext
229 lines
7.8 KiB
Plaintext
REM MbmShow.opl v1.12 (c) 2007-2008 Silas S. Brown.
|
|
|
|
REM To compile: Get this into the OPL program editor
|
|
REM (New File, type Program, then find the Import text option)
|
|
REM and use the 'translate' option
|
|
|
|
REM Before compiling, YOU NEED TO CHANGE place_to_look$ BELOW
|
|
REM (the line that says place_to_look$ = "C:\")
|
|
REM (set it to the directory where you put contents.dat, sequence.dat and font*.mbm)
|
|
|
|
REM Licensed under the Apache License, Version 2.0 (the "License");
|
|
REM you may not use this file except in compliance with the License.
|
|
REM You may obtain a copy of the License at
|
|
REM
|
|
REM http://www.apache.org/licenses/LICENSE-2.0
|
|
REM
|
|
REM Unless required by applicable law or agreed to in writing, software
|
|
REM distributed under the License is distributed on an "AS IS" BASIS,
|
|
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
REM See the License for the specific language governing permissions and
|
|
REM limitations under the License.
|
|
|
|
REM Where to find history:
|
|
REM on GitHub at https://github.com/ssb22/scan-reflow
|
|
REM and on GitLab at https://gitlab.com/ssb22/scan-reflow
|
|
REM and on BitBucket https://bitbucket.org/ssb22/scan-reflow
|
|
REM and at https://gitlab.developers.cam.ac.uk/ssb22/scan-reflow
|
|
REM and in China: https://gitee.com/ssb22/scan-reflow
|
|
|
|
|
|
PROC main:
|
|
global seq%,prefix$(255)
|
|
local place_to_look$(255)
|
|
local r%,cFile%,startP&,stopP&
|
|
|
|
place_to_look$ = "C:\"
|
|
|
|
REM First try to open a contents file
|
|
r% = IOOPEN(cFile%,place_to_look$+"contents.dat",$0400+$0200)
|
|
IF r% >= 0
|
|
REM we got a contents file
|
|
REM prompt for a document number
|
|
IOSEEK(cFile%,2,startP&) : REM startP& now points to EOF
|
|
r% = startP& / 4 : REM number of long offsets in contents.dat
|
|
IF r% > 1 : REM we have a choice
|
|
startP& = 1
|
|
dInit "Choose document number"
|
|
dLong startP&,"Number",1,r%
|
|
IF dialog<=0
|
|
REM Escape pressed - assume we don't want to use this contents/sequence and go to general MBM viewing
|
|
startP& = -1
|
|
ENDIF
|
|
ELSE : REM no choice (contents.dat probably written by a script to point us somewhere in sequence.dat)
|
|
startP& = 1
|
|
ENDIF
|
|
IF startP&<>-1
|
|
REM Document number selected in startP&
|
|
REM Get start and end of document into startP& and stopP&
|
|
startP& = (startP&-1)*4
|
|
IOSEEK(cFile%,1,startP&)
|
|
IOREAD(cFile%,ADDR(startP&),4)
|
|
IOREAD(cFile%,ADDR(stopP&),4) : REM doesn't matter if that's EOF (stopP&==0 ok then)
|
|
ENDIF
|
|
IOCLOSE(cFile%) : REM (in case the above-mentioned script wants to write a new contents.dat while we're still running)
|
|
ELSE : PRINT "contents.dat not found"
|
|
ENDIF
|
|
|
|
REM see if we can open a sequence file
|
|
REM (there had better be one if startP& is not 0)
|
|
IF startP& <> -1
|
|
IOOPEN(seq%,place_to_look$+"sequence.dat",$0400+$0200)
|
|
ENDIF
|
|
REM (if startP&==-1 then the user pressed Escape from the document selector, so we ignore any sequence file and fall back to general MBM viewing)
|
|
IF seq%
|
|
REM we have a sequence file
|
|
prefix$ = place_to_look$+"font" : REM .mbm
|
|
ELSE
|
|
REM no sequence.dat - default to displaying any MBM
|
|
REM (so can be used like QuickView, except will display more than one image per slide if can fit)
|
|
dInit "Choose an MBM to view"
|
|
dFile prefix$,"filename",0
|
|
dialog
|
|
IF LOWER$(RIGHT$(prefix$,4))=".mbm": prefix$=LEFT$(prefix$,LEN(prefix$)-4):ENDIF
|
|
startP&=0
|
|
ENDIF
|
|
|
|
show:(startP&,stopP&)
|
|
|
|
ENDP
|
|
|
|
PROC show:(startP&, stopP&)
|
|
REM Show as slides from position startP& to position stopP& (not including stopP&)
|
|
REM stopP&=0 for show to EOF
|
|
|
|
REM Expects the following globals:
|
|
REM seq% is the sequence file (or 0)
|
|
REM prefix$ is the base filename of the MBMs
|
|
|
|
global minLines% : REM (minimum lines-per-screen seen so far - used for leading)
|
|
global gWin%(3),sMax%,pos&(10),pStop&
|
|
local slideNo%,dir%,r%,oldDir%
|
|
|
|
pStop& = stopP&
|
|
pos&(1) = startP&
|
|
|
|
REM gcreate loop
|
|
REM (re-using dir% as a temporary before main loop starts)
|
|
dir%=1 : WHILE dir%<=3
|
|
gWin%(dir%)=gcreate(0, 0, gWidth, gHeight, 1, 1)
|
|
dir%=dir%+1
|
|
ENDWH
|
|
r%=load%:(0) : REM get the first side in
|
|
slideNo% = 0 : dir% = 1
|
|
WHILE 1
|
|
gOrder gWin%(offset%:(slideNo%,3)), 1
|
|
gUse gWin%(offset%:(slideNo%,3)) : gVisible on
|
|
IF slideNo%+dir%>=0 : r%=load%:(slideNo%+dir%) : ENDIF
|
|
oldDir%=dir%
|
|
if GET=27 : dir% = -1 : ELSE : dir%=1 : ENDIF
|
|
IF slideNo%+dir%>=0 : slideNo% = slideNo% + dir% : ENDIF
|
|
IF r%=0 AND dir%=oldDir% : giprint "Ctrl-Esc to exit" : ENDIF : REM because we're about to gVisible a blank slide
|
|
ENDWH
|
|
ENDP
|
|
|
|
PROC offset%:(a%,max%)
|
|
RETURN a%-INT(a%/max%)*max% + 1
|
|
ENDP
|
|
|
|
PROC load%:(slideNo%)
|
|
REM Loads slide slideNo% into an off-screen window
|
|
REM Returns 1 if put something in the window, 0 if blank
|
|
REM Expects globals from PROC show, including:
|
|
REM sMax% is the highest slide no. so far (including slideNo%; will be incremented if ==slideNo%)
|
|
REM gWin% is the array of windows (offset will be slideNo% MOD 3)
|
|
REM pos& is the array of last 10 slides' position starts (if slideNo%==0, pos&(1) should be set to start pos; after that, this function maintains pos& and sMax%)
|
|
REM pStop& is the position to stop at (or 0 for stop at EOF)
|
|
|
|
LOCAL id%, h%, w%, c%, t%
|
|
LOCAL maxH% : REM the max height of images on this line
|
|
LOCAL gW%, p&
|
|
LOCAL r% : REM return value
|
|
|
|
gW% = gWin%(offset%:(slideNo%,3))
|
|
guse gW%
|
|
gvisible off
|
|
gCls
|
|
|
|
IF slideNo%<sMax%-10
|
|
gAt 0,100 : gPrint "Cache empty - go forward again"
|
|
RETURN r% : REM too far back (TODO may still be able to go back 1 bitmap at a time, or make up a slide backwards (running the code twice if necessary) or something)
|
|
ENDIF
|
|
p& = pos&(offset%:(slideNo%,10))
|
|
|
|
IF seq%
|
|
IF IOSEEK(seq%,1,p&) < 0 : GOTO finish : ENDIF
|
|
ELSE : c% = p& - 1 : REM -1 because the first thing we do is add 1 to it
|
|
ENDIF
|
|
|
|
WHILE pStop&=0 OR p&<pStop&
|
|
|
|
IF seq%
|
|
IF IOREAD(seq%,ADDR(c%),2) < 0 : BREAK : ENDIF : REM EOF
|
|
p& = p& + 2
|
|
ELSE : c% = UADD(c%,1) : p&=p&+1 : ENDIF
|
|
|
|
REM print character number c%
|
|
IF c%<0 : id%=(65536+c%)/510
|
|
ELSE : id%=c%/510 : ENDIF : REM (510 bitmaps in each mbm, unsigned division)
|
|
ONERR finish
|
|
IF id% > 0 : id%=gLOADBIT(prefix$+HEX$(id%)+".mbm",0,USUB(c%,id%*510))
|
|
ELSE : id%=gLOADBIT(prefix$+".mbm",0,c%)
|
|
ENDIF
|
|
ONERR OFF
|
|
r% = 1
|
|
gUse id%
|
|
h% = gHeight : w% = gWidth
|
|
gUse gW%
|
|
|
|
IF gWidth - gX < w%
|
|
REM need to go onto next line
|
|
|
|
REM maxH% = gHeight / int(gHeight/maxH%) : REM Round maxH% up to an integer divisor of the screen height (helps with leading, assuming all images are similar height)
|
|
REM (if causes division by zero then one of the images was too wide)
|
|
REM slightly better version that also divides the expected gap at the bottom of the screen between the other leadings:
|
|
t% = gHeight/maxH% : REM number of lines of this height that will fit
|
|
IF NOT minLines% OR t%<minLines% : minLines%=t% : ENDIF
|
|
IF minLines%>1
|
|
t% = gHeight / minLines% : REM height of such lines
|
|
maxH% = t% + (t%-maxH%)/(minLines% - 1)
|
|
ENDIF
|
|
|
|
gMove -gX,maxH% : maxH%=0
|
|
ENDIF
|
|
IF gHeight - gY < h%
|
|
REM Won't fit
|
|
gClose id%
|
|
IF seq%
|
|
REM go back 2 bytes for next slide
|
|
REM and set p& to the correct position
|
|
p& = -2
|
|
IOSEEK(seq%,3,p&)
|
|
ELSE : p&=p&-1
|
|
ENDIF
|
|
BREAK
|
|
ENDIF
|
|
IF h% > maxH% : maxH% = h% : ENDIF
|
|
IF gX=0 AND gWidth>=640 AND w%<gWidth-5 : gMove 5,0 : ENDIF : REM Margin on S7+ if appropriate (not needed on Revo)
|
|
gCopy id%,0,0,w%,h%,3
|
|
gClose id%
|
|
gMove w%,0
|
|
|
|
REM and add a space afterwards:
|
|
h% = h% / 4 : REM to get a rough idea of how much space to leave
|
|
IF gWidth - gX < h% : gMove gWidth-gX,0 : REM make it clear to the code above that we can't fit any more images on this line
|
|
ELSE gMove h%,0 : ENDIF
|
|
|
|
ENDWH
|
|
|
|
finish::
|
|
ONERR OFF
|
|
IF r%=0
|
|
gAt 0,100 : gPrint "No more slides"
|
|
ENDIF
|
|
REM update pos& with start position of next slide (and sMax%)
|
|
pos&(offset%:(slideNo%+1,10)) = p&
|
|
IF slideNo% = sMax% : sMax% = sMax% + 1 : ENDIF
|
|
RETURN r%
|
|
ENDP
|