-- FEPSIvOutput.mesa
-- Copyright (C) Xerox Corporation 1985. All rights reserved.
-- last edited by castillo 19-Jun-85 10:04:22
DIRECTORY
FEPSMergerOps USING [OutputH],
Interpress USING [LongOperator],
NSSegment USING [PageCount, PageNumber],
Stream USING [Handle],
XeroxCompress USING [PutBitsProc];
FEPSIvOutput: DEFINITIONS
SHARES Interpress =
BEGIN OPEN IP: Interpress;
--
-- This module defines the interface to FEPS output routines whose
-- primary job is to write data to the output. This
-- interface was created to hide various output and efficiency
-- specifics from rest of FEPS merge routine. The implementation is
-- assumed NOT to be reentrant.
--
-- Initialize must be called first to start things off.
-- outputH ... is the handle to output object. Usually it
-- is FEPSMergerOps.OutputH which contains NSFile
-- handle. It could be different for the test
-- environment.
-- initialSize ... is the initial size of the output file in pages.
-- growIncrement ... is the size that the file should grow every
-- time the size is exceeded.
-- bufferSize ... is the size of the buffer to be used.
--
-- PutBits writes the specified number of bits to the output. The
-- bits can be up to 16 bits. This routine exists mainly for the
-- Xerox compression algorthm which deals with nibbles (ugh!).
-- PutBits can only be called while in Bit Mode. Bit Mode is
-- entered with EnterBitMode call; it is ended with ExitBitMode
-- call. All other output routine cannot be called while in Bit
-- Mode. (Primarily done for efficiency)
--
-- PutByte writes the specified number bytes to the output.
--
-- Retrieve reads, from the input stream, specified number of bytes
-- and writes it out to the output.
--
-- GetCurrentPosition is called to retrieve the current output
-- position of the output. SetPosition is called to set the current
-- position.
--
--
-- CloseOutput will get rid of output buffers and excess pages
-- allocated to the file. It should be called after all output has
-- been completed.
--
-- EmptyOutput will get rid of output buffers and set the size to
-- zero.
--
-- IP* calls are used to put Interpress operands and operators into
-- the output.
--
-- =====
-- TYPES
-- =====
Position: TYPE = RECORD [
page: NSSegment.PageNumber,
offset: LONG CARDINAL];
-- ========
-- CONSTANTS
-- =========
startPos: Position = [0,0];
-- =======
-- SIGNALS
-- =======
ExceptionKind: TYPE = {noResources, unknown};
Exception: SIGNAL [code: ExceptionKind];
-- This signal is resumable if code is noResources
-- ==========
-- PROCEDURES
-- ==========
-- General output routines
Initialize: PROCEDURE [
output: FEPSMergerOps.OutputH,
initialSize: NSSegment.PageCount,
growIncrement: NSSegment.PageCount,
bufferSize: NSSegment.PageCount];
PutBits: XeroxCompress.PutBitsProc;
PutByte: PROCEDURE [val: CARDINAL];
PutWord: PROCEDURE [val: CARDINAL];
Retrieve: PROCEDURE [inputSH: Stream.Handle, byteCount: LONG CARDINAL];
GetCurrentPosition: PROCEDURE RETURNS [pos: Position];
SetPosition: PROCEDURE [pos: Position];
CloseOutput: PROCEDURE;
EmptyOutput: PROCEDURE;
-- Interpress output routines
IPDo: PROCEDURE = INLINE {OpOnly[do]};
IPFindDecompressor: PROCEDURE = INLINE {OpOnly[findDecompressor]};
IPIdentifier: PROCEDURE [s: LONG STRING];
IPInteger: PROCEDURE [n: LONG INTEGER, length: CARDINAL ← 0];
IPMakePixelArray: PROCEDURE = INLINE {OpOnly[makePixelArray]};
IPMaskPixel: PROCEDURE = INLINE {OpOnly[maskPixel]};
IPRational: PROCEDURE [num: LONG INTEGER, den: LONG CARDINAL];
IPScale: PROCEDURE = INLINE {OpOnly[scale]};
IPSeqCompressedPixel: PROCEDURE [size: LONG CARDINAL];
OpOnly: PRIVATE PROCEDURE [code: IP.LongOperator];
END...
LOG
6Sep84 - Okamoto - Conceived and created.
20Nov84 - Okamoto - Changed FreeOutput to CloseOutput and added EmptyOutput.
19Jun85 - castillo - copyright notice.