diff options
author | Karl Berry <karl@freefriends.org> | 2023-04-19 01:01:28 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-04-19 01:01:28 +0000 |
commit | 3e2def6e94963836bb73ab92d5b8d766fe70e803 (patch) | |
tree | 97c90ea6fb27f79bb876a4b1e5ccf1e92e455762 | |
parent | 6ef06646134129c8d5cd05f01d7a01e829ae4d68 (diff) |
remove hintview/ dir (sources on github), test build hilatex.fmt
git-svn-id: svn://tug.org/texlive/trunk@66891 c570f23f-e606-0410-a88d-b1316a301751
24 files changed, 8 insertions, 22394 deletions
diff --git a/Build/source/texk/web2c/hitexdir/ChangeLog b/Build/source/texk/web2c/hitexdir/ChangeLog index a547024ec2c..0e9567d39c3 100644 --- a/Build/source/texk/web2c/hitexdir/ChangeLog +++ b/Build/source/texk/web2c/hitexdir/ChangeLog @@ -1,3 +1,10 @@ +2023-04-18 Karl Berry <karl@freefriends.org> + + * tex/Makefile (fmt): also depend on hilatex.fmt, for convenience. + + * hintview/: remove, sources now at https://github.com/ruckertm/HINT, + since it's not compiled as part of TL. + 2023-03-09 Karl Berry <karl@tug.org> * TL'23 release. diff --git a/Build/source/texk/web2c/hitexdir/hintview/README.TXT b/Build/source/texk/web2c/hitexdir/hintview/README.TXT deleted file mode 100644 index dab4b998159..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/README.TXT +++ /dev/null @@ -1,25 +0,0 @@ -This is a first - and very basic - version of a viewer for HINT files. -HINT files can be produced from TeX sources using hitex. - -Build ------ -The present code is tested under Linux, but if you have the -right libraries it should compile under other Linux like systems. - -The build process is defined by the Makefile in the src subdirectory. -Just cd src/ and run make - if you are lucky it will produce the -hintview executable. - -You will need the following libraries and associated header files: -libdl, libglew, libglfw3 libfreetype, libX11, libXrandr, libXinerama, - - -Documentation -------------- -The command line options, keystrokes, and mouse actions are described -in hintview.1 in the man/ subdirectory. - - - - - diff --git a/Build/source/texk/web2c/hitexdir/hintview/man/hintview.1 b/Build/source/texk/web2c/hitexdir/hintview/man/hintview.1 deleted file mode 100644 index dc6d7626e7b..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/man/hintview.1 +++ /dev/null @@ -1,228 +0,0 @@ -.TH HINTVIEW1 "11 November 2021" "Version 1.0" -.\"===================================================================== -.if n .ds MF Metafont -.if t .ds MF Metafont -.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP -.if n .ds TX TeX -.ie t .ds OX \fIT\v'+0.25m'E\v'-0.25m'X\fP -.el .ds OX TeX -.\" BX definition must follow TX so BX can use TX -.if t .ds BX \fRB\s-2IB\s0\fP\*(TX -.if n .ds BX BibTeX -.\" LX definition must follow TX so LX can use TX -.if t .ds LX \fRL\\h'-0.36m'\\v'-0.15v'\s-2A\s0\\h'-0.15m'\\v'0.15v'\fP\*(TX -.if n .ds LX LaTeX -.if t .ds AX \fRA\\h'-0.1667m'\\v'0.20v'M\\v'-0.20v'\\h'-0.125m'S\fP\*(TX -.if n .ds AX AmSTeX -.if t .ds AY \fRA\\h'-0.1667m'\\v'0.20v'M\\v'-0.20v'\\h'-0.125m'S\fP\*(LX -.if n .ds AY AmSLaTeX -.if n .ds WB Web -.if t .ds WB W\s-2EB\s0 -.\"===================================================================== -.SH NAME -hintview\- displaying HINT files -.SH SYNOPSIS -.B hintview -.RI [ options ] -.RI [ file ] -.\"===================================================================== -.SH DESCRIPTION -.B Hintview -displays a binary -.B HINT -file, usually with the -.BR .hnt -extension. -.PP -The binary -.B HINT -file format is designed for on-screen reading of documents. -Using hintview to display a -.B HINT -file, its content will dynamically -adapt to the available display area. For complete information on the -.B HINT -file format and programs to view -.B HINT -files, see -.BR https://hint.userweb.mwn.de . -.\"===================================================================== -.SH OPTIONS -This version of -.B hintview -understands the following command line options: -.TP -.B -a -Start in autoreload mode. If in autoreload mode, the viewer will check -the modification time of the displayed -.B HINT -file each time the cursor enters the window. -If the modification time has changed, the file is reloaded. -The viewer attempts to position the new file at about the same position -as the old file. This attempt might fail if large scale changes have -been made to the file. -.sp -See also the -.B Ctrl-A -and the -.B Ctrl-R -key. -.TP -.B -h -Open the document on the "home" page. The home page is a location -specified by the document author as a good starting point for reading -the document. -.sp -See also the -.B Ctrl-H -key. -.TP -.B --help -Print help message and exit. -.TP -.B -n -Start the viewer in "night" mode. In this mode the viewer will display -the document using a dark background and light foreground color to reduce -eye strain in a surrounding with dim lighting. -.sp -See also the -.B Ctrl-N -key. -.TP -.BI -o -Show a clickable outline of the content. NOT YET IMPLEMENTED. -.sp -See also the -.B Ctrl-O -key. -.TP -.B --version -Print version information and exit. -.TP -.B -z -Zoom to 100%. The -.B HINT -viewer can display a document using a given -zoom factor to make characters appear larger or smaller to either -improve readability or increase the amount of text that can be displayed -in a given window. This option resets the zoom factor so that a 10pt -font will appear on screen at the same size as it would appear in a -printed book. -.sp -See also the -.B Ctrl-Z -key. -.\"===================================================================== -.SH KEYSTROKES -.B Hintview -recognizes the following keystrokes when typed in its window. -.TP -.B Ctrl-A -Toggle autoreload mode. See also the -.B -a -option and the -.B Ctrl-R -key. -.TP -.B Ctrl-F -Open the -.B Find -dialog. NOT YET IMPLEMENTED. -.TP -.BR Home , \ Ctrl-H -Move to the "home" page. The home page is a location specified by the -document author as a good starting point for reading the document. -.TP -.B Ctrl-N -Toggle between night and day mode. See also the -.B -n -option. -.TP -.B Ctrl-O -Show a clickable outline of the content. NOT YET IMPLEMENTED. -.TP -.B Page-Down -Move to the next page. -.TP -.B Page-Up -Move to the previous page. -.TP -.B Ctrl-R -Reload the content. The file is reloaded and the viewer -attempts to position the new file at about the same position -as the old file. This attempt might fail if large scale changes have -been made to the file. See also the -.B Ctrl-A -key and the -.B -a -option. -.TP -.B Ctrl-Z -Zoom to 100%. See also the -.B -z -option. -.\"===================================================================== -.SH MOUSE ACTIONS -The following actions are executed using the -.BR left\ mouse\ button . -.TP -.B Click -If the mouse is positioned on a link, move to the link target. Links are -displayed in blue color. -.TP -.B Drag -Dragging from the top-left to the bottom-right increases the zoom factor. -Dragging in the opposite direction decreases the zoom factor. See also the -.B Ctrl-Z -key and the -.B -z -option. -.\"===================================================================== -.SH NOTES -This is a simple, bare-bone implementation of a program to render -.B HINT -files. Other programs to display -.B HINT -files are available on the -.B HINT -project home page at -.B https://hint.userweb.mwn.de/ -where you find viewers for the Windows and Android operating systems. -.sp -Currently the best way to produce -.B HINT -files is the use of -.BR hitex , -a version of \*(TX that produces -.B HINT -files as its output. The -.B HINT -file format is described in -.IR "HINT: The file format" -which is available as a book or in electronic form from the -.B HINT -project home page. The -.B HINT -file format is independent of \*(TX and allows the implementation -of generators for all kind of word-processors. The -.B hintview -program however uses parts of Donald E. Knuth's implementation -of \*(TX, notably its line breaking routine, to produce good -quality rendering of documents. -.\"===================================================================== -.SH AVAILABILITY -.B hintview -is tested on the Linux platform but -should compile on a large variety of machine architectures -and operating systems. -It is part of the \*(TX Live distribution. -.PP -.\"===================================================================== -.SH "SEE ALSO" -.BR hitex (1), -.BR histretch (1), -.BR hishrink (1). -.\"===================================================================== -.SH AUTHORS -Martin Ruckert -.\" vim: syntax=nroff diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/Makefile b/Build/source/texk/web2c/hitexdir/hintview/src/Makefile deleted file mode 100644 index fc1e262a431..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/Makefile +++ /dev/null @@ -1,77 +0,0 @@ - -CC = gcc -CFLAGS = -g -Og -DDEBUG -Wall -LDFLAGS = -g -Og -#GL_DEFINES = -DGLEW_STATIC -DTW_NO_DIRECT3D -DTW_NO_LIB_PRAGMA -DTW_STATIC -D_CRT_SECURE_NO_WARNINGS - -FT_INCLUDES = -I/usr/include/freetype2 -GL_INCLUDES = $(FT_INCLUDES) - - -HFILES = hint.h htex.h format.h get.h basetypes.h error.h \ - hrender.h rendernative.h hfonts.h - -WFILES = format.w hint.w htex.ch btex.w - -HINT_FILES = get.c hint.c tables.c htex.c hrender.c hfonts.c \ - $(HFILES) $(WFILES) - - -OBJ=main.o renderOGL.o get.o hint.o tables.o htex.o hrender.o hfonts.o - -ifeq (Msys,$(shell uname -o)) -LIBS= ../external/glfw-3.1.2/msys.build/src/libglfw3.a ../external/libglew.a -lfreetype \ - -lm -lz -# -ldl -lm -lX11 -lpthread -lXrandr -lXinerama -lXi -lXcursor -lGL -lz -else -LIBS= -lglfw -lGLEW -ldl -lfreetype -lX11 -lXrandr -lXinerama -lXi -lXcursor -lGL -lz -lpthread -lm -endif - -all: hintview - -.SUFFIXES: - - -hint.o: hint.c - $(CC) $(CFLAGS) -Wno-unused-but-set-variable -o $@ -c $< - -htex.o: htex.c - $(CC) $(CFLAGS) -Wno-parentheses -Wno-unused-but-set-variable -Wno-maybe-uninitialized -o $@ -c $< - -renderOGL.o: renderOGL.c - $(CC) $(FT_INCLUDES) $(CFLAGS) -o $@ -c $< - -hfonts.o: hfonts.c - $(CC) $(CFLAGS) $(FT_INCLUDES) -o $@ -c $< - -%.o: %.c - $(CC) $(CFLAGS) -o $@ -c $< - -hintview: $(OBJ) - $(CC) $(LDFLAGS) $(OBJ) $(LIBS) -o $@ - -SRC= $(OBJ:.o=.c) $(HFILES) main.h stb_image.h Makefile -DIST_SRC = $(SRC:%=src/%) -DIST_MAN = man/hintview.1 - -hintview.tgz: - tar -c -C .. --transform 's,^,hintview/,' -z -f $@ $(DIST_SRC) $(DIST_MAN) - -BINDIR=/usr/local/bin -MANDIR=/usr/local/man - -install: hintview - strip hintview - install -t $(BINDIR) --mode=755 hintview - install -t $(MANDIR)/man1 --mode=644 ../man/hintview.1 - - -.PHONY: www -www: hintview hintview.tgz - cp hintview hintview.tgz ../man/hintview.1 ../../www/linux/ - -clean: - rm -f *.o *~ *.dvi *.log *.aux - rm -f hintview hintview.tgz - $(MAKE) -C ../../hint viewlinux || true - diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/basetypes.h b/Build/source/texk/web2c/hitexdir/hintview/src/basetypes.h deleted file mode 100644 index e097d2515e0..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/basetypes.h +++ /dev/null @@ -1,50 +0,0 @@ - /*525:*/ - #line 10706 "format.w" - -#ifndef __BASETYPES_H__ -#define __BASETYPES_H__ -#include <stdlib.h> -#include <stdio.h> -#ifndef _STDLIB_H -#define _STDLIB_H -#endif -#ifdef _MSC_VER -#include <windows.h> -#define uint8_t UINT8 -#define uint16_t UINT16 -#define uint32_t UINT32 -#define uint64_t UINT64 -#define int8_t INT8 -#define int16_t INT16 -#define int32_t INT32 -#define bool BOOL -#define true (0==0) -#define false (!true) -#define __SIZEOF_FLOAT__ 4 -#define __SIZEOF_DOUBLE__ 8 -#define PRIx64 "I64x" -#pragma warning( disable : 4244 4996 4127) -#else -#include <stdint.h> -#include <stdbool.h> -#include <inttypes.h> -#include <unistd.h> -#ifdef WIN32 -#include <io.h> -#endif -#endif -typedef float float32_t; -typedef double float64_t; -#if __SIZEOF_FLOAT__!=4 -#error float32 type must have size 4 -#endif -#if __SIZEOF_DOUBLE__!=8 -#error float64 type must have size 8 -#endif -#define HINT_VERSION 2 -#define HINT_SUB_VERSION 0 -#define AS_STR(X) #X -#define VERSION_AS_STR(X,Y) AS_STR(X) "." AS_STR(Y) -#define HINT_VERSION_STRING VERSION_AS_STR(HINT_VERSION, HINT_SUB_VERSION) -#endif - /*:525*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/error.h b/Build/source/texk/web2c/hitexdir/hintview/src/error.h deleted file mode 100644 index dbbd7a1f069..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/error.h +++ /dev/null @@ -1,59 +0,0 @@ -/*368:*/ -#line 7247 "hint.w" - -#ifndef _ERROR_H -#define _ERROR_H -#include <stdlib.h> -#include <stdio.h> -#include <setjmp.h> -#define MAX_HINT_ERROR 1024 -extern char hint_error_string[MAX_HINT_ERROR]; -extern FILE*hlog; -extern void hint_end(void); -extern jmp_buf hint_error_exit; - -#ifdef _MSC_VER -#define snprintf(S,N,F,...) _snprintf(S,N,F,__VA_ARGS__) -#ifndef _CONSOLE -#pragma warning(disable : 4996) -extern void hint_message(char*title,char*format,...); -#define MESSAGE(...) hint_message("HINT",__VA_ARGS__) - -extern int hint_error(char*title,char*msg); -#define ERROR_MESSAGE hint_error("HINT ERROR",hint_error_string) -#endif -#endif - -#ifdef __ANDROID__ -#include <android/log.h> - -#define LOG(...) __android_log_print(ANDROID_LOG_DEBUG,__FILE__,__VA_ARGS__) -#define MESSAGE(...) __android_log_print(ANDROID_LOG_INFO,__FILE__, __VA_ARGS__) -#define ERROR_MESSAGE __android_log_print(ANDROID_LOG_ERROR,__FILE__,"ERROR: %s\n", hint_error_string) - -#endif - -#ifndef LOG -#define LOG(...) (fprintf(hlog,__VA_ARGS__),fflush(hlog)) -#endif - -#ifndef MESSAGE -#define MESSAGE(...) (fprintf(stderr,__VA_ARGS__),fflush(stderr)) -#endif - -#ifndef ERROR_MESSAGE -#define ERROR_MESSAGE fprintf(stderr,"ERROR: %s\n",hint_error_string) -#endif - -#ifndef QUIT -#define QUIT(...) (snprintf(hint_error_string,MAX_HINT_ERROR-1,__VA_ARGS__),\ - ERROR_MESSAGE,hint_end(),longjmp(hint_error_exit,1)) -#endif - - -#ifndef HINT_TRY -#define HINT_TRY if ((hint_error_string[0]= 0,setjmp(hint_error_exit)==0)) -#endif - -#endif -/*:368*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/format.h b/Build/source/texk/web2c/hitexdir/hintview/src/format.h deleted file mode 100644 index 9d4386edd7c..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/format.h +++ /dev/null @@ -1,373 +0,0 @@ - /*526:*/ - #line 10759 "format.w" - -#ifndef _HFORMAT_H_ -#define _HFORMAT_H_ - /*366:*/ - #line 8063 "format.w" - -#define REF_RNG(K,N) if ((int)(N)>max_ref[K]) QUIT("Reference %d to %s out of range [0 - %d]",\ - (N),definition_name[K],max_ref[K]) - /*:366*/ /*367:*/ - #line 8077 "format.w" - -#define MAX_REF(K) ((K)==label_kind?0xFFFF:0xFF) - /*:367*/ /*443:*/ - #line 9552 "format.w" - -#ifdef WIN32 -#define SIZE_F "0x%x" -#else -#define SIZE_F "0x%zx" -#endif -#ifdef DEBUG -#define DBG(FLAGS,...) ((debugflags & (FLAGS))?LOG(__VA_ARGS__):0) -#else -#define DBG(FLAGS,...) (void)0 -#endif -#define DBGTAG(A,P) DBG(DBGTAGS,"tag [%s,%d] at " SIZE_F "\n",NAME(A),INFO(A),(P)-hstart) - -#define RNG(S,N,A,Z) \ - if ((int)(N)<(int)(A)||(int)(N)>(int)(Z)) QUIT(S " %d out of range [%d - %d]",N,A,Z) - -#define TAGERR(A) QUIT("Unknown tag [%s,%d] at " SIZE_F "\n",NAME(A),INFO(A),hpos-hstart) - /*:443*/ - #line 10762 "format.w" - - /*430:*/ - #line 9291 "format.w" - -#define DBGNONE 0x0 -#define DBGBASIC 0x1 -#define DBGTAGS 0x2 -#define DBGNODE 0x4 -#define DBGDEF 0x8 -#define DBGDIR 0x10 -#define DBGRANGE 0x20 -#define DBGFLOAT 0x40 -#define DBGCOMPRESS 0x80 -#define DBGBUFFER 0X100 -#define DBGFLEX 0x200 -#define DBGBISON 0x400 -#define DBGTEX 0x800 -#define DBGPAGE 0x1000 -#define DBGFONT 0x2000 -#define DBGRENDER 0x4000 -#define DBGLABEL 0x8000 - /*:430*/ - #line 10763 "format.w" - - /*13:*/ - #line 647 "format.w" - -#define KIND(T) (((T)>>3)&0x1F) -#define NAME(T) content_name[KIND(T)] -#define INFO(T) ((T)&0x7) -#define TAG(K,I) (((K)<<3)|(I)) - /*:13*/ /*78:*/ - #line 1651 "format.w" - -#define ROUND(X) ((int)((X)>=0.0?floor((X)+0.5):ceil((X)-0.5))) - /*:78*/ /*113:*/ - #line 2153 "format.w" - -#define RUNNING_DIMEN 0xC0000000 - /*:113*/ /*132:*/ - #line 2495 "format.w" - -#define ZERO_GLUE(G) ((G).w.w==0 && (G).w.h==0.0 && (G).w.v==0.0 && (G).p.f==0.0 && (G).m.f==0.0) - /*:132*/ /*244:*/ - #line 5177 "format.w" - -#define HINT_NO_POS 0xFFFFFFFF - /*:244*/ /*251:*/ - #line 5375 "format.w" - -#define LABEL_UNDEF 0 -#define LABEL_TOP 1 -#define LABEL_BOT 2 -#define LABEL_MID 3 - /*:251*/ /*311:*/ - #line 6719 "format.w" - -#define ALLOCATE(R,S,T) ((R)= (T *)calloc((S),sizeof(T)),\ - (((R)==NULL)?QUIT("Out of memory for " #R):0)) -#define REALLOCATE(R,S,T) ((R)= (T *)realloc((R),(S)*sizeof(T)),\ - (((R)==NULL)?QUIT("Out of memory for " #R):0)) - /*:311*/ /*319:*/ - #line 6884 "format.w" - -#define MAX_BANNER 256 - /*:319*/ /*332:*/ - #line 7095 "format.w" - -#define MAX_TAG_DISTANCE 32 - /*:332*/ /*446:*/ - #line 9617 "format.w" - -#define NODE_SIZE(H,T) ((T)==0?(H)+2:-4*((H)+1)+((T)-1)) -#define NODE_HEAD(N) ((N)>0?(N)-2:-((N)>>2)-1) -#define NODE_TAIL(N) ((N)<0?((N)&0x3)+1:0) - /*:446*/ - #line 10764 "format.w" - - /*6:*/ - #line 496 "format.w" - -#define DEF_KIND(C,D,N) C##_kind= N -typedef enum{ /*9:*/ - #line 564 "format.w" - -DEF_KIND(list,list,0), -DEF_KIND(param,param,1), -DEF_KIND(range,range,2), -DEF_KIND(xdimen,xdimen,3), -DEF_KIND(adjust,adjust,4), -DEF_KIND(glyph,font,5), -DEF_KIND(kern,dimen,6), -DEF_KIND(glue,glue,7), -DEF_KIND(ligature,ligature,8), -DEF_KIND(disc,disc,9), -DEF_KIND(language,language,10), -DEF_KIND(rule,rule,11), -DEF_KIND(image,image,12), -DEF_KIND(leaders,leaders,13), -DEF_KIND(baseline,baseline,14), -DEF_KIND(hbox,hbox,15), -DEF_KIND(vbox,vbox,16), -DEF_KIND(par,par,17), -DEF_KIND(math,math,18), -DEF_KIND(table,table,19), -DEF_KIND(item,item,20), -DEF_KIND(hset,hset,21), -DEF_KIND(vset,vset,22), -DEF_KIND(hpack,hpack,23), -DEF_KIND(vpack,vpack,24), -DEF_KIND(stream,stream,25), -DEF_KIND(page,page,26), -DEF_KIND(link,label,27), -DEF_KIND(undefined1,undefined1,28), -DEF_KIND(undefined2,undefined2,29), -DEF_KIND(undefined3,undefined3,30), -DEF_KIND(penalty,int,31) - - /*:9*/ - #line 498 "format.w" -, /*10:*/ - #line 603 "format.w" - -font_kind= glyph_kind,int_kind= penalty_kind,unknown_kind= penalty_kind,dimen_kind= kern_kind,label_kind= link_kind,outline_kind= link_kind - /*:10*/ - #line 498 "format.w" -}Kind; -#undef DEF_KIND - /*:6*/ /*11:*/ - #line 629 "format.w" - -typedef enum{b000= 0,b001= 1,b010= 2,b011= 3,b100= 4,b101= 5,b110= 6,b111= 7}Info; - /*:11*/ /*12:*/ - #line 642 "format.w" - -typedef uint8_t Tag; - /*:12*/ /*57:*/ - #line 1310 "format.w" - - -#define FLT_M_BITS 23 -#define FLT_E_BITS 8 -#define FLT_EXCESS 127 - -#define DBL_M_BITS 52 -#define DBL_E_BITS 11 -#define DBL_EXCESS 1023 - - /*:57*/ /*77:*/ - #line 1646 "format.w" - -typedef int32_t Scaled; -#define ONE ((Scaled)(1<<16)) - /*:77*/ /*82:*/ - #line 1702 "format.w" - -typedef Scaled Dimen; -#define MAX_DIMEN ((Dimen)(0x3FFFFFFF)) - /*:82*/ /*87:*/ - #line 1758 "format.w" - -typedef struct{ -Dimen w;float32_t h,v; -}Xdimen; - /*:87*/ /*96:*/ - #line 1902 "format.w" - -typedef enum{normal_o= 0,fil_o= 1,fill_o= 2,filll_o= 3}Order; -typedef struct{float64_t f;Order o;}Stretch; -typedef union{float32_t f;uint32_t u;}Stch; - /*:96*/ /*131:*/ - #line 2485 "format.w" - -typedef struct{ -Xdimen w; -Stretch p,m; -}Glue; - /*:131*/ /*180:*/ - #line 3939 "format.w" - -typedef struct{ -Glue bs,ls; -Dimen lsl; -}Baseline; - /*:180*/ /*250:*/ - #line 5360 "format.w" - -typedef struct -{uint32_t pos; -uint8_t where; -bool used; -int next; -uint32_t pos0;uint8_t f; -}Label; - /*:250*/ /*390:*/ - #line 8598 "format.w" - -#define MAX_FONT_PARAMS 11 - /*:390*/ - #line 10765 "format.w" - - /*403:*/ - #line 8837 "format.w" - -typedef enum{ -zero_int_no= 0, -pretolerance_no= 1, -tolerance_no= 2, -line_penalty_no= 3, -hyphen_penalty_no= 4, -ex_hyphen_penalty_no= 5, -club_penalty_no= 6, -widow_penalty_no= 7, -display_widow_penalty_no= 8, -broken_penalty_no= 9, -pre_display_penalty_no= 10, -post_display_penalty_no= 11, -inter_line_penalty_no= 12, -double_hyphen_demerits_no= 13, -final_hyphen_demerits_no= 14, -adj_demerits_no= 15, -looseness_no= 16, -time_no= 17, -day_no= 18, -month_no= 19, -year_no= 20, -hang_after_no= 21, -floating_penalty_no= 22 -}Int_no; -#define MAX_INT_DEFAULT floating_penalty_no - /*:403*/ /*405:*/ - #line 8910 "format.w" - -typedef enum{ -zero_dimen_no= 0, -hsize_dimen_no= 1, -vsize_dimen_no= 2, -line_skip_limit_no= 3, -max_depth_no= 4, -split_max_depth_no= 5, -hang_indent_no= 6, -emergency_stretch_no= 7, -quad_no= 8, -math_quad_no= 9 -}Dimen_no; -#define MAX_DIMEN_DEFAULT math_quad_no - /*:405*/ /*407:*/ - #line 8955 "format.w" - -typedef enum{ -zero_xdimen_no= 0, -hsize_xdimen_no= 1, -vsize_xdimen_no= 2 -}Xdimen_no; -#define MAX_XDIMEN_DEFAULT vsize_xdimen_no - /*:407*/ /*409:*/ - #line 8979 "format.w" - -typedef enum{ -zero_skip_no= 0, -fil_skip_no= 1, -fill_skip_no= 2, -line_skip_no= 3, -baseline_skip_no= 4, -above_display_skip_no= 5, -below_display_skip_no= 6, -above_display_short_skip_no= 7, -below_display_short_skip_no= 8, -left_skip_no= 9, -right_skip_no= 10, -top_skip_no= 11, -split_top_skip_no= 12, -tab_skip_no= 13, -par_fill_skip_no= 14 -}Glue_no; -#define MAX_GLUE_DEFAULT par_fill_skip_no - /*:409*/ /*411:*/ - #line 9065 "format.w" - -typedef enum{ -zero_baseline_no= 0 -}Baseline_no; -#define MAX_BASELINE_DEFAULT zero_baseline_no - /*:411*/ /*413:*/ - #line 9090 "format.w" - -typedef enum{ -zero_label_no= 0 -}Label_no; -#define MAX_LABEL_DEFAULT zero_label_no - /*:413*/ /*415:*/ - #line 9104 "format.w" - -typedef enum{ -zero_stream_no= 0 -}Stream_no; -#define MAX_STREAM_DEFAULT zero_stream_no - /*:415*/ /*417:*/ - #line 9120 "format.w" - -typedef enum{ -zero_page_no= 0 -}Page_no; -#define MAX_PAGE_DEFAULT zero_page_no - /*:417*/ /*419:*/ - #line 9137 "format.w" - -typedef enum{ -zero_range_no= 0 -}Range_no; -#define MAX_RANGE_DEFAULT zero_range_no - /*:419*/ /*421:*/ - #line 9150 "format.w" - -typedef enum{ -empty_list_no= 0 -}List_no; -#define MAX_LIST_DEFAULT empty_list_no - /*:421*/ - #line 10766 "format.w" - - -extern const char*content_name[32]; -extern const char*definition_name[32]; -extern unsigned int debugflags; -extern FILE*hlog; -extern int max_fixed[32],max_default[32],max_ref[32],max_outline; -extern int32_t int_defaults[MAX_INT_DEFAULT+1]; -extern Dimen dimen_defaults[MAX_DIMEN_DEFAULT+1]; -extern Xdimen xdimen_defaults[MAX_XDIMEN_DEFAULT+1]; -extern Glue glue_defaults[MAX_GLUE_DEFAULT+1]; -extern Baseline baseline_defaults[MAX_BASELINE_DEFAULT+1]; -extern Label label_defaults[MAX_LABEL_DEFAULT+1]; -extern signed char hnode_size[0x100]; -extern uint8_t content_known[32]; - -#endif - /*:526*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/get.c b/Build/source/texk/web2c/hitexdir/hintview/src/get.c deleted file mode 100644 index 3bc35045995..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/get.c +++ /dev/null @@ -1,633 +0,0 @@ - /*530:*/ - #line 10915 "format.w" - -#include "basetypes.h" -#include <string.h> -#include <math.h> -#include <zlib.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include "error.h" -#include "format.h" -#include "get.h" - - /*252:*/ - #line 5382 "format.w" - -Label*labels= NULL; -int first_label= -1; - /*:252*/ /*309:*/ - #line 6708 "format.w" - -RangePos*range_pos; -int next_range= 1,max_range; -int*page_on; - /*:309*/ /*320:*/ - #line 6892 "format.w" - -char hbanner[MAX_BANNER+1]; -int hbanner_size= 0; - /*:320*/ /*327:*/ - #line 7040 "format.w" - -uint8_t*hpos= NULL,*hstart= NULL,*hend= NULL,*hpos0= NULL; - /*:327*/ /*333:*/ - #line 7121 "format.w" - -char*hin_name= NULL; -uint64_t hin_size= 0; -uint8_t*hin_addr= NULL; -uint64_t hin_time= 0; - /*:333*/ /*389:*/ - #line 8594 "format.w" - -char**hfont_name; - /*:389*/ /*431:*/ - #line 9314 "format.w" - -unsigned int debugflags= DBGNONE; -int option_utf8= false; -int option_hex= false; -int option_force= false; -int option_global= false; -int option_aux= false; -int option_compress= false; -char*stem_name= NULL; -int stem_length= 0; - /*:431*/ /*434:*/ - #line 9448 "format.w" - -FILE*hin= NULL,*hout= NULL,*hlog= NULL; - /*:434*/ - #line 10928 "format.w" - - - /*334:*/ - #line 7128 "format.w" - -#ifndef USE_MMAP -void hget_unmap(void) -{if(hin_addr!=NULL)free(hin_addr); -hin_addr= NULL; -hin_size= 0; -} -bool hget_map(void) -{FILE*f; -struct stat st; -size_t s,t; -uint64_t u; -f= fopen(hin_name,"rb"); -if(f==NULL) -{MESSAGE("Unable to open file: %s\n",hin_name);return false;} -if(stat(hin_name,&st)<0) -{MESSAGE("Unable to obtain file size: %s\n",hin_name); -fclose(f); -return false; -} -if(st.st_size==0) -{MESSAGE("File %s is empty\n",hin_name); -fclose(f); -return false; -} -u= st.st_size; -if(hin_addr!=NULL)hget_unmap(); -hin_addr= malloc(u); -if(hin_addr==NULL) -{MESSAGE("Unable to allocate 0x%"PRIx64" byte for File %s\n",u,hin_name); -fclose(f); -return 0; -} -t= 0; -do{ -s= fread(hin_addr+t,1,u,f); -if(s<=0) -{MESSAGE("Unable to read file %s\n",hin_name); -fclose(f); -free(hin_addr); -hin_addr= NULL; -return false; -} -t= t+s; -u= u-s; -}while(u>0); -hin_size= st.st_size; -hin_time= st.st_mtime; -return true; -} - -#else - -#include <sys/mman.h> - -void hget_unmap(void) -{munmap(hin_addr,hin_size); -hin_addr= NULL; -hin_size= 0; -} - -bool hget_map(void) -{struct stat st; -int fd; -fd= open(hin_name,O_RDONLY,0); -if(fd<0) -{MESSAGE("Unable to open file %s\n",hin_name);return false;} -if(fstat(fd,&st)<0) -{MESSAGE("Unable to get file size\n"); -close(fd); -return false; -} -if(st.st_size==0) -{MESSAGE("File %s is empty\n",hin_name); -close(fd); -return false; -} -if(hin_addr!=NULL)hget_unmap(); -hin_size= st.st_size; -hin_time= st.st_mtime; -hin_addr= mmap(NULL,hin_size,PROT_READ,MAP_PRIVATE,fd,0); -if(hin_addr==MAP_FAILED) -{close(fd); -hin_addr= NULL;hin_size= 0; -MESSAGE("Unable to map file into memory\n"); -return 0; -} -close(fd); -return hin_size; -} -#endif - - /*:334*/ - #line 10930 "format.w" - - /*321:*/ - #line 6897 "format.w" - - -bool hcheck_banner(char*magic) -{ -int v,s; -char*t; -t= hbanner; -if(strncmp(magic,hbanner,4)!=0) -{MESSAGE("This is not a %s file\n",magic);return false;} -else t+= 4; -if(hbanner[hbanner_size-1]!='\n') -{MESSAGE("Banner exceeds maximum size=0x%x\n",MAX_BANNER);return false;} -if(*t!=' ') -{MESSAGE("Space expected in banner after %s\n",magic);return false;} -else t++; -v= strtol(t,&t,10); -if(*t!='.') -{MESSAGE("Dot expected in banner after HINT version number\n");return false;} -else t++; -s= strtol(t,&t,10); -if(v!=HINT_VERSION) -{MESSAGE("Wrong HINT version: got %d.%d, expected %d.%d\n", -v,s,HINT_VERSION,HINT_SUB_VERSION);return false;} -if(s<HINT_SUB_VERSION) -{MESSAGE("Wrong HINT subversion: got %d.%d, expected %d.%d\n", -v,s,HINT_VERSION,HINT_SUB_VERSION);return false;} -else if(s>HINT_SUB_VERSION) -{MESSAGE("New HINT subversion: got %d.%d, expected %d.%d, update your application\n", -v,s,HINT_VERSION,HINT_SUB_VERSION);} -if(*t!=' '&&*t!='\n') -{MESSAGE("Space expected in banner after HINT subversion\n");return false;} -LOG("%s file version "HINT_VERSION_STRING":%s",magic,t); -DBG(DBGDIR,"banner size=0x%x\n",hbanner_size); -return true; -} - /*:321*/ - #line 10931 "format.w" - - /*343:*/ - #line 7461 "format.w" - -Entry*dir= NULL; -uint16_t section_no,max_section_no; -void new_directory(uint32_t entries) -{DBG(DBGDIR,"Creating directory with %d entries\n",entries); -RNG("Directory entries",entries,3,0x10000); -max_section_no= entries-1; -ALLOCATE(dir,entries,Entry); -dir[0].section_no= 0;dir[1].section_no= 1;dir[2].section_no= 2; -} - /*:343*/ /*344:*/ - #line 7474 "format.w" - -void hset_entry(Entry*e,uint16_t i,uint32_t size,uint32_t xsize,char*file_name) -{e->section_no= i; -e->size= size;e->xsize= xsize; -if(file_name==NULL||*file_name==0) -e->file_name= NULL; -else -e->file_name= strdup(file_name); -DBG(DBGDIR,"Creating entry %d: \"%s\" size=0x%x xsize=0x%x\n",i,file_name,size,xsize); -} - /*:344*/ - #line 10932 "format.w" - - - /*322:*/ - #line 6941 "format.w" - -void hget_banner(void) -{hbanner_size= 0; -while(hbanner_size<MAX_BANNER&&hpos<hend) -{uint8_t c= HGET8; -hbanner[hbanner_size++]= c; -if(c=='\n')break; -} -hbanner[hbanner_size]= 0; -} - /*:322*/ /*335:*/ - #line 7233 "format.w" - - -static void hdecompress(uint16_t n) -{z_stream z; -uint8_t*buffer; -int i; - -DBG(DBGCOMPRESS,"Decompressing section %d from 0x%x to 0x%x byte\n",n,dir[n].size,dir[n].xsize); -z.zalloc= (alloc_func)0; -z.zfree= (free_func)0; -z.opaque= (voidpf)0; -z.next_in= hstart; -z.avail_in= hend-hstart; -if(inflateInit(&z)!=Z_OK) -QUIT("Unable to initialize decompression: %s",z.msg); -ALLOCATE(buffer,dir[n].xsize+MAX_TAG_DISTANCE,uint8_t); -DBG(DBGBUFFER,"Allocating output buffer size=0x%x, margin=0x%x\n",dir[n].xsize,MAX_TAG_DISTANCE); -z.next_out= buffer; -z.avail_out= dir[n].xsize+MAX_TAG_DISTANCE; -i= inflate(&z,Z_FINISH); -DBG(DBGCOMPRESS,"in: avail/total=0x%x/0x%lx ""out: avail/total=0x%x/0x%lx, return %d;\n", -z.avail_in,z.total_in,z.avail_out,z.total_out,i); -if(i!=Z_STREAM_END) -QUIT("Unable to complete decompression: %s",z.msg); -if(z.avail_in!=0) -QUIT("Decompression missed input data"); -if(z.total_out!=dir[n].xsize) -QUIT("Decompression output size mismatch 0x%lx != 0x%x",z.total_out,dir[n].xsize); -if(inflateEnd(&z)!=Z_OK) -QUIT("Unable to finalize decompression: %s",z.msg); -dir[n].buffer= buffer; -dir[n].bsize= dir[n].xsize; -hpos0= hpos= hstart= buffer; -hend= hstart+dir[n].xsize; -} - /*:335*/ /*337:*/ - #line 7321 "format.w" - -void hget_section(uint16_t n) -{DBG(DBGDIR,"Reading section %d\n",n); -RNG("Section number",n,0,max_section_no); -if(dir[n].buffer!=NULL&&dir[n].xsize>0) -{hpos0= hpos= hstart= dir[n].buffer; -hend= hstart+dir[n].xsize; -} -else -{hpos0= hpos= hstart= hin_addr+dir[n].pos; -hend= hstart+dir[n].size; -if(dir[n].xsize>0)hdecompress(n); -} -} - /*:337*/ /*354:*/ - #line 7699 "format.w" - -void hget_entry(Entry*e) -{ /*16:*/ - #line 724 "format.w" - -Tag a,z; -uint32_t node_pos= hpos-hstart; -if(hpos>=hend)QUIT("Attempt to read a start byte at the end of the section"); -HGETTAG(a); - /*:16*/ - #line 7701 "format.w" - -DBG(DBGDIR,"Reading directory entry\n"); -switch(a) -{case TAG(0,b000+0):HGET_ENTRY(b000+0,*e);break; -case TAG(0,b000+1):HGET_ENTRY(b000+1,*e);break; -case TAG(0,b000+2):HGET_ENTRY(b000+2,*e);break; -case TAG(0,b000+3):HGET_ENTRY(b000+3,*e);break; -case TAG(0,b100+0):HGET_ENTRY(b100+0,*e);break; -case TAG(0,b100+1):HGET_ENTRY(b100+1,*e);break; -case TAG(0,b100+2):HGET_ENTRY(b100+2,*e);break; -case TAG(0,b100+3):HGET_ENTRY(b100+3,*e);break; -default:TAGERR(a);break; -} - /*17:*/ - #line 731 "format.w" - -HGETTAG(z); -if(a!=z) -QUIT("Tag mismatch [%s,%d]!=[%s,%d] at 0x%x to "SIZE_F"\n", -NAME(a),INFO(a),NAME(z),INFO(z),node_pos,hpos-hstart-1); - /*:17*/ - #line 7714 "format.w" - -} - /*:354*/ /*355:*/ - #line 7731 "format.w" - -static void hget_root(Entry*root) -{DBG(DBGDIR,"Root entry at "SIZE_F"\n",hpos-hstart); -hget_entry(root); -root->pos= hpos-hstart; -max_section_no= root->section_no; -root->section_no= 0; -if(max_section_no<2)QUIT("Sections 0, 1, and 2 are mandatory"); -} - -void hget_directory(void) -{int i; -Entry root= {0}; -hget_root(&root); -DBG(DBGDIR,"Directory\n"); -new_directory(max_section_no+1); -dir[0]= root; -DBG(DBGDIR,"Directory entry 1 at 0x%"PRIx64"\n",dir[0].pos); -hget_section(0); -for(i= 1;i<=max_section_no;i++) -{hget_entry(&(dir[i])); -dir[i].pos= dir[i-1].pos+dir[i-1].size; -DBG(DBGDIR,"Section %d at 0x%"PRIx64"\n",i,dir[i].pos); -} -} - -void hclear_dir(void) -{int i; -if(dir==NULL)return; -for(i= 0;i<3;i++) -if(dir[i].xsize>0&&dir[i].buffer!=NULL)free(dir[i].buffer); -free(dir);dir= NULL; -} - - /*:355*/ /*373:*/ - #line 8155 "format.w" - -void hget_max_definitions(void) -{Kind k; - /*16:*/ - #line 724 "format.w" - -Tag a,z; -uint32_t node_pos= hpos-hstart; -if(hpos>=hend)QUIT("Attempt to read a start byte at the end of the section"); -HGETTAG(a); - /*:16*/ - #line 8158 "format.w" - -if(a!=TAG(list_kind,0))QUIT("Start of maximum list expected"); -for(k= 0;k<32;k++)max_ref[k]= max_default[k];max_outline= -1; -while(true) -{int n; -if(hpos>=hend)QUIT("Unexpected end of maximum list"); -node_pos= hpos-hstart; -HGETTAG(a); -k= KIND(a); -if(k==list_kind)break; -if(INFO(a)&b001)HGET16(n);else n= HGET8; -switch(a) -{ /*246:*/ - #line 5312 "format.w" - - -case TAG(outline_kind,b100): -case TAG(outline_kind,b101):max_outline= n; -DBG(DBGDEF|DBGLABEL,"max(outline) = %d\n",max_outline);break; - /*:246*/ - #line 8170 "format.w" - -default: -if(max_fixed[k]>max_default[k]) -QUIT("Maximum value for kind %s not supported",definition_name[k]); -RNG("Maximum number",n,max_default[k],MAX_REF(k)); -max_ref[k]= n; -DBG(DBGDEF,"max(%s) = %d\n",definition_name[k],max_ref[k]); -break; -} - /*17:*/ - #line 731 "format.w" - -HGETTAG(z); -if(a!=z) -QUIT("Tag mismatch [%s,%d]!=[%s,%d] at 0x%x to "SIZE_F"\n", -NAME(a),INFO(a),NAME(z),INFO(z),node_pos,hpos-hstart-1); - /*:17*/ - #line 8179 "format.w" - -} -if(INFO(a)!=0)QUIT("End of maximum list with info %d",INFO(a)); -DBG(DBGDEF,"Getting Max Definitions END\n"); -} - /*:373*/ - #line 10934 "format.w" - - /*53:*/ - #line 1242 "format.w" - -#define HGET_UTF8C(X) (X)= HGET8; if ((X&0xC0)!=0x80) \ - QUIT("UTF8 continuation byte expected at " SIZE_F " got 0x%02X\n",hpos-hstart-1,X) - -uint32_t hget_utf8(void) -{uint8_t a; -a= HGET8; -if(a<0x80)return a; -else -{if((a&0xE0)==0xC0) -{uint8_t b;HGET_UTF8C(b); -return((a&~0xE0)<<6)+(b&~0xC0); -} -else if((a&0xF0)==0xE0) -{uint8_t b,c;HGET_UTF8C(b);HGET_UTF8C(c); -return((a&~0xF0)<<12)+((b&~0xC0)<<6)+(c&~0xC0); -} -else if((a&0xF8)==0xF0) -{uint8_t b,c,d;HGET_UTF8C(b);HGET_UTF8C(c);HGET_UTF8C(d); -return((a&~0xF8)<<18)+((b&~0xC0)<<12)+((c&~0xC0)<<6)+(d&~0xC0); -} -else QUIT("UTF8 byte sequence expected"); -} -} - /*:53*/ /*76:*/ - #line 1625 "format.w" - -float32_t hget_float32(void) -{union{float32_t d;uint32_t bits;}u; -HGET32(u.bits); -return u.d; -} - /*:76*/ /*146:*/ - #line 2848 "format.w" - -void hget_size_boundary(Info info) -{uint32_t n; -info= info&0x3; -if(info==0)return; -n= HGET8; -if(n!=0x100-info)QUIT("Non matching boundary byte 0x%x with info value %d at 0x%x", -n,info,(uint32_t)(hpos-hstart-1)); -} - -uint32_t hget_list_size(Info info) -{uint32_t n= 0; -info= info&0x3; -if(info==0)return 0; -else if(info==1)n= HGET8; -else if(info==2)HGET16(n); -else if(info==3)HGET32(n); -else QUIT("List info %d must be 0, 1, 2, or 3",info); -return n; -} - -void hget_list(List*l) -{if(KIND(*hpos)!=list_kind&&KIND(*hpos)!=param_kind) -QUIT("List expected at 0x%x",(uint32_t)(hpos-hstart)); -else -{ - /*16:*/ - #line 724 "format.w" - -Tag a,z; -uint32_t node_pos= hpos-hstart; -if(hpos>=hend)QUIT("Attempt to read a start byte at the end of the section"); -HGETTAG(a); - /*:16*/ - #line 2874 "format.w" - -l->t= a; -HGET_LIST(INFO(a),*l); - /*17:*/ - #line 731 "format.w" - -HGETTAG(z); -if(a!=z) -QUIT("Tag mismatch [%s,%d]!=[%s,%d] at 0x%x to "SIZE_F"\n", -NAME(a),INFO(a),NAME(z),INFO(z),node_pos,hpos-hstart-1); - /*:17*/ - #line 2877 "format.w" - -DBG(DBGNODE,"Get list at 0x%x size=%u\n",l->p,l->s); -} -} - /*:146*/ - #line 10935 "format.w" - - /*447:*/ - #line 9629 "format.w" - -uint32_t hff_list_pos= 0,hff_list_size= 0; -Tag hff_tag; -void hff_hpos(void) -{signed char i,b,n; -hff_tag= *hpos; -DBGTAG(hff_tag,hpos); -i= hnode_size[hff_tag]; -if(i>0){hpos= hpos+NODE_HEAD(i)+2;return;} -else if(i<0) -{n= NODE_TAIL(i);b= NODE_HEAD(i); -hpos= hpos+1+b; -while(n>0) -{hff_hpos();n--;} -hpos++; -return; -} -else if(hff_tag<=TAG(param_kind,7)) - /*450:*/ - #line 9699 "format.w" - -switch(INFO(hff_tag)&0x3){ -case 0:hff_list_pos= hpos-hstart+1;hff_list_size= 0;hpos= hpos+3;return; -case 1:hpos++;hff_list_size= HGET8;hff_list_pos= hpos-hstart+1;hpos= hpos+1+hff_list_size+1+1+1;return; -case 2:hpos++;HGET16(hff_list_size);hff_list_pos= hpos-hstart+1;hpos= hpos+1+hff_list_size+1+2+1;return; -case 3:hpos++;HGET32(hff_list_size);hff_list_pos= hpos-hstart+1;hpos= hpos+1+hff_list_size+1+4+1;return; -default:QUIT("List with unknown info [%s,%d] at "SIZE_F"\n",NAME(hff_tag),INFO(hff_tag),hpos-hstart); -} - /*:450*/ - #line 9647 "format.w" - -TAGERR(hff_tag); -} - /*:447*/ /*478:*/ - #line 10112 "format.w" - -float32_t hteg_float32(void) -{union{float32_t d;uint32_t bits;}u; -HTEG32(u.bits); -return u.d; -} - /*:478*/ /*516:*/ - #line 10552 "format.w" - -void hteg_size_boundary(Info info) -{uint32_t n; -info= info&0x3; -if(info==0)return; -n= HTEG8; -if(n!=0x100-info)QUIT("List size boundary byte 0x%x does not match info value %d at "SIZE_F, -n,info,hpos-hstart); -} - -uint32_t hteg_list_size(Info info) -{uint32_t n= 0; -info= info&0x3; -if(info==0)return 0; -else if(info==1)n= HTEG8; -else if(info==2)HTEG16(n); -else if(info==3)HTEG32(n); -else QUIT("List info %d must be 0, 1, 2, or 3",info); -return n; -} - -void hteg_list(List*l) -{ /*475:*/ - #line 10084 "format.w" - -Tag a,z; -uint32_t node_pos= hpos-hstart; -if(hpos<=hstart)return; -HTEGTAG(z); - /*:475*/ - #line 10574 "format.w" - -if(KIND(z)!=list_kind&&KIND(z)!=param_kind) -QUIT("List expected at 0x%x",(uint32_t)(hpos-hstart)); -else if((INFO(z)&0x3)==0){HBACK(1);l->s= 0;} -else -{uint32_t s; -l->t= z; -l->s= hteg_list_size(INFO(z)); -hteg_size_boundary(INFO(z)); -hpos= hpos-l->s; -l->p= hpos-hstart; -hteg_size_boundary(INFO(z)); -s= hteg_list_size(INFO(z)); -if(s!=l->s)QUIT("List sizes at "SIZE_F" and 0x%x do not match 0x%x != 0x%x", -hpos-hstart,node_pos-1,s,l->s); -} - /*476:*/ - #line 10091 "format.w" - -HTEGTAG(a); -if(a!=z)QUIT("Tag mismatch [%s,%d]!=[%s,%d] at "SIZE_F" to 0x%x\n",NAME(a),INFO(a),NAME(z),INFO(z), -hpos-hstart,node_pos-1); - /*:476*/ - #line 10590 "format.w" - -} - -void hteg_param_list(List*l) -{if(KIND(*(hpos-1))!=param_kind)return; -hteg_list(l); -} - - - /*:516*/ - #line 10936 "format.w" - - /*:530*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/get.h b/Build/source/texk/web2c/hitexdir/hintview/src/get.h deleted file mode 100644 index 7c053f7940d..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/get.h +++ /dev/null @@ -1,198 +0,0 @@ - /*529:*/ - #line 10864 "format.w" - - /*1:*/ - #line 329 "format.w" - -typedef struct{uint32_t c;uint8_t f;}Glyph; - /*:1*/ /*114:*/ - #line 2180 "format.w" - -typedef struct{ -Dimen h,d,w; -}Rule; - /*:114*/ /*123:*/ - #line 2294 "format.w" - -typedef struct{ -bool x; -Xdimen d; -}Kern; - /*:123*/ /*141:*/ - #line 2717 "format.w" - -typedef struct{ -Tag t; -uint32_t p; -uint32_t s; -}List; - /*:141*/ /*149:*/ - #line 3143 "format.w" - -typedef enum{txt_font= 0x00,txt_global= 0x08,txt_local= 0x11, -txt_cc= 0x1D,txt_node= 0x1E,txt_hyphen= 0x1F, -txt_glue= 0x20,txt_ignore= 0xFB}Txt; - /*:149*/ /*160:*/ - #line 3443 "format.w" - -typedef struct{Dimen h,d,w,a;float32_t r;int8_t s,o;List l;}Box; - /*:160*/ /*187:*/ - #line 4028 "format.w" - -typedef struct{uint8_t f;List l;}Lig; - /*:187*/ /*195:*/ - #line 4145 "format.w" - -typedef struct{bool x;List p,q;uint8_t r;}Disc; - /*:195*/ /*228:*/ - #line 4696 "format.w" - -typedef struct{ -uint16_t n; -float32_t a; -Xdimen w,h; -uint8_t wr,hr; -}Image; - /*:228*/ /*272:*/ - #line 5724 "format.w" - -typedef struct{ -uint8_t*t; -int s; -int d; -uint16_t r; -}Outline; - /*:272*/ /*308:*/ - #line 6703 "format.w" - -typedef -struct{uint8_t pg;uint32_t pos;bool on;int link;}RangePos; - /*:308*/ /*397:*/ - #line 8715 "format.w" - -typedef struct{Kind k;int n;}Ref; - /*:397*/ - #line 10865 "format.w" - - /*342:*/ - #line 7447 "format.w" - -typedef struct{ -uint64_t pos; -uint32_t size,xsize; -uint16_t section_no; -char*file_name; -uint8_t*buffer; -uint32_t bsize; -}Entry; - /*:342*/ - #line 10866 "format.w" - - /*38:*/ - #line 1076 "format.w" - -#define HGET_STRING(S) S= (char*)hpos;\ - while(hpos<hend && *hpos!=0) { RNG("String character",*hpos,0x20,0x7E); hpos++;}\ - hpos++; - /*:38*/ /*147:*/ - #line 2886 "format.w" - -#define HGET_LIST(I,L) \ - if (((I)&0x3)==0) {uint8_t n= HGET8; REF_RNG(KIND((L).t),n); (L).s= 0;}\ - else { (L).s= hget_list_size(I); hget_size_boundary(I);\ - (L).p= hpos-hstart; \ - hpos= hpos+(L).s; hget_size_boundary(I);\ - { uint32_t s= hget_list_size(I); \ - if (s!=(L).s) \ - QUIT("List sizes at 0x%x and " SIZE_F " do not match 0x%x != 0x%x",node_pos+1,hpos-hstart-I-1,(L).s,s);}} - /*:147*/ /*328:*/ - #line 7048 "format.w" - -#define HGET_ERROR QUIT("HGET overrun in section %d at " SIZE_F "\n",section_no,hpos-hstart) -#define HEND ((hpos<=hend)?0:(HGET_ERROR,0)) - -#define HGET8 ((hpos<hend)?*(hpos++):(HGET_ERROR,0)) -#define HGET16(X) ((X)= (hpos[0]<<8)+hpos[1],hpos+= 2,HEND) -#define HGET24(X) ((X)= (hpos[0]<<16)+(hpos[1]<<8)+hpos[2],hpos+= 3,HEND) -#define HGET32(X) ((X)= (hpos[0]<<24)+(hpos[1]<<16)+(hpos[2]<<8)+hpos[3],hpos+= 4,HEND) -#define HGETTAG(A) A= HGET8,DBGTAG(A,hpos-1) - /*:328*/ /*353:*/ - #line 7675 "format.w" - -#define HGET_SIZE(I) \ - if ((I)&b100) { \ - if (((I)&b011)==0) s= HGET8,xs= HGET8; \ - else if (((I)&b011)==1) HGET16(s),HGET16(xs); \ - else if (((I)&b011)==2) HGET24(s),HGET24(xs); \ - else if (((I)&b011)==3) HGET32(s),HGET32(xs); \ - } \ - else { \ - if (((I)&b011)==0) s= HGET8; \ - else if (((I)&b011)==1) HGET16(s); \ - else if (((I)&b011)==2) HGET24(s); \ - else if (((I)&b011)==3) HGET32(s); \ - } - -#define HGET_ENTRY(I,E) \ -{ uint16_t i; \ - uint32_t s= 0,xs= 0; \ - char *file_name; \ - HGET16(i); HGET_SIZE(I); HGET_STRING(file_name); \ - hset_entry(&(E),i,s,xs,file_name); \ -} - /*:353*/ /*477:*/ - #line 10099 "format.w" - -#define HBACK(X) ((hpos-(X)<hstart)?(QUIT("HTEG underflow\n"),NULL):(hpos-= (X))) - -#define HTEG8 (HBACK(1),hpos[0]) -#define HTEG16(X) (HBACK(2),(X)= (hpos[0]<<8)+hpos[1]) -#define HTEG24(X) (HBACK(3),(X)= (hpos[0]<<16)+(hpos[1]<<8)+hpos[2]) -#define HTEG32(X) (HBACK(4),(X)= (hpos[0]<<24)+(hpos[1]<<16)+(hpos[2]<<8)+hpos[3]) -#define HTEGTAG(X) X= HTEG8,DBGTAG(X,hpos) - /*:477*/ - #line 10867 "format.w" - - -extern Entry*dir; -extern uint16_t section_no,max_section_no; -extern uint8_t*hpos,*hstart,*hend,*hpos0; -extern uint64_t hin_size,hin_time; -extern uint8_t*hin_addr; - -extern Label*labels; -extern char*hin_name; -extern bool hget_map(void); -extern void hget_unmap(void); - -extern void new_directory(uint32_t entries); -extern void hset_entry(Entry*e,uint16_t i,uint32_t size,uint32_t xsize,char*file_name); - -extern void hget_banner(void); -extern void hget_section(uint16_t n); -extern void hget_entry(Entry*e); -extern void hget_directory(void); -extern void hclear_dir(void); -extern bool hcheck_banner(char*magic); - -extern void hget_max_definitions(void); -extern uint32_t hget_utf8(void); -extern void hget_size_boundary(Info info); -extern uint32_t hget_list_size(Info info); -extern void hget_list(List*l); -extern float32_t hget_float32(void); -extern void hff_hpos(void); -extern uint32_t hff_list_pos,hff_list_size; -extern Tag hff_tag; -extern float32_t hteg_float32(void); -extern uint32_t hteg_list_size(Info info); - - -#if 0 -extern void hteg_list(List*l); - -extern void hteg_size_boundary(Info info); - -#endif - - /*:529*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/hfonts.c b/Build/source/texk/web2c/hitexdir/hintview/src/hfonts.c deleted file mode 100644 index 7744ad2dfc9..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/hfonts.c +++ /dev/null @@ -1,596 +0,0 @@ -/*386:*/ -#line 7708 "hint.w" - -#include "basetypes.h" -#include "error.h" -#include "format.h" - -#include "get.h" -#include <ft2build.h> -#include FT_FREETYPE_H -#include "hfonts.h" -#include "hrender.h" -#include "rendernative.h" - -/*317:*/ -#line 5795 "hint.w" - -static Font*fonts[0x100]= {NULL}; -/*:317*//*324:*/ -#line 5931 "hint.w" - -static Gcache g_undefined= {0}; -/*:324*//*359:*/ -#line 7091 "hint.w" - -static FT_Library ft_library= NULL; -/*:359*/ -#line 7720 "hint.w" - -/*35:*/ -#line 577 "hint.w" - -extern uint16_t hglyph_section(uint8_t f); -extern int32_t font_at_size(uint8_t f); -/*:35*/ -#line 7721 "hint.w" - -/*323:*/ -#line 5888 "hint.w" - -#define G0_BITS 7 -#define G0_SIZE (1<<G0_BITS) -#define G0_MASK (G0_SIZE-1) -#define G123_BITS 6 -#define G123_SIZE (1<<G123_BITS) -#define G123_MASK (G123_SIZE-1) - -static Gcache*g_lookup(Font*f,unsigned int cc) - -{if(cc>>G0_BITS){ -unsigned int cc1= (cc>>G0_BITS); -if(cc1>>G123_BITS){ -unsigned int cc2= cc1>>G123_BITS; -if(cc2>>G123_BITS){ -unsigned int cc3= cc2>>G123_BITS; -if(cc3>>G123_BITS)return NULL; -else if(f->g3&& -f->g3[cc3&G123_MASK]&& -f->g3[cc3&G123_MASK][cc2&G123_MASK]&& -f->g3[cc3&G123_MASK][cc2&G123_MASK][cc1&G123_MASK]) -return f->g3[cc3&G123_MASK][cc2&G123_MASK][cc1&G123_MASK][cc&G0_MASK]; -} -else if(f->g2&&f->g2[cc2&G123_MASK]&&f->g2[cc2&G123_MASK][cc1&G123_MASK]) -return f->g2[cc2&G123_MASK][cc1&G123_MASK][cc&G0_MASK]; -} -else if(f->g1&&f->g1[cc1&G123_MASK]) -return f->g1[cc1&G123_MASK][cc&G0_MASK]; -} -else if(f->g0) -return f->g0[cc]; -return NULL; -} -/*:323*//*325:*/ -#line 5935 "hint.w" - -static Gcache*hnew_g(Gcache**g) -{if(*g==NULL) -*g= calloc(1,sizeof(Gcache)); -if(*g==NULL) -return&g_undefined; -(*g)->ff= no_format; -return*g; -} - -static Gcache*hnew_g0(Gcache***g,unsigned int cc) -{unsigned int cc0= cc&G0_MASK; -if(*g==NULL) -*g= calloc(G0_SIZE,sizeof(Gcache*)); -if(*g==NULL) -return&g_undefined; -return hnew_g((*g)+cc0); -} - -static Gcache*hnew_g1(Gcache****g,unsigned int cc) -{unsigned int cc1= (cc>>G0_BITS)&G123_MASK; -if(*g==NULL) -*g= calloc(G123_SIZE,sizeof(Gcache**)); -if(*g==NULL) -return&g_undefined; -return hnew_g0((*g)+cc1,cc); -} -static Gcache*hnew_g2(Gcache*****g,unsigned int cc) -{unsigned int cc2= (cc>>(G123_BITS+G0_BITS))&G123_MASK; -if(*g==NULL) -*g= calloc(G123_SIZE,sizeof(Gcache***)); -if(*g==NULL) -return&g_undefined; -return hnew_g1((*g)+cc2,cc); -} - -static Gcache*hnew_g3(Gcache******g,unsigned int cc) -{unsigned int cc3= (cc>>(G123_BITS+G123_BITS+G0_BITS))&G123_MASK; -if(*g==NULL) -*g= calloc(G123_SIZE,sizeof(Gcache****)); -if(*g==NULL) -return&g_undefined; -return hnew_g2((*g)+cc3,cc); -} - - -static Gcache*hnew_glyph(Font*f,unsigned int cc) -{if(cc<G0_SIZE)return hnew_g0(&(f->g0),cc); -else if(cc<G123_SIZE*G0_SIZE)return hnew_g1(&(f->g1),cc); -else if(cc<G123_SIZE*G123_SIZE*G0_SIZE)return hnew_g2(&(f->g2),cc); -else if(cc<G123_SIZE*G123_SIZE*G123_SIZE*G0_SIZE)return hnew_g3(&(f->g3),cc); -else return&g_undefined; -} -/*:325*/ -#line 7722 "hint.w" - - -/*363:*/ -#line 7125 "hint.w" - - -int unpack_ft_file(Font*f) -{int e; -/*360:*/ -#line 7095 "hint.w" - -if(ft_library==NULL) -{int e= FT_Init_FreeType(&ft_library); -if(e)QUIT("Unable to initialize the FreeType library"); -} -/*:360*/ -#line 7129 "hint.w" - -f->hpxs= 72.27/xdpi; -f->vpxs= 72.27/ydpi; -e= FT_New_Memory_Face(ft_library, -f->font_data,f->data_size,0,&(f->tt.face)); -if(e)return 0; -/*364:*/ -#line 7150 "hint.w" - -e= FT_Select_Charmap(f->tt.face,FT_ENCODING_ADOBE_CUSTOM); -if(e)LOG("Unable to select custom encoding for font %d\n",f->n); -/*:364*/ -#line 7135 "hint.w" - -/*365:*/ -#line 7158 "hint.w" - -e= FT_Set_Char_Size( -f->tt.face, -0, -(FT_F26Dot6)(0.5+(f->s*64.0*72.0/72.27)), -72.27/f->hpxs, -72.27/f->vpxs); -if(e)QUIT("Unable to set FreeType glyph size"); -FT_Set_Transform(f->tt.face,0,0); -/*:365*/ -#line 7136 "hint.w" - -f->ff= ft_format; -return 1; -} -/*:363*//*366:*/ -#line 7181 "hint.w" - -static void ft_unpack_glyph(Font*f,Gcache*g,uint32_t cc) -{int e,i; - -i= FT_Get_Char_Index(f->tt.face,cc); -e= FT_Load_Glyph( -f->tt.face, -i, -FT_LOAD_RENDER|FT_LOAD_TARGET_NORMAL); -if(e)QUIT("Unable to render FreeType glyph %c (%u)",(char)cc,cc); - -g->w= f->tt.face->glyph->bitmap.width; -g->h= f->tt.face->glyph->bitmap.rows; -g->hoff= -f->tt.face->glyph->bitmap_left; -g->voff= f->tt.face->glyph->bitmap_top-1; -g->bits= calloc(g->w*g->h,1); -if(g->bits==NULL)QUIT("Out of memory for FreeType glyph %c (%u)",(char)cc,cc); -memcpy(g->bits,f->tt.face->glyph->bitmap.buffer,g->w*g->h); - -g->ff= ft_format; -nativeSetFreeType(g); -} - -/*:366*/ -#line 7724 "hint.w" - - -/*351:*/ -#line 6796 "hint.w" - -#define PK_READ_1_BYTE() (data[i++]) -#define PK_READ_2_BYTE() (k= PK_READ_1_BYTE(),k= k<<8,k= k+data[i++],k) -#define PK_READ_3_BYTE() (k= PK_READ_2_BYTE(),k= k<<8,k= k+data[i++],k) -#define PK_READ_4_BYTE() (k= PK_READ_3_BYTE(),k= k<<8,k= k+data[i++],k) -/*:351*//*353:*/ -#line 6823 "hint.w" - -#define read_nybble(P) ((P).j&1?((P).data[(P).j++>>1]&0xF):(((P).data[(P).j++>>1]>>4)&0xF)) -/*:353*//*354:*/ -#line 6849 "hint.w" - -static int packed_number(PKparse*p) -{int i,k; -i= read_nybble(*p); -if(i==0) -{do{k= read_nybble(*p);i++;}while(k==0); -while(i--> 0)k= k*16+read_nybble(*p); -return k-15+(13-p->f)*16+p->f; -} -else if(i<=p->f)return i; -else if(i<14)return(i-p->f-1)*16+read_nybble(*p)+p->f+1; -else -{if(i==14)p->r= packed_number(p); -else p->r= 1; -return packed_number(p); -} -} -/*:354*//*355:*/ -#line 6878 "hint.w" - -static void pk_runlength(Gcache*g,unsigned char*data){ -PKparse p; -int x,y; -unsigned char*bits; -int n; -unsigned char gray; -bits= g->bits= (unsigned char*)calloc(g->w*g->h,1); -if(bits==NULL){g->w= g->h= 0;return;} -p.j= 0; -p.r= 0; -p.f= g->pk.flag>>4; -p.data= data; -n= 0; -if((g->pk.flag>>3)&1)gray= 0x00; -else gray= 0xff; -y= 0; -while(y<g->h){ -x= 0; -while(x<(int)g->w) -{int d; -if(n<=0){ -n= packed_number(&p); -gray= ~gray; -} -d= g->w-x; -if(d> n)d= n; -for(;d> 0;d--,x++,n--) -bits[y*g->w+x]= gray; -} -y++; -while(p.r> 0&&y<g->h) -{int k; -for(k= 0;k<g->w;k++) -bits[y*g->w+k]= bits[(y-1)*g->w+k]; -p.r--; -y++; -} -} -} -/*:355*//*356:*/ -#line 6930 "hint.w" - -static void pk_bitmap(Gcache*g,unsigned char*data){ -unsigned char*bits; -int x,y; -unsigned char mask; - -g->bits= bits= (unsigned char*)calloc(g->w*g->h,1); -if(bits==NULL){g->w= g->h= 0;return;} -mask= 0x80; -for(y= 0;y<g->h;y++) -for(x= 0;x<g->w;x++) -{if(*data&mask) -bits[y*g->w+x]= 0x00; -else -bits[y*g->w+x]= 0xFF; -mask= mask>>1; -if(mask==0){data++;mask= 0x80;} -} -} -/*:356*//*357:*/ -#line 6953 "hint.w" - - -static void pkunpack_glyph(Gcache*g) -{int i,k; -unsigned char*data; -if(g==NULL||g->pk.encoding==NULL)return; -g->ff= pk_format; -if(g->bits!=NULL)return; -#if 0 -DBG(DBGRENDER,"Unpacking glyph %c (0x%x)",g->cc,g->cc); -#endif -data= g->pk.encoding; -i= 0; -if((g->pk.flag&7)<4) -{i= i+3; -i= i+1; -g->w= PK_READ_1_BYTE(); -g->h= PK_READ_1_BYTE(); -g->hoff= (signed char)PK_READ_1_BYTE(); -g->voff= (signed char)PK_READ_1_BYTE(); -} -else if((g->pk.flag&7)<7) -{i= i+3; -i= i+2; -g->w= PK_READ_2_BYTE(); -g->h= PK_READ_2_BYTE(); -g->hoff= (signed short int)PK_READ_2_BYTE(); -g->voff= (signed short int)PK_READ_2_BYTE(); -} -else -{i= i+4; -i= i+8; -g->w= PK_READ_4_BYTE(); -g->h= PK_READ_4_BYTE(); -g->hoff= (signed int)PK_READ_4_BYTE(); -g->voff= (signed int)PK_READ_4_BYTE(); -} -if((g->pk.flag>>4)==14)pk_bitmap(g,data+i); -else pk_runlength(g,data+i); -nativeSetPK(g); -} -/*:357*//*358:*/ -#line 6998 "hint.w" - - -static Gcache*hnew_glyph(Font*pk,unsigned int cc); - - - -#define PK_XXX1 240 -#define PK_XXX2 241 -#define PK_XXX3 242 -#define PK_XXX4 243 -#define PK_YYY 244 -#define PK_POST 245 -#define PK_NO_OP 246 -#define PK_PRE 247 -#define PK_ID 89 - - -int unpack_pk_file(Font*pk) - -{int i,j; -unsigned int k; -unsigned char flag; -unsigned char*data; -data= pk->font_data; -i= 0; -while(i<pk->data_size) -switch(flag= data[i++]) -{case PK_XXX1:j= PK_READ_1_BYTE();i= i+j;break; -case PK_XXX2:j= PK_READ_2_BYTE();i= i+j;break; -case PK_XXX3:j= PK_READ_3_BYTE();i= i+j;break; -case PK_XXX4:j= PK_READ_4_BYTE();i= i+j;break; -case PK_YYY:i= i+4;break; -case PK_NO_OP:break; -case PK_PRE: -{int csize; -pk->pk.id= PK_READ_1_BYTE(); -if(pk->pk.id!=PK_ID)return 0; -csize= PK_READ_1_BYTE(); -pk->pk.pk_comment= pk->font_data+i; -i= i+csize; -pk->pk.ds= PK_READ_4_BYTE()/(double)(1<<20); -pk->pk.cs= PK_READ_4_BYTE(); -pk->hpxs= (double)(1<<16)/PK_READ_4_BYTE(); -pk->vpxs= (double)(1<<16)/PK_READ_4_BYTE(); -if(pk->pk.ds!=pk->s) -{double m= pk->s/pk->pk.ds; -pk->hpxs*= m; -pk->vpxs*= m; -} -#if 0 -pk->comment[csize]= 0; -#endif -} -break; -case PK_POST:break; -case 248:case 249:case 250:case 251:case 252:case 253:case 254:case 255:break; -default: -{ -unsigned int pl; -unsigned int cc; -Gcache*g; -if((flag&7)==7) -{pl= PK_READ_4_BYTE(); -cc= PK_READ_4_BYTE(); -}else if((flag&4)==4) -{pl= PK_READ_2_BYTE(); -cc= PK_READ_1_BYTE(); -pl= pl+((flag&3)<<16); -}else -{pl= PK_READ_1_BYTE(); -cc= PK_READ_1_BYTE(); -pl= pl+((flag&3)<<8); -} -g= hnew_glyph(pk,cc); -g->pk.flag= flag; -g->pk.encoding= data+i; -g->bits= NULL; -i= i+pl; -} -break; -} -return 1; -} - -/*:358*/ -#line 7726 "hint.w" - - -/*318:*/ -#line 5801 "hint.w" - -struct font_s*hget_font(unsigned char f) -{Font*fp; -if(fonts[f]!=NULL)return fonts[f]; -DBG(DBGFONT,"Decoding new font %d\n",f); -if(f> max_ref[font_kind]) -QUIT("Undefined font %d\n",f); -fp= calloc(1,sizeof(*fp)); -if(fp==NULL) -QUIT("Out of memory for font %d",f); -else -{unsigned char*spos,*sstart,*send; -spos= hpos;sstart= hstart;send= hend; -fp->n= f; -hget_section(hglyph_section(f)); -fp->font_data= hstart; -fp->data_size= hend-hstart; -hpos= spos;hstart= sstart;hend= send; -} -fp->s= font_at_size(f)/(double)(1<<16); -/*348:*/ -#line 6733 "hint.w" - -if(fp->font_data[0]==0xF7&&fp->font_data[1]==0x59) -{fp->ff= pk_format; -if(!unpack_pk_file(fp)){free(fp);fp= NULL;} -} -/*:348*//*367:*/ -#line 7208 "hint.w" - -else if(unpack_ft_file(fp)) -fp->ff= ft_format; -else -{QUIT("Font format not supported for font %d\n",fp->n); -free(fp);fp= NULL; -} -/*:367*/ -#line 5821 "hint.w" - -fonts[f]= fp; -return fonts[f]; -} -/*:318*//*320:*/ -#line 5839 "hint.w" - -static void hfree_glyph_cache(Font*f,bool rm); - -void hint_clear_fonts(bool rm) -{int f; -DBG(DBGFONT,rm?"Clear font data":"Clear native glyph data"); -for(f= 0;f<=max_ref[font_kind];f++) -if(fonts[f]!=NULL) -{hfree_glyph_cache(fonts[f],rm); -if(rm){free(fonts[f]);fonts[f]= NULL;} -} -} -/*:320*//*326:*/ -#line 5999 "hint.w" - -static void hfree_g0(struct gcache_s**g,bool rm) -{int i; -if(g==NULL)return; -for(i= 0;i<G0_SIZE;i++) -if(g[i]!=NULL) -{nativeFreeGlyph(g[i]); -if(rm){ -if(g[i]->bits!=NULL)free(g[i]->bits); -free(g[i]);g[i]= NULL;} -} -} - -static void hfree_g1(struct gcache_s***g,bool rm) -{int i; -if(g==NULL)return; -for(i= 0;i<G123_SIZE;i++) -if(g[i]!=NULL) -{hfree_g0(g[i],rm); -if(rm){free(g[i]);g[i]= NULL;} -} -} - -static void hfree_g2(struct gcache_s****g,bool rm) -{int i; -if(g==NULL)return; -for(i= 0;i<G123_SIZE;i++) -if(g[i]!=NULL) -{hfree_g1(g[i],rm); -if(rm){free(g[i]);g[i]= NULL;} -} -} - - -static void hfree_g3(struct gcache_s*****g,bool rm) -{int i; -if(g==NULL)return; -for(i= 0;i<G123_SIZE;i++) -if(g[i]!=NULL) -{hfree_g2(g[i],rm); -if(rm){free(g[i]);g[i]= NULL;} -} -} - - -static void hfree_glyph_cache(Font*f,bool rm) -{if(f->g0!=NULL) -{hfree_g0(f->g0,rm); -if(rm){free(f->g0);f->g0= NULL;} -} -if(f->g1!=NULL) -{hfree_g1(f->g1,rm); -if(rm){free(f->g1);f->g1= NULL;} -} -if(f->g2!=NULL) -{hfree_g2(f->g2,rm); -if(rm){free(f->g2);f->g2= NULL;} -} -if(f->g3!=NULL) -{hfree_g3(f->g3,rm); -if(rm){free(f->g3);f->g3= NULL;} -} -} -/*:326*//*328:*/ -#line 6125 "hint.w" - -Gcache*hget_glyph(Font*f,unsigned int cc) -{ -Gcache*g= NULL; -g= g_lookup(f,cc); -if(g==NULL) -{if(f->ff==ft_format) -g= hnew_glyph(f,cc); -else -return NULL; -} -if(g->ff==no_format) -{if(f->ff==pk_format)pkunpack_glyph(g); -else if(f->ff==ft_format)ft_unpack_glyph(f,g,cc); -else QUIT("Font format not supported"); -} -return g; -} -/*:328*//*330:*/ -#line 6157 "hint.w" - -void render_char(int x,int y,struct font_s*f,uint32_t cc,uint8_t s) - -{double w,h,dx,dy; -Gcache*g= hget_glyph(f,cc); -if(g==NULL)return; - -dx= (double)g->hoff*f->hpxs; -dy= (double)g->voff*f->vpxs; -w= (double)g->w*f->hpxs; -h= (double)g->h*f->vpxs; -nativeGlyph(SP2PT(x),dx,SP2PT(y),dy,w,h,g,s); -} - -/*:330*/ -#line 7728 "hint.w" - - -/*:386*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/hfonts.h b/Build/source/texk/web2c/hitexdir/hintview/src/hfonts.h deleted file mode 100644 index 4af895a7b26..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/hfonts.h +++ /dev/null @@ -1,101 +0,0 @@ -/*385:*/ -#line 7697 "hint.w" - -#ifndef _HFONTS_H -#define _HFONTS_H - -/*315:*/ -#line 5767 "hint.w" - -typedef enum{no_format,pk_format,ft_format}FontFormat; -/*:315*//*316:*/ -#line 5779 "hint.w" - -/*349:*/ -#line 6772 "hint.w" - - -typedef struct -{unsigned char*pk_comment; -unsigned int cs; -double ds; -unsigned char id; -}PKfont; -/*:349*//*361:*/ -#line 7103 "hint.w" - -typedef struct -{FT_Face face; -}FTfont; -/*:361*//*362:*/ -#line 7110 "hint.w" - -typedef struct -{int dummy; -}FTglyph; -/*:362*/ -#line 5780 "hint.w" - - -typedef struct font_s{ -unsigned char n; -unsigned char*font_data; -int data_size; -double s; -double hpxs,vpxs; -/*322:*/ -#line 5874 "hint.w" - -struct gcache_s**g0; -struct gcache_s***g1; -struct gcache_s****g2; -struct gcache_s*****g3; - -/*:322*/ -#line 5788 "hint.w" - -FontFormat ff; -union{PKfont pk;FTfont tt;}; -}Font; -/*:316*//*327:*/ -#line 6086 "hint.w" - -/*350:*/ -#line 6785 "hint.w" - -typedef struct -{unsigned char flag; -unsigned char*encoding; -}PKglyph; -/*:350*//*352:*/ -#line 6812 "hint.w" - -typedef struct{ -int j; -int r; -int f; -unsigned char*data; -}PKparse; -/*:352*/ -#line 6087 "hint.w" - - -struct gcache_s{ -int w,h; -int hoff,voff; -unsigned char*bits; -unsigned int GLtexture; -FontFormat ff; -union{ -PKglyph pk; -FTglyph tt; -}; -}; -typedef struct gcache_s Gcache; -/*:327*/ -#line 7701 "hint.w" - - - -#endif -/*:385*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/hint.c b/Build/source/texk/web2c/hitexdir/hintview/src/hint.c deleted file mode 100644 index aca2f30edbc..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/hint.c +++ /dev/null @@ -1,3860 +0,0 @@ -/*382:*/ -#line 7612 "hint.w" - -#include "basetypes.h" -#include <string.h> -#include <math.h> -#include <zlib.h> -#include "error.h" -#include "format.h" -#include "hrender.h" -#include "get.h" -#include "htex.h" -#include "hint.h" - -/*84:*/ -#line 1311 "hint.w" - -#define HGET_STRING(S) S= (char*)hpos;\ - while(hpos<hend && *hpos!=0) { RNG("String character",*hpos,0x20,0x7E); hpos++;}\ - hpos++; -/*:84*//*85:*/ -#line 1323 "hint.w" - -#define HGET_XDIMEN(I,X) \ -{ if((I)&b100) HGET32((X).w); else (X).w= 0;\ - if((I)&b010) (X).h= hget_float32(); else (X).h= 0.0;\ - if((I)&b001) (X).v= hget_float32(); else (X).v= 0.0;\ -} -/*:85*//*89:*/ -#line 1426 "hint.w" - -#define HGET_STRETCH(F,O) { Stch _st; HGET32(_st.u); (O)= _st.u&3; _st.u&= ~3; (F)= (scaled)(_st.f*ONE); } -/*:89*//*91:*/ -#line 1437 "hint.w" - -#define HGET_GLYPH(I) \ -{uint8_t f; uint32_t c;\ - if (I==1) c= HGET8;\ - else if (I==2) HGET16(c);\ - else if (I==3) HGET24(c);\ - else if (I==4) HGET32(c);\ - f= HGET8; REF_RNG(font_kind,f);\ - tail_append(new_character(f,c));\ -} -/*:91*//*99:*/ -#line 1519 "hint.w" - -#define HGET_RULE(I)\ -pointer p= new_rule();\ -if ((I)&b100) HGET32(height(p)); else height(p)= null_flag;\ -if ((I)&b010) HGET32(depth(p)); else depth(p)= null_flag;\ -if ((I)&b001) HGET32(width(p)); else width(p)= null_flag; -/*:99*//*105:*/ -#line 1581 "hint.w" - -#define HGET_GLUE(I) \ - p= get_node(glue_spec_size); \ - if((I)!=b111) { if ((I)&b100) HGET32(width(p)); else width(p)= 0; }\ - if((I)&b010) HGET_STRETCH(stretch(p),stretch_order(p)) else stretch(p)= 0, stretch_order(p)= normal;\ - if((I)&b001) HGET_STRETCH(shrink(p),shrink_order(p)) else shrink(p)= 0, shrink_order(p)= normal;\ - if(I==b111) width(p)= hget_xdimen_node(); -/*:105*//*115:*/ -#line 1858 "hint.w" - -#define HGET_BOX(I) \ -p= new_null_box();\ -HGET32(height(p));\ -if ((I)&b001) HGET32(depth(p));\ -HGET32(width(p));\ -if ((I)&b010) HGET32(shift_amount(p));\ -if ((I)&b100) {int8_t x; glue_set(p)= hget_float32();\ - x= HGET8; glue_order(p)= x&0xF;\ - x= x>>4; glue_sign(p)= (x<0?shrinking:(x> 0?stretching:normal));}\ -list_ptr(p)= hget_list_pointer(); -/*:115*//*122:*/ -#line 1982 "hint.w" - -#define HGET_SET(I) \ - scaled x, st, sh; uint8_t sto, sho; \ - p= new_null_box();\ - HGET32(height(p)); if ((I)&b001) HGET32(depth(p)); HGET32(width(p));\ - if ((I)&b010) HGET32(shift_amount(p));\ - HGET_STRETCH(st,sto); HGET_STRETCH(sh,sho);\ - if ((I)&b100) x= hget_xdimen_node(); else x= hget_xdimen_ref(HGET8);\ - list_ptr(p)= hget_list_pointer(); -/*:122*//*129:*/ -#line 2142 "hint.w" - -#define HGET_PACK(K,I) \ -{ pointer p; scaled x, s= 0, d; uint8_t m; \ - if ((I)&b001) m= additional; else m= exactly; \ - if ((I)&b010) HGET32(s);\ - if (K==vpack_kind) HGET32(d); \ - if ((I)&b100) x= hget_xdimen_node(); else x= hget_xdimen_ref(HGET8);\ - p= hget_list_pointer(); \ - if (K==vpack_kind) { if (d<=MAX_DIMEN && d>=-MAX_DIMEN) p= vpackage(p,x,m,d); else p= vtop(p,x,m,d); } \ - else p= hpack(p,x,m);\ - shift_amount(p)= s;\ - happend_to_vlist(p);} -/*:129*//*134:*/ -#line 2227 "hint.w" - -#define HGET_KERN(I) \ -pointer p; scaled x; \ -if (((I)&b011)==0) x= hget_dimen_ref(HGET8);\ -else if (((I)&b011)==1) x= hget_xdimen_ref(HGET8);\ -else if (((I)&b011)==2) HGET32(x);\ -else if (((I)&b011)==3) x= hget_xdimen_node();\ -p= new_kern(x);\ -if ((I)&b100) subtype(p)= explicit;\ -tail_append(p); -/*:134*//*138:*/ -#line 2278 "hint.w" - -#define HGET_LEADERS(I) \ -{pointer p;\ - if ((I)&b100)p= hget_glue_node(); else {p= spec2glue(zero_glue); incr(glue_ref_count(zero_glue));} \ -subtype(p)= a_leaders+((I)&b011)-1;\ -if (KIND(*hpos)==rule_kind) leader_ptr(p)= hget_rule_node(); \ -else if (KIND(*hpos)==hbox_kind) leader_ptr(p)= hget_hbox_node(); \ -else leader_ptr(p)= hget_vbox_node();\ -tail_append(p);} -/*:138*//*142:*/ -#line 2324 "hint.w" - -#define HGET_BASELINE(I) \ - cur_list.bs_pos= hpos-1; \ - if((I)&b001) HGET32(cur_lsl); else cur_lsl= 0; \ - if((I)&b100) cur_bs= hget_glue_spec(); else cur_bs= zero_glue; \ - if((I)&b010) cur_ls= hget_glue_spec(); else cur_ls= zero_glue; -/*:142*//*147:*/ -#line 2378 "hint.w" - -#define HGET_LIG(I) \ -{pointer p,q;uint8_t f;\ -f= HGET8;\ -if ((I)==7) q= hget_list_pointer(); else q= hget_text_list(I);\ -if (q==null) QUIT("Ligature with empty list");\ -p= new_ligature(f, character(q), link(q)); tail_append(p);\ -link(q)= null; flush_node_list(q);\ -} -/*:147*//*151:*/ -#line 2430 "hint.w" - -#define HGET_DISC(I)\ - pointer p= new_disc(); \ - if ((I)&b100) {uint8_t r; r= HGET8; set_replace_count(p,r); \ - if ((r&0x80)==0) set_auto_disc(p); }\ - else set_auto_disc(p); \ - if ((I)&b010) pre_break(p)= hget_list_pointer(); \ - if ((I)&b001) post_break(p)= hget_list_pointer(); -/*:151*//*157:*/ -#line 2503 "hint.w" - -#define HGET_PAR(I) \ -{ scaled x= 0;\ - ParamDef *q;\ - if ((I)==b100) q= hget_param_list_ref(HGET8);\ - if ((I)&b100) x= hget_xdimen_node(); else x= hget_xdimen_ref(HGET8);\ - if ((I)&b010) q= hget_param_list_node(); \ - else if ((I)!=b100) q= hget_param_list_ref(HGET8);\ - hget_paragraph(x,0,q);\ -} -/*:157*//*178:*/ -#line 2935 "hint.w" - -#define HGET_MATH(I) \ -{ ParamDef *q; pointer p= null, a= null;\ -if ((I)&b100) q= hget_param_list_node(); else q= hget_param_list_ref(HGET8);\ -if ((I)&b010) a= hget_hbox_node(); \ -p= hget_list_pointer(); \ -if ((I)&b001) a= hget_hbox_node();\ -hset_param_list(q); hdisplay(p,a,((I)&b010)!=0); hrestore_param_list();\ -} -/*:178*//*184:*/ -#line 3004 "hint.w" - -#define HGET_ADJUST(I) \ -{ pointer p;\ - p= get_node(small_node_size); type(p)= adjust_node; subtype(p)= normal;\ - adjust_ptr(p)= hget_list_pointer(); \ - tail_append(p);\ -} -/*:184*//*186:*/ -#line 3020 "hint.w" - -#define HGET_TABLE(I) \ -if(I&b010) ; else ;\ -if ((I)&b001) ; else ;\ -if ((I)&b100) hget_xdimen_node(); else hget_xdimen_ref(HGET8);\ -hget_list_pointer(); \ -hget_list_pointer(); -/*:186*//*191:*/ -#line 3107 "hint.w" - -#define HGET_STREAM(I) \ -{ ParamDef *q; pointer p;\ - p= get_node(ins_node_size); type(p)= ins_node;\ - subtype(p)= HGET8;RNG("Stream",subtype(p),1,254); \ - if ((I)&b010) q= hget_param_list_node(); else q= hget_param_list_ref(HGET8); \ - ins_ptr(p)= hget_list_pointer(); \ - hset_stream_params(p,q); \ - tail_append(p);} -/*:191*//*195:*/ -#line 3139 "hint.w" - -#define HGET_IMAGE(I) \ -{pointer p; float32_t a= 0.0; scaled w,h;\ -p= get_node(image_node_size); type(p)= whatsit_node; subtype(p)= image_node;\ -HGET16(image_no(p));RNG("Section number",image_no(p),3,max_section_no); \ -if ((I)&b100) { a= hget_float32();\ - if ((I)==b111) {w= hget_xdimen_node();h= hget_xdimen_node();}\ - else if ((I)==b110) {h= hget_xdimen_ref(HGET8);w= hget_xdimen_node();}\ - else if ((I)==b101) {w= hget_xdimen_ref(HGET8);h= hget_xdimen_node();}\ - else {w= hget_xdimen_ref(HGET8);h= hget_xdimen_ref(HGET8);}\ - if (a!=0.0) { if (h==0) h= round(w/a); else if (w==0) w= round(h*a);\ - else if (w> round(h*a)) w= round(h*a); else if (h> round(w/a)) h= round(w/a);}}\ -else if((I)==b011) {HGET32(w);HGET32(h);} \ -else if((I)==b010) { a= hget_float32(); HGET32(w); h= round(w/a);}\ -else if((I)==b001){ a= hget_float32(); HGET32(h); w= round(h*a);}\ -if (w==0 || h==0) QUIT("Incomplete dimensions in image %d",image_no(p));\ -image_width(p)= w; image_height(p)= h;\ -image_alt(p)= hget_list_pointer();\ -tail_append(p);} -/*:195*//*199:*/ -#line 3204 "hint.w" - -#define HGET_LINK(I) \ -{ pointer p;\ - p= get_node(link_node_size); type(p)= whatsit_node;\ - if (I&b010) subtype(p)= start_link_node; else subtype(p)= end_link_node;\ - if (I&b001) HGET16(label_ref(p)); else label_ref(p)= HGET8; \ - RNG("label",label_ref(p),0,max_ref[label_kind]);\ - label_has_name(p)= 0;\ - tail_append(p);} -/*:199*/ -#line 7624 "hint.w" - -/*86:*/ -#line 1331 "hint.w" - -#define HTEG_XDIMEN(I,X) \ - if((I)&b001) (X).v= hteg_float32(); else (X).v= 0.0;\ - if((I)&b010) (X).h= hteg_float32(); else (X).h= 0.0;\ - if((I)&b100) HTEG32((X).w); else (X).w= 0;\ -/*:86*//*90:*/ -#line 1429 "hint.w" - -#define HTEG_STRETCH(F,O) { Stch _st; HTEG32(_st.u); (O)= _st.u&3; _st.u&= ~3; (F)= (scaled)(_st.f*ONE); } -/*:90*//*92:*/ -#line 1449 "hint.w" - -#define HTEG_GLYPH(I) \ -{uint8_t f; uint32_t c;\ - f= HTEG8; REF_RNG(font_kind,f);\ - if (I==1) c= HTEG8;\ - else if (I==2) HTEG16(c);\ - else if (I==3) HTEG24(c);\ - else if (I==4) HTEG32(c);\ - tail_append(new_character(f,c));\ -} -/*:92*//*100:*/ -#line 1528 "hint.w" - -#define HTEG_RULE(I)\ -pointer p= new_rule();\ -if ((I)&b001) HTEG32(width(p)); else width(p)= null_flag;\ -if ((I)&b010) HTEG32(depth(p)); else depth(p)= null_flag;\ -if ((I)&b100) HTEG32(height(p)); else height(p)= null_flag; -/*:100*//*107:*/ -#line 1594 "hint.w" - -#define HTEG_GLUE(I) \ - p= get_node(glue_spec_size); \ - if(I==b111) width(p)= hget_xdimen_node();\ - if((I)&b001) HTEG_STRETCH(shrink(p),shrink_order(p)) else shrink(p)= 0, shrink_order(p)= normal;\ - if((I)&b010) HTEG_STRETCH(stretch(p),stretch_order(p)) else stretch(p)= 0, stretch_order(p)= normal;\ - if((I)!=b111) { if ((I)&b100) HGET32(width(p)); else width(p)= 0; } -/*:107*//*116:*/ -#line 1871 "hint.w" - -#define HTEG_BOX(I) \ -p= new_null_box();\ -list_ptr(p)= hteg_list_pointer();\ -if ((I)&b100) {int8_t x= HTEG8; glue_order(p)= x&0xF;\ - x= x>>4; glue_sign(p)= (x<0?shrinking:(x> 0?stretching:normal));\ - glue_set(p)= hteg_float32(); }\ -if ((I)&b010) HTEG32(shift_amount(p));\ -HTEG32(width(p));\ -if ((I)&b001) HTEG32(depth(p));\ -HTEG32(height(p));\ -node_pos= hpos-hstart-1; -/*:116*//*123:*/ -#line 1994 "hint.w" - -#define HTEG_SET(I) \ - scaled x, st, sh; uint8_t sto, sho; \ - p= new_null_box();\ - list_ptr(p)= hteg_list_pointer();\ - if ((I)&b100) x= hteg_xdimen_node(); else x= hget_xdimen_ref(HTEG8);\ - HTEG_STRETCH(sh,sho);HTEG_STRETCH(st,sto);\ - if ((I)&b010) HTEG32(shift_amount(p)); \ - HTEG32(width(p));if ((I)&b001) HTEG32(depth(p));HTEG32(height(p)); \ - node_pos= hpos-hstart-1; -/*:123*//*130:*/ -#line 2156 "hint.w" - -#define HTEG_PACK(K,I) \ -{ pointer p; scaled x, s, d; uint8_t m; \ - p= hteg_list_pointer();\ - if ((I)&b100) x= hteg_xdimen_node(); else x= hget_xdimen_ref(HTEG8);\ - if (K==vpack_kind) HTEG32(d); \ - if ((I)&b010) HTEG32(s);\ - if ((I)&b001) m= additional; else m= exactly; \ - node_pos= hpos-hstart-1;\ - if (K==vpack_kind) { if (d<=MAX_DIMEN && d>=-MAX_DIMEN) p= vpackage(p,x,m,d); else p= vtop(p,x,m,d); } \ - else p= hpack(p,x,m);\ - hprepend_to_vlist(p);} -/*:130*//*135:*/ -#line 2240 "hint.w" - -#define HTEG_KERN(I) \ -pointer p; scaled x; \ -if (((I)&b011)==0) x= hget_dimen_ref(HTEG8);\ -else if (((I)&b011)==1) x= hget_xdimen_ref(HTEG8);\ -else if (((I)&b011)==2) HTEG32(x);\ -else if (((I)&b011)==3) x= hteg_xdimen_node();\ -p= new_kern(x);\ -if ((I)&b100) subtype(p)= explicit;\ -tail_append(p); -/*:135*//*139:*/ -#line 2289 "hint.w" - -#define HTEG_LEADERS(I) \ -{pointer p,q;\ -if (KIND(*(hpos-1))==rule_kind) q= hteg_rule_node(); \ -else if (KIND(*(hpos-1))==hbox_kind) q= hteg_hbox_node(); \ -else q= hteg_vbox_node();\ -if ((I)&b100) p= hteg_glue_node(); else {p= spec2glue(zero_glue); incr(glue_ref_count(zero_glue));} \ -leader_ptr(p)= q;subtype(p)= a_leaders+((I)&b011)-1;\ -tail_append(p);} -/*:139*//*143:*/ -#line 2332 "hint.w" - -#define HTEG_BASELINE(I) \ - if((I)&b010) cur_ls= hteg_glue_spec(); else cur_ls= zero_glue; \ - if((I)&b100) cur_bs= hteg_glue_spec(); else cur_bs= zero_glue; \ - if((I)&b001) HTEG32(cur_lsl); else cur_lsl= 0; \ - cur_list.bs_pos= hpos-1; -/*:143*//*148:*/ -#line 2389 "hint.w" - -#define HTEG_LIG(I) \ -{pointer p,q;\ -if ((I)==7) q= hteg_list_pointer();\ -else {uint8_t *t= hpos; hpos= t-I; q= hget_text_list(I); hpos= t-I;}\ -if (q==null) QUIT("Ligature with empty list");\ -p= new_ligature(0, character(q), link(q)); tail_append(p);\ -link(q)= null; flush_node_list(q);\ -font(lig_char(p))= HTEG8;\ -} -/*:148*//*152:*/ -#line 2440 "hint.w" - -#define HTEG_DISC(I)\ - pointer p= new_disc(); \ - if ((I)&b001) post_break(p)= hteg_list_pointer(); \ - if ((I)&b010) pre_break(p)= hteg_list_pointer(); \ - if ((I)&b100) {uint8_t r; r= HTEG8; set_replace_count(p,r); \ - if ((r&0x80)==0) set_auto_disc(p); }\ - else set_auto_disc(p); -/*:152*//*179:*/ -#line 2946 "hint.w" - -#define HTEG_MATH(I) \ -{ ParamDef *q; pointer p= null, a= null;\ -if ((I)&b001) a= hteg_hbox_node();\ -p= hteg_list_pointer(); \ -if ((I)&b010) a= hteg_hbox_node(); \ -if ((I)&b100) q= hteg_param_list_node(); else q= hget_param_list_ref(HTEG8);\ -hset_param_list(q); hdisplay(p,a,((I)&b010)!=0); hrestore_param_list();\ -} -/*:179*//*187:*/ -#line 3029 "hint.w" - -#define HTEG_TABLE(I) \ -if(I&b010) ; else ;\ -if ((I)&b001) ; else ;\ -hteg_list_pointer(); \ -hteg_list_pointer(); \ -if ((I)&b100) hteg_xdimen_node(); else hget_xdimen_ref(HTEG8); -/*:187*//*192:*/ -#line 3118 "hint.w" - -#define HTEG_STREAM(I) \ -{pointer p= get_node(ins_node_size); type(p)= ins_node;\ - ins_ptr(p)= hteg_list_pointer();\ - if ((I)&b010) {ParamDef *q= hteg_param_list_node(); hset_stream_params(p,q);}\ - else {ParamDef *q= hget_param_list_ref(HTEG8); hset_stream_params(p,q);}\ - subtype(p)= HTEG8;RNG("Stream",subtype(p),1,254);\ - tail_append(p);} -/*:192*//*196:*/ -#line 3160 "hint.w" - -#define HTEG_IMAGE(I) \ -{ pointer p; float32_t a= 0.0; scaled w,h;\ -p= get_node(image_node_size); type(p)= whatsit_node; subtype(p)= image_node;\ -image_alt(p)= hteg_list_pointer();\ -if ((I)&b100) {\ - if ((I)==b111) {h= hteg_xdimen_node();w= hteg_xdimen_node();}\ - else if ((I)==b110) {w= hteg_xdimen_node();h= hget_xdimen_ref(HTEG8);}\ - else if ((I)==b101) {h= hteg_xdimen_node();w= hget_xdimen_ref(HTEG8);}\ - else {h= hget_xdimen_ref(HTEG8);w= hget_xdimen_ref(HTEG8);}\ - a= hteg_float32();\ - if (a!=0.0) { if (h==0) h= round(w/a); else if (w==0) w= round(h*a);\ - else if (w> round(h*a)) w= round(h*a); else if (h> round(w/a)) h= round(w/a); }}\ -else if((I)==b011) {HTEG32(h);HTEG32(w);} \ -else if((I)==b010) { HTEG32(w); a= hteg_float32(); h= round(w/a);}\ -else if((I)==b001){ HTEG32(h); a= hteg_float32(); w= round(h*a);}\ -HTEG16(image_no(p));RNG("Section number",image_no(p),3,max_section_no); \ -if (w==0 || h==0) QUIT("Incomplete dimensions in image %d",image_no(p));\ -image_width(p)= w; image_height(p)= h;\ -tail_append(p);} -/*:196*//*200:*/ -#line 3215 "hint.w" - -#define HTEG_LINK(I) \ -{ pointer p;\ - p= get_node(link_node_size); type(p)= whatsit_node;\ - if (I&b010) subtype(p)= start_link_node; else subtype(p)= end_link_node;\ - if (I&b001) HTEG16(label_ref(p)); else label_ref(p)= HTEG8; \ - RNG("label",label_ref(p),0,max_ref[label_kind]);\ - label_has_name(p)= 0;\ - tail_append(p);} -/*:200*/ -#line 7625 "hint.w" - - -/*21:*/ -#line 381 "hint.w" - -typedef struct{pointer bs,ls;scaled lsl;}BaselineSkip; -/*:21*//*28:*/ -#line 491 "hint.w" - -typedef struct{ -char*n; -uint16_t m,q; -scaled s; -pointer g; -pointer h; -pointer p[MAX_FONT_PARAMS+1]; -}FontDef; -extern FontDef*font_def; -/*:28*//*37:*/ -#line 596 "hint.w" - -typedef struct{ -uint8_t n,k; -int32_t v; -}Param; - -typedef struct ParamDef{ -struct ParamDef*next; -Param p;}ParamDef; -/*:37*/ -#line 7627 "hint.w" - - - -/*2:*/ -#line 206 "hint.w" - -pointer*pointer_def[32]= {NULL}; -/*:2*//*6:*/ -#line 255 "hint.w" - -int32_t*integer_def; -/*:6*//*10:*/ -#line 285 "hint.w" - -scaled*dimen_def; -/*:10*//*14:*/ -#line 315 "hint.w" - -Xdimen*xdimen_def; -/*:14*//*22:*/ -#line 385 "hint.w" - -BaselineSkip*baseline_def= NULL; -/*:22*//*29:*/ -#line 503 "hint.w" - -FontDef*font_def; -/*:29*//*38:*/ -#line 608 "hint.w" - -ParamDef**param_def; -/*:38*//*45:*/ -#line 761 "hint.w" - -typedef struct{ -uint8_t pg; -uint32_t f,t; -}RangeDef; -RangeDef*range_def; -/*:45*//*50:*/ -#line 818 "hint.w" - -Stream*streams; -/*:50*//*53:*/ -#line 832 "hint.w" - -typedef struct{ -Xdimen x; -int f; -int p,n,r; -pointer b,a; -Xdimen w; -pointer g; -pointer h; -}StreamDef; -/*:53*//*57:*/ -#line 905 "hint.w" - -typedef struct{ -char*n; -Dimen d; -pointer g; -uint8_t p; -uint32_t t; -Xdimen v,h; -StreamDef*s; -}PageDef; -PageDef*page_def; -PageDef*cur_page; -/*:57*//*65:*/ -#line 1040 "hint.w" - -hint_Outline*hint_outlines= NULL; -int outline_no= -1; -/*:65*//*168:*/ -#line 2775 "hint.w" - -static ParamDef*line_break_params= NULL; -/*:168*//*211:*/ -#line 3515 "hint.w" - -static scaled page_height; -static scaled top_so_far[8]; -/*:211*//*226:*/ -#line 3793 "hint.w" - -static uint32_t map[0x10000]; -/*:226*//*231:*/ -#line 3857 "hint.w" - -#define MAX_PAGE_POS (1<<3) - -uint64_t page_loc[MAX_PAGE_POS]; -int cur_loc; -static int lo_loc,hi_loc; -/*:231*//*248:*/ -#line 4254 "hint.w" - -scaled hvsize,hhsize; -/*:248*//*250:*/ -#line 4282 "hint.w" - -int page_v,page_h,offset_v,offset_h; -/*:250*//*308:*/ -#line 5552 "hint.w" - -hint_Link*hint_links= NULL; -int max_link= -1; -/*:308*//*369:*/ -#line 7307 "hint.w" - -jmp_buf hint_error_exit; -char hint_error_string[MAX_HINT_ERROR]; -/*:369*/ -#line 7630 "hint.w" - -/*3:*/ -#line 211 "hint.w" - -static void hget_font_def(uint8_t a,uint8_t n); -static int32_t hget_integer_def(uint8_t a); -static scaled hget_dimen_def(uint8_t a); -static pointer hget_glue_def(uint8_t a); -static void hget_baseline_def(uint8_t a,uint8_t n); -static ParamDef*hget_param_list(uint8_t a); -static void hget_range_def(uint8_t a,uint8_t pg); -static void hget_page_def(uint8_t a,uint8_t n); -static void hget_outline_or_label_def(Info i,int n); -static void hget_font_metrics(); -static pointer hget_definition(uint8_t a); -/*:3*//*27:*/ -#line 472 "hint.w" - -static pointer hprepend_to_vlist(pointer b); -/*:27*//*36:*/ -#line 584 "hint.w" - -static pointer hget_glue_spec(void); -static pointer hget_disc_node(void); -/*:36*//*77:*/ -#line 1206 "hint.w" - -static void tag_mismatch(uint8_t a,uint8_t z,uint32_t a_pos,uint32_t z_pos); -/*:77*//*106:*/ -#line 1590 "hint.w" - -static scaled hget_xdimen_node(void); -/*:106*//*117:*/ -#line 1887 "hint.w" - -static pointer hget_list_pointer(void); -static pointer hteg_list_pointer(void); -/*:117*//*124:*/ -#line 2005 "hint.w" - -static scaled hget_xdimen_node(void); -/*:124*/ -#line 7631 "hint.w" - -/*9:*/ -#line 268 "hint.w" - -static int32_t hget_integer_def(uint8_t a) -{if(INFO(a)==1){int8_t n= HGET8;return n;} -else if(INFO(a)==2){int16_t n;HGET16(n);return n;} -else if(INFO(a)==4){int32_t n;HGET32(n);return n;} -else TAGERR(a); -return 0; -} - -static int32_t hget_integer_ref(uint8_t n) -{REF_RNG(int_kind,n); -return integer_def[n]; -} -/*:9*//*17:*/ -#line 326 "hint.w" - -static scaled xdimen(Xdimen*x) -{return round(x->w+(double)x->h*(double)hhsize+(double)x->v*(double)hvsize); -} -static scaled hget_xdimen_ref(uint8_t n) -{REF_RNG(xdimen_kind,n); -return xdimen(xdimen_def+n); -} -/*:17*//*19:*/ -#line 346 "hint.w" - - -static pointer hget_glue_ref(uint8_t n) -{REF_RNG(glue_kind,n); -return pointer_def[glue_kind][n]; -} - -static pointer hget_glue_def(uint8_t a) -{pointer p; -if(INFO(a)==b000) -{p= hget_glue_ref(HGET8); -add_glue_ref(p); -} -else -{HGET_GLUE(INFO(a));} -return p; -} - -pointer hget_param_glue(uint8_t n) -{REF_RNG(glue_kind,n); -return new_glue(pointer_def[glue_kind][n]); -} -/*:19*//*32:*/ -#line 516 "hint.w" - -static void hget_font_def(uint8_t a,uint8_t n) -{char*t; -FontDef*f= font_def+n; -HGET_STRING(t);f->n= strdup(t); -DBG(DBGDEF,"Font %d: %s\n",n,t); -HGET32(f->s);RNG("Font size",f->s,1,0x7fffffff); -HGET16(f->m);RNG("Font metrics",f->m,3,max_section_no); -HGET16(f->q);RNG("Font glyphs",f->q,3,max_section_no); -f->g= hget_glue_spec(); -f->h= hget_disc_node(); -DBG(DBGDEF,"Start font parameters\n"); -while(KIND(*hpos)!=font_kind) -{Kind k; -uint8_t n; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 531 "hint.w" - -k= KIND(a); -n= HGET8; -DBG(DBGDEF,"Reading font parameter %d: %s\n",n,definition_name[k]); -if(k!=penalty_kind&&k!=kern_kind&&k!=ligature_kind&& -k!=disc_kind&&k!=glue_kind&&k!=language_kind&&k!=rule_kind&&k!=image_kind) -QUIT("Font parameter %d has invalid type %s",n,content_name[n]); -RNG("Font parameter",n,0,MAX_FONT_PARAMS); -f->p[n]= hget_definition(a); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 540 "hint.w" - -} -DBG(DBGDEF,"End font definition\n"); -} -/*:32*//*33:*/ -#line 549 "hint.w" - -static void hget_font_metrics(void) -{int i; -for(i= 0;i<=max_ref[font_kind];i++) -if(font_def[i].m!=0) -{int s; -hget_section(font_def[i].m); -s= font_def[i].s; -if(s==0)s= -1000; -read_font_info(i,font_def[i].n,s); -font_def[i].s= font_size[i]; -} -} -/*:33*//*41:*/ -#line 625 "hint.w" - -static void free_param_list(ParamDef*p) -{while(p!=NULL) -{ParamDef*q= p; -p= p->next; -free(q); -} -} -/*:41*//*42:*/ -#line 637 "hint.w" - -static ParamDef*hget_param_list(uint8_t a) -{uint32_t s,t; -ParamDef*p= NULL; -uint8_t*list_start,*list_end; -list_start= hpos; -s= hget_list_size(INFO(a)); -hget_size_boundary(INFO(a)); -list_end= hpos+s; -if(list_end>=hend) -QUIT("list end after before stream end\n"); -while(hpos<list_end) -{ParamDef*r;Param*q; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 650 "hint.w" - -ALLOCATE(r,1,ParamDef); -q= &(r->p); -q->n= HGET8; -q->k= KIND(a); -DBG(DBGTAGS,"Defining %s %d\n",definition_name[KIND(a)],q->n); -if(KIND(a)==int_kind)q->v= hget_integer_def(a); -else if(KIND(a)==dimen_kind)q->v= hget_dimen_def(a); -else if(KIND(a)==glue_kind)q->v= hget_glue_def(a); -else TAGERR(a); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 660 "hint.w" - -r->next= p; -p= r; -} -hget_size_boundary(INFO(a)); -t= hget_list_size(INFO(a)); -if(t!=s) -QUIT("List sizes at "SIZE_F" and "SIZE_F" do not match 0x%x != 0x%x",list_start-hstart,list_end-hstart,s,t); -return p; -} - -ParamDef*hget_param_list_node(void) -{if(KIND(*hpos)!=param_kind)return NULL; -else -{ParamDef*p; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 675 "hint.w" - -p= hget_param_list(a); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 677 "hint.w" - -return p; -} -} - -ParamDef*hget_param_list_ref(uint8_t n) -{REF_RNG(param_kind,n); -return param_def[n]; -} -/*:42*//*43:*/ -#line 712 "hint.w" - -#define MAX_SAVE 100 -#define SAVE_BOUNDARY 0xFF -static Param par_save[MAX_SAVE]; -static int par_save_ptr= 0; - -static void hset_param(uint8_t k,uint8_t n,int32_t v) -{Param*q; -if(par_save_ptr>=MAX_SAVE)QUIT("Parameter save stack overflow"); -q= &(par_save[par_save_ptr++]); -q->k= k; -q->n= n; -if(q->k==int_kind) -{q->v= integer_def[q->n];integer_def[q->n]= v;} -else if(q->k==dimen_kind) -{q->v= dimen_def[q->n];dimen_def[q->n]= (scaled)v;} -else if(q->k==glue_kind) -{q->v= pointer_def[glue_kind][q->n];pointer_def[glue_kind][q->n]= (pointer)v;} -} - -void hset_param_list(ParamDef*p) -{hset_param(SAVE_BOUNDARY,0,0); -while(p!=NULL) -{hset_param(p->p.k,p->p.n,p->p.v); -p= p->next; -} -} - -void hrestore_param_list(void) -{ -while(par_save_ptr> 0) -{Param*q; -q= &(par_save[--par_save_ptr]); -if(q->k==SAVE_BOUNDARY)return; -if(q->k==int_kind) -{integer_def[q->n]= q->v;} -else if(q->k==dimen_kind) -{dimen_def[q->n]= (scaled)q->v;} -else if(q->k==glue_kind) -{pointer_def[glue_kind][q->n]= (pointer)q->v;} -} -QUIT("Parameter save stack flow"); -} -/*:43*//*48:*/ -#line 776 "hint.w" - -static void hget_range_def(uint8_t a,uint8_t pg) -{static uint8_t n= 0; -uint32_t f,t; -REF_RNG(page_kind,pg); -REF_RNG(range_kind,n); -if(INFO(a)&b100) -{if(INFO(a)&b001)HGET32(f);else HGET16(f);} -else f= 0; -if(INFO(a)&b010) -{if(INFO(a)&b001)HGET32(t);else HGET16(t);} -else t= HINT_NO_POS; -range_def[n].pg= pg; -range_def[n].f= f; -range_def[n].t= t; -DBG(DBGRANGE,"Range *%d from 0x%x\n",pg,f); -DBG(DBGRANGE,"Range *%d to 0x%x\n",pg,t); -n++; -} -#if 0 - -static uint8_t hget_page_ref(uint32_t pos) -{int i; -for(i= 1;i<=max_ref[range_kind];i++) -if(range_def[i].f<=pos&&pos<range_def[i].t)return range_def[i].pg; -return 0; -} -#endif -/*:48*//*54:*/ -#line 849 "hint.w" - -static void hget_xdimen_def_node(Xdimen*x); - -static bool hget_stream_def(StreamDef*s) -{if(KIND(*hpos)!=stream_kind||!(INFO(*hpos)&b100)) -return false; -else -{uint8_t n; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 857 "hint.w" - -DBG(DBGDEF,"Defining stream %d at "SIZE_F"\n",*hpos,hpos-hstart-1); -n= HGET8;REF_RNG(stream_kind,n); -s= s+n; -if(n> 0) -{if(INFO(a)==b100)/*55:*/ -#line 880 "hint.w" - -{DBG(DBGDEF,"Defining normal stream %d at "SIZE_F"\n",*(hpos-1),hpos-hstart-2); -hget_xdimen_def_node(&(s->x)); -HGET16(s->f);RNG("magnification factor",s->f,0,1000); -s->p= HGET8;if(s->p!=255)REF_RNG(stream_kind,s->p); -s->n= HGET8;if(s->n!=255)REF_RNG(stream_kind,s->n); -HGET16(s->r);RNG("split ratio",s->r,0,1000); -} -/*:55*/ -#line 862 "hint.w" - -else if(INFO(a)==b101)QUIT("first stream not yet implemented"); -else if(INFO(a)==b110)QUIT("last stream not yet implemented"); -else if(INFO(a)==b111)QUIT("top stream not yet implemented"); -s->b= hget_list_pointer(); -hget_xdimen_def_node(&(s->w)); -s->g= hget_glue_spec(); -s->a= hget_list_pointer(); -s->h= hget_glue_spec(); -} -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 872 "hint.w" - -return true; -} -} -/*:54*//*61:*/ -#line 949 "hint.w" - - -static void hset_cur_page(void) -{int i; -cur_page= &(page_def[0]); -for(i= 1;i<=max_ref[page_kind];i++) -if(page_def[i].p>=cur_page->p) -cur_page= &(page_def[i]); -} - -static void hskip_list(void); -static void hget_page_def(uint8_t a,uint8_t i) -{char*n; -cur_page= &(page_def[i]); -ALLOCATE(cur_page->s,max_ref[stream_kind]+1,StreamDef); -HGET_STRING(n);cur_page->n= strdup(n); -cur_page->p= HGET8; -cur_page->g= hget_glue_spec(); -HGET32(cur_page->d); -hget_xdimen_def_node(&(cur_page->v)); -hget_xdimen_def_node(&(cur_page->h)); -cur_page->t= hpos-hstart; -hskip_list(); -while(hget_stream_def(cur_page->s))continue; -} -/*:61*//*72:*/ -#line 1120 "hint.w" - -static pointer hget_ligature_ref(uint8_t n) -{REF_RNG(ligature_kind,n); -return copy_node_list(pointer_def[ligature_kind][n]); -} - -static pointer hget_rule_ref(uint8_t n) -{REF_RNG(rule_kind,n); -return copy_node_list(pointer_def[rule_kind][n]); -} - -static pointer hget_image_ref(uint16_t n) -{REF_RNG(image_kind,n); -return copy_node_list(pointer_def[image_kind][n]); -} - -static pointer hget_hyphen_ref(uint8_t n) -{REF_RNG(disc_kind,n); -return copy_node_list(pointer_def[disc_kind][n]); -} - -static pointer hget_leaders_ref(uint8_t n) -{REF_RNG(leaders_kind,n); -return copy_node_list(pointer_def[leaders_kind][n]); -} - - - - -/*:72*//*76:*/ -#line 1199 "hint.w" - -static void tag_mismatch(uint8_t a,uint8_t z,uint32_t a_pos,uint32_t z_pos) -{QUIT("Tag mismatch [%s,%d]!=[%s,%d] at 0x%x to 0x%x\n", -NAME(a),INFO(a),NAME(z),INFO(z),a_pos,z_pos); -} -/*:76*//*87:*/ -#line 1338 "hint.w" - - -static void hget_xdimen_def(Info i,Xdimen*x) -{switch(i) -{ -case b000: -{int n= HGET8; -REF_RNG(xdimen_kind,n); -x->w= xdimen_def[n].w; -x->h= xdimen_def[n].h; -x->v= xdimen_def[n].v; -break; -} -case b001:HGET_XDIMEN(b001,*x);break; -case b010:HGET_XDIMEN(b010,*x);break; -case b011:HGET_XDIMEN(b011,*x);break; -case b100:HGET_XDIMEN(b100,*x);break; -case b101:HGET_XDIMEN(b101,*x);break; -case b110:HGET_XDIMEN(b110,*x);break; -case b111:HGET_XDIMEN(b111,*x);break; -default: -x->w= 0;x->h= x->v= 0.0; -} -} -static scaled hget_xdimen(Info i) -{Xdimen x; -hget_xdimen_def(i,&x); -return xdimen(&x); -} - -static void tag_expected(uint8_t b,uint8_t a,uint32_t a_pos) -{QUIT("%s expected at 0x%x got [%s,%d]",NAME(b),a_pos,NAME(a),INFO(a)); -} - -static scaled hget_xdimen_node(void) -{scaled x= 0; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1374 "hint.w" - -if(KIND(a)==xdimen_kind) -x= hget_xdimen(INFO(a)); -else tag_expected(TAG(xdimen_kind,0),a,node_pos); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1378 "hint.w" - -return x; -} - -static void hget_xdimen_def_node(Xdimen*x) -{/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1383 "hint.w" - -if(KIND(a)==xdimen_kind) -hget_xdimen_def(INFO(a),x); -else tag_expected(TAG(xdimen_kind,0),a,node_pos); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1387 "hint.w" - -} -/*:87*//*88:*/ -#line 1391 "hint.w" - -scaled hteg_xdimen(uint8_t a) -{Xdimen x; -switch(a) -{ -case TAG(xdimen_kind,b000):return hget_xdimen_ref(HTEG8); -case TAG(xdimen_kind,b001):HTEG_XDIMEN(b001,x);break; -case TAG(xdimen_kind,b010):HTEG_XDIMEN(b010,x);break; -case TAG(xdimen_kind,b011):HTEG_XDIMEN(b011,x);break; -case TAG(xdimen_kind,b100):HTEG_XDIMEN(b100,x);break; -case TAG(xdimen_kind,b101):HTEG_XDIMEN(b101,x);break; -case TAG(xdimen_kind,b110):HTEG_XDIMEN(b110,x);break; -case TAG(xdimen_kind,b111):HTEG_XDIMEN(b111,x);break; -default: -x.w= 0;x.h= x.v= 0.0; -tag_expected(TAG(xdimen_kind,0),a,node_pos); -} -return xdimen(&x); -} - -scaled hteg_xdimen_node(void) -{scaled x= 0; -/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 1413 "hint.w" - -if(KIND(z)==xdimen_kind) -x= hteg_xdimen(z); -else -tag_expected(TAG(xdimen_kind,0),z,node_pos); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1418 "hint.w" - -return x; -} -/*:88*//*104:*/ -#line 1566 "hint.w" - -static pointer hteg_rule_node(void) -{pointer q= null; -/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 1569 "hint.w" - -if(KIND(z)==rule_kind){HTEG_RULE(INFO(z));q= p;} -else tag_expected(TAG(rule_kind,0),z,node_pos); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1572 "hint.w" - -return q; -} -/*:104*//*110:*/ -#line 1635 "hint.w" - -static pointer hget_glue_spec(void) -{pointer p= null; -uint8_t a,z; -if(hpos>=hend||KIND(*hpos)!=glue_kind) -{p= zero_glue;incr(glue_ref_count(p));} -else -{node_pos= hpos-hstart; -HGETTAG(a); -if(INFO(a)==b000) -{p= hget_glue_ref(HGET8);incr(glue_ref_count(p));} -else -{HGET_GLUE(INFO(a));} -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1648 "hint.w" - -} -return p; -} - -static pointer spec2glue(pointer q) -{pointer p; -p= get_node(small_node_size);type(p)= glue_node;subtype(p)= normal; -leader_ptr(p)= null;glue_ptr(p)= q; -return p; -} - -static pointer hget_glue_node(void) -{return spec2glue(hget_glue_spec()); -} -/*:110*//*111:*/ -#line 1665 "hint.w" - -static pointer hteg_glue_spec(void) -{pointer p= null; -uint8_t a,z; -if(hpos<=hstart)return null; -if(KIND(*(hpos-1))!=glue_kind)return null; -z= HTEG8,DBGTAG(z,hpos); -if(INFO(z)==b000)p= hget_glue_ref(HTEG8); -else -{HTEG_GLUE(INFO(z));} -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1675 "hint.w" - -return p; -} - - -static pointer hteg_glue_node(void) -{pointer p= hteg_glue_spec(); -if(p!=null)return spec2glue(p); -else return new_glue(zero_glue); -} -/*:111*//*112:*/ -#line 1700 "hint.w" - -static pointer hget_node_list(uint32_t s) -{uint8_t*list_end= hpos+s; -pointer p; -push_nest(); -cur_list.bs_pos= NULL; -while(hpos<list_end) -hget_content(); -if(needs_bs) -QUIT("Unexpected trailing baseline node"); -p= link(head); -pop_nest(); -return p; -} - -static pointer hget_text_list(uint32_t s); -static pointer hget_list_pointer(void) -{pointer p= null; -uint32_t s,t; -if(KIND(*hpos)==list_kind) -{/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1720 "hint.w" - -if((INFO(a)&b011)==0) -HGET8; -else -{s= hget_list_size(INFO(a)); -hget_size_boundary(INFO(a)); -if((INFO(a)&b100)==0) -p= hget_node_list(s); -else -p= hget_text_list(s); -hget_size_boundary(INFO(a)); -t= hget_list_size(INFO(a)); -if(t!=s) -QUIT("List sizes at 0x%x and "SIZE_F" do not match 0x%x != 0x%x", -node_pos+1,hpos-hstart-s-1,s,t); -} -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1736 "hint.w" - -} -return p; -} -/*:112*//*113:*/ -#line 1747 "hint.w" - - -static void hskip_list(void) -{if(KIND(*hpos)==list_kind||KIND(*hpos)==param_kind) -{Info i; -uint8_t a; -HGETTAG(a); -i= INFO(a)&0x3; -if(i==0)hpos= hpos+2; -else -{uint32_t s= hget_list_size(INFO(a)); -if(i==3)i= 4; -hpos= hpos+(1+s+1+i+1); -} -} -} - -static void hskip_list_back(void) -{if(KIND(*(hpos-1))==list_kind||KIND(*(hpos-1))==param_kind) -{Info i; -uint8_t z; -z= HTEG8; -i= INFO(z)&0x3; -if(i==0)hpos= hpos-2; -else -{uint32_t s= hteg_list_size(INFO(z)); -if(i==3)i= 4; -hpos= hpos-(1+s+1+i+1); -} -} -} - -pointer hteg_list_pointer(void) -{uint8_t*list_start; -pointer p; -hskip_list_back(); -list_start= hpos; -p= hget_list_pointer(); -hpos= list_start; -return p; -} -/*:113*//*114:*/ -#line 1797 "hint.w" - -#if 0 -static int32_t hteg_integer_def(uint8_t z) -{if(INFO(z)==1){int8_t n= HTEG8;return n;} -else if(INFO(z)==2){int16_t n;HTEG16(n);return n;} -else if(INFO(z)==4){int32_t n;HTEG32(n);return n;} -else TAGERR(z); -return 0; -} - -static ParamDef*hteg_param_list(uint8_t z) -{uint32_t s,t; -ParamDef*p= NULL; -uint8_t*list_start,*list_end; -list_end= hpos; -s= hteg_list_size(INFO(z)); -hteg_size_boundary(INFO(z)); -list_start= hpos-s; -if(list_start<=hstart) -QUIT("list start before stream start\n"); -while(list_start<hpos) -{ParamDef*r;Param*q; -/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 1819 "hint.w" - -ALLOCATE(r,1,ParamDef); -q= &(r->p); -q->k= KIND(z); -if(KIND(z)==int_kind)q->i= hteg_integer_def(a); -else if(KIND(a)==dimen_kind)HTEG32(q->d); -else if(KIND(a)==glue_kind){pointer p;HTEG_GLUE(INFO(z));q->g= p;} -else TAGERR(a); -q->n= HTEG8; -DBG(DBGTAGS,"Defining %s %d\n",definition_name[KIND(z)],q->n); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1829 "hint.w" - -r->next= p; -p= r; -} -hteg_size_boundary(INFO(z)); -t= hteg_list_size(INFO(z)); -if(t!=s) -QUIT("List sizes at "SIZE_F" and "SIZE_F" do not match 0x%x != 0x%x",list_start-hstart,list_end-hstart,s,t); -return p; -} -#endif - -static ParamDef*hteg_param_list_node(void) -{ParamDef*p; -uint8_t*list_start; -hskip_list_back(); -list_start= hpos; -p= hget_param_list_node(); -hpos= list_start; -return p; -} -/*:114*//*121:*/ -#line 1956 "hint.w" - -static pointer hteg_hbox_node(void) -{/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 1958 "hint.w" - -if(KIND(z)!=hbox_kind)tag_expected(TAG(hbox_kind,0),z,node_pos); -{pointer p; -HTEG_BOX(INFO(z)); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1962 "hint.w" - -return p; -} -} -static pointer hteg_vbox_node(void) -{/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 1967 "hint.w" - -if(KIND(z)!=vbox_kind)tag_expected(TAG(vbox_kind,0),z,node_pos); -{pointer p; -HTEG_BOX(INFO(z)); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1971 "hint.w" - -type(p)= vlist_node; -return p; -} -} - -/*:121*//*127:*/ -#line 2052 "hint.w" - -static void hset(pointer p, -uint8_t sto,scaled st,uint8_t sho,scaled sh,scaled w) -{scaled x; -x= width(p); -width(p)= w; - -x= w-x; -if(x==0) -{glue_sign(p)= normal;glue_order(p)= normal; -glue_set(p)= 0.0; -} -else if(x> 0) -{glue_order(p)= sto;glue_sign(p)= stretching; -if(st!=0) -glue_set(p)= (float32_t)(x/(double)st); -else -{glue_sign(p)= normal; -glue_set(p)= 0.0; -} -} -else -{glue_order(p)= sho;glue_sign(p)= shrinking; -if(sh!=0) -glue_set(p)= (float32_t)((-x)/(double)sh); -else -{glue_sign(p)= normal; -glue_set(p)= 0.0; -} -if((sh<-x)&&(sho==normal)&&(list_ptr(p)!=null)) -glue_set(p)= 1.0; -} -} -/*:127*//*128:*/ -#line 2095 "hint.w" - - -void vset(pointer p,uint8_t sto,scaled st, -uint8_t sho,scaled sh,scaled h) -{scaled x; -type(p)= vlist_node; -x= height(p); -height(p)= h; -x= h-x; -if(x==0) -{glue_sign(p)= normal;glue_order(p)= normal; -glue_set(p)= 0.0; -} -else if(x> 0) -{glue_order(p)= sto;glue_sign(p)= stretching; -if(st!=0) -glue_set(p)= (float32_t)(x/(double)st); -else -{glue_sign(p)= normal; -glue_set(p)= 0.0; -} -} -else -{glue_order(p)= sho;glue_sign(p)= shrinking; -if(sh!=0) -glue_set(p)= (float32_t)((-x)/(double)sh); -else -{glue_sign(p)= normal; -glue_set(p)= 0.0; -} -} -if(depth(p)==MAX_DIMEN+1) -{if(list_ptr(p)!=null&&(type(list_ptr(p))==hlist_node||type(list_ptr(p))==vlist_node||type(list_ptr(p))==rule_node)) -{h= height(list_ptr(p)); -depth(p)= height(p)-h; -height(p)= h; -} -else -{depth(p)= depth(p)+height(p);height(p)= 0;} -DBG(DBGTEX,"vset top node adjusted height=%f depth=%f\n",height(p)/(double)ONE,depth(p)/(double)ONE); -} -} -/*:128*//*133:*/ -#line 2209 "hint.w" - -static pointer vtop(pointer p,scaled h,small_number m,scaled d) -{d= d^0x40000000; -p= vpackage(p,h,m,d); -if(list_ptr(p)!=null&&(type(list_ptr(p))==hlist_node||type(list_ptr(p))==vlist_node||type(list_ptr(p))==rule_node)) -{h= height(list_ptr(p)); -depth(p)= depth(p)+height(p)-h; -height(p)= h; -} -else -{depth(p)= depth(p)+height(p);height(p)= 0;} -DBG(DBGTEX,"vpack top node adjusted height=%f depth=%f\n",height(p)/(double)ONE,depth(p)/(double)ONE); -return p; -} -/*:133*//*146:*/ -#line 2367 "hint.w" - -static pointer hget_text_list(uint32_t s) -{pointer p= null; -pointer*pp= &p; -uint8_t*t= hpos+s; -while(hpos<t){*pp= new_character(0,hget_utf8());pp= &link(*pp);} -return p; -} -/*:146*//*155:*/ -#line 2474 "hint.w" - -static pointer hget_disc_node(void) -{/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 2476 "hint.w" - -if(KIND(a)!=disc_kind||INFO(a)==b000) -tag_expected(TAG(disc_kind,1),a,node_pos); -{ -HGET_DISC(INFO(a)); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 2481 "hint.w" - -return p; -} -} -/*:155*//*159:*/ -#line 2549 "hint.w" - -static void transplant_post_break_list(void) -{pointer r,q= link(head); -int t= replace_count(q); -pointer s= post_break(q); -r= q; -while(t> 0&&r!=null){r= link(r);t--;} -if(s!=null) -{while(link(s)!=null)s= link(s); -link(s)= link(r);link(r)= post_break(q);post_break(q)= null; -} -q= link(r); -if(r!=head) -{link(r)= null;flush_node_list(link(head)); -link(head)= q; -} -} -static void transplant_pre_break_list(void) -{pointer q= tail; -set_replace_count(q,0); -link(q)= pre_break(q); -pre_break(q)= null; -while(link(q)!=null)q= link(q); -tail= q; -} - - -void hprune_unwanted_nodes(void) -{pointer q,r= head; -while(true){q= link(r); -if(q==null)goto done; -if(is_char_node(q))goto done; -if(non_discardable(q))goto done; -if(type(q)==kern_node&&subtype(q)!=explicit)goto done; -r= q; -} -done:if(r!=head) -{link(r)= null;flush_node_list(link(head)); -link(head)= q; -} -} -/*:159*//*161:*/ -#line 2622 "hint.w" - -pointer hget_paragraph_all(scaled x) -{uint8_t*to; -/*162:*/ -#line 2636 "hint.w" - -pointer par_ptr= null; -if(KIND(*hpos)==list_kind) -{uint32_t s,t; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 2640 "hint.w" - -if((INFO(a)&b011)==0) -HGET8; -else if(INFO(a)&b100) -QUIT("Text in paragraph not yet implemented"); -else -{uint8_t*list_end; -s= hget_list_size(INFO(a)); -hget_size_boundary(INFO(a)); -list_end= hpos+s; -cur_list.hs_field= x; -push_nest(); -cur_list.bs_pos= NULL; - -/*:162*/ -#line 2625 "hint.w" - -to= list_end; -/*163:*/ -#line 2656 "hint.w" - -while(hpos<to) -{hget_content(); -if(nest_ptr==1) -{pointer p= tail; -if(p!=head&&!is_char_node(p)&& -(type(p)==glue_node||type(p)==kern_node||type(p)==penalty_node -||type(p)==disc_node||type(p)==math_node)) -store_map(p,node_pos,0); -} -} - -/*:163*/ -#line 2627 "hint.w" - -/*164:*/ -#line 2670 "hint.w" - -if(head!=tail) -{par_ptr= link(head); -store_map(par_ptr,node_pos,0); -if(needs_bs) -QUIT("Unexpected trailing baseline node"); -} -pop_nest(); -} -hget_size_boundary(INFO(a)); -t= hget_list_size(INFO(a)); -if(t!=s) -QUIT("List sizes at 0x%x and "SIZE_F" do not match 0x%x != 0x%x", -node_pos+1,hpos-hstart-s-1,s,t); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 2684 "hint.w" - -} - - - -/*:164*/ -#line 2628 "hint.w" - -return par_ptr; -} - -/*:161*//*165:*/ -#line 2695 "hint.w" - -pointer hget_paragraph_final(scaled x,uint8_t*from) -{uint8_t*to; -/*162:*/ -#line 2636 "hint.w" - -pointer par_ptr= null; -if(KIND(*hpos)==list_kind) -{uint32_t s,t; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 2640 "hint.w" - -if((INFO(a)&b011)==0) -HGET8; -else if(INFO(a)&b100) -QUIT("Text in paragraph not yet implemented"); -else -{uint8_t*list_end; -s= hget_list_size(INFO(a)); -hget_size_boundary(INFO(a)); -list_end= hpos+s; -cur_list.hs_field= x; -push_nest(); -cur_list.bs_pos= NULL; - -/*:162*/ -#line 2698 "hint.w" - -hpos= from;to= list_end; -/*163:*/ -#line 2656 "hint.w" - -while(hpos<to) -{hget_content(); -if(nest_ptr==1) -{pointer p= tail; -if(p!=head&&!is_char_node(p)&& -(type(p)==glue_node||type(p)==kern_node||type(p)==penalty_node -||type(p)==disc_node||type(p)==math_node)) -store_map(p,node_pos,0); -} -} - -/*:163*/ -#line 2700 "hint.w" - -if(link(head)!=null&&!is_char_node(link(head))) -{if(type(link(head))==disc_node) -transplant_post_break_list(); -else -hprune_unwanted_nodes(); -} -/*164:*/ -#line 2670 "hint.w" - -if(head!=tail) -{par_ptr= link(head); -store_map(par_ptr,node_pos,0); -if(needs_bs) -QUIT("Unexpected trailing baseline node"); -} -pop_nest(); -} -hget_size_boundary(INFO(a)); -t= hget_list_size(INFO(a)); -if(t!=s) -QUIT("List sizes at 0x%x and "SIZE_F" do not match 0x%x != 0x%x", -node_pos+1,hpos-hstart-s-1,s,t); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 2684 "hint.w" - -} - - - -/*:164*/ -#line 2707 "hint.w" - -return par_ptr; -} -/*:165*//*171:*/ -#line 2792 "hint.w" - -pointer hget_paragraph(scaled x,uint32_t offset,ParamDef*q) -{ -pointer p,par_head; -ParamDef*save_lbp= line_break_params; -par_head= tail; -line_break_params= q; -if(offset==0) -{prev_graf= 0; -p= hget_paragraph_all(x); -} -else -{prev_graf= 3; -p= hget_paragraph_final(x,hstart+node_pos+offset); -} -if(p!=null) -line_break(hget_integer_ref(widow_penalty_no),p); -line_break_params= save_lbp; -return par_head; -} - -void hget_par_node(uint32_t offset) -{scaled x= 0; -ParamDef*q; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 2816 "hint.w" - -node_pos= (hpos-hstart)-1; -if(KIND(a)!=par_kind) -tag_expected(TAG(par_kind,0),a,node_pos); -node_pos= (hpos-hstart)-1; -if(INFO(a)==b100)q= hget_param_list_ref(HGET8); -if(INFO(a)&b100)x= hget_xdimen_node();else x= hget_xdimen_ref(HGET8); -if(INFO(a)&b010)q= hget_param_list_node();else q= hget_param_list_ref(HGET8); -hget_paragraph(x,offset,q); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 2825 "hint.w" - -} -/*:171*//*174:*/ -#line 2847 "hint.w" - -void hteg_paragraph(Info i) -{scaled x= 0; -ParamDef*q= null; -pointer par_head; -uint8_t*bs_pos= cur_list.bs_pos; -scaled ph= prev_height; -uint8_t*list_start,*par_start; -hskip_list_back(); -list_start= hpos; -if(INFO(i)&b010)q= hteg_param_list_node(); -else if(INFO(i)!=b100)q= hget_param_list_ref(HTEG8); -if(INFO(i)&b100)x= hteg_xdimen_node();else x= hget_xdimen_ref(HTEG8); -if(INFO(i)==b100)q= hget_param_list_ref(HTEG8); -par_start= hpos; -node_pos= par_start-hstart-1; -hpos= list_start; -cur_list.bs_pos= NULL; -par_head= hget_paragraph(x,0,q); -/*175:*/ -#line 2879 "hint.w" - -{pointer p,r,par_tail; -p= null; -r= par_tail= link(par_head); - -tail= par_head; -link(tail)= null; -while(r!=null) -{pointer q= link(r); -link(r)= p; -p= r; -r= q; -} -cur_list.bs_pos= bs_pos; -prev_height= ph; -hprepend_to_vlist(p); -tail= par_tail; -if(type(tail)==hlist_node||type(tail)==vlist_node) -prev_height= height(tail); -} -/*:175*/ -#line 2866 "hint.w" - -hpos= par_start; -} -/*:174*//*190:*/ -#line 3090 "hint.w" - -static void hset_stream_params(pointer p,ParamDef*q) -{pointer s; -hset_param_list(q); -float_cost(p)= integer_def[floating_penalty_no]; -depth(p)= dimen_def[split_max_depth_no]; -split_top_ptr(p)= pointer_def[glue_kind][split_top_skip_no]; -add_glue_ref(split_top_ptr(p)); -hrestore_param_list(); -s= vpack(ins_ptr(p),natural); -height(p)= height(s)+depth(s); -ins_ptr(p)= list_ptr(s); -list_ptr(s)= null;flush_node_list(s); -} -/*:190*//*230:*/ -#line 3835 "hint.w" - - -uint64_t hlocation(pointer p) -{return PAGE_LOC(map[p],map[p+1]); -} -/*:230*//*233:*/ -#line 3881 "hint.w" - -#define NEXT_PAGE(X) (X= (X+1)&(MAX_PAGE_POS-1)) -#define PREV_PAGE(X) (X= (X-1)&(MAX_PAGE_POS-1)) - -void hloc_clear(void) -{lo_loc= hi_loc= cur_loc;PREV_PAGE(lo_loc);NEXT_PAGE(hi_loc); -} - -bool hloc_next(void) -{int i= cur_loc; -if(LOC_POS(page_loc[cur_loc])>=hend-hstart) -return false; -NEXT_PAGE(i); -if(i==hi_loc) -return false; -cur_loc= i; -return true; -} - -bool hloc_prev(void) -{int i= cur_loc; -if(page_loc[cur_loc]==0) -return false; -PREV_PAGE(i); -if(i==lo_loc) -return false; -cur_loc= i; -return true; -} - - -/*:233*//*236:*/ -#line 3943 "hint.w" - - -void hloc_set(uint64_t h) -{int i; -if(page_loc[cur_loc]==h)return; -for(i= lo_loc,NEXT_PAGE(i);i!=hi_loc;NEXT_PAGE(i)) -if(page_loc[i]==h) -{cur_loc= i; -DBG(DBGPAGE,"loc_set: %d < %d < %d\n",lo_loc,cur_loc,hi_loc); -return;} -page_loc[cur_loc]= h; -hloc_clear(); -DBG(DBGPAGE,"loc_set: %d < %d < %d\n",lo_loc,cur_loc,hi_loc); -} -/*:236*//*237:*/ -#line 3969 "hint.w" - - -void hloc_set_next(pointer p) -{int i= cur_loc; -uint64_t h= hlocation(p); -if(h==page_loc[cur_loc])return; - -NEXT_PAGE(i); -if(i==hi_loc) -{if(hi_loc==lo_loc) -NEXT_PAGE(lo_loc); -NEXT_PAGE(hi_loc); -page_loc[i]= h; -} -else if(h!=page_loc[i]) -{page_loc[i]= h; -NEXT_PAGE(i); -hi_loc= i; -} -DBG(DBGPAGE,"loc_set_next: %d < %d < %d\n",lo_loc,cur_loc,hi_loc); -} -/*:237*//*238:*/ -#line 4006 "hint.w" - -void hloc_set_prev(pointer p) -{int i= cur_loc; -uint64_t h= hlocation(p); -PREV_PAGE(i); -if(i==lo_loc) -{if(lo_loc==hi_loc) -PREV_PAGE(hi_loc); -PREV_PAGE(lo_loc); -page_loc[i]= h; -} -else if(h!=page_loc[i]) -{page_loc[i]= h; -lo_loc= i; -PREV_PAGE(lo_loc); -} -hi_loc= cur_loc; -NEXT_PAGE(hi_loc); -cur_loc= i; -DBG(DBGPAGE,"loc_set_prev: %d < %d < %d\n",lo_loc,cur_loc,hi_loc); -} -/*:238*//*251:*/ -#line 4292 "hint.w" - -static void hset_margins(void) -{if(cur_page==&(page_def[0])){ -offset_h= page_h/8-0x48000; -if(offset_h<0)offset_h= 0; -offset_v= page_v/8-0x48000; -if(offset_v<0)offset_v= 0; -if(offset_h> offset_v)offset_h= offset_v; -else offset_v= offset_h; -hhsize= page_h-2*offset_h; -hvsize= page_v-2*offset_v; -if(hhsize<=0)hhsize= page_h,offset_h= 0; -if(hvsize<=0)hvsize= page_v,offset_v= 0; -} -else -{hhsize= round((double)(page_h-cur_page->h.w)/(double)cur_page->h.h); -if(hhsize> page_h)hhsize= page_h; -hvsize= round((double)(page_v-cur_page->v.w)/(double)cur_page->v.v); -if(hvsize> page_v)hvsize= page_v; -offset_h= (page_h-hhsize)/2; -offset_v= (page_v-hvsize)/2; -} -} -/*:251*//*253:*/ -#line 4324 "hint.w" - -static void houtput_template(pointer p) -{pointer q,r; -if(p==null)return; -p= vpackage(p,hvsize,exactly,page_max_depth); -if(offset_v!=0) -{r= new_kern(offset_v); -link(r)= p; -} -else -r= p; -q= new_null_box(); -type(q)= vlist_node; -width(q)= width(p)+offset_h; -height(q)= height(p)+offset_v;depth(q)= depth(p); -list_ptr(q)= r; -shift_amount(p)+= offset_h; -streams[0].p= q; -} -/*:253*//*280:*/ -#line 5018 "hint.w" - -static int trv_string_size= 0; -static char trv_string[256]; -#define TRV_UTF8(C) (trv_string[trv_string_size++]= (C)) -static void trv_string_collect(uint32_t c) -{if(trv_string_size<256-5) -{if(c<0x80) -TRV_UTF8(c); -else if(c<0x800) -{TRV_UTF8(0xC0|(c>>6));TRV_UTF8(0x80|(c&0x3F));} -else if(c<0x10000) -{TRV_UTF8(0xE0|(c>>12));TRV_UTF8(0x80|((c>>6)&0x3F));TRV_UTF8(0x80|(c&0x3F));} -else if(c<0x200000) -{TRV_UTF8(0xF0|(c>>18));TRV_UTF8(0x80|((c>>12)&0x3F)); -TRV_UTF8(0x80|((c>>6)&0x3F));TRV_UTF8(0x80|(c&0x3F));} -else -RNG("character code in outline",c,0,0x1FFFFF); -} -} - -char*hlist_to_string(pointer p) -{trv_string_size= 0; -trv_init(trv_string_collect); -trv_hlist(p); -trv_string[trv_string_size]= 0; -return trv_string; -} -/*:280*//*379:*/ -#line 7541 "hint.w" - -static pointer leaks[1<<16]= {0}; - -static void leak_clear(void) -{ -#ifdef DEBUG -int i; -for(i= 0;i<0x10000;i++) -leaks[i]= 0; -#endif -} - -void leak_in(pointer p,int s) -{ -#ifdef DEBUG -if(0!=leaks[p]) -fprintf(stderr,"ERROR leak in: p=%d, s in=%d, leaks[p]= %d != 0\n",p,s,leaks[p]); -leaks[p]= s; -#endif -} - -void leak_out(pointer p,int s) -{ -#ifdef DEBUG -if(s!=leaks[p]) -fprintf(stderr,"ERROR: leak out: p=%d, s out=%d != %d = s in\n",p,s,leaks[p]); -leaks[p]= 0; -#endif -} - -static void list_leaks(void) -{ -#ifdef DEBUG -int i; -for(i= 0;i<0x10000;i++) -if(leaks[i]!=0) -fprintf(stderr,"ERROR:leak final: p=%d, s=%d\n",i,leaks[i]); -#endif -} -/*:379*/ -#line 7632 "hint.w" - -/*1:*/ -#line 126 "hint.w" - -void hget_def_node(void) -{Kind k; -int n; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 130 "hint.w" - -k= KIND(a); -if(k==label_kind&&(INFO(a)&b001))HGET16(n); -else n= HGET8; -if(k!=range_kind)REF_RNG(k,n); -DBG(DBGTAGS,"Defining %s %d\n",definition_name[KIND(a)],n); -switch(KIND(a)) -{case language_kind:{char*t;HGET_STRING(t);break;} -case font_kind:hget_font_def(a,n);break; -case int_kind:integer_def[n]= hget_integer_def(a);break; -case dimen_kind:dimen_def[n]= hget_dimen_def(a);break; -case xdimen_kind:hget_xdimen_def(INFO(a),&(xdimen_def[n]));break; -case baseline_kind:hget_baseline_def(a,n);break; -case glue_kind:pointer_def[glue_kind][n]= hget_glue_def(a);break; -case param_kind:param_def[n]= hget_param_list(a);break; -case range_kind:hget_range_def(a,n);break; -case page_kind:hget_page_def(a,n);break; -case label_kind:hget_outline_or_label_def(INFO(a),n);break; -default:pointer_def[KIND(a)][n]= hget_definition(a);break; -} -if(max_fixed[k]> max_default[k]) -QUIT("Definitions for kind %s not supported",definition_name[k]); -if(n> max_ref[k]||n<=max_fixed[k]) -QUIT("Definition %d for %s out of range [%d - %d]", -n,definition_name[k],max_fixed[k]+1,max_ref[k]); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 155 "hint.w" - -} - -pointer hset_glue(Glue*g) -{if(ZERO_GLUE(*g)) -{add_glue_ref(zero_glue); -return zero_glue; -} -else -{pointer p= get_node(glue_spec_size); -width(p)= g->w.w; -stretch(p)= round(g->p.f*ONE);stretch_order(p)= g->p.o; -shrink(p)= round(g->m.f*ONE);shrink_order(p)= g->m.o; -return p; -} -} - -void hset_default_definitions(void) -{int i; -for(i= 0;i<=MAX_INT_DEFAULT;i++)integer_def[i]= int_defaults[i]; -for(i= 0;i<=MAX_DIMEN_DEFAULT;i++)dimen_def[i]= dimen_defaults[i]; -for(i= 0;i<=MAX_XDIMEN_DEFAULT;i++)xdimen_def[i]= xdimen_defaults[i]; -for(i= 0;i<=MAX_GLUE_DEFAULT;i++)pointer_def[glue_kind][i]= hset_glue(&(glue_defaults[i])); -for(i= 0;i<=MAX_BASELINE_DEFAULT;i++) -{baseline_def[i].bs= hset_glue(&(baseline_defaults[i].bs)); -baseline_def[i].ls= hset_glue(&(baseline_defaults[i].ls)); -baseline_def[i].lsl= baseline_defaults[i].lsl; -} -} - -void free_definitions(void) -{/*5:*/ -#line 241 "hint.w" - -{int k; -for(k= 0;k<32;k++) -{free(pointer_def[k]);pointer_def[k]= NULL;} -} -/*:5*//*8:*/ -#line 264 "hint.w" - -free(integer_def);integer_def= NULL; -/*:8*//*12:*/ -#line 293 "hint.w" - -free(dimen_def);dimen_def= NULL; -/*:12*//*16:*/ -#line 322 "hint.w" - -free(xdimen_def);xdimen_def= NULL; -/*:16*//*24:*/ -#line 393 "hint.w" - -free(baseline_def);baseline_def= NULL; -/*:24*//*31:*/ -#line 511 "hint.w" - -free(font_def);font_def= NULL; -/*:31*//*40:*/ -#line 616 "hint.w" - -if(param_def!=NULL) -{int i; -for(i= 0;i<=max_ref[param_kind];i++) -free_param_list(param_def[i]); -} -free(param_def);param_def= NULL; -/*:40*//*47:*/ -#line 772 "hint.w" - -free(range_def);range_def= NULL; -/*:47*//*52:*/ -#line 826 "hint.w" - -free(streams);streams= NULL; -/*:52*//*60:*/ -#line 939 "hint.w" - -if(page_def!=NULL) -{int k; -for(k= 0;k<=max_ref[page_kind];k++) -{free(page_def[k].s);free(page_def[k].n); -} -free(page_def);page_def= NULL;cur_page= NULL; -} -/*:60*//*67:*/ -#line 1052 "hint.w" - -free(labels);labels= NULL; -{int k; -for(k= 0;k<=max_outline;k++)free(hint_outlines[k].title); -} -free(hint_outlines);hint_outlines= NULL;outline_no= -1; -max_outline= -1; -/*:67*/ -#line 186 "hint.w" - -} - -void hget_definition_section(void) -{DBG(DBGDEF,"Definitions\n"); -hget_section(1); -DBG(DBGDEF,"Reading list of maximum values\n"); -free_definitions(); -hget_max_definitions(); -/*4:*/ -#line 226 "hint.w" - -{Kind k; -for(k= 0;k<32;k++) -{if(k==font_kind||k==int_kind||k==dimen_kind||k==xdimen_kind|| -k==glue_kind||k==baseline_kind||k==range_kind||k==page_kind||k==param_kind||k==stream_kind||k==label_kind) -continue; -if(max_ref[k]>=0&&max_ref[k]<=256) -{DBG(DBGDEF,"Allocating definitions for %s (kind %d): %d entries of "SIZE_F" byte each\n", -definition_name[k],k,max_ref[k]+1,sizeof(pointer)); -ALLOCATE(pointer_def[k],max_ref[k]+1,pointer); -} -} -} -/*:4*//*7:*/ -#line 260 "hint.w" - -ALLOCATE(integer_def,max_ref[int_kind]+1,int32_t); -/*:7*//*11:*/ -#line 289 "hint.w" - -ALLOCATE(dimen_def,max_ref[dimen_kind]+1,Dimen); -/*:11*//*15:*/ -#line 319 "hint.w" - -ALLOCATE(xdimen_def,max_ref[xdimen_kind]+1,Xdimen); -/*:15*//*20:*/ -#line 370 "hint.w" - -ALLOCATE(pointer_def[glue_kind],max_ref[glue_kind]+1,pointer); -/*:20*//*23:*/ -#line 389 "hint.w" - -ALLOCATE(baseline_def,max_ref[baseline_kind]+1,BaselineSkip); -/*:23*//*30:*/ -#line 507 "hint.w" - -ALLOCATE(font_def,max_ref[font_kind]+1,FontDef); -/*:30*//*39:*/ -#line 612 "hint.w" - -ALLOCATE(param_def,max_ref[param_kind]+1,ParamDef*); -/*:39*//*46:*/ -#line 768 "hint.w" - -ALLOCATE(range_def,max_ref[range_kind]+1,RangeDef); -/*:46*//*51:*/ -#line 822 "hint.w" - -ALLOCATE(streams,max_ref[stream_kind]+1,Stream); -/*:51*//*58:*/ -#line 919 "hint.w" - -ALLOCATE(page_def,max_ref[page_kind]+1,PageDef); -/*:58*//*66:*/ -#line 1045 "hint.w" - -if(max_ref[label_kind]>=0) -ALLOCATE(labels,max_ref[label_kind]+1,Label); -if(max_outline>=0) -ALLOCATE(hint_outlines,max_outline+1,hint_Outline); -/*:66*/ -#line 195 "hint.w" - -hset_default_definitions(); -DBG(DBGDEF,"Reading list of definitions\n"); -while(hpos<hend) -hget_def_node(); -hget_font_metrics(); -/*59:*/ -#line 923 "hint.w" - -page_def[0].d= max_depth; -page_def[0].g= top_skip;add_glue_ref(top_skip); -page_def[0].p= 0; -page_def[0].n= strdup("default"); -page_def[0].v.w= -9*ONE; -page_def[0].v.h= 0.0; -page_def[0].v.v= 1.25; -page_def[0].h.w= -9*ONE; -page_def[0].h.h= 1.25; -page_def[0].h.v= 0.0; -page_def[0].t= 0; -ALLOCATE(page_def[0].s,max_ref[stream_kind]+1,StreamDef); -cur_page= &(page_def[0]); -/*:59*/ -#line 201 "hint.w" - -} -/*:1*//*13:*/ -#line 297 "hint.w" - -scaled hget_dimen_ref(uint8_t n) -{REF_RNG(dimen_kind,n); -return dimen_def[n]; -} - -static scaled hget_dimen_def(uint8_t a) -{if(INFO(a)==b000) -return hget_dimen_ref(HGET8); -else -{scaled d;HGET32(d);return d;} -} -/*:13*//*25:*/ -#line 397 "hint.w" - -static void hget_baseline_def(uint8_t a,uint8_t n) -{HGET_BASELINE(INFO(a)); -baseline_def[n].bs= cur_bs;add_glue_ref(cur_bs); -baseline_def[n].ls= cur_ls;add_glue_ref(cur_ls); -baseline_def[n].lsl= cur_lsl; -} - -void hget_baseline_ref(uint8_t n) -{REF_RNG(baseline_kind,n); -cur_bs= baseline_def[n].bs; -cur_ls= baseline_def[n].ls; -cur_lsl= baseline_def[n].lsl; -} - -pointer happend_to_vlist(pointer b) -{scaled d; -pointer p= null; - -if(needs_bs&&prev_depth> ignore_depth) -{d= width(cur_bs)-prev_depth-height(b); -if(d<cur_lsl)p= new_glue(cur_ls); -else{pointer q= new_spec(cur_bs); -width(q)= d;p= new_glue(q);glue_ref_count(q)= null; -} -link(tail)= p;tail= p; -if(nest_ptr==0) -store_map(p,cur_list.bs_pos-hstart,0); -} -link(tail)= b;tail= b;prev_depth= depth(b); -cur_list.bs_pos= NULL; -return p; -} -/*:25*//*26:*/ -#line 451 "hint.w" - -static pointer hprepend_to_vlist(pointer b) -{scaled d; -pointer p= null; - -if(needs_bs&&prev_height> ignore_depth) -{d= width(cur_bs)-prev_height-depth(b); -if(d<cur_lsl)p= new_glue(cur_ls); -else{pointer q= new_spec(cur_bs); -width(q)= d;p= new_glue(q);glue_ref_count(q)= null; -} -link(tail)= p;tail= p; -if(nest_ptr==0) -store_map(p,cur_list.bs_pos-hstart,0); -} -link(tail)= b;tail= b;prev_height= height(b); -cur_list.bs_pos= NULL; -return p; -} -/*:26*//*68:*/ -#line 1065 "hint.w" - -void hget_outline_or_label_def(Info i,int n) -{if(i&b100) -/*70:*/ -#line 1086 "hint.w" - -{hint_Outline*t; -uint64_t pos; -uint8_t where; -outline_no++; -RNG("Outline",outline_no,0,max_outline); -t= hint_outlines+outline_no; -t->depth= HGET8; -t->p= hget_list_pointer(); -t->title= strdup(hlist_to_string(t->p)); -/*71:*/ -#line 1102 "hint.w" - -if(labels==NULL||n> max_ref[label_kind]) -{where= LABEL_TOP;pos= 0;} -else -{where= labels[n].where; -#if 1 -pos= ((uint64_t)labels[n].pos<<32)+(labels[n].pos-labels[n].pos0); -#else -pos= ((uint64_t)labels[n].pos0<<32); -#endif -} -/*:71*/ -#line 1096 "hint.w" - -t->where= where; -t->pos= pos; -} -/*:70*/ -#line 1068 "hint.w" - -else -/*69:*/ -#line 1074 "hint.w" - -{Label*t= labels+n; -HGET32(t->pos); -t->where= HGET8; -if(t->where> LABEL_MID)t->where= LABEL_UNDEF; -if(i&b010) -{HGET32(t->pos0);t->f= HGET8;} -else t->pos0= t->pos; -DBG(DBGDEF,"Label 0x%x+0x%x where=%d font=%d\n",t->pos0,t->pos,t->where,t->f); -} -/*:69*/ -#line 1070 "hint.w" - -} -/*:68*//*73:*/ -#line 1170 "hint.w" - -static void hget_content_section() -{DBG(DBGDIR,"Reading Content Section\n"); -hget_section(2); -} -/*:73*//*103:*/ -#line 1555 "hint.w" - -pointer hget_rule_node(void) -{pointer q= null; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1558 "hint.w" - -if(KIND(a)==rule_kind){HGET_RULE(INFO(a));q= p;} -else tag_expected(TAG(rule_kind,0),a,node_pos); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1561 "hint.w" - -return q; -} -/*:103*//*120:*/ -#line 1931 "hint.w" - -pointer hget_hbox_node(void) -{/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1933 "hint.w" - -if(KIND(a)!=hbox_kind)tag_expected(TAG(hbox_kind,0),a,node_pos); -{pointer p; -HGET_BOX(INFO(a)); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1937 "hint.w" - -return p; -} -} - - -pointer hget_vbox_node(void) -{ -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1945 "hint.w" - -if(KIND(a)!=vbox_kind)tag_expected(TAG(vbox_kind,0),a,node_pos); -{pointer p; -HGET_BOX(INFO(a)); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1949 "hint.w" - -type(p)= vlist_node; -return p; -} -} -/*:120*//*166:*/ -#line 2715 "hint.w" - -pointer hget_paragraph_initial(scaled x,uint8_t*to) -{/*162:*/ -#line 2636 "hint.w" - -pointer par_ptr= null; -if(KIND(*hpos)==list_kind) -{uint32_t s,t; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 2640 "hint.w" - -if((INFO(a)&b011)==0) -HGET8; -else if(INFO(a)&b100) -QUIT("Text in paragraph not yet implemented"); -else -{uint8_t*list_end; -s= hget_list_size(INFO(a)); -hget_size_boundary(INFO(a)); -list_end= hpos+s; -cur_list.hs_field= x; -push_nest(); -cur_list.bs_pos= NULL; - -/*:162*/ -#line 2717 "hint.w" - -if(to> list_end) -{LOG("Value of to greater than list_end"); -to= list_end; -} -/*163:*/ -#line 2656 "hint.w" - -while(hpos<to) -{hget_content(); -if(nest_ptr==1) -{pointer p= tail; -if(p!=head&&!is_char_node(p)&& -(type(p)==glue_node||type(p)==kern_node||type(p)==penalty_node -||type(p)==disc_node||type(p)==math_node)) -store_map(p,node_pos,0); -} -} - -/*:163*/ -#line 2722 "hint.w" - -if(KIND(*to)==disc_kind) -{hget_content(); -store_map(tail,node_pos,0); -transplant_pre_break_list(); -} -if(head!=tail) -/*167:*/ -#line 2743 "hint.w" - -{if(is_char_node(tail))tail_append(new_penalty(inf_penalty)) -else if(type(tail)!=glue_node)tail_append(new_penalty(inf_penalty)) -else -{type(tail)= penalty_node;delete_glue_ref(glue_ptr(tail)); -flush_node_list(leader_ptr(tail));penalty(tail)= inf_penalty; -} -tail_append(new_glue(zero_glue)); -} -/*:167*/ -#line 2729 "hint.w" - -hpos= list_end; -/*164:*/ -#line 2670 "hint.w" - -if(head!=tail) -{par_ptr= link(head); -store_map(par_ptr,node_pos,0); -if(needs_bs) -QUIT("Unexpected trailing baseline node"); -} -pop_nest(); -} -hget_size_boundary(INFO(a)); -t= hget_list_size(INFO(a)); -if(t!=s) -QUIT("List sizes at 0x%x and "SIZE_F" do not match 0x%x != 0x%x", -node_pos+1,hpos-hstart-s-1,s,t); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 2684 "hint.w" - -} - - - -/*:164*/ -#line 2731 "hint.w" - -return par_ptr; -} -/*:166*/ -#line 7633 "hint.w" - -/*82:*/ -#line 1273 "hint.w" - -static void hteg_node(uint8_t z) -{switch(z) -{ -/*94:*/ -#line 1467 "hint.w" - -case TAG(glyph_kind,1):HTEG_GLYPH(1);break; -case TAG(glyph_kind,2):HTEG_GLYPH(2);break; -case TAG(glyph_kind,3):HTEG_GLYPH(3);break; -case TAG(glyph_kind,4):HTEG_GLYPH(4);break; -/*:94*//*96:*/ -#line 1482 "hint.w" - -case TAG(penalty_kind,0):tail_append(new_penalty(hget_integer_ref(HTEG8)));break; -case TAG(penalty_kind,1):{tail_append(new_penalty(HTEG8));}break; -case TAG(penalty_kind,2):{int16_t n;HTEG16(n);RNG("Penalty",n,-20000,+20000);tail_append(new_penalty(n));}break; -/*:96*//*98:*/ -#line 1502 "hint.w" - -case TAG(language_kind,b000):(void)HTEG8; -case TAG(language_kind,1): -case TAG(language_kind,2): -case TAG(language_kind,3): -case TAG(language_kind,4): -case TAG(language_kind,5): -case TAG(language_kind,6): -case TAG(language_kind,7):break; -/*:98*//*102:*/ -#line 1545 "hint.w" - -case TAG(rule_kind,b000):tail_append(hget_rule_ref(HTEG8));prev_height= ignore_depth;break; -case TAG(rule_kind,b011):{HTEG_RULE(b011);tail_append(p);prev_height= ignore_depth;}break; -case TAG(rule_kind,b101):{HTEG_RULE(b101);tail_append(p);prev_height= ignore_depth;}break; -case TAG(rule_kind,b001):{HTEG_RULE(b001);tail_append(p);prev_height= ignore_depth;}break; -case TAG(rule_kind,b110):{HTEG_RULE(b110);tail_append(p);prev_height= ignore_depth;}break; -case TAG(rule_kind,b111):{HTEG_RULE(b111);tail_append(p);prev_height= ignore_depth;}break; -/*:102*//*109:*/ -#line 1616 "hint.w" - -case TAG(glue_kind,b000):tail_append(new_glue(hget_glue_ref(HTEG8)));break; -case TAG(glue_kind,b001):{pointer p;HTEG_GLUE(b001);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b010):{pointer p;HTEG_GLUE(b010);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b011):{pointer p;HTEG_GLUE(b011);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b100):{pointer p;HTEG_GLUE(b100);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b101):{pointer p;HTEG_GLUE(b101);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b110):{pointer p;HTEG_GLUE(b110);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b111):{pointer p;HTEG_GLUE(b111);tail_append(spec2glue(p));}break; -/*:109*//*119:*/ -#line 1912 "hint.w" - -case TAG(hbox_kind,b000):{pointer p;HTEG_BOX(b000);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b001):{pointer p;HTEG_BOX(b001);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b010):{pointer p;HTEG_BOX(b010);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b011):{pointer p;HTEG_BOX(b011);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b100):{pointer p;HTEG_BOX(b100);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b101):{pointer p;HTEG_BOX(b101);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b110):{pointer p;HTEG_BOX(b110);hprepend_to_vlist(p);}break; -case TAG(hbox_kind,b111):{pointer p;HTEG_BOX(b111);hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b000):{pointer p;HTEG_BOX(b000);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b001):{pointer p;HTEG_BOX(b001);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b010):{pointer p;HTEG_BOX(b010);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b011):{pointer p;HTEG_BOX(b011);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b100):{pointer p;HTEG_BOX(b100);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b101):{pointer p;HTEG_BOX(b101);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b110):{pointer p;HTEG_BOX(b110);type(p)= vlist_node;hprepend_to_vlist(p);}break; -case TAG(vbox_kind,b111):{pointer p;HTEG_BOX(b111);type(p)= vlist_node;hprepend_to_vlist(p);}break; -/*:119*//*126:*/ -#line 2030 "hint.w" - -case TAG(hset_kind,b000):{pointer p;HTEG_SET(b000);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b001):{pointer p;HTEG_SET(b001);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b010):{pointer p;HTEG_SET(b010);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b011):{pointer p;HTEG_SET(b011);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b100):{pointer p;HTEG_SET(b100);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b101):{pointer p;HTEG_SET(b101);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b110):{pointer p;HTEG_SET(b110);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(hset_kind,b111):{pointer p;HTEG_SET(b111);hset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; - -case TAG(vset_kind,b000):{pointer p;HTEG_SET(b000);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b001):{pointer p;HTEG_SET(b001);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b010):{pointer p;HTEG_SET(b010);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b011):{pointer p;HTEG_SET(b011);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b100):{pointer p;HTEG_SET(b100);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b101):{pointer p;HTEG_SET(b101);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b110):{pointer p;HTEG_SET(b110);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -case TAG(vset_kind,b111):{pointer p;HTEG_SET(b111);vset(p,sto,st,sho,sh,x);hprepend_to_vlist(p);}break; -/*:126*//*132:*/ -#line 2189 "hint.w" - -case TAG(hpack_kind,b000):HTEG_PACK(hpack_kind,b000);break; -case TAG(hpack_kind,b010):HTEG_PACK(hpack_kind,b010);break; -case TAG(hpack_kind,b100):HTEG_PACK(hpack_kind,b100);break; -case TAG(hpack_kind,b110):HTEG_PACK(hpack_kind,b110);break; -case TAG(hpack_kind,b001):HTEG_PACK(hpack_kind,b001);break; -case TAG(hpack_kind,b011):HTEG_PACK(hpack_kind,b011);break; -case TAG(hpack_kind,b101):HTEG_PACK(hpack_kind,b101);break; -case TAG(hpack_kind,b111):HTEG_PACK(hpack_kind,b111);break; - -case TAG(vpack_kind,b000):HTEG_PACK(vpack_kind,b000);break; -case TAG(vpack_kind,b010):HTEG_PACK(vpack_kind,b010);break; -case TAG(vpack_kind,b100):HTEG_PACK(vpack_kind,b100);break; -case TAG(vpack_kind,b110):HTEG_PACK(vpack_kind,b110);break; -case TAG(vpack_kind,b001):HTEG_PACK(vpack_kind,b001);break; -case TAG(vpack_kind,b011):HTEG_PACK(vpack_kind,b011);break; -case TAG(vpack_kind,b101):HTEG_PACK(vpack_kind,b101);break; -case TAG(vpack_kind,b111):HTEG_PACK(vpack_kind,b111);break; -/*:132*//*137:*/ -#line 2264 "hint.w" - -case TAG(kern_kind,b000):{HTEG_KERN(b000);}break; -case TAG(kern_kind,b001):{HTEG_KERN(b001);}break; -case TAG(kern_kind,b010):{HTEG_KERN(b010);}break; -case TAG(kern_kind,b011):{HTEG_KERN(b011);}break; -case TAG(kern_kind,b100):{HTEG_KERN(b100);}break; -case TAG(kern_kind,b101):{HTEG_KERN(b101);}break; -case TAG(kern_kind,b110):{HTEG_KERN(b110);}break; -case TAG(kern_kind,b111):{HTEG_KERN(b111);}break; -/*:137*//*141:*/ -#line 2311 "hint.w" - -case TAG(leaders_kind,0):tail_append(hget_leaders_ref(HTEG8));break; -case TAG(leaders_kind,1):HTEG_LEADERS(1);break; -case TAG(leaders_kind,2):HTEG_LEADERS(2);break; -case TAG(leaders_kind,3):HTEG_LEADERS(3);break; -case TAG(leaders_kind,b100|1):HTEG_LEADERS(b100|1);break; -case TAG(leaders_kind,b100|2):HTEG_LEADERS(b100|2);break; -case TAG(leaders_kind,b100|3):HTEG_LEADERS(b100|3);break; -/*:141*//*145:*/ -#line 2352 "hint.w" - -case TAG(baseline_kind,b000):{hget_baseline_ref(HTEG8);cur_list.bs_pos= hpos-1;}break; -case TAG(baseline_kind,b010):{HTEG_BASELINE(b010);}break; -case TAG(baseline_kind,b011):{HTEG_BASELINE(b011);}break; -case TAG(baseline_kind,b100):{HTEG_BASELINE(b100);}break; -case TAG(baseline_kind,b101):{HTEG_BASELINE(b101);}break; -case TAG(baseline_kind,b110):{HTEG_BASELINE(b110);}break; -case TAG(baseline_kind,b111):{HTEG_BASELINE(b111);}break; -/*:145*//*150:*/ -#line 2413 "hint.w" - -case TAG(ligature_kind,0):tail_append(hget_ligature_ref(HTEG8));break; -case TAG(ligature_kind,1):HTEG_LIG(1);break; -case TAG(ligature_kind,2):HTEG_LIG(2);break; -case TAG(ligature_kind,3):HTEG_LIG(3);break; -case TAG(ligature_kind,4):HTEG_LIG(4);break; -case TAG(ligature_kind,5):HTEG_LIG(5);break; -case TAG(ligature_kind,6):HTEG_LIG(6);break; -case TAG(ligature_kind,7):HTEG_LIG(7);break; -/*:150*//*154:*/ -#line 2462 "hint.w" - -case TAG(disc_kind,b000):tail_append(hget_hyphen_ref(HTEG8));break; -case TAG(disc_kind,b001):{HTEG_DISC(b001);tail_append(p);}break; -case TAG(disc_kind,b010):{HTEG_DISC(b010);tail_append(p);}break; -case TAG(disc_kind,b011):{HTEG_DISC(b011);tail_append(p);}break; -case TAG(disc_kind,b100):{HTEG_DISC(b100);tail_append(p);}break; -case TAG(disc_kind,b101):{HTEG_DISC(b101);tail_append(p);}break; -case TAG(disc_kind,b110):{HTEG_DISC(b110);tail_append(p);}break; -case TAG(disc_kind,b111):{HTEG_DISC(b111);tail_append(p);}break; -/*:154*//*173:*/ -#line 2834 "hint.w" - -case TAG(par_kind,b000):hteg_paragraph(b000);break; -case TAG(par_kind,b010):hteg_paragraph(b010);break; -case TAG(par_kind,b100):hteg_paragraph(b100);break; -case TAG(par_kind,b110):hteg_paragraph(b110);break; -/*:173*//*181:*/ -#line 2967 "hint.w" - -case TAG(math_kind,b000):HTEG_MATH(b000);break; -case TAG(math_kind,b001):HTEG_MATH(b001);break; -case TAG(math_kind,b010):HTEG_MATH(b010);break; -case TAG(math_kind,b100):HTEG_MATH(b100);break; -case TAG(math_kind,b101):HTEG_MATH(b101);break; -case TAG(math_kind,b110):HTEG_MATH(b110);break; -/*:181*//*183:*/ -#line 2991 "hint.w" - -case TAG(math_kind,b111):tail_append(new_math(0,before));break; -case TAG(math_kind,b011):tail_append(new_math(0,after));break; -/*:183*//*189:*/ -#line 3061 "hint.w" - -case TAG(table_kind,b000):HTEG_TABLE(b000);break; -case TAG(table_kind,b001):HTEG_TABLE(b001);break; -case TAG(table_kind,b010):HTEG_TABLE(b010);break; -case TAG(table_kind,b011):HTEG_TABLE(b011);break; -case TAG(table_kind,b100):HTEG_TABLE(b100);break; -case TAG(table_kind,b101):HTEG_TABLE(b101);break; -case TAG(table_kind,b110):HTEG_TABLE(b110);break; -case TAG(table_kind,b111):HTEG_TABLE(b111);break; - -case TAG(item_kind,b000):hteg_list_pointer();break; -case TAG(item_kind,b001):hteg_content();break; -case TAG(item_kind,b010):hteg_content();break; -case TAG(item_kind,b011):hteg_content();break; -case TAG(item_kind,b100):hteg_content();break; -case TAG(item_kind,b101):hteg_content();break; -case TAG(item_kind,b110):hteg_content();break; -case TAG(item_kind,b111):hteg_content();(void)HTEG8;break; -/*:189*//*194:*/ -#line 3133 "hint.w" - -case TAG(stream_kind,b000):HTEG_STREAM(b000);break; -case TAG(stream_kind,b010):HTEG_STREAM(b010);break; -/*:194*//*198:*/ -#line 3192 "hint.w" - -case TAG(image_kind,b000):hget_image_ref(HTEG8);break; -case TAG(image_kind,b001):HTEG_IMAGE(b001);break; -case TAG(image_kind,b010):HTEG_IMAGE(b010);break; -case TAG(image_kind,b011):HTEG_IMAGE(b011);break; -case TAG(image_kind,b100):HTEG_IMAGE(b100);break; -case TAG(image_kind,b101):HTEG_IMAGE(b101);break; -case TAG(image_kind,b110):HTEG_IMAGE(b110);break; -case TAG(image_kind,b111):HTEG_IMAGE(b111);break; -/*:198*//*202:*/ -#line 3232 "hint.w" - -case TAG(link_kind,b000):HTEG_LINK(b000);break; -case TAG(link_kind,b001):HTEG_LINK(b001);break; -case TAG(link_kind,b010):HTEG_LINK(b010);break; -case TAG(link_kind,b011):HTEG_LINK(b011);break; -/*:202*/ -#line 1277 "hint.w" - -default: -TAGERR(z); -} -} - -void hteg_content(void) -{/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 1284 "hint.w" - -node_pos= hpos-hstart; -hteg_node(z); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 1287 "hint.w" - -node_pos= hpos-hstart; -if(nest_ptr==0&&tail!=head -#if 0 -&&(type(tail)==penalty_node||type(tail)==glue_node -||type(tail)==hlist_node||type(tail)==vlist_node -||type(tail)==kern_node) -#endif -) -store_map(tail,node_pos,0); -} -/*:82*//*156:*/ -#line 2487 "hint.w" - -pointer hteg_disc_node(void) -{/*80:*/ -#line 1257 "hint.w" - -uint8_t a,z; -z= HTEG8,DBGTAG(z,hpos); -/*:80*/ -#line 2489 "hint.w" - -if(KIND(z)!=disc_kind||INFO(z)==b000) -tag_expected(TAG(disc_kind,1),z,node_pos); -{ -HTEG_DISC(INFO(z)); -/*81:*/ -#line 1262 "hint.w" - -a= HTEG8,DBGTAG(a,hpos); -if(z!=a)tag_mismatch(a,z,hpos-hstart,node_pos); -/*:81*/ -#line 2494 "hint.w" - -return p; -} -} -/*:156*//*176:*/ -#line 2903 "hint.w" - -void hteg_par_node(uint32_t offset) -{scaled x= 0; -ParamDef*save_lbp= line_break_params; -pointer p; -pointer par_head= tail; -uint8_t*bs_pos= cur_list.bs_pos; -scaled ph= prev_height; -/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 2911 "hint.w" - -node_pos= (hpos-hstart)-1; -if(INFO(a)&b100)x= hget_xdimen_node();else x= hget_xdimen_ref(HGET8); -if(INFO(a)&b010)line_break_params= hget_param_list_node();else line_break_params= hget_param_list_ref(HGET8); -prev_graf= 0; -p= hget_paragraph_initial(x,hstart+node_pos+offset); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 2917 "hint.w" - -cur_list.bs_pos= NULL; -if(p!=null) -line_break(hget_integer_ref(widow_penalty_no),p); -if(par_head!=tail) -/*175:*/ -#line 2879 "hint.w" - -{pointer p,r,par_tail; -p= null; -r= par_tail= link(par_head); - -tail= par_head; -link(tail)= null; -while(r!=null) -{pointer q= link(r); -link(r)= p; -p= r; -r= q; -} -cur_list.bs_pos= bs_pos; -prev_height= ph; -hprepend_to_vlist(p); -tail= par_tail; -if(type(tail)==hlist_node||type(tail)==vlist_node) -prev_height= height(tail); -} -/*:175*/ -#line 2922 "hint.w" - -hpos= hstart+node_pos; -line_break_params= save_lbp; -} - -/*:176*/ -#line 7634 "hint.w" - - -/*18:*/ -#line 338 "hint.w" - -void print_xdimen(int i) -{} -/*:18*//*34:*/ -#line 567 "hint.w" - -uint16_t hglyph_section(uint8_t f) -{return font_def[f].q; -} - -int32_t font_at_size(uint8_t f) -{return font_def[f].s; -} -/*:34*//*62:*/ -#line 977 "hint.w" - -static void hinsert_stream(uint8_t n) -{REF_RNG(stream_kind,n); -if(streams[n].p==null)return; -DBG(DBGPAGE,"Filling in stream %d\n",n); -if(n> 0&&cur_page->s[n].b!=0) -{pointer p= copy_node_list(cur_page->s[n].b); -link(tail)= p; -while(link(p)!=null)p= link(p); -tail= p; -DBG(DBGPAGE,"Filling in before list %d\n",n); -} -link(tail)= streams[n].p; -tail= streams[n].t; -if(tail==null)QUIT("Tail of nonempty stream %d is null\n",n); -streams[n].p= streams[n].t= null; -DBG(DBGPAGE,"Filling in content list %d\n",n); -if(n> 0&&cur_page->s[n].a!=0) -{pointer p= copy_node_list(cur_page->s[n].a); -link(tail)= p; -while(link(p)!=null)p= link(p); -tail= p; -DBG(DBGPAGE,"Filling in after list %d\n",n); -} -} -/*:62*//*63:*/ -#line 1007 "hint.w" - -void hfill_page_template(void) -{pointer p; -if(cur_page->t!=0) -{ -uint8_t*spos= hpos,*sstart= hstart,*send= hend; -hget_section(1); -hpos= hpos+cur_page->t; -p= hget_list_pointer(); -hpos= spos,hstart= sstart,hend= send; -if(streams[0].p!=null)flush_node_list(streams[0].p); -} -else -{p= streams[0].p; -} -streams[0].p= streams[0].t= null; -houtput_template(p); -hmark_page(); -} -/*:63*//*78:*/ -#line 1216 "hint.w" - - -static void hget_node(uint8_t a) -{switch(a) -{ -/*56:*/ -#line 898 "hint.w" - -case TAG(stream_kind,b100):hinsert_stream(HGET8);break; -/*:56*//*93:*/ -#line 1461 "hint.w" - -case TAG(glyph_kind,1):HGET_GLYPH(1);break; -case TAG(glyph_kind,2):HGET_GLYPH(2);break; -case TAG(glyph_kind,3):HGET_GLYPH(3);break; -case TAG(glyph_kind,4):HGET_GLYPH(4);break; -/*:93*//*95:*/ -#line 1476 "hint.w" - -case TAG(penalty_kind,0):tail_append(new_penalty(hget_integer_ref(HGET8)));break; -case TAG(penalty_kind,1):{tail_append(new_penalty(HGET8));}break; -case TAG(penalty_kind,2):{int16_t n;HGET16(n);RNG("Penalty",n,-20000,+20000);tail_append(new_penalty(n));}break; -/*:95*//*97:*/ -#line 1490 "hint.w" - -case TAG(language_kind,b000):(void)HGET8; -case TAG(language_kind,1): -case TAG(language_kind,2): -case TAG(language_kind,3): -case TAG(language_kind,4): -case TAG(language_kind,5): -case TAG(language_kind,6): -case TAG(language_kind,7):break; -/*:97*//*101:*/ -#line 1536 "hint.w" - -case TAG(rule_kind,b000):tail_append(hget_rule_ref(HGET8));prev_depth= ignore_depth;break; -case TAG(rule_kind,b011):{HGET_RULE(b011);tail_append(p);prev_depth= ignore_depth;}break; -case TAG(rule_kind,b101):{HGET_RULE(b101);tail_append(p);prev_depth= ignore_depth;}break; -case TAG(rule_kind,b001):{HGET_RULE(b001);tail_append(p);prev_depth= ignore_depth;}break; -case TAG(rule_kind,b110):{HGET_RULE(b110);tail_append(p);prev_depth= ignore_depth;}break; -case TAG(rule_kind,b111):{HGET_RULE(b111);tail_append(p);prev_depth= ignore_depth;}break; -/*:101*//*108:*/ -#line 1604 "hint.w" - -case TAG(glue_kind,b000):tail_append(new_glue(hget_glue_ref(HGET8)));break; -case TAG(glue_kind,b001):{pointer p;HGET_GLUE(b001);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b010):{pointer p;HGET_GLUE(b010);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b011):{pointer p;HGET_GLUE(b011);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b100):{pointer p;HGET_GLUE(b100);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b101):{pointer p;HGET_GLUE(b101);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b110):{pointer p;HGET_GLUE(b110);tail_append(spec2glue(p));}break; -case TAG(glue_kind,b111):{pointer p;HGET_GLUE(b111);tail_append(spec2glue(p));}break; -/*:108*//*118:*/ -#line 1893 "hint.w" - -case TAG(hbox_kind,b000):{pointer p;HGET_BOX(b000);happend_to_vlist(p);}break; -case TAG(hbox_kind,b001):{pointer p;HGET_BOX(b001);happend_to_vlist(p);}break; -case TAG(hbox_kind,b010):{pointer p;HGET_BOX(b010);happend_to_vlist(p);}break; -case TAG(hbox_kind,b011):{pointer p;HGET_BOX(b011);happend_to_vlist(p);}break; -case TAG(hbox_kind,b100):{pointer p;HGET_BOX(b100);happend_to_vlist(p);}break; -case TAG(hbox_kind,b101):{pointer p;HGET_BOX(b101);happend_to_vlist(p);}break; -case TAG(hbox_kind,b110):{pointer p;HGET_BOX(b110);happend_to_vlist(p);}break; -case TAG(hbox_kind,b111):{pointer p;HGET_BOX(b111);happend_to_vlist(p);}break; -case TAG(vbox_kind,b000):{pointer p;HGET_BOX(b000);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b001):{pointer p;HGET_BOX(b001);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b010):{pointer p;HGET_BOX(b010);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b011):{pointer p;HGET_BOX(b011);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b100):{pointer p;HGET_BOX(b100);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b101):{pointer p;HGET_BOX(b101);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b110):{pointer p;HGET_BOX(b110);type(p)= vlist_node;happend_to_vlist(p);}break; -case TAG(vbox_kind,b111):{pointer p;HGET_BOX(b111);type(p)= vlist_node;happend_to_vlist(p);}break; -/*:118*//*125:*/ -#line 2009 "hint.w" - -case TAG(hset_kind,b000):{pointer p;HGET_SET(b000);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b001):{pointer p;HGET_SET(b001);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b010):{pointer p;HGET_SET(b010);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b011):{pointer p;HGET_SET(b011);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b100):{pointer p;HGET_SET(b100);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b101):{pointer p;HGET_SET(b101);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b110):{pointer p;HGET_SET(b110);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(hset_kind,b111):{pointer p;HGET_SET(b111);hset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; - -case TAG(vset_kind,b000):{pointer p;HGET_SET(b000);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b001):{pointer p;HGET_SET(b001);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b010):{pointer p;HGET_SET(b010);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b011):{pointer p;HGET_SET(b011);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b100):{pointer p;HGET_SET(b100);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b101):{pointer p;HGET_SET(b101);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b110):{pointer p;HGET_SET(b110);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -case TAG(vset_kind,b111):{pointer p;HGET_SET(b111);vset(p,sto,st,sho,sh,x);happend_to_vlist(p);}break; -/*:125*//*131:*/ -#line 2170 "hint.w" - -case TAG(hpack_kind,b000):HGET_PACK(hpack_kind,b000);break; -case TAG(hpack_kind,b010):HGET_PACK(hpack_kind,b010);break; -case TAG(hpack_kind,b100):HGET_PACK(hpack_kind,b100);break; -case TAG(hpack_kind,b110):HGET_PACK(hpack_kind,b110);break; -case TAG(hpack_kind,b001):HGET_PACK(hpack_kind,b001);break; -case TAG(hpack_kind,b011):HGET_PACK(hpack_kind,b011);break; -case TAG(hpack_kind,b101):HGET_PACK(hpack_kind,b101);break; -case TAG(hpack_kind,b111):HGET_PACK(hpack_kind,b111);break; - -case TAG(vpack_kind,b000):HGET_PACK(vpack_kind,b000);break; -case TAG(vpack_kind,b010):HGET_PACK(vpack_kind,b010);break; -case TAG(vpack_kind,b100):HGET_PACK(vpack_kind,b100);break; -case TAG(vpack_kind,b110):HGET_PACK(vpack_kind,b110);break; -case TAG(vpack_kind,b001):HGET_PACK(vpack_kind,b001);break; -case TAG(vpack_kind,b011):HGET_PACK(vpack_kind,b011);break; -case TAG(vpack_kind,b101):HGET_PACK(vpack_kind,b101);break; -case TAG(vpack_kind,b111):HGET_PACK(vpack_kind,b111);break; -/*:131*//*136:*/ -#line 2253 "hint.w" - -case TAG(kern_kind,b000):{HGET_KERN(b000);}break; -case TAG(kern_kind,b001):{HGET_KERN(b001);}break; -case TAG(kern_kind,b010):{HGET_KERN(b010);}break; -case TAG(kern_kind,b011):{HGET_KERN(b011);}break; -case TAG(kern_kind,b100):{HGET_KERN(b100);}break; -case TAG(kern_kind,b101):{HGET_KERN(b101);}break; -case TAG(kern_kind,b110):{HGET_KERN(b110);}break; -case TAG(kern_kind,b111):{HGET_KERN(b111);}break; -/*:136*//*140:*/ -#line 2302 "hint.w" - -case TAG(leaders_kind,0):tail_append(hget_leaders_ref(HGET8));break; -case TAG(leaders_kind,1):HGET_LEADERS(1);break; -case TAG(leaders_kind,2):HGET_LEADERS(2);break; -case TAG(leaders_kind,3):HGET_LEADERS(3);break; -case TAG(leaders_kind,b100|1):HGET_LEADERS(b100|1);break; -case TAG(leaders_kind,b100|2):HGET_LEADERS(b100|2);break; -case TAG(leaders_kind,b100|3):HGET_LEADERS(b100|3);break; -/*:140*//*144:*/ -#line 2342 "hint.w" - -case TAG(baseline_kind,b000):{cur_list.bs_pos= hpos-1;hget_baseline_ref(HGET8);}break; -case TAG(baseline_kind,b010):{HGET_BASELINE(b010);}break; -case TAG(baseline_kind,b011):{HGET_BASELINE(b011);}break; -case TAG(baseline_kind,b100):{HGET_BASELINE(b100);}break; -case TAG(baseline_kind,b101):{HGET_BASELINE(b101);}break; -case TAG(baseline_kind,b110):{HGET_BASELINE(b110);}break; -case TAG(baseline_kind,b111):{HGET_BASELINE(b111);}break; -/*:144*//*149:*/ -#line 2402 "hint.w" - -case TAG(ligature_kind,0):tail_append(hget_ligature_ref(HGET8));break; -case TAG(ligature_kind,1):HGET_LIG(1);break; -case TAG(ligature_kind,2):HGET_LIG(2);break; -case TAG(ligature_kind,3):HGET_LIG(3);break; -case TAG(ligature_kind,4):HGET_LIG(4);break; -case TAG(ligature_kind,5):HGET_LIG(5);break; -case TAG(ligature_kind,6):HGET_LIG(6);break; -case TAG(ligature_kind,7):HGET_LIG(7);break; -/*:149*//*153:*/ -#line 2452 "hint.w" - -case TAG(disc_kind,b000):tail_append(hget_hyphen_ref(HGET8));break; -case TAG(disc_kind,b001):{HGET_DISC(b001);tail_append(p);}break; -case TAG(disc_kind,b010):{HGET_DISC(b010);tail_append(p);}break; -case TAG(disc_kind,b011):{HGET_DISC(b011);tail_append(p);}break; -case TAG(disc_kind,b100):{HGET_DISC(b100);tail_append(p);}break; -case TAG(disc_kind,b101):{HGET_DISC(b101);tail_append(p);}break; -case TAG(disc_kind,b110):{HGET_DISC(b110);tail_append(p);}break; -case TAG(disc_kind,b111):{HGET_DISC(b111);tail_append(p);}break; -/*:153*//*158:*/ -#line 2515 "hint.w" - -case TAG(par_kind,b000):HGET_PAR(b000);break; -case TAG(par_kind,b010):HGET_PAR(b010);break; -case TAG(par_kind,b100):HGET_PAR(b100);break; -case TAG(par_kind,b110):HGET_PAR(b110);break; -/*:158*//*180:*/ -#line 2958 "hint.w" - -case TAG(math_kind,b000):HGET_MATH(b000);break; -case TAG(math_kind,b001):HGET_MATH(b001);break; -case TAG(math_kind,b010):HGET_MATH(b010);break; -case TAG(math_kind,b100):HGET_MATH(b100);break; -case TAG(math_kind,b101):HGET_MATH(b101);break; -case TAG(math_kind,b110):HGET_MATH(b110);break; -/*:180*//*182:*/ -#line 2987 "hint.w" - -case TAG(math_kind,b111):tail_append(new_math(0,before));break; -case TAG(math_kind,b011):tail_append(new_math(0,after));break; -/*:182*//*185:*/ -#line 3013 "hint.w" - -case TAG(adjust_kind,1):HGET_ADJUST(1);break; -/*:185*//*188:*/ -#line 3041 "hint.w" - -case TAG(table_kind,b000):HGET_TABLE(b000);break; -case TAG(table_kind,b001):HGET_TABLE(b001);break; -case TAG(table_kind,b010):HGET_TABLE(b010);break; -case TAG(table_kind,b011):HGET_TABLE(b011);break; -case TAG(table_kind,b100):HGET_TABLE(b100);break; -case TAG(table_kind,b101):HGET_TABLE(b101);break; -case TAG(table_kind,b110):HGET_TABLE(b110);break; -case TAG(table_kind,b111):HGET_TABLE(b111);break; - -case TAG(item_kind,b000):hget_list_pointer();break; -case TAG(item_kind,b001):hget_content();break; -case TAG(item_kind,b010):hget_content();break; -case TAG(item_kind,b011):hget_content();break; -case TAG(item_kind,b100):hget_content();break; -case TAG(item_kind,b101):hget_content();break; -case TAG(item_kind,b110):hget_content();break; -case TAG(item_kind,b111):(void)HGET8;hget_content();break; -/*:188*//*193:*/ -#line 3128 "hint.w" - -case TAG(stream_kind,b000):HGET_STREAM(b000);break; -case TAG(stream_kind,b010):HGET_STREAM(b010);break; -/*:193*//*197:*/ -#line 3182 "hint.w" - -case TAG(image_kind,b000):hget_image_ref(HGET8);break; -case TAG(image_kind,b001):HGET_IMAGE(b001);break; -case TAG(image_kind,b010):HGET_IMAGE(b010);break; -case TAG(image_kind,b011):HGET_IMAGE(b011);break; -case TAG(image_kind,b100):HGET_IMAGE(b100);break; -case TAG(image_kind,b101):HGET_IMAGE(b101);break; -case TAG(image_kind,b110):HGET_IMAGE(b110);break; -case TAG(image_kind,b111):HGET_IMAGE(b111);break; -/*:197*//*201:*/ -#line 3226 "hint.w" - -case TAG(link_kind,b000):HGET_LINK(b000);break; -case TAG(link_kind,b001):HGET_LINK(b001);break; -case TAG(link_kind,b010):HGET_LINK(b010);break; -case TAG(link_kind,b011):HGET_LINK(b011);break; -/*:201*/ -#line 1221 "hint.w" - -default: -TAGERR(a); -} -} - -void hget_content(void) -{/*74:*/ -#line 1184 "hint.w" - -uint8_t a,z; -HGETTAG(a); -/*:74*/ -#line 1228 "hint.w" - -node_pos= (hpos-hstart)-1; -hget_node(a); -/*75:*/ -#line 1189 "hint.w" - -HGETTAG(z); -if(a!=z)tag_mismatch(a,z,node_pos,hpos-hstart-1); -/*:75*/ -#line 1231 "hint.w" - -if(nest_ptr==0&&tail!=head&&(type(tail)==penalty_node||type(tail)==glue_node||type(tail)==kern_node)) -store_map(tail,node_pos,0); -} - -static pointer hget_definition(uint8_t a) -{pointer p; -if(link(head)!=null)QUIT("Calling get_node with nonempty curent list"); -hget_node(a); -p= link(head); -if(p!=null&&link(p)!=null)QUIT("get_node returns multiple nodes"); -link(head)= null; -tail= head; -return p; -} -/*:78*//*169:*/ -#line 2782 "hint.w" - -void set_line_break_params(void) -{hset_param_list(line_break_params); -} -/*:169*//*205:*/ -#line 3359 "hint.w" - -pointer skip(uint8_t n) -{return cur_page->s[n].g;} -pointer*box_ptr(uint8_t n) -{return&streams[n].p;} -int count(uint8_t n) -{return cur_page->s[n].f;} -scaled dimen(uint8_t n) -{return xdimen(&cur_page->s[n].x);} - -/*:205*//*206:*/ -#line 3384 "hint.w" - -void hpage_init(void) -{int i; -if(streams==NULL||cur_page==NULL)return; -for(i= 0;i<=max_ref[stream_kind];i++) -if(streams[i].p!=null) -{flush_node_list(streams[i].p); -streams[i].p= streams[i].t= null; -} -page_contents= empty;page_tail= page_head;link(page_head)= null; -hset_cur_page(); -hset_margins(); -page_depth= page_height= 0; -memset(top_so_far,0,sizeof(top_so_far)); -max_depth= cur_page->d; -if(top_skip!=cur_page->g) -{delete_glue_ref(top_skip); -top_skip= cur_page->g; -add_glue_ref(top_skip); -} -} -/*:206*//*208:*/ -#line 3415 "hint.w" - -void hflush_contribution_list(void) -{if(link(contrib_head)!=null) -{flush_node_list(link(contrib_head)); -link(contrib_head)= null;tail= contrib_head; -} -} -/*:208*//*210:*/ -#line 3459 "hint.w" - -static bool hbuild_page_up(void) -{ -static scaled page_top_height; -pointer p; -pointer q,r; -int b,c; -int pi= 0; -if(link(contrib_head)==null)return false; -do{p= link(contrib_head); -/*215:*/ -#line 3581 "hint.w" - -switch(type(p)){ -case hlist_node:case vlist_node:case rule_node: -/*212:*/ -#line 3525 "hint.w" - -if(page_contents<box_there) -{if(page_contents==empty)freeze_page_specs(box_there); -else page_contents= box_there; -if(depth(p)> page_max_depth) -page_total= depth(p)-page_max_depth; -depth(p)= 0; -/*213:*/ -#line 3551 "hint.w" - -{page_top_height= width(top_skip); -page_total= page_total+page_top_height; -} -/*:213*/ -#line 3532 "hint.w" - -} -/*214:*/ -#line 3560 "hint.w" - -{int i; -for(i= 1;i<=6;i++) -{page_so_far[i]+= top_so_far[i]; -top_so_far[i]= 0; -} -} -/*:214*/ -#line 3534 "hint.w" - -page_total+= page_height+depth(p); -if(height(p)> page_top_height) -{page_total= page_total+height(p)-page_top_height; -page_height= page_top_height; -} -else -page_height= height(p); -/*:212*/ -#line 3584 "hint.w" -goto contribute; -case whatsit_node:goto contribute; -case glue_node:/*218:*/ -#line 3619 "hint.w" - -if(link(p)==null)return false; -/*219:*/ -#line 3626 "hint.w" - -#define top_shrink top_so_far[6] -#define top_total top_so_far[1] - -{pointer q= glue_ptr(p); -top_so_far[2+stretch_order(q)]+= stretch(q); -if((shrink_order(q)!=normal)&&(shrink(q)!=0)) -DBG(DBGTEX,"Infinite glue shrinkage found on current page"); -top_shrink+= shrink(q); -top_total+= width(q); -} -/*:219*/ -#line 3621 "hint.w" - -if(page_contents==empty||!precedes_break(link(p)))goto contribute; -pi= 0; -/*:218*/ -#line 3586 "hint.w" -break; -case kern_node:/*220:*/ -#line 3642 "hint.w" - -top_total+= width(p); -if(page_contents==empty|| -link(page_head)==null|| -type(link(page_head))!=glue_node) -goto contribute; -pi= 0; -/*:220*/ -#line 3587 "hint.w" -break; -case penalty_node:if(page_contents==empty)goto done1;else pi= penalty(p);break; -case ins_node:happend_insertion(p);goto contribute; -default:DBG(DBGTEX,"Unexpected node type %d in build_page_up ignored\n",type(p)); -} -/*223:*/ -#line 3676 "hint.w" - -if(pi<inf_penalty) -{/*221:*/ -#line 3656 "hint.w" - -/*222:*/ -#line 3667 "hint.w" - -if(page_total<page_goal) -{if((page_so_far[3]!=0)||(page_so_far[4]!=0)||(page_so_far[5]!=0))b= 0; -else b= badness(page_goal-page_total,page_so_far[2]); -} -else if(page_total-page_goal> page_shrink)b= awful_bad; -else b= badness(page_total-page_goal,page_shrink) -/*:222*/ -#line 3657 "hint.w" -; -if(b<awful_bad) -{if(pi<=eject_penalty)c= pi; -else if(b<inf_bad)c= b+pi+insert_penalties; -else c= deplorable; -} -else c= b; -if(insert_penalties>=10000)c= awful_bad; -/*:221*/ -#line 3678 "hint.w" - -if(c<=least_page_cost) -{best_page_break= p;best_size= page_goal; -least_page_cost= c; -r= link(page_ins_head); -while(r!=page_ins_head) -{best_ins_ptr(r)= last_ins_ptr(r); -r= link(r); -} -} -if((c==awful_bad)||(pi<=eject_penalty)) -{ -/*224:*/ -#line 3706 "hint.w" - -if(p!=best_page_break) -{while(link(page_head)!=best_page_break) -{q= link(page_head); -link(page_head)= link(q); -link(q)= null; -link(q)= link(head); -link(head)= q; -} -} -/*:224*/ -#line 3690 "hint.w" - -/*225:*/ -#line 3724 "hint.w" - -hloc_set_prev(link(page_head)); -while(true){ -q= link(page_head); -if(q==null)return false; -else if(q==best_page_break) -break; -else if(type(q)==penalty_node||type(q)==glue_node||type(q)==kern_node) -{link(page_head)= link(q);link(q)= null;flush_node_list(q);} -else break; -} -temp_ptr= new_spec(top_skip); -q= new_glue(temp_ptr);glue_ref_count(temp_ptr)= null; -if(width(temp_ptr)> page_height)width(temp_ptr)= width(temp_ptr)-page_height; -else width(temp_ptr)= 0; -link(q)= link(page_head); -link(page_head)= q; -best_page_break= null; -/*:225*/ -#line 3691 "hint.w" - -hpack_page(); -hfill_page_template(); -return true; -} -} -/*:223*/ -#line 3592 "hint.w" - -contribute: -/*216:*/ -#line 3599 "hint.w" - -link(contrib_head)= link(p); -link(p)= link(page_head); -if(link(page_head)==null)page_tail= p; -link(page_head)= p; -goto done; -/*:216*/ -#line 3594 "hint.w" - -done1:/*217:*/ -#line 3607 "hint.w" - -link(contrib_head)= link(p);link(p)= null;flush_node_list(p); -/*:217*/ -#line 3595 "hint.w" - -done: -/*:215*/ -#line 3469 "hint.w" -; -}while(link(contrib_head)!=null); -tail= contrib_head; -return false; -} -/*:210*//*227:*/ -#line 3800 "hint.w" - -static void clear_map(void) -{memset(map,0,sizeof(map)); -} -/*:227*//*228:*/ -#line 3813 "hint.w" - -void store_map(pointer p,uint32_t pos0,uint32_t offset) -{map[p]= pos0; -map[p+1]= offset; -} - -uint32_t hposition(pointer p) -{return map[p]; -} -/*:228*//*235:*/ -#line 3923 "hint.w" - -void hloc_init(void) -{cur_loc= 0; -hloc_clear(); -page_loc[cur_loc]= 0; -DBG(DBGPAGE,"loc_init: %d < %d < %d\n",lo_loc,cur_loc,hi_loc); -} -/*:235*//*240:*/ -#line 4062 "hint.w" - -int hint_begin(void) -{if(!hint_map())return 0; -hpos= hstart= hin_addr; -hend= hstart+hin_size; -hint_clear_fonts(true); -hflush_contribution_list();hpage_init(); -flush_node_list(link(page_head)); -free_definitions(); -mem_init(); -list_init(); -hclear_dir(); -hclear_fonts(); -hget_banner(); -if(!hcheck_banner("hint")) -{hint_unmap();return 0;} -hget_directory(); -hget_definition_section(); -hvsize= dimen_def[vsize_dimen_no]; -hhsize= dimen_def[hsize_dimen_no]; -hget_content_section(); -leak_clear(); -clear_map(); -hloc_init(); -return 1; -} - -void hint_end(void) -{if(hin_addr==NULL)return; -hint_unmap(); -hin_addr= hpos= hstart= hend= NULL; -hflush_contribution_list();hpage_init(); -flush_node_list(link(page_head)); -free_definitions(); -list_leaks(); -hclear_dir(); -} -/*:240*//*244:*/ -#line 4167 "hint.w" - -bool hint_forward(void) -{hpage_init(); -if(hbuild_page())return true; -while(hpos<hend) -{hget_content(); -if(hbuild_page())return true; -} -while(!flush_pages(hend-hstart)) -if(hbuild_page())return true; -return false; -} -/*:244*//*245:*/ -#line 4208 "hint.w" - -bool hint_backward(void) -{hpage_init(); -if(hbuild_page_up())return true; -while(hpos> hstart) -{hteg_content(); -if(hbuild_page_up())return true; -} -while(!flush_pages(0x0)) -if(hbuild_page_up())return true; -return false; -} -/*:245*//*247:*/ -#line 4236 "hint.w" - -bool flush_pages(uint32_t pos) -{pointer p= link(head); -while(p!=null&& -(type(p)==penalty_node||type(p)==glue_node||type(p)==kern_node)) -p= link(p); -if(p==null&&link(page_head)==null)return true; -tail_append(new_null_box()); -width(tail)= hhsize; -tail_append(hget_param_glue(fill_skip_no)); -store_map(tail,pos,0); -tail_append(new_penalty(-010000000000)); -store_map(tail,pos,0); -return false; -} -/*:247*//*271:*/ -#line 4802 "hint.w" - -int hint_get_outline_max(void) -{return max_outline;} -/*:271*//*276:*/ -#line 4882 "hint.w" - -hint_Outline*hint_get_outlines(void) -{return hint_outlines; -} -/*:276*//*278:*/ -#line 4941 "hint.w" - -static bool trv_ignore= false; -static bool trv_skip_space= false; -static void(*trv_stream)(uint32_t c); -void trv_init(void(*f)(uint32_t c)) -{trv_ignore= false;trv_skip_space= false;trv_stream= f;} - -static void trv_char(uint32_t c) -{if(c==0x20)trv_skip_space= true; -else -{if(trv_skip_space) -{trv_skip_space= false;trv_stream(0x20);} -trv_stream(c); -} -} - -void trv_hlist(pointer p) -{while(p!=null) -{if(is_char_node(p)) -{if(!trv_ignore)trv_char(character(p)); -} -else switch(type(p)) -{case hlist_node:if(list_ptr(p)!=null)trv_hlist(list_ptr(p));break; -case vlist_node:if(list_ptr(p)!=null)trv_vlist(list_ptr(p));break; -case ligature_node: -if(!trv_ignore) -{pointer q= lig_ptr(p); -while(q!=null) -{trv_char(character(q)); -q= link(q); -} -} -break; -case glue_node: -if(!trv_ignore)trv_skip_space= true; -break; -case whatsit_node: -if(subtype(p)==ignore_node) -{if(ignore_info(p)==1) -{trv_hlist(ignore_list(p)); -trv_ignore= true; -} -else -trv_ignore= false; -} -break; -default:break; -} -p= link(p); -} -} - -void trv_vlist(pointer p) -{while(p!=null) -{switch(type(p)) -{case hlist_node:if(list_ptr(p)!=null)trv_hlist(list_ptr(p)); -if(!trv_ignore)trv_skip_space= true; -break; -case vlist_node:if(list_ptr(p)!=null)trv_vlist(list_ptr(p));break; -default:break; -} -p= link(p); -} -} -/*:278*/ -#line 7636 "hint.w" - - -/*:382*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/hint.h b/Build/source/texk/web2c/hitexdir/hintview/src/hint.h deleted file mode 100644 index b536d58f49c..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/hint.h +++ /dev/null @@ -1,171 +0,0 @@ -/*381:*/ -#line 7599 "hint.w" - -#ifndef _HINT_H_ -#define _HINT_H_ - -typedef uint16_t pointer; -typedef int scaled; - -/*44:*/ -#line 756 "hint.w" - -extern void hrestore_param_list(void); -/*:44*//*49:*/ -#line 811 "hint.w" - -typedef struct{ -pointer p,t; -}Stream; -extern Stream*streams; -/*:49*//*64:*/ -#line 1028 "hint.w" - -extern void hfill_page_template(void); -/*:64*//*79:*/ -#line 1248 "hint.w" - -void hget_content(void); -/*:79*//*83:*/ -#line 1300 "hint.w" - -extern void hteg_content(void); -/*:83*//*160:*/ -#line 2591 "hint.w" - -extern void hprune_unwanted_nodes(void); -/*:160*//*170:*/ -#line 2787 "hint.w" - -extern void set_line_break_params(void); -/*:170*//*172:*/ -#line 2828 "hint.w" - -extern void hget_par_node(uint32_t offset); -/*:172*//*177:*/ -#line 2928 "hint.w" - -extern void hteg_par_node(uint32_t offset); -/*:177*//*203:*/ -#line 3295 "hint.w" - -extern pointer*pointer_def[32]; -extern scaled*dimen_def; -extern int32_t*integer_def; -/*:203*//*204:*/ -#line 3350 "hint.w" - -extern Stream*streams; -extern bool flush_pages(uint32_t pos); -extern pointer skip(uint8_t n); -extern pointer*box_ptr(uint8_t n); -extern int count(uint8_t n); -extern scaled dimen(uint8_t n); -/*:204*//*207:*/ -#line 3407 "hint.w" - -extern void hpage_init(void); -/*:207*//*209:*/ -#line 3424 "hint.w" - -extern void hflush_contribution_list(void); -/*:209*//*229:*/ -#line 3827 "hint.w" - -#define HINT_NO_LOC 0xFFFFFFFFFFFFFFFF -#define PAGE_LOC(POS0,OFF) (((uint64_t)((POS0)+(OFF))<<32) + (uint64_t)(OFF)) -#define LOC_POS(P) ((P)>>32) -#define LOC_OFF(P) ((P)&0xFFFFFFFF) -#define LOC_POS0(P) (LOC_POS(P)-LOC_OFF(P)) -/*:229*//*232:*/ -#line 3864 "hint.w" - -extern uint64_t page_loc[]; -extern int cur_loc; -/*:232*//*234:*/ -#line 3913 "hint.w" - -extern void hloc_clear(void); -extern bool hloc_next(void); -extern bool hloc_prev(void); -extern uint64_t hlocation(pointer p); -/*:234*//*239:*/ -#line 4031 "hint.w" - -extern void hloc_init(void); -extern void store_map(pointer p,uint32_t pos,uint32_t offset); -extern uint32_t hposition(pointer p); -extern void hloc_set(uint64_t h); -extern void hloc_set_next(pointer p); -/*:239*//*241:*/ -#line 4102 "hint.w" - -extern int hint_begin(void); -extern void hint_end(void); -extern bool hint_map(void); -extern void hint_unmap(void); -/*:241*//*246:*/ -#line 4226 "hint.w" - -extern bool hint_forward(void); -extern bool hint_backward(void); -/*:246*//*249:*/ -#line 4257 "hint.w" - -extern scaled hvsize,hhsize; -/*:249*//*272:*/ -#line 4815 "hint.w" - -typedef struct{ -uint64_t pos; -uint8_t depth; -uint8_t where; -int p; -char*title; -}hint_Outline; -extern hint_Outline*hint_outlines; -/*:272*//*273:*/ -#line 4833 "hint.w" - -#define LABEL_UNDEF 0 -#define LABEL_TOP 1 -#define LABEL_BOT 2 -#define LABEL_MID 3 -/*:273*//*277:*/ -#line 4892 "hint.w" - -extern int hint_get_outline_max(void); -extern hint_Outline*hint_get_outlines(void); -extern uint64_t hint_outline_page(int i); -/*:277*//*279:*/ -#line 5007 "hint.w" - -extern void trv_init(void(*f)(uint32_t c)); -extern void trv_vlist(pointer p); -extern void trv_hlist(pointer p); -/*:279*//*307:*/ -#line 5542 "hint.w" - -typedef struct{ -uint64_t pos; -uint8_t where; -scaled top,bottom,left,right; -}hint_Link; -extern hint_Link*hint_links; -extern int max_link; -/*:307*//*312:*/ -#line 5705 "hint.w" - -extern int hint_find_link(scaled x,scaled y,scaled precission); -extern uint64_t hint_link_page(int i); -/*:312*//*380:*/ -#line 7582 "hint.w" - -extern void leak_in(pointer p,int s); -extern void leak_out(pointer p,int s); -/*:380*/ -#line 7606 "hint.w" - - -#endif -/*:381*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/hrender.c b/Build/source/texk/web2c/hitexdir/hintview/src/hrender.c deleted file mode 100644 index 498b59c7e42..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/hrender.c +++ /dev/null @@ -1,1420 +0,0 @@ -/*384:*/ -#line 7677 "hint.w" - -#include "basetypes.h" -#include "error.h" -#include "format.h" -#include <string.h> -#include <math.h> -#include "get.h" -#include "hrender.h" -#include "rendernative.h" -#include "htex.h" -#include "hint.h" - -/*319:*/ -#line 5828 "hint.w" - -extern struct font_s*hget_font(unsigned char f); -/*:319*//*331:*/ -#line 6173 "hint.w" - -extern void render_char(int x,int y,struct font_s*f,uint32_t cc,uint8_t s); -/*:331*/ -#line 7689 "hint.w" - - -/*242:*/ -#line 4131 "hint.w" - -double xdpi= 600.0,ydpi= 600.0; -/*:242*//*260:*/ -#line 4495 "hint.w" - -static bool forward_mode= false,backward_mode= false; -/*:260*//*281:*/ -#line 5056 "hint.w" - -static char*m_str; -static int m_length,m_chars; -/*:281*//*285:*/ -#line 5130 "hint.w" - -#define MAX_M_DIST 512 -static uint8_t m_dist[MAX_M_DIST+5]; -static int m_ptr,m_max; -/*:285*//*286:*/ -#line 5168 "hint.w" - -static int m_ptr,m_max; -/*:286*//*289:*/ -#line 5239 "hint.w" - -static int m_state,m_spaces; -static uint32_t m_d; -/*:289*//*292:*/ -#line 5292 "hint.w" - -static int m_focus; -static uint64_t m_page; -/*:292*//*295:*/ -#line 5327 "hint.w" - -static bool c_ignore; -static int m_style; -/*:295*//*303:*/ -#line 5496 "hint.w" - -static int cur_link= -1; -/*:303*//*335:*/ -#line 6227 "hint.w" - -static scaled cur_h,cur_v; -static scaled rule_ht,rule_dp,rule_wd; -static int cur_f; -static struct font_s*cur_fp; -static uint8_t cur_style= 0; -/*:335*/ -#line 7691 "hint.w" - -/*243:*/ -#line 4135 "hint.w" - -void hint_resize(int px_h,int px_v,double x_dpi,double y_dpi) -{ -#if 0 - - - -static int old_px_h= 0,old_px_v= 0; -static double old_xdpi= 0.0,old_ydpi= 0.0; -if(old_px_h==px_h&&old_px_v==px_v&&old_xdpi==x_dpi&&old_ydpi==y_dpi) -return; -old_px_h= px_h;old_px_v= px_v;old_xdpi= x_dpi;old_ydpi= y_dpi; -#endif -xdpi= x_dpi;ydpi= y_dpi; -nativeSetSize(px_h,px_v,xdpi,ydpi); -hloc_clear(); -hflush_contribution_list();hpage_init(); -forward_mode= false; -backward_mode= false; -} -/*:243*//*254:*/ -#line 4359 "hint.w" - - -uint64_t hint_page_top(uint64_t h) -{if(hin_addr==NULL)return 0; -hpos= hstart+LOC_POS0(h); -if(hpos>=hend) -return hint_page_bottom(hend-hstart); -hflush_contribution_list(); -hloc_set(h); -if(LOC_OFF(h)) -hget_par_node(LOC_OFF(h)); -hint_forward(); -#if 0 -show_box(streams[0].p); -#endif -forward_mode= true; -backward_mode= false; -return h; -} -/*:254*//*255:*/ -#line 4382 "hint.w" - -uint64_t hint_page_get(void) -{ -DBG(DBGPAGE,"page_get: %d : 0x%"PRIx64"\n",cur_loc,page_loc[cur_loc]); - -if(hin_addr==NULL)return 0; -return page_loc[cur_loc]; -} -/*:255*//*256:*/ -#line 4398 "hint.w" - -uint64_t hint_page(void) -{uint64_t i; -if(streams==NULL)return 0; -i= hint_page_get(); -if(streams[0].p!=null) -return i; -else -return hint_page_top(i); -} -/*:256*//*257:*/ -#line 4414 "hint.w" - -uint64_t hint_page_home(void) -{uint64_t pos; -uint8_t where; -int n= zero_label_no; -if(hin_addr==NULL)return 0; -/*71:*/ -#line 1102 "hint.w" - -if(labels==NULL||n> max_ref[label_kind]) -{where= LABEL_TOP;pos= 0;} -else -{where= labels[n].where; -#if 1 -pos= ((uint64_t)labels[n].pos<<32)+(labels[n].pos-labels[n].pos0); -#else -pos= ((uint64_t)labels[n].pos0<<32); -#endif -} -/*:71*/ -#line 4420 "hint.w" - -/*275:*/ -#line 4855 "hint.w" - -if(where==LABEL_TOP)return hint_page_top(pos); -else if(where==LABEL_BOT)return hint_page_bottom(pos); -else if(where==LABEL_MID)return hint_page_middle(pos); -else return hint_page_get(); -/*:275*/ -#line 4421 "hint.w" - -} -/*:257*//*258:*/ -#line 4442 "hint.w" - -double hint_get_fpos(void) -{ -DBG(DBGPAGE,"get_fpos: %d : 0x%"PRIx64"\n",cur_loc,page_loc[cur_loc]); - -if(hin_addr==NULL)return 0.0; -return(double)LOC_POS(page_loc[cur_loc])/(double)(hend-hstart); -} -/*:258*//*259:*/ -#line 4456 "hint.w" - -uint64_t hint_set_fpos(double fpos) -{uint32_t pos,pos0; -uint8_t*p,*q; -DBG(DBGPAGE,"set_fpos: %f\n",fpos); -if(hin_addr==NULL)return 0; -if(fpos<0.0)fpos= 0.0; -if(fpos> 1.0)fpos= 1.0; -pos= round((hend-hstart)*fpos); -p= hstart+pos; -q= hpos= hstart; -while(hpos<p) -{q= hpos;hff_hpos();} -if(hpos> p) -{pos= pos0= q-hstart; -if(KIND(*q)==par_kind&&KIND(hff_tag)==list_kind&&hff_list_size> 0) -{if(p>=hstart+hff_list_pos+hff_list_size) -pos= pos0= hpos-hstart; -else -{q= hpos= hstart+hff_list_pos; -while(hpos<=p) -{if(KIND(*hpos)==glue_kind||KIND(*hpos)==penalty_kind||KIND(*hpos)==disc_kind) -q= hpos; -hff_hpos(); -} -pos= q-hstart; -} -} -} -else -pos= pos0= hpos-hstart; -return hint_page_top(PAGE_LOC(pos0,pos-pos0)); -} -/*:259*//*261:*/ -#line 4500 "hint.w" - -uint64_t hint_page_next(void) -{if(hin_addr==NULL)return 0; -if(hloc_next()&&forward_mode) -{if(!hint_forward()) -{hloc_prev();return hint_page();} -forward_mode= true; -backward_mode= false; -return hint_page_get(); -} -else -{hflush_contribution_list();hpage_init(); -return hint_page(); -} -} -/*:261*//*262:*/ -#line 4525 "hint.w" - -uint64_t hint_page_prev(void) -{if(hin_addr==NULL)return 0; -if(hloc_prev()) -{hflush_contribution_list();hpage_init(); -return hint_page(); -} -else if(backward_mode) -{if(!hint_backward())return hint_page_top(0); -backward_mode= true; -forward_mode= false; -return hint_page_get(); -} -else -return hint_page_bottom(hint_page_get()); -} -/*:262*//*263:*/ -#line 4551 "hint.w" - -uint64_t hint_page_bottom(uint64_t h) -{if(hin_addr==NULL)return 0; -hloc_set(h); -hflush_contribution_list(); -hpos= hstart+LOC_POS0(h); -if(LOC_OFF(h)) -hteg_par_node(LOC_OFF(h)); -if(!hint_backward())return hint_page(); -backward_mode= true; -forward_mode= false; -return hint_page_get(); -} -/*:263*//*264:*/ -#line 4582 "hint.w" - -uint64_t hint_page_middle(uint64_t l) -{uint32_t target_pos,pos0,offset; -pointer p; -scaled h= 0,d= 0,hp,dp,target_dist= 0,break_dist= 0; -int pi= 0; -if(hin_addr==NULL)return 0; -target_pos= LOC_POS(l); -offset= LOC_OFF(l); -pos0= LOC_POS0(l); -if(hstart+pos0+offset>=hend) -return hint_page_bottom(hend-hstart); -hflush_contribution_list(); -hpos= hstart+pos0; -hget_content(); - -if(offset> 0) -/*265:*/ -#line 4624 "hint.w" - -{pointer q,target_q; -/*266:*/ -#line 4641 "hint.w" - -target_q= null; -q= contrib_head;p= link(q); -h= d= target_dist= break_dist= 0; -while(p!=null) -{pointer qq; -/*268:*/ -#line 4685 "hint.w" - -switch(type(p)) -{case hlist_node:case vlist_node:case rule_node: -hp= height(p);dp= depth(p); -pi= inf_penalty; -break; -case glue_node: -hp= width(glue_ptr(p));dp= 0; -pi= 0; -break; -case kern_node: -hp= width(p);dp= 0; -pi= inf_penalty; -break; -case penalty_node: -hp= dp= 0; -pi= penalty(p); -break; -default: -pi= hp= dp= 0; -} -/*:268*/ -#line 4647 "hint.w" - -qq= q; -q= p; -p= link(p); -if(target_q!=null) -{if(pi<=0) -break; -} -else if(p==null||LOC_POS(hlocation(p))> target_pos) -{target_q= qq; -target_dist= h+d; -h= d= 0; -} -h+= d+hp; -d= dp; -} -if(target_q==null) -{target_dist= h;break_dist= 0;} -else -break_dist= h; -/*:266*/ -#line 4626 "hint.w" - -if(target_dist+break_dist<=hvsize) -offset= 0; -else -{if(break_dist>=hvsize) -q= target_q; -else -/*269:*/ -#line 4714 "hint.w" - -{scaled dh; -dh= target_dist+break_dist-hvsize; -if(target_dist-dh> hvsize/2) -dh= target_dist-hvsize/2; -q= contrib_head; -p= link(q); -d= 0; -while(p!=null&&q!=target_q&&dh> 0) -{/*268:*/ -#line 4685 "hint.w" - -switch(type(p)) -{case hlist_node:case vlist_node:case rule_node: -hp= height(p);dp= depth(p); -pi= inf_penalty; -break; -case glue_node: -hp= width(glue_ptr(p));dp= 0; -pi= 0; -break; -case kern_node: -hp= width(p);dp= 0; -pi= inf_penalty; -break; -case penalty_node: -hp= dp= 0; -pi= penalty(p); -break; -default: -pi= hp= dp= 0; -} -/*:268*/ -#line 4723 "hint.w" - -dh= dh-hp-d; -d= dp; -q= p; -p= link(p); -} -} -/*:269*/ -#line 4634 "hint.w" - -/*267:*/ -#line 4670 "hint.w" - -{p= link(q); -offset= LOC_OFF(hlocation(p)); -link(q)= null; -flush_node_list(link(contrib_head)); -link(contrib_head)= p; -} -/*:267*/ -#line 4635 "hint.w" - -goto found; -} -} -/*:265*/ -#line 4599 "hint.w" - -/*270:*/ -#line 4737 "hint.w" - -{pointer h_save= link(contrib_head); -pointer t_save= tail; -uint8_t*hpos_save= hpos; -pointer best_p= null; -int best_pi= 0; -link(contrib_head)= null;tail= contrib_head; -hpos= hstart+pos0; -h= target_dist+break_dist; -d= 0; -p= tail; -while(h<hvsize) -{while(link(p)==null&&hpos> hstart) -hteg_content(); -if(link(p)==null)break; -p= link(p); -/*268:*/ -#line 4685 "hint.w" - -switch(type(p)) -{case hlist_node:case vlist_node:case rule_node: -hp= height(p);dp= depth(p); -pi= inf_penalty; -break; -case glue_node: -hp= width(glue_ptr(p));dp= 0; -pi= 0; -break; -case kern_node: -hp= width(p);dp= 0; -pi= inf_penalty; -break; -case penalty_node: -hp= dp= 0; -pi= penalty(p); -break; -default: -pi= hp= dp= 0; -} -/*:268*/ -#line 4753 "hint.w" - -if(hpos==hstart)pi= eject_penalty; -if(h+hp+d> hvsize) -break; -h= h+d+hp;d= dp; -if(pi<best_pi) -{best_pi= pi; -best_p= p; -if(best_pi<=eject_penalty)break; -} -} -if(best_p==null) -{flush_node_list(link(contrib_head)); -hpos= hstart+pos0; -offset= 0; -} -else -{p= link(contrib_head); -do{pointer q; -q= link(p); -link(p)= h_save; -h_save= p; -p= q; -}while(h_save!=best_p); -flush_node_list(p); -pos0= LOC_POS0(hlocation(best_p)); -offset= 0; -} -link(contrib_head)= h_save; -if(t_save!=contrib_head) -tail= t_save; -hpos= hpos_save; -} -/*:270*/ -#line 4600 "hint.w" - -found: -hloc_set(PAGE_LOC(pos0,offset)); -if(!hint_forward())return hint_page_top(0); -forward_mode= true; -backward_mode= false; -return hint_page_get(); -} -/*:264*//*274:*/ -#line 4844 "hint.w" - -uint64_t hint_outline_page(int i) -{uint64_t pos; -uint8_t where; -if(i<0||i> max_outline||hint_outlines==NULL)return hint_page_get(); -pos= hint_outlines[i].pos; -where= hint_outlines[i].where; -/*275:*/ -#line 4855 "hint.w" - -if(where==LABEL_TOP)return hint_page_top(pos); -else if(where==LABEL_BOT)return hint_page_bottom(pos); -else if(where==LABEL_MID)return hint_page_middle(pos); -else return hint_page_get(); -/*:275*/ -#line 4851 "hint.w" - -} -/*:274*//*282:*/ -#line 5061 "hint.w" - -void hint_set_mark(char*m,int s) -{m_str= m; -m_length= s; -/*283:*/ -#line 5072 "hint.w" - -if(m_length> 0) -{int i,j,k; -for(i= j= k= 0;i<m_length&&m_str[i]==' ';i++)continue; -for(;i<m_length;i++) -if(m_str[i]!=' '||m_str[i+1]!=' ') -{m_str[k]= m_str[i]; -if(m_str[k]==' ')j++; -k++; -} -m_str[k]= 0; -m_length= k; -m_chars= m_length-j; -} -/*:283*/ -#line 5065 "hint.w" - -hmark_page(); -} -/*:282*//*287:*/ -#line 5172 "hint.w" - -static void m_put(uint32_t d) -{if(m_ptr<MAX_M_DIST) -{if(d==HINT_NO_POS) -m_dist[m_max= m_ptr]= 0xFF; -else if(d<0x7F) -m_dist[m_ptr++]= 0x80+d; -else -{if(d<(1<<14)) -{ -two_byte: -m_dist[m_ptr++]= d>>7; -m_dist[m_ptr++]= 0x80+(d&0x7F); -return; -} -if(d>=(1<<28))m_dist[m_ptr++]= d>>28; -if(d>=(1<<21))m_dist[m_ptr++]= (d>>21)&0x7F; -if(d>=(1<<14))m_dist[m_ptr++]= (d>>14)&0x7F; -d= d&((1<<14)-1); -goto two_byte; -} -} -} - -static uint32_t m_get(void) -{uint32_t x,y; -x= m_dist[m_ptr++]; -if(x==0xFF)return HINT_NO_POS; -if(x&0x80)return x&0x7F; -while(true) -{y= m_dist[m_ptr++]; -if(y&0x80)return(x<<7)+(y&0x7F); -x= (x<<7)+y; -} -} -/*:287*//*288:*/ -#line 5213 "hint.w" - -static int m_next(int i) -{while((0x80&m_dist[i])==0)i++; -if(m_dist[i]==0xFF)return 0; -else return i+1; -} - -static int m_prev(int i) -{if(i<=0)return m_max; -i--; -while(i> 0&&(0x80&m_dist[i-1])==0)i--; -return i; -} -/*:288*//*290:*/ -#line 5244 "hint.w" - -static void next_m_char(uint32_t c) -{ -reconsider: -if(m_state==0&&c!=m_str[0]) -{if(c!=' ') -m_d++; -} -else if(c==m_str[m_state]) -{if(m_state==0)m_spaces= 0; -m_state++; -if(m_state==m_length) -{m_put(m_d); -m_d= 0; -m_state= 0; -} -} -else -/*291:*/ -#line 5278 "hint.w" - -{int i= 0,j= 0; -do{ -if(m_str[i]==' ')j++; -i++; -}while(i<m_state&&strncmp(m_str,m_str+i,m_state-i)!=0); -m_d= m_d+i-j; -m_state= m_state-i; -goto reconsider; -} -/*:291*/ -#line 5262 "hint.w" - - - -} -/*:290*//*293:*/ -#line 5297 "hint.w" - -void hmark_page(void) -{if(streams==NULL||streams[0].p==null)return; -m_ptr= 0; -if(m_page!=page_loc[cur_loc]) -{m_page= page_loc[cur_loc]; -m_focus= 0; -} -if(m_length> 0) -{m_d= 0; -m_state= 0; -trv_init(next_m_char); -if(type(streams[0].p)==vlist_node) -trv_vlist(list_ptr(streams[0].p)); -else -trv_hlist(list_ptr(streams[0].p)); -} -m_put(HINT_NO_POS); -if(m_focus>=m_max)m_focus= 0; -} -/*:293*//*300:*/ -#line 5412 "hint.w" - -void c_ignore_list(pointer p) -{while(p!=null) -{if(is_char_node(p)) -{/*297:*/ -#line 5352 "hint.w" - -{while(m_d==0) -{m_style^= MARK_BIT; -if(m_style&MARK_BIT) -{if(m_ptr==m_focus)m_style|= FOCUS_BIT;else m_style&= ~FOCUS_BIT; -m_d= m_chars; -} -else -{m_style&= ~FOCUS_BIT; -m_d= m_get(); -} -} -m_d--; -} -/*:297*/ -#line 5416 "hint.w" - -cur_style|= m_style; -} -else -{switch(type(p)) -{case hlist_node: -case vlist_node:c_ignore_list(list_ptr(p));break; -case ligature_node: -{pointer q= lig_ptr(p); -while(q!=null) -{/*297:*/ -#line 5352 "hint.w" - -{while(m_d==0) -{m_style^= MARK_BIT; -if(m_style&MARK_BIT) -{if(m_ptr==m_focus)m_style|= FOCUS_BIT;else m_style&= ~FOCUS_BIT; -m_d= m_chars; -} -else -{m_style&= ~FOCUS_BIT; -m_d= m_get(); -} -} -m_d--; -} -/*:297*/ -#line 5426 "hint.w" - -cur_style|= m_style; -q= link(q); -} -} -break; -} -} -p= link(p); -} -} -/*:300*//*301:*/ -#line 5459 "hint.w" - -bool hint_prev_mark(void) -{m_focus= m_prev(m_focus); -while(m_focus==0&&m_page> 0) -{hint_page_prev(); -m_focus= m_prev(0); -} -return(m_focus!=0); -} - -bool hint_next_mark(void) -{m_focus= m_next(m_focus); -while(m_focus==0) -{uint64_t p= m_page; -if(p==hint_page_next())break; -m_focus= m_next(0); -} -return(m_focus!=0); -} -/*:301*//*309:*/ -#line 5560 "hint.w" - -static int links_allocated= 0; -void add_new_link(int n,pointer p,scaled h,scaled v) -{hint_Link*t; -uint64_t pos; -uint8_t where; -max_link++; -if(max_link>=links_allocated) -{if(links_allocated<=0) -{links_allocated= 32; -ALLOCATE(hint_links,links_allocated,hint_Link); -} -else -{links_allocated= links_allocated*1.4142136+0.5; -REALLOCATE(hint_links,links_allocated,hint_Link); -} -} -t= hint_links+max_link; -REF_RNG(label_kind,n); -/*71:*/ -#line 1102 "hint.w" - -if(labels==NULL||n> max_ref[label_kind]) -{where= LABEL_TOP;pos= 0;} -else -{where= labels[n].where; -#if 1 -pos= ((uint64_t)labels[n].pos<<32)+(labels[n].pos-labels[n].pos0); -#else -pos= ((uint64_t)labels[n].pos0<<32); -#endif -} -/*:71*/ -#line 5579 "hint.w" - -t->where= where; -t->pos= pos; -if(type(p)==hlist_node) -{scaled hp= height(p),dp= depth(p); -t->top= v-hp; -t->bottom= v+dp; -t->left= h; -t->right= h; -} -else -{t->top= v; -t->bottom= v; -t->left= h; -t->right= h+width(p); -} -} - -void end_new_link(int n,pointer p,scaled h,scaled v) -{hint_Link*t; -t= hint_links+max_link; -if(type(p)==hlist_node) -t->right= h; -else -t->bottom= v; -} -/*:309*//*310:*/ -#line 5629 "hint.w" - -static scaled hlink_distance(scaled x,scaled y,hint_Link*t) -{scaled d,dx= 0,dy= 0; -d= t->top-y; -if(d> 0)dy= d; -else -{d= y-t->bottom; -if(d> 0)dy= d; -} -d= x-t->right; -if(d> 0)dx= d; -else -{d= t->left-x; -if(d> 0)dx= d; -} -if(dx> dy)return dx; -else return dy; - -} - -int hint_find_link(scaled x,scaled y,scaled precission) -{static int last_hit= -1; -int i; -hint_Link*t; -if(max_link<0)return-1; -if(last_hit<0||last_hit> max_link)last_hit= max_link/2; -i= last_hit; -t= hint_links+i; -if(hlink_distance(x,y,t)<=precission) -return i; -else if(y<t->top) -{while(i> 0) -{i--; -t= hint_links+i; -if(hlink_distance(x,y,t)<=precission) -{last_hit= i;return i;} -} -return-1; -} -else -{int k; -scaled d,min_d= precission; -int min_i= -1; -for(k= 0;k<=max_link;k++) -{i= i+1; -if(i> max_link)i= 0; -t= hint_links+i; -d= hlink_distance(x,y,t); -if(d<min_d) -{min_d= d;min_i= i;} -} -last_hit= min_i; -return last_hit; -} -} -/*:310*//*311:*/ -#line 5690 "hint.w" - -uint64_t hint_link_page(int i) -{uint64_t h; -uint8_t w; -if(i<0||i> max_link)return hint_page_get(); -h= hint_links[i].pos; -w= hint_links[i].where; -if(w==LABEL_TOP)return hint_page_top(h); -else if(w==LABEL_BOT)return hint_page_bottom(h); -else if(w==LABEL_MID)return hint_page_middle(h); -else return hint_page_get(); -} -/*:311*//*313:*/ -#line 5724 "hint.w" - -void hint_render_on(void) -{nativeInit(); -} - -void hint_render_off(void) -{nativeClear(); -} -/*:313*//*314:*/ -#line 5737 "hint.w" - -void hint_dark(int dark) -{nativeSetDark(dark); -} -void hint_gamma(double gamma) -{nativeSetGamma(gamma); -} -/*:314*//*332:*/ -#line 6180 "hint.w" - -static void render_rule(int x,int y,int w,int h) -{if(w> 0&&h> 0) -nativeRule(SP2PT(x),SP2PT(y),SP2PT(w),SP2PT(h)); -} -/*:332*//*333:*/ -#line 6192 "hint.w" - -void render_image(int x,int y,int w,int h,uint32_t n) -{ -uint8_t*spos,*sstart,*send; -spos= hpos;sstart= hstart;send= hend; -hget_section(n); -nativeImage(SP2PT(x),SP2PT(y),SP2PT(w),SP2PT(h),hstart,hend); -hpos= spos;hstart= sstart;hend= send; -} -/*:333*//*334:*/ -#line 6210 "hint.w" - -uint64_t hint_blank(void) -{nativeBlank(); -return 0; -} -/*:334*//*336:*/ -#line 6235 "hint.w" - -static void vlist_render(pointer this_box); - -static void hlist_render(pointer this_box) -{scaled base_line; -scaled left_edge; -scaled h_save; -glue_ord g_order; -uint8_t g_sign; -pointer p; -pointer leader_box; -scaled leader_wd; -scaled lx; -scaled edge; -double glue_temp; -double cur_glue; -scaled cur_g; -int local_link= -1; -uint8_t f; -uint32_t c; - -cur_g= 0; -cur_glue= 0.0; -g_order= glue_order(this_box); -g_sign= glue_sign(this_box); -p= list_ptr(this_box); -#ifdef DEBUG -if(p==0xffff) -QUIT("Undefined list pointer in hbox 0x%x-> mem[0x%x] -> 0x%x\n", -this_box,mem[this_box].i,p); -#endif -base_line= cur_v; -left_edge= cur_h; -/*306:*/ -#line 5526 "hint.w" - -if(cur_link>=0) -{add_new_link(cur_link,this_box,cur_h,cur_v); -local_link= cur_link; -cur_link= -1; -} -/*:306*/ -#line 6268 "hint.w" - -while(p!=null) -{ -#ifdef DEBUG -if(p==0xffff) -QUIT("Undefined pointer in hlist 0x%x\n",p); -if(link(p)==0xffff) -QUIT("Undefined link in hlist mem[0x%x]=0x%x\n",p,mem[p].i); -#endif -if(is_char_node(p)) -{do -{f= font(p); -c= character(p); -if(!c_ignore&&c!=' ') -{cur_style= cur_style&~(MARK_BIT|FOCUS_BIT); -/*297:*/ -#line 5352 "hint.w" - -{while(m_d==0) -{m_style^= MARK_BIT; -if(m_style&MARK_BIT) -{if(m_ptr==m_focus)m_style|= FOCUS_BIT;else m_style&= ~FOCUS_BIT; -m_d= m_chars; -} -else -{m_style&= ~FOCUS_BIT; -m_d= m_get(); -} -} -m_d--; -} -/*:297*/ -#line 6283 "hint.w" - -cur_style|= m_style; -} - -render_c: -if(f!=cur_f) -{ -#ifdef DEBUG -if(f> max_ref[font_kind]) -QUIT("Undefined Font %d mem[0x%x]=0x%x\n", -f,p,mem[p].i); -#endif -cur_fp= hget_font(f); -cur_f= f; -} -render_char(cur_h,cur_v,cur_fp,c,cur_style); -cur_h= cur_h+char_width(f,char_info(f,c)); -#ifdef DEBUG -if(link(p)==0xffff) -QUIT("Undefined link in charlist mem[0x%x]=0x%x\n",p,mem[p].i); -#endif -p= link(p); -}while(is_char_node(p)); -} -else -{switch(type(p)) -{case hlist_node: -case vlist_node: -#ifdef DEBUG -if(list_ptr(p)==0xffff) -QUIT("Undefined list pointer in hlist mem[0x%x] = 0x%x -> 0x%x\n", -p,mem[p].i,list_ptr(p)); -#endif -if(list_ptr(p)==null)cur_h= cur_h+width(p); -else -{cur_v= base_line+shift_amount(p); -edge= cur_h; -if(type(p)==vlist_node) -vlist_render(p); -else -hlist_render(p); -cur_h= edge+width(p);cur_v= base_line; -} -break; -case rule_node: -rule_ht= height(p);rule_dp= depth(p);rule_wd= width(p); -goto fin_rule; -case whatsit_node: -/*299:*/ -#line 5389 "hint.w" - -if(subtype(p)==ignore_node) -{if(ignore_info(p)==1) -{cur_style= cur_style&~(MARK_BIT|FOCUS_BIT); -c_ignore_list(ignore_list(p)); -c_ignore= true; -} -else -c_ignore= false; -} -/*:299*/ -#line 6331 "hint.w" - -else/*304:*/ -#line 5500 "hint.w" - -if(subtype(p)==start_link_node) -{cur_style|= LINK_BIT; -local_link= label_ref(p); -add_new_link(local_link,this_box,cur_h,cur_v); -} -else if(subtype(p)==end_link_node) -{cur_style&= ~LINK_BIT; -end_new_link(local_link,this_box,cur_h,cur_v); -local_link= -1; -} -/*:304*/ -#line 6332 "hint.w" - -else if(subtype(p)==image_node) -{scaled h,w; -w= image_width(p); -h= image_height(p); -render_image(cur_h,cur_v,w,h,image_no(p)); -cur_h= cur_h+w; -} -break; -case glue_node: -{pointer g; -g= glue_ptr(p);rule_wd= width(g)-cur_g; -if(g_sign!=normal) -{if(g_sign==stretching) -{if(stretch_order(g)==g_order) -{cur_glue= cur_glue+stretch(g); -vet_glue((double)(glue_set(this_box))*cur_glue); -cur_g= round(glue_temp); -} -} -else if(shrink_order(g)==g_order) -{cur_glue= cur_glue-shrink(g); -vet_glue((double)(glue_set(this_box))*cur_glue); -cur_g= round(glue_temp); -} -} -rule_wd= rule_wd+cur_g; -if(subtype(p)>=a_leaders) -{leader_box= leader_ptr(p); -if(type(leader_box)==rule_node) -{rule_ht= height(leader_box);rule_dp= depth(leader_box); -goto fin_rule; -} -leader_wd= width(leader_box); -if((leader_wd> 0)&&(rule_wd> 0)) -{rule_wd= rule_wd+10; -edge= cur_h+rule_wd;lx= 0; - -if(subtype(p)==a_leaders) -{h_save= cur_h; -cur_h= left_edge+leader_wd*((cur_h-left_edge)/leader_wd); -if(cur_h<h_save)cur_h= cur_h+leader_wd; -} -else -{int lq= rule_wd/leader_wd; -int lr= rule_wd%leader_wd; -if(subtype(p)==c_leaders)cur_h= cur_h+(lr/2); -else{lx= lr/(lq+1); -cur_h= cur_h+((lr-(lq-1)*lx)/2); -} -} -while(cur_h+leader_wd<=edge) - -{cur_v= base_line+shift_amount(leader_box); -h_save= cur_h; -c_ignore= true; -if(type(leader_box)==vlist_node) -vlist_render(leader_box); -else -hlist_render(leader_box); -c_ignore= false; -cur_v= base_line; -cur_h= h_save+leader_wd+lx; -} -cur_h= edge-10;goto next_p; -} -} -goto move_past; -} -case kern_node: -case math_node: -cur_h= cur_h+width(p); -break; -case ligature_node: -f= font(lig_char(p)); -c= character(lig_char(p)); -/*298:*/ -#line 5371 "hint.w" - -if(!c_ignore) -{pointer q; -cur_style= cur_style&~(MARK_BIT|FOCUS_BIT); -q= lig_ptr(p); -while(q!=null) -{/*297:*/ -#line 5352 "hint.w" - -{while(m_d==0) -{m_style^= MARK_BIT; -if(m_style&MARK_BIT) -{if(m_ptr==m_focus)m_style|= FOCUS_BIT;else m_style&= ~FOCUS_BIT; -m_d= m_chars; -} -else -{m_style&= ~FOCUS_BIT; -m_d= m_get(); -} -} -m_d--; -} -/*:297*/ -#line 5377 "hint.w" - -cur_style|= m_style; -q= link(q); -} -} -/*:298*/ -#line 6408 "hint.w" - -goto render_c; -default:; -} -goto next_p; -fin_rule: -if(is_running(rule_ht)) -rule_ht= height(this_box); -if(is_running(rule_dp)) -rule_dp= depth(this_box); -rule_ht= rule_ht+rule_dp; -if((rule_ht> 0)&&(rule_wd> 0)) -{cur_v= base_line+rule_dp; -render_rule(cur_h,cur_v,rule_wd,rule_ht); -cur_v= base_line; -} -move_past:cur_h= cur_h+rule_wd; -next_p: -#ifdef DEBUG -if(link(p)==0xffff) -QUIT("Undefined link in hlist mem[0x%x]=0x%x\n",p,mem[p].i); -#endif -p= link(p); -} -} -/*305:*/ -#line 5516 "hint.w" - -if(local_link>=0) -{end_new_link(local_link,this_box,cur_h,cur_v); -cur_link= local_link; -} -/*:305*/ -#line 6433 "hint.w" - -} - -static void vlist_render(pointer this_box) -{ -scaled left_edge; -scaled top_edge; -scaled save_v; -glue_ord g_order; -uint8_t g_sign; -pointer p; -pointer leader_box; -scaled leader_ht; -scaled lx; -scaled edge; -double glue_temp; -double cur_glue; -scaled cur_g; - -cur_g= 0;cur_glue= float_constant(0); -g_order= glue_order(this_box); -g_sign= glue_sign(this_box);p= list_ptr(this_box); -#ifdef DEBUG -if(p==0xffff) -QUIT("Undefined list pointer in vbox 0x%x-> mem[0x%x] -> 0x%x\n", -this_box,mem[this_box].i,p); -#endif -left_edge= cur_h;cur_v= cur_v-height(this_box); -top_edge= cur_v; -while(p!=null) -{if(is_char_node(p))DBG(DBGTEX,"Glyph in vertical list ignored"); -else -{switch(type(p)) -{case hlist_node: -case vlist_node: -#ifdef DEBUG -if(list_ptr(p)==0xffff) -QUIT("Undefined list pointer in vlist mem[0x%x] = 0x%x -> 0x%x\n", -p,mem[p].i,list_ptr(p)); -#endif -if(list_ptr(p)==null)cur_v= cur_v+height(p)+depth(p); -else -{cur_v= cur_v+height(p);save_v= cur_v; -cur_h= left_edge+shift_amount(p); -if(type(p)==vlist_node)vlist_render(p); -else -hlist_render(p); -cur_v= save_v+depth(p);cur_h= left_edge; -} -break; -case rule_node: -rule_ht= height(p);rule_dp= depth(p);rule_wd= width(p); -goto fin_rule; -case whatsit_node: -if(subtype(p)==image_node) -{scaled h,w; -w= image_width(p); -h= image_height(p); -cur_v= cur_v+h; -render_image(cur_h,cur_v,w,h,image_no(p)); -} -break; -case glue_node: -{pointer g= glue_ptr(p);rule_ht= width(g)-cur_g; -if(g_sign!=normal) -{if(g_sign==stretching) -{if(stretch_order(g)==g_order) -{cur_glue= cur_glue+stretch(g); -vet_glue((double)(glue_set(this_box))*cur_glue); -cur_g= round(glue_temp); -} -} -else if(shrink_order(g)==g_order) -{cur_glue= cur_glue-shrink(g); -vet_glue((double)(glue_set(this_box))*cur_glue); -cur_g= round(glue_temp); -} -} -rule_ht= rule_ht+cur_g; -if(subtype(p)>=a_leaders) -{leader_box= leader_ptr(p); -if(type(leader_box)==rule_node) -{rule_wd= width(leader_box);rule_dp= 0; -goto fin_rule; -} -leader_ht= height(leader_box)+depth(leader_box); -if((leader_ht> 0)&&(rule_ht> 0)) -{rule_ht= rule_ht+10; -edge= cur_v+rule_ht;lx= 0; -if(subtype(p)==a_leaders) -{save_v= cur_v; -cur_v= top_edge+leader_ht*((cur_v-top_edge)/leader_ht); -if(cur_v<save_v)cur_v= cur_v+leader_ht; -} -else -{int lq= rule_ht/leader_ht; -int lr= rule_ht%leader_ht; -if(subtype(p)==c_leaders)cur_v= cur_v+(lr/2); -else -{lx= lr/(lq+1); -cur_v= cur_v+((lr-(lq-1)*lx)/2); -} -} -while(cur_v+leader_ht<=edge) -{cur_h= left_edge+shift_amount(leader_box); -cur_v= cur_v+height(leader_box);save_v= cur_v; -c_ignore= true; -if(type(leader_box)==vlist_node) -vlist_render(leader_box); -else -hlist_render(leader_box); -c_ignore= false; -cur_h= left_edge; -cur_v= save_v-height(leader_box)+leader_ht+lx; -} -cur_v= edge-10;goto next_p; -} -} -} -goto move_past; -case kern_node: -cur_v= cur_v+width(p); -break; -default:; -} -goto next_p; - -fin_rule: -if(is_running(rule_wd))rule_wd= width(this_box); -rule_ht= rule_ht+rule_dp; -cur_v= cur_v+rule_ht; -if((rule_ht> 0)&&(rule_wd> 0)) -{render_rule(cur_h,cur_v,rule_wd,rule_ht); -} -goto next_p; - -move_past: -cur_v= cur_v+rule_ht; -} -next_p: -#if 0 -if(link(p)==1||link(p)==0xffff){ -show_box(streams[0].p); -QUIT("vertical node mem[0x%x] =0x%x ->linking to node 0x%x\n", -p,mem[p].i,link(p)); -} -#endif -p= link(p); -} -} - -/*:336*//*337:*/ -#line 6589 "hint.w" - - -void hint_render(void) -{nativeBlank(); -if(streams==NULL||streams[0].p==null)return; -cur_h= 0; -cur_v= height(streams[0].p); -cur_f= -1;cur_fp= NULL; -cur_link= -1;max_link= -1; -/*296:*/ -#line 5345 "hint.w" - -m_ptr= 0;m_d= 0;m_style= MARK_BIT;c_ignore= false;cur_style= 0; -/*:296*/ -#line 6598 "hint.w" - -if(type(streams[0].p)==vlist_node) -vlist_render(streams[0].p); -else -hlist_render(streams[0].p); -} -/*:337*//*338:*/ -#line 6626 "hint.w" - -int hint_print_on(int w,int h,int bpr,int bpp,unsigned char*bits) -{return nativePrintStart(w,h,bpr,bpp,bits); -} - -int hint_print_off(void) -{return nativePrintEnd(); -} - -int hint_print(unsigned char*bits) -{return nativePrint(bits); -} -/*:338*/ -#line 7692 "hint.w" - -/*:384*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/hrender.h b/Build/source/texk/web2c/hitexdir/hintview/src/hrender.h deleted file mode 100644 index 3544a4caffd..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/hrender.h +++ /dev/null @@ -1,51 +0,0 @@ -/*383:*/ -#line 7641 "hint.w" - -#ifndef _HRENDER_H -#define _HRENDER_H -/*284:*/ -#line 5094 "hint.w" - -#define MARK_BIT 0x1 -#define FOCUS_BIT 0x2 -/*:284*//*302:*/ -#line 5485 "hint.w" - -#define LINK_BIT 0x4 -/*:302*//*329:*/ -#line 6154 "hint.w" - -#define SP2PT(X) ((X)/(double)(1<<16)) -/*:329*/ -#line 7644 "hint.w" - - -extern int page_h,page_v; -extern double xdpi,ydpi; -extern uint64_t hint_blank(void); -extern void hint_render(void); -extern uint64_t hint_page_get(void); -extern uint64_t hint_page_top(uint64_t h); -extern uint64_t hint_page_middle(uint64_t h); -extern uint64_t hint_page_bottom(uint64_t h); -extern uint64_t hint_page(void); -extern uint64_t hint_page_next(void); -extern uint64_t hint_page_prev(void); -extern uint64_t hint_page_home(void); -extern void hint_resize(int px_h,int px_v,double xdpi,double ydpi); -extern void hint_clear_fonts(bool rm); -extern void hmark_page(void); -extern void hint_set_mark(char*m,int s); -extern bool hint_prev_mark(void); -extern bool hint_next_mark(void); -extern double hint_get_fpos(void); -extern uint64_t hint_set_fpos(double fpos); -extern void hint_render_on(void); -extern void hint_render_off(void); -extern void hint_dark(int dark); -extern void hint_gamma(double gamma); -extern int hint_print_on(int w,int h,int bpr,int bpp,unsigned char*bits); -extern int hint_print_off(void); -extern int hint_print(unsigned char*bits); -#endif -/*:383*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/htex.c b/Build/source/texk/web2c/hitexdir/hintview/src/htex.c deleted file mode 100644 index 3b6aad2d9a2..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/htex.c +++ /dev/null @@ -1,3622 +0,0 @@ -/*4:*/ -#line 264 "htex.w" - -#ifndef _HETX_H_ -#define _HTEX_H_ - -#include "basetypes.h" -#include <string.h> -#include <math.h> - -#include "error.h" -#include "format.h" -#include "get.h" -#include "htex.h" -#include "hint.h" -#ifdef STAT -#include "hprint.h" -#endif -/*120:*/ -#line 2590 "htex.w" - -pointer temp_ptr; - -/*:120*//*121:*/ -#line 2622 "htex.w" - -memory_word mem0[mem_max-mem_min+1],*const mem= mem0-mem_min; -pointer lo_mem_max; -pointer hi_mem_min; - -/*:121*//*122:*/ -#line 2635 "htex.w" - -static int var_used,dyn_used; -#ifdef STAT -#define incr_dyn_used incr(dyn_used) -#define decr_dyn_used decr(dyn_used) -#else -#define incr_dyn_used -#define decr_dyn_used -#endif - -/*:122*//*123:*/ -#line 2659 "htex.w" - -static pointer avail; - -/*:123*//*129:*/ -#line 2762 "htex.w" - -static pointer rover; - -/*:129*//*658:*/ -#line 13069 "htex.w" - -static scaled total_stretch0[filll-normal+1], -*const total_stretch= total_stretch0-normal, -total_shrink0[filll-normal+1],*const total_shrink= total_shrink0-normal; - - -/*:658*//*660:*/ -#line 13081 "htex.w" - -pointer adjust_tail= null; - -/*:660*//*829:*/ -#line 16206 "htex.w" - -pointer just_box; - -/*:829*//*837:*/ -#line 16343 "htex.w" - -static pointer passive; -static pointer printed_node; -static halfword pass_number; - -/*:837*//*840:*/ -#line 16383 "htex.w" - -static scaled active_width0[6],*const active_width= active_width0-1; - -static scaled cur_active_width0[6], -*const cur_active_width= cur_active_width0-1; -static scaled background0[6],*const background= background0-1; -static scaled break_width0[6],*const break_width= break_width0-1; - -/*:840*//*843:*/ -#line 16442 "htex.w" - -static bool no_shrink_error_yet; - -/*:843*//*847:*/ -#line 16485 "htex.w" - -static pointer cur_p; -static bool second_pass; -static bool final_pass; -static int threshold; - -/*:847*//*853:*/ -#line 16587 "htex.w" - -static int minimal_demerits0[tight_fit-very_loose_fit+1], -*const minimal_demerits= minimal_demerits0-very_loose_fit; - -static int minimum_demerits; - -static pointer best_place0[tight_fit-very_loose_fit+1], -*const best_place= best_place0-very_loose_fit; - -static halfword best_pl_line0[tight_fit-very_loose_fit+1], -*const best_pl_line= best_pl_line0-very_loose_fit; - - -/*:853*//*860:*/ -#line 16709 "htex.w" - -static scaled disc_width; - -/*:860*//*869:*/ -#line 16852 "htex.w" - -static halfword easy_line; -static halfword last_special_line; - -static scaled first_width; - -static scaled second_width; -static scaled first_indent; -static scaled second_indent; - -/*:869*//*895:*/ -#line 17358 "htex.w" - -static pointer best_bet; -static int fewest_demerits; -static halfword best_line; -static int actual_looseness; - -static int line_diff; - - -/*:895*//*996:*/ -#line 19165 "htex.w" - -scaled best_height_plus_depth; - - -/*:996*//*1005:*/ -#line 19367 "htex.w" - -pointer page_tail; -int page_contents; -scaled page_max_depth; -pointer best_page_break; -int least_page_cost; -scaled best_size; - -/*:1005*//*1007:*/ -#line 19449 "htex.w" - -scaled page_so_far[8]; -int insert_penalties; - - -/*:1007*/ -#line 280 "htex.w" - - -/*97:*/ -#line 2112 "htex.w" - -void overflow(char*s,int n) -{QUIT("Capacity exceeded, sorry [%s=%d=0x%X]\n",s,n,n); -} - -/*:97*//*98:*/ -#line 2125 "htex.w" - -void confusion(char*s) - -{QUIT("This can't happen(%s)",s);} - -/*:98*/ -#line 282 "htex.w" - -#endif - -/*:4*//*103:*/ -#line 2192 "htex.w" - - -static int half(int x) -{if(odd(x))return(x+1)/2; -else return x/2; -} - -/*:103*//*108:*/ -#line 2290 "htex.w" - -static bool arith_error; -static scaled rem; - -/*:108*//*110:*/ -#line 2314 "htex.w" - -static scaled x_over_n(scaled x,int n) -{bool negative; -scaled x_over_n; -negative= false; -if(n==0) -{arith_error= true;x_over_n= 0;rem= x; -} -else{if(n<0) -{negate(x);negate(n);negative= true; -} -if(x>=0) -{x_over_n= x/n;rem= x%n; -} -else{x_over_n= -((-x)/n);rem= -((-x)%n); -} -} -if(negative)negate(rem); -return x_over_n;} - -/*:110*//*111:*/ -#line 2341 "htex.w" - -static scaled xn_over_d(scaled x,int n,int d) -{bool positive; -nonnegative_integer t,u,v; -scaled xn_over_d; -if(x>=0)positive= true; -else{negate(x);positive= false; -} -t= (x%0100000)*n; -u= (x/0100000)*n+(t/0100000); -v= (u%d)*0100000+(t%0100000); -if(u/d>=0100000)arith_error= true; -else u= 0100000*(u/d)+(v/d); -if(positive) -{xn_over_d= u;rem= v%d; -} -else{xn_over_d= -u;rem= -(v%d); -} -return xn_over_d;} - -/*:111*//*112:*/ -#line 2381 "htex.w" - -halfword badness(scaled t,scaled s) -{int r; - -if(t==0)return 0; -else if(s<=0)return inf_bad; -else{if(t<=7230584)r= (t*297)/s; -else if(s>=1663497)r= t/(s/297); -else r= t; -if(r> 1290)return inf_bad; -else return(r*r*r+0400000)/01000000; -} -} - -/*:112*//*125:*/ -#line 2678 "htex.w" - -static pointer get_avail(void) -{pointer p; -p= avail; -if(p!=null)avail= link(avail); -else{decr(hi_mem_min);p= hi_mem_min; -if(hi_mem_min<=lo_mem_max) -{ -overflow("main memory size",mem_max+1-mem_min); - - -} -} -link(p)= null; -#ifdef STAT -incr(dyn_used); -#endif - -return p; -} - -/*:125*//*128:*/ -#line 2725 "htex.w" - -static void flush_list(pointer p) - -{pointer q,r; -if(p!=null) -{r= p; -do{q= r;r= link(r); -#ifdef STAT -decr(dyn_used); -#endif -}while(!(r==null)); -link(q)= avail;avail= p; -} -} - -/*:128*//*130:*/ -#line 2773 "htex.w" - -pointer get_node(int s) -{ -pointer p; -pointer q; -int r; -int t; -restart:p= rover; -do{/*132:*/ -#line 2825 "htex.w" - -q= p+node_size(p); - -while(is_empty(q)) -{t= rlink(q); -if(q==rover)rover= t; -llink(t)= llink(q);rlink(llink(q))= t; -q= q+node_size(q); -} -r= q-s; -if(r> p+1)/*133:*/ -#line 2840 "htex.w" - -{node_size(p)= r-p; - -rover= p; -goto found; -} - -/*:133*/ -#line 2835 "htex.w" -; -if(r==p)if(rlink(p)!=p) -/*134:*/ -#line 2849 "htex.w" - -{rover= rlink(p);t= llink(p); -llink(rover)= t;rlink(t)= rover; -goto found; -} - -/*:134*/ -#line 2837 "htex.w" -; -node_size(p)= q-p - -/*:132*/ -#line 2782 "htex.w" -; - -p= rlink(p); -}while(!(p==rover)); -if(s==010000000000) -{return max_halfword; -} -if(lo_mem_max+2<hi_mem_min)if(lo_mem_max+2<=mem_bot+max_halfword) -/*131:*/ -#line 2810 "htex.w" - -{if(hi_mem_min-lo_mem_max>=1998)t= lo_mem_max+1000; -else t= lo_mem_max+1+(hi_mem_min-lo_mem_max)/2; - -p= llink(rover);q= lo_mem_max;rlink(p)= q;llink(rover)= q; -if(t> mem_bot+max_halfword)t= mem_bot+max_halfword; -rlink(q)= rover;llink(q)= p;link(q)= empty_flag;node_size(q)= t-lo_mem_max; -lo_mem_max= t;link(lo_mem_max)= null;info(lo_mem_max)= null; -rover= q;goto restart; -} - -/*:131*/ -#line 2790 "htex.w" -; -overflow("main memory size",mem_max+1-mem_min); - - -found:link(r)= null; -#ifdef STAT -var_used= var_used+s; -#endif - -leak_in(r,s); -return r; -} - -/*:130*//*135:*/ -#line 2860 "htex.w" - -static void free_node(pointer p,halfword s) - -{pointer q; -leak_out(p,s); -store_map(p,0,0); -node_size(p)= s;link(p)= empty_flag; -q= llink(rover);llink(p)= q;rlink(p)= rover; -llink(rover)= p;rlink(q)= p; -#ifdef STAT -var_used= var_used-s; -#endif - -} - -/*:135*//*141:*/ -#line 3011 "htex.w" - -pointer new_null_box(void) -{pointer p; -p= get_node(box_node_size);type(p)= hlist_node; -subtype(p)= min_quarterword; -width(p)= 0;depth(p)= 0;height(p)= 0;shift_amount(p)= 0;list_ptr(p)= null; -glue_sign(p)= normal;glue_order(p)= normal;set_glue_ratio_zero(glue_set(p)); -return p; -} - -/*:141*//*144:*/ -#line 3042 "htex.w" - -pointer new_rule(void) -{pointer p; -p= get_node(rule_node_size);type(p)= rule_node; -subtype(p)= 0; -width(p)= null_flag;depth(p)= null_flag;height(p)= null_flag; -return p; -} - -/*:144*//*149:*/ -#line 3112 "htex.w" - -pointer new_ligature(quarterword f,quarterword c,pointer q) -{pointer p; -p= get_node(small_node_size);type(p)= ligature_node; -font(lig_char(p))= f;character(lig_char(p))= c;lig_ptr(p)= q; -subtype(p)= 0;return p; -} - - -/*:149*//*150:*/ -#line 3146 "htex.w" - -pointer new_disc(void) -{pointer p; -p= get_node(small_node_size);type(p)= disc_node; -subtype(p)= 0;pre_break(p)= null;post_break(p)= null; -return p; -} - -/*:150*//*152:*/ -#line 3181 "htex.w" - -pointer new_math(scaled w,small_number s) -{pointer p; -p= get_node(small_node_size);type(p)= math_node; -subtype(p)= s;width(p)= w;return p; -} - -/*:152*//*156:*/ -#line 3264 "htex.w" - -pointer new_spec(pointer p) -{pointer q; -q= get_node(glue_spec_size); -mem[q]= mem[p];glue_ref_count(q)= null; -width(q)= width(p);stretch(q)= stretch(p);shrink(q)= shrink(p); -return q; -} - -/*:156*//*158:*/ -#line 3291 "htex.w" - -pointer new_glue(pointer q) -{pointer p; -p= get_node(small_node_size);type(p)= glue_node;subtype(p)= normal; -leader_ptr(p)= null;glue_ptr(p)= q;incr(glue_ref_count(q)); -return p; -} - -/*:158*//*161:*/ -#line 3330 "htex.w" - -pointer new_kern(scaled w) -{pointer p; -p= get_node(small_node_size);type(p)= kern_node; -subtype(p)= normal; -width(p)= w; -return p; -} - -/*:161*//*163:*/ -#line 3354 "htex.w" - -pointer new_penalty(int m) -{pointer p; -p= get_node(small_node_size);type(p)= penalty_node; -subtype(p)= 0; -penalty(p)= m;return p; -} - -/*:163*//*169:*/ -#line 3434 "htex.w" - -void mem_init(void) -{int k; -/*170:*/ -#line 3440 "htex.w" - -for(k= mem_bot+1;k<=lo_mem_stat_max;k++)mem[k].sc= 0; - - -k= mem_bot;while(k<=lo_mem_stat_max) - -{glue_ref_count(k)= null+1; -stretch_order(k)= normal;shrink_order(k)= normal; -k= k+glue_spec_size; -} -rover= lo_mem_stat_max+1; -link(rover)= empty_flag; -node_size(rover)= 1000; -llink(rover)= rover;rlink(rover)= rover; -lo_mem_max= rover+1000;link(lo_mem_max)= null;info(lo_mem_max)= null; -for(k= hi_mem_stat_min;k<=mem_top;k++) -mem[k]= mem[lo_mem_max]; -/*804:*/ -#line 15749 "htex.w" - -info(omit_template)= end_template_token; - -/*:804*//*811:*/ -#line 15856 "htex.w" - -link(end_span)= max_quarterword+1;info(end_span)= null; - -/*:811*//*835:*/ -#line 16312 "htex.w" - -type(last_active)= hyphenated;line_number(last_active)= max_halfword; -subtype(last_active)= 0; - -/*:835*//*1006:*/ -#line 19420 "htex.w" - -subtype(page_ins_head)= qi(255); -type(page_ins_head)= split_up;link(page_ins_head)= page_ins_head; - -/*:1006*//*1013:*/ -#line 19576 "htex.w" - -type(page_head)= glue_node;subtype(page_head)= normal; - -/*:1013*/ -#line 3457 "htex.w" -; -avail= null; -hi_mem_min= hi_mem_stat_min; -var_used= lo_mem_stat_max+1-mem_bot;dyn_used= hi_mem_stat_usage; - - -/*:170*/ -#line 3437 "htex.w" - -} - -/*:169*//*209:*/ -#line 3988 "htex.w" - -static void delete_token_ref(pointer p) - -{if(token_ref_count(p)==null)flush_list(p); -else decr(token_ref_count(p)); -} - -/*:209*//*210:*/ -#line 4003 "htex.w" - -void delete_glue_ref(pointer p) -fast_delete_glue_ref(p) -static void delete_xdimen_ref(pointer p) -{if(p==null)return; -if(xdimen_ref_count(p)==null)free_node(p,xdimen_node_size); -else decr(xdimen_ref_count(p)); -} - -/*:210*//*211:*/ -#line 4017 "htex.w" - -void flush_node_list(pointer p) -{ -pointer q; -while(p!=null) - -{q= link(p); -if(is_char_node(p))free_avail(p) -else{switch(type(p)){ -case hlist_node:case vlist_node: -case unset_node:{flush_node_list(list_ptr(p)); -free_node(p,box_node_size);goto done; -} -case rule_node:{free_node(p,rule_node_size);goto done; -} -case ins_node:{flush_node_list(ins_ptr(p)); -delete_glue_ref(split_top_ptr(p)); -free_node(p,ins_node_size);goto done; -} -case whatsit_node:/*1387:*/ -#line 25400 "htex.w" - -{switch(subtype(p)){ -case close_node:case language_node:free_node(p,small_node_size);break; -case param_node: -if(param_type(p)==glue_type)fast_delete_glue_ref(param_value(p).i); -free_node(p,param_node_size);break; -case par_node: -delete_xdimen_ref(par_extent(p)); -flush_node_list(par_params(p)); -flush_node_list(par_list(p)); -free_node(p,par_node_size);break; -case disp_node: -flush_node_list(display_eqno(p)); -flush_node_list(display_formula(p)); -flush_node_list(display_params(p)); -free_node(p,disp_node_size);break; -case baseline_node: -free_node(p,baseline_node_size);break; -case hpack_node:case vpack_node: -delete_xdimen_ref(pack_extent(p)); -flush_node_list(list_ptr(p)); -free_node(p,pack_node_size);break; -case hset_node:case vset_node: -delete_xdimen_ref(set_extent(p)); -flush_node_list(list_ptr(p)); -free_node(p,set_node_size);break; -case image_node: -flush_node_list(image_alt(p)); -free_node(p,image_node_size);break; -case align_node: -delete_xdimen_ref(align_extent(p)); -flush_node_list(align_preamble(p)); -flush_node_list(align_list(p)); -free_node(p,align_node_size);break; -case setpage_node: -delete_glue_ref(setpage_topskip(p)); -delete_xdimen_ref(setpage_height(p)); -delete_xdimen_ref(setpage_width(p)); -flush_node_list(setpage_list(p)); -flush_node_list(setpage_streams(p)); -free_node(p,setpage_node_size);break; -case setstream_node: -delete_xdimen_ref(setstream_max(p)); -delete_xdimen_ref(setstream_width(p)); -delete_glue_ref(setstream_topskip(p)); -delete_glue_ref(setstream_height(p)); -flush_node_list(setstream_before(p)); -flush_node_list(setstream_after(p)); -free_node(p,setstream_node_size);break; -case ignore_node: -flush_node_list(ignore_list(p)); -free_node(p,ignore_node_size);break; -case start_link_node: -if(label_has_name(p))delete_token_ref(label_ptr(p)); -free_node(p,link_node_size);break; -case end_link_node: -free_node(p,link_node_size);break; -case label_node: -if(label_has_name(p))delete_token_ref(label_ptr(p)); -free_node(p,label_node_size);break; -case outline_node: -if(label_has_name(p))delete_token_ref(label_ptr(p)); -flush_node_list(outline_ptr(p)); -free_node(p,outline_node_size);break; -case stream_node: -free_node(p,stream_node_size);break; -case xdimen_node: -free_node(p,xdimen_node_size); -default:confusion("ext3"); - -} -goto done; -} - -/*:1387*/ -#line 4036 "htex.w" - -case glue_node:{fast_delete_glue_ref(glue_ptr(p)); -if(leader_ptr(p)!=null)flush_node_list(leader_ptr(p)); -}break; -case kern_node:case math_node:case penalty_node:do_nothing;break; -case ligature_node:flush_node_list(lig_ptr(p));break; -case disc_node:{flush_node_list(pre_break(p)); -flush_node_list(post_break(p)); -}break; -case adjust_node:flush_node_list(adjust_ptr(p));break; -default:QUIT("Confusion while flushing node list"); - -} -free_node(p,small_node_size); -done:;} -p= q; -} -} - -/*:211*//*213:*/ -#line 4080 "htex.w" - -pointer copy_node_list(pointer p) - -{pointer h; -pointer q; -pointer r; -int words; -h= get_avail();q= h; -while(p!=null) -{/*214:*/ -#line 4096 "htex.w" - -words= 1; -if(is_char_node(p))r= get_avail(); -else/*215:*/ -#line 4105 "htex.w" - -switch(type(p)){ -case hlist_node:case vlist_node:case unset_node:{r= get_node(box_node_size); -mem[r+6]= mem[p+6];mem[r+5]= mem[p+5]; -list_ptr(r)= copy_node_list(list_ptr(p)); -words= 5; -}break; -case rule_node:{r= get_node(rule_node_size);words= rule_node_size; -}break; -case ins_node:{r= get_node(ins_node_size);mem[r+4]= mem[p+4]; -add_glue_ref(split_top_ptr(p)); -ins_ptr(r)= copy_node_list(ins_ptr(p)); -words= ins_node_size-1; -}break; -case whatsit_node:/*1386:*/ -#line 25282 "htex.w" - -switch(subtype(p)){ -case open_node:{r= get_node(open_node_size);words= open_node_size; -}break; -case write_node:case special_node:{r= get_node(write_node_size); -add_token_ref(write_tokens(p));words= write_node_size; -}break; -case close_node:case language_node:{r= get_node(small_node_size); -words= small_node_size; -}break; -case param_node: -{r= get_node(param_node_size); -if(param_type(p)==glue_type)add_glue_ref(param_value(p).i); -words= param_node_size; -}break; -case par_node: -{r= get_node(par_node_size); -add_xdimen_ref(par_extent(p)); -par_params(r)= copy_node_list(par_params(p)); -par_list(r)= copy_node_list(par_list(p)); -words= par_node_size-1; -}break; -case disp_node: -{r= get_node(disp_node_size); -display_left(r)= display_left(p); -display_no_bs(r)= display_no_bs(p); -display_eqno(r)= copy_node_list(display_eqno(p)); -display_formula(r)= copy_node_list(display_formula(p)); -display_params(r)= copy_node_list(display_params(p)); -words= disp_node_size-2; -}break; -case baseline_node: -{r= get_node(baseline_node_size); -words= baseline_node_size; -}break; -case hpack_node:case vpack_node: -{r= get_node(pack_node_size); -mem[r+7]= mem[p+7];mem[r+6]= mem[p+6];mem[r+5]= mem[p+5]; -list_ptr(r)= copy_node_list(list_ptr(p)); -add_xdimen_ref(pack_extent(p)); -words= 5; -}break; -case hset_node:case vset_node: -{r= get_node(set_node_size); -mem[r+8]= mem[p+8];mem[r+7]= mem[p+7];mem[r+6]= mem[p+6];mem[r+5]= mem[p+5]; -list_ptr(r)= copy_node_list(list_ptr(p)); -add_xdimen_ref(set_extent(p)); -words= 5; -}break; -case image_node: -r= get_node(image_node_size); -image_alt(r)= copy_node_list(image_alt(p)); -words= image_node_size-1; -break; -case align_node: -{r= get_node(align_node_size); -align_preamble(r)= copy_node_list(align_preamble(p)); -align_list(r)= copy_node_list(align_list(p)); -add_xdimen_ref(align_extent(p)); -words= align_node_size-1; -}break; -case setpage_node: -{r= get_node(setpage_node_size); -add_glue_ref(setpage_topskip(p)); -add_xdimen_ref(setpage_height(p)); -add_xdimen_ref(setpage_width(p)); -setpage_list(r)= copy_node_list(setpage_list(p)); -setpage_streams(r)= copy_node_list(setpage_streams(p)); -words= setpage_node_size-1; -}break; -case setstream_node: -{r= get_node(setstream_node_size); -add_xdimen_ref(setstream_max(p)); -add_xdimen_ref(setstream_width(p)); -add_glue_ref(setstream_topskip(p)); -add_glue_ref(setstream_height(p)); -setstream_before(r)= copy_node_list(setstream_before(p)); -setstream_after(r)= copy_node_list(setstream_after(p)); -words= setstream_node_size-1; -}break; -case ignore_node: -r= get_node(ignore_node_size); -ignore_info(r)= ignore_info(p); -ignore_list(r)= copy_node_list(ignore_list(p)); -words= ignore_node_size-1; -break; -case start_link_node: -r= get_node(link_node_size); -if(label_has_name(p))add_token_ref(label_ptr(p)); -words= link_node_size; -break; -case end_link_node: -r= get_node(link_node_size); -words= link_node_size; -break; -case label_node: -r= get_node(label_node_size); -if(label_has_name(p))add_token_ref(label_ptr(p)); -words= label_node_size; -break; -case outline_node: -r= get_node(outline_node_size); -if(label_has_name(p))add_token_ref(label_ptr(p)); -outline_ptr(r)= copy_node_list(outline_ptr(p)); -words= outline_node_size-1; -break; -case stream_node: -r= get_node(stream_node_size); -words= stream_node_size; -break; -case xdimen_node: -r= get_node(xdimen_node_size); -words= xdimen_node_size; -break; -default:confusion("ext2"); - -} - -/*:1386*/ -#line 4120 "htex.w" -break; -case glue_node:{r= get_node(small_node_size);add_glue_ref(glue_ptr(p)); -glue_ptr(r)= glue_ptr(p);leader_ptr(r)= copy_node_list(leader_ptr(p)); -}break; -case kern_node:case math_node:case penalty_node:{r= get_node(small_node_size); -words= small_node_size; -}break; -case ligature_node:{r= get_node(small_node_size); -mem[lig_char(r)]= mem[lig_char(p)]; -lig_ptr(r)= copy_node_list(lig_ptr(p)); -}break; -case disc_node:{r= get_node(small_node_size); -pre_break(r)= copy_node_list(pre_break(p)); -post_break(r)= copy_node_list(post_break(p)); -}break; -case mark_node:{r= get_node(small_node_size);add_token_ref(mark_ptr(p)); -words= small_node_size; -}break; -case adjust_node:{r= get_node(small_node_size); -adjust_ptr(r)= copy_node_list(adjust_ptr(p)); -}break; -default:confusion("copying"); - -} - -/*:215*/ -#line 4100 "htex.w" -; -while(words> 0) -{decr(words);mem[r+words]= mem[p+words]; -} - -/*:214*/ -#line 4089 "htex.w" -; -link(q)= r;q= r;p= link(p); -} -link(q)= null;q= link(h);free_avail(h); -return q; -} - -/*:213*//*224:*/ -#line 4470 "htex.w" - - -/*222:*/ -#line 4451 "htex.w" - -static list_state_record nest[nest_size+1]; -int nest_ptr; -static int max_nest_stack; -list_state_record cur_list; - -/*:222*/ -#line 4472 "htex.w" - - -void list_init(void) -{ -nest_ptr= 0;max_nest_stack= 0; -memset(&cur_list,0,sizeof(cur_list)); -mode= vmode;head= contrib_head;tail= contrib_head; -prev_height= prev_depth= ignore_depth; -} -/*:224*//*226:*/ -#line 4490 "htex.w" - -void push_nest(void) -{if(nest_ptr> max_nest_stack) -{max_nest_stack= nest_ptr; -if(nest_ptr==nest_size)overflow("semantic nest size",nest_size); - -} -nest[nest_ptr]= cur_list; -incr(nest_ptr);head= get_avail();tail= head;prev_graf= 0; -cur_list.bs_pos= NULL;cur_bs= baseline_skip;cur_ls= line_skip;cur_lsl= line_skip_limit; -} - -/*:226*//*227:*/ -#line 4507 "htex.w" - -void pop_nest(void) -{free_avail(head);decr(nest_ptr);cur_list= nest[nest_ptr]; -} - -/*:227*//*560:*/ -#line 10883 "htex.w" - -memory_word font_info[font_mem_size+1]; - -static font_index fmem_ptr= 0; - -void hclear_fonts(void) -{fmem_ptr= 0; -} -static internal_font_number font_ptr; -static four_quarters font_check0[font_max-font_base+1], -*const font_check= font_check0-font_base; -scaled font_size0[font_max-font_base+1], -*const font_size= font_size0-font_base; -static scaled font_dsize0[font_max-font_base+1], -*const font_dsize= font_dsize0-font_base; -static font_index font_params0[font_max-font_base+1], -*const font_params= font_params0-font_base; - -char*font_name0[font_max-font_base+1], -**const font_name= font_name0-font_base; -static eight_bits font_bc0[font_max-font_base+1], -*const font_bc= font_bc0-font_base; - -static eight_bits font_ec0[font_max-font_base+1], -*const font_ec= font_ec0-font_base; - -static pointer font_glue0[font_max-font_base+1], -*const font_glue= font_glue0-font_base; - -static bool font_used0[font_max-font_base+1], -*const font_used= font_used0-font_base; - -static int hyphen_char0[font_max-font_base+1], -*const hyphen_char= hyphen_char0-font_base; - -static int skew_char0[font_max-font_base+1], -*const skew_char= skew_char0-font_base; - -static font_index bchar_label0[font_max-font_base+1], -*const bchar_label= bchar_label0-font_base; - - -static int16_t font_bchar0[font_max-font_base+1], -*const font_bchar= font_bchar0-font_base; - -static int16_t font_false_bchar0[font_max-font_base+1], -*const font_false_bchar= font_false_bchar0-font_base; - - -/*:560*//*561:*/ -#line 10941 "htex.w" - -int char_base0[font_max-font_base+1], -*const char_base= char_base0-font_base; - -int width_base0[font_max-font_base+1], -*const width_base= width_base0-font_base; - -static int height_base0[font_max-font_base+1], -*const height_base= height_base0-font_base; - -static int depth_base0[font_max-font_base+1], -*const depth_base= depth_base0-font_base; - -static int italic_base0[font_max-font_base+1], -*const italic_base= italic_base0-font_base; - -static int lig_kern_base0[font_max-font_base+1], -*const lig_kern_base= lig_kern_base0-font_base; - -static int kern_base0[font_max-font_base+1], -*const kern_base= kern_base0-font_base; - -static int exten_base0[font_max-font_base+1], -*const exten_base= exten_base0-font_base; - -static int param_base0[font_max-font_base+1], -*const param_base= param_base0-font_base; - - -/*:561*//*571:*/ -#line 11096 "htex.w" - -void read_font_info(int f,char*nom,scaled s) -{ -int k; -bool file_opened; -halfword lf,lh,bc,ec,nw,nh,nd,ni,nl,nk,ne,np; - -eight_bits a,b,c,d; -four_quarters qw;scaled sw; -int bch_label; -int bchar; -scaled z; -int alpha;int beta; - -/*573:*/ -#line 11145 "htex.w" - -/*574:*/ -#line 11157 "htex.w" - -file_opened= true - -/*:574*/ -#line 11146 "htex.w" -; -/*576:*/ -#line 11181 "htex.w" - -{read_sixteen(lf); -fget;read_sixteen(lh); -fget;read_sixteen(bc); -fget;read_sixteen(ec); -if((bc> ec+1)||(ec> 255))abort; -if(bc> 255) -{bc= 1;ec= 0; -} -fget;read_sixteen(nw); -fget;read_sixteen(nh); -fget;read_sixteen(nd); -fget;read_sixteen(ni); -fget;read_sixteen(nl); -fget;read_sixteen(nk); -fget;read_sixteen(ne); -fget;read_sixteen(np); -if(lf!=6+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ne+np)abort; -if((nw==0)||(nh==0)||(nd==0)||(ni==0))abort; -} - -/*:576*/ -#line 11147 "htex.w" -; -/*577:*/ -#line 11208 "htex.w" - -lf= lf-6-lh; -if(np<7)lf= lf+7-np; -if((font_ptr==font_max)||(fmem_ptr+lf> font_mem_size)) -QUIT("Not enough room left for font %s\n",nom); -char_base[f]= fmem_ptr-bc; -width_base[f]= char_base[f]+ec+1; -height_base[f]= width_base[f]+nw; -depth_base[f]= height_base[f]+nh; -italic_base[f]= depth_base[f]+nd; -lig_kern_base[f]= italic_base[f]+ni; -kern_base[f]= lig_kern_base[f]+nl-kern_base_offset; -exten_base[f]= kern_base[f]+kern_base_offset+nk; -param_base[f]= exten_base[f]+ne - -/*:577*/ -#line 11148 "htex.w" -; -/*579:*/ -#line 11236 "htex.w" - -{if(lh<2)abort; -store_four_quarters(font_check[f]); -fget;read_sixteen(z); -fget;z= z*0400+fbyte;fget;z= (z*020)+(fbyte/020); -if(z<unity)abort; -while(lh> 2) -{fget;fget;fget;fget;decr(lh); -} -font_dsize[f]= z; -if(s!=-1000) -if(s>=0)z= s; -else z= xn_over_d(z,-s,1000); -font_size[f]= z; -} - -/*:579*/ -#line 11149 "htex.w" -; -/*580:*/ -#line 11252 "htex.w" - -for(k= fmem_ptr;k<=width_base[f]-1;k++) -{store_four_quarters(font_info[k].qqqq); -if((a>=nw)||(b/020>=nh)||(b%020>=nd)|| -(c/4>=ni))abort; -switch(c%4){ -case lig_tag:if(d>=nl)abort;break; -case ext_tag:if(d>=ne)abort;break; -case list_tag:/*581:*/ -#line 11273 "htex.w" - -{check_byte_range(d); -while(d<current_character_being_worked_on) -{qw= char_info(f,d); - -if(char_tag(qw)!=list_tag)goto not_found; -d= qo(rem_byte(qw)); -} -if(d==current_character_being_worked_on)abort; -not_found:;} - -/*:581*/ -#line 11260 "htex.w" -break; -default:do_nothing; -} -} - -/*:580*/ -#line 11150 "htex.w" -; -/*582:*/ -#line 11308 "htex.w" - -{/*583:*/ -#line 11318 "htex.w" - -{alpha= 16; -while(z>=040000000) -{z= z/2;alpha= alpha+alpha; -} -beta= 256/alpha;alpha= alpha*z; -} - -/*:583*/ -#line 11309 "htex.w" -; -for(k= width_base[f];k<=lig_kern_base[f]-1;k++) -store_scaled(font_info[k].sc); -if(font_info[width_base[f]].sc!=0)abort; -if(font_info[height_base[f]].sc!=0)abort; -if(font_info[depth_base[f]].sc!=0)abort; -if(font_info[italic_base[f]].sc!=0)abort; -} - -/*:582*/ -#line 11151 "htex.w" -; -/*584:*/ -#line 11332 "htex.w" - -bch_label= 077777;bchar= 256; -if(nl> 0) -{for(k= lig_kern_base[f];k<=kern_base[f]+kern_base_offset-1;k++) -{store_four_quarters(font_info[k].qqqq); -if(a> 128) -{if(256*c+d>=nl)abort; -if(a==255)if(k==lig_kern_base[f])bchar= b; -} -else{if(b!=bchar)check_existence(b); -if(c<128)check_existence(d) -else if(256*(c-128)+d>=nk)abort; -if(a<128)if(k-lig_kern_base[f]+a+1>=nl)abort; -} -} -if(a==255)bch_label= 256*c+d; -} -for(k= kern_base[f]+kern_base_offset;k<=exten_base[f]-1;k++) -store_scaled(font_info[k].sc); - -/*:584*/ -#line 11152 "htex.w" -; -/*585:*/ -#line 11352 "htex.w" - -for(k= exten_base[f];k<=param_base[f]-1;k++) -{store_four_quarters(font_info[k].qqqq); -if(a!=0)check_existence(a); -if(b!=0)check_existence(b); -if(c!=0)check_existence(c); -check_existence(d); -} - -/*:585*/ -#line 11153 "htex.w" -; -/*586:*/ -#line 11364 "htex.w" - -{for(k= 1;k<=np;k++) -if(k==1) -{fget;sw= fbyte;if(sw> 127)sw= sw-256; -fget;sw= sw*0400+fbyte;fget;sw= sw*0400+fbyte; -fget;font_info[param_base[f]].sc= -(sw*020)+(fbyte/020); -} -else store_scaled(font_info[param_base[f]+k-1].sc); -if(hpos>=hend)abort; -for(k= np+1;k<=7;k++)font_info[param_base[f]+k-1].sc= 0; -} - -/*:586*/ -#line 11154 "htex.w" -; -/*587:*/ -#line 11384 "htex.w" - -if(np>=7)font_params[f]= np;else font_params[f]= 7; -hyphen_char[f]= skew_char[f]= -1; -if(bch_label<nl)bchar_label[f]= bch_label+lig_kern_base[f]; -else bchar_label[f]= non_address; -font_bchar[f]= qi(bchar); -font_false_bchar[f]= qi(bchar); -if(bchar<=ec)if(bchar>=bc) -{qw= char_info(f,bchar); -if(char_exists(qw))font_false_bchar[f]= non_char; -} -font_name[f]= nom; -font_bc[f]= bc;font_ec[f]= ec;font_glue[f]= null; -adjust(char_base);adjust(width_base);adjust(lig_kern_base); -adjust(kern_base);adjust(exten_base); -decr(param_base[f]); -fmem_ptr= fmem_ptr+lf;goto done - -/*:587*/ -#line 11155 "htex.w" - - -/*:573*/ -#line 11112 "htex.w" -; -bad_tfm:QUIT("Bad tfm file: %s\n",nom); -done:; -} - -/*:571*//*593:*/ -#line 11487 "htex.w" - -pointer new_character(internal_font_number f,eight_bits c) -{pointer p; -#ifdef DEBUG -if(font_bc[f]> c||font_ec[f]<c||!char_exists(char_info(f,qi(c)))) -DBG(DBGFONT,"Warning: Character 0x%0X in font %d does not exist\n",c,f); -#endif -p= get_avail();font(p)= f;character(p)= qi(c); -return p; -} - -/*:593*//*662:*/ -#line 13088 "htex.w" - -pointer hpack(pointer p,scaled w,small_number m) -{ -pointer r; -pointer q; -scaled h,d,x; -scaled s; -pointer g; -glue_ord o; -internal_font_number f; -four_quarters i; -eight_bits hd; -r= get_node(box_node_size);type(r)= hlist_node; -subtype(r)= min_quarterword;shift_amount(r)= 0; -q= r+list_offset;link(q)= p; -h= 0;/*663:*/ -#line 13114 "htex.w" - -d= 0;x= 0; -total_stretch[normal]= 0;total_shrink[normal]= 0; -total_stretch[fil]= 0;total_shrink[fil]= 0; -total_stretch[fill]= 0;total_shrink[fill]= 0; -total_stretch[filll]= 0;total_shrink[filll]= 0 - -/*:663*/ -#line 13103 "htex.w" -; -while(p!=null)/*664:*/ -#line 13121 "htex.w" - - -{reswitch:while(is_char_node(p)) -/*667:*/ -#line 13166 "htex.w" - -{f= font(p);i= char_info(f,character(p));hd= height_depth(i); -x= x+char_width(f,i); -s= char_height(f,hd);if(s> h)h= s; -s= char_depth(f,hd);if(s> d)d= s; -p= link(p); -} - -/*:667*/ -#line 13125 "htex.w" -; -if(p!=null) -{switch(type(p)){ -case hlist_node:case vlist_node:case rule_node: -case unset_node: -/*666:*/ -#line 13154 "htex.w" - -{x= x+width(p); -if(type(p)>=rule_node)s= 0;else s= shift_amount(p); -if(height(p)-s> h)h= height(p)-s; -if(depth(p)+s> d)d= depth(p)+s; -} - -/*:666*/ -#line 13131 "htex.w" -break; -case ins_node:case mark_node:case adjust_node:if(adjust_tail!=null) -/*668:*/ -#line 13181 "htex.w" - -{while(link(q)!=p)q= link(q); -if(type(p)==adjust_node) -{link(adjust_tail)= adjust_ptr(p); -while(link(adjust_tail)!=null)adjust_tail= link(adjust_tail); -p= link(p);free_node(link(q),small_node_size); -} -else{link(adjust_tail)= p;adjust_tail= p;p= link(p); -} -link(q)= p;p= q; -} - -/*:668*/ -#line 13133 "htex.w" -break; -case whatsit_node:/*1389:*/ -#line 25480 "htex.w" - -if(subtype(p)==image_node) -{if(image_height(p)> h)h= image_height(p); -x= x+image_width(p); -} - -/*:1389*/ -#line 13134 "htex.w" -;break; -case glue_node:/*669:*/ -#line 13193 "htex.w" - -{g= glue_ptr(p);x= x+width(g); -o= stretch_order(g);total_stretch[o]= total_stretch[o]+stretch(g); -o= shrink_order(g);total_shrink[o]= total_shrink[o]+shrink(g); -if(subtype(p)>=a_leaders) -{g= leader_ptr(p); -if(height(g)> h)h= height(g); -if(depth(g)> d)d= depth(g); -} -} - -/*:669*/ -#line 13135 "htex.w" -break; -case kern_node:case math_node:x= x+width(p);break; -case ligature_node:/*665:*/ -#line 13145 "htex.w" - -{mem[lig_trick]= mem[lig_char(p)];link(lig_trick)= link(p); -p= lig_trick;goto reswitch; -} - -/*:665*/ -#line 13137 "htex.w" - -default:do_nothing; -} -p= link(p); -} -} - - -/*:664*/ -#line 13106 "htex.w" -; -if(adjust_tail!=null)link(adjust_tail)= null; -height(r)= h;depth(r)= d; -/*670:*/ -#line 13207 "htex.w" - -if(m==additional)w= x+w; -width(r)= w;x= w-x; -if(x==0) -{glue_sign(r)= normal;glue_order(r)= normal; -set_glue_ratio_zero(glue_set(r)); -goto end; -} -else if(x> 0)/*671:*/ -#line 13220 "htex.w" - -{/*672:*/ -#line 13231 "htex.w" - -if(total_stretch[filll]!=0)o= filll; -else if(total_stretch[fill]!=0)o= fill; -else if(total_stretch[fil]!=0)o= fil; -else o= normal - -/*:672*/ -#line 13221 "htex.w" -; -glue_order(r)= o;glue_sign(r)= stretching; -if(total_stretch[o]!=0)glue_set(r)= fix(x/(double)total_stretch[o]); - -else{glue_sign(r)= normal; -set_glue_ratio_zero(glue_set(r)); -} -goto end; -} - -/*:671*/ -#line 13216 "htex.w" - -else/*677:*/ -#line 13276 "htex.w" - -{/*678:*/ -#line 13289 "htex.w" - -if(total_shrink[filll]!=0)o= filll; -else if(total_shrink[fill]!=0)o= fill; -else if(total_shrink[fil]!=0)o= fil; -else o= normal - -/*:678*/ -#line 13277 "htex.w" -; -glue_order(r)= o;glue_sign(r)= shrinking; -if(total_shrink[o]!=0)glue_set(r)= fix((-x)/(double)total_shrink[o]); - -else{glue_sign(r)= normal; -set_glue_ratio_zero(glue_set(r)); -} -if((total_shrink[o]<-x)&&(o==normal)&&(list_ptr(r)!=null)) -set_glue_ratio_one(glue_set(r)); -goto end; -} - -/*:677*/ -#line 13218 "htex.w" - - -/*:670*/ -#line 13110 "htex.w" -; -end:return r; -} - -/*:662*//*682:*/ -#line 13329 "htex.w" - -pointer vpackage(pointer p,scaled h,small_number m,scaled l) -{ -pointer r; -scaled w,d,x; -scaled s; -pointer g; -glue_ord o; -r= get_node(box_node_size);type(r)= vlist_node; -subtype(r)= min_quarterword;shift_amount(r)= 0; -list_ptr(r)= p; -w= 0;/*663:*/ -#line 13114 "htex.w" - -d= 0;x= 0; -total_stretch[normal]= 0;total_shrink[normal]= 0; -total_stretch[fil]= 0;total_shrink[fil]= 0; -total_stretch[fill]= 0;total_shrink[fill]= 0; -total_stretch[filll]= 0;total_shrink[filll]= 0 - -/*:663*/ -#line 13340 "htex.w" -; -while(p!=null)/*683:*/ -#line 13353 "htex.w" - -{if(is_char_node(p))confusion("vpack"); - -else switch(type(p)){ -case hlist_node:case vlist_node:case rule_node: -case unset_node: -/*684:*/ -#line 13370 "htex.w" - -{x= x+d+height(p);d= depth(p); -if(type(p)>=rule_node)s= 0;else s= shift_amount(p); -if(width(p)+s> w)w= width(p)+s; -} - -/*:684*/ -#line 13360 "htex.w" -break; -case whatsit_node:/*1388:*/ -#line 25474 "htex.w" - -if(subtype(p)==image_node) -{if(image_width(p)> w)w= image_width(p); -x= x+d+image_height(p);d= 0; -} - -/*:1388*/ -#line 13361 "htex.w" -;break; -case glue_node:/*685:*/ -#line 13376 "htex.w" - -{x= x+d;d= 0; -g= glue_ptr(p);x= x+width(g); -o= stretch_order(g);total_stretch[o]= total_stretch[o]+stretch(g); -o= shrink_order(g);total_shrink[o]= total_shrink[o]+shrink(g); -if(subtype(p)>=a_leaders) -{g= leader_ptr(p); -if(width(g)> w)w= width(g); -} -} - -/*:685*/ -#line 13362 "htex.w" -break; -case kern_node:{x= x+d+width(p);d= 0; -}break; -default:do_nothing; -} -p= link(p); -} - -/*:683*/ -#line 13342 "htex.w" -; -width(r)= w; -if(d> l) -{x= x+d-l;depth(r)= l; -} -else depth(r)= d; -/*686:*/ -#line 13390 "htex.w" - -if(m==additional)h= x+h; -height(r)= h;x= h-x; -if(x==0) -{glue_sign(r)= normal;glue_order(r)= normal; -set_glue_ratio_zero(glue_set(r)); -goto end; -} -else if(x> 0)/*687:*/ -#line 13403 "htex.w" - -{/*672:*/ -#line 13231 "htex.w" - -if(total_stretch[filll]!=0)o= filll; -else if(total_stretch[fill]!=0)o= fill; -else if(total_stretch[fil]!=0)o= fil; -else o= normal - -/*:672*/ -#line 13404 "htex.w" -; -glue_order(r)= o;glue_sign(r)= stretching; -if(total_stretch[o]!=0)glue_set(r)= fix(x/(double)total_stretch[o]); - -else{glue_sign(r)= normal; -set_glue_ratio_zero(glue_set(r)); -} -goto end; -} - -/*:687*/ -#line 13399 "htex.w" - -else/*690:*/ -#line 13439 "htex.w" - -{/*678:*/ -#line 13289 "htex.w" - -if(total_shrink[filll]!=0)o= filll; -else if(total_shrink[fill]!=0)o= fill; -else if(total_shrink[fil]!=0)o= fil; -else o= normal - -/*:678*/ -#line 13440 "htex.w" -; -glue_order(r)= o;glue_sign(r)= shrinking; -if(total_shrink[o]!=0)glue_set(r)= fix((-x)/(double)total_shrink[o]); - -else{glue_sign(r)= normal; -set_glue_ratio_zero(glue_set(r)); -} -if((total_shrink[o]<-x)&&(o==normal)&&(list_ptr(r)!=null)) -set_glue_ratio_one(glue_set(r)); -goto end; -} - -/*:690*/ -#line 13401 "htex.w" - - -/*:686*/ -#line 13349 "htex.w" -; -end:return r; -} - -/*:682*//*830:*/ -#line 16214 "htex.w" - - -/*693:*/ -#line 13472 "htex.w" - -extern pointer happend_to_vlist(pointer b); -void append_to_vlist(pointer b,uint32_t offset) -{scaled d; -pointer p; -if(prev_depth> ignore_depth) -{d= width(baseline_skip)-prev_depth-height(b); -if(d<line_skip_limit)p= new_glue(line_skip); -else{temp_ptr= new_spec(baseline_skip); -p= new_glue(temp_ptr);glue_ref_count(temp_ptr)= null; -width(temp_ptr)= d; -} -store_map(p,node_pos,offset); -link(tail)= p;tail= p; -} -link(tail)= b;tail= b;prev_depth= depth(b); -} - -/*:693*//*844:*/ -#line 16445 "htex.w" - -static pointer finite_shrink(pointer p) -{pointer q; -QUIT("Infinite glue shrinkage found in a paragraph"); -q= new_spec(p);shrink_order(q)= normal; -delete_glue_ref(p);return q; -} - -/*:844*//*848:*/ -#line 16508 "htex.w" - -static void try_break(int pi,small_number break_type) -{ -pointer r; -pointer prev_r; -halfword old_l; -bool no_break_yet; -/*849:*/ -#line 16536 "htex.w" - -pointer prev_prev_r; -pointer s; -pointer q; -pointer v; -int t; -internal_font_number f; -halfword l; -bool node_r_stays_active; -scaled line_width; -int fit_class; -halfword b; -int d; -bool artificial_demerits; -#ifdef STAT -pointer save_link; -#endif -scaled shortfall; - -/*:849*/ -#line 16515 "htex.w" - -/*850:*/ -#line 16555 "htex.w" - -if(abs(pi)>=inf_penalty) -if(pi> 0)goto end; -else pi= eject_penalty - -/*:850*/ -#line 16516 "htex.w" -; -no_break_yet= true;prev_r= active;old_l= 0; -do_all_six(copy_to_cur_active); -loop{resume:r= link(prev_r); -/*851:*/ -#line 16565 "htex.w" - - -if(type(r)==delta_node) -{do_all_six(update_width); -prev_prev_r= prev_r;prev_r= r;goto resume; -} - -/*:851*/ -#line 16521 "htex.w" -; -/*855:*/ -#line 16614 "htex.w" - -{l= line_number(r); -if(l> old_l) -{ -if((minimum_demerits<awful_bad)&& -((old_l!=easy_line)||(r==last_active))) -/*856:*/ -#line 16632 "htex.w" - -{if(no_break_yet)/*857:*/ -#line 16668 "htex.w" - -{no_break_yet= false;do_all_six(set_break_width_to_background); -s= cur_p; -if(break_type> unhyphenated)if(cur_p!=null) -/*861:*/ -#line 16712 "htex.w" - -{t= replace_count(cur_p);v= cur_p;s= post_break(cur_p); -while(t> 0) -{decr(t);v= link(v); -/*862:*/ -#line 16730 "htex.w" - -if(is_char_node(v)) -{f= font(v); -break_width[1]= break_width[1]-char_width(f,char_info(f,character(v))); -} -else switch(type(v)){ -case ligature_node:{f= font(lig_char(v)); -break_width[1]= break_width[1]- -char_width(f,char_info(f,character(lig_char(v)))); -}break; -case hlist_node:case vlist_node:case rule_node: -case kern_node: -break_width[1]= break_width[1]-width(v);break; -default:confusion("disc1"); - -} - -/*:862*/ -#line 16716 "htex.w" -; -} -while(s!=null) -{/*863:*/ -#line 16747 "htex.w" - -if(is_char_node(s)) -{f= font(s); -break_width[1]= break_width[1]+char_width(f,char_info(f,character(s))); -} -else switch(type(s)){ -case ligature_node:{f= font(lig_char(s)); -break_width[1]= break_width[1]+ -char_width(f,char_info(f,character(lig_char(s)))); -}break; -case hlist_node:case vlist_node:case rule_node: -case kern_node: -break_width[1]= break_width[1]+width(s);break; -default:confusion("disc2"); - -} - -/*:863*/ -#line 16719 "htex.w" -; -s= link(s); -} -break_width[1]= break_width[1]+disc_width; -if(post_break(cur_p)==null)s= link(v); - -} - -/*:861*/ -#line 16672 "htex.w" -; -while(s!=null) -{if(is_char_node(s))goto done; -switch(type(s)){ -case glue_node:/*858:*/ -#line 16687 "htex.w" - -{v= glue_ptr(s);break_width[1]= break_width[1]-width(v); -break_width[2+stretch_order(v)]= break_width[2+stretch_order(v)]-stretch(v); -break_width[6]= break_width[6]-shrink(v); -} - -/*:858*/ -#line 16676 "htex.w" -break; -case penalty_node:do_nothing;break; -case math_node:break_width[1]= break_width[1]-width(s);break; -case kern_node:if(subtype(s)!=explicit)goto done; -else break_width[1]= break_width[1]-width(s);break; -default:goto done; -} -s= link(s); -} -done:;} - -/*:857*/ -#line 16633 "htex.w" -; -/*864:*/ -#line 16773 "htex.w" - -if(type(prev_r)==delta_node) -{do_all_six(convert_to_break_width); -} -else if(prev_r==active) -{do_all_six(store_break_width); -} -else{q= get_node(delta_node_size);link(q)= r;type(q)= delta_node; -subtype(q)= 0; -do_all_six(new_delta_to_break_width); -link(prev_r)= q;prev_prev_r= prev_r;prev_r= q; -} - -/*:864*/ -#line 16634 "htex.w" -; -if(abs(adj_demerits)>=awful_bad-minimum_demerits) -minimum_demerits= awful_bad-1; -else minimum_demerits= minimum_demerits+abs(adj_demerits); -for(fit_class= very_loose_fit;fit_class<=tight_fit;fit_class++) -{if(minimal_demerits[fit_class]<=minimum_demerits) -/*866:*/ -#line 16803 "htex.w" - -{q= get_node(passive_node_size); -link(q)= passive;passive= q;cur_break(q)= cur_p; -#ifdef STAT -incr(pass_number);serial(q)= pass_number; -#endif - -prev_break(q)= best_place[fit_class]; -q= get_node(active_node_size);break_node(q)= passive; -line_number(q)= best_pl_line[fit_class]+1; -fitness(q)= fit_class;type(q)= break_type; -total_demerits(q)= minimal_demerits[fit_class]; -link(q)= r;link(prev_r)= q;prev_r= q; -#ifdef STAT -if(tracing_paragraphs> 0) -/*867:*/ -#line 16823 "htex.w" - -{print_nl("@@");print_int(serial(passive)); - -print(": line ");print_int(line_number(q)-1); -print_char('.');print_int(fit_class); -if(break_type==hyphenated)print_char('-'); -print(" t=");print_int(total_demerits(q)); -print(" -> @@"); -if(prev_break(passive)==null)print_char('0'); -else print_int(serial(prev_break(passive))); -} - -/*:867*/ -#line 16818 "htex.w" -; -#endif - -} - -/*:866*/ -#line 16640 "htex.w" -; -minimal_demerits[fit_class]= awful_bad; -} -minimum_demerits= awful_bad; -/*865:*/ -#line 16792 "htex.w" - -if(r!=last_active) -{q= get_node(delta_node_size);link(q)= r;type(q)= delta_node; -subtype(q)= 0; -do_all_six(new_delta_from_break_width); -link(prev_r)= q;prev_prev_r= prev_r;prev_r= q; -} - -/*:865*/ -#line 16644 "htex.w" -; -} - -/*:856*/ -#line 16620 "htex.w" -; -if(r==last_active)goto end; -/*872:*/ -#line 16897 "htex.w" - -if(l> easy_line) -{line_width= second_width;old_l= max_halfword-1; -} -else{old_l= l; -if(l> last_special_line)line_width= second_width; -else if(par_shape_ptr==null)line_width= first_width; -else line_width= mem[par_shape_ptr+2*l].sc; -} - -/*:872*/ -#line 16622 "htex.w" -; -} -} - -/*:855*/ -#line 16524 "htex.w" -; -/*873:*/ -#line 16917 "htex.w" - -{artificial_demerits= false; - -shortfall= line_width-cur_active_width[1]; -if(shortfall> 0) -/*874:*/ -#line 16947 "htex.w" - -if((cur_active_width[3]!=0)||(cur_active_width[4]!=0)|| -(cur_active_width[5]!=0)) -{b= 0;fit_class= decent_fit; -} -else{if(shortfall> 7230584)if(cur_active_width[2]<1663497) -{b= inf_bad;fit_class= very_loose_fit;goto done1; -} -b= badness(shortfall,cur_active_width[2]); -if(b> 12) -if(b> 99)fit_class= very_loose_fit; -else fit_class= loose_fit; -else fit_class= decent_fit; -done1:; -} - -/*:874*/ -#line 16923 "htex.w" - -else/*875:*/ -#line 16966 "htex.w" - -{if(-shortfall> cur_active_width[6])b= inf_bad+1; -else b= badness(-shortfall,cur_active_width[6]); -if(b> 12)fit_class= tight_fit;else fit_class= decent_fit; -} - -/*:875*/ -#line 16925 "htex.w" -; -if((b> inf_bad)||(pi==eject_penalty)) -/*876:*/ -#line 16981 "htex.w" - -{if(final_pass&&(minimum_demerits==awful_bad)&& -(link(r)==last_active)&& -(prev_r==active)) -artificial_demerits= true; -else if(b> threshold)goto deactivate; -node_r_stays_active= false; -} - -/*:876*/ -#line 16928 "htex.w" - -else{prev_r= r; -if(b> threshold)goto resume; -node_r_stays_active= true; -} -/*877:*/ -#line 16997 "htex.w" - -if(artificial_demerits)d= 0; -else/*881:*/ -#line 17058 "htex.w" - -{d= line_penalty+b; -if(abs(d)>=10000)d= 100000000;else d= d*d; -if(pi!=0) -if(pi> 0)d= d+pi*pi; -else if(pi> eject_penalty)d= d-pi*pi; -if((break_type==hyphenated)&&(type(r)==hyphenated)) -if(cur_p!=null)d= d+double_hyphen_demerits; -else d= d+final_hyphen_demerits; -if(abs(fit_class-fitness(r))> 1)d= d+adj_demerits; -} - -/*:881*/ -#line 16999 "htex.w" -; -#ifdef STAT -if(tracing_paragraphs> 0) -/*878:*/ -#line 17013 "htex.w" - -{if(printed_node!=cur_p) -/*879:*/ -#line 17035 "htex.w" - -{print_nl(""); -if(cur_p==null)short_display(link(printed_node)); -else{save_link= link(cur_p); -link(cur_p)= null;print_nl("");short_display(link(printed_node)); -link(cur_p)= save_link; -} -printed_node= cur_p; -} - -/*:879*/ -#line 17015 "htex.w" -; -print_nl("@"); - -if(cur_p==null)print_esc("par"); -else if(type(cur_p)!=glue_node) -{if(type(cur_p)==penalty_node)print_esc("penalty"); -else if(type(cur_p)==disc_node)print_esc("discretionary"); -else if(type(cur_p)==kern_node)print_esc("kern"); -else print_esc("math"); -} -print(" via @@"); -if(break_node(r)==null)print_char('0'); -else print_int(serial(break_node(r))); -print(" b="); -if(b> inf_bad)print_char('*');else print_int(b); - -print(" p=");print_int(pi);print(" d="); -if(artificial_demerits)print_char('*');else print_int(d); -} - -/*:878*/ -#line 17002 "htex.w" -; -#endif - -d= d+total_demerits(r); - -if(d<=minimal_demerits[fit_class]) -{minimal_demerits[fit_class]= d; -best_place[fit_class]= break_node(r);best_pl_line[fit_class]= l; -if(d<minimum_demerits)minimum_demerits= d; -} - -/*:877*/ -#line 16933 "htex.w" -; -if(node_r_stays_active)goto resume; -deactivate:/*882:*/ -#line 17080 "htex.w" - -link(prev_r)= link(r);free_node(r,active_node_size); -if(prev_r==active)/*883:*/ -#line 17105 "htex.w" - -{r= link(active); -if(type(r)==delta_node) -{do_all_six(update_active); -do_all_six(copy_to_cur_active); -link(active)= link(r);free_node(r,delta_node_size); -} -} - -/*:883*/ -#line 17083 "htex.w" - -else if(type(prev_r)==delta_node) -{r= link(prev_r); -if(r==last_active) -{do_all_six(downdate_width); -link(prev_prev_r)= last_active; -free_node(prev_r,delta_node_size);prev_r= prev_prev_r; -} -else if(type(r)==delta_node) -{do_all_six(update_width); -do_all_six(combine_two_deltas); -link(prev_r)= link(r);free_node(r,delta_node_size); -} -} - -/*:882*/ -#line 16935 "htex.w" -; -} - -/*:873*/ -#line 16527 "htex.w" -; -} -end:; -#ifdef STAT -/*880:*/ -#line 17050 "htex.w" - -if(cur_p==printed_node)if(cur_p!=null)if(type(cur_p)==disc_node) -{t= replace_count(cur_p); -while(t> 0) -{decr(t);printed_node= link(printed_node); -} -} - -/*:880*/ -#line 16531 "htex.w" -; -#endif - -} - -/*:848*//*900:*/ -#line 17429 "htex.w" - -static void post_line_break(int final_widow_penalty) -{ -pointer q,r,s; -bool disc_break; -bool post_disc_break; -bool first_line= true; -uint32_t line_offset,next_offset; -scaled cur_width; -scaled cur_indent; -quarterword t; -int pen; -halfword cur_line; -/*901:*/ -#line 17480 "htex.w" - -q= break_node(best_bet);cur_p= null; -do{r= q;q= prev_break(q);next_break(r)= cur_p;cur_p= r; -}while(!(q==null)) - -/*:901*/ -#line 17443 "htex.w" -; -cur_line= prev_graf+1; -next_offset= hposition(link(temp_head)); -if(next_offset> node_pos) -next_offset= next_offset-node_pos; -else -next_offset= 0; -do{ -line_offset= next_offset; -{pointer q= cur_break(cur_p); -if(q==null) -next_offset= (hpos-hstart); -else -next_offset= hposition(q); -if(next_offset> node_pos) -next_offset= next_offset-node_pos; -else -next_offset= 0; -} -/*903:*/ -#line 17517 "htex.w" - -/*904:*/ -#line 17529 "htex.w" - -q= cur_break(cur_p);disc_break= false;post_disc_break= false; -if(q!=null) -if(type(q)==glue_node) -{delete_glue_ref(glue_ptr(q)); -glue_ptr(q)= right_skip; -subtype(q)= right_skip_code+1;add_glue_ref(right_skip); -goto done; -} -else{if(type(q)==disc_node) -/*905:*/ -#line 17548 "htex.w" - -{pointer pre_q= pre_break(q); -pointer post_q= post_break(q); -t= replace_count(q); -type(q)= whatsit_node; -subtype(q)= ignore_node; -ignore_info(q)= 1; -/*906:*/ -#line 17567 "htex.w" - -if(t==0){ignore_list(q)= null;r= link(q);} -else{r= q; -while(t> 1) -{r= link(r);decr(t); -} -s= link(r); -r= link(s);link(s)= null; -ignore_list(q)= link(q); -} - -/*:906*/ -#line 17555 "htex.w" -; -s= get_node(ignore_node_size); -type(s)= whatsit_node; -subtype(s)= ignore_node; -ignore_info(s)= 0; -ignore_list(s)= null; -link(s)= r;r= s; -if(post_q!=null)/*907:*/ -#line 17581 "htex.w" - -{s= post_q; -while(link(s)!=null)s= link(s); -link(s)= r;r= post_q;post_disc_break= true; -} - -/*:907*/ -#line 17562 "htex.w" -; -if(pre_q!=null)/*908:*/ -#line 17590 "htex.w" - -{s= pre_q;link(q)= s; -while(link(s)!=null)s= link(s); -q= s; -} - -/*:908*/ -#line 17563 "htex.w" -; -link(q)= r;disc_break= true; -} - -/*:905*/ -#line 17539 "htex.w" - -else if((type(q)==math_node)||(type(q)==kern_node))width(q)= 0; -} -else{q= temp_head; -while(link(q)!=null)q= link(q); -} -/*909:*/ -#line 17596 "htex.w" - -r= new_glue(right_skip);link(r)= link(q);link(q)= r;q= r - -/*:909*/ -#line 17545 "htex.w" -; -done: - -/*:904*/ -#line 17519 "htex.w" -; -/*910:*/ -#line 17603 "htex.w" - -r= link(q);link(q)= null;q= link(temp_head);link(temp_head)= r; -if(left_skip!=zero_glue) -{r= new_glue(left_skip); -link(r)= q;q= r; -} - -/*:910*/ -#line 17520 "htex.w" -; -/*912:*/ -#line 17632 "htex.w" - -if(cur_line> last_special_line) -{cur_width= second_width;cur_indent= second_indent; -} -else if(par_shape_ptr==null) -{cur_width= first_width;cur_indent= first_indent; -} -else{cur_width= mem[par_shape_ptr+2*cur_line].sc; -cur_indent= mem[par_shape_ptr+2*cur_line-1].sc; -} -adjust_tail= adjust_head;just_box= hpack(q,cur_width,exactly); -shift_amount(just_box)= cur_indent - -/*:912*/ -#line 17521 "htex.w" -; -/*911:*/ -#line 17610 "htex.w" - -if(first_line) -{pointer p= happend_to_vlist(just_box); -if(p!=null) -store_map(p,node_pos,line_offset); -store_map(just_box,node_pos,line_offset); -first_line= false; -} -else -{append_to_vlist(just_box,line_offset); -store_map(just_box,node_pos,line_offset); -} -if(adjust_head!=adjust_tail) -{link(tail)= link(adjust_head);tail= adjust_tail; -} -adjust_tail= null - -/*:911*/ -#line 17523 "htex.w" -; -/*913:*/ -#line 17652 "htex.w" - -if(cur_line+1!=best_line) -{pen= inter_line_penalty; -if(cur_line==prev_graf+1)pen= pen+club_penalty; -if(cur_line+2==best_line)pen= pen+final_widow_penalty; -if(disc_break)pen= pen+broken_penalty; -if(pen!=0) -{r= new_penalty(pen);store_map(r,node_pos,next_offset); -link(tail)= r;tail= r; -} -} - -/*:913*/ -#line 17524 "htex.w" - - -/*:903*/ -#line 17463 "htex.w" -; -incr(cur_line);cur_p= next_break(cur_p); -if(cur_p!=null)if(!post_disc_break) -/*902:*/ -#line 17492 "htex.w" - -{r= temp_head; -loop{q= link(r); -if(q==cur_break(cur_p))goto done1; - - -if(is_char_node(q))goto done1; -if(non_discardable(q))goto done1; -if(type(q)==kern_node)if(subtype(q)!=explicit)goto done1; -r= q; -} -done1:if(r!=temp_head) -{link(r)= null;flush_node_list(link(temp_head)); -link(temp_head)= q; -} -} - -/*:902*/ -#line 17466 "htex.w" -; -}while(!(cur_p==null)); -if((cur_line!=best_line)||(link(temp_head)!=null)) -confusion("line breaking"); - -prev_graf= best_line-1; -} - -/*:900*//*918:*/ -#line 17764 "htex.w" - -/*:918*//*966:*/ -#line 18587 "htex.w" - -#ifdef INIT -#endif - -/*:966*/ -#line 16216 "htex.w" - - -void line_break(int final_widow_penalty,pointer par_ptr) -{scaled x= cur_list.hs_field; -/*884:*/ -#line 17134 "htex.w" - -bool auto_breaking; -pointer prev_p; -pointer q,r,s; -internal_font_number f; - -/*:884*//*916:*/ -#line 17747 "htex.w" - - -/*:916*/ -#line 16220 "htex.w" - -set_line_break_params(); -/*831:*/ -#line 16241 "htex.w" - -link(temp_head)= par_ptr; - -/*:831*//*845:*/ -#line 16453 "htex.w" - -no_shrink_error_yet= true; -check_shrinkage(left_skip);check_shrinkage(right_skip); -q= left_skip;r= right_skip;background[1]= width(q)+width(r); -background[2]= 0;background[3]= 0;background[4]= 0;background[5]= 0; -background[2+stretch_order(q)]= stretch(q); -background[2+stretch_order(r)]= background[2+stretch_order(r)]+stretch(r); -background[6]= shrink(q)+shrink(r); - -/*:845*//*854:*/ -#line 16600 "htex.w" - -minimum_demerits= awful_bad; -minimal_demerits[tight_fit]= awful_bad; -minimal_demerits[decent_fit]= awful_bad; -minimal_demerits[loose_fit]= awful_bad; -minimal_demerits[very_loose_fit]= awful_bad; - -/*:854*//*870:*/ -#line 16865 "htex.w" - -if(par_shape_ptr==null) -if(hang_indent==0) -{last_special_line= 0;second_width= x; -second_indent= 0; -} -else/*871:*/ -#line 16876 "htex.w" - -{last_special_line= abs(hang_after); -if(hang_after<0) -{first_width= x-abs(hang_indent); -if(hang_indent>=0)first_indent= hang_indent; -else first_indent= 0; -second_width= x;second_indent= 0; -} -else{first_width= x;first_indent= 0; -second_width= x-abs(hang_indent); -if(hang_indent>=0)second_indent= hang_indent; -else second_indent= 0; -} -} - -/*:871*/ -#line 16871 "htex.w" - -else QUIT("parshape not yet implemented"); -if(looseness==0)easy_line= last_special_line; -else easy_line= max_halfword - -/*:870*/ -#line 16222 "htex.w" -; -/*885:*/ -#line 17144 "htex.w" - -threshold= pretolerance; -if(threshold>=0) -{ -#ifdef STAT -if(tracing_paragraphs> 0) -{print_nl("@firstpass");} -#endif - -second_pass= false;final_pass= false; -} -else{threshold= tolerance;second_pass= true; -final_pass= (emergency_stretch<=0); -#ifdef STAT -#endif - -} -loop{if(threshold> inf_bad)threshold= inf_bad; -/*886:*/ -#line 17197 "htex.w" - -q= get_node(active_node_size); -type(q)= unhyphenated;fitness(q)= decent_fit; -link(q)= last_active;break_node(q)= null; -line_number(q)= prev_graf+1;total_demerits(q)= 0;link(active)= q; -do_all_six(store_background); -passive= null;printed_node= temp_head;pass_number= 0; - -/*:886*/ -#line 17162 "htex.w" -; -cur_p= link(temp_head);auto_breaking= true; -prev_p= cur_p; -while((cur_p!=null)&&(link(active)!=last_active)) -/*888:*/ -#line 17232 "htex.w" - -{if(is_char_node(cur_p)) -/*889:*/ -#line 17266 "htex.w" - -{prev_p= cur_p; -do{f= font(cur_p); -act_width= act_width+char_width(f,char_info(f,character(cur_p))); -cur_p= link(cur_p); -}while(!(!is_char_node(cur_p))); -} - -/*:889*/ -#line 17234 "htex.w" -; -switch(type(cur_p)){ -case hlist_node:case vlist_node:case rule_node:act_width= act_width+width(cur_p);break; -case whatsit_node:/*1391:*/ -#line 25490 "htex.w" - -adv_past(cur_p) - -/*:1391*/ -#line 17238 "htex.w" -break; -case glue_node:{/*890:*/ -#line 17277 "htex.w" - -if(auto_breaking) -{if(is_char_node(prev_p))try_break(0,unhyphenated); -else if(precedes_break(prev_p))try_break(0,unhyphenated); -else if((type(prev_p)==kern_node)&&(subtype(prev_p)!=explicit)) -try_break(0,unhyphenated); -} -check_shrinkage(glue_ptr(cur_p));q= glue_ptr(cur_p); -act_width= act_width+width(q); -active_width[2+stretch_order(q)]= -active_width[2+stretch_order(q)]+stretch(q); -active_width[6]= active_width[6]+shrink(q) - -/*:890*/ -#line 17240 "htex.w" -; -}break; -case kern_node:if(subtype(cur_p)==explicit)kern_break -else act_width= act_width+width(cur_p);break; -case ligature_node:{f= font(lig_char(cur_p)); -act_width= act_width+char_width(f,char_info(f,character(lig_char(cur_p)))); -}break; -case disc_node:/*891:*/ -#line 17293 "htex.w" - -{if(!is_auto_disc(cur_p)||second_pass||final_pass) -{s= pre_break(cur_p);disc_width= 0; -if(s==null)try_break(ex_hyphen_penalty,hyphenated); -else{do{/*892:*/ -#line 17313 "htex.w" - -if(is_char_node(s)) -{f= font(s); -disc_width= disc_width+char_width(f,char_info(f,character(s))); -} -else switch(type(s)){ -case ligature_node:{f= font(lig_char(s)); -disc_width= disc_width+ -char_width(f,char_info(f,character(lig_char(s)))); -}break; -case hlist_node:case vlist_node:case rule_node: -case kern_node: -disc_width= disc_width+width(s);break; -default:confusion("disc3"); - -} - -/*:892*/ -#line 17297 "htex.w" -; -s= link(s); -}while(!(s==null)); -act_width= act_width+disc_width; -try_break(hyphen_penalty,hyphenated); -act_width= act_width-disc_width; -} -} -r= replace_count(cur_p);s= link(cur_p); -while(r> 0) -{/*893:*/ -#line 17330 "htex.w" - -if(is_char_node(s)) -{f= font(s); -act_width= act_width+char_width(f,char_info(f,character(s))); -} -else switch(type(s)){ -case ligature_node:{f= font(lig_char(s)); -act_width= act_width+ -char_width(f,char_info(f,character(lig_char(s)))); -}break; -case hlist_node:case vlist_node:case rule_node: -case kern_node: -act_width= act_width+width(s);break; -default:confusion("disc4"); - -} - -/*:893*/ -#line 17307 "htex.w" -; -decr(r);s= link(s); -} -prev_p= cur_p;cur_p= s;goto done5; -} - -/*:891*/ -#line 17248 "htex.w" - -case math_node:{auto_breaking= (subtype(cur_p)==after);kern_break; -}break; -case penalty_node:try_break(penalty(cur_p),unhyphenated);break; -case mark_node:case ins_node:case adjust_node:do_nothing;break; -default:confusion("paragraph"); - -} -prev_p= cur_p;cur_p= link(cur_p); -done5:;} - -/*:888*/ -#line 17168 "htex.w" -; -if(cur_p==null) -/*896:*/ -#line 17367 "htex.w" - -{try_break(eject_penalty,hyphenated); -if(link(active)!=last_active) -{/*897:*/ -#line 17377 "htex.w" - -r= link(active);fewest_demerits= awful_bad; -do{if(type(r)!=delta_node)if(total_demerits(r)<fewest_demerits) -{fewest_demerits= total_demerits(r);best_bet= r; -} -r= link(r); -}while(!(r==last_active)); -best_line= line_number(best_bet) - -/*:897*/ -#line 17370 "htex.w" -; -if(looseness==0)goto done; -/*898:*/ -#line 17391 "htex.w" - -{r= link(active);actual_looseness= 0; -do{if(type(r)!=delta_node) -{line_diff= line_number(r)-best_line; -if(((line_diff<actual_looseness)&&(looseness<=line_diff))|| -((line_diff> actual_looseness)&&(looseness>=line_diff))) -{best_bet= r;actual_looseness= line_diff; -fewest_demerits= total_demerits(r); -} -else if((line_diff==actual_looseness)&& -(total_demerits(r)<fewest_demerits)) -{best_bet= r;fewest_demerits= total_demerits(r); -} -} -r= link(r); -}while(!(r==last_active)); -best_line= line_number(best_bet); -} - -/*:898*/ -#line 17372 "htex.w" -; -if((actual_looseness==looseness)||final_pass)goto done; -} -} - -/*:896*/ -#line 17171 "htex.w" -; -/*887:*/ -#line 17205 "htex.w" - -q= link(active); -while(q!=last_active) -{cur_p= link(q); -if(type(q)==delta_node)free_node(q,delta_node_size); -else free_node(q,active_node_size); -q= cur_p; -} -q= passive; -while(q!=null) -{cur_p= link(q); -free_node(q,passive_node_size); -q= cur_p; -} - -/*:887*/ -#line 17172 "htex.w" -; -if(!second_pass) -{ -#ifdef STAT -if(tracing_paragraphs> 0)print_nl("@secondpass"); -#endif -threshold= tolerance;second_pass= true;final_pass= (emergency_stretch<=0); -} -else{ -#ifdef STAT -if(tracing_paragraphs> 0) -print_nl("@emergencypass"); -#endif -background[2]= background[2]+emergency_stretch;final_pass= true; -} -} -done: -#ifdef STAT -#endif - -/*:885*/ -#line 16223 "htex.w" -; -/*899:*/ -#line 17415 "htex.w" - -post_line_break(final_widow_penalty) - -/*:899*/ -#line 16225 "htex.w" -; -/*887:*/ -#line 17205 "htex.w" - -q= link(active); -while(q!=last_active) -{cur_p= link(q); -if(type(q)==delta_node)free_node(q,delta_node_size); -else free_node(q,active_node_size); -q= cur_p; -} -q= passive; -while(q!=null) -{cur_p= link(q); -free_node(q,passive_node_size); -q= cur_p; -} - -/*:887*/ -#line 16226 "htex.w" -; -hrestore_param_list(); -} - -/*:830*//*992:*/ -#line 19089 "htex.w" - - -#define ensure_vbox(N) - -static pointer prune_page_top(pointer p) -{pointer prev_p; -pointer q; -prev_p= temp_head;link(temp_head)= p; -while(p!=null) -switch(type(p)){ -case hlist_node:case vlist_node:case rule_node:/*993:*/ -#line 19112 "htex.w" - -{temp_ptr= new_spec(pointer_def[glue_kind][split_top_skip_no]); -q= new_glue(temp_ptr);glue_ref_count(temp_ptr)= null;link(prev_p)= q;link(q)= p; - -if(width(temp_ptr)> height(p))width(temp_ptr)= width(temp_ptr)-height(p); -else width(temp_ptr)= 0; -p= null; -} - -/*:993*/ -#line 19100 "htex.w" -break; -case whatsit_node:case mark_node:case ins_node:{prev_p= p;p= link(prev_p); -}break; -case glue_node:case kern_node:case penalty_node:{q= p;p= link(q);link(q)= null; -link(prev_p)= p;flush_node_list(q); -}break; -default:confusion("pruning"); - -} -return link(temp_head); -} - -/*:992*//*994:*/ -#line 19137 "htex.w" - -static pointer vert_break(pointer p,scaled h,scaled d) - -{ -pointer prev_p; - -pointer q,r; -int pi; -int b; -int least_cost; -pointer best_place; -scaled prev_dp; -small_number t; -prev_p= p; -least_cost= awful_bad;do_all_six(set_height_zero);prev_dp= 0; -loop{/*997:*/ -#line 19173 "htex.w" - -if(p==null)pi= eject_penalty; -else/*998:*/ -#line 19188 "htex.w" - -switch(type(p)){ -case hlist_node:case vlist_node:case rule_node:{ -cur_height= cur_height+prev_dp+height(p);prev_dp= depth(p); -goto not_found; -} -case whatsit_node:/*1394:*/ -#line 25499 "htex.w" - -goto not_found - -/*:1394*/ -#line 19194 "htex.w" -; -case glue_node:if(precedes_break(prev_p))pi= 0; -else goto update_heights;break; -case kern_node:{if(link(p)==null)t= penalty_node; -else t= type(link(p)); -if(t==glue_node)pi= 0;else goto update_heights; -}break; -case penalty_node:pi= penalty(p);break; -case mark_node:case ins_node:goto not_found; -default:confusion("vertbreak"); - -} - -/*:998*/ -#line 19177 "htex.w" -; -/*999:*/ -#line 19209 "htex.w" - -if(pi<inf_penalty) -{/*1000:*/ -#line 19223 "htex.w" - -if(cur_height<h) -if((active_height[3]!=0)||(active_height[4]!=0)|| -(active_height[5]!=0))b= 0; -else b= badness(h-cur_height,active_height[2]); -else if(cur_height-h> active_height[6])b= awful_bad; -else b= badness(cur_height-h,active_height[6]) - -/*:1000*/ -#line 19211 "htex.w" -; -if(b<awful_bad) -if(pi<=eject_penalty)b= pi; -else if(b<inf_bad)b= b+pi; -else b= deplorable; -if(b<=least_cost) -{best_place= p;least_cost= b; -best_height_plus_depth= cur_height+prev_dp; -} -if((b==awful_bad)||(pi<=eject_penalty))goto done; -} - -/*:999*/ -#line 19179 "htex.w" -; -if((type(p)<glue_node)||(type(p)> kern_node))goto not_found; -update_heights:/*1001:*/ -#line 19235 "htex.w" - -if(type(p)==kern_node)q= p; -else{q= glue_ptr(p); -active_height[2+stretch_order(q)]= -active_height[2+stretch_order(q)]+stretch(q); -active_height[6]= active_height[6]+shrink(q); -if((shrink_order(q)!=normal)&&(shrink(q)!=0)) -{ -DBG(DBGTEX,"Infinite glue shrinkage found in box being split"); -r= new_spec(q);shrink_order(r)= normal;delete_glue_ref(q); -glue_ptr(p)= r;q= r; -} -} -cur_height= cur_height+prev_dp+width(q);prev_dp= 0 - -/*:1001*/ -#line 19182 "htex.w" -; -not_found:if(prev_dp> d) -{cur_height= cur_height+prev_dp-d; -prev_dp= d; -} - -/*:997*/ -#line 19154 "htex.w" -; -prev_p= p;p= link(prev_p); -} -done:return best_place; -} - -/*:994*//*1012:*/ -#line 19534 "htex.w" - -void freeze_page_specs(small_number s) -{page_contents= s; -page_goal= hvsize;page_max_depth= max_depth; -page_depth= 0;do_all_six(set_page_so_far_zero); -least_page_cost= awful_bad; -#ifdef STAT -if(tracing_pages> 0) -{begin_diagnostic(); -print_nl("%% goal height=");print_scaled(page_goal); - -print(", max depth=");print_scaled(page_max_depth); -end_diagnostic(false); -} -#endif - -} - -/*:1012*//*1020:*/ -#line 19632 "htex.w" - -bool hbuild_page(void) -{ -pointer p; -pointer q,r; -int b,c; -int pi; -if(link(contrib_head)==null)return false; -do{resume:p= link(contrib_head); -/*1023:*/ -#line 19672 "htex.w" - -/*1026:*/ -#line 19701 "htex.w" - -switch(type(p)){ -case hlist_node:case vlist_node:case rule_node:if(page_contents<box_there) -/*1027:*/ -#line 19724 "htex.w" - -{if(page_contents==empty)freeze_page_specs(box_there); -else page_contents= box_there; -temp_ptr= new_spec(pointer_def[glue_kind][top_skip_no]); -q= new_glue(temp_ptr);glue_ref_count(temp_ptr)= null; -{uint64_t h= page_loc[cur_loc];store_map(q,LOC_POS0(h),LOC_OFF(h));} -if(width(temp_ptr)> height(p))width(temp_ptr)= width(temp_ptr)-height(p); -else width(temp_ptr)= 0; -link(q)= p;link(contrib_head)= q;goto resume; -} - -/*:1027*/ -#line 19705 "htex.w" - -else/*1028:*/ -#line 19735 "htex.w" - -{page_total= page_total+page_depth+height(p); -page_depth= depth(p); -goto contribute; -} - -/*:1028*/ -#line 19707 "htex.w" -break; -case whatsit_node:/*1393:*/ -#line 25496 "htex.w" - -goto contribute - -/*:1393*/ -#line 19709 "htex.w" -; -case glue_node:if(page_contents<box_there)goto done1; -else if(precedes_break(page_tail))pi= 0; -else goto update_heights;break; -case kern_node:if(page_contents<box_there)goto done1; -else if(link(p)==null)return false; -else if(type(link(p))==glue_node)pi= 0; -else goto update_heights;break; -case penalty_node:if(page_contents<box_there)goto done1;else pi= penalty(p);break; -case mark_node:goto contribute; -case ins_node:happend_insertion(p);goto contribute; -default:confusion("page"); - -} - -/*:1026*/ -#line 19677 "htex.w" -; -/*1031:*/ -#line 19763 "htex.w" - -if(pi<inf_penalty) -{/*1033:*/ -#line 19809 "htex.w" - -if(page_total<page_goal) -if((page_so_far[3]!=0)||(page_so_far[4]!=0)|| -(page_so_far[5]!=0))b= 0; -else b= badness(page_goal-page_total,page_so_far[2]); -else if(page_total-page_goal> page_shrink)b= awful_bad; -else b= badness(page_total-page_goal,page_shrink) - -/*:1033*/ -#line 19766 "htex.w" -; -if(b<awful_bad) -if(pi<=eject_penalty)c= pi; -else if(b<inf_bad)c= b+pi+insert_penalties; -else c= deplorable; -else c= b; -if(insert_penalties>=10000)c= awful_bad; -#ifdef STAT -if(tracing_pages> 0)/*1032:*/ -#line 19795 "htex.w" - -{begin_diagnostic();print_nl("%"); -print(" t=");print_totals(); -print(" g=");print_scaled(page_goal); -print(" b="); -if(b==awful_bad)print_char('*');else print_int(b); - -print(" p=");print_int(pi); -print(" c="); -if(c==awful_bad)print_char('*');else print_int(c); -if(c<=least_page_cost)print_char('#'); -end_diagnostic(false); -} - -/*:1032*/ -#line 19774 "htex.w" -; -#endif - -if(c<=least_page_cost) -{best_page_break= p;best_size= page_goal; -least_page_cost= c; -r= link(page_ins_head); -while(r!=page_ins_head) -{best_ins_ptr(r)= last_ins_ptr(r); -r= link(r); -} -} -if((c==awful_bad)||(pi<=eject_penalty)) -{hloc_set_next(best_page_break); -if(p==best_page_break)best_page_break= null; -hpack_page(); -hfill_page_template(); -return true; -} -} - -/*:1031*/ -#line 19680 "htex.w" -; -if((type(p)<glue_node)||(type(p)> kern_node))goto contribute; -update_heights:/*1030:*/ -#line 19748 "htex.w" - -if(type(p)==kern_node)q= p; -else{q= glue_ptr(p); -page_so_far[2+stretch_order(q)]= -page_so_far[2+stretch_order(q)]+stretch(q); -page_shrink= page_shrink+shrink(q); -if((shrink_order(q)!=normal)&&(shrink(q)!=0)) -{ -DBG(DBGTEX,"Infinite glue shrinkage found on current page"); -r= new_spec(q);shrink_order(r)= normal;fast_delete_glue_ref(q); -glue_ptr(p)= r;q= r; -} -} -page_total= page_total+page_depth+width(q);page_depth= 0 - -/*:1030*/ -#line 19683 "htex.w" -; -contribute:/*1029:*/ -#line 19741 "htex.w" - -if(page_depth> page_max_depth) -{page_total= -page_total+page_depth-page_max_depth; -page_depth= page_max_depth; -} - -/*:1029*/ -#line 19684 "htex.w" -; -/*1024:*/ -#line 19689 "htex.w" - -link(page_tail)= p;page_tail= p; -link(contrib_head)= link(p);link(p)= null;goto done - -/*:1024*/ -#line 19685 "htex.w" -; -done1:/*1025:*/ -#line 19693 "htex.w" - -link(contrib_head)= link(p);link(p)= null;flush_node_list(p) - -/*:1025*/ -#line 19686 "htex.w" -; -done: - -/*:1023*/ -#line 19643 "htex.w" -; -}while(!(link(contrib_head)==null)); -/*1021:*/ -#line 19651 "htex.w" - -if(nest_ptr==0)tail= contrib_head; -else contrib_tail= contrib_head - -/*:1021*/ -#line 19645 "htex.w" -; -return false; -} - -/*:1020*//*1034:*/ -#line 19817 "htex.w" - -void happend_insertion(pointer p) -{uint8_t n; -scaled delta,h,w; -pointer q,r; -if(page_contents==empty)freeze_page_specs(inserts_only); -n= subtype(p);r= page_ins_head; -while(n>=subtype(link(r)))r= link(r); -n= qo(n); -if(subtype(r)!=qi(n)) -/*1035:*/ -#line 19849 "htex.w" - -{q= get_node(page_ins_node_size);link(q)= link(r);link(r)= q;r= q; -subtype(r)= qi(n);type(r)= inserting;ensure_vbox(n); -if(box(n)==null)height(r)= 0; -else height(r)= height(box(n))+depth(box(n)); -best_ins_ptr(r)= null; -q= skip(n); -if(count(n)==1000)h= height(r); -else h= x_over_n(height(r),1000)*count(n); -page_goal= page_goal-h-width(q); -page_so_far[2+stretch_order(q)]= page_so_far[2+stretch_order(q)]+stretch(q); -page_shrink= page_shrink+shrink(q); -if((shrink_order(q)!=normal)&&(shrink(q)!=0)) -DBG(DBGTEX,"Infinite glue shrinkage inserted from stream %d",n); -} - -/*:1035*/ -#line 19828 "htex.w" -; -if(type(r)==split_up)insert_penalties= insert_penalties+float_cost(p); -else{last_ins_ptr(r)= p; -delta= page_goal-page_total-page_depth+page_shrink; - -if(count(n)==1000)h= height(p); -else h= x_over_n(height(p),1000)*count(n); -if(((h<=0)||(h<=delta))&&(height(p)+height(r)<=dimen(n))) -{page_goal= page_goal-h;height(r)= height(r)+height(p); -} -else/*1036:*/ -#line 19875 "htex.w" - -{if(count(n)<=0)w= max_dimen; -else{w= page_goal-page_total-page_depth; -if(count(n)!=1000)w= x_over_n(w,count(n))*1000; -} -if(w> dimen(n)-height(r))w= dimen(n)-height(r); -q= vert_break(ins_ptr(p),w,depth(p)); -height(r)= height(r)+best_height_plus_depth; -#ifdef STAT -if(tracing_pages> 0)/*1037:*/ -#line 19895 "htex.w" - -{begin_diagnostic();print_nl("% split");print_int(n); - -print(" to ");print_scaled(w); -print_char(',');print_scaled(best_height_plus_depth); -print(" p="); -if(q==null)print_int(eject_penalty); -else if(type(q)==penalty_node)print_int(penalty(q)); -else print_char('0'); -end_diagnostic(false); -} - -/*:1037*/ -#line 19884 "htex.w" -; -#endif - -if(count(n)!=1000) -best_height_plus_depth= x_over_n(best_height_plus_depth,1000)*count(n); -page_goal= page_goal-best_height_plus_depth; -type(r)= split_up;broken_ptr(r)= q;broken_ins(r)= p; -if(q==null)insert_penalties= insert_penalties+eject_penalty; -else if(type(q)==penalty_node)insert_penalties= insert_penalties+penalty(q); -} - -/*:1036*/ -#line 19839 "htex.w" -; -} -} - -/*:1034*//*1041:*/ -#line 19967 "htex.w" - -void hpack_page(void) -{ -pointer p,q,r,s; -pointer prev_p; -uint8_t n; -bool wait; -pointer save_split_top_skip; -#if 0 -print_str("\npage_head:\n"); -show_box(link(page_head)); -print_str("\nstream 0:\n"); -show_box(streams[0].p); -print_str("\nstream 1:\n"); -show_box(streams[1].p); -#endif -if(box(0)!=null) -{flush_node_list(box(0));box(0)= null;} -insert_penalties= 0; -save_split_top_skip= split_top_skip; -/*1045:*/ -#line 20053 "htex.w" - -{r= link(page_ins_head); -while(r!=page_ins_head) -{if(best_ins_ptr(r)!=null) -{n= qo(subtype(r));ensure_vbox(n); -if(box(n)==null)box(n)= new_null_box(); -p= box(n)+list_offset; -while(link(p)!=null)p= link(p); -last_ins_ptr(r)= p; -} -r= link(r); -} -} - -/*:1045*/ -#line 19987 "htex.w" -; -q= hold_head;link(q)= null;prev_p= page_head;p= link(prev_p); -while(p!=best_page_break) -{if(type(p)==ins_node) -{/*1047:*/ -#line 20079 "htex.w" - -{r= link(page_ins_head); -while(subtype(r)!=subtype(p))r= link(r); -if(best_ins_ptr(r)==null)wait= true; -else{wait= false;s= last_ins_ptr(r);link(s)= ins_ptr(p); -if(best_ins_ptr(r)==p) -/*1048:*/ -#line 20095 "htex.w" - -{if(type(r)==split_up) -if((broken_ins(r)==p)&&(broken_ptr(r)!=null)) -{while(link(s)!=broken_ptr(r))s= link(s); -link(s)= null; -split_top_skip= split_top_ptr(p); -ins_ptr(p)= prune_page_top(broken_ptr(r)); -if(ins_ptr(p)!=null) -{temp_ptr= vpack(ins_ptr(p),natural); -height(p)= height(temp_ptr)+depth(temp_ptr); -free_node(temp_ptr,box_node_size);wait= true; -} -} -while(link(s)!=null)s= link(s); -best_ins_ptr(r)= null; -n= qo(subtype(r)); -temp_ptr= list_ptr(box(n)); -free_node(box(n),box_node_size); -streams[n].p= temp_ptr; -streams[n].t= s; -} - -/*:1048*/ -#line 20086 "htex.w" - -else{while(link(s)!=null)s= link(s); -last_ins_ptr(r)= s; -} -} -/*1049:*/ -#line 20117 "htex.w" - -link(prev_p)= link(p);link(p)= null; -if(wait) -{link(q)= p;q= p;incr(insert_penalties); -} -else{delete_glue_ref(split_top_ptr(p)); -free_node(p,ins_node_size); -} -p= prev_p - -/*:1049*/ -#line 20092 "htex.w" -; -} - -/*:1047*/ -#line 19992 "htex.w" -; -} -prev_p= p;p= link(prev_p); -} -split_top_skip= save_split_top_skip; -/*1044:*/ -#line 20031 "htex.w" - -if(p!=null) -{if(link(contrib_head)==null) -if(nest_ptr==0)tail= page_tail; -else contrib_tail= page_tail; -link(page_tail)= link(contrib_head); -link(contrib_head)= p; -link(prev_p)= null; -} -streams[0].p= link(page_head);link(page_head)= null;page_tail= page_head; -streams[0].t= prev_p; -if(q!=hold_head) -{link(q)= link(contrib_head); -link(contrib_head)= link(hold_head); -} - -/*:1044*/ -#line 19998 "htex.w" -; -/*1046:*/ -#line 20067 "htex.w" - -r= link(page_ins_head); -while(r!=page_ins_head) -{q= link(r);free_node(r,page_ins_node_size);r= q; -} -link(page_ins_head)= page_ins_head - -/*:1046*/ -#line 19999 "htex.w" -; -} - -/*:1041*//*1173:*/ -#line 21989 "htex.w" - -void hdisplay(pointer p,pointer a,bool l) -{ -scaled x; -uint32_t offset= node_pos-node_pos1; -{scaled w; -scaled l; -scaled s; -pointer p; -pointer q; -internal_font_number f; -int n; -scaled v; -scaled d; - -if(head==tail) -{pop_nest();w= -max_dimen;x= cur_list.hs_field;offset= 0; -} -else{pointer par_ptr; -hprune_unwanted_nodes(); -par_ptr= link(head); -pop_nest(); -store_map(par_ptr,node_pos,0); -line_break(display_widow_penalty,par_ptr); -x= cur_list.hs_field; -/*1174:*/ -#line 22023 "htex.w" - -v= shift_amount(just_box)+2*dimen_def[quad_no];w= -max_dimen; -p= list_ptr(just_box); -while(p!=null) -{/*1175:*/ -#line 22040 "htex.w" - -reswitch:if(is_char_node(p)) -{f= font(p);d= char_width(f,char_info(f,character(p))); -goto found; -} -switch(type(p)){ -case hlist_node:case vlist_node:case rule_node:{d= width(p);goto found; -} -case ligature_node:/*665:*/ -#line 13145 "htex.w" - -{mem[lig_trick]= mem[lig_char(p)];link(lig_trick)= link(p); -p= lig_trick;goto reswitch; -} - -/*:665*/ -#line 22048 "htex.w" - -case kern_node:case math_node:d= width(p);break; -case glue_node:/*1176:*/ -#line 22062 "htex.w" - -{q= glue_ptr(p);d= width(q); -if(glue_sign(just_box)==stretching) -{if((glue_order(just_box)==stretch_order(q))&& -(stretch(q)!=0)) -v= max_dimen; -} -else if(glue_sign(just_box)==shrinking) -{if((glue_order(just_box)==shrink_order(q))&& -(shrink(q)!=0)) -v= max_dimen; -} -if(subtype(p)>=a_leaders)goto found; -} - -/*:1176*/ -#line 22051 "htex.w" -break; -case whatsit_node:/*1390:*/ -#line 25486 "htex.w" -d= 0 - -/*:1390*/ -#line 22052 "htex.w" -;break; -default:d= 0; -} - -/*:1175*/ -#line 22028 "htex.w" -; -if(v<max_dimen)v= v+d; -goto not_found; -found:if(v<max_dimen) -{v= v+d;w= v; -} -else{w= max_dimen;goto done; -} -not_found:p= link(p); -} -done: - -/*:1174*/ -#line 22016 "htex.w" -; -} - -/*1177:*/ -#line 22080 "htex.w" - -if(par_shape_ptr==null) -if((hang_indent!=0)&& -(((hang_after>=0)&&(prev_graf+2> hang_after))|| -(prev_graf+1<-hang_after))) -{l= x-abs(hang_indent); -if(hang_indent> 0)s= hang_indent;else s= 0; -} -else{l= x;s= 0; -} -else{n= info(par_shape_ptr); -if(prev_graf+2>=n)p= par_shape_ptr+2*n; -else p= par_shape_ptr+2*(prev_graf+2); -s= mem[p-1].sc;l= mem[p].sc; -} - -/*:1177*/ -#line 22019 "htex.w" -; -pre_display_size= w;display_width= l;display_indent= s; -} - -/*:1173*//*1228:*/ -#line 22747 "htex.w" - -{/*1226:*/ -#line 22730 "htex.w" - -pointer b; -scaled w; -scaled z; -scaled e; -scaled q; -scaled d; -scaled s; -small_number g1,g2; -pointer r; -pointer t; - -/*:1226*/ -#line 22748 "htex.w" - -adjust_tail= adjust_head;b= hpack(p,natural);p= list_ptr(b); -t= adjust_tail;adjust_tail= null; -w= width(b);z= display_width;s= display_indent; -if(a==null) -{e= 0;q= 0; -} -else{e= width(a);q= e+math_quad; -} -if(w+q> z) -/*1230:*/ -#line 22786 "htex.w" - -{if((e!=0)&&((w-total_shrink[normal]+q<=z)|| -(total_shrink[fil]!=0)||(total_shrink[fill]!=0)|| -(total_shrink[filll]!=0))) -{free_node(b,box_node_size); -b= hpack(p,z-q,exactly); -} -else{e= 0; -if(w> z) -{free_node(b,box_node_size); -b= hpack(p,z,exactly); -} -} -w= width(b); -} - -/*:1230*/ -#line 22759 "htex.w" -; -/*1231:*/ -#line 22810 "htex.w" - -d= half(z-w); -if((e> 0)&&(d<2*e)) -{d= half(z-w-e); -if(p!=null)if(!is_char_node(p))if(type(p)==glue_node)d= 0; -} - -/*:1231*/ -#line 22761 "htex.w" -; -/*1232:*/ -#line 22823 "htex.w" - -tail_append(new_penalty(pre_display_penalty)); -store_map(tail,node_pos,offset); -if((d+s<=pre_display_size)||l) -{g1= above_display_skip_no;g2= below_display_skip_no; -} -else{g1= above_display_short_skip_no; -g2= below_display_short_skip_no; -} -if(l&&(e==0)) -{shift_amount(a)= s;append_to_vlist(a,offset); -tail_append(new_penalty(inf_penalty));store_map(tail,node_pos,offset); -} -else{tail_append(new_glue(pointer_def[glue_kind][g1]));store_map(tail,node_pos,offset);} - -/*:1232*/ -#line 22762 "htex.w" -; -/*1233:*/ -#line 22838 "htex.w" - -if(e!=0) -{r= new_kern(z-w-e-d); -if(l) -{link(a)= r;link(r)= b;b= a;d= 0; -} -else{link(b)= r;link(r)= a; -} -b= hpack(b,natural); -} -shift_amount(b)= s+d;append_to_vlist(b,offset) - -/*:1233*/ -#line 22763 "htex.w" -; -/*1234:*/ -#line 22850 "htex.w" - -if((a!=null)&&(e==0)&&!l) -{tail_append(new_penalty(inf_penalty)); -shift_amount(a)= s+z-width(a); -append_to_vlist(a,offset); -g2= 0; -} -if(t!=adjust_head) -{link(tail)= link(adjust_head);tail= t; -} -tail_append(new_penalty(post_display_penalty)); -offset= (hpos-hstart)+1-node_pos; -store_map(tail,node_pos,offset); -if(g2> 0){tail_append(new_glue(pointer_def[glue_kind][g2]));store_map(tail,node_pos,offset);} - -/*:1234*/ -#line 22764 "htex.w" -; -prev_graf= prev_graf+3; -cur_list.bs_pos= hpos+node_pos; -push_nest();mode= hmode; -} -} - -/*:1228*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/htex.h b/Build/source/texk/web2c/hitexdir/hintview/src/htex.h deleted file mode 100644 index 260ceb5918d..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/htex.h +++ /dev/null @@ -1,1948 +0,0 @@ -/*1410:*/ -#line 25709 "htex.w" - -#define banner "This is TeX, Version 3.141592653 (HINT)" \ - -#define odd(X) ((X) &1) -#define chr(X) ((unsigned char) (X) ) -#define ord(X) ((unsigned int) (X) ) -#define abs(X) ((X) > -(X) ?(X) :-(X) ) -#define round(X) ((int) ((X) >=0.0?floor((X) +0.5) :ceil((X) -0.5) ) ) \ - -#define mem_bot 0 \ - -#define mem_top mem_max \ - \ - -#define font_base 0 \ - -#define hash_size 15000 \ - -#define hash_prime 12721 -#define hyph_size 607 \ - \ - -#define incr(A) A= A+1 -#define decr(A) A= A-1 -#define negate(A) A= -A -#define loop while(true) -#define do_nothing -#define empty 0 \ - -#define text_char unsigned char -#define first_text_char 0 -#define last_text_char 255 \ - -#define null_code 00 -#define carriage_return 015 -#define invalid_code 0177 \ - -#define reset_OK(A) erstat(A) ==0 -#define rewrite_OK(A) erstat(A) ==0 \ - -#define t_open_in term_in.f= stdin -#define t_open_out term_out.f= stdout \ - -#define update_terminal fflush(term_out.f) -#define clear_terminal fflush(term_in.f) -#define wake_up_terminal do_nothing \ - -#define loc cur_input.loc_field \ - -#define si(A) A -#define so(A) A \ - -#define length(A) (str_start[A+1]-str_start[A]) \ - \ - -#define cur_length (pool_ptr-str_start[str_ptr]) \ - -#define append_char(A) \ -{str_pool[pool_ptr]= si(A) ;incr(pool_ptr) ; \ -} -#define flush_char decr(pool_ptr) -#define str_room(A) \ -{if(pool_ptr+A> pool_size) \ -overflow("pool size",pool_size-init_pool_ptr) ; \ - \ -} \ - -#define flush_string {decr(str_ptr) ;pool_ptr= str_start[str_ptr]; \ -} \ - -#define app_lc_hex(A) l= A; \ -if(l<10) append_char(l+'0') else append_char(l-10+'a') \ - -#define no_print 16 -#define term_only 17 -#define log_only 18 -#define term_and_log 19 -#define pseudo 20 -#define new_string 21 -#define max_selector 21 \ - -#define print_lc_hex(A) \ -if((A) <10) print_char((A) +'0') ;else print_char((A) -10+'a') -#define print_ASCII(k) \ -if((k<' ') ||(k> '~') ) \ -{print("^^") ; \ -if(k<0100) print_char(k+0100) ; \ -else if(k<0200) print_char(k-0100) ; \ -else{print_lc_hex(k/16) ;print_lc_hex(k%16) ;} \ -} \ -else print_char(k) \ - -#define prompt_input(A) {wake_up_terminal;print(A) ;term_input() ; \ -} \ - -#define batch_mode 0 -#define nonstop_mode 1 -#define scroll_mode 2 -#define error_stop_mode 3 \ - -#define spotless 0 -#define warning_issued 1 -#define error_message_issued 2 -#define fatal_error_stop 3 \ - -#define hlp1(A) help_line[0]= A;} -#define hlp2(A,B) help_line[1]= A;help_line[0]= B;} -#define hlp3(A,B,C) help_line[2]= A;help_line[1]= B;help_line[0]= C;} -#define hlp4(A,B,C,D) help_line[3]= A;help_line[2]= B;help_line[1]= C;help_line[0]= D;} -#define hlp5(A,B,C,D,E) help_line[4]= A;help_line[3]= B;help_line[2]= C;help_line[1]= D;help_line[0]= E;} -#define hlp6(A,B,C,D,E,F) help_line[5]= A;help_line[4]= B;help_line[3]= C;help_line[2]= D;help_line[1]= E;help_line[0]= F;} -#define help0 help_ptr= 0 -#define help1(A) {help_ptr= 1;hlp1(A) -#define help2(A,B) {help_ptr= 2;hlp2(A,B) -#define help3(A,B,C) {help_ptr= 3;hlp3(A,B,C) -#define help4(A,B,C,D) {help_ptr= 4;hlp4(A,B,C,D) -#define help5(A,B,C,D,E) {help_ptr= 5;hlp5(A,B,C,D,E) -#define help6(A,B,C,D,E,F) {help_ptr= 6;hlp6(A,B,C,D,E,F) \ - -#define succumb {if(interaction==error_stop_mode) \ -interaction= scroll_mode; \ -if(log_opened) error() ; \ -if(interaction> batch_mode) debug_help() ; \ -history= fatal_error_stop;jump_out() ; \ -} \ - -#define check_interrupt {if(interrupt!=0) pause_for_instructions() ; \ -} \ - -#define unity 0200000 -#define two 0400000 \ - -#define nx_plus_y(A,B,C) mult_and_add(A,B,C,07777777777) -#define mult_integers(A,B) mult_and_add(A,B,0,017777777777) \ - -#define inf_bad 10000 \ - -#define set_glue_ratio_zero(A) A= 0.0 -#define set_glue_ratio_one(A) A= 1.0 -#define unfix(A) ((double) (A) ) -#define fix(A) ((glue_ratio) (A) ) -#define float_constant(A) ((double) (A) ) \ - -#define min_quarterword 0 -#define max_quarterword 255 -#define min_halfword 0 -#define max_halfword 65535 \ - -#define qi(A) A+min_quarterword \ - -#define qo(A) A-min_quarterword \ - -#define hi(A) A+min_halfword \ - -#define ho(A) A-min_halfword \ - \ - -#define sc i \ - -#define pointer halfword -#define null min_halfword \ - -#define link(A) mem[A].hh.rh -#define info(A) mem[A].hh.lh \ - -#define mem_end mem_top -#define free_avail(A) \ -{link(A) = avail;avail= A; \ -decr_dyn_used; \ -} \ - -#define fast_get_avail(A) \ -{A= avail; \ -if(A==null) A= get_avail() ; \ -else{avail= link(A) ;link(A) = null; \ -incr_dyn_used; \ -} \ -} \ - -#define empty_flag max_halfword -#define is_empty(A) (link(A) ==empty_flag) -#define node_size(A) info(A) -#define llink(A) info(A+1) -#define rlink(A) link(A+1) \ - -#define type(A) mem[A].hh.b0 -#define subtype(A) mem[A].hh.b1 \ - -#define is_char_node(A) (A>=hi_mem_min) \ - -#define font(A) type(A) -#define character(A) subtype(A) \ - -#define hlist_node 0 -#define box_node_size 9 -#define width_offset 1 -#define depth_offset 2 -#define height_offset 3 -#define width(A) mem[A+width_offset].sc -#define depth(A) mem[A+depth_offset].sc -#define height(A) mem[A+height_offset].sc -#define shift_amount(A) mem[A+4].sc -#define list_offset 5 -#define list_ptr(A) link(A+list_offset) -#define glue_order(A) subtype(A+list_offset) -#define glue_sign(A) type(A+list_offset) -#define normal 0 -#define stretching 1 -#define shrinking 2 -#define glue_offset 6 -#define glue_set(A) mem[A+glue_offset].gr \ - \ - -#define vlist_node 1 \ - -#define rule_node 2 -#define rule_node_size 4 -#define null_flag -010000000000 -#define is_running(A) (A==null_flag) \ - -#define ins_node 3 -#define ins_node_size 5 -#define float_cost(A) mem[A+1].i -#define ins_ptr(A) info(A+4) -#define split_top_ptr(A) link(A+4) \ - -#define mark_node 4 -#define small_node_size 2 -#define mark_ptr(A) mem[A+1].i \ - -#define adjust_node 5 -#define adjust_ptr(A) mark_ptr(A) \ - -#define ligature_node 6 -#define lig_char(A) A+1 -#define lig_ptr(A) link(lig_char(A) ) \ - -#define disc_node 7 -#define replace_count(A) (subtype(A) &0x7F) -#define set_replace_count(A,B) (subtype(A) = (B) &0x7F) -#define set_auto_disc(A) (subtype(A) |= 0x80) -#define is_auto_disc(A) (subtype(A) &0x80) -#define pre_break(A) llink(A) -#define post_break(A) rlink(A) \ - -#define whatsit_node 8 \ - -#define math_node 9 -#define before 0 -#define after 1 \ - -#define precedes_break(A) (type(A) <math_node) -#define non_discardable(A) (type(A) <math_node) \ - -#define glue_node 10 -#define cond_math_glue 98 -#define mu_glue 99 -#define a_leaders 100 -#define c_leaders 101 -#define x_leaders 102 -#define glue_ptr(A) llink(A) -#define leader_ptr(A) rlink(A) \ - -#define glue_spec_size 4 -#define glue_ref_count(A) link(A) -#define stretch(A) mem[A+2].sc -#define shrink(A) mem[A+3].sc -#define stretch_order(A) type(A) -#define shrink_order(A) subtype(A) -#define fil 1 -#define fill 2 -#define filll 3 \ - -#define kern_node 11 -#define explicit 1 -#define acc_kern 2 \ - -#define penalty_node 12 -#define inf_penalty inf_bad -#define eject_penalty (-inf_penalty) -#define penalty(A) mem[A+1].i \ - -#define unset_node 13 -#define glue_stretch(A) mem[A+glue_offset].sc -#define glue_shrink(A) shift_amount(A) -#define span_count(A) subtype(A) \ - -#define zero_glue mem_bot -#define lo_mem_stat_max zero_glue+glue_spec_size-1 \ - -#define page_ins_head mem_top -#define contrib_head mem_top-1 -#define page_head mem_top-2 -#define temp_head mem_top-3 -#define hold_head mem_top-4 -#define adjust_head mem_top-5 -#define active mem_top-7 -#define align_head mem_top-8 -#define end_span mem_top-9 -#define omit_template mem_top-10 -#define null_list mem_top-11 -#define lig_trick mem_top-12 -#define garbage mem_top-12 -#define backup_head mem_top-13 -#define hi_mem_stat_min mem_top-13 \ - -#define hi_mem_stat_usage 14 \ - -#define node_list_display(A) \ -{depth_level++;show_node_list(A) ;depth_level--; \ -} -#define print_current_indent \ -{int i; \ -for(i= 0;i<depth_level;i++) \ -print_char('.') ;} \ - -#define token_ref_count(A) info(A) \ - -#define fast_delete_glue_ref(A) \ -{if(glue_ref_count(A) ==null) free_node(A,glue_spec_size) ; \ -else decr(glue_ref_count(A) ) ; \ -} \ - -#define add_token_ref(A) incr(token_ref_count(A) ) -#define add_glue_ref(A) incr(glue_ref_count(A) ) -#define add_xdimen_ref(A) if(A!=null) incr(xdimen_ref_count(A) ) \ - -#define escape 0 \ - -#define relax 0 -#define left_brace 1 -#define right_brace 2 -#define math_shift 3 -#define tab_mark 4 -#define car_ret 5 -#define out_param 5 -#define mac_param 6 -#define sup_mark 7 -#define sub_mark 8 -#define ignore 9 -#define endv 9 -#define spacer 10 -#define letter 11 -#define other_char 12 -#define active_char 13 -#define par_end 13 -#define match 13 -#define comment 14 -#define end_match 14 -#define stop 14 -#define invalid_char 15 -#define delim_num 15 -#define max_char_code 15 \ - -#define char_num 16 -#define math_char_num 17 -#define mark 18 -#define xray 19 -#define make_box 20 -#define hmove 21 -#define vmove 22 -#define un_hbox 23 -#define un_vbox 24 -#define remove_item 25 \ - -#define hskip 26 -#define vskip 27 -#define mskip 28 -#define kern 29 -#define mkern 30 -#define leader_ship 31 -#define halign 32 -#define valign 33 -#define no_align 34 -#define vrule 35 -#define hrule 36 -#define insert 37 -#define vadjust 38 -#define ignore_spaces 39 -#define after_assignment 40 -#define after_group 41 -#define break_penalty 42 -#define start_par 43 -#define ital_corr 44 -#define accent 45 -#define math_accent 46 -#define discretionary 47 -#define eq_no 48 -#define left_right 49 -#define math_comp 50 -#define limit_switch 51 -#define above 52 -#define math_style 53 -#define math_choice 54 -#define non_script 55 -#define vcenter 56 -#define case_shift 57 -#define message 58 -#define extension 59 -#define in_stream 60 -#define begin_group 61 -#define end_group 62 -#define omit 63 -#define ex_space 64 -#define no_boundary 65 -#define radical 66 -#define end_cs_name 67 -#define min_internal 68 -#define char_given 68 -#define math_given 69 -#define last_item 70 \ - -#define max_non_prefixed_command 70 \ - -#define toks_register 71 -#define assign_toks 72 -#define assign_int 73 -#define assign_dimen 74 -#define assign_glue 75 -#define assign_mu_glue 76 -#define assign_font_dimen 77 -#define assign_font_int 78 \ - -#define set_aux 79 -#define set_prev_graf 80 -#define set_page_dimen 81 -#define set_page_int 82 \ - -#define set_box_dimen 83 -#define set_shape 84 -#define def_code 85 -#define def_family 86 -#define set_font 87 -#define def_font 88 -#define internal_register 89 -#define max_internal 89 -#define advance 90 -#define multiply 91 -#define divide 92 -#define prefix 93 -#define let 94 -#define shorthand_def 95 -#define read_to_cs 96 -#define def 97 -#define set_box 98 -#define hyph_data 99 -#define set_interaction 100 -#define max_command 100 \ - -#define undefined_cs (max_command+1) -#define expand_after (max_command+2) -#define no_expand (max_command+3) -#define input (max_command+4) -#define if_test (max_command+5) -#define fi_or_else (max_command+6) -#define cs_name (max_command+7) -#define convert (max_command+8) -#define the (max_command+9) -#define top_bot_mark (max_command+10) -#define call (max_command+11) -#define long_call (max_command+12) -#define outer_call (max_command+13) -#define long_outer_call (max_command+14) -#define end_template (max_command+15) -#define dont_expand (max_command+16) -#define glue_ref (max_command+17) -#define shape_ref (max_command+18) -#define box_ref (max_command+19) -#define data (max_command+20) \ - -#define vmode 1 -#define hmode (vmode+max_command+1) -#define mmode (hmode+max_command+1) \ - -#define ignore_depth -65536000 \ - -#define mode cur_list.mode_field -#define head cur_list.head_field -#define tail cur_list.tail_field -#define prev_graf cur_list.pg_field -#define aux cur_list.aux_field -#define prev_depth aux.sc -#define space_factor aux.hh.lh -#define clang aux.hh.rh -#define incompleat_noad aux.i -#define cur_bs cur_list.bs_field -#define cur_ls cur_list.ls_field -#define cur_lsl cur_list.lsl_field -#define needs_bs (cur_list.bs_pos!=NULL) -#define prev_height cur_list.ht_field -#define node_pos cur_list.np_field -#define node_pos1 (nest_ptr==0?0:nest[nest_ptr-1].np_field) \ - -#define tail_append(A) {link(tail) = A;tail= link(tail) ; \ -} \ - -#define eq_level_field(A) A.hh.b1 -#define eq_type_field(A) A.hh.b0 -#define equiv_field(A) A.hh.rh -#define eq_level(A) eq_level_field(eqtb[A]) -#define eq_type(A) eq_type_field(eqtb[A]) -#define equiv(A) equiv_field(eqtb[A]) -#define level_zero min_quarterword -#define level_one (level_zero+1) \ - -#define active_base 1 -#define single_base (active_base+256) -#define null_cs (single_base+256) -#define hash_base (null_cs+1) -#define frozen_control_sequence (hash_base+hash_size) -#define frozen_protection frozen_control_sequence -#define frozen_cr (frozen_control_sequence+1) -#define frozen_end_group (frozen_control_sequence+2) -#define frozen_right (frozen_control_sequence+3) -#define frozen_fi (frozen_control_sequence+4) -#define frozen_end_template (frozen_control_sequence+5) -#define frozen_endv (frozen_control_sequence+6) -#define frozen_relax (frozen_control_sequence+7) -#define end_write (frozen_control_sequence+8) -#define frozen_dont_expand (frozen_control_sequence+9) \ - -#define frozen_null_font (frozen_control_sequence+10) \ - -#define font_id_base (frozen_null_font-font_base) \ - -#define undefined_control_sequence (frozen_null_font+257) -#define glue_base (undefined_control_sequence+1) \ - -#define line_skip_code 0 -#define baseline_skip_code 1 -#define par_skip_code 2 -#define above_display_skip_code 3 -#define below_display_skip_code 4 -#define above_display_short_skip_code 5 \ - -#define below_display_short_skip_code 6 \ - -#define left_skip_code 7 -#define right_skip_code 8 -#define top_skip_code 9 -#define split_top_skip_code 10 -#define tab_skip_code 11 -#define space_skip_code 12 -#define xspace_skip_code 13 -#define par_fill_skip_code 14 -#define thin_mu_skip_code 15 -#define med_mu_skip_code 16 -#define thick_mu_skip_code 17 -#define glue_pars 18 -#define skip_base (glue_base+glue_pars) -#define mu_skip_base (skip_base+256) -#define local_base (mu_skip_base+256) \ - -#define mu_skip(A) equiv(mu_skip_base+A) -#define glue_par(A) equiv(glue_base+A) -#define line_skip pointer_def[glue_kind][line_skip_no] -#define baseline_skip pointer_def[glue_kind][baseline_skip_no] -#define above_display_skip pointer_def[glue_kind][above_display_skip_no] -#define below_display_skip pointer_def[glue_kind][below_display_skip_no] -#define above_display_short_skip pointer_def[glue_kind][above_display_short_skip_no] -#define below_display_short_skip pointer_def[glue_kind][below_display_short_skip_no] -#define left_skip pointer_def[glue_kind][left_skip_no] -#define right_skip pointer_def[glue_kind][right_skip_no] -#define top_skip pointer_def[glue_kind][top_skip_no] -#define split_top_skip pointer_def[glue_kind][split_top_skip_no] -#define tab_skip pointer_def[glue_kind][tab_skip_no] -#define par_fill_skip pointer_def[glue_kind][par_fill_skip_no] -#define thin_mu_skip glue_par(thin_mu_skip_code) -#define med_mu_skip glue_par(med_mu_skip_code) -#define thick_mu_skip glue_par(thick_mu_skip_code) \ - -#define par_shape_loc local_base -#define output_routine_loc (local_base+1) -#define every_par_loc (local_base+2) -#define every_math_loc (local_base+3) -#define every_display_loc (local_base+4) -#define every_hbox_loc (local_base+5) -#define every_vbox_loc (local_base+6) -#define every_job_loc (local_base+7) -#define every_cr_loc (local_base+8) -#define err_help_loc (local_base+9) -#define toks_base (local_base+10) -#define box_base (toks_base+256) -#define cur_font_loc (box_base+256) -#define math_font_base (cur_font_loc+1) -#define cat_code_base (math_font_base+48) \ - -#define lc_code_base (cat_code_base+256) -#define uc_code_base (lc_code_base+256) -#define sf_code_base (uc_code_base+256) -#define math_code_base (sf_code_base+256) -#define int_base (math_code_base+256) \ - -#define par_shape_ptr null -#define output_routine equiv(output_routine_loc) -#define every_par equiv(every_par_loc) -#define every_math equiv(every_math_loc) -#define every_display equiv(every_display_loc) -#define every_hbox equiv(every_hbox_loc) -#define every_vbox equiv(every_vbox_loc) -#define every_job equiv(every_job_loc) -#define every_cr equiv(every_cr_loc) -#define err_help equiv(err_help_loc) -#define toks(X) equiv(toks_base+X) -#define box(A) (*box_ptr(A) ) -#define cur_font equiv(cur_font_loc) -#define fam_fnt(A) equiv(math_font_base+A) -#define cat_code(A) equiv(cat_code_base+A) -#define lc_code(A) equiv(lc_code_base+A) -#define uc_code(A) equiv(uc_code_base+A) -#define sf_code(A) equiv(sf_code_base+A) -#define math_code(A) equiv(math_code_base+A) \ - \ - -#define null_font font_base -#define var_code 070000 \ - -#define pretolerance_code 0 -#define tolerance_code 1 -#define line_penalty_code 2 -#define hyphen_penalty_code 3 -#define ex_hyphen_penalty_code 4 -#define club_penalty_code 5 -#define widow_penalty_code 6 -#define display_widow_penalty_code 7 -#define broken_penalty_code 8 -#define bin_op_penalty_code 9 -#define rel_penalty_code 10 -#define pre_display_penalty_code 11 \ - -#define post_display_penalty_code 12 \ - -#define inter_line_penalty_code 13 -#define double_hyphen_demerits_code 14 -#define final_hyphen_demerits_code 15 -#define adj_demerits_code 16 -#define mag_code 17 -#define delimiter_factor_code 18 -#define looseness_code 19 -#define time_code 20 -#define day_code 21 -#define month_code 22 -#define year_code 23 -#define show_box_breadth_code 24 -#define show_box_depth_code 25 -#define hbadness_code 26 -#define vbadness_code 27 -#define pausing_code 28 -#define tracing_online_code 29 -#define tracing_macros_code 30 -#define tracing_stats_code 31 -#define tracing_paragraphs_code 32 -#define tracing_pages_code 33 -#define tracing_output_code 34 -#define tracing_lost_chars_code 35 -#define tracing_commands_code 36 -#define tracing_restores_code 37 -#define uc_hyph_code 38 -#define output_penalty_code 39 -#define max_dead_cycles_code 40 -#define hang_after_code 41 -#define floating_penalty_code 42 -#define global_defs_code 43 -#define cur_fam_code 44 -#define escape_char_code 45 -#define default_hyphen_char_code 46 -#define default_skew_char_code 47 -#define end_line_char_code 48 -#define new_line_char_code 49 -#define language_code 50 -#define left_hyphen_min_code 51 -#define right_hyphen_min_code 52 -#define holding_inserts_code 53 -#define error_context_lines_code 54 -#define int_pars 55 -#define count_base (int_base+int_pars) -#define del_code_base (count_base+256) -#define dimen_base (del_code_base+256) \ - -#define del_code(A) eqtb[del_code_base+A].i -#define int_par(A) eqtb[int_base+A].i -#define pretolerance integer_def[pretolerance_no] -#define tolerance integer_def[tolerance_no] -#define line_penalty integer_def[line_penalty_no] -#define hyphen_penalty integer_def[hyphen_penalty_no] -#define ex_hyphen_penalty integer_def[ex_hyphen_penalty_no] -#define club_penalty integer_def[club_penalty_no] -#define widow_penalty integer_def[widow_penalty_no] -#define display_widow_penalty integer_def[display_widow_penalty_no] -#define broken_penalty integer_def[broken_penalty_no] -#define pre_display_penalty integer_def[pre_display_penalty_no] -#define post_display_penalty integer_def[post_display_penalty_no] -#define inter_line_penalty integer_def[inter_line_penalty_no] -#define double_hyphen_demerits integer_def[double_hyphen_demerits_no] -#define final_hyphen_demerits integer_def[final_hyphen_demerits_no] -#define adj_demerits integer_def[adj_demerits_no] -#define looseness integer_def[looseness_no] -#define time integer_def[time_no] -#define day integer_def[day_no] -#define month integer_def[month_no] -#define year integer_def[year_no] -#define show_box_breadth int_par(show_box_breadth_code) -#define show_box_depth int_par(show_box_depth_code) -#define hbadness int_par(hbadness_code) -#define vbadness int_par(vbadness_code) -#define pausing int_par(pausing_code) -#define tracing_online int_par(tracing_online_code) -#define tracing_macros int_par(tracing_macros_code) -#define tracing_stats int_par(tracing_stats_code) -#define tracing_paragraphs (debugflags&DBGTEX) -#define tracing_pages (debugflags&DBGPAGE) -#define tracing_output int_par(tracing_output_code) -#define tracing_lost_chars int_par(tracing_lost_chars_code) -#define tracing_commands int_par(tracing_commands_code) -#define tracing_restores int_par(tracing_restores_code) -#define uc_hyph int_par(uc_hyph_code) -#define output_penalty int_par(output_penalty_code) -#define max_dead_cycles int_par(max_dead_cycles_code) -#define hang_after integer_def[hang_after_no] -#define floating_penalty int_par(floating_penalty_code) -#define global_defs int_par(global_defs_code) -#define cur_fam int_par(cur_fam_code) -#define escape_char int_par(escape_char_code) -#define default_hyphen_char int_par(default_hyphen_char_code) -#define default_skew_char int_par(default_skew_char_code) -#define end_line_char int_par(end_line_char_code) -#define new_line_char int_par(new_line_char_code) -#define language int_par(language_code) -#define left_hyphen_min int_par(left_hyphen_min_code) -#define right_hyphen_min int_par(right_hyphen_min_code) -#define error_context_lines int_par(error_context_lines_code) \ - -#define par_indent_code 0 -#define math_surround_code 1 -#define line_skip_limit_code 2 -#define hsize_code 3 -#define vsize_code 4 -#define max_depth_code 5 -#define split_max_depth_code 6 -#define box_max_depth_code 7 -#define hfuzz_code 8 -#define vfuzz_code 9 -#define delimiter_shortfall_code 10 -#define null_delimiter_space_code 11 -#define script_space_code 12 -#define pre_display_size_code 13 -#define display_width_code 14 -#define display_indent_code 15 -#define overfull_rule_code 16 -#define hang_indent_code 17 -#define h_offset_code 18 -#define v_offset_code 19 -#define emergency_stretch_code 20 -#define dimen_pars 21 -#define scaled_base (dimen_base+dimen_pars) \ - -#define eqtb_size (scaled_base+255) \ - -#define dimen_par(A) eqtb[dimen_base+A].sc -#define par_indent dimen_par(par_indent_code) -#define math_surround dimen_par(math_surround_code) -#define line_skip_limit dimen_def[line_skip_limit_no] -#define hsize dimen_par(hsize_code) -#define vsize dimen_par(vsize_code) -#define max_depth dimen_def[max_depth_no] -#define split_max_depth dimen_par(split_max_depth_code) -#define box_max_depth dimen_par(box_max_depth_code) -#define hfuzz dimen_par(hfuzz_code) -#define vfuzz dimen_par(vfuzz_code) -#define delimiter_shortfall dimen_par(delimiter_shortfall_code) -#define null_delimiter_space dimen_par(null_delimiter_space_code) -#define script_space dimen_par(script_space_code) -#define pre_display_size cur_list.ds_field -#define display_width cur_list.dw_field -#define display_indent cur_list.di_field -#define overfull_rule dimen_par(overfull_rule_code) -#define hang_indent dimen_def[hang_indent_no] -#define h_offset dimen_par(h_offset_code) -#define v_offset dimen_par(v_offset_code) -#define emergency_stretch dimen_def[emergency_stretch_no] \ - -#define next(A) hash[A].lh -#define text(A) hash[A].rh -#define hash_is_full (hash_used==hash_base) -#define font_id_text(A) text(font_id_base+A) \ - -#define save_type(A) save_stack[A].hh.b0 -#define save_level(A) save_stack[A].hh.b1 \ - -#define save_index(A) save_stack[A].hh.rh \ - -#define restore_old_value 0 -#define restore_zero 1 -#define insert_token 2 -#define level_boundary 3 \ - -#define bottom_level 0 -#define simple_group 1 -#define hbox_group 2 -#define adjusted_hbox_group 3 -#define vbox_group 4 -#define vtop_group 5 -#define align_group 6 -#define no_align_group 7 -#define output_group 8 -#define math_group 9 -#define disc_group 10 -#define insert_group 11 -#define vcenter_group 12 -#define math_choice_group 13 -#define semi_simple_group 14 -#define math_shift_group 15 -#define math_left_group 16 -#define max_group_code 16 \ - -#define check_full_save_stack if(save_ptr> max_save_stack) \ -{max_save_stack= save_ptr; \ -if(max_save_stack> save_size-6) overflow("save size",save_size) ; \ - \ -} \ - -#define saved(A) save_stack[save_ptr+A].i \ - -#define cs_token_flag 07777 \ - -#define left_brace_token 00400 -#define left_brace_limit 01000 -#define right_brace_token 01000 -#define right_brace_limit 01400 -#define math_shift_token 01400 -#define tab_token 02000 -#define out_param_token 02400 -#define space_token 05040 -#define letter_token 05400 -#define other_token 06000 -#define match_token 06400 -#define end_match_token 07000 \ - -#define chr_cmd(A) {print(A) ;print_ASCII(chr_code) ; \ -} \ - -#define state cur_input.state_field -#define index cur_input.index_field -#define start cur_input.start_field -#define limit cur_input.limit_field -#define name cur_input.name_field \ - -#define mid_line 1 -#define skip_blanks (2+max_char_code) -#define new_line (3+max_char_code+max_char_code) \ - -#define terminal_input (name==0) -#define cur_file input_file[index] \ - -#define skipping 1 -#define defining 2 -#define matching 3 -#define aligning 4 -#define absorbing 5 \ - -#define token_list 0 -#define token_type index -#define param_start limit -#define parameter 0 -#define u_template 1 -#define v_template 2 -#define backed_up 3 -#define inserted 4 -#define macro 5 -#define output_text 6 -#define every_par_text 7 -#define every_math_text 8 -#define every_display_text 9 -#define every_hbox_text 10 -#define every_vbox_text 11 -#define every_job_text 12 -#define every_cr_text 13 -#define mark_text 14 -#define write_text 15 \ - -#define begin_pseudoprint \ -{l= tally;tally= 0;selector= pseudo; \ -trick_count= 1000000; \ -} -#define set_trick_count \ -{first_count= tally; \ -trick_count= tally+1+error_line-half_error_line; \ -if(trick_count<error_line) trick_count= error_line; \ -} \ - -#define push_input \ -{if(input_ptr> max_in_stack) \ -{max_in_stack= input_ptr; \ -if(input_ptr==stack_size) overflow("input stack size",stack_size) ; \ - \ -} \ -input_stack[input_ptr]= cur_input; \ -incr(input_ptr) ; \ -} \ - -#define pop_input \ -{decr(input_ptr) ;cur_input= input_stack[input_ptr]; \ -} \ - -#define back_list(A) begin_token_list(A,backed_up) -#define ins_list(A) begin_token_list(A,inserted) \ - -#define any_state_plus(A) case mid_line+A: \ -case skip_blanks+A:case new_line+A \ - -#define add_delims_to(A) A+math_shift:A+tab_mark:A+mac_param: \ -A+sub_mark:A+letter:A+other_char \ - -#define is_hex(A) (((A>='0') &&(A<='9') ) ||((A>='a') &&(A<='f') ) ) -#define hex_to_cur_chr \ -if(c<='9') cur_chr= c-'0';else cur_chr= c-'a'+10; \ -if(cc<='9') cur_chr= 16*cur_chr+cc-'0'; \ -else cur_chr= 16*cur_chr+cc-'a'+10 \ - -#define no_expand_flag 257 \ - -#define end_line_char_inactive (end_line_char<0) ||(end_line_char> 255) \ - -#define store_new_token(A) {q= get_avail() ;link(p) = q;info(q) = A; \ -p= q; \ -} -#define fast_store_new_token(A) {fast_get_avail(q) ;link(p) = q;info(q) = A; \ -p= q; \ -} \ - -#define top_mark_code 0 -#define first_mark_code 1 -#define bot_mark_code 2 -#define split_first_mark_code 3 -#define split_bot_mark_code 4 -#define top_mark cur_mark[top_mark_code] -#define first_mark cur_mark[first_mark_code] -#define bot_mark cur_mark[bot_mark_code] -#define split_first_mark cur_mark[split_first_mark_code] -#define split_bot_mark cur_mark[split_bot_mark_code] \ - -#define int_val 0 -#define dimen_val 1 -#define glue_val 2 -#define mu_val 3 -#define ident_val 4 -#define tok_val 5 \ - -#define scanned_result(A,B) {cur_val= A;cur_val_level= B;} \ - -#define input_line_no_code (glue_val+1) -#define badness_code (glue_val+2) \ - -#define max_dimen 07777777777 \ - -#define octal_token (other_token+'\'') -#define hex_token (other_token+'"') -#define alpha_token (other_token+'`') -#define point_token (other_token+'.') -#define continental_point_token (other_token+',') \ - -#define infinity 017777777777 -#define zero_token (other_token+'0') -#define A_token (letter_token+'A') -#define other_A_token (other_token+'A') \ - -#define scan_normal_dimen scan_dimen(false,false,false) \ - -#define set_conversion(A,B) {num= A;denom= B;} \ - -#define default_rule 26214 \ - -#define number_code 0 -#define roman_numeral_code 1 -#define string_code 2 -#define meaning_code 3 -#define font_name_code 4 -#define job_name_code 5 \ - -#define closed 2 -#define just_open 1 \ - -#define if_char_code 0 -#define if_cat_code 1 -#define if_int_code 2 -#define if_dim_code 3 -#define if_odd_code 4 -#define if_vmode_code 5 -#define if_hmode_code 6 -#define if_mmode_code 7 -#define if_inner_code 8 -#define if_void_code 9 -#define if_hbox_code 10 -#define if_vbox_code 11 -#define ifx_code 12 -#define if_eof_code 13 -#define if_true_code 14 -#define if_false_code 15 -#define if_case_code 16 \ - -#define if_node_size 2 -#define if_line_field(A) mem[A+1].i -#define if_code 1 -#define fi_code 2 -#define else_code 3 -#define or_code 4 \ - -#define get_x_token_or_active_char \ -{get_x_token() ; \ -if(cur_cmd==relax) if(cur_chr==no_expand_flag) \ -{cur_cmd= active_char; \ -cur_chr= cur_tok-cs_token_flag-active_base; \ -} \ -} \ - -#define TEX_area "TeXinputs/" \ - -#define TEX_font_area "TeXfonts/" \ - \ - -#define MAX_CUR_FILE_NAME 1024 \ - -#define append_to_name(A) {c= A;incr(k) ; \ -if(k<=file_name_size) name_of_file[k]= xchr[c]; \ -} \ - -#define format_default_length 20 -#define format_area_length 11 -#define format_ext_length 4 -#define format_extension ".fmt" \ - -#define pack_cur_name pack_file_name(cur_name,cur_area,cur_ext) \ - -#define ensure_dvi_open if(output_file_name==0) \ -{if(job_name==0) open_log_file() ; \ -pack_job_name(".dvi") ; \ -while(!b_open_out(&dvi_file) ) \ -prompt_file_name("file name for output",".dvi") ; \ -output_file_name= b_make_name_string(&dvi_file) ; \ -} \ - -#define no_tag 0 -#define lig_tag 1 -#define list_tag 2 -#define ext_tag 3 \ - -#define stop_flag qi(128) -#define kern_flag qi(128) -#define skip_byte(A) A.b0 -#define next_char(A) A.b1 -#define op_byte(A) A.b2 -#define rem_byte(A) A.b3 \ - -#define ext_top(A) A.b0 -#define ext_mid(A) A.b1 -#define ext_bot(A) A.b2 -#define ext_rep(A) A.b3 \ - -#define slant_code 1 -#define space_code 2 -#define space_stretch_code 3 -#define space_shrink_code 4 -#define x_height_code 5 -#define quad_code 6 -#define extra_space_code 7 \ - -#define non_char qi(256) -#define non_address 0 \ - -#define char_info(A,B) font_info[char_base[A]+B].qqqq -#define char_width(A,B) font_info[width_base[A]+B.b0].sc -#define char_exists(A) (A.b0> min_quarterword) -#define char_italic(A,B) font_info[italic_base[A]+(qo(B.b2) ) /4].sc -#define height_depth(A) qo(A.b1) -#define char_height(A,B) font_info[height_base[A]+(B) /16].sc -#define char_depth(A,B) font_info[depth_base[A]+(B) %16].sc -#define char_tag(A) ((qo(A.b2) ) %4) \ - -#define char_kern(A,B) font_info[kern_base[A]+256*op_byte(B) +rem_byte(B) ].sc -#define kern_base_offset 256*(128+min_quarterword) -#define lig_kern_start(A,B) lig_kern_base[A]+B.b3 -#define lig_kern_restart(A,B) lig_kern_base[A]+256*op_byte(B) +rem_byte(B) +32768-kern_base_offset \ - -#define param_end(A) param_base[A]].sc -#define param(A) font_info[A+param_end -#define slant param(slant_code) -#define space param(space_code) -#define space_stretch param(space_stretch_code) -#define space_shrink param(space_shrink_code) -#define x_height param(x_height_code) -#define quad param(quad_code) -#define extra_space param(extra_space_code) \ - -#define abort goto bad_tfm \ - -#define start_font_error_message print_err("Font ") ;sprint_cs(u) ; \ -print_char('=') ;print_file_name(nom,aire,"") ; \ -if(s>=0) \ -{print(" at ") ;print_scaled(s) ;print("pt") ; \ -} \ -else if(s!=-1000) \ -{print(" scaled ") ;print_int(-s) ; \ -} \ - -#define fget (hpos++) -#define fbyte (*hpos) -#define read_sixteen(A) {A= fbyte; \ -if(A> 127) abort; \ -fget;A= A*0400+fbyte; \ -} -#define store_four_quarters(A) {fget;a= fbyte;qw.b0= qi(a) ; \ -fget;b= fbyte;qw.b1= qi(b) ; \ -fget;c= fbyte;qw.b2= qi(c) ; \ -fget;d= fbyte;qw.b3= qi(d) ; \ -A= qw; \ -} \ - -#define check_byte_range(A) {if((A<bc) ||(A> ec) ) abort;} -#define current_character_being_worked_on k+bc-fmem_ptr \ - -#define store_scaled(A) {fget;a= fbyte;fget;b= fbyte; \ -fget;c= fbyte;fget;d= fbyte; \ -sw= (((((d*z) /0400) +(c*z) ) /0400) +(b*z) ) /beta; \ -if(a==0) A= sw;else if(a==255) A= sw-alpha;else abort; \ -} \ - -#define check_existence(A) \ -{check_byte_range(A) ; \ -qw= char_info(f,A) ; \ -if(!char_exists(qw) ) abort; \ -} \ - -#define adjust(A) A[f]= qo(A[f]) \ - \ - -#define set_char_0 0 -#define set1 128 -#define set_rule 132 -#define put_rule 137 -#define nop 138 -#define bop 139 -#define eop 140 -#define push 141 -#define pop 142 -#define right1 143 -#define w0 147 -#define w1 148 -#define x0 152 -#define x1 153 -#define down1 157 -#define y0 161 -#define y1 162 -#define z0 166 -#define z1 167 -#define fnt_num_0 171 -#define fnt1 235 -#define xxx1 239 -#define xxx4 242 -#define fnt_def1 243 -#define pre 247 -#define post 248 -#define post_post 249 \ - -#define id_byte 2 \ - -#define dvi_out(A) {dvi_buf[dvi_ptr]= A;incr(dvi_ptr) ; \ -if(dvi_ptr==dvi_limit) dvi_swap() ; \ -} \ - -#define movement_node_size 3 -#define location(A) mem[A+2].i \ - -#define y_here 1 -#define z_here 2 -#define yz_OK 3 -#define y_OK 4 -#define z_OK 5 -#define d_fixed 6 \ - -#define none_seen 0 -#define y_seen 6 -#define z_seen 12 \ - -#define synch_h if(cur_h!=dvi_h) \ -{movement(cur_h-dvi_h,right1) ;dvi_h= cur_h; \ -} -#define synch_v if(cur_v!=dvi_v) \ -{movement(cur_v-dvi_v,down1) ;dvi_v= cur_v; \ -} \ - -#define billion float_constant(1000000000) -#define vet_glue(A) glue_temp= A; \ -if(glue_temp> billion) \ -glue_temp= billion; \ -else if(glue_temp<-billion) \ -glue_temp= -billion \ - -#define exactly 0 -#define additional 1 -#define natural 0,additional \ - -#define vpack(A,B) vpackage(A,B,max_dimen) \ - -#define noad_size 4 -#define nucleus(A) A+1 -#define supscr(A) A+2 -#define subscr(A) A+3 -#define math_type(A) link(A) -#define fam font -#define math_char 1 -#define sub_box 2 -#define sub_mlist 3 -#define math_text_char 4 \ - -#define ord_noad (unset_node+3) -#define op_noad (ord_noad+1) -#define bin_noad (ord_noad+2) -#define rel_noad (ord_noad+3) -#define open_noad (ord_noad+4) -#define close_noad (ord_noad+5) -#define punct_noad (ord_noad+6) -#define inner_noad (ord_noad+7) -#define limits 1 -#define no_limits 2 \ - -#define left_delimiter(A) A+4 -#define right_delimiter(A) A+5 -#define radical_noad (inner_noad+1) -#define radical_noad_size 5 -#define fraction_noad (radical_noad+1) -#define fraction_noad_size 6 -#define small_fam(A) mem[A].qqqq.b0 -#define small_char(A) mem[A].qqqq.b1 -#define large_fam(A) mem[A].qqqq.b2 -#define large_char(A) mem[A].qqqq.b3 -#define thickness(A) width(A) -#define default_code 010000000000 -#define numerator(A) supscr(A) -#define denominator(A) subscr(A) \ - -#define under_noad (fraction_noad+1) -#define over_noad (under_noad+1) -#define accent_noad (over_noad+1) -#define accent_noad_size 5 -#define accent_chr(A) A+4 -#define vcenter_noad (accent_noad+1) -#define left_noad (vcenter_noad+1) -#define right_noad (left_noad+1) -#define delimiter(A) nucleus(A) -#define scripts_allowed(A) (type(A) >=ord_noad) &&(type(A) <left_noad) \ - -#define style_node (unset_node+1) -#define style_node_size 3 -#define display_style 0 -#define text_style 2 -#define script_style 4 -#define script_script_style 6 -#define cramped 1 \ - -#define choice_node (unset_node+2) -#define display_mlist(A) info(A+1) -#define text_mlist(A) link(A+1) -#define script_mlist(A) info(A+2) -#define script_script_mlist(A) link(A+2) \ - -#define text_size 0 -#define script_size 16 -#define script_script_size 32 \ - -#define mathsy_end(A) fam_fnt(2+A) ]].sc -#define mathsy(A) font_info[A+param_base[mathsy_end -#define math_x_height mathsy(5) -#define math_quad dimen_def[math_quad_no] -#define num1 mathsy(8) -#define num2 mathsy(9) -#define num3 mathsy(10) -#define denom1 mathsy(11) -#define denom2 mathsy(12) -#define sup1 mathsy(13) -#define sup2 mathsy(14) -#define sup3 mathsy(15) -#define sub1 mathsy(16) -#define sub2 mathsy(17) -#define sup_drop mathsy(18) -#define sub_drop mathsy(19) -#define delim1 mathsy(20) \ - -#define delim2 mathsy(21) -#define axis_height mathsy(22) -#define total_mathsy_params 22 \ - -#define mathex(A) font_info[A+param_base[fam_fnt(3+cur_size) ]].sc -#define default_rule_thickness mathex(8) -#define big_op_spacing1 mathex(9) -#define big_op_spacing2 mathex(10) -#define big_op_spacing3 mathex(11) -#define big_op_spacing4 mathex(12) -#define big_op_spacing5 mathex(13) -#define total_mathex_params 13 \ - -#define cramped_style(A) 2*(A/2) +cramped -#define sub_style(A) 2*(A/4) +script_style+cramped -#define sup_style(A) 2*(A/4) +script_style+(A%2) -#define num_style(A) A+2-2*(A/6) -#define denom_style(A) 2*(A/2) +cramped+2-2*(A/6) \ - -#define mu_mult(A) nx_plus_y(n,A,xn_over_d(A,f,0200000) ) \ - -#define new_hlist(A) mem[nucleus(A) ].i \ - -#define choose_mlist(A) {p= A(q) ;A(q) = null;} \ - -#define math_spacing \ - \ -"0234000122*4000133**3**344*0400400*000000234000111*1111112341011" \ - \ - -#define u_part(A) mem[A+height_offset].i -#define v_part(A) mem[A+depth_offset].i -#define extra_info(A) info(A+list_offset) \ - -#define preamble link(align_head) -#define align_stack_node_size 5 \ - -#define span_code 256 -#define cr_code 257 -#define cr_cr_code (cr_code+1) -#define end_template_token cs_token_flag+frozen_end_template \ - -#define span_node_size 2 \ - -#define tight_fit 3 \ - -#define loose_fit 1 \ - -#define very_loose_fit 0 \ - -#define decent_fit 2 \ - -#define active_node_size 3 -#define fitness(A) subtype(A) -#define break_node(A) rlink(A) -#define line_number(A) llink(A) -#define total_demerits(A) mem[A+2].i -#define unhyphenated 0 -#define hyphenated 1 -#define last_active active \ - -#define passive_node_size 2 -#define cur_break(A) rlink(A) -#define prev_break(A) llink(A) -#define serial(A) info(A) \ - -#define delta_node_size 7 -#define delta_node 2 \ - -#define do_all_six(A) A(1) ;A(2) ;A(3) ;A(4) ;A(5) ;A(6) \ - -#define check_shrinkage(A) if((shrink_order(A) !=normal) &&(shrink(A) !=0) ) \ -{A= finite_shrink(A) ; \ -} \ - -#define copy_to_cur_active(A) cur_active_width[A]= active_width[A] -#define update_width(A) \ -cur_active_width[A]= cur_active_width[A]+mem[r+A].sc \ - -#define awful_bad 07777777777 \ - -#define set_break_width_to_background(A) break_width[A]= background[A] \ - -#define convert_to_break_width(A) \ -mem[prev_r+A].sc= mem[prev_r+A].sc \ --cur_active_width[A]+break_width[A] -#define store_break_width(A) active_width[A]= break_width[A] -#define new_delta_to_break_width(A) \ -mem[q+A].sc= break_width[A]-cur_active_width[A] \ - -#define new_delta_from_break_width(A) mem[q+A].sc= \ -cur_active_width[A]-break_width[A] \ - -#define combine_two_deltas(A) mem[prev_r+A].sc= mem[prev_r+A].sc+mem[r+A].sc -#define downdate_width(A) cur_active_width[A]= cur_active_width[A]- \ -mem[prev_r+A].sc \ - -#define update_active(A) active_width[A]= active_width[A]+mem[r+A].sc \ - -#define store_background(A) active_width[A]= background[A] \ - -#define act_width active_width[1] -#define kern_break {if(!is_char_node(link(cur_p) ) &&auto_breaking) \ -if(type(link(cur_p) ) ==glue_node) try_break(0,unhyphenated) ; \ -act_width= act_width+width(cur_p) ; \ -} \ - -#define next_break prev_break \ - -#define append_charnode_to_t(A) {link(t) = get_avail() ;t= link(t) ; \ -font(t) = hf;character(t) = A; \ -} -#define set_cur_r {if(j<n) cur_r= qi(hu[j+1]) ;else cur_r= bchar; \ -if(odd(hyf[j]) ) cur_rh= hchar;else cur_rh= non_char; \ -} \ - -#define wrap_lig(A) if(ligature_present) \ -{p= new_ligature(hf,cur_l,link(cur_q) ) ; \ -if(lft_hit) \ -{subtype(p) = 2;lft_hit= false; \ -} \ -if(A) if(lig_stack==null) \ -{incr(subtype(p) ) ;rt_hit= false; \ -} \ -link(cur_q) = p;t= p;ligature_present= false; \ -} -#define pop_lig_stack {if(lig_ptr(lig_stack) > null) \ -{link(t) = lig_ptr(lig_stack) ; \ -t= link(t) ;incr(j) ; \ -} \ -p= lig_stack;lig_stack= link(p) ;free_node(p,small_node_size) ; \ -if(lig_stack==null) set_cur_r else cur_r= character(lig_stack) ; \ -} \ - -#define advance_major_tail {major_tail= link(major_tail) ;incr(r_count) ; \ -} \ - -#define trie_link(A) trie[A].rh -#define trie_char(A) trie[A].b1 -#define trie_op(A) trie[A].b0 \ - -#define set_cur_lang if(language<=0) cur_lang= 0; \ -else if(language> 255) cur_lang= 0; \ -else cur_lang= language \ - -#define trie_root trie_l[0] \ - -#define trie_ref trie_hash -#define trie_back(A) trie[A].lh \ - -#define active_height active_width -#define cur_height active_height[1] -#define set_height_zero(A) active_height[A]= 0 \ - -#define deplorable 100000 \ - -#define inserts_only 1 \ - -#define box_there 2 \ - -#define page_ins_node_size 4 -#define inserting 0 -#define split_up 1 -#define broken_ptr(A) link(A+1) \ - -#define broken_ins(A) info(A+1) -#define last_ins_ptr(A) link(A+2) -#define best_ins_ptr(A) info(A+2) \ - -#define page_goal page_so_far[0] -#define page_total page_so_far[1] -#define page_shrink page_so_far[6] -#define page_depth page_so_far[7] \ - -#define print_plus(A,B) if(page_so_far[A]!=0) \ -{print(" plus ") ;print_scaled(page_so_far[A]) ;print(B) ;} \ - -#define set_page_so_far_zero(A) page_so_far[A]= 0 \ - -#define contrib_tail nest[0].tail_field \ - -#define adjust_space_factor \ -main_s= sf_code(cur_chr) ; \ -if(main_s==1000) space_factor= 1000; \ -else if(main_s<1000) \ -{if(main_s> 0) space_factor= main_s; \ -} \ -else if(space_factor<1000) space_factor= 1000; \ -else space_factor= main_s \ - -#define pack_lig(X) \ -{main_p= new_ligature(main_f,cur_l,link(cur_q) ) ; \ -if(lft_hit) \ -{subtype(main_p) = 2;lft_hit= false; \ -} \ -if(X) if(lig_stack==null) \ -{incr(subtype(main_p) ) ;rt_hit= false; \ -} \ -link(cur_q) = main_p;tail= main_p;ligature_present= false; \ -} \ - -#define wrapup(A) if(cur_l<non_char) \ -{if(link(cur_q) > null) \ -if(character(tail) ==qi(hyphen_char[main_f]) ) ins_disc= true; \ -if(ligature_present) pack_lig(A) ; \ -if(ins_disc) \ -{ins_disc= false; \ -if(mode> 0) tail_append(new_disc() ) ; \ -} \ -} \ - -#define any_mode(A) case vmode+A:case hmode+A: \ -case mmode+A \ - -#define non_math(A) case vmode+A:case hmode+A \ - -#define fil_code 0 -#define fill_code 1 -#define ss_code 2 -#define fil_neg_code 3 -#define skip_code 4 -#define mskip_code 5 \ - -#define box_flag 010000000000 -#define ship_out_flag box_flag+512 -#define leader_flag box_flag+513 -#define box_code 0 -#define copy_code 1 -#define last_box_code 2 -#define vsplit_code 3 -#define vtop_code 4 \ - -#define fam_in_range ((cur_fam>=0) &&(cur_fam<16) ) \ - -#define above_code 0 -#define over_code 1 -#define atop_code 2 -#define delimited_code 3 \ - -#define global (a>=4) -#define define(A,B,C) if(global) geq_define(A,B,C) ;else eq_define(A,B,C) -#define word_define(A,B) if(global) geq_word_define(A,B) ;else eq_word_define(A,B) \ - -#define char_def_code 0 -#define math_char_def_code 1 -#define count_def_code 2 -#define dimen_def_code 3 -#define skip_def_code 4 -#define mu_skip_def_code 5 -#define toks_def_code 6 \ - -#define show_code 0 -#define show_box_code 1 -#define show_the_code 2 -#define show_lists_code 3 \ - -#define too_small(X) {wake_up_terminal; \ -wterm_ln("---! Must increase the %s",X) ; \ - \ -goto bad_fmt; \ -} \ - -#define dump_wd(A) {fmt_file.d= A;put(fmt_file) ;} -#define dump_int(A) {fmt_file.d.i= A;put(fmt_file) ;} -#define dump_hh(A) {fmt_file.d.hh= A;put(fmt_file) ;} -#define dump_qqqq(A) {fmt_file.d.qqqq= A;put(fmt_file) ;} \ - -#define undump_wd(A) {get(fmt_file) ;A= fmt_file.d;} -#define undump_int(A) {get(fmt_file) ;A= fmt_file.d.i;} -#define undump_hh(A) {get(fmt_file) ;A= fmt_file.d.hh;} -#define undump_qqqq(A) {get(fmt_file) ;A= fmt_file.d.qqqq;} -#define undump(A,B,C) {undump_int(x) ;if((x<A) ||(x> B) ) goto bad_fmt;else C= x;} -#define undump_size(A,B,C,D) {undump_int(x) ; \ -if(x<A) goto bad_fmt;if(x> B) too_small(C) else D= x;} \ - -#define dump_four_ASCII \ -w.b0= qi(so(str_pool[k]) ) ;w.b1= qi(so(str_pool[k+1]) ) ; \ -w.b2= qi(so(str_pool[k+2]) ) ;w.b3= qi(so(str_pool[k+3]) ) ; \ -dump_qqqq(w) \ - -#define undump_four_ASCII \ -undump_qqqq(w) ; \ -str_pool[k]= si(qo(w.b0) ) ;str_pool[k+1]= si(qo(w.b1) ) ; \ -str_pool[k+2]= si(qo(w.b2) ) ;str_pool[k+3]= si(qo(w.b3) ) \ - -#define write_node_size 2 -#define open_node_size 3 -#define open_node 0 -#define write_node 1 -#define close_node 2 -#define special_node 3 -#define language_node 4 -#define what_lang(A) link(A+1) -#define what_lhm(A) type(A+1) -#define what_rhm(A) subtype(A+1) -#define write_tokens(A) link(A+1) -#define write_stream(A) info(A+1) -#define open_name(A) link(A+1) -#define open_area(A) info(A+2) -#define open_ext(A) link(A+2) \ - -#define hitex_ext language_node+1 -#define param_node hitex_ext -#define param_node_size 3 -#define param_type(A) type(A+1) -#define int_type 0 -#define dimen_type 1 -#define glue_type 2 -#define param_no(A) subtype(A+1) -#define param_value(A) mem[A+2] \ - -#define par_node hitex_ext+1 -#define par_node_size 5 -#define par_penalty(A) mem[A+1].i -#define par_extent(A) link(A+3) -#define par_params(A) info(A+4) -#define par_list(A) link(A+4) \ - -#define disp_node hitex_ext+2 -#define disp_node_size 3 -#define display_left(A) type(A+1) -#define display_no_bs(A) subtype(A+1) -#define display_params(A) link(A+1) -#define display_formula(A) link(A+2) -#define display_eqno(A) info(A+2) \ - -#define baseline_node hitex_ext+3 -#define baseline_node_size small_node_size -#define baseline_node_no(A) mem[A+1].i \ - -#define image_node hitex_ext+4 -#define image_node_size 6 -#define image_width(A) mem[A+1].sc -#define image_height(A) mem[A+2].sc -#define image_no(A) link(A+3) -#define image_name(A) info(A+3) -#define image_area(A) info(A+4) -#define image_ext(A) link(A+4) -#define image_alt(A) link(A+5) \ - -#define hpack_node hitex_ext+5 -#define vpack_node hitex_ext+6 -#define pack_node_size box_node_size -#define pack_m(A) type(A+list_offset) -#define pack_limit(A) mem[(A) +1+list_offset].sc -#define pack_extent(A) link(A+2+list_offset) \ - -#define hset_node hitex_ext+7 -#define vset_node hitex_ext+8 -#define set_node_size box_node_size -#define set_stretch_order glue_sign -#define set_shrink_order glue_order -#define set_stretch(A) mem[(A) +1+list_offset].sc -#define set_extent(A) pack_extent(A) -#define set_shrink(A) mem[(A) +3+list_offset].sc \ - -#define align_node hitex_ext+9 -#define align_node_size 4 -#define align_extent(A) link(A+2) -#define align_m(A) type(A+2) -#define align_v(A) subtype(A+2) -#define align_preamble(A) info(A+3) -#define align_list(A) link(A+3) \ - -#define setpage_node hitex_ext+10 -#define setpage_node_size 6 -#define setpage_name(A) link(A+1) -#define setpage_number(A) type(A+1) -#define setpage_id(A) subtype(A+1) -#define setpage_priority(A) info(A+2) -#define setpage_topskip(A) link(A+2) -#define setpage_depth(A) mem[A+3].sc -#define setpage_height(A) info(A+4) -#define setpage_width(A) link(A+4) -#define setpage_list(A) info(A+5) -#define setpage_streams(A) link(A+5) \ - -#define setstream_node hitex_ext+11 -#define setstream_node_size 6 -#define setstream_number(A) type(A+1) -#define setstream_insertion(A) subtype(A+1) -#define setstream_mag(A) link(A+1) -#define setstream_preferred(A) type(A+2) -#define setstream_next(A) subtype(A+2) -#define setstream_ratio(A) link(A+2) -#define setstream_max(A) info(A+3) -#define setstream_width(A) link(A+3) -#define setstream_topskip(A) info(A+4) -#define setstream_height(A) link(A+4) -#define setstream_before(A) info(A+5) -#define setstream_after(A) link(A+5) \ - -#define stream_node hitex_ext+12 -#define stream_node_size 2 -#define stream_number(A) type(A+1) -#define stream_insertion(A) subtype(A+1) \ - -#define stream_after_node hitex_ext+13 -#define stream_before_node hitex_ext+14 \ - -#define xdimen_node hitex_ext+15 -#define xdimen_node_size 4 -#define xdimen_ref_count(A) link(A) -#define xdimen_width(A) mem[A+1].sc -#define xdimen_hfactor(A) mem[A+2].sc -#define xdimen_vfactor(A) mem[A+3].sc \ - -#define ignore_node hitex_ext+16 -#define ignore_node_size small_node_size -#define ignore_info(A) type(A+1) -#define ignore_list(A) link(A+1) \ - -#define label_node hitex_ext+17 -#define label_node_size 2 -#define label_has_name(A) type(A+1) -#define label_where(A) subtype(A+1) -#define label_ptr(A) link(A+1) -#define label_ref(A) link(A+1) \ - -#define start_link_node hitex_ext+18 -#define end_link_node hitex_ext+19 -#define link_node_size 2 \ - -#define outline_node hitex_ext+20 -#define outline_node_size 4 -#define outline_ptr(A) link(A+2) -#define outline_depth(A) mem[A+3].i \ - \ - -#define immediate_code 4 -#define set_language_code 5 \ - -#define adv_past(A) {} \ - -#define end_write_token cs_token_flag+end_write \ - - -#line 25710 "htex.w" - -enum{/*11:*/ -#line 374 "htex.w" - -mem_max= 65534, - - -mem_min= 0, - - -buf_size= 2048, - - -error_line= 72, -half_error_line= 42, - -max_print_line= 79, -stack_size= 200, -max_in_open= 6, - -font_max= 255, - -font_mem_size= 65535, -param_size= 60, -nest_size= 400, -max_strings= 30000, -string_vacancies= 75000, - - -pool_size= 400000, - - - -save_size= 600, - -trie_size= 65534, - -trie_op_size= 65534, -dvi_buf_size= 8, -file_name_size= 1024, -empty_string= 256 - -/*:11*/ -#line 25711 "htex.w" -}; -/*18:*/ -#line 514 "htex.w" - -typedef uint8_t ASCII_code; - -/*:18*//*25:*/ -#line 750 "htex.w" - -typedef uint8_t eight_bits; -typedef struct{FILE*f;text_char d;}alpha_file; -typedef struct{FILE*f;eight_bits d;}byte_file; - -/*:25*//*38:*/ -#line 1111 "htex.w" - -typedef int32_t pool_pointer; -typedef int16_t str_number; -typedef uint8_t packed_ASCII_code; - -/*:38*//*104:*/ -#line 2206 "htex.w" - -typedef int scaled; -typedef int32_t nonnegative_integer; -typedef int8_t small_number; - -/*:104*//*113:*/ -#line 2417 "htex.w" - -#if __SIZEOF_FLOAT__==4 -typedef float float32_t; -#else -#error float type must have size 4 -#endif -typedef float glue_ratio; - -/*:113*//*117:*/ -#line 2526 "htex.w" - -typedef uint8_t quarterword; -typedef uint16_t halfword; -typedef int8_t two_choices; -typedef int8_t four_choices; -typedef struct{ -halfword rh; -union{ -halfword lh; -struct{quarterword b0;quarterword b1;}; -};}two_halves; -typedef struct{ -quarterword b0; -quarterword b1; -quarterword b2; -quarterword b3; -}four_quarters; -typedef struct{ -union{ -int i; -glue_ratio gr; -two_halves hh; -four_quarters qqqq; -};}memory_word; -typedef struct{FILE*f;memory_word d;}word_file; - -/*:117*//*155:*/ -#line 3257 "htex.w" - -typedef int8_t glue_ord; - -/*:155*//*221:*/ -#line 4420 "htex.w" - -typedef struct{int16_t mode_field; -pointer head_field,tail_field; -int pg_field; -pointer bs_field,ls_field; -scaled lsl_field; -uint8_t*bs_pos; -scaled hs_field; -scaled ds_field,dw_field,di_field; -scaled ht_field; -uint32_t np_field; -memory_word aux_field; -}list_state_record; - -/*:221*//*279:*/ -#line 6009 "htex.w" - -typedef int8_t group_code; - -/*:279*//*310:*/ -#line 6588 "htex.w" - -typedef struct{ -quarterword state_field,index_field; -halfword start_field,loc_field,limit_field,name_field; -}in_state_record; - -/*:310*//*558:*/ -#line 10870 "htex.w" - -typedef uint8_t internal_font_number; -typedef uint16_t font_index; - -/*:558*//*605:*/ -#line 12062 "htex.w" - -typedef int8_t dvi_index; - -/*:605*//*944:*/ -#line 18331 "htex.w" - -typedef uint16_t trie_pointer; - -/*:944*//*949:*/ -#line 18400 "htex.w" - -typedef int16_t hyph_pointer; - -/*:949*/ -#line 25712 "htex.w" - -extern void list_init(void); -extern void hpack_page(void); -extern void happend_insertion(pointer p); -extern bool hbuild_page(void); -extern void hdisplay(pointer p,pointer a,bool l); -extern void mem_init(void); -extern pointer copy_node_list(pointer p); -extern void flush_node_list(pointer p); -extern -pointer vpackage(pointer p,scaled h,small_number m,scaled l); -extern pointer hpack(pointer p,scaled w,small_number m); -extern pointer new_math(scaled w,small_number s); -extern pointer new_ligature(quarterword f,quarterword c,pointer q); -extern pointer new_penalty(int m); -extern pointer new_spec(pointer p); -extern pointer new_kern(scaled w); -extern pointer new_disc(void); -extern pointer new_null_box(void); -extern pointer new_rule(void); -extern pointer new_glue(pointer q); -extern pointer new_character(internal_font_number f,eight_bits c); -extern int*const char_base; -extern int*const width_base; -extern memory_word font_info[]; -extern scaled*const font_size; -extern char**const font_name; -extern void hclear_fonts(void); -extern void read_font_info(int f,char*nom,scaled s); -extern list_state_record cur_list; -extern pointer get_node(int s); -extern pointer lo_mem_max; -extern pointer hi_mem_min; -extern memory_word*const mem; -extern pointer just_box; -extern void append_to_vlist(pointer b,uint32_t offset); -extern pointer adjust_tail; -extern void freeze_page_specs(small_number s); -extern pointer page_tail; -extern scaled best_height_plus_depth; -extern halfword badness(scaled t,scaled s); -extern void show_box(pointer p); -extern pointer temp_ptr; -extern scaled best_size; -extern pointer best_page_break; -extern int least_page_cost; -extern int insert_penalties; -extern scaled page_so_far[]; -extern int page_contents; -extern scaled page_max_depth; -extern int nest_ptr; -extern void pop_nest(void); -extern void push_nest(void); -extern void delete_glue_ref(pointer p); -void line_break(int final_widow_penalty,pointer par_ptr);/*:1410*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/main.c b/Build/source/texk/web2c/hitexdir/hintview/src/main.c deleted file mode 100644 index 4b997020c9d..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/main.c +++ /dev/null @@ -1,606 +0,0 @@ -/* This file is part of HINT - * Copyright 2017-2021 Martin Ruckert, Hochschule Muenchen, Lothstrasse 64, 80336 Muenchen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT - * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Except as contained in this notice, the name of the copyright holders shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization from the - * copyright holders. - */ -#include <stdio.h> -#include <stdlib.h> -#include <setjmp.h> -#include <string.h> -#include <stdarg.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <math.h> - -#include <GL/glew.h> -#include <GLFW/glfw3.h> - -#define VERSION 1 -#define REVISION 3 -#define PATCHLEVEL 1 - -#include "error.h" -#include "basetypes.h" -#include "format.h" -#include "get.h" -#include "hint.h" -#include "hrender.h" -#include "rendernative.h" - -/* Error Handling */ -int hint_error(const char *title, const char *message) -{ fprintf(stderr,"ERROR %s: %s\n",title,message); - return 0; -} - -int hmessage(char *title, char *format, ...) -{ va_list vargs; - va_start(vargs,format); - vfprintf(stderr, format, vargs); - return 0; -} - -void error_callback(int error, const char* description) -{ hint_error("OpenGL",description); - longjmp(hint_error_exit,1); -} - -GLFWwindow* window; -#define SCALE_MIN 0.2 -#define SCALE_NORMAL 1.0 -#define SCALE_MAX 5.0 -double scale=SCALE_NORMAL; -uint64_t pos; /* position of current page */ - - -/* Getting the dpi for a window is not as simple as one might think, - because windows might dynamically move between monitors. - - - To get a list of monitors use: - int monitor_count; - GLFWmonitor** monitors = glfwGetMonitors(&monitor_count); - - To get notified about connecting or disconnecting of monitors use: - glfwSetMonitorCallback(monitor_callback) - the callback should refresh the pointer and count returned - from glfwGetMonitors. - - for a monitor, we can get: - - - its physical size: - int width_mm, height_mm; - glfwGetMonitorPhysicalSize(monitor, &width_mm, &height_mm); - - - its position (upper left) in screen coordinates: - int xpos, ypos; - glfwGetMonitorPos(monitor, &xpos, &ypos); - - - its video mode: - GLFWvidmode* mode = glfwGetVideoMode(monitor); - - and through the video mode the mode->width and mode->height - in screen coordinates. - - Using this information, we can - - get the area of a monitor by its position width and height - in screen coordinates and - - convert screen coordinates - for the monitor into physical coordinates. - - To determine the monitor where a window is currently displayed - screen coordinates must be used. - - we get the window size in screen coordinates using: - int width, height; - glfwGetWindowSize(window, &width, &height); - - we get the window position (upper left) in screen coordinates using: - int xpos, ypos; - glfwGetWindowPos(window, &xpos, &ypos); - - Matching the window position against the monitor area we can find - the monitor on which we have the window position. - - Using the information about the monitor, we can convert the - size of the window from screen coordinates to physical sizes. - - To obtain the resolution of a window we use the size of the - windows framebuffer, which is in pixels either with - int width, height; - glfwGetFramebufferSize(window, &width, &height); - - or by getting a notification using: - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - - void framebuffer_size_callback(GLFWwindow* window, int width, int height) - { - glViewport(0, 0, width, height); - } - -*/ - -/* Monitors */ -static int monitor_count; -static GLFWmonitor** monitors; - -static void monitor_callback(GLFWmonitor* monitor, int event) -{ monitors=glfwGetMonitors(&monitor_count); - if (monitors==NULL || monitor_count==0) - error_callback(0,"Unable to find a monitor"); - LOG("monitors %d\n",monitor_count); -} - -static void init_monitors(void) -{ monitor_callback(NULL,0); - glfwSetMonitorCallback(monitor_callback); -} - -static int m_width, m_height; -int width_mm, height_mm; - -static int find_monitor(int x, int y) -/* return monitor for screen coordinates (x, y) */ -{ int i; - for (i=0; i< monitor_count; i++) - { int mx, my; - glfwGetMonitorPos(monitors[i], &mx, &my); - if (x>= mx && y >= my ) - { const GLFWvidmode *mode = glfwGetVideoMode(monitors[i]); - if (x <= mx+mode->width && y<=my+mode->height) - { m_width=mode->width; m_height=mode->height; - glfwGetMonitorPhysicalSize(monitors[i], &width_mm, &height_mm); - LOG("Monitor pos: %d x %d, size: %d x %d, %dmm x %dmm\n",mx,my,m_width,m_height,width_mm, height_mm); - return i; - } - } - } - return 0; -} - -int px_h=1024, px_v=768; // size in pixel -double x_dpi, y_dpi; - -void set_dpi(GLFWwindow* window, int px, int py) -{ int wx, wy, ww, wh; - glfwGetWindowPos(window, &wx, &wy); - glfwGetWindowSize(window, &ww, &wh); - find_monitor(wx,wy); - x_dpi=25.5*px*m_width/width_mm/ww; - y_dpi=25.5*py*m_height/height_mm/wh; - LOG("Window pos: %d x %d, size: %d x %d, %dpx x %dpx\n",wx, wy,ww,wh,px,py); - LOG("dpi: %f x %f\n",x_dpi,y_dpi); -} - -void framebuffer_size_callback(GLFWwindow* window, int w, int h) -{ px_h=w; px_v=h; - glViewport(0, 0, w, h); - set_dpi(window,w,h); - //LOG("w=%d, h=%d\n",w,h); - hint_resize(px_h,px_v,scale*x_dpi,scale*y_dpi); - hint_page(); -} - -void init_dpi(GLFWwindow* window) -{ int px,py; - glfwGetFramebufferSize(window, &px, &py); - set_dpi(window,px,py); -} - -void hint_unmap(void) -{ hget_unmap(); -} - -bool hint_map(void) -{ return hget_map(); -} - -int open_file(int home) -{ hint_clear_fonts(true); - if (!hint_begin()) return 0; - if (home) - hint_page_home(); - else - hint_page_top(0); - // strncpy(title_name,hin_name,MAX_PATH); - // SetNavigationTree(); - //SetWindowText(hMainWnd,title_name); -return 1; -} - -static void reload_file(void) -{ double fpos=hint_get_fpos(); - hint_begin(); - pos=hint_set_fpos(fpos); - //LOG("reloading...\n"); -} - -static int new_file_time(void) -{ struct stat st; - if (hin_name!=NULL && - stat(hin_name,&st)==0 && - st.st_size>0) - { - //LOG("file %s %lu\n",hin_name,st.st_mtime); - if (st.st_mtime>hin_time) - return 1; - else - return 0; - } - return 0; -} - - -static int set_hin_name(char *fn) -{ size_t sl; - if (hin_name!=NULL) { free(hin_name); hin_name=NULL; } - { hin_name=malloc(strlen(fn)+1); - if (hin_name==NULL) - { hint_error("Out of memory for file name", fn); - return 0; - } - strcpy(hin_name,fn); - } - sl=strlen(hin_name); - if (sl>4 && strncmp(hin_name+sl-4,".hnt",4)!=0) - { hint_error("Unknown File Type,I dont know how to open this file", hin_name); - return 0; - } - return 1; -} - -#if (WITH_GTK==2) || (WITH_GTK==3) -#include <gtk/gtk.h> - -static int file_chooser(void) -{ GtkWidget *dialog; - GtkFileFilter *filter; - gint res; - - if ( !gtk_init_check( NULL, NULL ) ) - { fprintf(stderr,"ERROR: Unable to initialize GTK\n"); - return 0; - } - - dialog = gtk_file_chooser_dialog_new ("Open File", - NULL,/* no parent */ - GTK_FILE_CHOOSER_ACTION_OPEN, - "_Cancel", GTK_RESPONSE_CANCEL, - "_Open", GTK_RESPONSE_ACCEPT, - NULL); - - filter = gtk_file_filter_new(); - gtk_file_filter_set_name( filter, "HINT file" ); - gtk_file_filter_add_pattern( filter, "*.hnt"); - gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter ); - - res = gtk_dialog_run (GTK_DIALOG (dialog)); - if (res == GTK_RESPONSE_ACCEPT) - { char *fn; - fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); - res=set_hin_name(fn); - g_free (fn); - } - else - res=0; - gtk_widget_destroy (dialog); - while (gtk_events_pending()) gtk_main_iteration(); - return res; -} -#else -static int file_chooser(void) -{ return 0; } -#endif - - -static int set_input_file(char *fn) -{ - if (fn!=NULL) - return set_hin_name(fn); - else - return file_chooser(); -} - -int dark = 0, loading=0, autoreload=0, home=0; - -int usage(void) -{ return hint_error("Usage:", "hintview [options] file\n" - "Call 'hintview --help' for details.\n"); -} - -int help(void) -{ fprintf(stdout,"%s", - "Usage: hintview [options] file\n" - "Options:\n" - " -a Start in autoreload mode.\n" - " -h Start with the documents home page.\n" - " -n Start in night mode.\n" -#if 0 - " -o Show the documents outline.\n" -#endif - " -z Start with zoom level 100%.\n" - " --help Display this message.\n" - " --version Display the version.\n" - "\n" - "See the hintview man page for more details.\n" - ); - return 0; -} - -int command_line(int argc, char *argv[]) -{ int i; - for (i=1; argv[i]!=NULL && argv[i][0]=='-'; i++) - { switch (argv[i][1]) - { case '-': - if (strcmp(argv[i]+2,"help")==0) return help(); - else if (strcmp(argv[i]+2,"version")==0) - { fprintf(stdout,"hintview version %d.%d.%d\n", VERSION, REVISION, PATCHLEVEL); - return 0; - } - else - return usage(); - case 'a': autoreload=1; break; - case 'd': - i++; if (argv[i]==NULL) debugflags = -1; - else debugflags=strtol(argv[i],NULL,16); - break; - case 'n': dark=1; break; - case 'o': break; - case 'z': scale=SCALE_NORMAL; break; - case 'h': home=1; break; - default: return usage(); - } - } - if (!set_input_file(argv[i])) - return usage(); - return 1; -} - -GLFWcursor *drag_cursor, *hand_cursor, *arrow_cursor; -int mouse_down=0, drag=0, on_link=0; - -void clear_cursor(void) -{ if (on_link||drag) - { glfwSetCursor(window, arrow_cursor); on_link=drag=0;} -} - -/* combining the key with the shift, control, alt or super flag */ -#define KEY_MOD(K,M) (((K)<<4)|((M)&0xF)) -#define KEY(K) KEY_MOD(K,0) -#define CTRL(K) KEY_MOD(K,GLFW_MOD_CONTROL) - -void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) -{ if (action!=GLFW_PRESS) return; - switch (KEY_MOD(key,mods)) { - case CTRL(GLFW_KEY_Q): - glfwSetWindowShouldClose(window,1); - break; - case CTRL(GLFW_KEY_N): - dark=!dark; - hint_dark(dark); - break; - case KEY(GLFW_KEY_HOME): - case CTRL(GLFW_KEY_H): - hint_page_home(); - clear_cursor(); - break; - case CTRL(GLFW_KEY_Z): - case CTRL(GLFW_KEY_Y): /* US keyboard */ - scale=SCALE_NORMAL; - hint_resize(px_h,px_v,scale*x_dpi,scale*y_dpi); - hint_page(); - hint_clear_fonts(true); - clear_cursor(); - break; - case KEY(GLFW_KEY_PAGE_DOWN): - pos=hint_page_next(); - hint_page(); - clear_cursor(); - break; - case KEY(GLFW_KEY_PAGE_UP): - pos=hint_page_prev(); - hint_page(); - clear_cursor(); - break; - case CTRL(GLFW_KEY_A): /* auto reload */ - autoreload=!autoreload; - if (!autoreload) - break; /* else fall through to reload */ - case CTRL(GLFW_KEY_R): /* reload */ - if (!loading) - { loading=1; - HINT_TRY reload_file(); - loading=0; - } - clear_cursor(); - break; - case CTRL(GLFW_KEY_S): /* search */ - break; - case CTRL(GLFW_KEY_F): /* file */ - if (set_input_file(NULL)) - open_file(home); - break; - case CTRL(GLFW_KEY_O): /* outlines */ - default: - // LOG("key %d, scan %d, action %d, mosd %d\n",key, scancode, action, mods); - break; - } -} - -/* convert pixel to scaled points (including scale) */ - -#define PX2SP(X,DPI) floor((X)*ONE*72.27/((DPI)*scale)) - -void mouse_click(void) -{ double x,y; - int link; - glfwGetCursorPos(window, &x, &y); - //LOG("xy= %fx%f\n", x,y); - HINT_TRY { - link=hint_find_link(PX2SP(x,x_dpi),PX2SP(y,y_dpi),2*ONE); - if (link>=0) - { hint_link_page(link); - clear_cursor(); - } - } -} - -double x_start, y_start, xy_start, scale_start, time_start; -#define DELTA_T 0.4 -#define DELTA_XY 16.0 - -static void cursor_position_callback(GLFWwindow* window, double x, double y) -{ //LOG("xy= %fx%f\n", x-x_start,y-y_start); - double f; - if (!mouse_down) - { int link; - link=hint_find_link(PX2SP(x,x_dpi),PX2SP(y,y_dpi),2*ONE); - if (link>=0 && !on_link) - { glfwSetCursor(window, hand_cursor); on_link=1; } - else if (link<0 && on_link) - { glfwSetCursor(window, arrow_cursor); on_link=0; } - return; - } - if (!drag) /* we dont know whether this is a click or a drag */ - { double d = (x-x_start)*(x-x_start)+(y-y_start)*(y-y_start); - if (d<= DELTA_XY) - { double t=glfwGetTime(); - if (t<=time_start+DELTA_T) - return; - } - /* start dragging */ - drag=1; - glfwSetCursor(window, drag_cursor); - xy_start=x_start*x_start+y_start*y_start; - } - /* dragging */ - f=(x_start*x+y_start*y)/xy_start; /* projection of (x,y) on (x_start,y_start) */ - scale=scale_start*f; - if (scale < SCALE_MIN) scale=SCALE_MIN; - if (scale > SCALE_MAX) scale=SCALE_MAX; - hint_resize(px_h,px_v,scale*x_dpi,scale*y_dpi); - hint_page(); -} - - -void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) -{ if (button == GLFW_MOUSE_BUTTON_LEFT) - { if (action == GLFW_PRESS) - { glfwGetCursorPos(window, &x_start, &y_start); - time_start=glfwGetTime(); - scale_start=scale; - drag=0; - mouse_down =1; - } - else if (action == GLFW_RELEASE) - { mouse_down=0; - if (drag) /* end dragging */ - { hint_clear_fonts(true); - clear_cursor(); - } - else - mouse_click(); - } - } -} - -void cursor_enter_callback(GLFWwindow* window, int entered) -{ if (entered && autoreload && new_file_time()) - reload_file(); - //LOG("entered=%d auto=%d\n",entered, autoreload); -} - -int create_window(void) -{ if( !glfwInit() ) - { - hint_error("GLFW", "Failed to initialize GLFW\n" ); - getchar(); - return 0; - } - glfwSetErrorCallback(error_callback); - glfwWindowHint(GLFW_SAMPLES, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - - /* Open a window and create its OpenGL context */ - window = glfwCreateWindow( px_h, px_v, "HintView", NULL, NULL); - if( window == NULL ){ - hint_error("GLFW","Failed to open GLFW window.\n" - "If you have an Intel GPU, they are not 3.3 compatible.\n" - "Try the 2.1 version of the tutorials.\n" ); - glfwTerminate(); - return 0; - } - glfwMakeContextCurrent(window); - - glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); - - drag_cursor = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR); - hand_cursor = glfwCreateStandardCursor(GLFW_HAND_CURSOR); - arrow_cursor = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); - - //getDPI(); - init_monitors(); - init_dpi(window); - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - glfwSetKeyCallback(window, key_callback); - glfwSetCursorEnterCallback(window,cursor_enter_callback); - glfwSetMouseButtonCallback(window, mouse_button_callback); - glfwSetCursorPosCallback(window, cursor_position_callback); - - glfwSetCursorPos(window, px_h/2, px_v/2); - - hint_render_on(); - return 1; -} - -int main(int argc, char *argv[]) -{ hlog=stderr; - if (setjmp(hint_error_exit)!=0) return 1; - if (!command_line(argc,argv)) - return 1; - if (!create_window()) - return 1; - nativeSetDark(dark); - hint_resize(px_h,px_v,scale*x_dpi,scale*y_dpi); - if (!open_file(home)) - return 1; - if (setjmp(hint_error_exit)==0) - do - { hint_render(); - glfwSwapBuffers(window); - glfwWaitEvents(); - } // Check if the ESC key was pressed or the window was closed - while(glfwWindowShouldClose(window) == 0 ); - nativeClear(); - glfwDestroyWindow(window); // part of glfwTerminate - glfwTerminate(); - return 0; -} - diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/main.h b/Build/source/texk/web2c/hitexdir/hintview/src/main.h deleted file mode 100644 index dda8b57824c..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/main.h +++ /dev/null @@ -1,49 +0,0 @@ -/* This file is part of HINT - * Copyright 2017-2021 Martin Ruckert, Hochschule Muenchen, Lothstrasse 64, 80336 Muenchen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT - * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Except as contained in this notice, the name of the copyright holders shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization from the - * copyright holders. - */ -#ifndef MAIN_H -#define MAIN_H - -#define VERSION "Version 1.1" - -/* colors foreground and background for day and night mode */ -#define RGB(R,G,B) (((((R)<<8)| G)<<8) | B) -#define GET_R(C) (((C)>>16)&0xFF) -#define GET_G(C) (((C)>>8)&0xFF) -#define GET_B(C) ((C)&0xFF) -#define FG_DAY RGB(0x00,0x00,0x00) /* black */ -#define BG_DAY RGB(0xFF,0xFF,0xFF) /* white */ -#define FG_NIGHT RGB(0xFF,0xFF,0xE8) /* warm white */ -#define BG_NIGHT RGB(0x00,0x00,0x08) /* dark blue */ - -#define BF_ON_DAY RGB(0xD0,0xD0,0xD0) /* lighter grey */ -#define BF_OFF_DAY RGB(0xA0,0xA0,0xA0) /* light grey */ -#define BF_ON_NIGHT RGB(0x90,0x90, 0x90) /* medium grey */ -#define BF_OFF_NIGHT RGB(0x60,0x60, 0x60) /* dark grey */ - - -#endif /*MAIN_H*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/renderOGL.c b/Build/source/texk/web2c/hitexdir/hintview/src/renderOGL.c deleted file mode 100644 index 4ed424e7073..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/renderOGL.c +++ /dev/null @@ -1,599 +0,0 @@ -/* This file is part of HINT - * Copyright 2017-2021 Martin Ruckert, Hochschule Muenchen, Lothstrasse 64, 80336 Muenchen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT - * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Except as contained in this notice, the name of the copyright holders shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization from the - * copyright holders. - */ - -#include <GL/glew.h> -#include "basetypes.h" -#include "main.h" -#include "error.h" -#include <ft2build.h> -#include FT_FREETYPE_H -#include "hint.h" -#include "hfonts.h" -#include "hrender.h" -#include "rendernative.h" -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - - -#ifdef DEBUG -static void printGLString(const char *name, GLenum s) { - const char *v = (const char *) glGetString(s); - LOG("GL %s = %s\n", name, v); -} - -static void checkGlError(const char *op) -{ GLint error; - while( (error= glGetError())!= GL_NO_ERROR) - MESSAGE("OGL Error after %s: 0x%x\n", op, error); -} -#else -#define printGLString(N,S) (void)0 -#define checkGlError(OP) (void)0 -#endif - -#define MAX_INFOLOG 512 -static GLuint ProgramID, MatrixID, RuleID, GammaID, FGcolorID, IsImageID, ImageID=0; - -#define xyID 0 -#define uvID 1 - -#define STR(X) QUOTE(X) -#define QUOTE(X) #X -static const char VertexShader[]= - "#version 330 core\n" - /* Input */ - "layout(location = " STR(xyID) ") in vec2 vertexXY;\n" - "layout(location = " STR(uvID) ") in vec2 vertexUV;\n" - /* output */ - "out vec2 UV;\n" - /* Constants for the current triangles */ - "uniform mat4 MVP;\n" - - "void main() {\n" - "gl_Position = MVP * vec4(vertexXY,-1.0f,1.0f);\n" - "UV = vertexUV;\n" - "}\n"; - - -static const char FragmentShader[]= - "#version 330 core\n" - - /* Input */ - "in vec2 UV;\n" - /* Output */ - "out vec4 color;\n" - /* Constants for the current triangles */ - "uniform sampler2D theTexture;\n" - "uniform vec3 FGcolor;\n" - "uniform float Gamma;\n" - "uniform int IsImage;\n" - - "void main()\n" - "{ vec4 texColor = texture2D( theTexture, UV );\n" - "if (IsImage==1) color = texColor;\n" - "else\n" - "{ color.a = pow(texColor.r,Gamma);\n" - "color.rgb = FGcolor;\n" - "}\n" - "}\n" -; - -/* The Fragment shader should do Gamma correct (GC) blending. - The theory says transform FGcolor and BGcolor to linear space - FGlin = pow(FGcolor,2.2); BGlin=pow(BGcolor,2.2); - BlendLin = FGlin*alpha + BGlin*(1-alpha); - Blend = pow(BlendLin,1/2.2); - - But, the alpha values delivered by the freetype font rasterizer - are actually brightness values! And our foreground and background - values are pretty much either black (0.0) or white (1.0) or plain - Blue (0.0,0.0,1.0) or things like that. So pow(FGcolor,2.2) will do - nothing or little to them. But we should transform the alpha to - linear space before blending. So we have - AlphaLin = pow(alpha,2.2) - BlendLin = FGcolor*alphaLin + BGcolor*(1-AlphaLin); - Blend = pow(BlendLin, 1/2.2); - The last line will be done automatically by the hardware if we specify - an GL_FRAMBUFFER_SRGB. The second last line is the normal blending - if we change the alpha value to linear. - Using this will require that images are also converted to linear textures - in sRGB space. -*/ - -static GLuint loadShader(GLenum type, char const *source) -{ GLuint shaderID; - GLint result =GL_FALSE; - - /* Compile and check vertex shader */ - shaderID = glCreateShader(type); - glShaderSource(shaderID, 1, &source , NULL); - glCompileShader(shaderID); - glGetShaderiv(shaderID, GL_COMPILE_STATUS, &result); - if (!result) - { char InfoLog[MAX_INFOLOG]; - glGetShaderInfoLog(shaderID, MAX_INFOLOG, NULL, InfoLog); - QUIT("Error compiling shader (%d): %s\n", type, InfoLog); - } - return shaderID; -} - -static void createProgram(void) -{ GLuint vertexID=loadShader(GL_VERTEX_SHADER,VertexShader); - GLuint fragmentID=loadShader(GL_FRAGMENT_SHADER,FragmentShader); - GLint result =GL_FALSE; - - if (!vertexID || !fragmentID) return; - - /* Create, linking, and check the program */ - ProgramID = glCreateProgram(); - glAttachShader(ProgramID, vertexID); - glAttachShader(ProgramID, fragmentID); - glLinkProgram(ProgramID); - glGetProgramiv(ProgramID, GL_LINK_STATUS, &result); - if (!result) - { char InfoLog[MAX_INFOLOG]; - glGetProgramInfoLog(ProgramID, MAX_INFOLOG, NULL, InfoLog); - QUIT("Error linking shader program: %s\n", InfoLog); - } - - glDetachShader(ProgramID, vertexID); - glDetachShader(ProgramID, fragmentID); - - glDeleteShader(vertexID); - glDeleteShader(fragmentID); - //LOG("createProgram Done\n"); -} - -/* the 4x4 Model-View-Projection Matrix */ -static GLfloat MVP[4][4] = { - {0.5, 0.0, 0.0, 0.0 }, // x scale - {0.0, 0.5, 0.0, 0.0 }, // y scale - {0.0, 0.0, 0.0, 0.0 }, // z scale - {0.0, 0.0, 0.0, 1.0 }}; // translation x, y, z - -/* The XY coordinates */ -static GLfloat xy[6][2] = { - {-1.0f, 1.0f}, // top left - {-1.0f, -1.0f}, //bot left - {1.0f, -1.0f}, // bot right - - {1.0f, 1.0f}, //top right - {-1.0f, 1.0f}, //top left - {1.0f, -1.0f} //bot right -}; - -/* The UV coordinates */ -static const GLfloat uv[6][2] = { - {0.0f, 1.0f}, //left top - {0.0f, 0.0f}, //left bot - {1.0f, 0.0f}, //right bot - - {1.0f, 1.0f}, //right top - {0.0f, 1.0f}, //left top - {1.0f, 0.0f} //right bot -}; - -static GLuint xybuffer, uvbuffer; - - -static void mkRuleTexture() /* the texture used for rules */ -{ -#define NO_TEST 1 -#if NO_TEST - GLubyte rule[1][1][1]={{{0xFF}}}; - /* for testing only */ -#else /* for testing only */ - GLubyte rule[2][2][3]={{{0}}}; - rule[0][0][0]=0xFF; // red top left - rule[0][1][0]=rule[0][1][1]=0xFF; // yellow top right - rule[1][0][2]=0xFF; // blue bottom left - rule[1][1][1]=0xFF; // green bottom right -#endif - // Create one OpenGL texture - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // select byte alignment - checkGlError("glPixelStorei"); - - glGenTextures(1, &RuleID); - glBindTexture(GL_TEXTURE_2D, RuleID); - checkGlError("glBindTexture RuleID"); - -#if NO_TEST - glTexImage2D(GL_TEXTURE_2D, 0,GL_R8, 1, 1 , 0, GL_RED, GL_UNSIGNED_BYTE, rule); -#else - glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 2, 2 , 0, GL_RGB, GL_UNSIGNED_BYTE, rule); -#endif - checkGlError("glTeXImage2D Rule"); - /* Set texture options */ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - //LOG("mkRuleTexture Done\n"); -} - - -void nativeInit(void) -{ GLuint VertexArrayID; - static int glewInitialized=0; - /* Initialize GLEW */ - glewExperimental = true; /* Needed for core profile */ - if (!glewInitialized &&glewInit() != GLEW_OK) - QUIT("Failed to initialize GLEW\n"); - glewInitialized=1; - while(glGetError()!= GL_NO_ERROR) - continue; /* ignore errors in glewInit */ - - printGLString("Version", GL_VERSION); - printGLString("Vendor", GL_VENDOR); - printGLString("Renderer", GL_RENDERER); - printGLString("Extensions", GL_EXTENSIONS); - - /* Create the vertex array object (VAO) */ - glGenVertexArrays(1, &VertexArrayID); - glBindVertexArray(VertexArrayID); - - createProgram(); - - MatrixID = glGetUniformLocation(ProgramID, "MVP"); - FGcolorID = glGetUniformLocation(ProgramID, "FGcolor"); - GammaID = glGetUniformLocation(ProgramID, "Gamma"); - IsImageID = glGetUniformLocation(ProgramID, "IsImage"); - checkGlError("get IDs"); - - glGenBuffers(1, &xybuffer); - glBindBuffer(GL_ARRAY_BUFFER, xybuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(xy), xy, GL_STREAM_DRAW); - - glGenBuffers(1, &uvbuffer); - glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(uv), uv, GL_STATIC_DRAW); - - glUseProgram(ProgramID); - - - glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]); - glUniform1f(GammaID, 1.0f/2.2f); - glUniform1i(IsImageID, 0); - glUniform3f(FGcolorID, 0.0, 0.0, 0.0); // black as default foreground - glClearColor(1.0f, 1.0f, 1.0f, 0.0f); // white as default background - - /* 1rst attribute buffer : XYs */ - glEnableVertexAttribArray(xyID); - glBindBuffer(GL_ARRAY_BUFFER, xybuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(xy), xy, GL_STREAM_DRAW); - glVertexAttribPointer(xyID, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - checkGlError("glVertexAttribPointer xy"); - - /* 2nd attribute buffer : UVs */ - glEnableVertexAttribArray(uvID); - glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(uv), uv, GL_STATIC_READ); - glVertexAttribPointer(uvID,2,GL_FLOAT,GL_FALSE, 0, (void*)0); - checkGlError("glVertexAttribPointer uv"); - - /* Make the alpha channel work */ - glEnable(GL_BLEND); - checkGlError("glEnable BLEND"); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - checkGlError("glBlendFunc"); - glEnable(GL_MULTISAMPLE); - checkGlError("GL_MULTISAMPLE"); - glEnable(GL_FRAMEBUFFER_SRGB); - checkGlError("GL_FRAMEBUFFER_SRGB"); - - hint_clear_fonts(true); - mkRuleTexture(); - ImageID=0; - //LOG("nativeInit Done\n"); -} - - -void nativeClear(void) -{ glDeleteBuffers(1, &xybuffer); - glDeleteBuffers(1, &uvbuffer); - glDeleteProgram(ProgramID); - glDeleteTextures(1, &RuleID); - if (ImageID != 0) { - glDeleteTextures(1, &ImageID); - ImageID = 0; - } -} - -void nativeBlank(void) -{ glClear(GL_COLOR_BUFFER_BIT); - //LOG("nativeBlank Done\n"); -} - -void nativeSetGamma(double gamma) -{ glUniform1f(GammaID, 1.0/gamma); - checkGlError("glsetgamma"); -} - -static GLfloat curfr, curfg, curfb; -static uint8_t last_style=0; -static void nativeSetColors(GLfloat fr, GLfloat fg, GLfloat fb, GLfloat br, GLfloat bg, GLfloat bb) -/* set foreground and background rgb colors */ -{ - glClearColor(br, bg, bb, 1.0f); - curfr=fr; curfg=fg; curfb=fb; - glUniform3f(FGcolorID, fr, fg, fb); - last_style=0; -} - - -void nativeSetDark(int on) -{ if (on) { - nativeSetColors( - GET_R(FG_NIGHT)/255.0f, - GET_G(FG_NIGHT)/255.0f, - GET_B(FG_NIGHT)/255.0f, - GET_R(BG_NIGHT)/255.0f, - GET_G(BG_NIGHT)/255.0f, - GET_B(BG_NIGHT)/255.0f); - } else { - nativeSetColors( - GET_R(FG_DAY)/255.0f, - GET_G(FG_DAY)/255.0f, - GET_B(FG_DAY)/255.0f, - GET_R(BG_DAY)/255.0f, - GET_G(BG_DAY)/255.0f, - GET_B(BG_DAY)/255.0f); - } -} - -static float pt_h=600.0, pt_v=800.0; - -void nativeSetSize(int px_h, int px_v, double x_dpi, double y_dpi) -{ //LOG("xdpi=%f, ydpi=%f\n",x_dpi,y_dpi); - pt_h = px_h * 72.27 / x_dpi; - pt_v = px_v * 72.27 / y_dpi; - page_h = round(pt_h * (1 << 16)); - page_v = round(pt_v * (1 << 16)); - MVP[0][0]=2.0/pt_h; // x: scale to -1 to +1 - MVP[1][1]=-2.0/pt_v; // y: scale to 1 to -1 - //MVP[2][2]=0.0f; // z: don't care - MVP[3][0]=-1.0f; // x position: left - MVP[3][1]=1.0f; // y position: up - //MVP[3][2]=-1.0f; // don't care - //MVP[3][3]=1.0f; // w: identity, already there - glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]); - glViewport(0, 0, px_h, px_v); -} - -void nativeRule(double x, double y, double w, double h) -/* Using GL to render a rule (a black rectangle) - Coordinates in points, origin bottom left, x and w right, y and h up - x,y position - w,h width and height - */ -{ /* Moving using the vertex buffer */ - xy[0][0]=x; xy[0][1]=y; // xy top left - xy[1][0]=x; xy[1][1]=y-h; // xy bot left 0 - xy[2][0]=x+w; xy[2][1]=y-h; // xy bot right 0 - - xy[3][0]=x+w; xy[3][1]=y; // xy top right 1 - xy[4][0]=x; xy[4][1]=y; // xy top left 1 - xy[5][0]=x+w; xy[5][1]=y-h; // xy bot right 1 - glBindTexture(GL_TEXTURE_2D, RuleID); - checkGlError("glBindTexture RuleID"); - - glBindBuffer(GL_ARRAY_BUFFER, xybuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(xy), xy, GL_STREAM_DRAW); - glDrawArrays(GL_TRIANGLES, 0, 2*3); - //LOG("nativeRule %f@%f %fx%f Done\n",x,y,w,h); -} - -void nativeImage(double x, double y, double w, double h, unsigned char *b, unsigned char *e) -/* render the image found between *b and *e at x,y with size w,h. - x, y, w, h are given in point -*/ -{ - static unsigned char *last_b=NULL; - GLenum format, internal_format; - int width, height, nrChannels; - unsigned char *data; - static unsigned char grey[4]={0,0,0,0x80}; - if (b!=last_b||ImageID==0) - { if (ImageID != 0) { - glDeleteTextures(1, &ImageID); - ImageID = 0; - } - last_b=b; - data = stbi_load_from_memory(b, (int) (e - b), &width, &height, &nrChannels, 0); - if (data == NULL) - { LOG("Unable to display image\n"); - data=grey; width=height=1; nrChannels=4; - } - //LOG("nativeImage %d chanels\n",nrChannels); - internal_format=GL_SRGB; - if (nrChannels == 4) - { format = GL_RGBA; internal_format=GL_SRGB_ALPHA;} - else if (nrChannels == 3) - format = GL_RGB; - else if (nrChannels == 2) - format = GL_RG; - else - format = GL_RED; - glGenTextures(1, &ImageID); - glBindTexture(GL_TEXTURE_2D, ImageID); - checkGlError("glBindTexture ImageID"); - - glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, format, GL_UNSIGNED_BYTE, data); - checkGlError("glTexImage2D(image)"); - if (data!=grey) stbi_image_free(data); - glGenerateMipmap(GL_TEXTURE_2D); - checkGlError("glGenerateMipmap(image)"); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - } - else - { glBindTexture(GL_TEXTURE_2D, ImageID); - checkGlError("glBindTexture old ImageID"); - } - - xy[0][0]=x; xy[0][1]=y; - xy[1][0]=x; xy[1][1]=y-h; - xy[2][0]=x+w; xy[2][1]=y-h; - - xy[3][0]=x+w; xy[3][1]=y; - xy[4][0]=x; xy[4][1]=y; - xy[5][0]=x+w; xy[5][1]=y-h; - - glBindBuffer(GL_ARRAY_BUFFER, xybuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(xy), xy, GL_STREAM_DRAW); - - glUniform1i(IsImageID, 1); - glDrawArrays(GL_TRIANGLES, 0, 2*3); - glUniform1i(IsImageID, 0); - -} - - -static void GLtexture(Gcache *g) { - unsigned texID; - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - checkGlError("glPixelStorei"); - glGenTextures(1, &texID); - checkGlError("glGenTextures"); - glBindTexture(GL_TEXTURE_2D, texID); - checkGlError("glBindTexture texID"); - - - /* the first element in g->bits corresponds to the lower left pixel, - * the last element in g->bits to the upper right pixel. */ - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_R8, - g->w, - g->h, - 0, - GL_RED, - GL_UNSIGNED_BYTE, - g->bits - ); - checkGlError("glTeXImage2D Glyph"); - - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - g->GLtexture = texID; - //MESSAGE("Generated GL texture %d",g->GLtexture); -} - - - -void nativeSetPK(struct gcache_s *g) -/* the bits, w and h fields in g are already set, but the rows needs to be DWORD aligned - the bitmap is already bottom up */ -{ GLtexture(g); -} - -void nativeSetFreeType(struct gcache_s *g) -/* the bits, w and h fields in g are already set, but the rows needs to be DWORD aligned - and converted to a bottom up DIB -*/ -{GLtexture(g);} - -int round_to_pixel=1; /* makes sense only if using the native dpi, if using a multiple its of not much use*/ -double pixel_size_threshold= 72.27/200; /*round to pixel only if pixel size in pt is above threshold*/ -void nativeGlyph(double x, double dx, double y, double dy, double w, double h, struct gcache_s *g, uint8_t s) -/* given glyph g, display g at position x,y in size w,h. x, y, w, h are given in point */ -{ - if (g->GLtexture == 0) - GLtexture(g); - x=x-dx; - y=y+h-dy; - if (round_to_pixel) - { double pxs; - pxs = 72.27/xdpi; /* pixel size in point */ - if (pxs>=pixel_size_threshold) - { x=x/pxs; - x=floor(x+0.5); - x=x*pxs; - } - pxs = 72.27/ydpi; /* pixel size in point */ - if (pxs>=pixel_size_threshold) - { y=y/pxs; - y=floor(y+0.5); - y=y*pxs; - } - } - xy[0][0]=x; xy[0][1]=y; - xy[1][0]=x; xy[1][1]=y-h; - xy[2][0]=x+w; xy[2][1]=y-h; - - xy[3][0]=x+w; xy[3][1]=y; - xy[4][0]=x; xy[4][1]=y; - xy[5][0]=x+w; xy[5][1]=y-h; - - glBindTexture(GL_TEXTURE_2D, g->GLtexture); - checkGlError("glBindTexture g->GLtexture"); - - if (s!=last_style) - { if (s&FOCUS_BIT) - glUniform3f(FGcolorID, 0.0, 1.0,0.0); - else if (s&MARK_BIT) - glUniform3f(FGcolorID, 1.0, 0.0,0.0); - else if (s&LINK_BIT) - glUniform3f(FGcolorID, 0.0, 0.0,1.0); - else - glUniform3f(FGcolorID, curfr, curfg,curfb); - last_style=s; - } - glBindBuffer(GL_ARRAY_BUFFER, xybuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(xy), xy, GL_STREAM_DRAW); - glDrawArrays(GL_TRIANGLES, 0, 2*3); - //LOG("nativeGlyph %f@%f %fx%f Done\n",x,y,w,h); -} - -void nativeFreeGlyph(struct gcache_s*g) -{ if (g->GLtexture != 0) { - glDeleteTextures(1, &(g->GLtexture)); // probably not needed - g->GLtexture = 0; - } -} - - -/* no printing support so far, just placeholders */ - -int nativePrintStart(int w, int h, int bpr, int bpp, unsigned char *bits) -{ return 0; -} - -int nativePrint(unsigned char *bits) -{ return 0; -} - -int nativePrintEnd(void) -{ return 0; -} diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/rendernative.h b/Build/source/texk/web2c/hitexdir/hintview/src/rendernative.h deleted file mode 100644 index 67de223bb52..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/rendernative.h +++ /dev/null @@ -1,56 +0,0 @@ -/*387:*/ -#line 7736 "hint.w" - -#ifndef _RENDERNATIVE_H -#define _RENDERNATIVE_H - -/*339:*/ -#line 6651 "hint.w" - -extern void nativeInit(void); -extern void nativeClear(void); -extern int nativePrintStart(int w,int h,int bpr,int bpp,unsigned char*bits); -extern int nativePrintEnd(void); -extern int nativePrint(unsigned char*bits); -/*:339*//*340:*/ -#line 6661 "hint.w" - -extern void nativeSetSize(int px_h,int px_v,double xdpi,double ydpi); -/*:340*//*341:*/ -#line 6667 "hint.w" - -extern void nativeSetDark(int dark); -extern void nativeSetGamma(double gamma); -/*:341*//*342:*/ -#line 6673 "hint.w" - -extern void nativeBlank(void); -/*:342*//*343:*/ -#line 6683 "hint.w" - -typedef struct gcache_s*gcache_s_ptr; - -extern void nativeGlyph(double x,double dx,double y,double dy,double w,double h,struct gcache_s*g,uint8_t s); -/*:343*//*344:*/ -#line 6694 "hint.w" - -void nativeRule(double x,double y,double w,double h); -/*:344*//*345:*/ -#line 6700 "hint.w" - -void nativeImage(double x,double y,double w,double h,unsigned char*istart,unsigned char*iend); -/*:345*//*346:*/ -#line 6706 "hint.w" - -extern void nativeSetPK(struct gcache_s*g); -extern void nativeSetFreeType(struct gcache_s*g); -/*:346*//*347:*/ -#line 6713 "hint.w" - -void nativeFreeGlyph(struct gcache_s*g); -/*:347*/ -#line 7740 "hint.w" - - -#endif -/*:387*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/stb_image.h b/Build/source/texk/web2c/hitexdir/hintview/src/stb_image.h deleted file mode 100644 index 196dfd5cc6e..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/stb_image.h +++ /dev/null @@ -1,7559 +0,0 @@ -/* stb_image - v2.23 - public domain image loader - http://nothings.org/stb - no warranty implied; use at your own risk - - Do this: - #define STB_IMAGE_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - - // i.e. it should look like this: - #include ... - #include ... - #include ... - #define STB_IMAGE_IMPLEMENTATION - #include "stb_image.h" - - You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. - And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free - - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8/16-bit-per-channel - - TGA (not sure what subset, if a subset) - BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels, 8/16 bit-per-channel) - - GIF (*comp always reports as 4-channel) - HDR (radiance rgbE format) - PIC (Softimage PIC) - PNM (PPM and PGM binary only) - - Animated GIF still needs a proper API, but here's one way to do it: - http://gist.github.com/urraka/685d9a6340b26b830d49 - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - - Full documentation under "DOCUMENTATION" below. - - -LICENSE - - See end of file for license information. - -RECENT REVISION HISTORY: - - 2.23 (2019-08-11) fix clang static analysis warning - 2.22 (2019-03-04) gif fixes, fix warnings - 2.21 (2019-02-25) fix typo in comment - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings - 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes - 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 - RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; - correct channel count for PNG & BMP - 2.10 (2016-01-22) avoid warning introduced in 2.09 - 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED - - See end of file for full revision history. - - - ============================ Contributors ========================= - - Image formats Extensions, features - Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) - Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) - Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) - Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) - Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) - Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) - Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - github:urraka (animated gif) Junggon Kim (PNM comments) - Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) - socks-the-fox (16-bit PNG) - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes Mikhail Morozov (1-bit BMP) - Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) - Arseny Kapoulkine - John-Mark Allen - Carmelo J Fdez-Aguera - - Bug & warning fixes - Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan - Dave Moore Roy Eltham Hayaki Saito Nathan Reed - Won Chun Luke Graham Johan Duparc Nick Verigakis - the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh - Janez Zemva John Bartholomew Michal Cichon github:romigrou - Jonathan Blow Ken Hamada Tero Hanninen github:svdijk - Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar - Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex - Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 - Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw - Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus - Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo - Christian Floisand Kevin Schmidt JR Smith github:darealshinji - Blazej Dariusz Roszkowski github:Michaelangel007 -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// DOCUMENTATION -// -// Limitations: -// - no 12-bit-per-channel JPEG -// - no JPEGs with arithmetic coding -// - GIF always returns *comp=4 -// -// Basic usage (see HDR discussion below for HDR usage): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data) -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *channels_in_file -- outputs # of image components in image file -// int desired_channels -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data, or NULL on an allocation failure or if the image is -// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'desired_channels' if desired_channels is non-zero, or -// *channels_in_file otherwise. If desired_channels is non-zero, -// *channels_in_file has the number of components that _would_ have been -// output otherwise. E.g. if you set desired_channels to 4, you will always -// get RGBA output, but you can check *channels_in_file to see if it's trivially -// opaque because e.g. there were only 3 channels in the source image. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *channels_in_file will be unchanged. The function -// stbi_failure_reason() can be queried for an extremely brief, end-user -// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS -// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// =========================================================================== -// -// UNICODE: -// -// If compiling for Windows and you wish to use Unicode filenames, compile -// with -// #define STBI_WINDOWS_UTF8 -// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert -// Windows wchar_t filenames to utf8. -// -// =========================================================================== -// -// Philosophy -// -// stb libraries are designed with the following priorities: -// -// 1. easy to use -// 2. easy to maintain -// 3. good performance -// -// Sometimes I let "good performance" creep up in priority over "easy to maintain", -// and for best performance I may provide less-easy-to-use APIs that give higher -// performance, in addition to the easy-to-use ones. Nevertheless, it's important -// to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. -// -// Some secondary priorities arise directly from the first two, some of which -// provide more explicit reasons why performance can't be emphasized. -// -// - Portable ("ease of use") -// - Small source code footprint ("easy to maintain") -// - No dependencies ("ease of use") -// -// =========================================================================== -// -// I/O callbacks -// -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. -// -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). -// -// =========================================================================== -// -// SIMD support -// -// The JPEG decoder will try to automatically use SIMD kernels on x86 when -// supported by the compiler. For ARM Neon support, you must explicitly -// request it. -// -// (The old do-it-yourself SIMD API is no longer supported in the current -// code.) -// -// On x86, SSE2 will automatically be used when available based on a run-time -// test; if not, the generic C versions are used as a fall-back. On ARM targets, -// the typical path is to have separate builds for NEON and non-NEON devices -// (at least this is true for iOS and Android). Therefore, the NEON support is -// toggled by a build flag: define STBI_NEON to get NEON loops. -// -// If for some reason you do not want to use any of SIMD code, or if -// you have issues compiling it, you can disable it entirely by -// defining STBI_NO_SIMD. -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image supports loading HDR images in general, and currently the Radiance -// .HDR file format specifically. You can still load any file through the existing -// interface; if you attempt to load an HDR file, it will be automatically remapped -// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); -// -// =========================================================================== -// -// iPhone PNG support: -// -// By default we convert iphone-formatted PNGs back to RGB, even though -// they are internally encoded differently. You can disable this conversion -// by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through (which -// is BGR stored in RGB). -// -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). -// -// =========================================================================== -// -// ADDITIONAL CONFIGURATION -// -// - You can suppress implementation of any of the decoders to reduce -// your code footprint by #defining one or more of the following -// symbols before creating the implementation. -// -// STBI_NO_JPEG -// STBI_NO_PNG -// STBI_NO_BMP -// STBI_NO_PSD -// STBI_NO_TGA -// STBI_NO_GIF -// STBI_NO_HDR -// STBI_NO_PIC -// STBI_NO_PNM (.ppm and .pgm) -// -// - You can request *only* certain decoders and suppress all other ones -// (this will be more forward-compatible, as addition of new decoders -// doesn't require you to disable them explicitly): -// -// STBI_ONLY_JPEG -// STBI_ONLY_PNG -// STBI_ONLY_BMP -// STBI_ONLY_PSD -// STBI_ONLY_TGA -// STBI_ONLY_GIF -// STBI_ONLY_HDR -// STBI_ONLY_PIC -// STBI_ONLY_PNM (.ppm and .pgm) -// -// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still -// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB -// - - -#ifndef STBI_NO_STDIO -#include <stdio.h> -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -#include <stdlib.h> -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef STBIDEF -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -typedef struct -{ - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof) (void *user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -//////////////////////////////////// -// -// 8-bits-per-channel interface -// - -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -#endif - -#ifdef STBI_WINDOWS_UTF8 -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif - -//////////////////////////////////// -// -// 16-bits-per-channel interface -// - -STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif - -//////////////////////////////////// -// -// float-per-channel interface -// -#ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - - #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); - #endif -#endif - -#ifndef STBI_NO_HDR - STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); - STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR - STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); - STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - -// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename); -STBIDEF int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - -// get a VERY brief reason for failure -// NOT THREADSAFE -STBIDEF const char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -STBIDEF void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit (char const *filename); -STBIDEF int stbi_is_16_bit_from_file(FILE *f); -#endif - - - -// for image formats that explicitly notate that they have premultiplied alpha, -// we just return the colors as stored in the file. set this flag to force -// unpremultiplication. results are undefined if the unpremultiply overflow. -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - -// flip the image vertically, so the first pixel in the output array is the bottom left -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -// ZLIB client - used by PNG, available for other purposes - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); -STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ - || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ - || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ - || defined(STBI_ONLY_ZLIB) - #ifndef STBI_ONLY_JPEG - #define STBI_NO_JPEG - #endif - #ifndef STBI_ONLY_PNG - #define STBI_NO_PNG - #endif - #ifndef STBI_ONLY_BMP - #define STBI_NO_BMP - #endif - #ifndef STBI_ONLY_PSD - #define STBI_NO_PSD - #endif - #ifndef STBI_ONLY_TGA - #define STBI_NO_TGA - #endif - #ifndef STBI_ONLY_GIF - #define STBI_NO_GIF - #endif - #ifndef STBI_ONLY_HDR - #define STBI_NO_HDR - #endif - #ifndef STBI_ONLY_PIC - #define STBI_NO_PIC - #endif - #ifndef STBI_ONLY_PNM - #define STBI_NO_PNM - #endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - - -#include <stdarg.h> -#include <stddef.h> // ptrdiff_t on osx -#include <stdlib.h> -#include <string.h> -#include <limits.h> - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include <math.h> // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include <stdio.h> -#endif - -#ifndef STBI_ASSERT -#include <assert.h> -#define STBI_ASSERT(x) assert(x) -#endif - -#ifdef __cplusplus -#define STBI_EXTERN extern "C" -#else -#define STBI_EXTERN extern -#endif - - -#ifndef _MSC_VER - #ifdef __cplusplus - #define stbi_inline inline - #else - #define stbi_inline - #endif -#else - #define stbi_inline __forceinline -#endif - - -#ifdef _MSC_VER -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include <stdint.h> -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) -#else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,newsz) realloc(p,newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include <emmintrin.h> - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include <intrin.h> // __cpuid -static int stbi__cpuid3(void) -{ - int info[4]; - __cpuid(info,1); - return info[3]; -} -#else -static int stbi__cpuid3(void) -{ - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#endif - -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif - -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include <arm_neon.h> -// assume GCC or Clang on ARM targets -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - - -static void stbi__refill_buffer(stbi__context *s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stbi__stdio_skip(void *user, int n) -{ - fseek((FILE*) user, n, SEEK_CUR); -} - -static int stbi__stdio_eof(void *user) -{ - return feof((FILE*) user); -} - -static stbi_io_callbacks stbi__stdio_callbacks = -{ - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context *s, FILE *f) -{ - stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum -{ - STBI_ORDER_RGB, - STBI_ORDER_BGR -}; - -typedef struct -{ - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context *s); -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context *s); -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__png_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context *s); -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context *s); -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s); -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__psd_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context *s); -static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context *s); -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context *s); -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -// this is not threadsafe -static const char *stbi__g_failure_reason; - -STBIDEF const char *stbi_failure_reason(void) -{ - return stbi__g_failure_reason; -} - -static int stbi__err(const char *str) -{ - stbi__g_failure_reason = str; - return 0; -} - -static void *stbi__malloc(size_t size) -{ - return STBI_MALLOC(size); -} - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) -{ - if (b < 0) return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) -{ - if (a < 0 || b < 0) return 0; - if (b == 0) return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX/b; -} - -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); -} - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__addsizes_valid(a*b*c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); -} -#endif - -// mallocs with size overflow checking -static void *stbi__malloc_mad2(int a, int b, int add) -{ - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); -} - -static void *stbi__malloc_mad3(int a, int b, int c, int add) -{ - if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; - return stbi__malloc(a*b*c + add); -} - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) -{ - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; - return stbi__malloc(a*b*c*d + add); -} -#endif - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS - #define stbi__err(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define stbi__err(x,y) stbi__err(y) -#else - #define stbi__err(x,y) stbi__err(x) -#endif - -#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) - -STBIDEF void stbi_image_free(void *retval_from_stbi_load) -{ - STBI_FREE(retval_from_stbi_load); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load = flag_true_if_should_flip; -} - -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); - #endif - #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - - #ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp, ri); - #endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi_uc *reduced; - - reduced = (stbi_uc *) stbi__malloc(img_len); - if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi__uint16 *enlarged; - - enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); - if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) -{ - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc *bytes = (stbi_uc *)image; - - for (row = 0; row < (h>>1); row++) { - stbi_uc *row0 = bytes + row*bytes_per_row; - stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -#ifndef STBI_NO_GIF -static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) -{ - int slice; - int slice_size = w * h * bytes_per_pixel; - - stbi_uc *bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { - stbi__vertical_flip(bytes, w, h, bytes_per_pixel); - bytes += slice_size; - } -} -#endif - -static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - if (ri.bits_per_channel != 8) { - STBI_ASSERT(ri.bits_per_channel == 16); - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *) result; -} - -static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - if (ri.bits_per_channel != 16) { - STBI_ASSERT(ri.bits_per_channel == 8); - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *) result; -} - -#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) -static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) -{ - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) -STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -#endif - -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbi__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) - return 0; - -#if _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - - -STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - unsigned char *result; - if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__uint16 *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - stbi__uint16 *result; - if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f,x,y,comp,req_comp); - fclose(f); - return result; -} - - -#endif //!STBI_NO_STDIO - -STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_mem(&s,buffer,len); - - result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { - stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); - } - - return result; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data,x,y,comp,req_comp); - return hdr_data; - } - #endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - float *result; - FILE *f = stbi__fopen(filename, "rb"); - if (!f) return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_file(&s,f); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - long pos = ftell(f); - int res; - stbi__context s; - stbi__start_file(&s,f); - res = stbi__hdr_test(&s); - fseek(f, pos, SEEK_SET); - return res; - #else - STBI_NOTUSED(f); - return 0; - #endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; - #endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - STBI__SCAN_load=0, - STBI__SCAN_type, - STBI__SCAN_header -}; - -static void stbi__refill_buffer(stbi__context *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start+1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -stbi_inline static int stbi__at_eof(stbi__context *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} - -static void stbi__skip(stbi__context *s, int n) -{ - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} - -static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} - -static int stbi__get16be(stbi__context *s) -{ - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} - -static stbi__uint32 stbi__get32be(stbi__context *s) -{ - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context *s) -{ - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context *s) -{ - stbi__uint32 z = stbi__get16le(s); - return z + (stbi__get16le(s) << 16); -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - - -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) -{ - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} - -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) -{ - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - stbi__uint16 *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - stbi__uint16 *src = data + j * x * img_n ; - stbi__uint16 *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output; - if (!data) return NULL; - output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - } - if (n < comp) { - for (i=0; i < x*y; ++i) { - output[i*comp + n] = data[i*comp + n]/255.0f; - } - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int) (x)) -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output; - if (!data) return NULL; - output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct -{ - stbi__context *s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - stbi_uc *data; - void *raw_data, *raw_coeff; - stbi_uc *linebuf; - short *coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - -// kernels - void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); - stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman *h, int *count) -{ - int i,j,k=0; - unsigned int code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) - h->size[k++] = (stbi_uc) (i+1); - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (stbi_uc) i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) -{ - int i; - for (i=0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg *j) -{ - do { - unsigned int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<<n) + 1 -static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767}; - -// combined JPEG 'receive' and JPEG 'extend', since baseline -// always extends everything it receives. -stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n) -{ - unsigned int k; - int sgn; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - - sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB - k = stbi_lrot(j->code_buffer, n); - STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & ~sgn); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) -{ - unsigned int k; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) -{ - unsigned int k; - if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static const stbi_uc stbi__jpeg_dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) -{ - int diff,dc,k; - int t; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) -{ - int diff,dc; - int t; - if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - diff = t ? stbi__extend_receive(j, t) : 0; - - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc << j->succ_low); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short) (1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) -{ - int k; - if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) << shift); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) << shift); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short) (1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short *p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short) s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (stbi_uc) x; -} - -#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) -#define stbi__fsh(x) ((x) * 4096) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) -{ - int i,val[64],*v=val; - stbi_uc *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0]*4; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0+t3) >> 17); - o[7] = stbi__clamp((x0-t3) >> 17); - o[1] = stbi__clamp((x1+t2) >> 17); - o[6] = stbi__clamp((x1-t2) >> 17); - o[2] = stbi__clamp((x2+t1) >> 17); - o[5] = stbi__clamp((x2-t1) >> 17); - o[3] = stbi__clamp((x3+t0) >> 17); - o[4] = stbi__clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - - // dot product constant: even elems=x, odd elems=y - #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) - - // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) - // out(1) = c1[even]*x + c1[odd]*y - #define dct_rot(out0,out1, x,y,c0,c1) \ - __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ - __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ - __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ - __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ - __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ - __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - - // out = in << 12 (in 16-bit, out 32-bit) - #define dct_widen(out, in) \ - __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ - __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - - // wide add - #define dct_wadd(out, a, b) \ - __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_add_epi32(a##_h, b##_h) - - // wide sub - #define dct_wsub(out, a, b) \ - __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - - // butterfly a/b, add bias, then shift by "s" and pack - #define dct_bfly32o(out0, out1, a,b,bias,s) \ - { \ - __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ - __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ - dct_wadd(sum, abiased, b); \ - dct_wsub(dif, abiased, b); \ - out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ - out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ - } - - // 8-bit interleave step (for transposes) - #define dct_interleave8(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi8(a, b); \ - b = _mm_unpackhi_epi8(tmp, b) - - // 16-bit interleave step (for transposes) - #define dct_interleave16(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi16(a, b); \ - b = _mm_unpackhi_epi16(tmp, b) - - #define dct_pass(bias,shift) \ - { \ - /* even part */ \ - dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ - __m128i sum04 = _mm_add_epi16(row0, row4); \ - __m128i dif04 = _mm_sub_epi16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ - dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ - __m128i sum17 = _mm_add_epi16(row1, row7); \ - __m128i sum35 = _mm_add_epi16(row3, row5); \ - dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ - dct_wadd(x4, y0o, y4o); \ - dct_wadd(x5, y1o, y5o); \ - dct_wadd(x6, y2o, y5o); \ - dct_wadd(x7, y3o, y4o); \ - dct_bfly32o(row0,row7, x0,x7,bias,shift); \ - dct_bfly32o(row1,row6, x1,x6,bias,shift); \ - dct_bfly32o(row2,row5, x2,x5,bias,shift); \ - dct_bfly32o(row3,row4, x3,x4,bias,shift); \ - } - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); - - // load - row0 = _mm_load_si128((const __m128i *) (data + 0*8)); - row1 = _mm_load_si128((const __m128i *) (data + 1*8)); - row2 = _mm_load_si128((const __m128i *) (data + 2*8)); - row3 = _mm_load_si128((const __m128i *) (data + 3*8)); - row4 = _mm_load_si128((const __m128i *) (data + 4*8)); - row5 = _mm_load_si128((const __m128i *) (data + 5*8)); - row6 = _mm_load_si128((const __m128i *) (data + 6*8)); - row7 = _mm_load_si128((const __m128i *) (data + 7*8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *) out, p0); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p2); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p1); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p3); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ - int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ - int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ - int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ - int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - -// wide add -#define dct_wadd(out, a, b) \ - int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - -// butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ - { \ - dct_wadd(sum, a, b); \ - dct_wsub(dif, a, b); \ - out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ - out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ - } - -#define dct_pass(shiftop, shift) \ - { \ - /* even part */ \ - int16x8_t sum26 = vaddq_s16(row2, row6); \ - dct_long_mul(p1e, sum26, rot0_0); \ - dct_long_mac(t2e, p1e, row6, rot0_1); \ - dct_long_mac(t3e, p1e, row2, rot0_2); \ - int16x8_t sum04 = vaddq_s16(row0, row4); \ - int16x8_t dif04 = vsubq_s16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - int16x8_t sum15 = vaddq_s16(row1, row5); \ - int16x8_t sum17 = vaddq_s16(row1, row7); \ - int16x8_t sum35 = vaddq_s16(row3, row5); \ - int16x8_t sum37 = vaddq_s16(row3, row7); \ - int16x8_t sumodd = vaddq_s16(sum17, sum35); \ - dct_long_mul(p5o, sumodd, rot1_0); \ - dct_long_mac(p1o, p5o, sum17, rot1_1); \ - dct_long_mac(p2o, p5o, sum35, rot1_2); \ - dct_long_mul(p3o, sum37, rot2_0); \ - dct_long_mul(p4o, sum15, rot2_1); \ - dct_wadd(sump13o, p1o, p3o); \ - dct_wadd(sump24o, p2o, p4o); \ - dct_wadd(sump23o, p2o, p3o); \ - dct_wadd(sump14o, p1o, p4o); \ - dct_long_mac(x4, sump13o, row7, rot3_0); \ - dct_long_mac(x5, sump24o, row5, rot3_1); \ - dct_long_mac(x6, sump23o, row3, rot3_2); \ - dct_long_mac(x7, sump14o, row1, rot3_3); \ - dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ - dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ - dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ - dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ - } - - // load - row0 = vld1q_s16(data + 0*8); - row1 = vld1q_s16(data + 1*8); - row2 = vld1q_s16(data + 2*8); - row3 = vld1q_s16(data + 3*8); - row4 = vld1q_s16(data + 4*8); - row5 = vld1q_s16(data + 5*8); - row6 = vld1q_s16(data + 6*8); - row7 = vld1q_s16(data + 7*8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { -// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. -// whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } -#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } -#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); out += out_stride; - vst1_u8(out, p1); out += out_stride; - vst1_u8(out, p2); out += out_stride; - vst1_u8(out, p3); out += out_stride; - vst1_u8(out, p4); out += out_stride; - vst1_u8(out, p5); out += out_stride; - vst1_u8(out, p6); out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg *j) -{ - stbi_uc x; - if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } - x = stbi__get8(j->s); - if (x != 0xff) return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg *z) -{ - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i,j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - STBI_SIMD_ALIGN(short, data[64]); - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i,j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x); - int y2 = (j*z->img_comp[n].v + y); - short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) -{ - int i; - for (i=0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg *z) -{ - if (z->progressive) { - // dequantize and idct the data - int i,j,n; - for (n=0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg *z, int m) -{ - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker","Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s)-2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15,i; - if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); - if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); - - for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s)-2; - while (L > 0) { - stbi_uc *v; - int sizes[16],i,n=0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L==0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len","Corrupt JPEG"); - else - return stbi__err("bad APP len","Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J','F','I','F','\0'}; - int ok = 1; - int i; - for (i=0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; - int ok = 1; - int i; - for (i=0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker","Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg *z) -{ - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; // no match - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) -{ - int i; - for (i=0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg *z, int scan) -{ - stbi__context *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); - - z->rgb = 0; - for (i=0; i < s->img_n; ++i) { - static const unsigned char rgb[3] = { 'R', 'G', 'B' }; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) -{ - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); - if (scan == STBI__SCAN_type) return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z,m)) return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) return 0; - return 1; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg *j) -{ - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) return 0; - if (!stbi__parse_entropy_coded_data(j)) return 0; - if (j->marker == STBI__MARKER_none ) { - // handle 0s at the end of image data from IP Kamera 9060 - while (!stbi__at_eof(j->s)) { - int x = stbi__get8(j->s); - if (x == 255) { - j->marker = stbi__get8(j->s); - break; - } - } - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); - } else { - if (!stbi__process_marker(j, m)) return 0; - } - m = stbi__get_marker(j); - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, - int w, int hs); - -#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) - -static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - stbi_uc *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = stbi__div4(n+input[i-1]); - out[i*2+1] = stbi__div4(n+input[i+1]); - } - out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) - -static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = stbi__div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i=0,t0,t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w-1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *) (out + i*2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i*2, o); -#endif - - // "previous" value for next iter - t1 = 3*in_near[i+7] + in_far[i+7]; - } - - t0 = t1; - t1 = 3*in_near[i] + in_far[i]; - out[i*2] = stbi__div16(3*t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - STBI_NOTUSED(in_far); - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) -{ - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); - __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); - __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); - __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); - __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i+7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *) (out + 0), o0); - _mm_storeu_si128((__m128i *) (out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); - int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); - int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); - int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); - - for (; i+7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8*4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg *j) -{ - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg *j) -{ - stbi__free_jpeg_components(j, j->s->img_n, 0); -} - -typedef struct -{ - resample_row_func resample; - stbi_uc *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) -{ - unsigned int t = x*y + 128; - return (stbi_uc) ((t + (t >>8)) >> 8); -} - -static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; - stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; - - stbi__resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; - else r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - stbi_uc *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc *y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i=0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i=0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x,y,comp,req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context *s) -{ - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) -{ - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) -{ - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[288]; - stbi__uint16 value[288]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) -{ - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16-bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16) code; - z->firstsymbol[i] = (stbi__uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); - z->size [c] = (stbi_uc ) s; - z->value[c] = (stbi__uint16) i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s],s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - stbi__uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) -{ - if (z->zbuffer >= z->zbuffer_end) return 0; - return *z->zbuffer++; -} - -static void stbi__fill_bits(stbi__zbuf *z) -{ - do { - STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s,k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s == 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - STBI_ASSERT(z->size[b] == s); - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s; - if (a->num_bits < 16) stbi__fill_bits(a); - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes -{ - char *q; - int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); - cur = (int) (z->zout - z->zout_start); - limit = old_limit = (int) (z->zout_end - z->zout_start); - while (cur + n > limit) - limit *= 2; - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static const int stbi__zlength_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static const int stbi__zlength_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static const int stbi__zdist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int stbi__parse_huffman_block(stbi__zbuf *a) -{ - char *zout = a->zout; - for(;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) return 0; - zout = a->zout; - } - *zout++ = (char) z; - } else { - stbi_uc *p; - int len,dist; - if (z == 256) { - a->zout = zout; - return 1; - } - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (zout + len > a->zout_end) { - if (!stbi__zexpand(a, zout, len)) return 0; - zout = a->zout; - } - p = (stbi_uc *) (zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { do *zout++ = v; while (--len); } - } else { - if (len) { do *zout++ = *p++; while (--len); } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf *a) -{ - static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286+32+137];//padding for maximum single op - stbi_uc codelength_sizes[19]; - int i,n; - - int hlit = stbi__zreceive(a,5) + 257; - int hdist = stbi__zreceive(a,5) + 1; - int hclen = stbi__zreceive(a,4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = stbi__zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc) c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; - } else if (c == 17) - c = stbi__zreceive(a,3)+3; - else { - STBI_ASSERT(c == 18); - c = stbi__zreceive(a,7)+11; - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); - n += c; - } - } - if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf *a) -{ - stbi_uc header[4]; - int len,nlen,k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - STBI_ASSERT(a->num_bits == 0); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf *a) -{ - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[288] = -{ - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 -}; -static const stbi_uc stbi__zdefault_distance[32] = -{ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = stbi__zreceive(a,1); - type = stbi__zreceive(a,2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; - } - if (!stbi__parse_huffman_block(a)) return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer+len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct -{ - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) -{ - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context *s) -{ - static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - - -enum { - STBI__F_none=0, - STBI__F_sub=1, - STBI__F_up=2, - STBI__F_avg=3, - STBI__F_paeth=4, - // synthetic filters used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static stbi_uc first_row_filter[5] = -{ - STBI__F_none, - STBI__F_sub, - STBI__F_none, - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static int stbi__paeth(int a, int b, int c) -{ - int p = a + b - c; - int pa = abs(p-a); - int pb = abs(p-b); - int pc = abs(p-c); - if (pa <= pb && pa <= pc) return a; - if (pb <= pc) return b; - return c; -} - -static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) -{ - int bytes = (depth == 16? 2 : 1); - stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n*bytes; - stbi__uint32 img_len, img_width_bytes; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n*bytes; - int filter_bytes = img_n*bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) return stbi__err("outofmem", "Out of memory"); - - if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - img_len = (img_width_bytes + 1) * y; - - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *prior; - int filter = *raw++; - - if (filter > 4) - return stbi__err("invalid filter","Corrupt PNG"); - - if (depth < 8) { - STBI_ASSERT(img_width_bytes <= x); - cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place - filter_bytes = 1; - width = img_width_bytes; - } - prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above - - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - - // handle first byte explicitly - for (k=0; k < filter_bytes; ++k) { - switch (filter) { - case STBI__F_none : cur[k] = raw[k]; break; - case STBI__F_sub : cur[k] = raw[k]; break; - case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; - case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; - case STBI__F_avg_first : cur[k] = raw[k]; break; - case STBI__F_paeth_first: cur[k] = raw[k]; break; - } - } - - if (depth == 8) { - if (img_n != out_n) - cur[img_n] = 255; // first pixel - raw += img_n; - cur += out_n; - prior += out_n; - } else if (depth == 16) { - if (img_n != out_n) { - cur[filter_bytes] = 255; // first pixel top byte - cur[filter_bytes+1] = 255; // first pixel bottom byte - } - raw += filter_bytes; - cur += output_bytes; - prior += output_bytes; - } else { - raw += 1; - cur += 1; - prior += 1; - } - - // this is a little gross, so that we don't switch per-pixel or per-component - if (depth < 8 || img_n == out_n) { - int nk = (width - 1)*filter_bytes; - #define STBI__CASE(f) \ - case f: \ - for (k=0; k < nk; ++k) - switch (filter) { - // "none" filter turns into a memcpy here; make that explicit. - case STBI__F_none: memcpy(cur, raw, nk); break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; - } - #undef STBI__CASE - raw += nk; - } else { - STBI_ASSERT(img_n+1 == out_n); - #define STBI__CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ - for (k=0; k < filter_bytes; ++k) - switch (filter) { - STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; - } - #undef STBI__CASE - - // the loop above sets the high byte of the pixels' alpha, but for - // 16 bit png files we also need the low byte set. we'll do that here. - if (depth == 16) { - cur = a->out + stride*j; // start at the beginning of the row again - for (i=0; i < x; ++i,cur+=output_bytes) { - cur[filter_bytes+1] = 255; - } - } - } - } - - // we make a separate pass to expand bits to pixels; for performance, - // this could run two scanlines behind the above code, so it won't - // intefere with filtering but will still be in the cache. - if (depth < 8) { - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; - // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit - // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - - // note that the final byte might overshoot and write more data than desired. - // we can allocate enough data that this never writes out of memory, but it - // could also overwrite the next scanline. can it overwrite non-empty data - // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. - // so we need to explicitly clamp the final ones - - if (depth == 4) { - for (k=x*img_n; k >= 2; k-=2, ++in) { - *cur++ = scale * ((*in >> 4) ); - *cur++ = scale * ((*in ) & 0x0f); - } - if (k > 0) *cur++ = scale * ((*in >> 4) ); - } else if (depth == 2) { - for (k=x*img_n; k >= 4; k-=4, ++in) { - *cur++ = scale * ((*in >> 6) ); - *cur++ = scale * ((*in >> 4) & 0x03); - *cur++ = scale * ((*in >> 2) & 0x03); - *cur++ = scale * ((*in ) & 0x03); - } - if (k > 0) *cur++ = scale * ((*in >> 6) ); - if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); - if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); - } else if (depth == 1) { - for (k=x*img_n; k >= 8; k-=8, ++in) { - *cur++ = scale * ((*in >> 7) ); - *cur++ = scale * ((*in >> 6) & 0x01); - *cur++ = scale * ((*in >> 5) & 0x01); - *cur++ = scale * ((*in >> 4) & 0x01); - *cur++ = scale * ((*in >> 3) & 0x01); - *cur++ = scale * ((*in >> 2) & 0x01); - *cur++ = scale * ((*in >> 1) & 0x01); - *cur++ = scale * ((*in ) & 0x01); - } - if (k > 0) *cur++ = scale * ((*in >> 7) ); - if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); - if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); - if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); - if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); - if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); - if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); - } - if (img_n != out_n) { - int q; - // insert alpha = 255 - cur = a->out + stride*j; - if (img_n == 1) { - for (q=x-1; q >= 0; --q) { - cur[q*2+1] = 255; - cur[q*2+0] = cur[q]; - } - } else { - STBI_ASSERT(img_n == 3); - for (q=x-1; q >= 0; --q) { - cur[q*4+3] = 255; - cur[q*4+2] = cur[q*3+2]; - cur[q*4+1] = cur[q*3+1]; - cur[q*4+0] = cur[q*3+0]; - } - } - } - } - } else if (depth == 16) { - // force the image data from big-endian to platform-native. - // this is done in a separate pass due to the decoding relying - // on the data being untouched, but could probably be done - // per-line during decode if care is taken. - stbi_uc *cur = a->out; - stbi__uint16 *cur16 = (stbi__uint16*)cur; - - for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { - *cur16 = (cur[0] << 8) | cur[1]; - } - } - - return 1; -} - -static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) -{ - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc *final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j=0; j < y; ++j) { - for (i=0; i < x; ++i) { - int out_y = j*yspc[p]+yorig[p]; - int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, - a->out + (j*x+i)*out_bytes, out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 *p = (stbi__uint16*) z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) -{ - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load = 0; -static int stbi__de_iphone_flag = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag = flag_true_if_should_convert; -} - -static void stbi__de_iphone(stbi__png *z) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = ( t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) - -static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) -{ - stbi_uc palette[1024], pal_img_n=0; - stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; - stbi__context *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) return 0; - - if (scan == STBI__SCAN_type) return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C','g','B','I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I','H','D','R'): { - int comp,filter; - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); - filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); - interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == STBI__SCAN_header) return 1; - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS - } - break; - } - - case STBI__PNG_TYPE('P','L','T','E'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = stbi__get8(s); - palette[i*4+1] = stbi__get8(s); - palette[i*4+2] = stbi__get8(s); - palette[i*4+3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t','R','N','S'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); - if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); - has_trans = 1; - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len, bpl; - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); - if (z->expanded == NULL) return 0; // zlib should set error - STBI_FREE(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; - return 1; - } - - default: - // if critical, fail - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); - #endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) -{ - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth < 8) - ri->bits_per_channel = 8; - else - ri->bits_per_channel = p->depth; - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - STBI_FREE(p->out); p->out = NULL; - STBI_FREE(p->expanded); p->expanded = NULL; - STBI_FREE(p->idata); p->idata = NULL; - - return result; -} - -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi__png p; - p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp, ri); -} - -static int stbi__png_test(stbi__context *s) -{ - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -{ - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} - -static int stbi__png_is16(stbi__context *s) -{ - stbi__png p; - p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); - return 0; - } - return 1; -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context *s) -{ - int r; - int sz; - if (stbi__get8(s) != 'B') return 0; - if (stbi__get8(s) != 'M') return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context *s) -{ - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) { n += 16; z >>= 16; } - if (z >= 0x00100) { n += 8; z >>= 8; } - if (z >= 0x00010) { n += 4; z >>= 4; } - if (z >= 0x00004) { n += 2; z >>= 2; } - if (z >= 0x00002) { n += 1;/* >>= 1;*/ } - return n; -} - -static int stbi__bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -// extract an arbitrarily-aligned N-bit value (N=bits) -// from v, and then make it 8-bits long and fractionally -// extend it to full full range. -static int stbi__shiftsigned(unsigned int v, int shift, int bits) -{ - static unsigned int mul_table[9] = { - 0, - 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, - 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, - }; - static unsigned int shift_table[9] = { - 0, 0,0,1,0,2,4,6,0, - }; - if (shift < 0) - v <<= -shift; - else - v >>= shift; - STBI_ASSERT(v >= 0 && v < 256); - v >>= (8-bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; -} - -typedef struct -{ - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; -} stbi__bmp_data; - -static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) -{ - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *) 1; -} - - -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, all_a; - stbi_uc pal[256][4]; - int psize=0,i,j,width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - 14 - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - 14 - info.hsz) >> 2; - } - - if (info.bpp == 24 && ma == 0xff000000) - s->img_n = 3; - else - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; - else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - if (info.bpp == 1) { - for (j=0; j < (int) s->img_y; ++j) { - int bit_offset = 7, v = stbi__get8(s); - for (i=0; i < (int) s->img_x; ++i) { - int color = (v>>bit_offset)&0x1; - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - if((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); - } - } - stbi__skip(s, pad); - } - } else { - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - stbi__skip(s, pad); - } - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - stbi__skip(s, info.offset - 14 - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - unsigned char a; - out[z+2] = stbi__get8(s); - out[z+1] = stbi__get8(s); - out[z+0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - unsigned int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i]; p1[i] = p2[i]; p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) -{ - // only RGB or RGBA (incl. 16bit) or grey allowed - if (is_rgb16) *is_rgb16 = 0; - switch(bits_per_pixel) { - case 8: return STBI_grey; - case 16: if(is_grey) return STBI_grey_alpha; - // fallthrough - case 15: if(is_rgb16) *is_rgb16 = 1; - return STBI_rgb; - case 24: // fallthrough - case 32: return bits_per_pixel/8; - default: return 0; - } -} - -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if( tga_colormap_type > 1 ) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if ( tga_colormap_type == 1 ) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s,9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if( tga_w < 1 ) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if( tga_h < 1 ) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if(!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context *s) -{ - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if ( tga_color_type == 1 ) { // colormapped (paletted) image - if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - stbi__skip(s,4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s,9); // skip colormap specification and image x/y origin - } - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - -errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) -{ - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255)/31); - out[1] = (stbi_uc)((g * 255)/31); - out[2] = (stbi_uc)((b * 255)/31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16=0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - STBI_NOTUSED(tga_x_origin); // @TODO - STBI_NOTUSED(tga_y_origin); // @TODO - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset ); - - if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { - for (i=0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if ( tga_indexed) - { - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc *pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i=0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if ( pal_idx >= tga_palette_len ) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else if(tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i*tga_comp+j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - STBI_FREE( tga_palette ); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) - { - unsigned char* tga_pixel = tga_data; - for (i=0; i < tga_width * tga_height; ++i) - { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - STBI_NOTUSED(tga_palette_start); - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s) -{ - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) -{ - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w,h; - stbi_uc *out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s,stbi__get32be(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s) ); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *) stbi__malloc(4 * w*h); - - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc *p = out+channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16) stbi__get16be(s); - } else { - stbi_uc *p = out+channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i=0; i < w*h; ++i) { - stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); - pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); - pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); - } - } - } else { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - if (comp) *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context *s) -{ - int i; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - stbi__get8(s); - - if (!stbi__pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} stbi__pic_packet; - -static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); - dest[i]=stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return stbi__errpuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; y<height; ++y) { - int packet_idx; - - for(packet_idx=0; packet_idx < num_packets; ++packet_idx) { - stbi__pic_packet *packet = &packets[packet_idx]; - stbi_uc *dest = result+y*width*4; - - switch (packet->type) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;x<width;++x, dest+=4) - if (!stbi__readval(s,packet->channel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=stbi__get8(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (stbi_uc) left; - - if (!stbi__readval(s,packet->channel,value)) return 0; - - for(i=0; i<count; ++i,dest+=4) - stbi__copyval(packet->channel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count==128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file","scanline overrun"); - - if (!stbi__readval(s,packet->channel,value)) - return 0; - - for(i=0;i<count;++i, dest += 4) - stbi__copyval(packet->channel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;i<count;++i, dest+=4) - if (!stbi__readval(s,packet->channel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) -{ - stbi_uc *result; - int i, x,y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) comp = &internal_comp; - - for (i=0; i<92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); //skip `ratio' - stbi__get16be(s); //skip `fields' - stbi__get16be(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { - STBI_FREE(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=stbi__convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi__pic_test(stbi__context *s) -{ - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct -{ - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct -{ - int w,h; - stbi_uc *out; // output buffer (always 4 components) - stbi_uc *background; // The current "background" as far as a gif is concerned - stbi_uc *history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[8192]; - stbi_uc *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; - int delay; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context *s) -{ - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') return 0; - if (stbi__get8(s) != 'a') return 0; - return 1; -} - -static int stbi__gif_test(stbi__context *s) -{ - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) -{ - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); - return 0; - } - if (x) *x = g->w; - if (y) *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) -{ - stbi_uc *p, *c; - int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - idx = g->cur_x + g->cur_y; - p = &g->out[idx]; - g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; - if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) -{ - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc) init_code; - g->codes[init_code].suffix = (stbi_uc) init_code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32) stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) { - return stbi__errpuc("no clear code", "Corrupt GIF"); - } - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 8192) { - return stbi__errpuc("too many codes", "Corrupt GIF"); - } - - p->prefix = (stbi__int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -// two back is the image from two frames ago, used for a very specific disposal format -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) -{ - int dispose; - int first_frame; - int pi; - int pcount; - STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) - first_frame = 0; - if (g->out == 0) { - if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) - return stbi__errpuc("too large", "GIF image is too large"); - pcount = g->w * g->h; - g->out = (stbi_uc *) stbi__malloc(4 * pcount); - g->background = (stbi_uc *) stbi__malloc(4 * pcount); - g->history = (stbi_uc *) stbi__malloc(pcount); - if (!g->out || !g->background || !g->history) - return stbi__errpuc("outofmem", "Out of memory"); - - // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" - // color refers to the color that was there the previous frame. - memset(g->out, 0x00, 4 * pcount); - memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) - memset(g->history, 0x00, pcount); // pixels that were affected previous frame - first_frame = 1; - } else { - // second frame - how do we dispoase of the previous one? - dispose = (g->eflags & 0x1C) >> 2; - pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background - } - - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); - } - } - } else if (dispose == 2) { - // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); - } - } - } else { - // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - - // background is what out is after the undoing of the previou frame; - memcpy( g->background, g->out, 4 * g->w * g->h ); - } - - // clear my history; - memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame - - for (;;) { - int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { - stbi__int32 x, y, w, h; - stbi_uc *o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - // if the width of the specified rectangle is 0, that means - // we may not see *any* pixels or the image is malformed; - // to make sure this is caught, move the current y down to - // max_y (which is what out_gif_code checks). - if (w == 0) - g->cur_y = g->max_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *) g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (!o) return NULL; - - // if this was the first frame, - pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { - g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; - memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); - } - } - } - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. - - // unset old transparent - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 255; - } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent - stbi__skip(s, 1); - g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *) s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } -} - -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - if (stbi__gif_test(s)) { - int layers = 0; - stbi_uc *u = 0; - stbi_uc *out = 0; - stbi_uc *two_back = 0; - stbi__gif g; - int stride; - memset(&g, 0, sizeof(g)); - if (delays) { - *delays = 0; - } - - do { - u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - - if (u) { - *x = g.w; - *y = g.h; - ++layers; - stride = g.w * g.h * 4; - - if (out) { - out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); - if (delays) { - *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); - } - } else { - out = (stbi_uc*)stbi__malloc( layers * stride ); - if (delays) { - *delays = (int*) stbi__malloc( layers * sizeof(int) ); - } - } - memcpy( out + ((layers - 1) * stride), u, stride ); - if (layers >= 2) { - two_back = out - 2 * stride; - } - - if (delays) { - (*delays)[layers - 1U] = g.delay; - } - } - } while (u != 0); - - // free temp buffer; - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - - // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - - *z = layers; - return out; - } else { - return stbi__errpuc("not GIF", "Image was not as a gif type."); - } -} - -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - - // moved conversion to after successful load so that the same - // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); - } else if (g.out) { - // if there was an error and we allocated an image buffer, free it! - STBI_FREE(g.out); - } - - // free buffers needed for multiple frame loading; - STBI_FREE(g.history); - STBI_FREE(g.background); - - return u; -} - -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) -{ - return stbi__gif_info_raw(s,x,y,comp); -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s, const char *signature) -{ - int i; - for (i=0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context* s) -{ - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if(!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN-1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char) stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - const char *headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s,buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int) strtol(token, NULL, 10); - - *x = width; - *y = height; - - if (comp) *comp = 3; - if (req_comp == 0) req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc) c1; - rgbe[1] = (stbi_uc) c2; - rgbe[2] = (stbi_uc) len; - rgbe[3] = (stbi_uc) stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i=0; i < width; ++i) - stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int dummy; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind( s ); - return 0; - } - - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi__rewind( s ); - return 0; - } - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *y = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *x = (int) strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) -{ - void *p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - stbi__rewind( s ); - if (p == NULL) - return 0; - if (x) *x = s->img_x; - if (y) *y = s->img_y; - if (comp) { - if (info.bpp == 24 && info.ma == 0xff000000) - *comp = 3; - else - *comp = info.ma ? 4 : 3; - } - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) -{ - int channelCount, dummy, depth; - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 8 && depth != 16) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind( s ); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi__psd_is16(stbi__context *s) -{ - int channelCount, depth; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - (void) stbi__get32be(s); - (void) stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind( s ); - return 0; - } - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained,dummy; - stbi__pic_packet packets[10]; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind( s); - return 0; - } - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi__rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) -// Does not support 16-bit-per-channel - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context *s) -{ - char p, t; - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); - return 0; - } - return 1; -} - -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - STBI_NOTUSED(ri); - - if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) - return 0; - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - - if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - stbi__getn(s, out, s->img_n * s->img_x * s->img_y); - - if (req_comp && req_comp != s->img_n) { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) -{ - return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; -} - -static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) -{ - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) - *c = (char) stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int stbi__pnm_getinteger(stbi__context *s, char *c) -{ - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value*10 + (*c - '0'); - *c = (char) stbi__get8(s); - } - - return value; -} - -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) -{ - int maxv, dummy; - char c, p, t; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char) stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - - if (maxv > 255) - return stbi__err("max value > 255", "PPM image not 8-bit"); - else - return 1; -} -#endif - -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -{ - #ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) return 1; - #endif - - // test tga last because it's a crappy test! - #ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; - #endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -static int stbi__is_16_main(stbi__context *s) -{ - #ifndef STBI_NO_PNG - if (stbi__png_is16(s)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_is16(s)) return 1; - #endif - - return 0; -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} - -STBIDEF int stbi_is_16_bit(char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_is_16_bit_from_file(f); - fclose(f); - return result; -} - -STBIDEF int stbi_is_16_bit_from_file(FILE *f) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__is_16_main(&s); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__is_16_main(&s); -} - -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__is_16_main(&s); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug - 1-bit BMP - *_is_16_bit api - avoid warnings - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/Build/source/texk/web2c/hitexdir/hintview/src/tables.c b/Build/source/texk/web2c/hitexdir/hintview/src/tables.c deleted file mode 100644 index b4a474b99af..00000000000 --- a/Build/source/texk/web2c/hitexdir/hintview/src/tables.c +++ /dev/null @@ -1,112 +0,0 @@ -#include "basetypes.h" -#include "format.h" - -const char *content_name[32]={"list", "param", "range", "xdimen", "adjust", "glyph", "kern", "glue", "ligature", "disc", "language", "rule", "image", "leaders", "baseline", "hbox", "vbox", "par", "math", "table", "item", "hset", "vset", "hpack", "vpack", "stream", "page", "link", "undefined1", "undefined2", "undefined3", "penalty"}; - -const char *definition_name[32]={"list", "param", "range", "xdimen", "adjust", "font", "dimen", "glue", "ligature", "disc", "language", "rule", "image", "leaders", "baseline", "hbox", "vbox", "par", "math", "table", "item", "hset", "vset", "hpack", "vpack", "stream", "page", "label", "undefined1", "undefined2", "undefined3", "int"}; - -int max_outline=-1; - -int32_t int_defaults[MAX_INT_DEFAULT+1]={0, 100, 200, 10, 50, 50, 150, 150, 50, 100, 10000, 0, 0, 10000, 5000, 10000, 0, 720, 4, 7, 1776, 1, 20000}; - -Dimen dimen_defaults[MAX_DIMEN_DEFAULT+1]={0x0, 0x1d5c147, 0x28333f7, 0x0, 0x0, 0x38000, 0x0, 0x0, 0xa0000, 0xa0000}; - -Glue glue_defaults[MAX_GLUE_DEFAULT+1]={ -{{0x0, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0x0, 0.000000, 0.000000},{1.000000, 1},{0.000000, 0}}, -{{0x0, 0.000000, 0.000000},{1.000000, 2},{0.000000, 0}}, -{{0x10000, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0xc0000, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0xc0000, 0.000000, 0.000000},{3.000000, 0},{9.000000, 0}}, -{{0xc0000, 0.000000, 0.000000},{3.000000, 0},{9.000000, 0}}, -{{0x0, 0.000000, 0.000000},{3.000000, 0},{0.000000, 0}}, -{{0x70000, 0.000000, 0.000000},{3.000000, 0},{4.000000, 0}}, -{{0x0, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0x0, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0xa0000, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0x80000, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0x0, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, -{{0x0, 0.000000, 0.000000},{1.000000, 1},{0.000000, 0}}, -}; - -Xdimen xdimen_defaults[MAX_XDIMEN_DEFAULT+1]={{0x0, 0.0, 0.0}, {0x0, 1.0, 0.0}, {0x0, 0.0, 1.0}}; - -Baseline baseline_defaults[MAX_BASELINE_DEFAULT+1]={{{{0x0, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, {{0x0, 0.000000, 0.000000},{0.000000, 0},{0.000000, 0}}, 0x0}}; - -Label label_defaults[MAX_LABEL_DEFAULT+1]={{0,LABEL_TOP,true,0,0,0}}; - -int max_fixed[32]= {0, 0, 0, 2, 65536, -1, 0, 2, -1, -1, -1, -1, -1, -1, 0, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 0, 0, -1, 65536, 65536, 65536, 0}; - -int max_default[32]= {0, 0, 0, 2, -1, -1, 9, 14, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, 22}; - -int max_ref[32]= {0, 0, 0, 2, -1, -1, 9, 14, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, 22}; - -signed char hnode_size[0x100]= { -0,0,0,0,0,0,0,0, /* list */ -0,0,0,0,0,0,0,0, /* param */ -0,0,0,0,0,0,0,0, /* range */ -0,6,6,10,6,10,10,14, /* xdimen */ -0,-4*1+0,0,0,0,0,0,0, /* adjust */ -0,4,5,6,7,0,0,0, /* glyph */ -3,3,6,-4*1+0,3,3,6,-4*1+0, /* kern */ -3,6,6,10,6,10,10,-4*9+0, /* glue */ -3,4,5,6,7,8,9,-4*2+0, /* ligature */ -3,0,-4*1+0,-4*1+1,3,0,-4*2+0,-4*2+1, /* disc */ -3,2,2,2,2,2,2,2, /* language */ -3,6,6,10,6,10,10,14, /* rule */ -3,-4*11+0,-4*11+0,-4*11+0,-4*9+0,-4*8+1,-4*8+1,-4*7+2, /* image */ -3,-4*1+0,-4*1+0,-4*1+0,0,-4*1+1,-4*1+1,-4*1+1, /* leaders */ -3,6,-4*1+0,-4*5+0,-4*1+0,-4*5+0,-4*1+1,-4*5+1, /* baseline */ --4*9+0,-4*13+0,-4*13+0,-4*17+0,-4*14+0,-4*18+0,-4*18+0,-4*22+0, /* hbox */ --4*9+0,-4*13+0,-4*13+0,-4*17+0,-4*14+0,-4*18+0,-4*18+0,-4*22+0, /* vbox */ --4*3+0,0,-4*2+1,0,-4*2+1,0,-4*1+2,0, /* par */ --4*2+0,-4*2+1,-4*2+1,2,-4*1+1,-4*1+2,-4*1+2,2, /* math */ --4*2+1,-4*2+1,-4*2+1,-4*2+1,-4*1+2,-4*1+2,-4*1+2,-4*1+2, /* table */ --4*1+0,-4*1+0,-4*1+0,-4*1+0,-4*1+0,-4*1+0,-4*1+0,-4*2+0, /* item */ --4*18+0,-4*22+0,-4*22+0,-4*26+0,-4*17+1,-4*21+1,-4*21+1,-4*25+1, /* hset */ --4*18+0,-4*22+0,-4*22+0,-4*26+0,-4*17+1,-4*21+1,-4*21+1,-4*25+1, /* vset */ --4*2+0,-4*2+0,-4*6+0,-4*6+0,-4*1+1,-4*1+1,-4*5+1,-4*5+1, /* hpack */ --4*6+0,-4*6+0,-4*10+0,-4*10+0,-4*5+1,-4*5+1,-4*9+1,-4*9+1, /* vpack */ --4*3+0,0,-4*2+1,0,3,0,0,0, /* stream */ -0,0,0,0,0,0,0,0, /* page */ -3,4,3,4,0,0,0,0, /* link */ -0,0,0,0,0,0,0,0, /* undefined1 */ -0,0,0,0,0,0,0,0, /* undefined2 */ -0,0,0,0,0,0,0,0, /* undefined3 */ -3,3,4,6,0,0,0,0}; /* penalty */ - - -uint8_t content_known[32]= { -0x00, /* list */ -0x00, /* param */ -0x00, /* range */ -0xFE, /* xdimen */ -0x02, /* adjust */ -0x1E, /* glyph */ -0xFF, /* kern */ -0xFF, /* glue */ -0xFF, /* ligature */ -0xDD, /* disc */ -0xFF, /* language */ -0xFF, /* rule */ -0xFF, /* image */ -0xEF, /* leaders */ -0xFF, /* baseline */ -0xFF, /* hbox */ -0xFF, /* vbox */ -0x55, /* par */ -0xFF, /* math */ -0xFF, /* table */ -0xFF, /* item */ -0xFF, /* hset */ -0xFF, /* vset */ -0xFF, /* hpack */ -0xFF, /* vpack */ -0x15, /* stream */ -0x00, /* page */ -0x0F, /* link */ -0x00, /* undefined1 */ -0x00, /* undefined2 */ -0x00, /* undefined3 */ -0x0F}; /* penalty */ - diff --git a/Build/source/texk/web2c/hitexdir/tex/Makefile b/Build/source/texk/web2c/hitexdir/tex/Makefile index 5e84ea3956e..d5e00c77fff 100644 --- a/Build/source/texk/web2c/hitexdir/tex/Makefile +++ b/Build/source/texk/web2c/hitexdir/tex/Makefile @@ -14,7 +14,7 @@ install: $(INSTALL_DATA) $$f $(hitex_tex_dir)/ || exit 1; done cd $(hitex_tex_dir) && /bin/pwd && svn status -fmt: hitex.fmt +fmt: hitex.fmt hilatex.fmt hitex.fmt: hitex.ini hitex -ini -etex -ltx $< |