-- 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.