diff options
Diffstat (limited to 'lib/plio.h')
-rw-r--r-- | lib/plio.h | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/lib/plio.h b/lib/plio.h new file mode 100644 index 00000000..1cd37ed3 --- /dev/null +++ b/lib/plio.h @@ -0,0 +1,186 @@ +# PLIO.H -- Package internal global defines for the Pixel List package. + +# Size limiting definitons +define PL_MAXDIM 7 # maximum mask dimensionality +define PL_MAGICVAL 2014 # identifies mask and version no. +define PL_LLBUFLEN 512 # initial llbuf size +define PL_STARTINC 512 # starting llbuf increment on overflow +define PL_MAXINC 4096 # maximum increment per resize +define PL_MAXFREE 40 # max percent free (wasted) space +define PL_MAXDEPTH 27 # max mask depth, bits +define PL_DEFMAXLINE 1024 # default max elements per [lr]list + +# Main PL descriptor. +define LEN_PLDES 28 +define MLO 3 # must update PLSET.H too if changed + +define PL_MAGIC Memi[$1] # magic / version no. +define PL_PRIVATE1 Memi[$1+1] # private data for client +define PL_PRIVATE2 Memi[$1+2] # more private data for client +define PL_MAXLINE Memi[$1+MLO] # max elements per [lr]list [PLSET.H] +define PL_MAXVAL Memi[$1+4] # max pixel value (2**N - 1) +define PL_NAXES Memi[$1+5] # dimensionality +define PL_AXLEN Memi[$1+6+$2-1] # length of each axis +define PL_PLANE Memi[$1+13+$2-1] # active plane (pl_setplane) +define PL_LLBP Memi[$1+20] # line list bufptr +define PL_LLOP Memi[$1+21] # next location in llbuf +define PL_LLLEN Memi[$1+22] # current llbuf length +define PL_LLFREE Memi[$1+23] # amount of free space in list +define PL_LLNUPDATES Memi[$1+24] # number of list modifications +define PL_LLINC Memi[$1+25] # current llbuf increment on overflow +define PL_NLP Memi[$1+26] # number of line pointers +define PL_LPP Memi[$1+27] # ptr to array of LL offsets + +define PM_REFIM PL_PRIVATE1($1) # reference image +define PM_MAPXY PL_PRIVATE2($1) # need to transform coords + +# Handy macros. +define Ref (PL_LLBP($1)+$2)# llbuf offset -> pointer +define LL Mems[Ref($1,$2)]# pointer -> array reference +define PL_LP Memi[PL_LPP($1)+$2-1] +define PL_EMPTYLINE 0 # llbuf offset of the empty line +define PL_NEEDCOMPRESS ((PL_LLFREE($1)*100/PL_LLOP($1))>PL_MAXFREE) +define LL_MAXLEN PL_MAXLINE($1) +define RL_MAXLEN (PL_MAXLINE($1)*3) +define MV ((2**min($1,27))-1) + +# Handy rasterop decoding macros. +define R_OPCODE and($1,17B) +define R_DATA ($1/100B) +define R_NEED_DST (and(xor(($1)/2,($1)),5)!=0) +define R_NEED_SRC (and(xor(($1)/4,($1)),3)!=0) +define R_NOTDST (and($1,6)==4) +define R_NOTSRC (and($1,6)==2) + +# Internal rasterop definitions (PIX_SRC=14B, PIX_DST=12B, CLR=0B, SET=17B). +define PIX_NOTSRC 03B +define PIX_NOTDST 05B +define PIX_SRC_AND_DST 10B +define PIX_SRC_OR_DST 16B +define PIX_SRC_XOR_DST 06B +define PIX_SRC_AND_NOTDST 04B +define PIX_SRC_OR_NOTDST 15B +define PIX_NOTSRC_AND_DST 02B +define PIX_NOTSRC_OR_DST 13B +define PIX_NOT_SRC_AND_DST 07B +define PIX_NOT_SRC_OR_DST 01B +define PIX_NOT_SRC_XOR_DST 11B + + +# Macro defines for the line list data format. + +# ----- Old/original line list header definitions. This version uses a +# ----- three element header, but the maximum values are limited to 32K by +# ----- the use of type short. + +# Line list definitions (accessed as a short integer array). +define OLL_NREF $1[1] # number of references +define OLL_BLEN $1[2] # length of buffer containing LL +define OLL_LEN $1[3] # length of encoded line list +define OLL_FIRST 4 # first data range entry in list + +# Line list definitions (accessed via a short integer pointer). +define OLP_NREF Mems[$1] # number of references +define OLP_BLEN Mems[$1+1] # length of buffer containing LL +define OLP_LEN Mems[$1+2] # length of encoded line list +define OLP_FIRST 3 # first data range entry in list + + +# ----- New format line list header definitions. This version uses a +# ----- variable length header and a version number to allow new encodings +# ----- while retaining backwards compatibility. + +define LL_CURVERSION (-100) # LL version code (must be negative) +define LL_OLDFORMAT (LL_VERSION($1) > 0) +define LL_CURHDRLEN 7 + +# Line list definitions (accessed as a short integer array). +define LL_NREFS $1[1] # number of references +define LL_HDRLEN $1[2] # length of encoded line list +define LL_VERSION $1[3] # version number (negative) +define LL_LENLO $1[4] # length of encoded line list +define LL_LENHI $1[5] # length of encoded line list +define LL_BLENLO $1[6] # length of LL buffer +define LL_BLENHI $1[7] # length of LL buffer + +# Handy line list macros. +define LL_NREF (int(LL_NREFS($1))) +define LL_BLEN ((int(LL_BLENHI($1)))*32768+(int(LL_BLENLO($1)))) +define LL_SETBLEN LL_BLENLO($1)=mod($2,32768); LL_BLENHI($1)=($2)/32768 +define LL_LEN ((int(LL_LENHI($1)))*32768+(int(LL_LENLO($1)))) +define LL_SETLEN LL_LENLO($1)=mod($2,32768); LL_LENHI($1)=($2)/32768 +define LL_FIRST (LL_HDRLEN($1)+1) + +# Line list definitions (accessed as a short integer pointer). +define LP_NREFS Mems[$1] # number of references +define LP_HDRLEN Mems[$1+1] # length of encoded line list +define LP_VERSION Mems[$1+2] # version number (negative) +define LP_LENLO Mems[$1+3] # length of encoded line list +define LP_LENHI Mems[$1+4] # length of encoded line list +define LP_BLENLO Mems[$1+5] # length of LL buffer +define LP_BLENHI Mems[$1+6] # length of LL buffer + +# Handy line list pointer macros. +define LP_NREF (int(LP_NREFS($1))) +define LP_BLEN (int(LP_BLENHI($1))*32768+int(LP_BLENLO($1))) +define LP_SETBLEN LP_BLENLO($1)=mod($2,32768); LP_BLENHI($1)=($2)/32768 +define LP_LEN (int(LP_LENHI($1))*32768+int(LP_LENLO($1))) +define LP_SETLEN LP_LENLO($1)=mod($2,32768); LP_LENHI($1)=($2)/32768 +define LP_FIRST (($1)+LP_HDRLEN($1)) + + +# Packed instruction decoding. +define I_SHIFT 10000B # shift to encode/decode data bits +define I_DATA and(int($1),7777B) # extract data +define I_OPCODE (($1)/10000B) # extract opcode value +define I_OPCODEMASK and(int($1),70000B) # extract opcode mask +define I_DATAMAX 7777B # max data field value +define I_PVMAX 777777777B # max mask pixel value (27 bits) + +# LL instruction opcodes. +define I_ZN 0 # N zeros +define I_HN 4 # N high values +define I_PN 5 # N-1 zeros and 1 high value +define I_SH 1 # set high value (2 words) +define I_IH 2 # increment high value +define I_DH 3 # decrement high value +define I_IS 6 # increment and output 1 high value +define I_DS 7 # decrement and output 1 high value + +# The LL instruction opcodes again, but as bitmasks this time. +define M_ZN 00000B +define M_HN 40000B +define M_PN 50000B +define M_SH 10000B +define M_IH 20000B +define M_DH 30000B +define M_IS 60000B +define M_DS 70000B + +# The following bit is set if the instruction changes the current position. +define M_MOVE 40000B + +# PL external format descriptor (with some extra space). +define LEN_PLEXTERN 20 +define PLE_MAGIC Memi[$1] # usual magic value +define PLE_NAXES Memi[$1+1] # number of axes +define PLE_AXLEN Memi[$1+2+$2-1] # length of each axis +define PLE_LLOP Memi[$1+9] # next location in llbuf +define PLE_LLLEN Memi[$1+10] # length of llbuf +define PLE_NLP Memi[$1+11] # number of line pointers +define PLE_NLPX Memi[$1+12] # length of compressed LP array +define PLE_EXLEN Memi[$1+13] # length of full PLEXTERN structure +define PLE_FLAGS Memi[$1+14] # flags for type of encoding +define PLE_MAXLINE Memi[$1+15] # max elements per [lr]list +define PLE_MAXVAL Memi[$1+16] # max pixel value + +# PLIO mask savefile descriptor. +define PLIO_SVMAGIC 123126B # "SV" +define LEN_SVDES 3 +define SV_MAGIC Memi[$1] # identifies file type +define SV_TITLELEN Memi[$1+1] # title string length, including EOS +define SV_MASKLEN Memi[$1+2] # encoded mask length, shorts + +# Internal symbols. +define LOOP_DONE 1 +define LOOP_AGAIN 0 |