ref: 7b5c4a96e1511786a3976ebb7c74fbf58631b9a9
parent: 415cc7c9054c002eac79ffdd9be3b77e1befea50
author: Werner Lemberg <[email protected]>
date: Sat Jul 8 18:57:11 EDT 2000
Removed `demos' tree. Use `ft2demos' module instead.
--- a/demos/Makefile
+++ /dev/null
@@ -1,288 +1,0 @@
-all: exes
-
-####################################################################
-#
-# TOP is the directory where the main FreeType source is found,
-# as well as the 'config.mk' file
-#
-# TOP2 is the directory is the top of the demonstration
-# programs directory
-#
-
-ifndef TOP
- TOP := ..
-endif
-
-ifndef TOP2
- TOP2 := $(TOP)/demos
-endif
-
-######################################################################
-#
-# MY_CONFIG_MK points to the current "config.mk" to use. It is
-# defined by default as $(TOP)/config.mk
-#
-ifndef CONFIG_MK
- CONFIG_MK := $(TOP)/config.mk
-endif
-
-####################################################################
-#
-# Check that we have a working `config.mk' in the above directory.
-# If not, issue a warning message, then stop there..
-#
-ifeq ($(wildcard $(CONFIG_MK)),)
- no_config_mk := 1
-endif
-
-ifdef no_config_mk
- exes:
- @echo Please compile the library before the demo programs!
- clean distclean:
- @echo "I need \`$(TOP)/config.mk' to do that!"
-else
-
- ####################################################################
- #
- # Good, now include the `config.mk' in order to know how to build
- # object files from sources, as well as other things (compiler flags)
- #
- include $(CONFIG_MK)
-
-
- ####################################################################
- #
- # Define a few important variables now
- #
- TOP_ := $(TOP)$(SEP)
- TOP2_ := $(TOP2)$(SEP)
- SRC_ := $(TOP)$(SEP)src$(SEP)
-
- BIN_ := bin$(SEP)
- OBJ_ := obj$(SEP)
-
- GRAPH_DIR := graph
-
- ifeq ($(TOP),..)
- SRC_DIR := src
- else
- SRC_DIR := $(TOP2_)src
- endif
-
- SRC_DIR_ := $(SRC_DIR)$(SEP)
-
- FT_INCLUDES := $(BUILD) $(TOP_)config $(TOP_)include $(SRC_) $(SRC_DIR)
-
- COMPILE = $(CC) $(CFLAGS) $(INCLUDES:%=$I%)
- FTLIB := $(TOP_)$(LIB_DIR)$(SEP)$(LIBRARY).$A
-
- # the default commands used to link the executables. These can
- # be re-defined for platform-specific stuff..
- #
- LINK = $(CC) $T$@ $< $(FTLIB) $(EFENCE) $(LDFLAGS)
-
- # the program "src/ftstring.c" used the math library which isn't linked
- # with the program by default on Unix, we thus add it whenever appropriate
- #
- ifeq ($(PLATFORM),unix)
- LINK += -lm
- endif
-
- COMMON_LINK = $(LINK) $(COMMON_OBJ)
- GRAPH_LINK = $(COMMON_LINK) $(GRAPH_LIB)
- GRAPH_LINK2 = $(GRAPH_LINK) $(EXTRA_GRAPH_OBJS)
-
- .PHONY: exes clean distclean
-
- ###################################################################
- #
- # Include the rules needed to compile the graphics sub-system.
- # This will also select which graphics driver to compile to the
- # sub-system..
- #
- include $(GRAPH_DIR)/rules.mk
-
- ####################################################################
- #
- # Detect DOS-like platforms, currently DOS, Win 3.1, Win32 & OS/2
- #
- ifneq ($(findstring $(PLATFORM),os2 win16 win32 dos),)
- DOSLIKE := 1
- endif
-
-
- ###################################################################
- #
- # Clean-up rules. Because the `del' command on DOS-like platforms
- # cannot take a long list of arguments, we simply erase the directory
- # contents.
- #
- ifdef DOSLIKE
-
- clean_demo:
- -del obj\*.$O 2> nul
- -del $(subst /,\,$(TOP2))\src\*.bak 2> nul
-
- distclean_demo: clean_demo
- -del obj\*.lib 2> nul
- -del bin\*.exe 2> nul
-
- else
-
- clean_demo:
- -$(DELETE) $(OBJ_)*.$O
- -$(DELETE) $(SRC_)*.bak graph$(SEP)*.bak
- -$(DELETE) $(SRC_)*~ graph$(SEP)*~
-
- distclean_demo: clean_demo
- -$(DELETE) $(EXES:%=$(BIN_)%$E)
- -$(DELETE) $(GRAPH_LIB)
-
- endif
-
- clean: clean_demo
- distclean: distclean_demo
-
- ####################################################################
- #
- # Compute the executable suffix to use, and put it in `E'.
- # It is ".exe" on DOS-ish platforms, and nothing otherwise.
- #
- ifdef DOSLIKE
- E := .exe
- else
- E :=
- endif
-
- ###################################################################
- #
- # The list of demonstration programs to build.
- #
-# EXES := ftlint ftview fttimer compos ftstring memtest ftmulti
- EXES := ftlint ftview fttimer ftstring memtest ftmulti
-
- ifneq ($(findstring $(PLATFORM),os2 unix win32),)
- EXES += ttdebug
- endif
-
- exes: $(EXES:%=$(BIN_)%$E)
-
-
- INCLUDES := $(FT_INCLUDES)
-
- ####################################################################
- #
- # Rules for compiling object files for text-only demos
- #
- COMMON_OBJ := $(OBJ_)common.$O
- $(COMMON_OBJ): $(SRC_DIR_)common.c
- ifdef DOSLIKE
- $(COMPILE) $T$@ $< $DEXPAND_WILDCARDS
- else
- $(COMPILE) $T$@ $<
- endif
-
-
- $(OBJ_)%.$O: $(SRC_DIR_)%.c $(FTLIB)
- $(COMPILE) $T$@ $<
-
- $(OBJ_)ftlint.$O: $(SRC_DIR_)ftlint.c
- $(COMPILE) $T$@ $<
-
- $(OBJ_)compos.$O: $(SRC_DIR_)compos.c
- $(COMPILE) $T$@ $<
-
- $(OBJ_)memtest.$O: $(SRC_DIR_)memtest.c
- $(COMPILE) $T$@ $<
-
- $(OBJ_)fttry.$O: $(SRC_DIR_)fttry.c
- $(COMPILE) $T$@ $<
-
-
- $(OBJ_)ftview.$O: $(SRC_DIR_)ftview.c $(GRAPH_LIB)
- $(COMPILE) $(GRAPH_INCLUDES:%=$I%) $T$@ $<
-
- $(OBJ_)ftmulti.$O: $(SRC_DIR_)ftmulti.c $(GRAPH_LIB)
- $(COMPILE) $(GRAPH_INCLUDES:%=$I%) $T$@ $<
-
- $(OBJ_)ftstring.$O: $(SRC_DIR_)ftstring.c $(GRAPH_LIB)
- $(COMPILE) $(GRAPH_INCLUDES:%=$I%) $T$@ $<
-
- $(OBJ_)fttimer.$O: $(SRC_DIR_)fttimer.c $(GRAPH_LIB)
- $(COMPILE) $(GRAPH_INCLUDES:%=$I%) $T$@ $<
-
-
-
-# $(OBJ_)ftsbit.$O: $(SRC_DIR)/ftsbit.c $(GRAPH_LIB)
-# $(COMPILE) $T$@ $<
-
-
- ####################################################################
- #
- # Special rule to compile the `t1dump' program as it includes
- # the Type1 source path
- #
- $(OBJ_)t1dump.$O: $(SRC_DIR)/t1dump.c
- $(COMPILE) $T$@ $<
-
-
- ####################################################################
- #
- # Special rule to compile the `ttdebug' program as it includes
- # the TrueType source path and needs extra flags for correct keyboard
- # handling on Unix
-
- # POSIX TERMIOS: Do not define if you use OLD U*ix like 4.2BSD.
- #
- # detect a Unix system
- ifeq ($(PLATFORM),unix)
- EXTRAFLAGS = $DUNIX $DHAVE_POSIX_TERMIOS
- endif
-
- $(OBJ_)ttdebug.$O: $(SRC_DIR)/ttdebug.c
- $(COMPILE) $T$@ $< $(EXTRAFLAGS)
-
-
- ####################################################################
- #
- # Rules used to link the executables. Note that they could be
- # over-ridden by system-specific things..
- #
- $(BIN_)ftlint$E: $(OBJ_)ftlint.$O $(FTLIB) $(COMMON_OBJ)
- $(COMMON_LINK)
-
- $(BIN_)memtest$E: $(OBJ_)memtest.$O $(FTLIB) $(COMMON_OBJ)
- $(COMMON_LINK)
-
- $(BIN_)compos$E: $(OBJ_)compos.$O $(FTLIB) $(COMMON_OBJ)
- $(COMMON_LINK)
-
- $(BIN_)fttry$E: $(OBJ_)fttry.$O $(FTLIB)
- $(LINK)
-
- $(BIN_)ftsbit$E: $(OBJ_)ftsbit.$O $(FTLIB)
- $(LINK)
-
- $(BIN_)t1dump$E: $(OBJ_)t1dump.$O $(FTLIB)
- $(LINK)
-
- $(BIN_)ttdebug$E: $(OBJ_)ttdebug.$O $(FTLIB)
- $(LINK)
-
-
- $(BIN_)ftview$E: $(OBJ_)ftview.$O $(FTLIB) $(GRAPH_LIB) $(COMMON_OBJ)
- $(GRAPH_LINK)
-
- $(BIN_)ftmulti$E: $(OBJ_)ftmulti.$O $(FTLIB) $(GRAPH_LIB) $(COMMON_OBJ)
- $(GRAPH_LINK)
-
- $(BIN_)ftstring$E: $(OBJ_)ftstring.$O $(FTLIB) $(GRAPH_LIB) $(COMMON_OBJ)
- $(GRAPH_LINK)
-
- $(BIN_)fttimer$E: $(OBJ_)fttimer.$O $(FTLIB) $(GRAPH_LIB) $(COMMON_OBJ)
- $(GRAPH_LINK)
-
-
-endif
-
-# EOF
--- a/demos/bin/README
+++ /dev/null
@@ -1,1 +1,0 @@
-This directory contains all executables for the FreeType demo programs
--- a/demos/graph/graph.h
+++ /dev/null
@@ -1,632 +1,0 @@
-/***************************************************************************
- *
- * graph.h
- *
- * Graphics Subsystem interface
- *
- * Copyright 1999 - The FreeType Development Team - www.freetype.org
- *
- *
- *
- *
- ***************************************************************************/
-
-#ifndef GRAPH_H
-#define GRAPH_H
-
-#include "grevents.h"
-
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /******** ********/
- /******** GENERAL DEFINITIONS AND BLITTING ROUTINES ********/
- /******** ********/
- /******** ********/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
-
-
- /* define the global error variable */
- extern int grError;
-
- /* initialisation */
- extern int grInit( void );
-
- /* finalisation */
- extern void grDone( void );
-
-
- /* pixel mode constants */
- typedef enum grPixelMode
- {
- gr_pixel_mode_none = 0,
- gr_pixel_mode_mono, /* monochrome bitmaps */
- gr_pixel_mode_pal4, /* 4-bit paletted - 16 colors */
- gr_pixel_mode_pal8, /* 8-bit paletted - 256 colors */
- gr_pixel_mode_gray, /* 8-bit gray levels */
- gr_pixel_mode_rgb555, /* 15-bits mode - 32768 colors */
- gr_pixel_mode_rgb565, /* 16-bits mode - 65536 colors */
- gr_pixel_mode_rgb24, /* 24-bits mode - 16 million colors */
- gr_pixel_mode_rgb32, /* 32-bits mode - 16 million colors */
-
- gr_pixel_mode_max /* don't remove */
-
- } grPixelMode;
-
-
- /* forward declaration of the surface class */
- typedef struct grSurface_ grSurface;
-
-
- /*********************************************************************
- *
- * <Struct>
- * grBitmap
- *
- * <Description>
- * a simple bitmap descriptor
- *
- * <Fields>
- * rows :: height in pixels
- * width :: width in pixels
- * pitch :: + or - the number of bytes per row
- * mode :: pixel mode of bitmap buffer
- * grays :: number of grays in palette for PAL8 mode. 0 otherwise
- * buffer :: pointer to pixel buffer
- *
- * <Note>
- * the 'pitch' is positive for downward flows, and negative otherwise
- * Its absolute value is always the number of bytes taken by each
- * bitmap row.
- *
- * All drawing operations will be performed within the first
- * "width" pixels of each row (clipping is always performed).
- *
- ********************************************************************/
-
- typedef struct grBitmap_
- {
- int rows;
- int width;
- int pitch;
- grPixelMode mode;
- int grays;
- char* buffer;
-
- } grBitmap;
-
-
-
- typedef long grPos;
- typedef char grBool;
-
- typedef struct grVector_
- {
- grPos x;
- grPos y;
-
- } grVector;
-
-
- typedef union grColor_
- {
- long value;
- unsigned char chroma[4];
-
- } grColor;
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grNewBitmap
- *
- * <Description>
- * creates a new bitmap
- *
- * <Input>
- * pixel_mode :: the target surface's pixel_mode
- * num_grays :: number of grays levels for PAL8 pixel mode
- * width :: width in pixels
- * height :: height in pixels
- *
- * <Output>
- * bit :: descriptor of the new bitmap
- *
- * <Return>
- * Error code. 0 means success.
- *
- * <Note>
- * This function really allocates a pixel buffer, zero it, then
- * returns a descriptor for it.
- *
- * Call grDoneBitmap when you're done with it..
- *
- **********************************************************************/
-
- extern int grNewBitmap( grPixelMode pixel_mode,
- int num_grays,
- int width,
- int height,
- grBitmap *bit );
-
-
- /**********************************************************************
- *
- * <Function>
- * grBlitGlyphToBitmap
- *
- * <Description>
- * writes a given glyph bitmap to a target surface.
- *
- * <Input>
- * target :: handle to target bitmap
- * glyph :: handle to source glyph bitmap
- * x :: position of left-most pixel of glyph image in target surface
- * y :: position of top-most pixel of glyph image in target surface
- * color :: color to be used to draw a monochrome glyph
- *
- * <Return>
- * Error code. 0 means success
- *
- * <Note>
- * There are only two supported source pixel modes : monochrome
- * and gray. The 8-bit images can have any number of grays between
- * 2 and 128, and conversions to the target surface is handled
- * _automatically_.
- *
- * Note however that you should avoid blitting a gray glyph to a gray
- * bitmap with fewer levels of grays, as this would much probably
- * give unpleasant results..
- *
- * This function performs clipping
- *
- **********************************************************************/
-
- extern int grBlitGlyphToBitmap( grBitmap* target,
- grBitmap* glyph,
- grPos x,
- grPos y,
- grColor color );
-
-
- /**********************************************************************
- *
- * <Function>
- * grFillRectangle
- *
- * <Description>
- * this function is used to fill a given rectangle on a surface
- *
- * <Input>
- * surface :: handle to target surface
- * x :: x coordinate of the top-left corner of the rectangle
- * y :: y coordinate of the top-left corner of the rectangle
- * width :: rectangle width in pixels
- * height :: rectangle height in pixels
- * color :: fill color
- *
- **********************************************************************/
-
- extern void grFillRectangle( grBitmap* surface,
- grPos x,
- grPos y,
- grPos width,
- grPos height,
- grColor color );
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grWriteCellChar
- *
- * <Description>
- * The graphics sub-system contains an internal Latin1 8x8 font
- * which can be used to display simple strings of text without
- * using FreeType.
- *
- * This function writes a single 8x8 character on the target bitmap.
- *
- * <Input>
- * target :: handle to target surface
- * x :: x pixel position of character cell's top left corner
- * y :: y pixel position of character cell's top left corner
- * charcode :: Latin-1 character code
- * color :: color to be used to draw the character
- *
- **********************************************************************/
-
- extern
- void grWriteCellChar( grBitmap* target,
- int x,
- int y,
- int charcode,
- grColor color );
-
-
- /**********************************************************************
- *
- * <Function>
- * grWriteCellString
- *
- * <Description>
- * The graphics sub-system contains an internal Latin1 8x8 font
- * which can be used to display simple strings of text without
- * using FreeType.
- *
- * This function writes a string with the internal font
- *
- * <Input>
- * target :: handle to target bitmap
- * x :: x pixel position of string's top left corner
- * y :: y pixel position of string's top left corner
- * string :: Latin-1 text string
- * color :: color to be used to draw the character
- *
- **********************************************************************/
-
- extern
- void grWriteCellString( grBitmap* target,
- int x,
- int y,
- const char* string,
- grColor color );
-
- /**********************************************************************
- *
- * <Function>
- * grDoneBitmap
- *
- * <Description>
- * destroys a bitmap
- *
- * <Input>
- * bitmap :: handle to bitmap descriptor
- *
- * <Note>
- * This function does NOT release the bitmap descriptor, only
- * the pixel buffer.
- *
- **********************************************************************/
-
- extern void grDoneBitmap( grBitmap* bit );
-
-
-
-
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /******** ********/
- /******** DEVICE-SPECIFIC DEFINITIONS AND ROUTINES ********/
- /******** ********/
- /******** ********/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
-
-
- /* forward declaration - the definition of grDevice is not visible */
- /* to clients.. */
- typedef struct grDevice_ grDevice;
-
-
- /**********************************************************************
- *
- * <Struct>
- * grDeviceChain
- *
- * <Description>
- * a simple structure used to implement a linked list of
- * graphics device descriptors. The list is called a
- * "device chain"
- *
- * <Fields>
- * name :: ASCII name of the device, e.g. "x11", "os2pm", etc..
- * device :: handle to the device descriptor.
- * next :: next element in chain
- *
- * <Note>
- * the 'device' field is a blind pointer; it is thus unusable by
- * client applications..
- *
- **********************************************************************/
-
- typedef struct grDeviceChain_ grDeviceChain;
-
- struct grDeviceChain_
- {
- const char* name;
- grDevice* device;
- grDeviceChain* next;
- };
-
-
- /**********************************************************************
- *
- * <Function>
- * grInitDevices
- *
- * <Description>
- * This function is in charge of initialising all system-specific
- * devices. A device is responsible for creating and managing one
- * or more "surfaces". A surface is either a window or a screen,
- * depending on the system.
- *
- * <Return>
- * a pointer to the first element of a device chain. The chain can
- * be parsed to find the available devices on the current system
- *
- * <Note>
- * If a device cannot be initialised correctly, it is not part of
- * the device chain returned by this function. For example, if an
- * X11 device was compiled in the library, it will be part of
- * the returned device chain only if a connection to the display
- * could be establisged
- *
- * If no driver could be initialised, this function returns NULL.
- *
- **********************************************************************/
-
- extern
- grDeviceChain* grInitDevices( void );
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grGetDeviceModes
- *
- * <Description>
- * queries the available pixel modes for a device.
- *
- * <Input>
- * device_name :: name of device to be used. 0 for the default
- * device. For a list of available devices, see
- * grInitDevices.
- *
- * <Output>
- * num_modes :: number of available modes. 0 in case of error,
- * which really is an invalid device name.
- *
- * pixel_modes :: array of available pixel modes for this device
- * this table is internal to the device and should
- * not be freed by client applications.
- *
- * <Return>
- * error code. 0 means success. invalid device name otherwise
- *
- * <Note>
- * All drivers are _required_ to support at least the following
- * pixel formats :
- *
- * - gr_pixel_mode_mono : i.e. monochrome bitmaps
- * - gr_pixel_mode_gray : with any number of gray levels between
- * 2 and 256.
- *
- * the pixel modes do not provide the number of grays in the case
- * of "gray" devices. You should try to create a surface with the
- * maximal number (256, that is) and see the value returned in
- * the bitmap descriptor.
- *
- **********************************************************************/
-
- extern void grGetDeviceModes( const char* device_name,
- int *num_modes,
- grPixelMode* *pixel_modes );
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grNewSurface
- *
- * <Description>
- * creates a new device-specific surface. A surface is either
- * a window or a screen, depending on the device.
- *
- * <Input>
- * device :: name of the device to use. A value of NULL means
- * the default device (which depends on the system).
- * for a list of available devices, see grInitDevices.
- *
- * <InOut>
- * bitmap :: handle to a bitmap descriptor containing the
- * requested pixel mode, number of grays and dimensions
- * for the surface. the bitmap's 'pitch' and 'buffer'
- * fields are ignored on input.
- *
- * On output, the bitmap describes the surface's image
- * completely. It is possible to write directly in it
- * with grBlitGlyphToBitmap, even though the use of
- * grBlitGlyphToSurface is recommended.
- *
- * <Return>
- * handle to the corresponding surface object. 0 in case of error
- *
- * <Note>
- * All drivers are _required_ to support at least the following
- * pixel formats :
- *
- * - gr_pixel_mode_mono : i.e. monochrome bitmaps
- * - gr_pixel_mode_gray : with any number of gray levels between
- * 2 and 256.
- *
- * This function might change the bitmap descriptor's fields. For
- * example, when displaying a full-screen surface, the bitmap's
- * dimensions will be set to those of the screen (e.g. 640x480
- * or 800x600); also, the bitmap's 'buffer' field might point to
- * the Video Ram depending on the mode requested..
- *
- * The surface contains a copy of the returned bitmap descriptor,
- * you can thus discard the 'bitmap' parameter after the call.
- *
- **********************************************************************/
-
- extern grSurface* grNewSurface( const char* device,
- grBitmap* bitmap );
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grRefreshRectangle
- *
- * <Description>
- * this function is used to indicate that a given surface rectangle
- * was modified and thus needs re-painting. It really is useful for
- * windowed or gray surfaces.
- *
- * <Input>
- * surface :: handle to target surface
- * x :: x coordinate of the top-left corner of the rectangle
- * y :: y coordinate of the top-left corner of the rectangle
- * width :: rectangle width in pixels
- * height :: rectangle height in pixels
- *
- **********************************************************************/
-
- extern void grRefreshRectangle( grSurface* surface,
- grPos x,
- grPos y,
- grPos width,
- grPos height );
-
-
- /**********************************************************************
- *
- * <Function>
- * grRefreshSurface
- *
- * <Description>
- * a variation of grRefreshRectangle which repaints the whole surface
- * to the screen.
- *
- * <Input>
- * surface :: handle to target surface
- *
- **********************************************************************/
-
- extern void grRefreshSurface( grSurface* surface );
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grWriteSurfaceChar
- *
- * <Description>
- * This function is equivalent to calling grWriteCellChar on the
- * surface's bitmap, then invoking grRefreshRectangle.
- *
- * The graphics sub-system contains an internal Latin1 8x8 font
- * which can be used to display simple strings of text without
- * using FreeType.
- *
- * This function writes a single 8x8 character on the target bitmap.
- *
- * <Input>
- * target :: handle to target surface
- * x :: x pixel position of character cell's top left corner
- * y :: y pixel position of character cell's top left corner
- * charcode :: Latin-1 character code
- * color :: color to be used to draw the character
- *
- **********************************************************************/
-
- extern
- void grWriteSurfaceChar( grSurface* target,
- int x,
- int y,
- int charcode,
- grColor color );
-
-
- /**********************************************************************
- *
- * <Function>
- * grWriteSurfaceString
- *
- * <Description>
- * This function is equivalent to calling grWriteCellString on the
- * surface's bitmap, then invoking grRefreshRectangle.
- *
- * The graphics sub-system contains an internal Latin1 8x8 font
- * which can be used to display simple strings of text without
- * using FreeType.
- *
- * This function writes a string with the internal font
- *
- * <Input>
- * target :: handle to target bitmap
- * x :: x pixel position of string's top left corner
- * y :: y pixel position of string's top left corner
- * string :: Latin-1 text string
- * color :: color to be used to draw the character
- *
- **********************************************************************/
-
- extern
- void grWriteSurfaceString( grSurface* target,
- int x,
- int y,
- const char* string,
- grColor color );
-
-
- /**********************************************************************
- *
- * <Function>
- * grSetTitle
- *
- * <Description>
- * set the window title of a given windowed surface.
- *
- * <Input>
- * surface :: handle to target surface
- * title_string :: the new title
- *
- **********************************************************************/
-
- extern void grSetTitle( grSurface* surface,
- const char* title_string );
-
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grListenSurface
- *
- * <Description>
- * listen the events for a given surface
- *
- * <Input>
- * surface :: handle to target surface
- * event_mask :: the event mask (mode)
- *
- * <Output>
- * event :: the returned event
- *
- * <Note>
- * XXX : For now, only keypresses are supported.
- *
- **********************************************************************/
-
- extern
- int grListenSurface( grSurface* surface,
- int event_mask,
- grEvent *event );
-
-
-#endif /* GRAPH_H */
--- a/demos/graph/grblit.c
+++ /dev/null
@@ -1,1268 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1999 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* blitter.c: Support for blitting of bitmaps with various depth. */
-/* */
-/****************************************************************************/
-
-#include "grblit.h"
-#include "grobjs.h"
-
- static
- int compute_clips( grBlitter* blit,
- int x_offset,
- int y_offset )
- {
- int xmin, ymin, xmax, ymax, width, height, target_width;
-
- /* perform clipping and setup variables */
- width = blit->source.width;
- height = blit->source.rows;
-
- switch ( blit->source.mode )
- {
- case gr_pixel_mode_mono:
- width = (width + 7) & -8;
- break;
-
- case gr_pixel_mode_pal4:
- width = (width + 1) & -2;
- break;
-
- default:
- ;
- }
-
- xmin = x_offset;
- ymin = y_offset;
- xmax = xmin + width-1;
- ymax = ymin + height-1;
-
- /* clip if necessary */
- if ( width == 0 || height == 0 ||
- xmax < 0 || xmin >= blit->target.width ||
- ymax < 0 || ymin >= blit->target.rows )
- return 1;
-
- /* set up clipping and cursors */
- blit->yread = 0;
- if ( ymin < 0 )
- {
- blit->yread -= ymin;
- height += ymin;
- blit->ywrite = 0;
- }
- else
- blit->ywrite = ymin;
-
- if ( ymax >= blit->target.rows )
- height -= ymax - blit->target.rows + 1;
-
- blit->xread = 0;
- if ( xmin < 0 )
- {
- blit->xread -= xmin;
- width += xmin;
- blit->xwrite = 0;
- }
- else
- blit->xwrite = xmin;
-
- target_width = blit->target.width;
-
- switch ( blit->target.mode )
- {
- case gr_pixel_mode_mono:
- target_width = (target_width + 7) & -8;
- break;
- case gr_pixel_mode_pal4:
- target_width = (target_width + 1) & -2;
- break;
-
- default:
- ;
- }
-
- blit->right_clip = xmax - target_width + 1;
- if ( blit->right_clip > 0 )
- width -= blit->right_clip;
- else
- blit->right_clip = 0;
-
- blit->width = width;
- blit->height = height;
-
- /* set read and write to the top-left corner of the read */
- /* and write areas before clipping. */
-
- blit->read = (unsigned char*)blit->source.buffer;
- blit->write = (unsigned char*)blit->target.buffer;
-
- blit->read_line = blit->source.pitch;
- blit->write_line = blit->target.pitch;
-
- if ( blit->read_line < 0 )
- blit->read -= (blit->source.rows-1) * blit->read_line;
-
- if ( blit->write_line < 0 )
- blit->write -= (blit->target.rows-1) * blit->write_line;
-
- /* now go to the start line. Note that we do not move the */
- /* x position yet, as this is dependent on the pixel format */
- blit->read += blit->yread * blit->read_line;
- blit->write += blit->ywrite * blit->write_line;
-
- return 0;
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_mono_to_mono */
-/* */
-/**************************************************************************/
-
- static
- void blit_mono_to_mono( grBlitter* blit,
- grColor color )
- {
- int shift, left_clip, x, y;
- byte* read;
- byte* write;
-
- (void)color; /* unused argument */
-
- left_clip = ( blit->xread > 0 );
- shift = ( blit->xwrite - blit->xread ) & 7;
-
- read = blit->read + (blit->xread >> 3);
- write = blit->write + (blit->xwrite >> 3);
-
- if ( shift == 0 )
- {
- y = blit->height;
- do
- {
- byte* _read = read;
- byte* _write = write;
-
- x = blit->width;
-
- do
- {
- *_write++ |= *_read++;
- x -= 8;
- } while ( x > 0 );
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- } while ( y > 0 );
- }
- else
- {
- int first, last, count;
-
-
- first = blit->xwrite >> 3;
- last = (blit->xwrite + blit->width-1) >> 3;
-
- count = last - first;
-
- if ( blit->right_clip )
- count++;
-
- y = blit->height;
-
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- unsigned char old;
- int shift2 = (8-shift);
-
- if ( left_clip )
- old = (*_read++) << shift2;
- else
- old = 0;
-
- x = count;
- while ( x > 0 )
- {
- unsigned char val;
-
- val = *_read++;
- *_write++ |= ( (val >> shift) | old );
- old = val << shift2;
- x--;
- }
-
- if ( !blit->right_clip )
- *_write |= old;
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
-
- } while ( y > 0 );
- }
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_mono_to_pal8 */
-/* */
-/**************************************************************************/
-
- static
- void blit_mono_to_pal8( grBlitter* blit,
- grColor color )
- {
- int x, y;
- unsigned int left_mask;
- unsigned char* read;
- unsigned char* write;
-
- read = blit->read + (blit->xread >> 3);
- write = blit->write + blit->xwrite;
-
- left_mask = 0x80 >> (blit->xread & 7);
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- unsigned int mask = left_mask;
- unsigned int val = *_read;
-
-
- x = blit->width;
- do
- {
- if ( mask == 0x80 )
- val = *_read++;
-
- if ( val & mask )
- *_write = (unsigned char)color.value;
-
- mask >>= 1;
- if ( mask == 0 )
- mask = 0x80;
-
- _write++;
- x--;
- } while ( x > 0 );
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- } while ( y > 0 );
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_mono_to_pal4 */
-/* */
-/**************************************************************************/
-
- static
- void blit_mono_to_pal4( grBlitter* blit,
- grColor color )
- {
- int x, y, phase;
- unsigned int left_mask;
- unsigned char* read;
- unsigned char* write;
- unsigned char col;
-
-
- col = color.value & 15;
- read = blit->read + (blit->xread >> 3);
- write = blit->write + (blit->xwrite >> 1);
-
- /* now begin blit */
- left_mask = 0x80 >> (blit->xread & 7);
- phase = blit->xwrite & 1;
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- unsigned int mask = left_mask;
- int _phase = phase;
- unsigned int val = *_read;
-
- x = blit->width;
- do
- {
- if ( mask == 0x80 )
- val = *_read++;
-
- if ( val & mask )
- {
- if ( _phase )
- *_write = (*_write & 0xF0) | col;
- else
- *_write = (*_write & 0x0F) | (col << 4);
- }
-
- mask >>= 1;
- if ( mask == 0 )
- mask = 0x80;
-
- _write += _phase;
- _phase ^= 1;
- x--;
- } while ( x > 0 );
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- } while ( y > 0 );
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_mono_to_rgb16 */
-/* */
-/**************************************************************************/
-
- static
- void blit_mono_to_rgb16( grBlitter* blit,
- grColor color )
- {
- int x, y;
- unsigned int left_mask;
- unsigned char* read;
- unsigned char* write;
-
- read = blit->read + (blit->xread >> 3);
- write = blit->write + blit->xwrite*2;
-
- left_mask = 0x80 >> (blit->xread & 7);
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- unsigned int mask = left_mask;
- unsigned int val = *_read;
-
- x = blit->width;
- do
- {
- if ( mask == 0x80 )
- val = *_read++;
-
- if ( val & mask )
- *(short*)_write = (short)color.value;
-
- mask >>= 1;
- if ( mask == 0 )
- mask = 0x80;
-
- _write +=2;
- x--;
- } while ( x > 0 );
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- } while ( y > 0 );
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_mono_to_rgb24 */
-/* */
-/**************************************************************************/
-
- static
- void blit_mono_to_rgb24( grBlitter* blit,
- grColor color )
- {
- int x, y;
- unsigned int left_mask;
- unsigned char* read;
- unsigned char* write;
-
- read = blit->read + (blit->xread >> 3);
- write = blit->write + blit->xwrite*3;
-
- left_mask = 0x80 >> (blit->xread & 7);
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- unsigned int mask = left_mask;
- unsigned int val = *_read;
-
- x = blit->width;
- do
- {
- if ( mask == 0x80 )
- val = *_read++;
-
- if ( val & mask )
- {
- _write[0] = color.chroma[0];
- _write[1] = color.chroma[1];
- _write[2] = color.chroma[2];
- }
-
- mask >>= 1;
- if ( mask == 0 )
- mask = 0x80;
-
- _write += 3;
- x--;
- } while ( x > 0 );
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- } while ( y > 0 );
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_mono_to_rgb32 */
-/* */
-/**************************************************************************/
-
- static
- void blit_mono_to_rgb32( grBlitter* blit,
- grColor color )
- {
- int x, y;
- unsigned int left_mask;
- unsigned char* read;
- unsigned char* write;
-
- read = blit->read + (blit->xread >> 3);
- write = blit->write + blit->xwrite*4;
-
- left_mask = 0x80 >> (blit->xread & 7);
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- unsigned int mask = left_mask;
- unsigned int val = *_read;
-
- x = blit->width;
- do
- {
- if ( mask == 0x80 )
- val = *_read++;
-
- if ( val & mask )
- {
- /* this could be greatly optimised as a *(long*)_write = color.value */
- /* but this wouldn't work on 64-bits systems... stupid C types! */
- _write[0] = color.chroma[0];
- _write[1] = color.chroma[1];
- _write[2] = color.chroma[2];
- _write[3] = color.chroma[3];
- }
-
- mask >>= 1;
- if ( mask == 0 )
- mask = 0x80;
-
- _write += 4;
- x--;
- } while ( x > 0 );
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- } while ( y > 0 );
- }
-
-
-
- static
- const grBlitterFunc gr_mono_blitters[gr_pixel_mode_max] =
- {
- 0,
- blit_mono_to_mono,
- blit_mono_to_pal4,
- blit_mono_to_pal8,
- blit_mono_to_pal8,
- blit_mono_to_rgb16,
- blit_mono_to_rgb16,
- blit_mono_to_rgb24,
- blit_mono_to_rgb32
- };
-
-
- /*******************************************************************/
- /* */
- /* Saturation tables */
- /* */
- /*******************************************************************/
-
- typedef struct grSaturation_
- {
- int count;
- const byte* table;
-
- } grSaturation;
-
-
- static
- const byte gr_saturation_5[8] = { 0, 1, 2, 3, 4, 4, 4, 4 };
-
-
- static
- const byte gr_saturation_17[32] =
- {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- };
-
-
- static
- grSaturation gr_saturations[ GR_MAX_SATURATIONS ] =
- {
- { 5, gr_saturation_5 },
- { 17, gr_saturation_17 }
- };
-
- static
- int gr_num_saturations = 2;
-
- static
- grSaturation* gr_last_saturation = gr_saturations;
-
-
- extern
- const byte* grGetSaturation( int num_grays )
- {
- /* first of all, scan the current saturations table */
- grSaturation* sat = gr_saturations;
- grSaturation* limit = sat + gr_num_saturations;
-
- if ( num_grays < 2 )
- {
- grError = gr_err_bad_argument;
- return 0;
- }
-
- for ( ; sat < limit; sat++ )
- {
- if ( sat->count == num_grays )
- {
- gr_last_saturation = sat;
- return sat->table;
- }
- }
-
- /* not found, simply create a new entry if there is room */
- if (gr_num_saturations < GR_MAX_SATURATIONS)
- {
- int i;
- const byte* table;
-
- table = (const byte*)grAlloc( (3*num_grays-1)*sizeof(byte) );
- if (!table) return 0;
-
- sat->count = num_grays;
- sat->table = table;
-
- for ( i = 0; i < num_grays; i++, table++ )
- *(unsigned char*)table = (unsigned char)i;
-
- for ( i = 2*num_grays-1; i > 0; i--, table++ )
- *(unsigned char*)table = (unsigned char)(num_grays-1);
-
- gr_num_saturations++;
- gr_last_saturation = sat;
- return sat->table;
- }
- grError = gr_err_saturation_overflow;
- return 0;
- }
-
-
-
- /*******************************************************************/
- /* */
- /* conversion tables */
- /* */
- /*******************************************************************/
-
- typedef struct grConversion_
- {
- int target_grays;
- int source_grays;
- const byte* table;
-
- } grConversion;
-
-
-
- static
- const byte gr_gray5_to_gray17[5] = { 0, 4, 8, 12, 16 };
-
-
- static
- const byte gr_gray5_to_gray128[5] = { 0, 32, 64, 96, 127 };
-
-
- static
- const unsigned char gr_gray17_to_gray128[17] =
- {
- 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 127
- };
-
- static
- grConversion gr_conversions[ GR_MAX_CONVERSIONS ] =
- {
- { 17, 5, gr_gray5_to_gray17 },
- { 128, 5, gr_gray5_to_gray128 },
- { 128, 17, gr_gray17_to_gray128 }
- };
-
- static
- int gr_num_conversions = 3;
-
- static
- grConversion* gr_last_conversion = gr_conversions;
-
-
- extern
- const byte* grGetConversion( int target_grays,
- int source_grays )
- {
- grConversion* conv = gr_conversions;
- grConversion* limit = conv + gr_num_conversions;
-
- if ( target_grays < 2 || source_grays < 2 )
- {
- grError = gr_err_bad_argument;
- return 0;
- }
-
- /* otherwise, scan table */
- for ( ; conv < limit; conv++ )
- {
- if ( conv->target_grays == target_grays &&
- conv->source_grays == source_grays )
- {
- gr_last_conversion = conv;
- return conv->table;
- }
- }
-
- /* not found, add a new conversion to the table */
- if (gr_num_conversions < GR_MAX_CONVERSIONS)
- {
- const byte* table;
- int n;
-
- table = (const byte*)grAlloc( source_grays*sizeof(byte) );
- if (!table)
- return 0;
-
- conv->target_grays = target_grays;
- conv->source_grays = source_grays;
- conv->table = table;
-
- for ( n = 0; n < source_grays; n++ )
- ((unsigned char*)table)[n] = (unsigned char)(n*(target_grays-1)) /
- (source_grays-1);
-
- gr_num_conversions++;
- gr_last_conversion = conv;
- return table;
- }
- grError = gr_err_conversion_overflow;
- return 0;
- }
-
-
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_gray_to_gray */
-/* */
-/**************************************************************************/
-
- static
- void blit_gray_to_gray( grBlitter* blit,
- const byte* saturation,
- const byte* conversion )
- {
- int y;
- unsigned char* read;
- unsigned char* write;
- unsigned char max1;
- unsigned char max2;
-
- max1 = (unsigned char)(blit->source.grays-1);
- max2 = (unsigned char)(blit->target.grays-1);
-
- read = (unsigned char*)blit->read + blit->xread;
- write = (unsigned char*)blit->write + blit->xwrite;
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- int x = blit->width;
-
- while (x > 0)
- {
-#ifdef GR_CONFIG_GRAY_SKIP_WHITE
- unsigned char val = *_read;
-
- if (val)
- {
- if (val == max)
- *_write = max2;
- else
- *_write = saturation[ (int)*_write + conversion[ *_read ] ];
- }
-#else
- *_write = saturation[ (int)*_write + conversion[ *_read ] ];
-#endif
- _write++;
- _read++;
- x--;
- }
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- }
- while (y > 0);
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_gray_to_gray_simple */
-/* */
-/**************************************************************************/
-
- static
- void blit_gray_to_gray_simple( grBlitter* blit,
- const byte* saturation )
- {
- int y;
- unsigned char* read;
- unsigned char* write;
- unsigned char max;
-
- max = (unsigned char)(blit->source.grays-1);
-
- read = (unsigned char*)blit->read + blit->xread;
- write = (unsigned char*)blit->write + blit->xwrite;
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- int x = blit->width;
-
- while (x > 0)
- {
-#ifdef GR_CONFIG_GRAY_SKIP_WHITE
- unsigned char val = *_read;
-
- if (val)
- {
- if (val == max)
- *_write = val;
- else
- *_write = saturation[ (int)*_write + *_read ];
- }
-#else
- *_write = saturation[ (int)*_write + *_read ];
-#endif
- _write++;
- _read++;
- x--;
- }
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- }
- while (y > 0);
- }
-
-
-
-#define compose_pixel( a, b, n, max ) \
- { \
- int d, half = max >> 1; \
- \
- d = (int)b.chroma[0] - a.chroma[0]; \
- a.chroma[0] += (n*d + half)/max; \
- \
- d = (int)b.chroma[1] - a.chroma[1]; \
- a.chroma[1] += (n*d + half)/max; \
- \
- d = (int)b.chroma[2] - a.chroma[2]; \
- a.chroma[2] += (n*d + half)/max; \
- }
-
-
-#define extract555( pixel, color ) \
- color.chroma[0] = (pixel >> 10) & 0x1F; \
- color.chroma[1] = (pixel >> 5) & 0x1F; \
- color.chroma[2] = (pixel ) & 0x1F;
-
-
-#define extract565( pixel, color ) \
- color.chroma[0] = (pixel >> 11) & 0x1F; \
- color.chroma[1] = (pixel >> 5) & 0x3F; \
- color.chroma[2] = (pixel ) & 0x1F;
-
-
-#define inject555( color ) \
- ( ( (unsigned short)color.chroma[0] << 10 ) | \
- ( (unsigned short)color.chroma[1] << 5 ) | \
- color.chroma[2] )
-
-
-#define inject565( color ) \
- ( ( (unsigned short)color.chroma[0] << 11 ) | \
- ( (unsigned short)color.chroma[1] << 5 ) | \
- color.chroma[2] )
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_gray_to_555 */
-/* */
-/**************************************************************************/
-
- static
- void blit_gray_to_555( grBlitter* blit,
- grColor color,
- int max )
- {
- int y;
- unsigned char* read;
- unsigned char* write;
- long color2;
-
- read = blit->read + blit->xread;
- write = blit->write + 2*blit->xwrite;
-
- /* convert color to R:G:B triplet */
- color2 = color.value;
- extract555( color2, color );
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- int x = blit->width;
-
- while (x > 0)
- {
- unsigned char val;
-
- val = *_read;
- if (val)
- {
- unsigned short* pixel = (unsigned short*)_write;
-
- if (val == max)
- {
- pixel[0] = (short)color2;
- }
- else
- {
- /* compose gray value */
- unsigned short pix16 = *pixel;
- grColor pix;
-
- extract555( pix16, pix );
-
- compose_pixel( pix, color, val, max );
- *pixel = inject555(pix);
- }
- }
- _write += 2;
- _read ++;
- x--;
- }
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- }
- while (y > 0);
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_gray_to_565 */
-/* */
-/**************************************************************************/
-
- static
- void blit_gray_to_565( grBlitter* blit,
- grColor color,
- int max )
- {
- int y;
- unsigned char* read;
- unsigned char* write;
- long color2;
-
- read = blit->read + blit->xread;
- write = blit->write + 2*blit->xwrite;
-
- color2 = color.value;
- extract565( color2, color );
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- int x = blit->width;
-
- while (x > 0)
- {
- unsigned char val;
-
- val = *_read;
- if (val)
- {
- unsigned short* pixel = (unsigned short*)_write;
-
- if (val == max)
- {
- pixel[0] = (short)color2;
- }
- else
- {
- /* compose gray value */
- unsigned short pix16 = *pixel;
- grColor pix;
-
- extract565( pix16, pix );
-
- compose_pixel( pix, color, val, max );
- *pixel = inject565( pix );
- }
- }
- _write +=2;
- _read ++;
- x--;
- }
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- }
- while (y > 0);
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_gray_to_24 */
-/* */
-/**************************************************************************/
-
- static
- void blit_gray_to_24( grBlitter* blit,
- grColor color,
- int max )
- {
- int y;
- unsigned char* read;
- unsigned char* write;
-
- read = blit->read + blit->xread;
- write = blit->write + 3*blit->xwrite;
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- int x = blit->width;
-
- while (x > 0)
- {
- unsigned char val;
-
- val = *_read;
- if (val)
- {
- if (val == max)
- {
- _write[0] = color.chroma[0];
- _write[1] = color.chroma[1];
- _write[2] = color.chroma[2];
- }
- else
- {
- /* compose gray value */
- grColor pix;
-
- pix.chroma[0] = _write[0];
- pix.chroma[1] = _write[1];
- pix.chroma[2] = _write[2];
-
- compose_pixel( pix, color, val, max );
-
- _write[0] = pix.chroma[0];
- _write[1] = pix.chroma[1];
- _write[2] = pix.chroma[2];
- }
- }
- _write += 3;
- _read ++;
- x--;
- }
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- }
- while (y > 0);
- }
-
-
-/**************************************************************************/
-/* */
-/* <Function> blit_gray_to_32 */
-/* */
-/**************************************************************************/
-
- static
- void blit_gray_to_32( grBlitter* blit,
- grColor color,
- int max )
- {
- int y;
- unsigned char* read;
- unsigned char* write;
-
- read = blit->read + blit->xread;
- write = blit->write + 4*blit->xwrite;
-
- y = blit->height;
- do
- {
- unsigned char* _read = read;
- unsigned char* _write = write;
- int x = blit->width;
-
- while (x > 0)
- {
- unsigned char val;
-
- val = *_read;
- if (val)
- {
- if (val == max)
- {
- _write[0] = color.chroma[0];
- _write[1] = color.chroma[1];
- _write[2] = color.chroma[2];
- _write[3] = color.chroma[3];
- }
- else
- {
- /* compose gray value */
- grColor pix;
-
- pix.chroma[0] = _write[0];
- pix.chroma[1] = _write[1];
- pix.chroma[2] = _write[2];
-
- compose_pixel( pix, color, val, max );
-
- _write[0] = pix.chroma[0];
- _write[1] = pix.chroma[1];
- _write[2] = pix.chroma[2];
- }
- }
- _write += 4;
- _read ++;
- x--;
- }
-
- read += blit->read_line;
- write += blit->write_line;
- y--;
- }
- while (y > 0);
- }
-
-
- /**********************************************************************
- *
- * <Function>
- * grBlitGlyphBitmap
- *
- * <Description>
- * writes a given glyph bitmap to a target surface.
- *
- * <Input>
- * surface :: handle to target surface
- * x :: position of left-most pixel of glyph image in surface
- * y :: position of top-most pixel of glyph image in surface
- * bitmap :: source glyph image
- *
- * <Return>
- * Error code. 0 means success
- *
- **********************************************************************/
-
- typedef void (*grColorGlyphBlitter)( grBlitter* blit,
- grColor color,
- int max_gray );
-
- static
- const grColorGlyphBlitter gr_color_blitters[gr_pixel_mode_max] =
- {
- 0,
- 0,
- 0,
- 0,
- blit_gray_to_555,
- blit_gray_to_565,
- blit_gray_to_24,
- blit_gray_to_32
- };
-
-
- extern int grBlitGlyphToBitmap( grBitmap* target,
- grBitmap* glyph,
- grPos x,
- grPos y,
- grColor color )
- {
- grBlitter blit;
- grPixelMode mode;
-
- /* check arguments */
- if (!target || !glyph)
- {
- grError = gr_err_bad_argument;
- return -1;
- }
-
-
- /* set up blitter and compute clipping. Return immediately if needed */
- blit.source = *glyph;
- blit.target = *target;
- mode = target->mode;
-
- if ( compute_clips( &blit, x, y ) )
- return 0;
-
-
- /* handle monochrome bitmap blitting */
- if (glyph->mode == gr_pixel_mode_mono)
- {
- if ( mode <= gr_pixel_mode_none || mode >= gr_pixel_mode_max )
- {
- grError = gr_err_bad_source_depth;
- return -1;
- }
-
- gr_mono_blitters[mode]( &blit, color );
- goto End;
- }
-
- /* handle gray bitmap composition */
- if (glyph->mode == gr_pixel_mode_gray &&
- glyph->grays > 1 )
- {
- int target_grays = target->grays;
- int source_grays = glyph->grays;
- const byte* saturation;
-
- if ( mode == gr_pixel_mode_gray && target_grays > 1 )
- {
- /* rendering into a gray target - use special composition */
- /* routines.. */
- if ( gr_last_saturation->count == target_grays )
- saturation = gr_last_saturation->table;
- else
- {
- saturation = grGetSaturation( target_grays );
- if (!saturation) return -3;
- }
-
-
- if ( target_grays == source_grays )
- blit_gray_to_gray_simple( &blit, saturation );
- else
- {
- const byte* conversion;
-
- if ( gr_last_conversion->target_grays == target_grays &&
- gr_last_conversion->source_grays == source_grays )
- conversion = gr_last_conversion->table;
- else
- {
- conversion = grGetConversion( target_grays, source_grays );
- if (!conversion) return -3;
- };
-
- blit_gray_to_gray( &blit, saturation, conversion );
- }
- }
- else
- {
- /* rendering into a color target */
- if ( mode <= gr_pixel_mode_gray ||
- mode >= gr_pixel_mode_max )
- {
- grError = gr_err_bad_target_depth;
- return -1;
- }
-
- gr_color_blitters[mode]( &blit, color, source_grays-1 );
- }
- goto End;
- }
-
- /* we don't support the blitting of bitmaps of the following */
- /* types : pal4, pal8, rgb555, rgb565, rgb24, rgb32 */
- /* */
- grError = gr_err_bad_source_depth;
- return -2;
-
- End:
- return 0;
- }
-
-
-/* End */
--- a/demos/graph/grblit.h
+++ /dev/null
@@ -1,25 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1999 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* blitter.h: Support for blitting of bitmaps with various depth. */
-/* */
-/****************************************************************************/
-
-#ifndef GRBLIT_H
-#define GRBLIT_H
-
-#include "grobjs.h"
-
- int grBlitMono( grBitmap* target,
- grBitmap* source,
- int x_offset,
- int y_offset,
- grColor color );
-
-
-#endif /* GRBLIT_H */
-/* End */
--- a/demos/graph/grconfig.h
+++ /dev/null
@@ -1,9 +1,0 @@
-#ifndef GRCONFIG_H
-#define GRCONFIG_H
-
-#define GR_MAX_SATURATIONS 8
-#define GR_MAX_CONVERSIONS 16
-
-#define GR_MAX_DEVICES 8
-
-#endif /* GRCONFIG_H */
--- a/demos/graph/grdevice.c
+++ /dev/null
@@ -1,362 +1,0 @@
-#include "grobjs.h"
-#include "grdevice.h"
-#include <stdlib.h>
-#include <string.h>
-
- grDeviceChain gr_device_chain[ GR_MAX_DEVICES ];
- int gr_num_devices = 0;
-
- static
- grDevice* find_device( const char* device_name )
- {
- int index = 0;
-
- if (device_name)
- {
- for ( index = gr_num_devices-1; index > 0; index-- )
- if ( strcmp( device_name, gr_device_chain[index].name ) == 0 )
- break;
- }
-
- if ( index < 0 || gr_num_devices <= 0 || !gr_device_chain[index].device )
- {
- grError = gr_err_invalid_device;
- return 0;
- }
-
- return gr_device_chain[index].device;
- }
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grGetDeviceModes
- *
- * <Description>
- * queries the available pixel modes for a device.
- *
- * <Input>
- * device_name :: name of device to be used. 0 for the default
- * device. For a list of available devices, see
- * grInitDevices.
- *
- * <Output>
- * num_modes :: number of available modes. 0 in case of error,
- * which really is an invalid device name.
- *
- * pixel_modes :: array of available pixel modes for this device
- * this table is internal to the device and should
- * not be freed by client applications.
- *
- * <Return>
- * error code. 0 means success. invalid device name otherwise
- *
- * <Note>
- * All drivers are _required_ to support at least the following
- * pixel formats :
- *
- * - gr_pixel_mode_mono : i.e. monochrome bitmaps
- * - gr_pixel_mode_gray : with any number of gray levels between
- * 2 and 256.
- *
- * the pixel modes do not provide the number of grays in the case
- * of "gray" devices. You should try to create a surface with the
- * maximal number (256, that is) and see the value returned in
- * the bitmap descriptor.
- *
- **********************************************************************/
-
- extern void grGetDeviceModes( const char* device_name,
- int *num_modes,
- grPixelMode* *pixel_modes )
- {
- grDevice* device;
-
- *num_modes = 0;
- *pixel_modes = 0;
-
- device = find_device( device_name );
- if (device)
- {
- *num_modes = device->num_pixel_modes;
- *pixel_modes = device->pixel_modes;
- }
- }
-
-
- /**********************************************************************
- *
- * <Function>
- * grNewSurface
- *
- * <Description>
- * creates a new device-specific surface. A surface is either
- * a window or a screen, depending on the device.
- *
- * <Input>
- * device :: name of the device to use. A value of NULL means
- * the default device (which depends on the system).
- * for a list of available devices, see grInitDevices.
- *
- * <InOut>
- * bitmap :: handle to a bitmap descriptor containing the
- * requested pixel mode, number of grays and dimensions
- * for the surface. the bitmap's 'pitch' and 'buffer'
- * fields are ignored on input.
- *
- * On output, the bitmap describes the surface's image
- * completely. It is possible to write directly in it
- * with grBlitGlyphToBitmap, even though the use of
- * grBlitGlyphToSurface is recommended.
- *
- * <Return>
- * handle to the corresponding surface object. 0 in case of error
- *
- * <Note>
- * All drivers are _required_ to support at least the following
- * pixel formats :
- *
- * - gr_pixel_mode_mono : i.e. monochrome bitmaps
- * - gr_pixel_mode_gray : with any number of gray levels between
- * 2 and 256.
- *
- * This function might change the bitmap descriptor's fields. For
- * example, when displaying a full-screen surface, the bitmap's
- * dimensions will be set to those of the screen (e.g. 640x480
- * or 800x600); also, the bitmap's 'buffer' field might point to
- * the Video Ram depending on the mode requested..
- *
- * The surface contains a copy of the returned bitmap descriptor,
- * you can thus discard the 'bitmap' parameter after the call.
- *
- **********************************************************************/
-
- extern grSurface* grNewSurface( const char* device_name,
- grBitmap* bitmap )
- {
- grDevice* device;
- grSurface* surface;
-
- /* Now find the device */
- device = find_device( device_name );
- if (!device) return 0;
-
- surface = (grSurface*)grAlloc( device->surface_objsize );
- if (!surface) return 0;
-
- if ( !device->init_surface( surface, bitmap ) )
- {
- grFree( surface );
- surface = 0;
- }
- return surface;
- }
-
-
- /**********************************************************************
- *
- * <Function>
- * grRefreshRectangle
- *
- * <Description>
- * this function is used to indicate that a given surface rectangle
- * was modified and thus needs re-painting. It really is useful for
- * windowed or gray surfaces.
- *
- * <Input>
- * surface :: handle to target surface
- * x :: x coordinate of the top-left corner of the rectangle
- * y :: y coordinate of the top-left corner of the rectangle
- * width :: rectangle width in pixels
- * height :: rectangle height in pixels
- *
- **********************************************************************/
-
- extern void grRefreshRectangle( grSurface* surface,
- grPos x,
- grPos y,
- grPos width,
- grPos height )
- {
- if (surface->refresh_rect)
- surface->refresh_rect( surface, x, y, width, height );
- }
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grWriteSurfaceChar
- *
- * <Description>
- * This function is equivalent to calling grWriteCellChar on the
- * surface's bitmap, then invoking grRefreshRectangle.
- *
- * The graphics sub-system contains an internal Latin1 8x8 font
- * which can be used to display simple strings of text without
- * using FreeType.
- *
- * This function writes a single 8x8 character on the target bitmap.
- *
- * <Input>
- * target :: handle to target surface
- * x :: x pixel position of character cell's top left corner
- * y :: y pixel position of character cell's top left corner
- * charcode :: Latin-1 character code
- * color :: color to be used to draw the character
- *
- **********************************************************************/
-
- extern
- void grWriteSurfaceChar( grSurface* target,
- int x,
- int y,
- int charcode,
- grColor color )
- {
- grWriteCellChar( &target->bitmap, x, y, charcode, color );
- if (target->refresh_rect)
- target->refresh_rect( target, x, y, 8, 8 );
- }
-
-
- /**********************************************************************
- *
- * <Function>
- * grWriteSurfaceString
- *
- * <Description>
- * This function is equivalent to calling grWriteCellString on the
- * surface's bitmap, then invoking grRefreshRectangle.
- *
- * The graphics sub-system contains an internal Latin1 8x8 font
- * which can be used to display simple strings of text without
- * using FreeType.
- *
- * This function writes a string with the internal font
- *
- * <Input>
- * target :: handle to target bitmap
- * x :: x pixel position of string's top left corner
- * y :: y pixel position of string's top left corner
- * string :: Latin-1 text string
- * color :: color to be used to draw the character
- *
- **********************************************************************/
-
- extern
- void grWriteSurfaceString( grSurface* target,
- int x,
- int y,
- const char* string,
- grColor color )
- {
- int len;
-
- len = strlen(string);
- grWriteCellString( &target->bitmap, x, y, string, color );
- if (target->refresh_rect)
- target->refresh_rect( target, x, y, 8*len, 8 );
- }
-
-
- /**********************************************************************
- *
- * <Function>
- * grRefreshSurface
- *
- * <Description>
- * a variation of grRefreshRectangle which repaints the whole surface
- * to the screen.
- *
- * <Input>
- * surface :: handle to target surface
- *
- **********************************************************************/
-
- extern void grRefreshSurface( grSurface* surface )
- {
- if (surface->refresh_rect)
- surface->refresh_rect( surface, 0, 0,
- surface->bitmap.width,
- surface->bitmap.rows );
- }
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grSetTitle
- *
- * <Description>
- * set the window title of a given windowed surface.
- *
- * <Input>
- * surface :: handle to target surface
- * title_string :: the new title
- *
- **********************************************************************/
-
- extern void grSetTitle( grSurface* surface,
- const char* title_string )
- {
- if (surface->set_title)
- surface->set_title( surface, title_string );
- }
-
-
-
-
- /**********************************************************************
- *
- * <Function>
- * grListenSurface
- *
- * <Description>
- * listen the events for a given surface
- *
- * <Input>
- * surface :: handle to target surface
- * event_mask :: the event mask (mode)
- *
- * <Output>
- * event :: the returned event
- *
- * <Note>
- * XXX : For now, only keypresses are supported.
- *
- **********************************************************************/
-
- extern
- int grListenSurface( grSurface* surface,
- int event_mask,
- grEvent *event )
- {
- return surface->listen_event( surface, event_mask, event );
- }
-
-
-#if 0
- static
- void gr_done_surface( grSurface* surface )
- {
- if (surface)
- {
- /* first of all, call the device-specific destructor */
- surface->done(surface);
-
- /* then remove the bitmap if we're owner */
- if (surface->owner)
- grFree( surface->bitmap.buffer );
-
- surface->owner = 0;
- surface->bitmap.buffer = 0;
- grFree( surface );
- }
- }
-#endif
-
--- a/demos/graph/grdevice.h
+++ /dev/null
@@ -1,126 +1,0 @@
-/***************************************************************************
- *
- * grdevice.h
- *
- * Graphics device interface
- *
- * Copyright 1999 - The FreeType Development Team - www.freetype.org
- *
- *
- ***************************************************************************/
-
-#ifndef GRDEVICE_H
-#define GRDEVICE_H
-
-#include "graph.h"
-
-
- /********************************************************************
- *
- * <FuncType>
- * grDeviceInitFunc
- *
- * <Description>
- * Simple device initialiser function
- *
- * <Return>
- * error code. 0 means success
- *
- ********************************************************************/
-
- typedef int (*grDeviceInitFunc)( void );
-
-
- /********************************************************************
- *
- * <FuncType>
- * grDeviceDoneFunc
- *
- * <Description>
- * Simple device finaliser function
- *
- * <Return>
- * error code. 0 means success
- *
- ********************************************************************/
-
- typedef void (*grDeviceDoneFunc)( void );
-
-
- /********************************************************************
- *
- * <FuncType>
- * grDeviceInitSurfaceFunc
- *
- * <Description>
- * initializes a new surface for the device. This may be a window
- * or a video screen, depending on the device.
- *
- * <Input>
- * surface :: handle to target surface
- *
- * <InOut>
- * bitmap :: handle to bitmap descriptor
- *
- ********************************************************************/
-
- typedef int (*grDeviceInitSurfaceFunc)( grSurface* surface,
- grBitmap* bitmap );
-
-
- /********************************************************************
- *
- * <Struct>
- * grDevice
- *
- * <Description>
- * Simple device interface structure
- *
- * <Fields>
- * surface_objsize :: size in bytes of a single surface object for
- * this device.
- *
- * device_name :: name of device, e.g. "x11", "os2pm", "directx" etc..
- * init :: device initialisation routine
- * done :: device finalisation
- * new_surface :: function used to create a new surface (screen or
- * window) from the device
- *
- * num_pixel_modes :: the number of pixel modes supported by this
- * device. This value _must_ be set to -1
- * default, unless the device provides a
- * static set of pixel modes (fullscreen).
- *
- * pixel_modes :: an array of pixel modes supported by this
- * device
- *
- * <Note>
- * the fields "num_pixel_modes" and "pixel_modes" must be
- * set by the "init" function.
- *
- * This allows windowed devices to "discover" at run-time the
- * available pixel modes they can provide depending on the
- * current screen depth.
- *
- ********************************************************************/
-
- struct grDevice_
- {
- int surface_objsize;
- const char* device_name; /* name of device */
-
- grDeviceInitFunc init;
- grDeviceDoneFunc done;
-
- grDeviceInitSurfaceFunc init_surface;
-
- int num_pixel_modes;
- grPixelMode* pixel_modes;
- };
-
-
- extern grDeviceChain gr_device_chain[];
- extern int gr_num_devices;
-
-
-#endif /* GRDEVICE_H */
--- a/demos/graph/grevents.h
+++ /dev/null
@@ -1,117 +1,0 @@
-#ifndef GREVENTS_H
-#define GREVENTS_H
-
-
-#define gr_event_none 0
-#define gr_event_wait 1
-#define gr_event_poll 2
-#define gr_event_flush 3
-
-#define gr_mouse_down 0x04
-#define gr_mouse_move 0x08
-#define gr_mouse_up 0x10
-#define gr_mouse_drag 0x20
-
-#define gr_key_down 0x40
-#define gr_key_up 0x80
-
-
-#define gr_event_mouse 0x3C
-#define gr_event_key 0xC0
-
-#define gr_event_type (gr_event_mouse | gr_event_key)
-
-
- typedef enum grKey_
- {
- grKeyNone = 0,
-
- grKeyF1,
- grKeyF2,
- grKeyF3,
- grKeyF4,
- grKeyF5,
- grKeyF6,
- grKeyF7,
- grKeyF8,
- grKeyF9,
- grKeyF10,
- grKeyF11,
- grKeyF12,
-
- grKeyLeft,
- grKeyRight,
- grKeyUp,
- grKeyDown,
-
- grKeyIns,
- grKeyDel,
- grKeyHome,
- grKeyEnd,
- grKeyPageUp,
- grKeyPageDown,
-
- grKeyEsc,
- grKeyTab,
- grKeyBackSpace,
- grKeyReturn,
-
- grKeyMax,
- grKeyForceShort = 0x7FFF /* this forces the grKey to be stored */
- /* on at least one short ! */
-
- } grKey;
-
-#define grKEY(c) ((grKey)(c))
-
-#define grKeyAlt ((grKey)0x8000)
-#define grKeyCtrl ((grKey)0x4000)
-#define grKeyShift ((grKey)0x2000)
-
-#define grKeyModifiers ((grKey)0xE000)
-
-#define grKey0 grKEY('0')
-#define grKey1 grKEY('1')
-#define grKey2 grKEY('2')
-#define grKey3 grKEY('3')
-#define grKey4 grKEY('4')
-#define grKey5 grKEY('5')
-#define grKey6 grKEY('6')
-#define grKey7 grKEY('7')
-#define grKey8 grKEY('8')
-#define grKey9 grKEY('9')
-
-
-#define grKeyPlus grKEY('+')
-#define grKeyLess grKEY('-')
-#define grKeyEqual grKEY('=')
-#define grKeyMult grKEY('*')
-#define grKeyDollar grKEY('$')
-#define grKeySmaller grKEY('<')
-#define grKeyGreater grKEY('>')
-#define grKeyQuestion grKEY('?')
-#define grKeyComma grKEY(',')
-#define grKeyDot grKEY('.')
-#define grKeySemiColumn grKEY(';')
-#define grKeyColumn grKEY(':')
-#define grKeyDiv grKEY('/')
-#define grKeyExclam grKEY('!')
-#define grKeyPercent grKEY('%')
-#define grKeyLeftParen grKEY('(')
-#define grKeyRightParen grKEY('(')
-#define grKeyAt grKEY('@')
-#define grKeyUnder grKEY('_')
-
-
- typedef struct grEvent_
- {
- int type;
- grKey key;
- int x, y;
-
- } grEvent;
-
-
-
-#endif /* GREVENTS_H */
-
--- a/demos/graph/grfont.c
+++ /dev/null
@@ -1,358 +1,0 @@
-#include "grfont.h"
-#include <string.h>
-
- /* font characters */
-
- const unsigned char font_8x8[2048] =
- {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
- 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
- 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
- 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
- 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
- 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
- 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
- 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
- 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
- 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
- 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
- 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
- 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
- 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
- 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
- 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
- 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
- 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
- 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
- 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
- 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
- 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
- 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
- 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
- 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
- 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
- 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
- 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
- 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
- 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
- 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
- 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
- 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
- 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
- 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
- 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
- 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
- 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
- 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
- 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
- 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
- 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
- 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
- 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
- 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
- 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
- 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
- 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
- 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
- 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
- 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
- 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
- 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
- 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
- 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
- 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
- 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
- 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
- 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
- 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
- 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
- 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
- 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
- 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
- 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
- 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
- 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
- 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
- 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
- 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
- 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
- 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
- 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
- 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
- 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
- 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
- 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
- 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
- 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
- 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
- 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
- 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
- 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
- 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
- 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
- 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
- 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
- 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
- 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
- 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
- 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
- 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
- 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
- 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
- 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
- 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
- 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
- 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
- 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
- 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
- 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
- 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
- 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
- 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
- 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
- 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
- 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
- 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
- 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
- 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
- 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
- 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
- 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
- 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
- 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
- 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
- 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
- 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
- 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
- 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
- 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
- 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
- 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
- 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
- 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
- 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
- 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
- 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
- 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
- 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
- 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
- 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
- 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
- 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
- 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
- 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
- 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
- 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
- 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
- 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
- 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
- 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
- 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
- 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
- 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
- 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
- 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
- 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
- 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
- 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
- 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
- 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
- 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
- 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
- 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
- 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
- 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
- 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
- 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
- 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
- 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
- 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
- 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
- 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
- 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
- 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
- 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
- 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
- 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
- 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
- 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
- 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
- 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
- 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
- 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
- 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
- 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
- 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
- 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
- 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
- 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
- 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
- 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
- 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
- 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
- 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
- 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
- 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
- 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
- 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
- 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
- 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
- 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
- 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
- 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
- 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
- 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
- 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
- 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
- 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
- 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
- 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
-
- static
- grBitmap gr_charcell =
- {
- 8, /* rows */
- 8, /* width */
- gr_pixel_mode_mono, /* mode */
- 1, /* pitch */
- 0, /* grays */
- 0 /* buffer */
- };
-
- void grWriteCellChar( grBitmap* target,
- int x,
- int y,
- int charcode,
- grColor color )
- {
- if (charcode < 0 || charcode > 255)
- return;
-
- gr_charcell.buffer = (char*)font_8x8 + 8*charcode;
- grBlitGlyphToBitmap( target, &gr_charcell, x, y, color );
- }
-
-
- void grWriteCellString( grBitmap* target,
- int x,
- int y,
- const char* string,
- grColor color )
- {
- while (*string)
- {
- gr_charcell.buffer = (char*)font_8x8 + 8*(int)(unsigned char)*string++;
- grBlitGlyphToBitmap( target, &gr_charcell, x, y, color );
- x += 8;
- }
- }
-
- static int gr_cursor_x = 0;
- static int gr_cursor_y = 0;
- static grBitmap* gr_text_bitmap = 0;
- static int gr_margin_right = 0;
- static int gr_margin_top = 0;
-
- extern void grGotobitmap( grBitmap* bitmap )
- {
- gr_text_bitmap = bitmap;
- }
-
- extern void grSetMargin( int right, int top )
- {
- gr_margin_top = top << 3;
- gr_margin_right = right << 3;
- }
-
- extern void grGotoxy ( int x, int y )
- {
- gr_cursor_x = x;
- gr_cursor_y = y;
- }
-
- extern void grWrite ( const char* string )
- {
- if (string)
- {
- grColor color;
-
- color.value = 127;
- grWriteCellString( gr_text_bitmap,
- gr_margin_right + (gr_cursor_x << 3),
- gr_margin_top + (gr_cursor_y << 3),
- string,
- color );
-
- gr_cursor_x += strlen(string);
- }
- }
-
- extern void grLn()
- {
- gr_cursor_y ++;
- gr_cursor_x = 0;
- }
-
- extern void grWriteln( const char* string )
- {
- grWrite( string );
- grLn();
- }
-
-
--- a/demos/graph/grfont.h
+++ /dev/null
@@ -1,16 +1,0 @@
-#ifndef GRFONT_H
-#define GRFONT_H
-
-#include "graph.h"
-
- extern const unsigned char font_8x8[];
-
- extern void grGotobitmap( grBitmap* bitmap );
- extern void grSetMargin( int right, int top );
- extern void grGotoxy ( int x, int y );
-
- extern void grWrite ( const char* string );
- extern void grWriteln( const char* string );
- extern void grLn();
-
-#endif /* GRFONT_H */
--- a/demos/graph/grinit.c
+++ /dev/null
@@ -1,85 +1,0 @@
-#include "grobjs.h"
-#include "grdevice.h"
-#include <stdio.h>
-
-#define GR_INIT_DEVICE_CHAIN ((grDeviceChain*)0)
-#define GR_INIT_BUILD
-
-#ifdef DEVICE_X11
-#include "grx11.h"
-#endif
-
-#ifdef DEVICE_OS2_PM
-#include "gros2pm.h"
-#endif
-
-#ifdef DEVICE_WIN32
-#include "grwin32.h"
-#endif
-
-#ifdef macintosh
-#include "grmac.h"
-#endif
-
-
- /**********************************************************************
- *
- * <Function>
- * grInitDevices
- *
- * <Description>
- * This function is in charge of initialising all system-specific
- * devices. A device is responsible for creating and managing one
- * or more "surfaces". A surface is either a window or a screen,
- * depending on the system.
- *
- * <Return>
- * a pointer to the first element of a device chain. The chain can
- * be parsed to find the available devices on the current system
- *
- * <Note>
- * If a device cannot be initialised correctly, it is not part of
- * the device chain returned by this function. For example, if an
- * X11 device was compiled in the library, it will be part of
- * the returned device chain only if a connection to the display
- * could be establisged
- *
- * If no driver could be initialised, this function returns NULL.
- *
- **********************************************************************/
-
- extern
- grDeviceChain* grInitDevices( void )
- {
- grDeviceChain* chain = GR_INIT_DEVICE_CHAIN;
- grDeviceChain* cur = gr_device_chain;
-
- while (chain)
- {
- /* initialize the device */
- grDevice* device;
-
- device = chain->device;
- if ( device->init() == 0 &&
- gr_num_devices < GR_MAX_DEVICES )
-
- {
- /* successful device initialisation - add it to our chain */
- cur->next = 0;
- cur->device = device;
- cur->name = device->device_name;
-
- if (cur > gr_device_chain)
- cur[-1].next = cur;
-
- cur++;
- gr_num_devices++;
- }
- chain = chain->next;
- }
-
- return (gr_num_devices > 0 ? gr_device_chain : 0 );
- }
-
-
-
--- a/demos/graph/grobjs.c
+++ /dev/null
@@ -1,213 +1,0 @@
-#include "grobjs.h"
-#include <stdlib.h>
-#include <string.h>
-
- int grError = 0;
-
-
- /********************************************************************
- *
- * <Function>
- * grRealloc
- *
- * <Description>
- * Simple memory re-allocation.
- *
- * <Input>
- * block :: original memory block address
- * size :: new requested block size in bytes
- *
- * <Return>
- * the memory block address. 0 in case of error
- *
- ********************************************************************/
-
- char* grAlloc( long size )
- {
- char* p;
-
- p = (char*)malloc(size);
- if (!p && size > 0)
- {
- grError = gr_err_memory;
- }
-
- if (p)
- memset( p, 0, size );
-
- return p;
- }
-
-
- /********************************************************************
- *
- * <Function>
- * grRealloc
- *
- * <Description>
- * Simple memory re-allocation.
- *
- * <Input>
- * block :: original memory block address
- * size :: new requested block size in bytes
- *
- * <Return>
- * the memory block address. 0 in case of error
- *
- ********************************************************************/
-
- char* grRealloc( const char* block, long size )
- {
- char* p;
-
- p = realloc( (char*)block, size );
- if (!p && size > 0)
- {
- grError = gr_err_memory;
- }
- return p;
- }
-
-
- /********************************************************************
- *
- * <Function>
- * grFree
- *
- * <Description>
- * Simple memory release
- *
- * <Input>
- * block :: target block
- *
- ********************************************************************/
-
- void grFree( const void* block )
- {
- if (block)
- free( (char*)block );
- }
-
-
-
- static
- int check_mode( grPixelMode pixel_mode,
- int num_grays )
- {
- if ( pixel_mode <= gr_pixel_mode_none ||
- pixel_mode >= gr_pixel_mode_max )
- goto Fail;
-
- if ( pixel_mode != gr_pixel_mode_gray ||
- ( num_grays >= 2 && num_grays <= 256 ) )
- return 0;
-
- Fail:
- grError = gr_err_bad_argument;
- return grError;
- }
-
-
- /**********************************************************************
- *
- * <Function>
- * grNewBitmap
- *
- * <Description>
- * creates a new bitmap
- *
- * <Input>
- * pixel_mode :: the target surface's pixel_mode
- * num_grays :: number of grays levels for PAL8 pixel mode
- * width :: width in pixels
- * height :: height in pixels
- *
- * <Output>
- * bit :: descriptor of the new bitmap
- *
- * <Return>
- * Error code. 0 means success.
- *
- **********************************************************************/
-
- extern int grNewBitmap( grPixelMode pixel_mode,
- int num_grays,
- int width,
- int height,
- grBitmap *bit )
- {
- int pitch;
-
- /* check mode */
- if (check_mode(pixel_mode,num_grays))
- goto Fail;
-
- /* check dimensions */
- if (width < 0 || height < 0)
- {
- grError = gr_err_bad_argument;
- goto Fail;
- }
-
- bit->width = width;
- bit->rows = height;
- bit->mode = pixel_mode;
- bit->grays = num_grays;
-
- pitch = width;
-
- switch (pixel_mode)
- {
- case gr_pixel_mode_mono : pitch = (width+7) >> 3; break;
- case gr_pixel_mode_pal4 : pitch = (width+3) >> 2; break;
-
- case gr_pixel_mode_pal8 :
- case gr_pixel_mode_gray : pitch = width; break;
-
- case gr_pixel_mode_rgb555:
- case gr_pixel_mode_rgb565: pitch = width*2; break;
-
- case gr_pixel_mode_rgb24 : pitch = width*3; break;
-
- case gr_pixel_mode_rgb32 : pitch = width*4; break;
-
- default:
- grError = gr_err_bad_target_depth;
- return 0;
- }
-
- bit->pitch = pitch;
- bit->buffer = grAlloc( (long)bit->pitch * bit->rows );
- if (!bit->buffer) goto Fail;
-
- return 0;
-
- Fail:
- return grError;
- }
-
- /**********************************************************************
- *
- * <Function>
- * grDoneBitmap
- *
- * <Description>
- * destroys a bitmap
- *
- * <Input>
- * bitmap :: handle to bitmap descriptor
- *
- * <Note>
- * This function does NOT release the bitmap descriptor, only
- * the pixel buffer.
- *
- **********************************************************************/
-
- extern void grDoneBitmap( grBitmap* bit )
- {
- grFree( bit->buffer );
- bit->buffer = 0;
- }
-
-
-
--- a/demos/graph/grobjs.h
+++ /dev/null
@@ -1,186 +1,0 @@
-/***************************************************************************
- *
- * grobjs.h
- *
- * basic object classes defintions
- *
- * Copyright 1999 - The FreeType Development Team - www.freetype.org
- *
- *
- *
- *
- ***************************************************************************/
-
-#ifndef GROBJS_H
-#define GROBJS_H
-
-#include "graph.h"
-#include "grconfig.h"
-#include "grtypes.h"
-
-
- typedef struct grBiColor_
- {
- grColor foreground;
- grColor background;
-
- int num_levels;
- int max_levels;
- grColor* levels;
-
- } grBiColor;
-
-
-
- /**********************************************************************
- *
- * Technical note : explaining how the blitter works.
- *
- * The blitter is used to "draw" a given source bitmap into
- * a given target bitmap.
- *
- * The function called 'compute_clips' is used to compute clipping
- * constraints. These lead us to compute two areas :
- *
- * - the read area : is the rectangle, within the source bitmap,
- * which will be effectively "drawn" in the
- * target bitmap.
- *
- * - the write area : is the rectangle, within the target bitmap,
- * which will effectively "receive" the pixels
- * from the read area
- *
- * Note that both areas have the same dimensions, but are
- * located in distinct surfaces.
- *
- * These areas are computed by 'compute_clips' which is called
- * by each blitting function.
- *
- * Note that we use the Y-downwards convention within the blitter
- *
- **********************************************************************/
-
- typedef struct grBlitter_
- {
- int width; /* width in pixels of the areas */
- int height; /* height in pixels of the areas */
-
- int xread; /* x position of start point in read area */
- int yread; /* y position of start point in read area */
-
- int xwrite; /* x position of start point in write area */
- int ywrite; /* y position of start point in write area */
-
- int right_clip; /* amount of right clip */
-
- unsigned char* read; /* top left corner of read area in source map */
- unsigned char* write; /* top left corner of write area in target map */
-
- int read_line; /* byte increment to go down one row in read area */
- int write_line; /* byte increment to go down one row in write area */
-
- grBitmap source; /* source bitmap descriptor */
- grBitmap target; /* target bitmap descriptor */
-
- } grBlitter;
-
-
-
- typedef void (*grBlitterFunc)( grBlitter* blitter,
- grColor color );
-
- typedef void (*grSetTitleFunc)( grSurface* surface,
- const char* title_string );
-
- typedef void (*grRefreshRectFunc)( grSurface* surface,
- int x,
- int y,
- int width,
- int height );
-
- typedef void (*grDoneSurfaceFunc)( grSurface* surface );
-
- typedef int (*grListenEventFunc)( grSurface* surface,
- int event_mode,
- grEvent *event );
-
-
-
- struct grSurface_
- {
- grDevice* device;
- grBitmap bitmap;
- grBool refresh;
- grBool owner;
-
- const byte* saturation; /* used for gray surfaces only */
- grBlitterFunc blit_mono; /* 0 by default, set by grBlit.. */
-
- grRefreshRectFunc refresh_rect;
- grSetTitleFunc set_title;
- grListenEventFunc listen_event;
- grDoneSurfaceFunc done;
- };
-
-
-
- /********************************************************************
- *
- * <Function>
- * grAlloc
- *
- * <Description>
- * Simple memory allocation. The returned block is always zero-ed
- *
- * <Input>
- * size :: size in bytes of the requested block
- *
- * <Return>
- * the memory block address. 0 in case of error
- *
- ********************************************************************/
-
- extern char* grAlloc( long size );
-
-
- /********************************************************************
- *
- * <Function>
- * grRealloc
- *
- * <Description>
- * Simple memory re-allocation.
- *
- * <Input>
- * block :: original memory block address
- * size :: new requested block size in bytes
- *
- * <Return>
- * the memory block address. 0 in case of error
- *
- ********************************************************************/
-
- extern char* grRealloc( const char* block, long size );
-
-
- /********************************************************************
- *
- * <Function>
- * grFree
- *
- * <Description>
- * Simple memory release
- *
- * <Input>
- * block :: target block
- *
- ********************************************************************/
-
- extern void grFree( const void* block );
-
-
- extern grDevice* gr_devices[];
- extern int gr_num_devices;
- extern int gr_max_devices;
-
-#endif /* GROBJS_H */
--- a/demos/graph/grtypes.h
+++ /dev/null
@@ -1,52 +1,0 @@
-/***************************************************************************
- *
- * grtypes.h
- *
- * basic type defintions
- *
- * Copyright 1999 - The FreeType Development Team - www.freetype.org
- *
- *
- *
- *
- ***************************************************************************/
-
-#ifndef GRTYPES_H
-#define GRTYPES_H
-
- typedef unsigned char byte;
-
-#if 0
- typedef signed char uchar;
-
- typedef unsigned long ulong;
- typedef unsigned short ushort;
- typedef unsigned int uint;
-#endif
-
- typedef struct grDimension_
- {
- int x;
- int y;
-
- } grDimension;
-
-#define gr_err_ok 0
-#define gr_err_memory -1
-#define gr_err_bad_argument -2
-#define gr_err_bad_target_depth -3
-#define gr_err_bad_source_depth -4
-#define gr_err_saturation_overflow -5
-#define gr_err_conversion_overflow -6
-#define gr_err_invalid_device -7
-
-
-#ifdef GR_MAKE_OPTION_SINGLE_OBJECT
-#define GR_LOCAL_DECL static
-#define GR_LOCAL_FUNC static
-#else
-#define GR_LOCAL_DECL extern
-#define GR_LOCAL_FUNC /* void */
-#endif
-
-#endif /* GRTYPES_H */
--- a/demos/graph/mac/grmac.c
+++ /dev/null
@@ -1,348 +1,0 @@
-/*******************************************************************
- *
- * grmac.c graphics driver for MacOS platform. 0.1
- *
- * This is the driver for displaying inside a window under MacOS,
- * used by the graphics utility of the FreeType test suite.
- *
- * Largely written by Just van Rossum, but derived from grwin32.c.
- * Copyright 1999-2000 by Just van Rossum, Antoine Leca,
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * Borrowing liberally from the other FreeType drivers.
- *
- * This file is part of the FreeType project, and may only be used
- * modified and distributed under the terms of the FreeType project
- * license, LICENSE.TXT. By continuing to use, modify or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- ******************************************************************/
-
-/* ANSI C */
-#include <string.h>
-
-/* Mac Toolbox */
-#include <Windows.h>
-
-/* FT graphics subsystem */
-#include "grmac.h"
-#include "grdevice.h"
-
-/* CodeWarrior's poor excuse for a console */
-#include <SIOUX.h>
-
-
-/* Mac function key definitions. The 0x100 is a kludge, see listen_event(). */
-#define KEY_F1 (0x7A | 0x100)
-#define KEY_F2 (0x78 | 0x100)
-#define KEY_F3 (0x63 | 0x100)
-#define KEY_F4 (0x76 | 0x100)
-#define KEY_F5 (0x60 | 0x100)
-#define KEY_F6 (0x61 | 0x100)
-#define KEY_F7 (0x62 | 0x100)
-#define KEY_F8 (0x64 | 0x100)
-#define KEY_F9 (0x65 | 0x100)
-#define KEY_F10 (0x6D | 0x100)
-#define KEY_F11 (0x67 | 0x100)
-#define KEY_F12 (0x6F | 0x100)
-#define KEY_F13 (0x69 | 0x100)
-#define KEY_F14 (0x6B | 0x100)
-#define KEY_F15 (0x71 | 0x100)
-
-
-/* Mac to FT key mapping */
-
- typedef struct _Translator
- {
- short mackey;
- grKey grkey;
-
- } Translator;
-
- static
- Translator key_translators[] =
- {
- { kBackspaceCharCode, grKeyBackSpace },
- { kTabCharCode, grKeyTab },
- { kReturnCharCode, grKeyReturn },
- { kEscapeCharCode, grKeyEsc },
- { kHomeCharCode, grKeyHome },
- { kLeftArrowCharCode, grKeyLeft },
- { kUpArrowCharCode, grKeyUp },
- { kRightArrowCharCode, grKeyRight },
- { kDownArrowCharCode, grKeyDown },
- { kPageUpCharCode, grKeyPageUp },
- { kPageDownCharCode, grKeyPageDown },
- { kEndCharCode, grKeyEnd },
- { kHelpCharCode, grKeyF1 }, /* map Help key to F1... */
- { KEY_F1, grKeyF1 },
- { KEY_F2, grKeyF2 },
- { KEY_F3, grKeyF3 },
- { KEY_F4, grKeyF4 },
- { KEY_F5, grKeyF5 },
- { KEY_F6, grKeyF6 },
- { KEY_F7, grKeyF7 },
- { KEY_F8, grKeyF8 },
- { KEY_F9, grKeyF9 },
- { KEY_F10, grKeyF10 },
- { KEY_F11, grKeyF11 },
- { KEY_F12, grKeyF12 }
- };
-
-
- /* This is a minimalist driver, it is only able to display */
- /* a _single_ window. Moreover, only monochrome and gray */
- /* bitmaps are supported.. */
-
- /* pointer to the window. */
- static WindowPtr theWindow = NULL;
-
- /* the pixmap */
- static PixMap thePixMap;
-
-
- /* destroys the window */
- static
- void done_window( )
- {
- if ( theWindow )
- {
- DisposeWindow ( theWindow );
- }
- theWindow = NULL;
- }
-
- /* destroys the surface*/
- static
- void done_surface( grSurface* surface )
- {
- /* ick! this never gets called... */
- done_window();
- grDoneBitmap( &surface->bitmap );
- }
-
- static
- void refresh_rectangle( grSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- Rect bounds;
- SetRect( &bounds, x, y, x+w, y+h );
- if ( theWindow )
- CopyBits( (BitMap*)&thePixMap, &theWindow->portBits,
- &bounds, &bounds, srcCopy, theWindow->visRgn );
- }
-
- static
- void set_title( grSurface* surface, const char* title )
- {
- Str255 pTitle;
- strcpy( (char*)pTitle+1, title );
- pTitle[0] = strlen( title );
- if ( theWindow )
- SetWTitle( theWindow, pTitle );
- }
-
- static
- void listen_event( grSurface* surface,
- int event_mask,
- grEvent* grevent )
- {
- grEvent our_grevent;
- EventRecord mac_event;
- short theEventMask = keyDownMask | autoKeyMask /* | updateEvtMask */ ;
-
- our_grevent.type = gr_event_none;
- our_grevent.key = grKeyNone;
-
- for ( ;; )
- /* The event loop. Sorry, but I'm too lazy to split the various events
- to proper event handler functions. This whole app is rather ad hoc
- anyway, so who cares ;-) */
- {
- if ( WaitNextEvent( everyEvent, &mac_event, 10, NULL ) )
- {
- switch ( mac_event.what )
- {
- case autoKey:
- case keyDown:
- {
- int count = sizeof( key_translators ) / sizeof( key_translators[0] );
- Translator* trans = key_translators;
- Translator* limit = trans + count;
- short char_code;
-
- char_code = mac_event.message & charCodeMask;
- if ( char_code == kFunctionKeyCharCode )
- /* Le kluge. Add a flag to differentiate the F-keys from normal keys. */
- char_code = 0x100 | ((mac_event.message & keyCodeMask) >> 8);
-
- our_grevent.key = char_code;
-
- for ( ; trans < limit; trans++ )
- /* see if the key maps to a special "gr" key */
- if ( char_code == trans->mackey )
- {
- our_grevent.key = trans->grkey;
- }
- our_grevent.type = gr_event_key;
- }
- if ( our_grevent.key == grKEY('q') || our_grevent.key == grKeyEsc )
- /* destroy the window here, since done_surface() doesn't get called */
- done_window();
- *grevent = our_grevent;
- return;
- case updateEvt:
- if ( theWindow && (WindowPtr)mac_event.message == theWindow )
- {
- SetPort( theWindow );
- BeginUpdate( theWindow );
- refresh_rectangle( surface,
- 0, 0,
- thePixMap.bounds.right, thePixMap.bounds.bottom );
- EndUpdate( theWindow );
- }
- else
- {
- SIOUXHandleOneEvent( &mac_event );
- }
- break;
- case mouseDown:
- {
- short part;
- WindowPtr wid;
-
- part = FindWindow( mac_event.where, &wid );
- if ( wid == theWindow )
- {
- if ( theWindow && part == inDrag)
- DragWindow( wid, mac_event.where, &qd.screenBits.bounds );
- else if (part == inGoAway)
- {
- if ( TrackGoAway( theWindow, mac_event.where ) )
- {
- /* The user clicked the window away, emulate quit event */
- done_window();
- our_grevent.type = gr_event_key;
- our_grevent.key = grKeyEsc;
- *grevent = our_grevent;
- return;
- }
- }
- else if (part == inContent)
- {
- SelectWindow( theWindow );
- }
- }
- else
- {
- SIOUXHandleOneEvent( &mac_event );
- }
- }
- break;
- default:
- InitCursor();
- break;
- }
- }
- }
- }
-
-
-static
-grSurface* init_surface( grSurface* surface,
- grBitmap* bitmap )
-{
- Rect bounds;
- SetRect(&bounds, 0, 0, bitmap->width, bitmap->rows);
-
- /* create the bitmap - under MacOS, we support all modes as the GDI */
- /* handles all conversions automatically.. */
- if ( grNewBitmap( bitmap->mode,
- bitmap->grays,
- bitmap->width,
- bitmap->rows,
- bitmap ) )
- return 0;
-
- surface->bitmap = *bitmap;
-
- /* initialize the PixMap to appropriate values */
- thePixMap.baseAddr = bitmap->buffer;
- thePixMap.rowBytes = bitmap->pitch;
- if (thePixMap.rowBytes < 0)
- thePixMap.rowBytes = -thePixMap.rowBytes;
- thePixMap.rowBytes |= 0x8000; /* flag indicating it's a PixMap, not a BitMap */
- thePixMap.bounds = bounds;
- thePixMap.pmVersion = 0;
- thePixMap.packType = 0;
- thePixMap.packSize = 0;
- thePixMap.hRes = 72 << 16;
- thePixMap.vRes = 72 << 16;
- thePixMap.pixelType = 0;
- thePixMap.cmpCount = 1;
- thePixMap.pmTable = 0;
- thePixMap.planeBytes = 0;
- thePixMap.pmReserved = 0;
-
- switch ( bitmap->mode )
- {
- case gr_pixel_mode_mono:
- thePixMap.cmpSize = 1;
- thePixMap.pixelSize = 1;
- break;
-
- case gr_pixel_mode_gray:
- thePixMap.cmpSize = 8;
- thePixMap.pixelSize = 8;
- thePixMap.pmTable = GetCTable(256); /* color palette matching FT's idea
- of grayscale. See ftview.rsrc */
- break;
-
- default:
- return 0; /* Unknown mode */
- }
-
- /* create the window */
- OffsetRect(&bounds, 10, 44); /* place it at a decent location */
- theWindow = NewCWindow(NULL, &bounds, "\p???", 1, 0, (GrafPtr)-1, 1, 0);
-
- /* fill in surface interface */
- surface->done = (grDoneSurfaceFunc) done_surface;
- surface->refresh_rect = (grRefreshRectFunc) refresh_rectangle;
- surface->set_title = (grSetTitleFunc) set_title;
- surface->listen_event = (grListenEventFunc) listen_event;
-
- return surface;
-}
-
-
- static int init_device( void )
- {
- return 0;
- }
-
- static void done_device( void )
- {
- /* won't get called either :-( */
- }
-
- grDevice gr_mac_device =
- {
- sizeof( grSurface ),
- "mac",
-
- init_device,
- done_device,
-
- (grDeviceInitSurfaceFunc) init_surface,
-
- 0,
- 0
- };
-
-
-/* End */
--- a/demos/graph/mac/grmac.h
+++ /dev/null
@@ -1,23 +1,0 @@
-#ifndef GRMAC_H
-#define GRMAC_H
-
-#include "grobjs.h"
-
- extern
- grDevice gr_mac_device;
-
-#ifdef GR_INIT_BUILD
- static
- grDeviceChain gr_mac_device_chain =
- {
- "mac",
- &gr_mac_device,
- GR_INIT_DEVICE_CHAIN
- };
-
-#undef GR_INIT_DEVICE_CHAIN
-#define GR_INIT_DEVICE_CHAIN &gr_mac_device_chain
-
-#endif /* GR_INIT_BUILD */
-
-#endif /* GRMAC_H */
--- a/demos/graph/migs.html
+++ /dev/null
@@ -1,304 +1,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="GENERATOR" content="Mozilla/4.6 [en] (X11; I; Linux 2.2.9-19mdk i586) [Netscape]">
-</head>
-<body>
-
-<center><font size=+2>MiGS Overview</font>
-<br><font size=+2>A Minimalist Graphics Subsystem</font>
-<p>
-<hr WIDTH="100%"></center>
-
-<h1>
-<font size=+0>Introduction</font></h1>
-
-<blockquote>This document details the design and implementation of MiGS,
-the minimalist graphics subsystem used by the FreeType 2 demonstration
-programs. Its purpose is mainly to help writers of new demo programs, as
-well as developers who would like port the subsystem to other platforms.</blockquote>
-
-<hr WIDTH="100%">
-<h1>
-I - Design goals</h1>
-
-<blockquote>MiGS is a tiny graphics subsystem used to demo text rendering
-through the FreeType library. It was mainly written to provide the abilities
-to :</blockquote>
-
-<ul>
-<ul>
-<li>
-draw a monochrome glyph bitmap to many kinds of target surfaces (i.e. really
-bitmaps/pixmaps)</li>
-
-<li>
-draw an anti-aliased glyph bitmap, with any level of grays, to many kinds
-of target surfaces</li>
-
-<li>
-display a simple window on many systems like X11, OS/2 and Windows</li>
-
-<li>
-accept simple events (keypresses and mouse buttons) in this window.</li>
-
-<li>
-to be portable and present a unified API on all running systems</li>
-</ul>
-
-<p><br>MiGS uses system-specific "drivers" in order to perform display
-and event handling. The blitting functions are not device-specific. MiGS
-can be built and/or used with no system-specific features, like for example,
-to generate simple GIF, PNG, TIFF, etc.. images without ever needing to
-display them.</ul>
-
-<h1>
-
-<hr WIDTH="100%"></h1>
-
-<h1>
-II - Surfaces, bitmaps and windows</h1>
-
-<blockquote>A surface in MiGS models a drawable region where glyph images
-can be rendered, a surface always contains a bitmap descriptor as well
-as a few other things that will be described later in this section.
-<p>Some surfaces can be displayed, they are then either called <i>windowed
-surfaces</i> or <i>screen surfaces</i> depending on the nature of the <i>device</i>
-used to display them. Each <i>device</i> is implemented by a very simple
-<i>driver</i> in the MiGS code. Here are a few example devices that are
-or could be written to display surfaces :
-<p>- an X11 device
-<br>- a Win 32 GDI device
-<br>- an OS/2 Presentation Manager device
-<br>- a fullscreen SVGALib device on Linux
-<br>- a GGI visual device
-<br>- an OS/2 "Dive" device, or the equivalent Win32 "DirectX" device
-<p>etc..
-<p><b>NOTE: </b>For now, only the X11 device was written and tested.. More
-devices should come later
-<p>Before explaining how to create a surface, we need to explain how MiGS
-manages bitmaps and renders glyph images to them.
-<h3>
-1. Bitmaps :</h3>
-
-<blockquote>A bitmap in MiGS features the following things :
-<ul>
-<li>
-a <b><i>width</i></b> in pixels</li>
-
-<li>
-a <b><i>height</i></b> in pixels</li>
-
-<li>
-a <b><i>pixel mode</i></b>, which indicates how the pixels are stored in
-the surface's buffer</li>
-
-<li>
-a <b><i>pitch</i></b>, whose absolute values is the number of bytes taken
-by each surface row</li>
-
-<li>
-a <b><i>number</i></b> of valid <b><i>gray</i></b> levels (see below)</li>
-
-<li>
-a <b><i>buffer</i></b>, holding the surface's pixels</li>
-</ul>
-
-<p><br>MiGS uses the <i>"Y downwards"</i> convention, which means that
-<i>increasing
-Y</i> coordinates correspond to <i>lower rows</i> of the bitmap. Hence,
-the coordinate <i>(0,0)</i> always corresponds to the bitmap's
-<i>top-left
-pixel</i>.
-<p>The bitmap's rows can be stored either <i>"downwards"</i> or <i>"upwards"</i>
-in the pixel buffer.
-<p>In the first case (<i>downwards</i>), increasing memory addresses in
-the pixel buffer correspond to lower rows of the bitmap(e.g. PC video modes),
-and the <b><i>pitch</i></b> should be equal to <b><i>the number of bytes
-taken by each row</i></b>. The first pixel buffer byte corresponds to the
-upper row.
-<p>In the second case (<i>upwards</i>), increasing memory addresses in
-the pixel buffer correspond to upper rows of the bitmap and the <b><i>pitch</i></b>
-should be equal to the <b><i>opposite</i></b> of <i>the number of bytes
-taken by each row</i>. The first pixel buffer byte corresponds to the lower
-row.
-<p>In all cases, the <b><i>pitch</i></b> is the <i>increment to be used
-to go from one bitmap row to the one below it</i>.
-<p>The supported pixel modes are :
-<ul>
-<li>
-1-bit monochrome bitmaps. With "0" as the background, and "1" as the foreground.</li>
-
-<li>
-4-bit color bitmaps, using an arbitrary palette.</li>
-
-<li>
-8-bit color bitmaps, using an arbitrary palette.</li>
-
-<li>
-8-bit gray bitmaps, using a given N number of gray levels in the range
-0..N-1.</li>
-
-<li>
-15-bit color bitmaps, also known as RGB555</li>
-
-<li>
-16-bit color bitmaps, also known as RGB565</li>
-
-<li>
-24-bit color bitmaps, also known as RGB</li>
-
-<li>
-32-bit color bitmaps, also known as RGBA (though the A is ignored by MiGS)</li>
-</ul>
-The bitmap's <b><i>number of gray levels</i></b> is only relevant for <b><i>8-bit
-gray bitmaps</i></b>, and indicates the range of gray levels that can be
-found in the bitmap. If a bitmap as N gray levels, it is said to be <i>N-grayscales</i>,
-and the pixels within it must all have values between 0, considered as
-the <i>background</i> color, and N-1, considered as the <i>foreground</i>
-color.
-<p>N-grayscale bitmaps are crucial for the rendering of anti-aliased text.
-<br> </blockquote>
-
-<h3>
-2. Glyph images :</h3>
-
-<blockquote>The glyph images that can be drawn on bitmaps through MiGS
-are bitmaps themselves, though limited to the following pixel modes :
-<p><b>1-bit monochrome glyph bitmaps</b>
-<blockquote>These can be drawn on any kind of bitmap. Note that <i>only
-the "lit" pixels</i> (i.e. the bits set to 1) are effectively drawn to
-the target, as opaque blitting isn't supported (remember, it's a minimalist
-library !)</blockquote>
-
-<p><br><b>N-grayscales glyph images </b>(with any value of N >= 2)
-<blockquote>These can be drawn to <i>all RGB bitmaps</i> (15, 16, 24 &
-32 bits/pixel), as well as any other M-grayscales bitmaps. In the latter
-case, the values of N and M <i>need not be equal</i>, as the library is
-able to perform automatic conversions <i>on the fly</i>.
-<p>For example, it is possible to render a 5-grayscales glyph image into
-a 128-grayscales bitmap. Moreover, it is also possible to render a 17-grayscales
-glyph image into a 5-grayscales bitmap, even if this will result in <i>a
-loss of quality</i>. This feature is crucial in order to experiment easily
-with other anti-aliasing algorithms for FreeType
-<br> </blockquote>
-Note that you can <i>only</i> draw <i>monochrome</i> bitmaps to the following
-pixel modes : monochrome, 4-bit color and 8-bit color.</blockquote>
-
-<h3>
-3. Windows and Screens:</h3>
-
-<blockquote>In order to debug FreeType, displaying a surface in a window
-or in full-screen mode, is required. MiGS thus makes a difference between
-<i>simple
-surfaces</i>, which only contain a bitmap, <i>windowed surfaces</i>, which
-are used to display their content in a window, and <i>screen surfaces</i>,
-which are used to display their content in a full-screen mode (SVGAlib,
-DirectX, GGI or wathever).
-<p>A few important things must be said about non-simple surfaces.
-<br>
-<ul>
-<li>
-First, they might contain some system-specific data which is used to manage
-the display in a window or on the screen. This must be <i>completely hidden</i>
-to MiGS clients. Indeed, rendering to any kind of surface is achieved through
-<i>exactly
-the same function calls</i>.</li>
-</ul>
-
-<ul>
-<li>
-Second, they may contain a bitmap whose pixel mode doesn't correspond to
-the screen's depth used to display it. For example, the surface might contain
-an 128-grayscale bitmap, while the screen is in RGB24 mode. Some conversion
-must be performed to display the surface. This can either happen in the
-system-specific graphics library (e.g. on OS/2, a single Presentation Manager
-call is used to blit a N-grayscale image to <i>any</i> kind of window)
-or in the system-specific part of MiGS (e.g. the X11 MiGS driver must convert
-the surface's bitmap into the appropriate <i>X11 image</i> each time a
-repaint is requested). Again this must be completely hidden to MiGS clients</li>
-</ul>
-Surfaces have also a few fields that are only used when displaying them
-in Windows :
-<p><b>a title string</b>
-<blockquote>This is simply a text string that is displayed on the title
-bar of the surface's window. It can also appear at the top or bottom of
-full-screen surfaces if the MiGS driver supports it. The title string can
-be changed with a call to <tt>grSetTitle</tt>, and is ignored for simple
-surfaces.</blockquote>
-
-<p><br><b>a refresh flag</b>
-<blockquote>This boolean flag is only used for window surfaces, and some
-fullscreen ones (depending on the driver implementation). When set, it
-indicates that each glyph image blit must be displayed immediately. By
-default, this flag is set to False, which means that demo programs must
-call the <tt>grRefreshSurface(surface)</tt> function to display the whole
-contents of a surface one it has been updated.
-<p>The refresh flag can be set with <tt>grSetSurfaceRefresh(surface,flag)</tt>.
-Note that a single surface rectangle can be forced to be displayed with
-a call to <tt>grRefreshRectangle(surface,x,y,w,h)</tt> at any time.</blockquote>
-</blockquote>
-
-<h3>
-4. Devices :</h3>
-
-<blockquote>As said before, each device is in charge of displaying a surface
-in a given window or screen. Each device is managed through a very simple
-driver, described to MiGS through a very simple "grDevice" structure.
-<p>A grDevice contains, among other things, pointers to the functions used
-to:
-<p>- refresh/display a given rectangle of the surface to the window/screen
-<br>- listen events (key presses and mouse) and send them back to client
-apps.
-<br>- for windowed devices, update the title bar.
-<p>As said before, this is a highly minimalist system..
-<br> </blockquote>
-</blockquote>
-
-<hr WIDTH="100%">
-<h1>
-III - Important implementation issues :</h1>
-
-<blockquote>
-<h3>
-1. Display surface negociation :</h3>
-
-<blockquote>A display surface is created with the function grNewScreenSurface
-which takes parameters indicating which device should be used, the pixel
-dimensions of the requested surface, as well as its pixel mode.
-<p>Because of some device-specific limitations, the resulting surface's
-properties might not match exactly those requested for the call. Hence,
-a developper should <b>always take care </b>of reading a new display surface's
-<b>bitmap</b> descriptor in order to get its <i>real</i> dimensions, pixel
-mode and eventually number of grays.
-<p>The function grNewSurface will create a memory surface with the corresponding
-bitmap.
-<br>The function grNewBitmapSurface will create a surface from a pre-existing
-bitmap. This is useful to draw text on loaded images, for example.
-<p>Any surface (display or not) is destroyed with grDoneSurface.</blockquote>
-
-<h3>
-</h3>
-
-<h3>
-2. Supporting 8-bit grayscale mode :</h3>
-
-<blockquote>It is important, for the debugging of FreeType anti-aliased
-renderer(s), that <b><i>_all_ devices should support the 8-bit gray mode</i></b>.
-The number of gray levels can be fixed or negociated as required by implementation-specific
-issues.
-<p>As most existing devices do not provide direct support for such a mode,
-each 8-bit surface must thus contain :
-<p>- an internal N-grayscale bitmap, used as the target of all glyph drawings
-<br>- its own device-specific "image", which matches the display depth.
-<p>Each time the device's "refresh_rect" function is called, it should
-then :
-<br>- convert the grayscales within the bitmap's rectangle into the image's
-buffer and format.
-<br>- display the corresponding image rectangle.
-<p>This scheme is used, for example, by the X11 device.</blockquote>
-</blockquote>
-
-</body>
-</html>
--- a/demos/graph/os2/gros2pm.c
+++ /dev/null
@@ -1,754 +1,0 @@
-#include "gros2pm.h"
-#include "grdevice.h"
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_GPI
-#define INCL_SUB
-
-#include <os2.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#define DEBUGxxx
-
-#ifdef DEBUG
-#define LOG(x) LogMessage##x
-#else
-#define LOG(x) /* rien */
-#endif
-
-#ifdef DEBUG
- static void LogMessage( const char* fmt, ... )
- {
- va_list ap;
-
- va_start( ap, fmt );
- vfprintf( stderr, fmt, ap );
- va_end( ap );
- }
-#endif
-
- typedef struct Translator
- {
- ULONG os2key;
- grKey grkey;
-
- } Translator;
-
-
- static
- Translator key_translators[] =
- {
- { VK_BACKSPACE, grKeyBackSpace },
- { VK_TAB, grKeyTab },
- { VK_ENTER, grKeyReturn },
- { VK_ESC, grKeyEsc },
- { VK_HOME, grKeyHome },
- { VK_LEFT, grKeyLeft },
- { VK_UP, grKeyUp },
- { VK_RIGHT, grKeyRight },
- { VK_DOWN, grKeyDown },
- { VK_PAGEUP, grKeyPageUp },
- { VK_PAGEDOWN, grKeyPageDown },
- { VK_END, grKeyEnd },
- { VK_F1, grKeyF1 },
- { VK_F2, grKeyF2 },
- { VK_F3, grKeyF3 },
- { VK_F4, grKeyF4 },
- { VK_F5, grKeyF5 },
- { VK_F6, grKeyF6 },
- { VK_F7, grKeyF7 },
- { VK_F8, grKeyF8 },
- { VK_F9, grKeyF9 },
- { VK_F10, grKeyF10 },
- { VK_F11, grKeyF11 },
- { VK_F12, grKeyF12 }
- };
-
-
-#define MAX_PIXEL_MODES 32
-
- static HAB gr_anchor; /* device anchor block */
-
- typedef POINTL PMBlitPoints[4];
-
- typedef struct grPMSurface_
- {
- grSurface root;
- grBitmap image;
-
- HAB anchor; /* handle to anchor block for surface's window */
- HWND frame_window; /* handle to window's frame */
- HWND client_window; /* handle to window's client */
- HWND title_window; /* handle to window's title bar */
-
- HPS image_ps; /* memory presentation space used to hold */
- /* the surface's content under PM */
- HDC image_dc; /* memory device context for the image */
-
- HEV event_lock; /* semaphore used in listen_surface */
- HMTX image_lock; /* a mutex used to synchronise access */
- /* to the memory presentation space */
- /* used to hold the surface */
-
- TID message_thread; /* thread used to process this surface's */
- /* messages.. */
-
- PBITMAPINFO2 bitmap_header;/* os/2 bitmap descriptor */
- HBITMAP os2_bitmap; /* Handle to OS/2 bitmap contained in image */
- BOOL ready; /* ??? */
-
- long shades[256]; /* indices of gray levels in pixel_mode_gray */
-
- POINTL surface_blit[4]; /* surface blitting table */
- POINTL magnify_blit[4]; /* magnifier blitting table */
- int magnification; /* level of magnification */
- POINTL magnify_center;
- SIZEL magnify_size;
-
- grEvent event;
-
- PMBlitPoints blit_points;
-
- } grPMSurface;
-
- /* we use a static variable to pass a pointer to the PM Surface */
- /* to the client window. This is a bit ugly, but it makes things */
- /* a lot more simple.. */
- static grPMSurface* the_surface;
-
- static int window_created = 0;
-
-
- static
- void enable_os2_iostreams( void )
- {
- PTIB thread_block;
- PPIB process_block;
-
- /* XXX : This is a very nasty hack, it fools OS/2 and let the program */
- /* call PM functions, even though stdin/stdout/stderr are still */
- /* directed to the standard i/o streams.. */
- /* The program must be compiled with WINDOWCOMPAT */
- /* */
- /* Credits go to Michal for finding this !! */
- /* */
- DosGetInfoBlocks( &thread_block, &process_block );
- process_block->pib_ultype = 3;
- }
-
-
-
- static
- int init_device( void )
- {
- enable_os2_iostreams();
-
- /* create an anchor block. This will allow this thread (i.e. the */
- /* main one) to call Gpi functions.. */
- gr_anchor = WinInitialize(0);
- if (!gr_anchor)
- {
- /* could not initialise Presentation Manager */
- return -1;
- }
-
- return 0;
- }
-
-
-
- static
- void done_device( void )
- {
- /* Indicates that we do not use the Presentation Manager, this */
- /* will also release all associated resources.. */
- WinTerminate( gr_anchor );
- }
-
-
-
- /* close a given window */
- static
- void done_surface( grPMSurface* surface )
- {
- LOG(( "Os2PM: done_surface(%08lx)\n", (long)surface ));
-
- if ( surface->frame_window )
- WinDestroyWindow( surface->frame_window );
-
- WinReleasePS( surface->image_ps );
-
- grDoneBitmap( &surface->image );
- grDoneBitmap( &surface->root.bitmap );
- }
-
-
-
-
-
-#define LOCK(x) DosRequestMutexSem( x, SEM_INDEFINITE_WAIT );
-#define UNLOCK(x) DosReleaseMutexSem( x )
-
-
- static
- const int pixel_mode_bit_count[] =
- {
- 0,
- 1, /* mono */
- 4, /* pal4 */
- 8, /* pal8 */
- 8, /* grays */
- 15, /* rgb15 */
- 16, /* rgb16 */
- 24, /* rgb24 */
- 32 /* rgb32 */
- };
-
-
- /************************************************************************
- *
- * Technical note : how the OS/2 Presntation Manager driver works
- *
- * PM is, in my opinion, a bloated and over-engineered graphics
- * sub-system, even though it has lots of nice features. Here are
- * a few tidbits about it :
- *
- *
- * - under PM, a "bitmap" is a device-specific object whose bits are
- * not directly accessible to the client application. This means
- * that we must use a scheme like the following to display our
- * surfaces :
- *
- * - hold, for each surface, its own bitmap buffer where the
- * rest of the graph library writes directly.
- *
- * - create a PM bitmap object with the same dimensions (and
- * possibly format).
- *
- * - copy the content of each updated rectangle into the
- * PM bitmap with the function 'GpiSetBitmapBits'.
- *
- * - finally, "blit" the PM bitmap to the screen calling
- * 'GpiBlitBlt'
- *
- * - but there is more : you cannot directly blit a PM bitmap to the
- * screen with PM. The 'GpiBlitBlt' only works with presentation
- * spaces. This means that we also need to create, for each surface :
- *
- * - a memory presentation space, used to hold the PM bitmap
- * - a "memory device context" for the presentation space
- *
- * The blit is then performed from the memory presentation space
- * to the screen's presentation space..
- *
- *
- * - because each surface creates its own event-handling thread,
- * we must protect the surface's presentation space from concurrent
- * accesses (i.e. calls to 'GpiSetBitmapBits' when drawing to the
- * surface, and calls to 'GpiBlitBlt' when drawing it on the screen
- * are performed in two different threads).
- *
- * we use a simple mutex to do this.
- *
- *
- * - we also use a semaphore to perform a rendez-vous between the
- * main and event-handling threads (needed in "listen_event").
- *
- ************************************************************************/
-
- static
- void RunPMWindow( grPMSurface* surface );
-
-
-
-
- static
- void refresh_rectangle( grPMSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- LOG(( "Os2PM: refresh_rectangle( %08lx, %d, %d, %d, %d )\n",
- (long)surface, x, y, w, h ));
-
- (void)x;
- (void)y;
- (void)w;
- (void)h;
-
- /*
- convert_rectangle( surface, x, y, w, h );
- */
- DosRequestMutexSem( surface->image_lock, SEM_INDEFINITE_WAIT );
- GpiSetBitmapBits( surface->image_ps,
- 0,
- surface->root.bitmap.rows,
- surface->root.bitmap.buffer,
- surface->bitmap_header );
- DosReleaseMutexSem( surface->image_lock );
-
- WinInvalidateRect( surface->client_window, NULL, FALSE );
- WinUpdateWindow( surface->frame_window );
- }
-
-
- static
- void set_title( grPMSurface* surface,
- const char* title )
- {
- ULONG rc;
-
-#if 1
- LOG(( "Os2PM: set_title( %08lx == %08lx, %s )\n",
- (long)surface, surface->client_window, title ));
-#endif
- LOG(( " -- frame = %08lx\n",
- (long)surface->frame_window ));
-
- LOG(( " -- client parent = %08lx\n",
- (long)WinQueryWindow( surface->client_window, QW_PARENT ) ));
-
- rc = WinSetWindowText( surface->client_window, (PSZ)title );
- LOG(( " -- returned rc = %ld\n",rc ));
- }
-
-
-
- static
- void listen_event( grPMSurface* surface,
- int event_mask,
- grEvent* grevent )
- {
- ULONG ulRequestCount;
-
- (void) event_mask; /* ignored for now */
-
- /* the listen_event function blocks until there is an event to process */
- DosWaitEventSem( surface->event_lock, SEM_INDEFINITE_WAIT );
- DosQueryEventSem( surface->event_lock, &ulRequestCount );
- *grevent = surface->event;
- DosResetEventSem( surface->event_lock, &ulRequestCount );
-
- return;
- }
-
-
- static
- grPMSurface* init_surface( grPMSurface* surface,
- grBitmap* bitmap )
- {
- PBITMAPINFO2 bit;
- SIZEL sizl = { 0, 0 };
- LONG palette[256];
-
- LOG(( "Os2PM: init_surface( %08lx, %08lx )\n",
- (long)surface, (long)bitmap ));
-
- LOG(( " -- input bitmap =\n" ));
- LOG(( " -- mode = %d\n", bitmap->mode ));
- LOG(( " -- grays = %d\n", bitmap->grays ));
- LOG(( " -- width = %d\n", bitmap->width ));
- LOG(( " -- height = %d\n", bitmap->rows ));
-
- /* create the bitmap - under OS/2, we support all modes as PM */
- /* handles all conversions automatically.. */
- if ( grNewBitmap( bitmap->mode,
- bitmap->grays,
- bitmap->width,
- bitmap->rows,
- bitmap ) )
- return 0;
-
- LOG(( " -- output bitmap =\n" ));
- LOG(( " -- mode = %d\n", bitmap->mode ));
- LOG(( " -- grays = %d\n", bitmap->grays ));
- LOG(( " -- width = %d\n", bitmap->width ));
- LOG(( " -- height = %d\n", bitmap->rows ));
-
- bitmap->pitch = -bitmap->pitch;
- surface->root.bitmap = *bitmap;
-
- /* create the image and event lock */
- DosCreateEventSem( NULL, &surface->event_lock, 0, TRUE );
- DosCreateMutexSem( NULL, &surface->image_lock, 0, FALSE );
-
- /* create the image's presentation space */
- surface->image_dc = DevOpenDC( gr_anchor,
- OD_MEMORY, (PSZ)"*", 0L, 0L, 0L );
-
- surface->image_ps = GpiCreatePS( gr_anchor,
- surface->image_dc,
- &sizl,
- PU_PELS | GPIT_MICRO |
- GPIA_ASSOC | GPIF_DEFAULT );
-
- GpiSetBackMix( surface->image_ps, BM_OVERPAINT );
-
- /* create the image's PM bitmap */
- bit = (PBITMAPINFO2)grAlloc( sizeof(BITMAPINFO2) + 256*sizeof(RGB2) );
- surface->bitmap_header = bit;
-
- bit->cbFix = sizeof( BITMAPINFOHEADER2 );
- bit->cx = surface->root.bitmap.width;
- bit->cy = surface->root.bitmap.rows;
- bit->cPlanes = 1;
-
- bit->argbColor[0].bBlue = 255;
- bit->argbColor[0].bGreen = 0;
- bit->argbColor[0].bRed = 0;
-
- bit->argbColor[1].bBlue = 0;
- bit->argbColor[1].bGreen = 255;
- bit->argbColor[1].bRed = 0;
-
- bit->cBitCount = (bitmap->mode == gr_pixel_mode_gray ? 8 : 1 );
-
- if (bitmap->mode == gr_pixel_mode_gray)
- {
- RGB2* color = bit->argbColor;
- int x, count;
-
- count = bitmap->grays;
- for ( x = 0; x < count; x++, color++ )
- {
- color->bBlue =
- color->bGreen =
- color->bRed = (((count-x)*255)/count);
- }
- }
- else
- {
- RGB2* color = bit->argbColor;
-
- color[0].bBlue =
- color[0].bGreen =
- color[0].bRed = 0;
-
- color[1].bBlue =
- color[1].bGreen =
- color[1].bRed = 255;
- }
-
- surface->os2_bitmap = GpiCreateBitmap( surface->image_ps,
- (PBITMAPINFOHEADER2)bit,
- 0L, NULL, NULL );
-
- GpiSetBitmap( surface->image_ps, surface->os2_bitmap );
-
- bit->cbFix = sizeof( BITMAPINFOHEADER2 );
- GpiQueryBitmapInfoHeader( surface->os2_bitmap,
- (PBITMAPINFOHEADER2)bit );
- surface->bitmap_header = bit;
-
- /* for gr_pixel_mode_gray, create a gray-levels logical palette */
- if ( bitmap->mode == gr_pixel_mode_gray )
- {
- int x, count;
-
- count = bitmap->grays;
- for ( x = 0; x < count; x++ )
- palette[x] = (((count-x)*255)/count) * 0x010101;
-
- /* create logical color table */
- GpiCreateLogColorTable( surface->image_ps,
- (ULONG) LCOL_PURECOLOR,
- (LONG) LCOLF_CONSECRGB,
- (LONG) 0L,
- (LONG) count,
- (PLONG) palette );
-
- /* now, copy the color indexes to surface->shades */
- for ( x = 0; x < count; x++ )
- surface->shades[x] = GpiQueryColorIndex( surface->image_ps,
- 0, palette[x] );
- }
-
- /* set up the blit points array */
- surface->blit_points[1].x = surface->root.bitmap.width;
- surface->blit_points[1].y = surface->root.bitmap.rows;
- surface->blit_points[3] = surface->blit_points[1];
-
- window_created = 0;
-
- /* Finally, create the event handling thread for the surface's window */
- DosCreateThread( &surface->message_thread,
- (PFNTHREAD) RunPMWindow,
- (ULONG) surface,
- 0UL,
- 32920 );
-
- /* wait for the window creation */
- for ( ; window_created == 0; )
-
- surface->root.done = (grDoneSurfaceFunc) done_surface;
- surface->root.refresh_rect = (grRefreshRectFunc) refresh_rectangle;
- surface->root.set_title = (grSetTitleFunc) set_title;
- surface->root.listen_event = (grListenEventFunc) listen_event;
-
- /* convert_rectangle( surface, 0, 0, bitmap->width, bitmap->rows ); */
- return surface;
- }
-
-
-
- MRESULT EXPENTRY Message_Process( HWND handle,
- ULONG mess,
- MPARAM parm1,
- MPARAM parm2 );
-
-
- static
- void RunPMWindow( grPMSurface* surface )
- {
- unsigned char class_name[] = "DisplayClass";
- ULONG class_flags;
-
- static HMQ queue;
- QMSG message;
-
- /* store the current surface pointer in "the_surface". It is a static */
- /* variable that is only used to retrieve the pointer in the client */
- /* window procedure the first time is is called.. */
- the_surface = surface;
-
- LOG(( "Os2PM: RunPMWindow( %08lx )\n", (long)surface ));
-
- /* create an anchor to allow this thread to use PM */
- surface->anchor = WinInitialize(0);
- if (!surface->anchor)
- {
- printf( "Error doing WinInitialize()\n" );
- return;
- }
-
- /* create a message queue */
- queue = WinCreateMsgQueue( surface->anchor, 0 );
- if (!queue)
- {
- printf( "Error doing >inCreateMsgQueue()\n" );
- return;
- }
-
- /* register the window class */
- if ( !WinRegisterClass( surface->anchor,
- (PSZ) class_name,
- (PFNWP) Message_Process,
- CS_SIZEREDRAW,
- 0 ) )
- {
- printf( "Error doing WinRegisterClass()\n" );
- return;
- }
-
- /* create the PM window */
- class_flags = FCF_TITLEBAR | FCF_MINBUTTON | FCF_DLGBORDER |
- FCF_TASKLIST | FCF_SYSMENU;
-
- LOG(( "Os2PM: RunPMWindow: Creating window\n" ));
- surface->frame_window = WinCreateStdWindow(
- HWND_DESKTOP,
- WS_VISIBLE,
- &class_flags,
- (PSZ) class_name,
- (PSZ) "FreeType Viewer - press F1 for help",
- WS_VISIBLE,
- 0, 0,
- &surface->client_window );
- if (!surface->frame_window)
- {
- printf( "Error doing WinCreateStdWindow()\n" );
- return;
- }
-
- /* find the title window handle */
- surface->title_window = WinWindowFromID( surface->frame_window,
- FID_TITLEBAR );
- LOG (( "Os2PM: RunPMWIndow: Creation succeeded\n" ));
- LOG (( " -- frame = %08lx\n", surface->frame_window ));
- LOG (( " -- client = %08lx\n", surface->client_window ));
-
- /* set Window size and position */
- WinSetWindowPos( surface->frame_window,
- 0L,
- (SHORT) 60,
-
- (SHORT) WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) -
- (surface->root.bitmap.rows + 100),
-
- (SHORT) WinQuerySysValue( HWND_DESKTOP, SV_CYDLGFRAME )*2 +
- surface->root.bitmap.width,
-
- (SHORT) WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ) +
- WinQuerySysValue( HWND_DESKTOP, SV_CYDLGFRAME )*2 +
- surface->root.bitmap.rows,
-
- SWP_SIZE | SWP_MOVE );
-
-#if 0
- /* save the handle to the current surface within the window words */
- WinSetWindowPtr( surface->client_window,QWL_USER, surface );
-#endif
-
- window_created = 1;
-
- /* run the message queue till the end */
- while ( WinGetMsg( surface->anchor, &message, (HWND)NULL, 0, 0 ) )
- {
- WinDispatchMsg( surface->anchor, &message );
- }
-
- /* clean-up */
- WinDestroyWindow( surface->frame_window );
- surface->frame_window = 0;
-
- WinDestroyMsgQueue( queue );
- WinTerminate( surface->anchor );
-
- /* await death... */
- while ( 1 )
- DosSleep( 100 );
- }
-
-
-
-
- /* Message processing for our PM Window class */
- MRESULT EXPENTRY Message_Process( HWND handle,
- ULONG mess,
- MPARAM parm1,
- MPARAM parm2 )
- {
- static HDC screen_dc;
- static HPS screen_ps;
- static BOOL minimized;
-
- SIZEL sizl;
- SWP swp;
-
- grPMSurface* surface;
-
- /* get the handle to the window's surface -- note that this */
- /* value will be null when the window is created */
- surface = (grPMSurface*)WinQueryWindowPtr( handle, QWL_USER );
- if (!surface)
- {
- surface = the_surface;
- WinSetWindowPtr( handle, QWL_USER, surface );
- }
-
- switch( mess )
- {
- case WM_DESTROY:
- /* warn the main thread to quit if it didn't know */
- surface->event.type = gr_event_key;
- surface->event.key = grKeyEsc;
- DosPostEventSem( surface->event_lock );
- break;
-
- case WM_CREATE:
- /* set original magnification */
- minimized = FALSE;
-
- /* create Device Context and Presentation Space for screen. */
- screen_dc = WinOpenWindowDC( handle );
- screen_ps = GpiCreatePS( surface->anchor,
- screen_dc,
- &sizl,
- PU_PELS | GPIT_MICRO |
- GPIA_ASSOC | GPIF_DEFAULT );
- /* take the input focus */
- WinFocusChange( HWND_DESKTOP, handle, 0L );
- LOG(( "screen_dc and screen_ps have been created\n" ));
- break;
-
- case WM_MINMAXFRAME:
- /* to update minimized if changed */
- swp = *((PSWP) parm1);
- if ( swp.fl & SWP_MINIMIZE )
- minimized = TRUE;
- if ( swp.fl & SWP_RESTORE )
- minimized = FALSE;
- return WinDefWindowProc( handle, mess, parm1, parm2 );
- break;
-
- case WM_ERASEBACKGROUND:
- case WM_PAINT:
- /* copy the memory image of the screen out to the real screen */
- DosRequestMutexSem( surface->image_lock, SEM_INDEFINITE_WAIT );
- WinBeginPaint( handle, screen_ps, NULL );
-
- /* main image and magnified picture */
- GpiBitBlt( screen_ps,
- surface->image_ps,
- 4L,
- surface->blit_points,
- ROP_SRCCOPY, BBO_AND );
-
- WinEndPaint( screen_ps );
- DosReleaseMutexSem( surface->image_lock );
- break;
-
- case WM_HELP: /* this really is a F1 Keypress !! */
- surface->event.key = grKeyF1;
- goto Do_Key_Event;
-
- case WM_CHAR:
- if ( CHARMSG( &mess )->fs & KC_KEYUP )
- break;
-
- /* look for a specific vkey */
- {
- int count = sizeof( key_translators )/sizeof( key_translators[0] );
- Translator* trans = key_translators;
- Translator* limit = trans + count;
-
- for ( ; trans < limit; trans++ )
- if ( CHARMSG(&mess)->vkey == trans->os2key )
- {
- surface->event.key = trans->grkey;
- goto Do_Key_Event;
- }
- }
-
- /* otherwise, simply record the character code */
- if ( (CHARMSG( &mess )->fs & KC_CHAR) == 0 )
- break;
-
- surface->event.key = CHARMSG(&mess)->chr;
-
- Do_Key_Event:
- surface->event.type = gr_event_key;
- DosPostEventSem( surface->event_lock );
- break;
-
- default:
- return WinDefWindowProc( handle, mess, parm1, parm2 );
- }
-
- return (MRESULT) FALSE;
- }
-
-
-
-
- grDevice gr_os2pm_device =
- {
- sizeof( grPMSurface ),
- "os2pm",
-
- init_device,
- done_device,
-
- (grDeviceInitSurfaceFunc) init_surface,
-
- 0,
- 0
-
- };
-
-
--- a/demos/graph/os2/gros2pm.def
+++ /dev/null
@@ -1,5 +1,0 @@
-NAME WINDOWCOMPAT
-
-DESCRIPTION 'FreeType Graphics'
-HEAPSIZE 8192
-STACKSIZE 40888
--- a/demos/graph/os2/gros2pm.h
+++ /dev/null
@@ -1,23 +1,0 @@
-#ifndef GROS2PM_H
-#define GROS2PM_H
-
-#include "grobjs.h"
-
- extern
- grDevice gr_os2pm_device;
-
-#ifdef GR_INIT_BUILD
- static
- grDeviceChain gr_os2pm_device_chain =
- {
- "os2pm",
- &gr_os2pm_device,
- GR_INIT_DEVICE_CHAIN
- };
-
-#undef GR_INIT_DEVICE_CHAIN
-#define GR_INIT_DEVICE_CHAIN &gr_os2pm_device_chain
-
-#endif /* GR_INIT_BUILD */
-
-#endif /* GROS2PM_H */
--- a/demos/graph/os2/rules.mk
+++ /dev/null
@@ -1,32 +1,0 @@
-#**************************************************************************
-#*
-#* OS/2 specific rules file, used to compile the OS/2 graphics driver
-#* to the graphics subsystem
-#*
-#**************************************************************************
-
-ifeq ($(PLATFORM),os2)
-
-GR_OS2 := $(GRAPH_)os2
-GR_OS2_ := $(GR_OS2)$(SEP)
-
-# the GRAPH_LINK is expanded each time an executable is linked with the
-# graphics library.
-#
-GRAPH_LINK += $(GR_OS2_)gros2pm.def
-
-# Add the OS/2 driver object file to the graphics library "graph.a"
-#
-GRAPH_OBJS += $(OBJ_)gros2pm.$O
-
-DEVICES += OS2_PM
-DEVICE_INCLUDES += $(GR_OS2)
-
-# the rule used to compile the graphics driver
-#
-$(OBJ_)gros2pm.$O: $(GR_OS2_)gros2pm.c $(GR_OS2_)gros2pm.h
- $(CC) $(CFLAGS) $(GRAPH_INCLUDES:%=$I%) $I$(GR_OS2) $T$@ $<
-
-endif
-
-
--- a/demos/graph/rules.mk
+++ /dev/null
@@ -1,104 +1,0 @@
-#**************************************************************************
-#*
-#* FreeType demo utilities sub-Makefile
-#*
-#* This Makefile is to be included by "freetype/demo/Makefile". Its
-#* purpose is to compile MiGS (the Minimalist Graphics Subsystem)
-#*
-#* It is written for GNU Make. Other make utilities are not
-#* supported.. !!
-#*
-#*
-#* The following variables must be defined :
-#*
-#* CFLAGS : C flags to use when compiling the utilities. This
-#* must NOT include the '-c' flag used to specify a
-#* simple compilation.
-#*
-#* IFLAG : include path flag. This is typically "-I" but some
-#* compilers use a different convention..
-#*
-#* LFLAG : add link directory flag. Usually '-L' but could be
-#* different..
-#*
-#* OBJ_DIR : target location of the object files
-#*
-#* UTIL_DIR : location of the utilities sources. I.e. this
-#* directory (usually "freetype/demo/graph").
-#*
-#*
-#* It also defines the following variables
-#*
-#* SIMPLE_UTILS : list of object files for the non-graphical utilities
-#*
-#* GRAPH_UTILS : all object files, including the graphics sub-system
-#*
-#* GRAPH_FLAGS : additional compile flags for graphical apps
-#* GRAPH_LINK : additional link flags for graphical apps
-#*
-#**************************************************************************
-
-##########################################################################
-#
-#
-#
-#
-#
-
-GRAPH_INCLUDES := $(TOP2_)graph
-GRAPH_LIB := $(OBJ_)graph.$A
-#GRAPH_LINK := $(GRAPH_LIB)
-
-GRAPH_ := $(TOP2_)graph$(SEP)
-
-GRAPH_H := $(GRAPH_)graph.h \
- $(GRAPH_)grtypes.h \
- $(GRAPH_)grobjs.h \
- $(GRAPH_)grdevice.h \
- $(GRAPH_)grblit.h
-
-
-GRAPH_OBJS := $(OBJ_)grblit.$O \
- $(OBJ_)grobjs.$O \
- $(OBJ_)grfont.$O \
- $(OBJ_)grdevice.$O \
- $(OBJ_)grinit.$O
-
-
-# Default value for COMPILE_GRAPH_LIB
-# this value can be modified by the system-specific graphics drivers..
-#
-COMPILE_GRAPH_LIB = ar -r $@ $(GRAPH_OBJS)
-
-# Add the rules used to detect and compile graphics driver depending
-# on the current platform..
-#
-include $(wildcard $(TOP2)/graph/*/rules.mk)
-
-#########################################################################
-#
-# Build the "graph" library from its objects. This should be changed
-# in the future in order to support more systems. Probably something
-# like a `config/<system>' hierarchy with a system-specific rules file
-# to indicate how to make a library file, but for now, I'll stick to
-# unix, Win32 and OS/2-gcc..
-#
-#
-$(GRAPH_LIB): $(GRAPH_OBJS)
- $(COMPILE_GRAPH_LIB)
-
-
-# pattern rule for normal sources
-#
-$(OBJ_)%.$O: $(GRAPH_)%.c $(GRAPH_H)
- $(CC) $(CFLAGS) $(GRAPH_INCLUDES:%=$I%) $T$@ $<
-
-
-# a special rule is used for 'grinit.o' as it needs the definition
-# of some macros like "-DDEVICE_X11" or "-DDEVICE_OS2_PM"
-#
-$(OBJ_)grinit.$O: $(GRAPH_)grinit.c $(GRAPH_H)
- $(CC) $(CFLAGS) $(GRAPH_INCLUDES:%=$I%) \
- $(DEVICE_INCLUDES:%=$I%) \
- $(DEVICES:%=$DDEVICE_%) $T$@ $<
-
--- a/demos/graph/win32/grwin32.c
+++ /dev/null
@@ -1,525 +1,0 @@
-/*******************************************************************
- *
- * grwin32.c graphics driver for Win32 platform. 0.1
- *
- * This is the driver for displaying inside a window under Win32,
- * used by the graphics utility of the FreeType test suite.
- *
- * Written by Antoine Leca.
- * Copyright 1999-2000 by Antoine Leca, David Turner
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * Borrowing liberally from the other FreeType drivers.
- *
- * This file is part of the FreeType project, and may only be used
- * modified and distributed under the terms of the FreeType project
- * license, LICENSE.TXT. By continuing to use, modify or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- ******************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-#include "grwin32.h"
-#include "grdevice.h"
-
-
-/* logging facility */
-#include <stdarg.h>
-
-#define DEBUGxxx
-
-#ifdef DEBUG
-#define LOG(x) LogMessage##x
-#else
-#define LOG(x) /* rien */
-#endif
-
-#ifdef DEBUG
- static void LogMessage( const char* fmt, ... )
- {
- va_list ap;
-
- va_start( ap, fmt );
- vfprintf( stderr, fmt, ap );
- va_end( ap );
- }
-#endif
-/*-------------------*/
-
-/* Size of the window. */
-#define WIN_WIDTH 640u
-#define WIN_HEIGHT 450u
-
-/* These values can be changed, but WIN_WIDTH should remain for now a */
-/* multiple of 32 to avoid padding issues. */
-
- typedef struct _Translator
- {
- ULONG winkey;
- grKey grkey;
-
- } Translator;
-
- static
- Translator key_translators[] =
- {
- { VK_BACK, grKeyBackSpace },
- { VK_TAB, grKeyTab },
- { VK_RETURN, grKeyReturn },
- { VK_ESCAPE, grKeyEsc },
- { VK_HOME, grKeyHome },
- { VK_LEFT, grKeyLeft },
- { VK_UP, grKeyUp },
- { VK_RIGHT, grKeyRight },
- { VK_DOWN, grKeyDown },
- { VK_PRIOR, grKeyPageUp },
- { VK_NEXT, grKeyPageDown },
- { VK_END, grKeyEnd },
- { VK_F1, grKeyF1 },
- { VK_F2, grKeyF2 },
- { VK_F3, grKeyF3 },
- { VK_F4, grKeyF4 },
- { VK_F5, grKeyF5 },
- { VK_F6, grKeyF6 },
- { VK_F7, grKeyF7 },
- { VK_F8, grKeyF8 },
- { VK_F9, grKeyF9 },
- { VK_F10, grKeyF10 },
- { VK_F11, grKeyF11 },
- { VK_F12, grKeyF12 }
- };
-
- static
- Translator syskey_translators[] =
- {
- { VK_F1, grKeyF1 }
- };
-
- /* This is a minimalist driver, it is only able to display */
- /* a _single_ window. Moreover, only monochrome and gray */
- /* bitmaps are supported.. */
-
- /* handle of the window. */
- static HWND hwndGraphic;
-
- static int window_width, window_height;
-
- /* the following variables are used to set the window title lazily */
- static int title_set = 1;
- static const char* the_title;
-
- /* bitmap information */
- static LPBITMAPINFO pbmi;
- static HBITMAP hbm;
-
- /* local event to pass on */
- static grEvent ourevent;
- static int eventToProcess = 0;
-
-/* destroys the surface*/
-static
-void done_surface( grSurface* surface )
-{
- /* The graphical window has perhaps already destroyed itself */
- if ( hwndGraphic )
- {
- DestroyWindow ( hwndGraphic );
- PostMessage( hwndGraphic, WM_QUIT, 0, 0 );
- }
- grDoneBitmap( &surface->bitmap );
- if ( pbmi ) free ( pbmi );
-}
-
- static
- const int pixel_mode_bit_count[] =
- {
- 0,
- 1, /* mono */
- 4, /* pal4 */
- 8, /* pal8 */
- 8, /* grays */
- 15, /* rgb15 */
- 16, /* rgb16 */
- 24, /* rgb24 */
- 32 /* rgb32 */
- };
-
- static
- void refresh_rectangle( grSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- HDC hDC;
- int row_bytes;
-
- LOG(( "Win32: refresh_rectangle( %08lx, %d, %d, %d, %d )\n",
- (long)surface, x, y, w, h ));
- (void)x;
- (void)y;
- (void)w;
- (void)h;
-
- row_bytes = surface->bitmap.pitch;
- if (row_bytes < 0) row_bytes = -row_bytes;
-
- if ( row_bytes*8 != pbmi->bmiHeader.biWidth * pbmi->bmiHeader.biBitCount )
- pbmi->bmiHeader.biWidth = row_bytes * 8 / pbmi->bmiHeader.biBitCount;
-
- hDC = GetDC ( hwndGraphic );
- SetDIBits ( hDC, hbm,
- 0,
- surface->bitmap.rows,
- surface->bitmap.buffer,
- pbmi,
- DIB_RGB_COLORS );
-
- ReleaseDC ( hwndGraphic, hDC );
-
- ShowWindow( hwndGraphic, SW_SHOW );
- InvalidateRect ( hwndGraphic, NULL, FALSE );
- UpdateWindow ( hwndGraphic );
- }
-
- static
- void set_title( grSurface* surface, const char* title )
- {
- (void)surface;
-
- /* the title will be set on the next listen_event, just */
- /* record it there.. */
- the_title = title;
- title_set = 0;
- }
-
- static
- void listen_event( grSurface* surface,
- int event_mask,
- grEvent* grevent )
- {
- MSG msg;
-
- (void)surface;
- (void)event_mask;
-
- if ( hwndGraphic && !title_set )
- {
- SetWindowText( hwndGraphic, the_title );
- title_set = 1;
- }
-
- eventToProcess = 0;
- while (GetMessage( &msg, 0, 0, 0 ))
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- if (eventToProcess)
- break;
- }
-
- *grevent = ourevent;
- }
-
-/*
- * set graphics mode
- * and create the window class and the message handling.
- */
-
-/* Declarations of the Windows-specific functions that are below. */
-static BOOL RegisterTheClass ( void );
-static BOOL CreateTheWindow ( int width, int height );
-
-static
-grSurface* init_surface( grSurface* surface,
- grBitmap* bitmap )
-{
- static RGBQUAD black = { 0, 0, 0, 0 };
- static RGBQUAD white = { 0xFF, 0xFF, 0xFF, 0 };
-
- if( ! RegisterTheClass() ) return 0; /* if already running, fails. */
-
- /* find some memory for the bitmap header */
- if ( (pbmi = malloc ( sizeof ( BITMAPINFO ) + sizeof ( RGBQUAD ) * 256 ) )
- /* 256 should really be 2 if not grayscale */
- == NULL )
- /* lack of memory; fails the process */
- return 0;
-
- LOG(( "Win32: init_surface( %08lx, %08lx )\n",
- (long)surface, (long)bitmap ));
-
- LOG(( " -- input bitmap =\n" ));
- LOG(( " -- mode = %d\n", bitmap->mode ));
- LOG(( " -- grays = %d\n", bitmap->grays ));
- LOG(( " -- width = %d\n", bitmap->width ));
- LOG(( " -- height = %d\n", bitmap->rows ));
-
- /* create the bitmap - under Win32, we support all modes as the GDI */
- /* handles all conversions automatically.. */
- if ( grNewBitmap( bitmap->mode,
- bitmap->grays,
- bitmap->width,
- bitmap->rows,
- bitmap ) )
- return 0;
-
- LOG(( " -- output bitmap =\n" ));
- LOG(( " -- mode = %d\n", bitmap->mode ));
- LOG(( " -- grays = %d\n", bitmap->grays ));
- LOG(( " -- width = %d\n", bitmap->width ));
- LOG(( " -- height = %d\n", bitmap->rows ));
-
- bitmap->pitch = -bitmap->pitch;
- surface->bitmap = *bitmap;
-
- /* initialize the header to appropriate values */
- memset( pbmi, 0, sizeof ( BITMAPINFO ) + sizeof ( RGBQUAD ) * 256 );
-
- switch ( bitmap->mode )
- {
- case gr_pixel_mode_mono:
- pbmi->bmiHeader.biBitCount = 1;
- pbmi->bmiColors[0] = white;
- pbmi->bmiColors[1] = black;
- break;
-
- case gr_pixel_mode_gray:
- pbmi->bmiHeader.biBitCount = 8;
- pbmi->bmiHeader.biClrUsed = bitmap->grays;
- {
- int count = bitmap->grays;
- int x;
- RGBQUAD* color = pbmi->bmiColors;
-
- for ( x = 0; x < count; x++, color++ )
- {
- color->rgbRed =
- color->rgbGreen =
- color->rgbBlue = (((count-x)*255)/count);
- color->rgbReserved = 0;
- }
- }
- break;
-
- default:
- free ( pbmi );
- return 0; /* Unknown mode */
- }
-
- pbmi->bmiHeader.biSize = sizeof ( BITMAPINFOHEADER );
- pbmi->bmiHeader.biWidth = bitmap->width;
- pbmi->bmiHeader.biHeight = bitmap->rows;
- pbmi->bmiHeader.biPlanes = 1;
-
- if( ! CreateTheWindow( bitmap->width, bitmap->rows ) )
- {
- free ( pbmi );
- return 0;
- }
-
- surface->done = (grDoneSurfaceFunc) done_surface;
- surface->refresh_rect = (grRefreshRectFunc) refresh_rectangle;
- surface->set_title = (grSetTitleFunc) set_title;
- surface->listen_event = (grListenEventFunc) listen_event;
-
- return surface;
-}
-
-
-/* ---- Windows-specific stuff ------------------------------------------- */
-
-LRESULT CALLBACK Message_Process( HWND, UINT, WPARAM, LPARAM );
-
-static
-BOOL RegisterTheClass ( void )
- {
- WNDCLASS ourClass = {
- /* UINT style */ 0,
- /* WNDPROC lpfnWndProc */ Message_Process,
- /* int cbClsExtra */ 0,
- /* int cbWndExtra */ 0,
- /* HANDLE hInstance */ 0,
- /* HICON hIcon */ 0,
- /* HCURSOR hCursor */ 0,
- /* HBRUSH hbrBackground*/ 0,
- /* LPCTSTR lpszMenuName */ NULL,
- /* LPCTSTR lpszClassName*/ "FreeTypeTestGraphicDriver"
- };
-
- ourClass.hInstance = GetModuleHandle( NULL );
- ourClass.hIcon = LoadIcon(0, IDI_APPLICATION);
- ourClass.hCursor = LoadCursor(0, IDC_ARROW);
- ourClass.hbrBackground= GetStockObject(BLACK_BRUSH);
-
- return RegisterClass(&ourClass) != 0; /* return False if it fails. */
- }
-
-static
-BOOL CreateTheWindow ( int width, int height )
- {
- window_width = width;
- window_height = height;
-
- if ( ! (hwndGraphic = CreateWindow(
- /* LPCSTR lpszClassName; */ "FreeTypeTestGraphicDriver",
- /* LPCSTR lpszWindowName; */ "FreeType Test Graphic Driver",
- /* DWORD dwStyle; */ WS_OVERLAPPED | WS_SYSMENU,
- /* int x; */ CW_USEDEFAULT,
- /* int y; */ CW_USEDEFAULT,
- /* int nWidth; */ width + 2*GetSystemMetrics(SM_CXBORDER),
- /* int nHeight; */ height+ GetSystemMetrics(SM_CYBORDER)
- + GetSystemMetrics(SM_CYCAPTION),
- /* HWND hwndParent; */ HWND_DESKTOP,
- /* HMENU hmenu; */ 0,
- /* HINSTANCE hinst; */ GetModuleHandle( NULL ),
- /* void FAR* lpvParam; */ NULL))
- )
- /* creation failed... */
- return 0;
-
- return 1;
- }
-
- /* Message processing for our Windows class */
-LRESULT CALLBACK Message_Process( HWND handle, UINT mess,
- WPARAM wParam, LPARAM lParam )
- {
-
- switch( mess )
- {
- case WM_DESTROY:
- /* warn the main thread to quit if it didn't know */
- ourevent.type = gr_event_key;
- ourevent.key = grKeyEsc;
- eventToProcess = 1;
- hwndGraphic = 0;
- PostQuitMessage ( 0 );
- DeleteObject ( hbm );
- return 0;
-
- case WM_CREATE:
- {
- HDC hDC;
-
- hDC = GetDC ( handle );
- hbm = CreateDIBitmap (
- /* HDC hdc; handle of device context */ hDC,
- /* BITMAPINFOHEADER FAR* lpbmih; addr.of header*/ &pbmi->bmiHeader,
- /* DWORD dwInit; CBM_INIT to initialize bitmap */ 0,
- /* const void FAR* lpvBits; address of values */ NULL,
- /* BITMAPINFO FAR* lpbmi; addr.of bitmap data */ pbmi,
- /* UINT fnColorUse; RGB or palette indices */ DIB_RGB_COLORS);
- ReleaseDC ( handle, hDC );
- break;
- }
-
- case WM_PAINT:
- {
- HDC hDC, memDC;
- HANDLE oldbm;
- PAINTSTRUCT ps;
-
- hDC = BeginPaint ( handle, &ps );
- memDC = CreateCompatibleDC(hDC);
- oldbm = SelectObject(memDC, hbm);
- BitBlt ( hDC, 0, 0, window_width, window_height, memDC, 0, 0, SRCCOPY);
- ReleaseDC ( handle, hDC );
- SelectObject ( memDC, oldbm );
- DeleteObject ( memDC );
- EndPaint ( handle, &ps );
- return 0;
- }
-
- case WM_SYSKEYDOWN:
- {
- int count = sizeof( syskey_translators )/sizeof( syskey_translators[0] );
- Translator* trans = syskey_translators;
- Translator* limit = trans + count;
- for ( ; trans < limit; trans++ )
- if ( wParam == trans->winkey )
- {
- ourevent.key = trans->grkey;
- goto Do_Key_Event;
- }
- return DefWindowProc( handle, mess, wParam, lParam );
- }
-
-
- case WM_KEYDOWN:
- switch ( wParam )
- {
- case VK_ESCAPE:
- ourevent.type = gr_event_key;
- ourevent.key = grKeyEsc;
- eventToProcess = 1;
- PostQuitMessage ( 0 );
- return 0;
-
- default:
- /* lookup list of translated keys */
- {
- int count = sizeof( key_translators )/sizeof( key_translators[0] );
- Translator* trans = key_translators;
- Translator* limit = trans + count;
- for ( ; trans < limit; trans++ )
- if ( wParam == trans->winkey )
- {
- ourevent.key = trans->grkey;
- goto Do_Key_Event;
- }
- }
-
- /* the key isn't found, default processing */
- /* return DefWindowProc( handle, mess, wParam, lParam ); */
- return DefWindowProc( handle, mess, wParam, lParam );
- }
-
- case WM_CHAR:
- {
- ourevent.key = wParam;
-
- Do_Key_Event:
- ourevent.type = gr_event_key;
- eventToProcess = 1;
- }
- break;
-
- default:
- return DefWindowProc( handle, mess, wParam, lParam );
- }
- return 0;
- }
-
- static int init_device( void )
- {
- return 0;
- }
-
- static void done_device( void )
- {
- }
-
- grDevice gr_win32_device =
- {
- sizeof( grSurface ),
- "win32",
-
- init_device,
- done_device,
-
- (grDeviceInitSurfaceFunc) init_surface,
-
- 0,
- 0
- };
-
-
-/* End */
--- a/demos/graph/win32/grwin32.h
+++ /dev/null
@@ -1,23 +1,0 @@
-#ifndef GRWIN32_H
-#define GRWIN32_H
-
-#include "grobjs.h"
-
- extern
- grDevice gr_win32_device;
-
-#ifdef GR_INIT_BUILD
- static
- grDeviceChain gr_win32_device_chain =
- {
- "win32",
- &gr_win32_device,
- GR_INIT_DEVICE_CHAIN
- };
-
-#undef GR_INIT_DEVICE_CHAIN
-#define GR_INIT_DEVICE_CHAIN &gr_win32_device_chain
-
-#endif /* GR_INIT_BUILD */
-
-#endif /* GRWIN32_H */
--- a/demos/graph/win32/rules.mk
+++ /dev/null
@@ -1,52 +1,0 @@
-#**************************************************************************
-#*
-#* Win32 specific rules file, used to compile the Win32 graphics driver
-#* to the graphics subsystem
-#*
-#**************************************************************************
-
-ifeq ($(PLATFORM),win32)
-
-# directory of the Win32 graphics driver
-#
-GR_WIN32 := $(GRAPH_)win32
-GR_WIN32_ := $(GR_WIN32)$(SEP)
-
-# Add the Win32 driver object file to the graphics library "graph.a"
-#
-GRAPH_OBJS += $(OBJ_)grwin32.$O
-
-DEVICES += WIN32
-DEVICE_INCLUDES += $(GR_WIN32)
-
-# the rule used to compile the graphics driver
-#
-$(OBJ_)grwin32.$O: $(GR_WIN32_)grwin32.c $(GR_WIN32_)grwin32.h
- $(CC) $(CFLAGS) $(GRAPH_INCLUDES:%=$I%) $I$(GR_WIN32) $T$@ $<
-
-# Now update COMPILE_GRAPH_LIB according to the compiler used on Win32
-#
-ifeq ($(firstword $(CC)),gcc) # test for GCC
-LINK = $(CC) $T$@ $< $(FTLIB)
-COMMON_LINK = $(LINK) $(COMMON_OBJ)
-GRAPH_LINK = $(COMMON_LINK) $(GRAPH_LIB) -luser32 -lgdi32
-endif
-
-ifeq ($(CC),cl) # test for Visual C++
-COMPILE_GRAPH_LIB = lib /nologo /out:$(GRAPH_LIB) $(GRAPH_OBJS)
-LINK = cl /nologo /MD -o $@ $< $(FTLIB)
-COMMON_LINK = $(LINK) $(COMMON_OBJ)
-GRAPH_LINK = $(COMMON_LINK) $(GRAPH_LIB) user32.lib gdi32.lib
-endif
-
-ifeq ($(CC),lcc) # test for LCC-Win32
-COMPILE_GRAPH_LIB = lcclib /out:$(subst /,\\,$(GRAPH_LIB)) $(subst /,\\,$(GRAPH_OBJS))
-GRAPH_LINK = $(subst /,\\,$(GRAPH_LIB)) user32.lib gdi32.lib
-LINK_ROOT = lcclnk -o $(subst /,\\,$@) $(subst /,\\,$<)
-LINK = $(LINK_ROOT) $(subst /,\\,$(FTLIB))
-COMMON_LINK = $(LINK_ROOT) $(subst /,\\,$(COMMON_OBJ)) $(subst /,\\,$(FTLIB))
-GRAPH_LINK = $(LINK_ROOT) $(subst /,\\,$(COMMON_OBJ)) $(subst /,\\,$(GRAPH_LIB)) $(subst /,\\,$(FTLIB))
-GRAPH_LINK2 = $(GRAPH_LINK) $(subst /,\\,$(EXTRA_GRAPH_OBJS))
-endif
-endif
-
--- a/demos/graph/x11/grx11.c
+++ /dev/null
@@ -1,981 +1,0 @@
-#include "grx11.h"
-
-#define TEST
-
-#ifdef TEST
-#include "grfont.h"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/cursorfont.h>
-#include <X11/keysym.h>
-
- static void Panic( const char* message )
- {
- fprintf( stderr, "%s", message );
- exit(1);
- }
-
- typedef struct Translator
- {
- KeySym xkey;
- grKey grkey;
-
- } Translator;
-
- static
- Translator key_translators[] =
- {
- { XK_BackSpace, grKeyBackSpace },
- { XK_Tab, grKeyTab },
- { XK_Return, grKeyReturn },
- { XK_Escape, grKeyEsc },
- { XK_Home, grKeyHome },
- { XK_Left, grKeyLeft },
- { XK_Up, grKeyUp },
- { XK_Right, grKeyRight },
- { XK_Down, grKeyDown },
- { XK_Page_Up, grKeyPageUp },
- { XK_Page_Down, grKeyPageDown },
- { XK_End, grKeyEnd },
- { XK_Begin, grKeyHome },
- { XK_F1, grKeyF1 },
- { XK_F2, grKeyF2 },
- { XK_F3, grKeyF3 },
- { XK_F4, grKeyF4 },
- { XK_F5, grKeyF5 },
- { XK_F6, grKeyF6 },
- { XK_F7, grKeyF7 },
- { XK_F8, grKeyF8 },
- { XK_F9, grKeyF9 },
- { XK_F10, grKeyF10 },
- { XK_F11, grKeyF11 },
- { XK_F12, grKeyF12 }
- };
-
-
-#ifdef TEST
-
-#define grAlloc malloc
-
-#endif
-
-
- static Display* display;
- static char* displayname = "";
-
- static Cursor idle;
- static Cursor busy;
-
-#define MAX_PIXEL_MODES 32
-
- typedef XPixmapFormatValues XDepth;
-
- static int num_pixel_modes = 0;
- static grPixelMode pixel_modes[ MAX_PIXEL_MODES ];
- static XDepth pixel_depth[ MAX_PIXEL_MODES ];
-
- typedef struct grXSurface_
- {
- grSurface root;
- grBitmap image;
-
- Window win;
- Visual* visual;
- Colormap colormap;
- int depth;
- XDepth* xdepth;
- Bool gray;
-
- GC gc;
-
- XColor color[256]; /* gray levels palette for 8-bit modes */
- XImage* ximage;
-
- int win_org_x;
- int win_org_y;
- int win_width;
- int win_height;
-
- int image_width;
- int image_height;
-
- } grXSurface;
-
-
-
-
- /* close a given window */
- static
- void done_surface( grXSurface* surface )
- {
- XUnmapWindow( display, surface->win );
- }
-
-
-
- /* close the device, i.e. the display connection */
- static
- void done_device( void )
- {
- XCloseDisplay( display );
- }
-
-
-
- static
- void add_pixel_mode( grPixelMode pixel_mode,
- XDepth* depth )
- {
- if ( num_pixel_modes >= MAX_PIXEL_MODES )
- Panic( "X11.Too many pixel modes\n" );
-
- pixel_modes[ num_pixel_modes ] = pixel_mode;
- pixel_depth[ num_pixel_modes ] = *depth;
-
- num_pixel_modes++;
- }
-
-
-
- static
- int init_device( void )
- {
- XDepth dummy;
-
- XrmInitialize();
-
- display = XOpenDisplay( displayname );
- if (!display)
- {
- return -1;
- /* Panic( "Gr:error: cannot open X11 display\n" ); */
- }
-
- idle = XCreateFontCursor( display, XC_left_ptr );
- busy = XCreateFontCursor( display, XC_watch );
-
- num_pixel_modes = 0;
-
- /* always enable the 8-bit gray levels pixel mode */
- /* even if its display is emulated through a constrained palette */
- /* or another color mode */
- dummy.depth = 8;
- dummy.bits_per_pixel = 8;
- dummy.scanline_pad = 8;
- add_pixel_mode( gr_pixel_mode_gray, &dummy );
-
- {
- int count;
- XDepth* format;
- XDepth* formats;
- XVisualInfo template;
-
- formats = XListPixmapFormats( display, &count );
- format = formats;
-
-#ifdef TEST
- printf( "available pixmap formats\n" );
- printf( "depth pixbits scanpad\n" );
-#endif
-
- while ( count-- > 0 )
- {
-#ifdef TEST
- printf( " %3d %3d %3d\n",
- format->depth,
- format->bits_per_pixel,
- format->scanline_pad );
-#endif
-
- if ( format->depth == 1 )
- /* usually, this should be the first format */
- add_pixel_mode( gr_pixel_mode_mono, format );
-
- else if ( format->depth == 8 )
- add_pixel_mode( gr_pixel_mode_pal8, format );
-
- /* note, the 32-bit modes return a depth of 24, and 32 bits per pixel */
- else if ( format->depth == 24 )
- {
-#ifdef TEST
- {
- int count2;
- XVisualInfo* visuals;
- XVisualInfo* visual;
- const char* string = "unknown";
-
- template.depth = format->depth;
- visuals = XGetVisualInfo( display,
- VisualDepthMask,
- &template,
- &count2 );
- visual = visuals;
-
- switch (visual->class)
- {
- case TrueColor: string = "TrueColor"; break;
- case DirectColor: string = "DirectColor"; break;
- case PseudoColor: string = "PseudoColor"; break;
- case StaticGray : string = "StaticGray"; break;
- case StaticColor: string = "StaticColor"; break;
- case GrayScale: string = "GrayScale"; break;
- }
-
- printf( "> RGB %04lx:%04lx:%04lx, colors %3d, bits %2d %s\n",
- visual->red_mask,
- visual->green_mask,
- visual->blue_mask,
- visual->colormap_size,
- visual->bits_per_rgb,
- string );
- visual++;
- }
-#endif
- if ( format->bits_per_pixel == 24 )
- add_pixel_mode( gr_pixel_mode_rgb24, format );
-
- else if ( format->bits_per_pixel == 32 )
- add_pixel_mode( gr_pixel_mode_rgb32, format );
- }
-
- else if ( format->depth == 16 )
- {
- int count2;
- XVisualInfo* visuals;
- XVisualInfo* visual;
-
- template.depth = format->depth;
- visuals = XGetVisualInfo( display,
- VisualDepthMask,
- &template,
- &count2 );
- visual = visuals;
-
- while ( count2-- > 0 )
- {
-#ifdef TEST
- const char* string = "unknown";
-
- switch (visual->class)
- {
- case TrueColor: string = "TrueColor"; break;
- case DirectColor: string = "DirectColor"; break;
- case PseudoColor: string = "PseudoColor"; break;
- case StaticGray : string = "StaticGray"; break;
- case StaticColor: string = "StaticColor"; break;
- case GrayScale: string = "GrayScale"; break;
- }
-
- printf( "> RGB %04lx:%04lx:%04lx, colors %3d, bits %2d %s\n",
- visual->red_mask,
- visual->green_mask,
- visual->blue_mask,
- visual->colormap_size,
- visual->bits_per_rgb,
- string );
-
-#endif
- if ( visual->red_mask == 0xf800 &&
- visual->green_mask == 0x07e0 &&
- visual->blue_mask == 0x001f )
- add_pixel_mode( gr_pixel_mode_rgb565, format );
-
- else if ( visual->red_mask == 0x7c00 &&
- visual->green_mask == 0x03e0 &&
- visual->blue_mask == 0x001f )
- add_pixel_mode( gr_pixel_mode_rgb555, format );
-
- /* other 16-bit modes are ignored */
- visual++;
- }
-
- XFree( visuals );
- }
-
- format++;
- }
-
- XFree( formats );
- }
-
- gr_x11_device.num_pixel_modes = num_pixel_modes;
- gr_x11_device.pixel_modes = pixel_modes;
-
- return 0;
- }
-
-
-
-
-
-
-
- static
- void convert_gray_to_pal8( grXSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- grBitmap* target = &surface->image;
- grBitmap* source = &surface->root.bitmap;
- byte* write = (byte*)target->buffer + y*target->pitch + x;
- byte* read = (byte*)source->buffer + y*source->pitch + x;
- XColor* palette = surface->color;
-
- while (h > 0)
- {
- byte* _write = write;
- byte* _read = read;
- byte* limit = _write + w;
-
- for ( ; _write < limit; _write++, _read++ )
- *_write = (byte) palette[ *_read ].pixel;
-
- write += target->pitch;
- read += source->pitch;
- h--;
- }
- }
-
-
- static
- void convert_gray_to_16( grXSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- grBitmap* target = &surface->image;
- grBitmap* source = &surface->root.bitmap;
- byte* write = (byte*)target->buffer + y*target->pitch + 2*x;
- byte* read = (byte*)source->buffer + y*source->pitch + x;
- XColor* palette = surface->color;
-
- while (h > 0)
- {
- byte* _write = write;
- byte* _read = read;
- byte* limit = _write + 2*w;
-
- for ( ; _write < limit; _write += 2, _read++ )
- *(short*)_write = (short)palette[ *_read ].pixel;
-
- write += target->pitch;
- read += source->pitch;
- h--;
- }
- }
-
-
- static
- void convert_gray_to_24( grXSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- grBitmap* target = &surface->image;
- grBitmap* source = &surface->root.bitmap;
- byte* write = (byte*)target->buffer + y*target->pitch + 3*x;
- byte* read = (byte*)source->buffer + y*source->pitch + x;
-
- while (h > 0)
- {
- byte* _write = write;
- byte* _read = read;
- byte* limit = _write + 3*w;
-
- for ( ; _write < limit; _write += 3, _read++ )
- {
- XColor* color = surface->color + *_read;
-
- _write[0] = color->red;
- _write[1] = color->green;
- _write[2] = color->blue;
- }
-
- write += target->pitch;
- read += source->pitch;
- h--;
- }
- }
-
-
- static
- void convert_gray_to_32( grXSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- grBitmap* target = &surface->image;
- grBitmap* source = &surface->root.bitmap;
- byte* write = (byte*)target->buffer + y*target->pitch + 4*x;
- byte* read = (byte*)source->buffer + y*source->pitch + x;
-
- while (h > 0)
- {
- byte* _write = write;
- byte* _read = read;
- byte* limit = _write + 4*w;
-
- if (sizeof(long) > 4)
- {
- for ( ; _write < limit; _write += 4, _read++ )
- {
- byte color = *_read;
-
- *(unsigned int*)_write = surface->color[color].pixel;
- }
- }
- else
- {
- for ( ; _write < limit; _write += 4, _read++ )
- {
- byte color = *_read;
-
- *(unsigned long*)_write = surface->color[color].pixel;
- }
- }
-
- write += target->pitch;
- read += source->pitch;
- h--;
- }
- }
-
-
- static
- void convert_rectangle( grXSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- int z;
-
- /* first of all, clip to the surface's area */
- if ( x >= surface->image.width ||
- x+w <= 0 ||
- y >= surface->image.rows ||
- y+h <= 0 )
- return;
-
- if ( x < 0 )
- {
- w += x;
- x = 0;
- }
-
- z = (x + w) - surface->image.width;
- if (z > 0)
- w -= z;
-
- z = (y + h) - surface->image.rows;
- if (z > 0)
- h -= z;
-
- /* convert the rectangle to the target depth for gray surfaces */
- if (surface->gray)
- {
- switch (surface->xdepth->bits_per_pixel)
- {
- case 8 : convert_gray_to_pal8( surface, x, y, w, h ); break;
- case 16: convert_gray_to_16 ( surface, x, y, w, h ); break;
- case 24: convert_gray_to_24 ( surface, x, y, w, h ); break;
- case 32: convert_gray_to_32 ( surface, x, y, w, h ); break;
- }
- }
- }
-
-
- static
- void refresh_rectangle( grXSurface* surface,
- int x,
- int y,
- int w,
- int h )
- {
- if (surface->gray)
- convert_rectangle( surface, x, y, w, h );
-
- XPutImage( display,
- surface->win,
- surface->gc,
- surface->ximage,
- x, y, x, y, w, h );
- }
-
-
- static
- void set_title( grXSurface* surface,
- const char* title )
- {
- XStoreName( display, surface->win, title );
- }
-
-
-
- static
- grKey KeySymTogrKey( KeySym key )
- {
- grKey k;
- int count = sizeof(key_translators)/sizeof(key_translators[0]);
- Translator* trans = key_translators;
- Translator* limit = trans + count;
-
- k = grKeyNone;
-
- while ( trans < limit )
- {
- if ( trans->xkey == key )
- {
- k = trans->grkey;
- break;
- }
- trans++;
- }
-
- return k;
- }
-
-
-
- static
- void listen_event( grXSurface* surface,
- int event_mask,
- grEvent* grevent )
- {
- static char key_buffer[10];
- static int key_cursor = 0;
- static int key_number = 0;
- static XEvent x_event;
- KeySym key;
-
- int bool_exit;
- grKey grkey;
-
- XComposeStatus compose;
-
- /* XXXX : For now, ignore the event mask, and only exit when */
- /* a key is pressed.. */
- (void)event_mask;
-
- bool_exit = key_cursor < key_number;
-
- XDefineCursor( display, surface->win, idle );
-
- while ( !bool_exit )
- {
- XNextEvent( display, &x_event );
-
- switch ( x_event.type )
- {
- case KeyPress:
- key_number = XLookupString( &x_event.xkey,
- key_buffer,
- sizeof ( key_buffer ),
- &key,
- &compose );
- key_cursor = 0;
-
- if ( key_number == 0 ||
- key > 512 )
- {
- /* this may be a special key like F1, F2, etc.. */
- grkey = KeySymTogrKey(key);
- if (grkey != grKeyNone)
- goto Set_Key;
- }
- else
- bool_exit = 1;
- break;
-
- case MappingNotify:
- XRefreshKeyboardMapping( &x_event.xmapping );
- break;
-
- case Expose:
- refresh_rectangle( surface,
- x_event.xexpose.x,
- x_event.xexpose.y,
- x_event.xexpose.width,
- x_event.xexpose.height );
- break;
-
- /* You should add more cases to handle mouse events, etc. */
- }
- }
-
- XDefineCursor( display, surface->win, busy );
- XFlush ( display );
-
- /* Now, translate the keypress to a grKey */
- /* If this wasn't part of the simple translated keys, simply get the charcode */
- /* from the character buffer */
- grkey = grKEY(key_buffer[key_cursor++]);
-
- Set_Key:
- grevent->type = gr_key_down;
- grevent->key = grkey;
- }
-
-
-
-
- grXSurface* init_surface( grXSurface* surface,
- grBitmap* bitmap )
- {
- int screen;
- grBitmap* image;
- char grays;
- XDepth* format;
- int image_depth;
-
- screen = DefaultScreen( display );
-
- surface->colormap = DefaultColormap( display, screen );
- surface->depth = DefaultDepth( display, screen );
- surface->visual = DefaultVisual( display, screen );
-
- image = &surface->image;
-
- /* force the surface image depth to 1 if necessary */
- /* as this should be supported by all windows */
- image_depth = surface->depth;
- if (bitmap->mode == gr_pixel_mode_mono)
- image_depth = 1;
-
- grays = ( bitmap->mode == gr_pixel_mode_gray &&
- bitmap->grays >= 2 );
-
- surface->gray = grays;
-
- /* copy dimensions */
- image->width = bitmap->width;
- image->rows = bitmap->rows;
- image->mode = bitmap->mode;
- image->pitch = 0;
- image->grays = 0;
- image->buffer = 0;
-
- /* find the supported format corresponding to the request */
- format = 0;
-
- if (grays)
- {
- /* choose the default depth in case of grays rendering */
- int i;
- for ( i = 0; i < num_pixel_modes; i++ )
- if ( image_depth == pixel_depth[i].depth )
- {
- format = pixel_depth + i;
- surface->xdepth = format;
- break;
- }
- }
- else
- {
- /* otherwise, select the format depending on the pixel mode */
- int i;
-
- format = 0;
- for ( i = 0; i < num_pixel_modes; i++ )
- if ( pixel_modes[i] == bitmap->mode )
- {
- format = pixel_depth + i;
- surface->xdepth = format;
- break;
- }
- }
-
- if (!format)
- {
- grError = gr_err_bad_argument;
- return 0;
- }
-
-
- /* correct surface.depth. This is required because in the case */
- /* of 32-bits pixels, the value of "format.depth" is 24 under X11 */
- if ( format->depth == 24 &&
- format->bits_per_pixel == 32 )
- image_depth = 32;
-
- /* allocate surface image */
- {
- int bits, over;
-
- bits = image->width * format->bits_per_pixel;
- over = bits % format->scanline_pad;
-
- if (over)
- bits += format->scanline_pad - over;
-
- if (!grays)
- {
- image->width = bits;
- bitmap->width = bits;
- }
- image->pitch = bits >> 3;
- }
-
- image->buffer = grAlloc( image->pitch * image->rows );
- if (!image->buffer) return 0;
-
- /* now, allocate a gray pal8 pixmap, only when we asked */
- /* for an 8-bit pixmap */
- if ( grays )
- {
- /* pad pitch to 32 bits */
- bitmap->pitch = (bitmap->width + 3) & -4;
- bitmap->buffer = grAlloc( bitmap->pitch * bitmap->rows );
- if (!bitmap->buffer)
- Panic( "grX11: could not allocate surface bitmap!\n" );
- }
- else /* otherwise */
- {
- *bitmap = *image;
- }
-
- surface->root.bitmap = *bitmap;
-
- /* Now create the surface X11 image */
- surface->ximage = XCreateImage( display,
- surface->visual,
- format->depth,
- format->depth == 1 ? XYBitmap : ZPixmap,
- 0,
- (char*)image->buffer,
- image->width,
- image->rows,
- 8,
- 0 );
- if ( !surface->ximage )
- Panic( "grX11: cannot create surface X11 image\n" );
-
-
- /* allocate gray levels in the case of gray surface */
- if ( grays )
- {
- XColor* color = surface->color;
- int i;
-
- for ( i = 0; i < bitmap->grays; i++, color++ )
- {
- color->red =
- color->green =
- color->blue = 65535 - ( i * 65535 ) / bitmap->grays;
-
- if ( !XAllocColor( display, surface->colormap, color ) )
- Panic( "ERROR: cannot allocate Color\n" );
- }
- }
- else if ( image_depth == 1 )
- {
- surface->ximage->byte_order = MSBFirst;
- surface->ximage->bitmap_bit_order = MSBFirst;
- }
-
- {
- XTextProperty xtp;
- XSizeHints xsh;
- XSetWindowAttributes xswa;
-
- xswa.border_pixel = BlackPixel( display, screen );
- xswa.background_pixel = WhitePixel( display, screen );
- xswa.cursor = busy;
-
- xswa.event_mask = KeyPressMask | ExposureMask;
-
- surface->win = XCreateWindow( display,
- RootWindow( display, screen ),
- 0,
- 0,
- image->width,
- image->rows,
- 10,
- surface->depth,
- InputOutput,
- surface->visual,
- CWBackPixel | CWBorderPixel |
- CWEventMask | CWCursor,
- &xswa );
-
- XMapWindow( display, surface->win );
-
- surface->gc = XCreateGC( display, RootWindow( display, screen ), 0L, NULL );
- XSetForeground( display, surface->gc, xswa.border_pixel );
- XSetBackground( display, surface->gc, xswa.background_pixel );
-
-
- /* make window manager happy :-) */
- xtp.value = (unsigned char*)"FreeType";
- xtp.encoding = 31;
- xtp.format = 8;
- xtp.nitems = strlen( (char*)xtp.value );
-
- xsh.x = 0;
- xsh.y = 0;
-
- xsh.width = image->width;
- xsh.height = image->rows;
- xsh.flags = (PPosition | PSize);
- xsh.flags = 0;
-
- XSetWMProperties( display, surface->win, &xtp, &xtp, NULL, 0, &xsh, NULL, NULL );
- }
-
- surface->root.done = (grDoneSurfaceFunc) done_surface;
- surface->root.refresh_rect = (grRefreshRectFunc) refresh_rectangle;
- surface->root.set_title = (grSetTitleFunc) set_title;
- surface->root.listen_event = (grListenEventFunc) listen_event;
-
- convert_rectangle( surface, 0, 0, bitmap->width, bitmap->rows );
- return surface;
- }
-
-
-
-
- grDevice gr_x11_device =
- {
- sizeof( grXSurface ),
- "x11",
-
- init_device,
- done_device,
-
- (grDeviceInitSurfaceFunc) init_surface,
-
- 0,
- 0
-
- };
-
-#ifdef TEST
-
-typedef struct grKeyName
-{
- grKey key;
- const char* name;
-
-} grKeyName;
-
-
-static
-const grKeyName key_names[] =
-{
- { grKeyF1, "F1" },
- { grKeyF2, "F2" },
- { grKeyF3, "F3" },
- { grKeyF4, "F4" },
- { grKeyF5, "F5" },
- { grKeyF6, "F6" },
- { grKeyF7, "F7" },
- { grKeyF8, "F8" },
- { grKeyF9, "F9" },
- { grKeyF10, "F10" },
- { grKeyF11, "F11" },
- { grKeyF12, "F12" },
- { grKeyEsc, "Esc" },
- { grKeyHome, "Home" },
- { grKeyEnd, "End" },
-
- { grKeyPageUp, "Page_Up" },
- { grKeyPageDown, "Page_Down" },
- { grKeyLeft, "Left" },
- { grKeyRight, "Right" },
- { grKeyUp, "Up" },
- { grKeyDown, "Down" },
- { grKeyBackSpace, "BackSpace" },
- { grKeyReturn, "Return" }
-};
-
-#if 0
-int main( void )
-{
- grSurface* surface;
- int n;
-
- grInit();
- surface = grNewScreenSurface( 0, gr_pixel_mode_gray, 320, 400, 128 );
- if (!surface)
- Panic("Could not create window\n" );
- else
- {
- grColor color;
- grEvent event;
- const char* string;
- int x;
-
- grSetSurfaceRefresh( surface, 1 );
- grSetTitle(surface,"X11 driver demonstration" );
-
- for ( x = -10; x < 10; x++ )
- {
- for ( n = 0; n < 128; n++ )
- {
- color.value = (n*3) & 127;
- grWriteCellChar( surface,
- x + ((n % 60) << 3),
- 80 + (x+10)*8*3 + ((n/60) << 3), n, color );
- }
-
- }
- color.value = 64;
- grWriteCellString( surface, 0, 0, "just an example", color );
-
- do
- {
- listen_event((grXSurface*)surface, 0, &event);
-
- /* return if ESC was pressed */
- if ( event.key == grKeyEsc )
- return 0;
-
- /* otherwise, display key string */
- color.value = (color.value + 8) & 127;
- {
- int count = sizeof(key_names)/sizeof(key_names[0]);
- grKeyName* name = key_names;
- grKeyName* limit = name + count;
- const char* kname = 0;
- char kname_temp[16];
-
- while (name < limit)
- {
- if ( name->key == event.key )
- {
- kname = name->name;
- break;
- }
- name++;
- }
-
- if (!kname)
- {
- sprintf( kname_temp, "char '%c'", (char)event.key );
- kname = kname_temp;
- }
-
- grWriteCellString( surface, 30, 30, kname, color );
- grRefreshSurface(surface);
- paint_rectangle( surface, 0, 0, surface->bitmap.width, surface->bitmap.rows );
- }
- } while (1);
- }
-
- return 0;
-
-
-}
-#endif /* O */
-#endif /* TEST */
-
--- a/demos/graph/x11/grx11.h
+++ /dev/null
@@ -1,24 +1,0 @@
-#ifndef GRX11_H
-#define GRX11_H
-
-#include "grobjs.h"
-#include "grdevice.h"
-
- extern
- grDevice gr_x11_device;
-
-#ifdef GR_INIT_BUILD
- static
- grDeviceChain gr_x11_device_chain =
- {
- "x11",
- &gr_x11_device,
- GR_INIT_DEVICE_CHAIN
- };
-
-#undef GR_INIT_DEVICE_CHAIN
-#define GR_INIT_DEVICE_CHAIN &gr_x11_device_chain
-
-#endif /* GR_INIT_BUILD */
-
-#endif /* GRX11_H */
--- a/demos/graph/x11/rules.mk
+++ /dev/null
@@ -1,88 +1,0 @@
-#**************************************************************************
-#*
-#* X11-specific rules files, used to compile the X11 graphics driver
-#* when supported by the current platform
-#*
-#**************************************************************************
-
-#########################################################################
-#
-# Try to detect an X11 setup.
-#
-# We try to detect the following directories (in that order) in the current
-# path:
-#
-# X11 (usually a symlink to the current release)
-# X11R6
-# X11R5
-#
-# If the variable X11_PATH is set (to specify unusual locations of X11), no
-# other directory is searched. More than one directory must be separated
-# with spaces. Example:
-#
-# make X11_PATH="/usr/openwin /usr/local/X11R6"
-#
-ifndef X11_PATH
- ifneq ($(findstring X11$(SEP)bin,$(PATH)),)
- xversion := X11
- else
- ifneq ($(findstring X11R6$(SEP)bin,$(PATH)),)
- xversion := X11R6
- else
- ifneq ($(findstring X11R5$(SEP)bin,$(PATH)),)
- xversion := X11R5
- endif
- endif
- endif
-
- ifdef xversion
- X11_PATH := $(subst ;, ,$(PATH)) $(subst :, ,$(PATH))
- X11_PATH := $(filter %$(xversion)$(SEP)bin,$(X11_PATH))
- X11_PATH := $(X11_PATH:%$(SEP)bin=%)
- endif
-endif
-
-##########################################################################
-#
-# Update some variables to compile the X11 graphics module. Note that
-# X11 is available on Unix, or on OS/2. However, it only compiles with
-# gcc on the latter platform, which is why it is safe to use the flags
-# `-L' and `-l' in GRAPH_LINK
-#
-ifneq ($(X11_PATH),)
-
- X11_INCLUDE := $(X11_PATH:%=%$(SEP)include)
- X11_LIB := $(X11_PATH:%=%$(SEP)lib)
-
- # the GRAPH_LINK variable is expanded each time an executable is linked
- # against the graphics library.
- #
- GRAPH_LINK += $(X11_LIB:%=-L%) -lX11
-
- # Solaris needs a -lsocket in GRAPH_LINK ..
- #
- UNAME := $(shell uname)
- ifneq ($(findstring $(UNAME),SunOS Solaris),)
- GRAPH_LINK += -lsocket
- endif
-
-
- # add the X11 driver object file to the graphics library
- #
- GRAPH_OBJS += $(OBJ_)grx11.$O
-
-
- GR_X11 := $(GRAPH_)x11
- GR_X11_ := $(GR_X11)$(SEP)
-
- DEVICES += X11
- DEVICE_INCLUDES += $(GR_X11)
-
- # the rule used to compile the X11 driver
- #
- $(OBJ_)grx11.$O: $(GR_X11_)grx11.c $(GR_X11_)grx11.h
- $(CC) $(CFLAGS) $(GRAPH_INCLUDES:%=$I%) $I$(GR_X11) \
- $(X11_INCLUDE:%=$I%) $T$@ $<
-endif
-
-# EOF
--- a/demos/graph/xtest.c
+++ /dev/null
@@ -1,125 +1,0 @@
-#include "graph.h"
-#include "grfont.h" /* dispara^itra bientot */
-#include <stdio.h>
-
-
-static
-void Panic( const char* message )
-{
- fprintf( stderr, "PANIC: %s\n", message );
- exit(1);
-}
-
-
-typedef struct grKeyName
-{
- grKey key;
- const char* name;
-
-} grKeyName;
-
-
-static
-const grKeyName key_names[] =
-{
- { grKeyF1, "F1" },
- { grKeyF2, "F2" },
- { grKeyF3, "F3" },
- { grKeyF4, "F4" },
- { grKeyF5, "F5" },
- { grKeyF6, "F6" },
- { grKeyF7, "F7" },
- { grKeyF8, "F8" },
- { grKeyF9, "F9" },
- { grKeyF10, "F10" },
- { grKeyF11, "F11" },
- { grKeyF12, "F12" },
- { grKeyEsc, "Esc" },
- { grKeyHome, "Home" },
- { grKeyEnd, "End" },
-
- { grKeyPageUp, "Page_Up" },
- { grKeyPageDown, "Page_Down" },
- { grKeyLeft, "Left" },
- { grKeyRight, "Right" },
- { grKeyUp, "Up" },
- { grKeyDown, "Down" },
- { grKeyBackSpace, "BackSpace" },
- { grKeyReturn, "Return" }
-};
-
-int main( void )
-{
- grSurface* surface;
- int n;
-
- grInit();
- surface = grNewScreenSurface( 0, gr_pixel_mode_gray, 320, 400, 128 );
- if (!surface)
- Panic("Could not create window\n" );
- else
- {
- grColor color;
- grEvent event;
- const char* string;
- int x;
-
- grSetSurfaceRefresh( surface, 1 );
- grSetTitle(surface,"X11 driver demonstration" );
-
- for ( x = -10; x < 10; x++ )
- {
- for ( n = 0; n < 128; n++ )
- {
- color.value = (n*3) & 127;
- grWriteCellChar( surface,
- x + ((n % 60) << 3),
- 80 + (x+10)*8*3 + ((n/60) << 3), n, color );
- }
-
- }
- color.value = 64;
- grWriteCellString( surface, 0, 0, "just an example", color );
-
- do
- {
- grListenSurface( surface, 0, &event);
-
- /* return if ESC was pressed */
- if ( event.key == grKeyEsc )
- return 0;
-
- /* otherwise, display key string */
- color.value = (color.value + 8) & 127;
- {
- int count = sizeof(key_names)/sizeof(key_names[0]);
- grKeyName* name = (grKeyName*)key_names;
- grKeyName* limit = name + count;
- const char* kname = 0;
- char kname_temp[16];
-
- while (name < limit)
- {
- if ( name->key == event.key )
- {
- kname = (const char*)name->name;
- break;
- }
- name++;
- }
-
- if (!kname)
- {
- sprintf( kname_temp, "char '%c'", (char)event.key );
- kname = kname_temp;
- }
-
- grWriteCellString( surface, 30, 30, kname, color );
- grRefreshSurface(surface);
- }
- } while (1);
- }
-
- return 0;
-}
-
--- a/demos/mac/README
+++ /dev/null
@@ -1,22 +1,0 @@
-This folder contains supporting code and CodeWarrior Pro 4 project
-files to build the FreeType demo programs ftlint and ftview for MacOS.
-
-Building
-To build these apps, you'll first need to build the FreeType library
-(see config/mac). The applications get built in the demos/bin folder.
-
-Notes
-Since the Mac doesn't have the notion of argc/argv, we'll emulate
-this: each file dropped onto the application will be translated
-to a command line argument. Both ftlint and ftview take a ppem
-value as their first command line argument: for the Mac version
-this has been hard-coded into the source. Also: the additional
-options for ftview cannot be set.
-
-Have fun with FreeType on the Mac!
-
-Just van Rossum, <[email protected]>
-
-DISCLAIMER: this subdirectory is *not* being maintained by the
-FreeType team, but by Just van Rossum. It's being released under
-the same terms as FreeType (see license.txt).
binary files a/demos/mac/codewarrior/ftlint.prj /dev/null differ
binary files a/demos/mac/codewarrior/ftview.prj /dev/null differ
--- a/demos/mac/ftlint_m.c
+++ /dev/null
@@ -1,59 +1,0 @@
-/* minimal Mac wrapper for the ftlint.c program */
-
-
-int original_main( int argc, char** argv );
-
-/* We rename the original main() program to original_main,
- so we can provide a wrapper around it */
-#define main original_main
-#include "ftlint.c"
-#undef main
-
-
-#define PPEM "24" /* hard-code the ppem size */
-
-
-#include <SIOUX.h>
-#include "getargv.h"
-#include <Windows.h>
-#include <Dialogs.h>
-#include <Fonts.h>
-#include <TextEdit.h>
-
-static void
-init_toolbox()
-{
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- TEInit();
- InitDialogs((long)0);
- InitMenus();
- InitCursor();
- SIOUXSettings.asktosaveonclose = 0;
-}
-
-int main()
-{
- int argc, i;
- char** argv;
-
- init_toolbox();
-
- /* put paths of all files dropped onto the app into argv */
- argc = FTMac_GetArgv(&argv);
- if (argc < 2)
- {
- printf("Please drop one or more font files onto the app (but quit first!)\n");
- exit(1);
- }
- /* move argv[1:] to argv[2:] and fill in the ppem arg */
- for (i = argc; i > 1; i--)
- {
- argv[i] = argv[i-1];
- }
- argc++;
- argv[1] = PPEM;
- /* call the original main() program */
- original_main(argc, argv);
-}
--- a/demos/mac/ftview_m.c
+++ /dev/null
@@ -1,59 +1,0 @@
-/* minimal Mac wrapper for the ftview.c program */
-
-
-int original_main( int argc, char** argv );
-
-/* We rename the original main() program to original_main,
- so we can provide a wrapper around it */
-#define main original_main
-#include "ftview.c"
-#undef main
-
-
-#define PPEM "24" /* hard-code the ppem size */
-
-
-#include <SIOUX.h>
-#include "getargv.h"
-#include <Windows.h>
-#include <Dialogs.h>
-#include <Fonts.h>
-#include <TextEdit.h>
-
-static void
-init_toolbox()
-{
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- TEInit();
- InitDialogs((long)0);
- InitMenus();
- InitCursor();
- SIOUXSettings.asktosaveonclose = 0;
-}
-
-int main()
-{
- int argc, i;
- char** argv;
-
- init_toolbox();
-
- /* put paths of all files dropped onto the app into argv */
- argc = FTMac_GetArgv(&argv);
- if (argc < 2)
- {
- printf("Please drop one or more font files onto the app (but quit first!)\n");
- exit(1);
- }
- /* move argv[1:] to argv[2:] and fill in the ppem arg */
- for (i = argc; i > 1; i--)
- {
- argv[i] = argv[i-1];
- }
- argc++;
- argv[1] = PPEM;
- /* call the original main() program */
- original_main(argc, argv);
-}
--- a/demos/mac/getargv.c
+++ /dev/null
@@ -1,312 +1,0 @@
-/***********************************************************
-Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
-The Netherlands.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-/* Construct argc and argv for main() by using Apple Events */
-/* From Jack's implementation for STDWIN */
-
-/* Modified for use with FreeType from MacPython's macgetargv.c
- by Just van Rossum <[email protected]> */
-
-#include <stdlib.h>
-#include <string.h>
-#include "getargv.h"
-
-#include <Types.h>
-#include <Files.h>
-#include <Events.h>
-#include <Processes.h>
-#include <Errors.h>
-#include <AppleEvents.h>
-#include <AEObjects.h>
-
-#ifdef GENERATINGCFM /* Defined to 0 or 1 in Universal headers */
-#define HAVE_UNIVERSAL_HEADERS
-#endif
-
-#ifndef HAVE_UNIVERSAL_HEADERS
-#define NewAEEventHandlerProc(x) (x)
-#define AEEventHandlerUPP EventHandlerProcPtr
-#endif
-
-static int arg_count;
-static char *arg_vector[256];
-static char app_name[256];
-static int app_name_inited;
-
-
-/* Duplicate a string to the heap. */
-
-static char *
-strdup(char *src)
-{
- char *dst = malloc(strlen(src) + 1);
- if (dst)
- strcpy(dst, src);
- return dst;
-}
-
-
-/* Given an FSSpec, return the FSSpec of the parent folder */
-
-static OSErr
-get_folder_parent (FSSpec * fss, FSSpec * parent)
-{
- CInfoPBRec rec;
- short err;
-
- * parent = * fss;
- rec.hFileInfo.ioNamePtr = parent->name;
- rec.hFileInfo.ioVRefNum = parent->vRefNum;
- rec.hFileInfo.ioDirID = parent->parID;
- rec.hFileInfo.ioFDirIndex = -1;
- rec.hFileInfo.ioFVersNum = 0;
- if (err = PBGetCatInfoSync (& rec))
- return err;
- parent->parID = rec.dirInfo.ioDrParID;
-/* parent->name[0] = 0; */
- return 0;
-}
-
-
-/* Given an FSSpec return a full, colon-separated pathname */
-
-static OSErr
-FTMac_GetFullPath (FSSpec *fss, char *buf)
-{
- short err;
- FSSpec fss_parent, fss_current;
- char tmpbuf[256];
- int plen;
-
- fss_current = *fss;
- plen = fss_current.name[0];
- memcpy(buf, &fss_current.name[1], plen);
- buf[plen] = 0;
- /* Special case for disk names */
- if ( fss_current.parID <= 1 ) {
- buf[plen++] = ':';
- buf[plen] = 0;
- return 0;
- }
- while (fss_current.parID > 1) {
- /* Get parent folder name */
- if (err = get_folder_parent(&fss_current, &fss_parent))
- return err;
- fss_current = fss_parent;
- /* Prepend path component just found to buf */
- plen = fss_current.name[0];
- if (strlen(buf) + plen + 1 > 256) {
- /* Oops... Not enough space (shouldn't happen) */
- *buf = 0;
- return -1;
- }
- memcpy(tmpbuf, &fss_current.name[1], plen);
- tmpbuf[plen] = ':';
- strcpy(&tmpbuf[plen+1], buf);
- strcpy(buf, tmpbuf);
- }
- return 0;
-}
-
-
-/* Initialize name of current application */
-
-static OSErr
-init_app_name()
-{
- ProcessSerialNumber currentPSN;
- ProcessInfoRec info;
- OSErr err;
- FSSpec appSpec;
-
- if ( app_name_inited ) return 0;
- currentPSN.highLongOfPSN = 0;
- currentPSN.lowLongOfPSN = kCurrentProcess;
- info.processInfoLength = sizeof(ProcessInfoRec);
- info.processName = NULL;
- info.processAppSpec = &appSpec;
- if ( err=GetProcessInformation(¤tPSN, &info))
- return err;
- strncpy(app_name, (char*)appSpec.name + 1, appSpec.name[0]);
- app_name[appSpec.name[0]] = '\0';
- app_name_inited = 1;
- return 0;
-}
-
-
-/* Check that there aren't any args remaining in the event */
-
-static OSErr
-get_missing_params(AppleEvent *theAppleEvent)
-{
- DescType theType;
- Size actualSize;
- OSErr err;
-
- err = AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard,
- &theType, nil, 0, &actualSize);
- if (err == errAEDescNotFound)
- return noErr;
- else
- return errAEEventNotHandled;
-}
-
-static int got_one; /* Flag that we can stop getting events */
-
-
-/* Handle the Print or Quit events (by failing) */
-
-static pascal OSErr
-handle_not(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon)
-{
- #pragma unused (reply, refCon)
- got_one = 1;
- return errAEEventNotHandled;
-}
-
-
-/* Handle the Open Application event (by ignoring it) */
-
-static pascal OSErr
-handle_open_app(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon)
-{
- #pragma unused (reply, refCon)
-#if 0
- /* Test by Jack: would removing this facilitate debugging? */
- got_one = 1;
-#endif
- return get_missing_params(theAppleEvent);
-}
-
-
-/* Handle the Open Document event, by adding an argument */
-
-static pascal OSErr
-handle_open_doc(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon)
-{
- #pragma unused (reply, refCon)
- OSErr err;
- AEDescList doclist;
- AEKeyword keywd;
- DescType rttype;
- long i, ndocs, size;
- FSSpec fss;
- char path[256];
-
- got_one = 1;
- if (err = AEGetParamDesc(theAppleEvent,
- keyDirectObject, typeAEList, &doclist))
- return err;
- if (err = get_missing_params(theAppleEvent))
- return err;
- if (err = AECountItems(&doclist, &ndocs))
- return err;
- for(i = 1; i <= ndocs; i++) {
- err = AEGetNthPtr(&doclist, i, typeFSS,
- &keywd, &rttype, &fss, sizeof(fss), &size);
- if (err)
- break;
- FTMac_GetFullPath(&fss, path);
- arg_vector[arg_count++] = strdup(path);
- }
- return err;
-}
-
-
-/* Install standard core event handlers */
-static AEEventHandlerUPP open_doc_upp;
-static AEEventHandlerUPP open_app_upp;
-static AEEventHandlerUPP not_upp;
-
-static void
-set_ae_handlers()
-{
- open_doc_upp = NewAEEventHandlerProc(handle_open_doc);
- open_app_upp = NewAEEventHandlerProc(handle_open_app);
- not_upp = NewAEEventHandlerProc(handle_not);
-
- AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
- open_app_upp, 0L, false);
- AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
- open_doc_upp, 0L, false);
- AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
- not_upp, 0L, false);
- AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
- not_upp, 0L, false);
-}
-
-/* Uninstall standard core event handlers */
-
-static void
-reset_ae_handlers()
-{
- AERemoveEventHandler(kCoreEventClass, kAEOpenApplication,
- open_app_upp, false);
- AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments,
- open_doc_upp, false);
- AERemoveEventHandler(kCoreEventClass, kAEPrintDocuments,
- not_upp, false);
- AERemoveEventHandler(kCoreEventClass, kAEQuitApplication,
- not_upp, false);
-}
-
-/* Wait for events until a core event has been handled */
-
-static void
-event_loop()
-{
- EventRecord event;
- int n;
- int ok;
-
- got_one = 0;
- for (n = 0; n < 100 && !got_one; n++) {
- SystemTask();
- ok = GetNextEvent(everyEvent, &event);
- if (ok && event.what == kHighLevelEvent) {
- AEProcessAppleEvent(&event);
- }
- }
-}
-
-/* Get the argv vector, return argc. See macgetargv.h for more doco. */
-
-int
-FTMac_GetArgv(pargv)
- char ***pargv;
-{
-
- arg_count = 0;
- (void)init_app_name();
- arg_vector[arg_count++] = strdup(app_name);
-
- set_ae_handlers();
- event_loop();
- reset_ae_handlers();
-
- arg_vector[arg_count] = NULL;
-
- *pargv = arg_vector;
- return arg_count;
-}
--- a/demos/mac/getargv.h
+++ /dev/null
@@ -1,19 +1,0 @@
-/*
- <Function>
- FTMac_GetArgv
-
- <Description>
- argc/argv emulation for the Mac. Converts files dropped
- onto the application to full paths, and stuff them into
- argv.
-
- <Output>
- pargv :: a pointer to an argv array. The array doesn't need to
- exist before calling this function.
-
- <Return>
- The number of files dropped onto the app (ie. argc)
-*/
-
-int FTMac_GetArgv(char ***pargv);
-
--- a/demos/mac/resource.hqx
+++ /dev/null
@@ -1,38 +1,0 @@
-(This file must be converted with BinHex 4.0)
-:$(*PFfpeFQ0P,R0TG!"6594%8dP8)3%!!!!'[!!!!!!REP0*9#%!!J!!"Vab6'&
-e!RX!!!!@EhX0!!YQG'aTER3ZFR0bB`K"ST!!!%9qHJ!!!)!!!!!!#%PXcPl2#BB
-!!!!!!!!!!!!!!!!!!!!!!!!"R`!!!!$rrrrrFR0bBe*6483"!,6HlZHdhZmk!!!
-"Q3!!!!!!!!%C!!!!!"2I!!!!!!!!!!#2I4%!#"`XG3MLeZTM1d$2c[ec0aXql5S
-ShPIL[&U,h14S@fT@KjEj-dK+IjNHBG)R-N9+9!`J2MP%TSHT%#Nd-qT*elC3-#N
-4JA)Hkc6qlRVSqDHb&A*3a9&1cdmjhEbBUHN9ad&X+`E&1ceI!Y68j0ki6qFA)(r
-b,FRGeI4f6k%5&4RNVXbJD-emb41U6CZldibq,@I[0+0[hAC1Pd8qb1GJMXlkGX[
-Qi$6*5FhCV+hMcp9GjDB!CG6%FFi-Y%hSD+RR#(40DQ1''@VI1VRml-&F9CdAA5b
-'mAYaP!drhR!2h3*kJDG9FQ)R4mZIfD4`CM-&4Q9IJU0XbMdc06QfE,r!c)B,BXZ
-5lI0h(XbS`)*QmLcRP#B"!!!!$3!,CR4fD@9h,R*cFQ-)3D+3!!"&IRS!!!#!!!!
-!!!K*E-kIZJQ'!!!!!!!!!!!!!!!!!!!!&J!!!!!!!!!!rrrrrh*cFQ058d9%!3#
-dhZlRY0pi`J!!#Fd!!!!!!!!%V3!!!!#NcJ!!!!!!!!!!i8X,3,6cZVA1c0lNY)[
-f+j[)D@pq&ff8&[hml++YG5DRR()cQTfYCHr*j#YEf5Jc%CLIXrbFjqFX2cmr2dr
-ZTpFJfU$ca31a!b+85iiI35I(Bq'a#e!!VJ6J!#F!VSd!Nr('42m&cC%BQfS+kII
-X%,b5(HDLA-XlBDbP"ISMY'LUSfGRDkm!HhGl5NUk05!P)laE*h[lM)b!S+!8DhG
-VJA4q'GFk-X)*HFCMl1QrCp29l+`h+kl(I3FBqcaJl-h0E-YliEX#cZ%fH-9NHb2
-[J5A*h#if"qk@8jD%["I4@8lH[MDBr'c`$(5cE+ral1fF[*0$mqINR4`FEH`P-!"
-ZaYZ$[j86fKM'6M`k&3TTDRc[bEfDM@PAb0Zc`KL$6e6mrPk'RD,L)U0H$fC!XbD
-@b[N$+ecGH0iXmEpL-Vhq#F#BEGiV"UHAIc%8q2X*3m(RMaLFRfBcZ16HC5Mdq$C
-$iBFh'%`j9aPFlepL+(,[2%241fFBh,*1-"5lGC6"rHBKKZ,Apc&iA0[&81,+GSD
-5PlF`P,UiJF(c`PU'dZG@-ALGAFE`cZP&$0iRjc'816k,SHbaD3c[(TR%i(0i(%1
-jJk-BbZmIaP"Klb!'mqlq$"9hpQ@SY+-R3q9YGSBU@fd-96GhBI$GQ-V`h[S1$(l
-VNKLUV@R$8(ee!N10PDdBr*HhB+LjY"P$`1*)KX#&B3a"md-BDXeY`&"lGKf'pfI
-@BJLHAT1KcY4U$(8R9f@S0l%L3rhaj4JDM#h$d("dDBB24TCJD$5m'%2)8&H'aS0
-G'$iFk-33f[mP3eLrj`cKIA-CQ[4qb"$4mcj$T1-13j6p&N26c1X-dEBV$-h5,c)
-dlh+1iD1dd``aUFFC@R3m`Q$TF*!!)6Cj,d2,T*d-VGTZBiKVXjQKGH*kK[L%03`
-IakpJ5)KE`["*b`8-LCBj$*r'c'"Sdh`+`fI4%aMD4SeKq$aL"%05q"#'GU%$'*)
-Epf0ShkJh3iH'$SD8qTN-(HZQ-eL$daK5DhGNk"58c*!!&Y#@SE0r)N1Ak[%-AIe
-D-U6laM"N9)PQX&@+B1KQ$QA),0q)i3ZIqJcfXX%-hEf$'"aHrJ`p22dBHTDX`Y$
-,`mc3fpf(SBqE0d2I)Ti-AjSm'2S9FQ2ibYR%d,q!-m2A1KN-d2PQS$a)(L`2NBI
-+`q6KmJKjT$a+(Lf2NFI+iq6amJ4jSMa*RLa2NDI+dq6TmJajTMa,RLh2NHI+mq6
-jmJ*jSEa)AL`[NCI+bq6PmJTjTEa+ALer)kq4emVVj'rPpI)'HD1m5GiXEj'hbYr
-*fq6YmJljHhQR[%[H,Hq4pmVlj2hb!IQJI%Jq,2mJ(j'2bXIN(qAMmJRjT(a+2Lf
-INFr+2mRRj22b"IPRqD*m5EiXrb*INDr+eq4IjH[b$IQQr*Ym5liYCmQrbhINZr)
-pq3rj[T`YjmJ2j)Ib)rQar+HF+cq4RmV2j1IbAr,ImJ[jTIa+cVrAq2IZa#8h`e(
-[M,(L!aX+KPXLBSbe5VT9#0!Y3m18p"i1`e(jTiGr6K,QYpFN0E5riJD$A(+l,R'
-2l@@cfXefDrGZ2H`TeP*4GUXe[NqQe4`@CXjXRfje1+cr!`IL!!!:
--- a/demos/obj/README
+++ /dev/null
@@ -1,1 +1,0 @@
-This directory contains all the object files generated for the demonstration programs
--- a/demos/src/common.c
+++ /dev/null
@@ -1,248 +1,0 @@
-/*
- * This is a cheap replacement for getopt() because that routine is not
- * available on some platforms and behaves differently on other platforms.
- * This code was written from scratch without looking at any other
- * implementation.
- *
- * This code is hereby expressly placed in the public domain.
- * [email protected] (Mark Leisher)
- * 10 October 1997
- */
-
-#ifndef lint
-#ifdef __GNUC__
- static char rcsid[] __attribute__ ((unused)) = "$Id$";
-#else
- static char rcsid[] = "$Id$";
-#endif
-#endif
-
-#include "common.h"
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
- /*
- * Externals visible to programs.
- */
-
- int opterr = 1;
- int optind = 1;
- char* optarg;
-
- /*
- * Internal variables that are used to detect when the global values
- * need to be reset.
- */
-
- static int cmdac;
-#ifdef __STDC__
- static const char* cmdname;
- static char* const* cmdav;
-#else
- static char* cmdname;
- static char** cmdav;
-#endif
-
- int
-#ifdef __STDC__
- getopt( int ac, char* const* av, const char* pat )
-#else
- getopt( ac, av, pat )
- int ac;
- char** av;
- char* pat;
-#endif
- {
- int opt;
-#ifdef __STDC__
- const char* p;
- const char* pp;
-#else
- char* p;
- char* pp;
-#endif
-
- /*
- * If there is no pattern, indicate the parsing is done.
- */
- if ( pat == 0 || *pat == 0 )
- return -1;
-
- /*
- * Always reset the option argument to NULL.
- */
- optarg = 0;
-
- /*
- * If the number of arguments or argument list do not match the last
- * values seen, reset the internal pointers and the globals.
- */
- if ( ac != cmdac || av != cmdav )
- {
- optind = 1;
- cmdac = ac;
- cmdav = av;
-
- /*
- * Determine the command name in case it is needed for warning
- * messages.
- */
- for ( cmdname = 0, p = av[0]; *p; p++ )
- {
- if ( *p == '/' || *p == '\\' )
- cmdname = p;
- }
- /*
- * Skip the path separator if the name was assigned.
- */
- if ( cmdname )
- cmdname++;
- else
- cmdname = av[0];
- }
-
- /*
- * If the next index is greater than or equal to the number of
- * arguments, then the command line is done.
- */
- if ( optind >= ac )
- return -1;
-
- /*
- * Test the next argument for one of three cases:
- * 1. The next argument does not have an initial '-'.
- * 2. The next argument is '-'.
- * 3. The next argument is '--'.
- *
- * In either of these cases, command line processing is done.
- */
- if ( av[optind][0] != '-' ||
- strcmp( av[optind], "-" ) == 0 ||
- strcmp( av[optind], "--" ) == 0 )
- return -1;
-
- /*
- * Point at the next command line argument and increment the
- * command line index.
- */
- p = av[optind++];
-
- /*
- * Look for the first character of the command line option.
- */
- for ( opt = *(p + 1), pp = pat; *pp && *pp != opt; pp++ )
- ;
-
- /*
- * If nothing in the pattern was recognized, then issue a warning
- * and return a '?'.
- */
- if ( *pp == 0 )
- {
- if ( opterr )
- fprintf( stderr, "%s: illegal option -- %c\n", cmdname, opt );
- return '?';
- }
-
- /*
- * If the option expects an argument, get it.
- */
- if ( *(pp + 1) == ':' && (optarg = av[optind]) == 0 )
- {
- /*
- * If the option argument is NULL, issue a warning and return a '?'.
- */
- if ( opterr )
- fprintf( stderr, "%s: option requires an argument -- %c\n",
- cmdname, opt );
- opt = '?';
- }
- else if ( optarg )
- /*
- * Increment the option index past the argument.
- */
- optind++;
-
- /*
- * Return the option character.
- */
- return opt;
- }
-
-
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1998 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* ft_basename(): */
-/* */
-/* a stupid but useful function... */
-/* */
-/* rewritten by DavidT to get rid of GPLed programs in the FreeType demos. */
-/* */
-/****************************************************************************/
-
- char*
-#ifdef __STDC__
- ft_basename ( const char* name )
-#else
- ft_basename ( name )
- char* name;
-#endif
- {
-#ifdef __STDC__
- const char* base;
- const char* current;
-#else
- char* base;
- char* current;
-#endif
- char c;
-
- base = name;
- current = name;
-
- c = *current;
-
- while ( c )
- {
-#ifndef macintosh
- if ( c == '/' || c == '\\' )
-#else
- if ( c == ':' )
-#endif
- base = current + 1;
-
- current++;
- c = *current;
- }
-
- return (char*)base;
- }
-
-
-#ifdef __STDC__
- void Panic( const char* fmt, ... )
-#else
- void Panic( fmt )
- const char* fmt;
-#endif
- {
- va_list ap;
-
-
- va_start( ap, fmt );
- vprintf( fmt, ap );
- va_end( ap );
-
- exit( 1 );
- }
-
-
-/* End */
--- a/demos/src/common.h
+++ /dev/null
@@ -1,53 +1,0 @@
-/*
- * This is a cheap replacement for getopt() because that routine is not
- * available on some platforms and behaves differently on other platforms.
- *
- * This code is hereby expressly placed in the public domain.
- * [email protected] (Mark Leisher)
- * 10 October 1997
- */
-
-#ifndef _H_COMMON
-#define _H_COMMON
-
-/* Note that by default, both functions are implemented in common.c */
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
- extern int opterr;
- extern int optind;
- extern char* optarg;
-
- extern int getopt(
-#ifdef __STDC__
- int argc,
- char* const* argv,
- const char* pattern
-#endif
- );
-
-
- extern char* ft_basename(
-#ifdef __STDC__
- const char* name
-#endif
- );
-
- /* print a message and exit */
- extern void Panic (
-#ifdef __STDC__
- const char* fmt, ...
-#endif
- );
-
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _H_COMMON */
-
-
-/* End */
--- a/demos/src/compos.c
+++ /dev/null
@@ -1,191 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1998 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* compos: this is a very simple program used to test the flag */
-/* FT_LOAD_NO_RECURSE */
-/* */
-/* NOTE: This is just a test program that is used to show off and */
-/* debug the current engine. */
-/* */
-/****************************************************************************/
-
-#include <freetype/freetype.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#define gettext( x ) ( x )
-
- FT_Error error;
-
- FT_Library library;
- FT_Face face;
- FT_Size size;
- FT_GlyphSlot slot;
-
- unsigned int num_glyphs;
- int ptsize;
-
- int Fail;
- int Num;
-
-
-
- static void Usage( char* name )
- {
- printf( "compos: test FT_LOAD_NO_RECURSE load flag - www.freetype.org\n" );
- printf( "------------------------------------------------------------\n" );
- printf( "\n" );
- printf( "Usage: %s fontname[.ttf|.ttc] [fontname2..]\n", name );
- printf( "\n" );
-
- exit( 1 );
- }
-
-
- static void Panic( const char* message )
- {
- fprintf( stderr, "%s\n error code = 0x%04x\n", message, error );
- exit(1);
- }
-
-
- int main( int argc, char** argv )
- {
- int i, file_index;
- unsigned int id;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- char* fname;
-
-
- execname = argv[0];
-
- if ( argc < 2 )
- Usage( execname );
-
- error = FT_Init_FreeType( &library );
- if (error) Panic( "Could not create library object" );
-
- /* Now check all files */
- for ( file_index = 1; file_index < argc; file_index++ )
- {
- fname = argv[file_index];
- i = strlen( fname );
- while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
- {
- if ( fname[i] == '.' )
- i = 0;
- i--;
- }
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, fname, 128 );
- strncpy( alt_filename, fname, 128 );
-
-#ifndef macintosh
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-#endif
- i = strlen( filename );
- fname = filename;
-
- while ( i >= 0 )
-#ifndef macintosh
- if ( filename[i] == '/' || filename[i] == '\\' )
-#else
- if ( filename[i] == ':' )
-#endif
- {
- fname = filename + i + 1;
- i = -1;
- }
- else
- i--;
-
- printf( "%s:\n", fname );
-
- /* Load face */
- error = FT_New_Face( library, filename, 0, &face );
- if (error)
- {
- if (error == FT_Err_Invalid_File_Format)
- printf( "unknown format\n" );
- else
- printf( "could not find/open file (error: %d)\n", error );
- continue;
- }
-
- num_glyphs = face->num_glyphs;
- slot = face->glyph;
-
- Fail = 0;
- {
- for ( id = 0; id < num_glyphs; id++ )
- {
- int has_scale;
-
- error = FT_Load_Glyph( face, id, FT_LOAD_NO_RECURSE );
- if (!error && slot->format == ft_glyph_format_composite)
- {
- int n;
- FT_SubGlyph* subg = slot->subglyphs;
-
- printf( "%4d:", id );
- for ( n = 0; n < slot->num_subglyphs; n++, subg++ )
- {
- has_scale = subg->flags & (
- FT_SUBGLYPH_FLAG_SCALE |
- FT_SUBGLYPH_FLAG_XY_SCALE |
- FT_SUBGLYPH_FLAG_2X2 );
-
- printf( " [%d%c",
- subg->index,
- subg->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ? '*' : ' ' );
-
- if ( subg->arg1|subg->arg2 )
- {
- if ( subg->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES )
- printf( "(%d,%d)", subg->arg1, subg->arg2 );
- else
- printf( "<%d,%d>", subg->arg1, subg->arg2 );
- }
-
- if (has_scale)
- printf( "-{%0.3f %0.3f %0.3f %0.3f}",
- subg->transform.xx/65536.0,
- subg->transform.xy/65536.0,
- subg->transform.yx/65536.0,
- subg->transform.yy/65536.0 );
- printf( "]" );
- }
- printf( " adv=%ld lsb=%ld\n",
- slot->metrics.horiAdvance,
- slot->metrics.horiBearingX );
- }
- }
- }
-
- FT_Done_Face( face );
- }
-
- FT_Done_FreeType(library);
- exit( 0 ); /* for safety reasons */
-
- return 0; /* never reached */
- }
-
-
-/* End */
--- a/demos/src/ftlint.c
+++ /dev/null
@@ -1,192 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1998 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* ftlint: a simple font tester. This program tries to load all the */
-/* glyphs of a given font. */
-/* */
-/* NOTE: This is just a test program that is used to show off and */
-/* debug the current engine. */
-/* */
-/****************************************************************************/
-
-#include <freetype/freetype.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#define gettext( x ) ( x )
-
- FT_Error error;
-
- FT_Library library;
- FT_Face face;
- FT_Size size;
- FT_GlyphSlot slot;
-
- unsigned int num_glyphs;
- int ptsize;
-
- int Fail;
- int Num;
-
-
-
- static void Usage( char* name )
- {
- printf( "ftlint: simple font tester -- part of the FreeType project\n" );
- printf( "----------------------------------------------------------\n" );
- printf( "\n" );
- printf( "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n", name );
- printf( "\n" );
-
- exit( 1 );
- }
-
-
- static void Panic( const char* message )
- {
- fprintf( stderr, "%s\n error code = 0x%04x\n", message, error );
- exit(1);
- }
-
-
- int main( int argc, char** argv )
- {
- int i, file_index;
- unsigned int id;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- char* fname;
-
-
- execname = argv[0];
-
- if ( argc < 3 )
- Usage( execname );
-
- if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
- Usage( execname );
-
- error = FT_Init_FreeType( &library );
- if (error) Panic( "Could not create library object" );
-
- /* Now check all files */
- for ( file_index = 2; file_index < argc; file_index++ )
- {
- fname = argv[file_index];
-
- /* try to open the file with no extra extension first */
- error = FT_New_Face( library, fname, 0, &face );
- if (!error)
- {
- printf( "%s: ", fname );
- goto Success;
- }
-
-
- if ( error == FT_Err_Unknown_File_Format )
- {
- printf( "unknown format\n" );
- continue;
- }
-
- /* ok, we could not load the file, try to add an extension to */
- /* its name if possible.. */
-
- i = strlen( fname );
- while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
- {
- if ( fname[i] == '.' )
- i = 0;
- i--;
- }
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, fname, 128 );
- strncpy( alt_filename, fname, 128 );
-
-#ifndef macintosh
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-#endif
- i = strlen( filename );
- fname = filename;
-
- while ( i >= 0 )
-#ifndef macintosh
- if ( filename[i] == '/' || filename[i] == '\\' )
-#else
- if ( filename[i] == ':' )
-#endif
- {
- fname = filename + i + 1;
- i = -1;
- }
- else
- i--;
-
- printf( "%s: ", fname );
-
- /* Load face */
- error = FT_New_Face( library, filename, 0, &face );
- if (error)
- {
- if (error == FT_Err_Unknown_File_Format)
- printf( "unknown format\n" );
- else
- printf( "could not find/open file (error: %d)\n", error );
- continue;
- }
- if (error) Panic( "Could not open file" );
-
- Success:
- num_glyphs = face->num_glyphs;
-
- error = FT_Set_Char_Size( face, ptsize << 6, ptsize << 6, 72, 72 );
- if (error) Panic( "Could not set character size" );
-
- Fail = 0;
- {
- for ( id = 0; id < num_glyphs; id++ )
- {
- error = FT_Load_Glyph( face, id, FT_LOAD_DEFAULT );
- if (error)
- {
- if ( Fail < 10 )
- printf( "glyph %4u: 0x%04x\n" , id, error );
- Fail++;
- }
- }
- }
-
- if ( Fail == 0 )
- printf( "OK.\n" );
- else
- if ( Fail == 1 )
- printf( "1 fail.\n" );
- else
- printf( "%d fails.\n", Fail );
-
- FT_Done_Face( face );
- }
-
- FT_Done_FreeType(library);
- exit( 0 ); /* for safety reasons */
-
- return 0; /* never reached */
- }
-
-
-/* End */
--- a/demos/src/ftmulti.c
+++ /dev/null
@@ -1,833 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-2000 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* */
-/* FTMulti- a simple multiple masters font viewer */
-/* */
-/* Press F1 when running this program to have a list of key-bindings */
-/* */
-/****************************************************************************/
-
-#include <freetype/freetype.h>
-#include <freetype/ftmm.h>
-
-#include "common.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "graph.h"
-#include "grfont.h"
-
-#define DIM_X 500
-#define DIM_Y 400
-
-#define CENTER_X ( bit.width / 2 )
-#define CENTER_Y ( bit.rows / 2 )
-
-#define MAXPTSIZE 500 /* dtp */
-
- char Header[128];
- char* new_header = 0;
-
- const unsigned char* Text = (unsigned char*)
- "The quick brown fox jumped over the lazy dog 0123456789 "
- "\342\352\356\373\364\344\353\357\366\374\377\340\371\351\350\347 "
- "&#~\"\'(-`_^@)=+\260 ABCDEFGHIJKLMNOPQRSTUVWXYZ "
- "$\243^\250*\265\371%!\247:/;.,?<>";
-
- FT_Library library; /* the FreeType library */
- FT_Face face; /* the font face */
- FT_Size size; /* the font size */
- FT_GlyphSlot glyph; /* the glyph slot */
-
- FT_Error error; /* error returned by FreeType? */
-
- grSurface* surface; /* current display surface */
- grBitmap bit; /* current display bitmap */
-
- int num_glyphs; /* number of glyphs */
- int ptsize; /* current point size */
-
- int hinted = 1; /* is glyph hinting active? */
- int antialias = 1; /* is anti-aliasing active? */
- int use_sbits = 1; /* do we use embedded bitmaps? */
- int low_prec = 0; /* force low precision */
- int Num; /* current first glyph index */
-
- int res = 72;
-
- static grColor fore_color = { 255 };
-
- int Fail;
- unsigned char autorun;
-
- int graph_init = 0;
-
- int render_mode = 1;
- int use_grays = 1;
-
- FT_Multi_Master multimaster;
- FT_Long design_pos[T1_MAX_MM_AXIS];
-
-#define RASTER_BUFF_SIZE 32768
- char raster_buff[RASTER_BUFF_SIZE];
-
-#define DEBUGxxx
-
-#ifdef DEBUG
-#define LOG( x ) LogMessage##x
-#else
-#define LOG( x ) /* empty */
-#endif
-
-#ifdef DEBUG
- static
- void LogMessage( const char* fmt, ... )
- {
- va_list ap;
-
-
- va_start( ap, fmt );
- vfprintf( stderr, fmt, ap );
- va_end( ap );
- }
-#endif
-
-
- /* PanicZ */
- static
- void PanicZ( const char* message )
- {
- fprintf( stderr, "%s\n error = 0x%04x\n", message, error );
- exit( 1 );
- }
-
-
- /* Clears the Bit bitmap/pixmap */
- static
- void Clear_Display( void )
- {
- long size = (long)bit.pitch * bit.rows;
-
-
- if ( size < 0 )
- size = -size;
- memset( bit.buffer, 0, size );
- }
-
-
- /* Initialize the display bitmap named `bit' */
- static
- void Init_Display( void )
- {
- grInitDevices();
-
- bit.mode = gr_pixel_mode_gray;
- bit.width = DIM_X;
- bit.rows = DIM_Y;
- bit.grays = 256;
-
- surface = grNewSurface( 0, &bit );
- if ( !surface )
- PanicZ( "could not allocate display surface\n" );
-
- graph_init = 1;
- }
-
-
-#define MAX_BUFFER 300000
-
-#define FLOOR( x ) ( (x) & -64 )
-#define CEIL( x ) ( ( (x) + 63 ) & -64 )
-#define TRUNC( x ) ( (x) >> 6 )
-
- static
- char bit_buffer[MAX_BUFFER];
-
-
- /* Render a single glyph with the `grays' component */
- static
- FT_Error Render_Glyph( int x_offset,
- int y_offset )
- {
- grBitmap bit3;
- FT_Pos x_top, y_top;
-
- /* first, render the glyph image into a bitmap */
- if (glyph->format != ft_glyph_format_bitmap)
- {
- error = FT_Render_Glyph( glyph, antialias ? ft_render_mode_normal : ft_render_mode_mono );
- if (error) return error;
-
- }
-
- /* now blit it to our display screen */
- bit3.rows = glyph->bitmap.rows;
- bit3.width = glyph->bitmap.width;
- bit3.pitch = glyph->bitmap.pitch;
- bit3.buffer = glyph->bitmap.buffer;
-
- switch (glyph->bitmap.pixel_mode)
- {
- case ft_pixel_mode_mono:
- bit3.mode = gr_pixel_mode_mono;
- bit3.grays = 0;
- break;
-
- case ft_pixel_mode_grays:
- bit3.mode = gr_pixel_mode_gray;
- bit3.grays = glyph->bitmap.num_grays;
- }
-
- /* Then, blit the image to the target surface */
- x_top = x_offset + glyph->bitmap_left;
- y_top = y_offset - glyph->bitmap_top;
-
- grBlitGlyphToBitmap( &bit, &bit3, x_top, y_top, fore_color );
-
- return 0;
- }
-
-
-
- static
- FT_Error Reset_Scale( int pointSize )
- {
- FT_Error error;
-
-
- error = FT_Set_Char_Size( face, pointSize << 6,
- pointSize << 6,
- res,
- res );
- return FT_Err_Ok;
- }
-
-
- static
- FT_Error LoadChar( int idx,
- int hint )
- {
- int flags;
-
-
- flags = FT_LOAD_DEFAULT;
-
- if ( !hint )
- flags |= FT_LOAD_NO_HINTING;
-
- if ( !use_sbits )
- flags |= FT_LOAD_NO_BITMAP;
-
- return FT_Load_Glyph( face, idx, flags );
- }
-
-
- static
- FT_Error Render_All( int first_glyph,
- int ptsize )
- {
- FT_F26Dot6 start_x, start_y, step_x, step_y, x, y;
- int i;
-
- FT_Error error;
-
-
- start_x = 4;
- start_y = 36 + ptsize;
-
- step_x = size->metrics.x_ppem + 4;
- step_y = size->metrics.y_ppem + 10;
-
- x = start_x;
- y = start_y;
-
- i = first_glyph;
-
-#if 0
- while ( i < first_glyph + 1 )
-#else
- while ( i < num_glyphs )
-#endif
- {
- if ( !( error = LoadChar( i, hinted ) ) )
- {
-#ifdef DEBUG
- if ( i <= first_glyph + 6 )
- {
- LOG(( "metrics[%02d] = [%x %x]\n",
- i,
- glyph->metrics.horiBearingX,
- glyph->metrics.horiAdvance ));
-
- if ( i == first_glyph + 6 )
- LOG(( "-------------------------\n" ));
- }
-#endif
-
- Render_Glyph( x, y );
-
- x += ( glyph->metrics.horiAdvance >> 6 ) + 1;
-
- if ( x + size->metrics.x_ppem > bit.width )
- {
- x = start_x;
- y += step_y;
-
- if ( y >= bit.rows )
- return FT_Err_Ok;
- }
- }
- else
- Fail++;
-
- i++;
- }
-
- return FT_Err_Ok;
- }
-
-
- static
- FT_Error Render_Text( int first_glyph,
- int ptsize )
- {
- FT_F26Dot6 start_x, start_y, step_x, step_y, x, y;
- int i;
-
- FT_Error error;
- const unsigned char* p;
-
-
- ptsize=ptsize;
-
- start_x = 4;
- start_y = 32 + size->metrics.y_ppem;
-
- step_x = size->metrics.x_ppem + 4;
- step_y = size->metrics.y_ppem + 10;
-
- x = start_x;
- y = start_y;
-
- i = first_glyph;
- p = Text;
- while ( i > 0 && *p )
- {
- p++;
- i--;
- }
-
- while ( *p )
- {
- if ( !( error = LoadChar( FT_Get_Char_Index( face,
- (unsigned char)*p ),
- hinted ) ) )
- {
-#ifdef DEBUG
- if ( i <= first_glyph + 6 )
- {
- LOG(( "metrics[%02d] = [%x %x]\n",
- i,
- glyph->metrics.horiBearingX,
- glyph->metrics.horiAdvance ));
-
- if ( i == first_glyph + 6 )
- LOG(( "-------------------------\n" ));
- }
-#endif
-
- Render_Glyph( x, y );
-
- x += ( glyph->metrics.horiAdvance >> 6 ) + 1;
-
- if ( x + size->metrics.x_ppem > bit.width )
- {
- x = start_x;
- y += step_y;
-
- if ( y >= bit.rows )
- return FT_Err_Ok;
- }
- }
- else
- Fail++;
-
- i++;
- p++;
- }
-
- return FT_Err_Ok;
- }
-
-
- static
- void Help( void )
- {
- grEvent dummy_event;
-
-
- Clear_Display();
-
- grGotoxy( 0, 0 );
- grSetMargin( 2, 1 );
- grGotobitmap( &bit );
-
- grWriteln("FreeType Glyph Viewer - part of the FreeType test suite" );
- grLn();
- grWriteln("This program is used to display all glyphs from one or" );
- grWriteln("several font files, with the FreeType library.");
- grLn();
- grWriteln("Use the following keys:");
- grLn();
- grWriteln(" F1 or ? : display this help screen" );
- grWriteln(" a : toggle anti-aliasing" );
- grWriteln(" h : toggle outline hinting" );
- grWriteln(" b : toggle embedded bitmaps" );
- grWriteln(" l : toggle low precision rendering" );
- grWriteln(" space : toggle rendering mode" );
- grLn();
- grWriteln(" Up : increase pointsize by 1 unit" );
- grWriteln(" Down : decrease pointsize by 1 unit" );
- grWriteln(" Page Up : increase pointsize by 10 units" );
- grWriteln(" Page Down : decrease pointsize by 10 units" );
- grLn();
- grWriteln(" Right : increment first glyph index" );
- grWriteln(" Left : decrement first glyph index" );
- grLn();
- grWriteln(" F3 : decrement first axis position by 20" );
- grWriteln(" F4 : increment first axis position by 20" );
- grWriteln(" F5 : decrement second axis position by 20" );
- grWriteln(" F6 : increment second axis position by 20" );
- grWriteln(" F7 : decrement third axis position by 20" );
- grWriteln(" F8 : increment third axis position by 20" );
- grLn();
- grWriteln("press any key to exit this help screen");
-
- grRefreshSurface( surface );
- grListenSurface( surface, gr_event_key, &dummy_event );
- }
-
-
-
- static
- int Process_Event( grEvent* event )
- {
- int i, axis;
-
- switch ( event->key )
- {
- case grKeyEsc: /* ESC or q */
- case grKEY( 'q' ):
- return 0;
-
- case grKeyF1:
- case grKEY( '?' ):
- Help();
- return 1;
-
- /* mode keys */
-
- case grKEY( 'a' ):
- antialias = !antialias;
- new_header = antialias ? "anti-aliasing is now on"
- : "anti-aliasing is now off";
- return 1;
-
- case grKEY( 'b' ):
- use_sbits = !use_sbits;
- new_header = use_sbits ? "embedded bitmaps are now used if available"
- : "embedded bitmaps are now ignored";
- return 1;
-
- case grKEY( 'n' ):
- case grKEY( 'p' ):
- return (int)event->key;
-
- case grKEY( 'l' ):
- low_prec = !low_prec;
- new_header = low_prec ? "rendering precision is now forced to low"
- : "rendering precision is now normal";
- break;
-
- case grKEY( 'h' ):
- hinted = !hinted;
- new_header = hinted ? "glyph hinting is now active"
- : "glyph hinting is now ignored";
- break;
-
- case grKEY( ' ' ):
- render_mode ^= 1;
- new_header = render_mode ? "rendering all glyphs in font"
- : "rendering test text string";
- break;
-
- /* MM related keys */
-
- case grKeyF3:
- i = -20;
- axis = 0;
- goto Do_Axis;
-
- case grKeyF4:
- i = 20;
- axis = 0;
- goto Do_Axis;
-
- case grKeyF5:
- i = -20;
- axis = 1;
- goto Do_Axis;
-
- case grKeyF6:
- i = 20;
- axis = 1;
- goto Do_Axis;
-
- case grKeyF7:
- i = -20;
- axis = 2;
- goto Do_Axis;
-
- case grKeyF8:
- i = 20;
- axis = 2;
- goto Do_Axis;
-
- /* scaling related keys */
-
- case grKeyPageUp:
- i = 10;
- goto Do_Scale;
-
- case grKeyPageDown:
- i = -10;
- goto Do_Scale;
-
- case grKeyUp:
- i = 1;
- goto Do_Scale;
-
- case grKeyDown:
- i = -1;
- goto Do_Scale;
-
- /* glyph index related keys */
-
- case grKeyLeft:
- i = -1;
- goto Do_Glyph;
-
- case grKeyRight:
- i = 1;
- goto Do_Glyph;
-
- case grKeyF9:
- i = -100;
- goto Do_Glyph;
-
- case grKeyF10:
- i = 100;
- goto Do_Glyph;
-
- case grKeyF11:
- i = -1000;
- goto Do_Glyph;
-
- case grKeyF12:
- i = 1000;
- goto Do_Glyph;
-
- default:
- ;
- }
- return 1;
-
- Do_Axis:
- if ( axis < (int)multimaster.num_axis )
- {
- FT_MM_Axis* a = multimaster.axis + axis;
- FT_Long pos = design_pos[axis];
-
-
- pos += i;
- if ( pos < a->minimum ) pos = a->minimum;
- if ( pos > a->maximum ) pos = a->maximum;
-
- design_pos[axis] = pos;
-
- FT_Set_MM_Design_Coordinates( face, multimaster.num_axis, design_pos );
- }
- return 1;
-
- Do_Scale:
- ptsize += i;
- if ( ptsize < 1 ) ptsize = 1;
- if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;
- return 1;
-
- Do_Glyph:
- Num += i;
- if ( Num < 0 ) Num = 0;
- if ( Num >= num_glyphs ) Num = num_glyphs - 1;
- return 1;
- }
-
-
- static
- void usage( char* execname )
- {
- fprintf( stderr, "\n" );
- fprintf( stderr, "ftmulti: multiple masters font viewer - part of FreeType\n" );
- fprintf( stderr, "--------------------------------------------------------\n" );
- fprintf( stderr, "\n" );
- fprintf( stderr, "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n",
- execname );
- fprintf( stderr, "\n" );
- fprintf( stderr, " -r R use resolution R dpi (default: 72 dpi)\n" );
- fprintf( stderr, " -f index specify first glyph index to display\n" );
- fprintf( stderr, "\n" );
-
- exit( 1 );
- }
-
-
- int
- main( int argc,
- char* argv[] )
- {
- int old_ptsize, orig_ptsize, file;
- int first_glyph = 0;
- int XisSetup = 0;
- char* execname;
- int option;
- int file_loaded;
-
- FT_Error error;
- grEvent event;
-
- execname = ft_basename( argv[0] );
-
- while ( 1 )
- {
- option = getopt( argc, argv, "f:r:" );
-
- if ( option == -1 )
- break;
-
- switch ( option )
- {
- case 'f':
- first_glyph = atoi( optarg );
- break;
-
- case 'r':
- res = atoi( optarg );
- if ( res < 1 )
- usage( execname );
- break;
-
- default:
- usage( execname );
- break;
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if ( argc <= 1 )
- usage( execname );
-
- if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )
- orig_ptsize = 64;
-
- file = 1;
-
- /* Initialize engine */
- error = FT_Init_FreeType( &library );
- if ( error )
- PanicZ( "Could not initialize FreeType library" );
-
- NewFile:
- ptsize = orig_ptsize;
- hinted = 1;
- file_loaded = 0;
-
- /* Load face */
- error = FT_New_Face( library, argv[file], 0, &face );
- if ( error )
- goto Display_Font;
-
- /* retrieve multiple master information */
- error = FT_Get_Multi_Master( face, &multimaster );
- if ( error )
- goto Display_Font;
-
- /* set the current position to the median of each axis */
- {
- int n;
-
-
- for ( n = 0; n < (int)multimaster.num_axis; n++ )
- design_pos[n] =
- ( multimaster.axis[n].minimum + multimaster.axis[n].maximum ) / 2;
- }
-
- error = FT_Set_MM_Design_Coordinates( face,
- multimaster.num_axis,
- design_pos );
- if ( error )
- goto Display_Font;
-
- file_loaded++;
-
- error = Reset_Scale( ptsize );
- if ( error )
- goto Display_Font;
-
- num_glyphs = face->num_glyphs;
- glyph = face->glyph;
- size = face->size;
-
- Display_Font:
- /* initialize graphics if needed */
- if ( !XisSetup )
- {
- XisSetup = 1;
- Init_Display();
- }
-
- grSetTitle( surface, "FreeType Glyph Viewer - press F1 for help" );
- old_ptsize = ptsize;
-
- if ( file_loaded >= 1 )
- {
- Fail = 0;
- Num = first_glyph;
-
- if ( Num >= num_glyphs )
- Num = num_glyphs - 1;
-
- if ( Num < 0 )
- Num = 0;
- }
-
- for ( ;; )
- {
- int key;
-
-
- Clear_Display();
-
- if ( file_loaded >= 1 )
- {
- switch ( render_mode )
- {
- case 0:
- Render_Text( Num, ptsize );
- break;
-
- default:
- Render_All( Num, ptsize );
- }
-
- sprintf( Header, "%s %s (file %s)",
- face->family_name,
- face->style_name,
- ft_basename( argv[file] ) );
-
- if ( !new_header )
- new_header = Header;
-
- grWriteCellString( &bit, 0, 0, new_header, fore_color );
- new_header = 0;
-
- sprintf( Header, "axis: " );
- {
- int n;
-
-
- for ( n = 0; n < (int)multimaster.num_axis; n++ )
- {
- char temp[32];
-
-
- sprintf( temp, " %s:%ld",
- multimaster.axis[n].name,
- design_pos[n] );
- strcat( Header, temp );
- }
- }
- grWriteCellString( &bit, 0, 16, Header, fore_color );
-
- sprintf( Header, "at %d points, first glyph = %d",
- ptsize,
- Num );
- }
- else
- {
- sprintf( Header, "%s : not an MM font file, or could not be opened",
- ft_basename( argv[file] ) );
- }
-
- grWriteCellString( &bit, 0, 8, Header, fore_color );
- grRefreshSurface( surface );
-
- grListenSurface( surface, 0, &event );
- if ( !( key = Process_Event( &event ) ) )
- goto End;
-
- if ( key == 'n' )
- {
- if ( file_loaded >= 1 )
- FT_Done_Face( face );
-
- if ( file < argc - 1 )
- file++;
-
- goto NewFile;
- }
-
- if ( key == 'p' )
- {
- if ( file_loaded >= 1 )
- FT_Done_Face( face );
-
- if ( file > 1 )
- file--;
-
- goto NewFile;
- }
-
- if ( ptsize != old_ptsize )
- {
- if ( Reset_Scale( ptsize ) )
- PanicZ( "Could not resize font." );
-
- old_ptsize = ptsize;
- }
- }
-
- End:
-#if 0
- grDoneSurface( surface );
- grDone();
-#endif
-
- printf( "Execution completed successfully.\n" );
- printf( "Fails = %d\n", Fail );
-
- exit( 0 ); /* for safety reasons */
- return 0; /* never reached */
-}
-
-
-/* End */
--- a/demos/src/ftsbit.c
+++ /dev/null
@@ -1,313 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1998 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* ftsbit: a _very_ simple embedded bitmap dumper for FreeType 1.x. */
-/* */
-/* NOTE: This is just a test program that is used to show off and */
-/* debug the current engine. */
-/* */
-/****************************************************************************/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "freetype.h"
-
-
-#ifdef HAVE_LIBINTL_H
-
-#ifdef HAVE_LOCALE_H
-#include <locale.h>
-#endif
-
-#include <libintl.h>
-#include "ftxerr18.h"
-
-#else /* !HAVE_LIBINTL */
-
-#define gettext( x ) ( x )
-
- /* We ignore error message strings with this function */
-
- static char* TT_ErrToString18( FT_Error error )
- {
- static char temp[32];
-
- sprintf( temp, "0x%04lx", error );
- return temp;
- }
-
-#endif /* !HAVE_LIBINTL */
-
-
- FT_Error error;
- FT_Library engine;
- FT_Resource resource;
-
- FT_Face face;
- FT_Size instance;
- FT_GlyphSlot glyph;
-
- unsigned int num_glyphs;
- int ptsize;
-
- int Fail;
- int Num;
-
-
-
- static void Usage( char* name )
- {
- printf( gettext( "ftsbit: simple TrueType 'sbit' dumper -- part of the FreeType project\n" ) );
- printf( "---------------------------------------------------------------------\n" );
- printf( "\n" );
- printf( gettext( "Usage: %s ppem fontname (index)* (index1-index2)*\n\n" ), name );
- printf( gettext( " or %s -a ppem fontname (dumps all glyphs)\n" ), name );
- printf( "\n" );
-
- exit( EXIT_FAILURE );
- }
-
-
-
- static
- void dump_bitmap( FT_GlyphSlot glyph, int glyph_index )
- {
- /* Dump the resulting bitmap */
- {
- int y;
- unsigned char* line = (unsigned char*)glyph->bitmap.buffer;
-
- printf( "glyph index %d = %dx%d pixels, ",
- glyph_index, glyph->bitmap.rows, glyph->bitmap.width );
-
- printf( "advance = %d, minBearing = [%d,%d]\n",
- glyph->metrics.horiAdvance >> 6,
- glyph->metrics.horiBearingX >> 6,
- glyph->metrics.horiBearingY >> 6 );
-
- for ( y = 0; y < glyph->bitmap.rows; y++, line += glyph->bitmap.cols )
- {
- unsigned char* ptr = line;
- int x;
- unsigned char mask = 0x80;
-
- for ( x = 0; x < glyph->bitmap.width; x++ )
- {
- printf( "%c", (ptr[0] & mask) ? '*' : '.' );
- mask >>= 1;
- if (mask == 0)
- {
- mask = 0x80;
- ptr++;
- }
- }
-
- printf( "\n" );
- }
- }
- }
-
-
-
- static
- void dump_range( FT_GlyphSlot glyph,
- int first_glyph,
- int last_glyph )
- {
- int i;
-
- for ( i = first_glyph; i <= last_glyph; i++ )
- {
- error = FT_Load_Glyph( glyph,
- instance,
- (unsigned short)i,
- FT_LOAD_NO_OUTLINE,
- 0 );
- if (error)
- {
- printf( " no bitmap for glyph %d\n", i );
- printf( gettext( "FreeType error message: %s\n" ),
- TT_ErrToString18( error ) );
- continue;
- }
-
- dump_bitmap(glyph,i);
- }
- }
-
-
-
-
- int main( int argc, char** argv )
- {
- int i;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- char* fname;
- int dump_all = 0;
-
-
-#ifdef HAVE_LIBINTL_H
- setlocale( LC_ALL, "" );
- bindtextdomain( "freetype", LOCALEDIR );
- textdomain( "freetype" );
-#endif
-
- execname = argv[0];
-
- if ( argc < 3 )
- Usage( execname );
-
- if ( argv[1][0] == '-' &&
- argv[1][1] == 'a' )
- {
- argv++;
- argc--;
- dump_all = 1;
- }
-
- if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
- Usage( execname );
-
- /* Initialize engine */
- if ( (error = FT_Init_FreeType( &engine )) )
- {
- fprintf( stderr, gettext( "Error while initializing engine\n" ) );
- goto Failure;
- }
-
- /* Now check all files */
- fname = argv[2];
- i = strlen( fname );
- while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
- {
- if ( fname[i] == '.' )
- i = 0;
- i--;
- }
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, fname, 128 );
- strncpy( alt_filename, fname, 128 );
-
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-
- /* Load face */
- error = FT_New_Resource( engine, filename, &resource );
- if (error)
- {
- strcpy( filename, alt_filename );
- error = FT_New_Resource( engine, alt_filename, &resource );
- }
-
- i = strlen( filename );
- fname = filename;
-
- while ( i >= 0 )
- if ( filename[i] == '/' || filename[i] == '\\' )
- {
- fname = filename + i + 1;
- i = -1;
- }
- else
- i--;
-
- if ( error )
- {
- printf( gettext( "Could not find or open file.\n" ) );
- goto Failure;
- }
-
- error = FT_New_Face( resource, 0, &face );
- if (error)
- {
- printf( gettext( "Could not create face object.\n " ) );
- goto Failure;
- }
-
- /* get face properties */
- num_glyphs = face->num_glyphs;
-
- /* create instance */
- error = FT_New_Size( face, &instance );
- if ( error )
- {
- printf( gettext( "Could not create instance.\n" ) );
- goto Failure;
- }
-
- error = FT_Set_Pixel_Sizes( instance, ptsize, ptsize );
- if (error)
- {
- printf( gettext( "Could not set character size.\n" ) );
- goto Failure;
- }
-
- glyph = face->slot;
-
- if (dump_all)
- dump_range( glyph, 0, num_glyphs-1 );
- else
- {
- for ( i = 3; i < argc; i++ )
- {
- /* check for range in argument string */
- int range_check = 0;
- char* base = argv[i];
- char* cur = base;
- int first, last;
-
- while (*cur)
- {
- if (*cur == '-')
- {
- range_check = 1;
- break;
- }
- cur++;
- }
-
- if (range_check)
- {
- if ( sscanf( argv[i], "%d-%d", &first, &last ) != 2 )
- Usage( execname );
-
- dump_range( glyph, first, last );
- }
- else
- {
- if ( sscanf( argv[i], "%d", &first ) != 1 )
- Usage( execname );
-
- dump_range( glyph, first, first );
- }
- }
- }
-
- FT_Done_FreeType( engine );
- exit( EXIT_SUCCESS ); /* for safety reasons */
-
- return 0; /* never reached */
-
- Failure:
- printf( gettext( "FreeType error message: %s\n" ),
- TT_ErrToString18( error ) );
- exit( EXIT_FAILURE );
- }
-
-
-/* End */
--- a/demos/src/ftstring.c
+++ /dev/null
@@ -1,777 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1999 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* */
-/* FTString.c - simple text string display */
-/* */
-/****************************************************************************/
-
-#include <freetype/freetype.h>
-#include <freetype/ftglyph.h>
-#include "common.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <math.h>
-
-#include "graph.h"
-#include "grfont.h"
-
-#define DIM_X 500
-#define DIM_Y 400
-
-#define CENTER_X (bit.width/2)
-#define CENTER_Y (bit.rows/2)
-
-#define MAXPTSIZE 500 /* dtp */
-
- static char Header[128];
- static char* new_header = 0;
-
- static char* Text = "The quick brown fox jumps over the lazy dog";
-
- static FT_Library library; /* the FreeType library */
- static FT_Face face; /* the font face */
- static FT_Error error; /* error returned by FreeType ? */
-
- static grSurface* surface; /* current display surface */
- static grBitmap bit; /* current display bitmap */
-
- static int ptsize; /* current point size */
- static int Num;
- static int Rotation = 0;
- static int Fail;
-
- static int hinted = 1; /* is glyph hinting active ? */
- static int antialias = 1; /* is anti-aliasing active ? */
- static int use_sbits = 1; /* do we use embedded bitmaps ? */
- static int kerning = 1;
-
- static int res = 72; /* default resolution in dpi */
-
- static grColor fore_color = { 255 };
-
- static int graph_init = 0;
- static int render_mode = 1;
-
- static FT_Matrix trans_matrix;
- static int transform = 0;
-
- static FT_Vector string_center;
-
- typedef struct TGlyph_
- {
- FT_UInt glyph_index; /* glyph index in face */
- FT_Vector pos; /* position of glyph origin */
- FT_Glyph image; /* glyph image */
-
- } TGlyph, *PGlyph;
-
-#define FLOOR(x) ((x) & -64)
-#define CEIL(x) (((x)+63) & -64)
-#define TRUNC(x) ((x) >> 6)
-
-
-
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/**** ****/
-/**** U T I L I T Y F U N C T I O N S ****/
-/**** ****/
-/**** ****/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-
-#define DEBUGxxx
-
-#ifdef DEBUG
-#define LOG(x) LogMessage##x
-#else
-#define LOG(x) /* rien */
-#endif
-
-#ifdef DEBUG
- static void LogMessage( const char* fmt, ... )
- {
- va_list ap;
-
- va_start( ap, fmt );
- vfprintf( stderr, fmt, ap );
- va_end( ap );
- }
-#endif
-
- /* PanicZ */
- static void PanicZ( const char* message )
- {
- fprintf( stderr, "%s\n error = 0x%04x\n", message, error );
- exit(1);
- }
-
-
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/**** ****/
-/**** D I S P L A Y M A N A G E M E N T ****/
-/**** ****/
-/**** ****/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-
-#define MAX_GLYPHS 512
-
- /***********************************************************************
- *
- * The following arrays are used to store the glyph set that makes
- * up a string of text..
- *
- */
- static TGlyph glyphs[ MAX_GLYPHS ];
- static int num_glyphs;
-
-
- /**************************************************************
- *
- * Initialise the display surface
- *
- */
- static int init_display( void )
- {
- grInitDevices();
-
- bit.mode = gr_pixel_mode_gray;
- bit.width = DIM_X;
- bit.rows = DIM_Y;
- bit.grays = 256;
-
- surface = grNewSurface( 0, &bit );
- if (!surface)
- PanicZ( "could not allocate display surface\n" );
-
- graph_init = 1;
- return 0;
- }
-
- /**************************************************************
- *
- * Clears the display surface
- *
- */
- static void clear_display( void )
- {
- long size = (long)bit.pitch * bit.rows;
-
- if (size < 0) size = -size;
- memset( bit.buffer, 0, size );
- }
-
-
- static FT_Error reset_scale( int pointSize )
- {
- FT_Error error;
-
- error = FT_Set_Char_Size( face, pointSize << 6,
- pointSize << 6,
- res,
- res );
- return FT_Err_Ok;
- }
-
-
- /**************************************************************
- *
- * Layout a string of glyphs, the glyphs are untransformed..
- *
- */
- static void layout_glyphs( void )
- {
- PGlyph glyph = glyphs;
- FT_Error error;
- int n;
- FT_Vector origin;
- FT_Pos origin_x = 0;
- FT_UInt load_flags;
- FT_UInt num_grays;
- FT_UInt prev_index = 0;
-
- load_flags = FT_LOAD_DEFAULT;
- if( !hinted )
- load_flags |= FT_LOAD_NO_HINTING;
-
- num_grays = 256;
- if (!antialias)
- num_grays = 0;
-
- for ( n = 0; n < num_glyphs; n++, glyph++ )
- {
- /* compute glyph origin */
- if (kerning)
- {
- if (prev_index)
- {
- FT_Vector kern;
-
- FT_Get_Kerning( face, prev_index, glyph->glyph_index,
- hinted ? ft_kerning_default : ft_kerning_unfitted,
- &kern );
-
- origin_x += kern.x;
- }
- prev_index = glyph->glyph_index;
- }
-
- origin.x = origin_x;
- origin.y = 0;
-
- /* clear existing image if there is one */
- if (glyph->image)
- FT_Done_Glyph(glyph->image);
-
- /* load the glyph image (in its native format) */
- /* for now, we take a monochrome glyph bitmap */
- error = FT_Load_Glyph( face, glyph->glyph_index,
- hinted ? FT_LOAD_DEFAULT : FT_LOAD_NO_HINTING ) ||
- FT_Get_Glyph ( face->glyph, &glyph->image );
- if (error) continue;
-
- glyph->pos = origin;
-
- origin_x += face->glyph->advance.x;
- }
- string_center.x = origin_x / 2;
- string_center.y = 0;
-
- if (transform)
- FT_Vector_Transform( &string_center, &trans_matrix );
- }
-
- /**************************************************************
- *
- * Renders a given glyph vector set
- *
- */
- static void render_string( FT_Pos x, FT_Pos y )
- {
- PGlyph glyph = glyphs;
- grBitmap bit3;
- int n;
- FT_Vector delta;
-
- /* first of all, we must compute the general delta for the glyph */
- /* set.. */
- delta.x = (x << 6) - string_center.x;
- delta.y = ((bit.rows-y) << 6) - string_center.y;
-
- for ( n = 0; n < num_glyphs; n++, glyph++ )
- {
- FT_Glyph image;
- FT_Vector vec;
-
- if (!glyph->image)
- continue;
-
- /* copy image */
- error = FT_Glyph_Copy( glyph->image, &image );
- if (error) continue;
-
- /* transform it */
- vec = glyph->pos;
- FT_Vector_Transform( &vec, &trans_matrix );
- vec.x += delta.x;
- vec.y += delta.y;
- error = FT_Glyph_Transform( image, &trans_matrix, &vec );
- if (!error)
- {
- FT_BBox bbox;
-
- /* check bounding box, if it's not within the display surface, we */
- /* don't need to render it.. */
-
- FT_Glyph_Get_CBox( image, ft_glyph_bbox_pixels, &bbox );
-
- if ( bbox.xMax > 0 && bbox.yMax > 0 &&
- bbox.xMin < bit.width && bbox.yMin < bit.rows )
- {
- /* convert to a bitmap - destroy native image */
- error = FT_Glyph_To_Bitmap( &image,
- antialias ? ft_render_mode_normal
- : ft_render_mode_mono,
- 0, 1 );
- if (!error)
- {
- FT_BitmapGlyph bitmap = (FT_BitmapGlyph)image;
- FT_Bitmap* source = &bitmap->bitmap;
- FT_Pos x_top, y_top;
-
- bit3.rows = source->rows;
- bit3.width = source->width;
- bit3.pitch = source->pitch;
- bit3.buffer = source->buffer;
-
- switch (source->pixel_mode)
- {
- case ft_pixel_mode_mono:
- bit3.mode = gr_pixel_mode_mono;
- break;
-
- case ft_pixel_mode_grays:
- bit3.mode = gr_pixel_mode_gray;
- bit3.grays = source->num_grays;
- break;
-
- default:
- continue;
- }
-
- /* now render the bitmap into the display surface */
- x_top = bitmap->left;
- y_top = bit.rows - bitmap->top;
- grBlitGlyphToBitmap( &bit, &bit3, x_top, y_top, fore_color );
- }
- }
- }
- FT_Done_Glyph( image );
- }
- }
-
-
- /**************************************************************
- *
- * Convert a string of text into a glyph vector
- *
- * XXX: For now, we perform a trivial conversion
- *
- */
- static void prepare_text( const unsigned char* string )
- {
- const unsigned char* p = (const unsigned char*)string;
- PGlyph glyph = glyphs;
- FT_UInt glyph_index;
-
- num_glyphs = 0;
- while (*p)
- {
- glyph_index = FT_Get_Char_Index( face, (FT_ULong)*p );
- glyph->glyph_index = glyph_index;
- glyph++;
- num_glyphs++;
- if (num_glyphs >= MAX_GLYPHS)
- break;
- p++;
- }
- }
-
-
- static void reset_transform( void )
- {
- double angle = Rotation*3.14159/64.0;
- FT_Fixed cosinus = (FT_Fixed)(cos(angle)*65536.0);
- FT_Fixed sinus = (FT_Fixed)(sin(angle)*65536.0);
-
- transform = (angle != 0);
- trans_matrix.xx = cosinus;
- trans_matrix.xy = -sinus;
- trans_matrix.yx = sinus;
- trans_matrix.yy = cosinus;
- }
-
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/**** ****/
-/**** E V E N T H A N D L I N G ****/
-/**** ****/
-/**** ****/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-
-
- static void Help( )
- {
- grEvent dummy_event;
-
- clear_display();
- grGotoxy( 0, 0 );
- grSetMargin( 2, 1 );
- grGotobitmap( &bit );
-
- grWriteln("FreeType String Viewer - part of the FreeType test suite" );
- grLn();
- grWriteln("This program is used to display a string of text using" );
- grWriteln("the new convenience API of the FreeType 2 library.");
- grLn();
- grWriteln("Use the following keys :");
- grLn();
- grWriteln(" F1 or ? : display this help screen" );
- grWriteln(" a : toggle anti-aliasing" );
- grWriteln(" h : toggle outline hinting" );
- grWriteln(" k : toggle kerning" );
- grLn();
- grWriteln(" Up : increase pointsize by 1 unit" );
- grWriteln(" Down : decrease pointsize by 1 unit" );
- grWriteln(" Page Up : increase pointsize by 10 units" );
- grWriteln(" Page Down : decrease pointsize by 10 units" );
- grLn();
- grWriteln(" Right : rotate counter-clockwise" );
- grWriteln(" Left : rotate clockwise" );
- grWriteln(" F7 : big rotate counter-clockwise");
- grWriteln(" F8 : big rotate clockwise");
- grLn();
- grWriteln("press any key to exit this help screen");
-
- grRefreshSurface( surface );
- grListenSurface( surface, gr_event_key, &dummy_event );
- }
-
-
- static int Process_Event( grEvent* event )
- {
- int i;
-
- switch ( event->key )
- {
- case grKeyEsc: /* ESC or q */
- case grKEY('q'):
- return 0;
-
- case grKEY('k'):
- kerning = !kerning;
- new_header = ( kerning
- ? "kerning is now active"
- : "kerning is now ignored" );
- return 1;
-
- case grKEY('a'):
- antialias = !antialias;
- new_header = ( antialias
- ? "anti-aliasing is now on"
- : "anti-aliasing is now off" );
- return 1;
-
- case grKEY('b'):
- use_sbits = !use_sbits;
- new_header = ( use_sbits
- ? "embedded bitmaps are now used when available"
- : "embedded bitmaps are now ignored" );
- return 1;
-
- case grKEY('n'):
- case grKEY('p'):
- return (int)event->key;
-
- case grKEY('h'):
- hinted = !hinted;
- new_header = ( hinted
- ? "glyph hinting is now active"
- : "glyph hinting is now ignored" );
- break;
-
- case grKEY(' '):
- render_mode ^= 1;
- new_header = ( render_mode
- ? "rendering all glyphs in font"
- : "rendering test text string" );
- break;
-
- case grKeyF1:
- case grKEY('?'):
- Help();
- return 1;
-
-#if 0
- case grKeyF3: i = 16; goto Do_Rotate;
- case grKeyF4: i = -16; goto Do_Rotate;
- case grKeyF5: i = 1; goto Do_Rotate;
- case grKeyF6: i = -1; goto Do_Rotate;
-#endif
-
- case grKeyPageUp: i = 10; goto Do_Scale;
- case grKeyPageDown: i = -10; goto Do_Scale;
- case grKeyUp: i = 1; goto Do_Scale;
- case grKeyDown: i = -1; goto Do_Scale;
-
- case grKeyLeft: i = -1; goto Do_Rotate;
- case grKeyRight: i = 1; goto Do_Rotate;
- case grKeyF7: i = -10; goto Do_Rotate;
- case grKeyF8: i = 10; goto Do_Rotate;
- default:
- ;
- }
- return 1;
-
- Do_Rotate:
- Rotation = (Rotation + i) & 127;
- return 1;
-
- Do_Scale:
- ptsize += i;
- if (ptsize < 1) ptsize = 1;
- if (ptsize > MAXPTSIZE) ptsize = MAXPTSIZE;
- return 1;
-
-#if 0
- Do_Glyph:
- Num += i;
- if (Num < 0) Num = 0;
- if (Num >= num_glyphs) Num = num_glyphs-1;
- return 1;
-#endif
- }
-
-
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/**** ****/
-/**** M A I N P R O G R A M ****/
-/**** ****/
-/**** ****/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-
-
- static void usage( char* execname )
- {
- fprintf( stderr, "\n" );
- fprintf( stderr, "ftstring: string viewer -- part of the FreeType project\n" );
- fprintf( stderr, "-------------------------------------------------------\n" );
- fprintf( stderr, "\n" );
- fprintf( stderr, "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n",
- execname );
- fprintf( stderr, "\n" );
- fprintf( stderr, " -r R use resolution R dpi (default: 72 dpi)\n" );
- fprintf( stderr, " -m message message to display\n" );
- fprintf( stderr, "\n" );
-
- exit( 1 );
- }
-
-
- int main( int argc, char** argv )
- {
- int i, old_ptsize, orig_ptsize, file;
- int first_glyph = 0;
- int XisSetup = 0;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- int option;
- int file_loaded;
-
- FT_Error error;
- grEvent event;
-
- execname = ft_basename( argv[0] );
-
- while ( 1 )
- {
- option = getopt( argc, argv, "m:r:" );
-
- if ( option == -1 )
- break;
-
- switch ( option )
- {
- case 'r':
- res = atoi( optarg );
- if ( res < 1 )
- usage( execname );
- break;
-
- case 'm':
- if (argc < 3)
- usage( execname );
- Text = optarg;
- break;
-
- default:
- usage( execname );
- break;
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if ( argc <= 1 )
- usage( execname );
-
- if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )
- orig_ptsize = 64;
-
- file = 1;
-
- /* Initialize engine */
- error = FT_Init_FreeType( &library );
- if (error) PanicZ( "Could not initialise FreeType library" );
-
- NewFile:
- ptsize = orig_ptsize;
- hinted = 1;
- file_loaded = 0;
-
-#ifndef macintosh
- i = strlen( argv[file] );
- while ( i > 0 && argv[file][i] != '\\' && argv[file][i] != '/' )
- {
- if ( argv[file][i] == '.' )
- i = 0;
- i--;
- }
-#endif
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, argv[file], 128 );
- strncpy( alt_filename, argv[file], 128 );
-
- /* first, try to load the glyph name as-is */
- error = FT_New_Face( library, filename, 0, &face );
- if (!error) goto Success;
-
-#ifndef macintosh
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-#endif
-
- /* if it didn't work, try to add ".ttf" at the end */
- error = FT_New_Face( library, filename, 0, &face );
- if (error) goto Display_Font;
-
- Success:
- /* prepare the text to be rendered */
- prepare_text( (unsigned char*)Text );
-
- file_loaded++;
-
- error = reset_scale( ptsize );
- if (error) goto Display_Font;
-
- Display_Font:
- /* initialise graphics if needed */
- if ( !XisSetup )
- {
- XisSetup = 1;
- init_display();
- }
-
- grSetTitle( surface, "FreeType String Viewer - press F1 for help" );
- old_ptsize = ptsize;
-
- if ( file_loaded >= 1 )
- {
- Fail = 0;
- Num = first_glyph;
-
- if ( Num >= num_glyphs )
- Num = num_glyphs-1;
-
- if ( Num < 0 )
- Num = 0;
- }
-
- for ( ;; )
- {
- int key;
-
- clear_display();
-
- if ( file_loaded >= 1 )
- {
- /* layout & render string */
- {
- reset_transform();
- layout_glyphs();
- render_string( bit.width/2, bit.rows/2 );
- }
-
- sprintf( Header, "%s %s (file %s)",
- face->family_name,
- face->style_name,
- ft_basename( filename ) );
-
- if (!new_header)
- new_header = Header;
-
- grWriteCellString( &bit, 0, 0, new_header, fore_color );
- new_header = 0;
-
- sprintf( Header, "at %d points, rotation = %d",
- ptsize,
- Rotation );
- }
- else
- {
- sprintf( Header, "%s : is not a font file or could not be opened",
- ft_basename(filename) );
- }
-
- grWriteCellString( &bit, 0, 8, Header, fore_color );
- grRefreshSurface( surface );
-
- grListenSurface( surface, 0, &event );
- if ( !( key = Process_Event( &event ) ) )
- goto Fin;
-
- if ( key == 'n' )
- {
- if (file_loaded >= 1)
- FT_Done_Face( face );
-
- if ( file < argc - 1 )
- file++;
-
- goto NewFile;
- }
-
- if ( key == 'p' )
- {
- if (file_loaded >= 1)
- FT_Done_Face( face );
-
- if ( file > 1 )
- file--;
-
- goto NewFile;
- }
-
- if ( ptsize != old_ptsize )
- {
- if ( reset_scale( ptsize ) )
- PanicZ( "Could not resize font." );
-
- old_ptsize = ptsize;
- }
- }
-
- Fin:
-#if 0
- grDoneSurface(surface);
- grDone();
-#endif
- printf( "Execution completed successfully.\n" );
- printf( "Fails = %d\n", Fail );
-
- exit( 0 ); /* for safety reasons */
- return 0; /* never reached */
-}
-
-
-/* End */
-
--- a/demos/src/fttimer.c
+++ /dev/null
@@ -1,341 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project - a Free and Portable Quality TrueType Renderer. */
-/* */
-/* Copyright 1996-1998 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* fttimer: A simple performance benchmark. Now with graylevel rendering */
-/* with the '-g' option. */
-/* */
-/* Be aware that the timer program benchmarks different things */
-/* in each release of the FreeType library. Thus, performance */
-/* should only be compared between similar release numbers. */
-/* */
-/* */
-/* NOTE: This is just a test program that is used to show off and */
-/* debug the current engine. In no way does it shows the final */
-/* high-level interface that client applications will use. */
-/* */
-/****************************************************************************/
-
-#include <freetype/freetype.h>
-#include <freetype/ftglyph.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h> /* for clock() */
-
-/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */
-/* to get the HZ macro which is the equivalent. */
-#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)
-#include <sys/param.h>
-#define CLOCKS_PER_SEC HZ
-#endif
-
-#define CHARSIZE 400 /* character point size */
-#define MAX_GLYPHS 512 /* Maximum number of glyphs rendered at one time */
-
- char Header[128];
-
- FT_Error error;
- FT_Library library;
-
- FT_Face face;
-
- int num_glyphs;
- FT_Glyph glyphs[MAX_GLYPHS];
-
- int tab_glyphs;
- int cur_glyph;
-
- int pixel_size = CHARSIZE;
- int repeat_count = 1;
-
- int Fail;
- int Num;
-
- short antialias = 1; /* smooth fonts with gray levels */
- short force_low;
-
-
- static
- void Panic( const char* message )
- {
- fprintf( stderr, "%s\n", message );
- exit(1);
- }
-
-/*******************************************************************/
-/* */
-/* Get_Time: */
-/* */
-/* Returns the current time in milliseconds. */
-/* */
-/*******************************************************************/
-
- long Get_Time( void )
- {
- return clock() * 10000 / CLOCKS_PER_SEC;
- }
-
-
-
-/*******************************************************************/
-/* */
-/* LoadChar: */
-/* */
-/* Loads a glyph into memory. */
-/* */
-/*******************************************************************/
-
- FT_Error LoadChar( int idx )
- {
- FT_Glyph glyph;
-
- /* loads the glyph in the glyph slot */
- error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||
- FT_Get_Glyph ( face->glyph, &glyph );
- if ( !error )
- {
- glyphs[cur_glyph++] = glyph;
- }
- return error;
- }
-
-
-
-/*******************************************************************/
-/* */
-/* ConvertRaster: */
-/* */
-/* Performs scan conversion. */
-/* */
-/*******************************************************************/
-
- FT_Error ConvertRaster( int index )
- {
- FT_Glyph bitmap;
- FT_Error error;
-
- bitmap = glyphs[index];
- error = FT_Glyph_To_Bitmap( &bitmap,
- antialias ? ft_render_mode_normal
- : ft_render_mode_mono,
- 0,
- 0 );
- if (!error)
- FT_Done_Glyph( bitmap );
-
- return error;
- }
-
-
- static void Usage()
- {
- fprintf( stderr, "fttimer: simple performance timer -- part of the FreeType project\n" );
- fprintf( stderr, "-----------------------------------------------------------------\n\n" );
- fprintf( stderr, "Usage: fttimer [options] fontname[.ttf|.ttc]\n\n" );
- fprintf( stderr, "options:\n");
- fprintf( stderr, " -r : repeat count to be used (default is 1)\n" );
- fprintf( stderr, " -s : character pixel size (default is 600)\n" );
- fprintf( stderr, " -m : render monochrome glyphs (default is anti-aliased)\n" );
- fprintf( stderr, " -a : use smooth anti-aliaser\n" );
- fprintf( stderr, " -l : force low quality even at small sizes\n" );
- exit(1);
- }
-
-
- int main( int argc, char** argv )
- {
- int i, total, base, rendered_glyphs;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
-
- long t, t0, tz0;
-
-
- execname = argv[0];
-
- antialias = 1;
- force_low = 0;
-
- while ( argc > 1 && argv[1][0] == '-' )
- {
- switch ( argv[1][1] )
- {
- case 'm':
- antialias = 0;
- break;
-
- case 'l':
- force_low = 1;
- break;
-
- case 's':
- argc--;
- argv++;
- if ( argc < 2 ||
- sscanf( argv[1], "%d", &pixel_size ) != 1 )
- Usage();
- break;
-
- case 'r':
- argc--;
- argv++;
- if ( argc < 2 ||
- sscanf( argv[1], "%d", &repeat_count ) != 1 )
- Usage();
- if (repeat_count < 1)
- repeat_count = 1;
- break;
-
- default:
- fprintf( stderr, "Unknown argument '%s'!\n", argv[1] );
- Usage();
- }
- argc--;
- argv++;
- }
-
- if ( argc != 2 )
- Usage();
-
- i = strlen( argv[1] );
- while ( i > 0 && argv[1][i] != '\\' )
- {
- if ( argv[1][i] == '.' )
- i = 0;
- i--;
- }
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, argv[1], 128 );
- strncpy( alt_filename, argv[1], 128 );
-
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-
- /* Initialize engine */
-
- if ( (error = FT_Init_FreeType( &library )) )
- Panic( "Error while initializing engine" );
-
- /* Load face */
-
- error = FT_New_Face( library, filename, 0, &face );
- if ( error == FT_Err_Cannot_Open_Stream )
- Panic( "Could not find/open font resource" );
- else if ( error )
- Panic( "Error while opening font resource" );
-
- /* get face properties and allocate preload arrays */
-
- num_glyphs = face->num_glyphs;
-
- tab_glyphs = MAX_GLYPHS;
- if ( tab_glyphs > num_glyphs )
- tab_glyphs = num_glyphs;
-
- /* create size */
-
- error = FT_Set_Pixel_Sizes( face, pixel_size, pixel_size );
- if ( error ) Panic( "Could not reset instance" );
-
- Num = 0;
- Fail = 0;
-
- total = num_glyphs;
- base = 0;
-
- rendered_glyphs = 0;
-
- t0 = 0; /* Initial time */
-
- tz0 = Get_Time();
-
- while ( total > 0 )
- {
- int repeat;
-
- /* First, preload 'tab_glyphs' in memory */
- cur_glyph = 0;
-
- printf( "loading %d glyphs", tab_glyphs );
-
- for ( Num = 0; Num < tab_glyphs; Num++ )
- {
- error = LoadChar( base + Num );
- if ( error )
- Fail++;
-
- total--;
- }
-
- base += tab_glyphs;
-
- if ( tab_glyphs > total )
- tab_glyphs = total;
-
- printf( ", rendering... " );
-
- /* Now, render the loaded glyphs */
-
- t = Get_Time();
-
- for ( repeat = 0; repeat < repeat_count; repeat++ )
- {
- for ( Num = 0; Num < cur_glyph; Num++ )
- {
- if ( (error = ConvertRaster( Num )) )
- Fail++;
-
- else
- {
- rendered_glyphs ++;
- }
- }
- }
-
- t = Get_Time() - t;
- if ( t < 0 )
- t += 1000 * 60 * 60;
-
- printf( " = %f s\n", (double)t / 10000 );
- t0 += t;
-
- /* Now free all loaded outlines */
- for ( Num = 0; Num < cur_glyph; Num++ )
- FT_Done_Glyph( glyphs[Num] );
- }
-
- tz0 = Get_Time() - tz0;
-
- FT_Done_Face( face );
-
- printf( "\n" );
- printf( "rendered glyphs = %d\n", rendered_glyphs );
- printf( "render time = %f s\n", (double)t0 / 10000 );
- printf( "fails = %d\n", Fail );
- printf( "average glyphs/s = %f\n",
- (double)rendered_glyphs / t0 * 10000 );
-
- printf( "total timing = %f s\n", (double)tz0 / 10000 );
- printf( "Fails = %d\n", Fail );
-
- FT_Done_FreeType( library );
-
- exit( 0 ); /* for safety reasons */
-
- return 0; /* never reached */
- }
-
-
-/* End */
--- a/demos/src/fttry.c
+++ /dev/null
@@ -1,155 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-1998 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* ftlint: a simple TrueType instruction tester. */
-/* */
-/* NOTE: This is just a test program that is used to show off and */
-/* debug the current engine. */
-/* */
-/****************************************************************************/
-
-#include "freetype.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#define gettext( x ) ( x )
-
- FT_Error error;
-
- FT_Library library;
- FT_Face face;
-
- unsigned int num_glyphs;
- int ptsize;
-
- int Fail;
- int Num;
-
-
-
- static void Usage( char* name )
- {
- printf( "fttry: simple TrueType instruction tester -- part of the FreeType project\n" );
- printf( "--------------------------------------------------------------------------\n" );
- printf( "\n" );
- printf( "Usage: %s ppem glyph fontname [fontname2..]\n\n", name );
- printf( " or %s -u glyph fontname [fontname2..]\n", name );
- printf( " to load an unscaled glyph\n\n" );
-
- exit( 1 );
- }
-
-
- static void Panic( const char* message )
- {
- fprintf( stderr, "%s\n error code = 0x%04x\n", message, error );
- exit(1);
- }
-
- int main( int argc, char** argv )
- {
- int i, file_index, glyph_index;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- char* fname;
- int load_unscaled = 0;
-
- execname = argv[0];
-
- if ( argc < 3 )
- Usage( execname );
-
- if ( argv[1][0] == '-' &&
- argv[1][1] == 'u' )
- {
- load_unscaled = 1;
- }
- else
- {
- if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
- Usage( execname );
- }
- argc--;
- argv++;
-
- if ( sscanf( argv[1], "%d", &glyph_index ) != 1 )
- Usage( execname );
-
- error = FT_Init_FreeType( &library );
- if (error) Panic( "Could not create library object" );
-
- /* Now check all files */
- for ( file_index = 2; file_index < argc; file_index++ )
- {
- fname = argv[file_index];
- i = strlen( fname );
- while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
- {
- if ( fname[i] == '.' )
- i = 0;
- i--;
- }
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, fname, 128 );
- strncpy( alt_filename, fname, 128 );
-
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-
- i = strlen( filename );
- fname = filename;
-
- while ( i >= 0 )
- if ( filename[i] == '/' || filename[i] == '\\' )
- {
- fname = filename + i + 1;
- i = -1;
- }
- else
- i--;
-
- printf( "%s: ", fname );
-
- /* Load face */
- error = FT_New_Face( library, filename, 0, &face );
- if (error) Panic( "Could not create face object" );
-
- num_glyphs = face->num_glyphs;
-
- error = FT_Set_Char_Size( face, ptsize << 6, 0, 0, 0 );
- if (error) Panic( "Could not set character size" );
-
- error = FT_Load_Glyph( face,
- glyph_index,
- load_unscaled ? FT_LOAD_NO_SCALE
- : FT_LOAD_DEFAULT );
- if ( error == 0 )
- printf( "OK.\n" );
- else
- printf( "Fail with error 0x%04x\n", error );
-
- FT_Done_Face( face );
- }
-
- FT_Done_FreeType(library);
- exit( 0 ); /* for safety reasons */
-
- return 0; /* never reached */
- }
-
-
-/* End */
--- a/demos/src/ftview.c
+++ /dev/null
@@ -1,776 +1,0 @@
-/****************************************************************************/
-/* */
-/* The FreeType project -- a free and portable quality TrueType renderer. */
-/* */
-/* Copyright 1996-2000 by */
-/* D. Turner, R.Wilhelm, and W. Lemberg */
-/* */
-/* */
-/* FTView - a simple font viewer. */
-/* */
-/* This is a new version using the MiGS graphics subsystem for */
-/* blitting and display. */
-/* */
-/* Press F1 when running this program to have a list of key-bindings */
-/* */
-/****************************************************************************/
-
-
-#include <freetype/freetype.h>
-
- /* the following header shouldn't be used in normal programs */
-#include <freetype/internal/ftdebug.h>
-
-#include "common.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "graph.h"
-#include "grfont.h"
-
-#define DIM_X 500
-#define DIM_Y 400
-
-#define CENTER_X ( bit.width / 2 )
-#define CENTER_Y ( bit.rows / 2 )
-
-#define MAXPTSIZE 500 /* dtp */
-
-
- char Header[128];
- char* new_header = 0;
-
- const unsigned char* Text = (unsigned char*)
- "The quick brown fox jumped over the lazy dog 0123456789 "
- "\342\352\356\373\364\344\353\357\366\374\377\340\371\351\350\347 "
- "&#~\"\'(-`_^@)=+\260 ABCDEFGHIJKLMNOPQRSTUVWXYZ "
- "$\243^\250*\265\371%!\247:/;.,?<>";
-
- FT_Library library; /* the FreeType library */
- FT_Face face; /* the font face */
- FT_Size size; /* the font size */
- FT_GlyphSlot glyph; /* the glyph slot */
-
- FT_Error error; /* error code returned by FreeType */
-
- grSurface* surface; /* current display surface */
- grBitmap bit; /* current display bitmap */
-
- int num_glyphs; /* number of glyphs */
- int ptsize; /* current point size */
-
- int hinted = 1; /* is glyph hinting active? */
- int antialias = 1; /* is anti-aliasing active? */
- int use_sbits = 1; /* do we use embedded bitmaps? */
- int low_prec = 0; /* force low precision */
- int Num; /* current first glyph index */
-
- int res = 72;
-
- static grColor fore_color = { 255 };
-
- int Fail;
-
- int graph_init = 0;
-
- int render_mode = 1;
- int debug = 0;
- int trace_level = 0;
-
-
-#define RASTER_BUFF_SIZE 32768
- char raster_buff[RASTER_BUFF_SIZE];
-
-
-#define LOG( x ) LogMessage##x
-
- static
- void LogMessage( const char* fmt, ... )
- {
- va_list ap;
-
-
- va_start( ap, fmt );
- vfprintf( stderr, fmt, ap );
- va_end( ap );
- }
-
-
- /* PanicZ */
- static
- void PanicZ( const char* message )
- {
- fprintf( stderr, "%s\n error = 0x%04x\n", message, error );
- exit( 1 );
- }
-
-
- /* Clears the Bit bitmap/pixmap */
- static
- void Clear_Display( void )
- {
- long size = (long)bit.pitch * bit.rows;
-
-
- if ( size < 0 )
- size = -size;
- memset( bit.buffer, 0, size );
- }
-
-
- /* Initialize the display bitmap `bit' */
- static
- void Init_Display( void )
- {
- grInitDevices();
-
- bit.mode = gr_pixel_mode_gray;
- bit.width = DIM_X;
- bit.rows = DIM_Y;
- bit.grays = 256;
-
- surface = grNewSurface( 0, &bit );
- if ( !surface )
- PanicZ( "could not allocate display surface\n" );
-
- graph_init = 1;
- }
-
-
-#define MAX_BUFFER 300000
-
-#define FLOOR( x ) ( (x) & -64 )
-#define CEIL( x ) ( ( (x) + 63 ) & -64 )
-#define TRUNC( x ) ( (x) >> 6 )
-
-
- /* Render a single glyph with the `grays' component */
- static
- FT_Error Render_Glyph( int x_offset,
- int y_offset )
- {
- grBitmap bit3;
- FT_Pos x_top, y_top;
-
- /* first, render the glyph image into a bitmap */
- if (glyph->format != ft_glyph_format_bitmap)
- {
- error = FT_Render_Glyph( glyph, antialias ? ft_render_mode_normal : ft_render_mode_mono );
- if (error) return error;
-
- }
-
- /* now blit it to our display screen */
- bit3.rows = glyph->bitmap.rows;
- bit3.width = glyph->bitmap.width;
- bit3.pitch = glyph->bitmap.pitch;
- bit3.buffer = glyph->bitmap.buffer;
-
- switch (glyph->bitmap.pixel_mode)
- {
- case ft_pixel_mode_mono:
- bit3.mode = gr_pixel_mode_mono;
- bit3.grays = 0;
- break;
-
- case ft_pixel_mode_grays:
- bit3.mode = gr_pixel_mode_gray;
- bit3.grays = glyph->bitmap.num_grays;
- }
-
- /* Then, blit the image to the target surface */
- x_top = x_offset + glyph->bitmap_left;
- y_top = y_offset - glyph->bitmap_top;
-
- grBlitGlyphToBitmap( &bit, &bit3, x_top, y_top, fore_color );
-
- return 0;
- }
-
-
- static
- FT_Error Reset_Scale( int pointSize )
- {
- FT_Error error;
-
-
- error = FT_Set_Char_Size( face, pointSize << 6,
- pointSize << 6,
- res,
- res );
- if ( error )
- {
- /* to be written */
- }
-
- return FT_Err_Ok;
- }
-
-
- static
- FT_Error LoadChar( int idx,
- int hint )
- {
- int flags;
-
-
- flags = FT_LOAD_DEFAULT;
-
- if ( !hint )
- flags |= FT_LOAD_NO_HINTING;
-
- if ( !use_sbits )
- flags |= FT_LOAD_NO_BITMAP;
-
- return FT_Load_Glyph( face, idx, flags );
- }
-
-
- static
- FT_Error Render_All( int first_glyph,
- int ptsize )
- {
- FT_F26Dot6 start_x, start_y, step_x, step_y, x, y;
- int i;
-
- FT_Error error;
-
-
- start_x = 4;
- start_y = 16 + ptsize ;
-
- step_x = size->metrics.x_ppem + 4;
- step_y = size->metrics.y_ppem + 10;
-
- x = start_x;
- y = start_y;
-
- i = first_glyph;
-
-#if 0
- while ( i < first_glyph + 1 )
-#else
- while ( i < num_glyphs )
-#endif
- {
- if ( !( error = LoadChar( i, hinted ) ) )
- {
- if ( debug && trace_level > 1 )
- {
- if ( i <= first_glyph + 6 )
- {
- LOG(( "metrics[%02d] = [%x %x]\n",
- i,
- glyph->metrics.horiBearingX,
- glyph->metrics.horiAdvance ));
-
- if ( i == first_glyph + 6 )
- LOG(( "-------------------------\n" ));
- }
- }
-
- Render_Glyph( x, y );
-
- x += ( glyph->metrics.horiAdvance >> 6 ) + 1;
-
- if ( x + size->metrics.x_ppem > bit.width )
- {
- x = start_x;
- y += step_y;
-
- if ( y >= bit.rows )
- return FT_Err_Ok;
- }
- }
- else
- Fail++;
-
- i++;
- }
-
- return FT_Err_Ok;
- }
-
-
- static
- FT_Error Render_Text( int first_glyph,
- int ptsize )
- {
- FT_F26Dot6 start_x, start_y, step_x, step_y, x, y;
- int i;
-
- FT_Error error;
- const unsigned char* p;
-
-
- start_x = 4;
- start_y = 12 + size->metrics.y_ppem;
-
- step_x = size->metrics.x_ppem + 4;
- step_y = size->metrics.y_ppem + 10;
-
- x = start_x;
- y = start_y;
-
- i = first_glyph;
- p = Text;
- while ( i > 0 && *p )
- {
- p++;
- i--;
- }
-
- while ( *p )
- {
- if ( !( error = LoadChar( FT_Get_Char_Index( face,
- (unsigned char)*p ),
- hinted ) ) )
- {
- if ( debug && trace_level > 1 )
- {
- if ( i <= first_glyph + 6 )
- {
- LOG(( "metrics[%02d] = [%x %x]\n",
- i,
- glyph->metrics.horiBearingX,
- glyph->metrics.horiAdvance ));
-
- if ( i == first_glyph + 6 )
- LOG(( "-------------------------\n" ));
- }
- }
-
- Render_Glyph( x, y );
-
- x += ( glyph->metrics.horiAdvance >> 6 ) + 1;
-
- if ( x + size->metrics.x_ppem > bit.width )
- {
- x = start_x;
- y += step_y;
-
- if ( y >= bit.rows )
- return FT_Err_Ok;
- }
- }
- else
- Fail++;
-
- i++;
- p++;
- }
-
- return FT_Err_Ok;
- }
-
-
- static
- void Help( void )
- {
- grEvent dummy_event;
-
-
- Clear_Display();
- grGotoxy( 0, 0 );
- grSetMargin( 2, 1 );
- grGotobitmap( &bit );
-
- grWriteln("FreeType Glyph Viewer - part of the FreeType test suite" );
- grLn();
- grWriteln("This program is used to display all glyphs from one or" );
- grWriteln("several font files, with the FreeType library.");
- grLn();
- grWriteln("Use the following keys :");
- grLn();
- grWriteln(" F1 or ? : display this help screen" );
- grWriteln(" a : toggle anti-aliasing" );
- grWriteln(" h : toggle outline hinting" );
- grWriteln(" b : toggle embedded bitmaps" );
- grWriteln(" l : toggle low precision rendering" );
- grWriteln(" space : toggle rendering mode" );
- grLn();
- grWriteln(" Up : increase pointsize by 1 unit" );
- grWriteln(" Down : decrease pointsize by 1 unit" );
- grWriteln(" Page Up : increase pointsize by 10 units" );
- grWriteln(" Page Down : decrease pointsize by 10 units" );
- grLn();
- grWriteln(" Right : increment first glyph index" );
- grWriteln(" Left : decrement first glyph index" );
- grLn();
- grWriteln(" F7 : decrement first glyph index by 10" );
- grWriteln(" F8 : increment first glyph index by 10" );
- grWriteln(" F9 : decrement first glyph index by 100");
- grWriteln(" F10 : increment first glyph index by 100");
- grWriteln(" F11 : decrement first glyph index by 1000");
- grWriteln(" F12 : increment first glyph index by 1000");
- grLn();
- grWriteln("press any key to exit this help screen");
-
- grRefreshSurface( surface );
- grListenSurface( surface, gr_event_key, &dummy_event );
- }
-
-
-
- static
- int Process_Event( grEvent* event )
- {
- int i;
-
-
- switch ( event->key )
- {
- case grKeyEsc: /* ESC or q */
- case grKEY( 'q' ):
- return 0;
-
- case grKEY( 'a' ):
- antialias = !antialias;
- new_header = antialias ? "anti-aliasing is now on"
- : "anti-aliasing is now off";
- return 1;
-
- case grKEY( 'b' ):
- use_sbits = !use_sbits;
- new_header = use_sbits
- ? "embedded bitmaps are now used when available"
- : "embedded bitmaps are now ignored";
- return 1;
-
- case grKEY( 'n' ):
- case grKEY( 'p' ):
- return (int)event->key;
-
- case grKEY( 'l' ):
- low_prec = !low_prec;
- new_header = low_prec
- ? "rendering precision is now forced to low"
- : "rendering precision is now normal";
- break;
-
- case grKEY( 'h' ):
- hinted = !hinted;
- new_header = hinted ? "glyph hinting is now active"
- : "glyph hinting is now ignored";
- break;
-
- case grKEY( ' ' ):
- render_mode ^= 1;
- new_header = render_mode ? "rendering all glyphs in font"
- : "rendering test text string" ;
- break;
-
- case grKeyF1:
- case grKEY( '?' ):
- Help();
- return 1;
-
-#if 0
- case grKeyF3: i = 16; goto Do_Rotate;
- case grKeyF4: i = -16; goto Do_Rotate;
- case grKeyF5: i = 1; goto Do_Rotate;
- case grKeyF6: i = -1; goto Do_Rotate;
-#endif
-
- case grKeyPageUp: i = 10; goto Do_Scale;
- case grKeyPageDown: i = -10; goto Do_Scale;
- case grKeyUp: i = 1; goto Do_Scale;
- case grKeyDown: i = -1; goto Do_Scale;
-
- case grKeyLeft: i = -1; goto Do_Glyph;
- case grKeyRight: i = 1; goto Do_Glyph;
- case grKeyF7: i = -10; goto Do_Glyph;
- case grKeyF8: i = 10; goto Do_Glyph;
- case grKeyF9: i = -100; goto Do_Glyph;
- case grKeyF10: i = 100; goto Do_Glyph;
- case grKeyF11: i = -1000; goto Do_Glyph;
- case grKeyF12: i = 1000; goto Do_Glyph;
-
- default:
- ;
- }
- return 1;
-
-#if 0
- Do_Rotate:
- Rotation = ( Rotation + i ) & 1023;
- return 1;
-#endif
-
- Do_Scale:
- ptsize += i;
- if ( ptsize < 1 ) ptsize = 1;
- if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;
- return 1;
-
- Do_Glyph:
- Num += i;
- if ( Num < 0 ) Num = 0;
- if ( Num >= num_glyphs ) Num = num_glyphs - 1;
- return 1;
- }
-
-
- static
- void usage( char* execname )
- {
- fprintf( stderr, "\n" );
- fprintf( stderr, "ftview: simple glyph viewer -- part of the FreeType project\n" );
- fprintf( stderr, "-----------------------------------------------------------\n" );
- fprintf( stderr, "\n" );
- fprintf( stderr, "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n",
- execname );
- fprintf( stderr, "\n" );
- fprintf( stderr, " -d enable debugging messages\n" );
- fprintf( stderr, " -l N set debugging trace level to N (default: 0, max: 7)\n" );
- fprintf( stderr, " -r R use resolution R dpi (default: 72 dpi)\n" );
- fprintf( stderr, " -f index specify first glyph index to display\n" );
- fprintf( stderr, "\n" );
-
- exit( 1 );
- }
-
-
- int main( int argc,
- char* argv[] )
- {
- int i, old_ptsize, orig_ptsize, file;
- int first_glyph = 0;
- int XisSetup = 0;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- int option;
- int file_loaded;
-
- FT_Error error;
- grEvent event;
-
-
- execname = ft_basename( argv[0] );
-
- while ( 1 )
- {
- option = getopt( argc, argv, "df:l:r:" );
-
- if ( option == -1 )
- break;
-
- switch ( option )
- {
- case 'd':
- debug = 1;
- break;
-
- case 'f':
- first_glyph = atoi( optarg );
- break;
-
- case 'l':
- trace_level = atoi( optarg );
- if ( trace_level < 1 || trace_level > 7 )
- usage( execname );
- break;
-
- case 'r':
- res = atoi( optarg );
- if ( res < 1 )
- usage( execname );
- break;
-
- default:
- usage( execname );
- break;
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if ( argc <= 1 )
- usage( execname );
-
- if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )
- orig_ptsize = 64;
-
- file = 1;
-
- if ( debug )
- {
-#ifdef FT_DEBUG_LEVEL_TRACE
- FT_SetTraceLevel( trace_any, (FT_Byte)trace_level );
-#else
- trace_level = 0;
-#endif
- }
-
- /* Initialize engine */
- error = FT_Init_FreeType( &library );
- if ( error )
- PanicZ( "Could not initialize FreeType library" );
-
- NewFile:
- ptsize = orig_ptsize;
- hinted = 1;
- file_loaded = 0;
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, argv[file], 128 );
- strncpy( alt_filename, argv[file], 128 );
-
- /* try to load the file name as is, first */
- error = FT_New_Face( library, argv[file], 0, &face );
- if ( !error )
- goto Success;
-
-#ifndef macintosh
- i = strlen( argv[file] );
- while ( i > 0 && argv[file][i] != '\\' && argv[file][i] != '/' )
- {
- if ( argv[file][i] == '.' )
- i = 0;
- i--;
- }
-
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-#endif
-
- /* Load face */
- error = FT_New_Face( library, filename, 0, &face );
- if ( error )
- goto Display_Font;
-
- Success:
- file_loaded++;
-
- error = Reset_Scale( ptsize );
- if ( error )
- goto Display_Font;
-
- num_glyphs = face->num_glyphs;
- glyph = face->glyph;
- size = face->size;
-
- Display_Font:
- /* initialize graphics if needed */
- if ( !XisSetup )
- {
- XisSetup = 1;
- Init_Display();
- }
-
- grSetTitle( surface, "FreeType Glyph Viewer - press F1 for help" );
- old_ptsize = ptsize;
-
- if ( file_loaded >= 1 )
- {
- Fail = 0;
- Num = first_glyph;
-
- if ( Num >= num_glyphs )
- Num = num_glyphs - 1;
-
- if ( Num < 0 )
- Num = 0;
- }
-
- for ( ;; )
- {
- int key;
-
-
- Clear_Display();
-
- if ( file_loaded >= 1 )
- {
- switch ( render_mode )
- {
- case 0:
- Render_Text( Num, ptsize );
- break;
-
- default:
- Render_All( Num, ptsize );
- }
-
- sprintf( Header, "%s %s (file `%s')",
- face->family_name,
- face->style_name,
- ft_basename( filename ) );
-
- if ( !new_header )
- new_header = Header;
-
- grWriteCellString( &bit, 0, 0, new_header, fore_color );
- new_header = 0;
-
- sprintf( Header, "at %d points, first glyph = %d",
- ptsize,
- Num );
- }
- else
- sprintf( Header, "`%s': not a font file or could not be opened",
- ft_basename( filename ) );
-
- grWriteCellString( &bit, 0, 8, Header, fore_color );
- grRefreshSurface( surface );
-
- grListenSurface( surface, 0, &event );
- if ( !( key = Process_Event( &event ) ) )
- goto End;
-
- if ( key == 'n' )
- {
- if (file_loaded >= 1)
- FT_Done_Face( face );
-
- if ( file < argc - 1 )
- file++;
-
- goto NewFile;
- }
-
- if ( key == 'p' )
- {
- if ( file_loaded >= 1 )
- FT_Done_Face( face );
-
- if ( file > 1 )
- file--;
-
- goto NewFile;
- }
-
- if ( ptsize != old_ptsize )
- {
- if ( Reset_Scale( ptsize ) )
- PanicZ( "Could not resize font." );
-
- old_ptsize = ptsize;
- }
- }
-
- End:
-#if 0
- grDoneSurface(surface);
- grDone();
-#endif
-
- printf( "Execution completed successfully.\n" );
- printf( "Fails = %d\n", Fail );
-
- exit( 0 ); /* for safety reasons */
- return 0; /* never reached */
-}
-
-
-/* End */
--- a/demos/src/memtest.c
+++ /dev/null
@@ -1,333 +1,0 @@
-/* memtest.c */
-
-#include <freetype/freetype.h>
-#include <freetype/ftmodule.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
- FT_Error error;
-
- FT_Library library;
- FT_Face face;
-
- unsigned int num_glyphs;
- int ptsize;
-
- int Fail;
- int Num;
-
-
-
-
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-
-/* Our own memory allocator. To check that a single block isn't freed */
-/* several time, we simply do not call "free".. */
-
-#define MAX_RECORDED_BLOCKS 1638400
-#define CHECK_DUPLICATES
-
-typedef struct MyBlock
-{
- void* base;
- long size;
-
-} MyBlock;
-
-static MyBlock my_blocks[ MAX_RECORDED_BLOCKS ];
-static int num_my_blocks = 0;
-
-
-/* record a new block in the table, check for duplicates too */
-static
-void record_my_block( void* base, long size )
-{
- if (size <= 0)
- {
- fprintf( stderr, "adding a block with non-positive length - should not happen \n" );
- exit(1);
- }
-
- if ( num_my_blocks < MAX_RECORDED_BLOCKS )
- {
- MyBlock* block;
-
-#ifdef CHECK_DUPLICATES
- MyBlock* limit;
- block = my_blocks;
- limit = block + num_my_blocks;
- for ( ; block < limit; block++ )
- {
- if ( block->base == base && block->size != 0 )
- {
- fprintf( stderr, "duplicate memory block at %08lx\n", (long)block->base );
- exit(1);
- }
- }
-#endif
-
- block = my_blocks + num_my_blocks++;
- block->base = base;
- block->size = size;
- }
- else
- {
- fprintf( stderr, "Too many memory blocks -- test exited !!\n" );
- exit(1);
- }
-}
-
-/* forget a block, and check that it isn't part of our table already */
-static
-void forget_my_block( void* base )
-{
- MyBlock* block = my_blocks + num_my_blocks-1;
-
- /* we scan in reverse, because transient blocks are always located */
- /* at the end of the table.. (it supposedly faster then..) */
- for ( ; block >= my_blocks; block-- )
- {
- if ( block->base == base )
- {
- if (block->size > 0)
- {
- block->size = 0;
- return;
- }
- else
- {
- fprintf( stderr, "Block at %p released twice \n", base );
- exit(1);
- }
- }
- }
- fprintf( stderr, "Trying to release an unallocated block at %p\n",
- base );
- exit(1);
-}
-
-
-static
-void* my_alloc( FT_Memory memory,
- long size )
-{
- void* p = malloc(size);
- if (p)
- record_my_block(p,size);
-
- memory=memory;
- return p;
-}
-
-static
-void my_free( FT_Memory memory, void* block )
-{
- memory=memory;
- forget_my_block(block);
- /* free(block); WE DO NOT REALLY FREE THE BLOCK */
-}
-
-static
-void* my_realloc( FT_Memory memory,
- long cur_size,
- long new_size,
- void* block )
-{
- void* p;
-
- p = my_alloc( memory, new_size );
- if (p)
- {
- long size;
-
- size = cur_size;
- if (new_size < size)
- size = new_size;
-
- memcpy( p, block, size );
- my_free( memory, block );
- }
-
- return p;
-}
-
-
-struct FT_MemoryRec_ my_memory =
-{
- 0,
- my_alloc,
- my_free,
- my_realloc
-};
-
-static void dump_mem( void )
-{
- MyBlock* block = my_blocks + num_my_blocks-1;
- int bad = 0;
-
- printf( "total allocated blocks = %d\n", num_my_blocks );
-
- /* we scan in reverse, because transient blocks are always located */
- /* at the end of the table.. (it supposedly faster then..) */
- for ( ; block >= my_blocks; block-- )
- {
- if (block->size > 0)
- {
- fprintf( stderr, "%p (%6ld bytes) leaked !!\n", block->base, (long)block->size );
- bad = 1;
- }
- }
- if (!bad)
- fprintf( stderr, "no leaked memory block\n\n" );
-}
-
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-
-
- static void Usage( char* name )
- {
- printf( "memtest: simple memory tester -- part of the FreeType project\n" );
- printf( "-------------------------------------------------------------\n" );
- printf( "\n" );
- printf( "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n", name );
- printf( "\n" );
-
- exit( 1 );
- }
-
-
- static void Panic( const char* message )
- {
- fprintf( stderr, "%s\n error code = 0x%04x\n", message, error );
- exit(1);
- }
-
-
-int main( int argc, char** argv )
-{
- int i, file_index;
- unsigned int id;
- char filename[128 + 4];
- char alt_filename[128 + 4];
- char* execname;
- char* fname;
-
- execname = argv[0];
-
- if ( argc < 3 )
- Usage( execname );
-
- if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
- Usage( execname );
-
- /* Create a new library with our own memory manager */
- error = FT_New_Library( &my_memory, &library );
- if (error) Panic( "Could not create library object" );
-
- /* the new library has no drivers in it, add the default ones */
- /* (implemented in ftinit.c).. */
- FT_Add_Default_Modules(library);
-
-
- /* Now check all files */
- for ( file_index = 2; file_index < argc; file_index++ )
- {
- fname = argv[file_index];
- i = strlen( fname );
- while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
- {
- if ( fname[i] == '.' )
- i = 0;
- i--;
- }
-
- filename[128] = '\0';
- alt_filename[128] = '\0';
-
- strncpy( filename, fname, 128 );
- strncpy( alt_filename, fname, 128 );
-
-#ifndef macintosh
- if ( i >= 0 )
- {
- strncpy( filename + strlen( filename ), ".ttf", 4 );
- strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
- }
-#endif
- i = strlen( filename );
- fname = filename;
-
- while ( i >= 0 )
-#ifndef macintosh
- if ( filename[i] == '/' || filename[i] == '\\' )
-#else
- if ( filename[i] == ':' )
-#endif
- {
- fname = filename + i + 1;
- i = -1;
- }
- else
- i--;
-
- printf( "%s: ", fname );
-
- /* Load face */
- error = FT_New_Face( library, filename, 0, &face );
- if (error)
- {
- if (error == FT_Err_Invalid_File_Format)
- printf( "unknown format\n" );
- else
- printf( "could not find/open file (error: %d)\n", error );
- continue;
- }
- if (error) Panic( "Could not open file" );
-
- num_glyphs = face->num_glyphs;
-
- error = FT_Set_Char_Size( face, ptsize << 6, ptsize << 6, 72, 72 );
- if (error) Panic( "Could not set character size" );
-
- Fail = 0;
- {
- for ( id = 0; id < num_glyphs; id++ )
- {
- error = FT_Load_Glyph( face, id, FT_LOAD_RENDER | FT_LOAD_ANTI_ALIAS );
- if (error)
- {
- if ( Fail < 10 )
- printf( "glyph %4u: 0x%04x\n" , id, error );
- Fail++;
- }
- }
- }
-
- if ( Fail == 0 )
- printf( "OK.\n" );
- else
- if ( Fail == 1 )
- printf( "1 fail.\n" );
- else
- printf( "%d fails.\n", Fail );
-
- FT_Done_Face( face );
- }
-
- FT_Done_FreeType(library);
-
- dump_mem();
-
- exit( 0 ); /* for safety reasons */
- return 0; /* never reached */
-}
-
-
-
--- a/demos/src/ttdebug.c
+++ /dev/null
@@ -1,1260 +1,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifdef UNIX
-#ifndef HAVE_POSIX_TERMIOS
-#include <sys/ioctl.h>
-#include <termio.h>
-#else
-#ifndef HAVE_TCGETATTR
-#define HAVE_TCGETATTR
-#endif /* HAVE_TCGETATTR */
-#ifndef HAVE_TCSETATTR
-#define HAVE_TCSETATTR
-#endif /* HAVE_TCSETATTR */
-#include <termios.h>
-#endif /* HAVE_POSIX_TERMIOS */
-#endif
-
-/* Define the `getch()' function. On Unix systems, it is an alias */
-/* for `getchar()', and the debugger front end must ensure that the */
-/* `stdin' file descriptor is not in line-by-line input mode. */
-#ifndef UNIX
-#include <conio.h>
-#else
-#define getch getchar
-#endif
-
-
-#include <freetype/freetype.h>
-#include <truetype/ttobjs.h>
-#include <truetype/ttdriver.h>
-#include <truetype/ttinterp.h>
-
-
-FT_Library library; /* root library object */
-FT_Memory memory; /* system object */
-FT_Driver driver; /* truetype driver */
-TT_Face face; /* truetype face */
-TT_Size size; /* truetype size */
-TT_GlyphSlot glyph; /* truetype glyph slot */
-TT_ExecContext exec; /* truetype execution context */
-FT_Error error;
-
-TT_CodeRange_Tag debug_coderange = tt_coderange_glyph;
-
- typedef FT_Byte ByteStr[2];
- typedef FT_Byte WordStr[4];
- typedef FT_Byte LongStr[8];
- typedef FT_Byte DebugStr[128];
-
- static DebugStr tempStr;
-
-#undef PACK
-#define PACK( x, y ) ((x << 4) | y)
-
- static const FT_Byte Pop_Push_Count[256] =
- {
- /* opcodes are gathered in groups of 16 */
- /* please keep the spaces as they are */
-
- /* SVTCA y */ PACK( 0, 0 ),
- /* SVTCA x */ PACK( 0, 0 ),
- /* SPvTCA y */ PACK( 0, 0 ),
- /* SPvTCA x */ PACK( 0, 0 ),
- /* SFvTCA y */ PACK( 0, 0 ),
- /* SFvTCA x */ PACK( 0, 0 ),
- /* SPvTL // */ PACK( 2, 0 ),
- /* SPvTL + */ PACK( 2, 0 ),
- /* SFvTL // */ PACK( 2, 0 ),
- /* SFvTL + */ PACK( 2, 0 ),
- /* SPvFS */ PACK( 2, 0 ),
- /* SFvFS */ PACK( 2, 0 ),
- /* GPV */ PACK( 0, 2 ),
- /* GFV */ PACK( 0, 2 ),
- /* SFvTPv */ PACK( 0, 0 ),
- /* ISECT */ PACK( 5, 0 ),
-
- /* SRP0 */ PACK( 1, 0 ),
- /* SRP1 */ PACK( 1, 0 ),
- /* SRP2 */ PACK( 1, 0 ),
- /* SZP0 */ PACK( 1, 0 ),
- /* SZP1 */ PACK( 1, 0 ),
- /* SZP2 */ PACK( 1, 0 ),
- /* SZPS */ PACK( 1, 0 ),
- /* SLOOP */ PACK( 1, 0 ),
- /* RTG */ PACK( 0, 0 ),
- /* RTHG */ PACK( 0, 0 ),
- /* SMD */ PACK( 1, 0 ),
- /* ELSE */ PACK( 0, 0 ),
- /* JMPR */ PACK( 1, 0 ),
- /* SCvTCi */ PACK( 1, 0 ),
- /* SSwCi */ PACK( 1, 0 ),
- /* SSW */ PACK( 1, 0 ),
-
- /* DUP */ PACK( 1, 2 ),
- /* POP */ PACK( 1, 0 ),
- /* CLEAR */ PACK( 0, 0 ),
- /* SWAP */ PACK( 2, 2 ),
- /* DEPTH */ PACK( 0, 1 ),
- /* CINDEX */ PACK( 1, 1 ),
- /* MINDEX */ PACK( 1, 0 ),
- /* AlignPTS */ PACK( 2, 0 ),
- /* INS_$28 */ PACK( 0, 0 ),
- /* UTP */ PACK( 1, 0 ),
- /* LOOPCALL */ PACK( 2, 0 ),
- /* CALL */ PACK( 1, 0 ),
- /* FDEF */ PACK( 1, 0 ),
- /* ENDF */ PACK( 0, 0 ),
- /* MDAP[0] */ PACK( 1, 0 ),
- /* MDAP[1] */ PACK( 1, 0 ),
-
- /* IUP[0] */ PACK( 0, 0 ),
- /* IUP[1] */ PACK( 0, 0 ),
- /* SHP[0] */ PACK( 0, 0 ),
- /* SHP[1] */ PACK( 0, 0 ),
- /* SHC[0] */ PACK( 1, 0 ),
- /* SHC[1] */ PACK( 1, 0 ),
- /* SHZ[0] */ PACK( 1, 0 ),
- /* SHZ[1] */ PACK( 1, 0 ),
- /* SHPIX */ PACK( 1, 0 ),
- /* IP */ PACK( 0, 0 ),
- /* MSIRP[0] */ PACK( 2, 0 ),
- /* MSIRP[1] */ PACK( 2, 0 ),
- /* AlignRP */ PACK( 0, 0 ),
- /* RTDG */ PACK( 0, 0 ),
- /* MIAP[0] */ PACK( 2, 0 ),
- /* MIAP[1] */ PACK( 2, 0 ),
-
- /* NPushB */ PACK( 0, 0 ),
- /* NPushW */ PACK( 0, 0 ),
- /* WS */ PACK( 2, 0 ),
- /* RS */ PACK( 1, 1 ),
- /* WCvtP */ PACK( 2, 0 ),
- /* RCvt */ PACK( 1, 1 ),
- /* GC[0] */ PACK( 1, 1 ),
- /* GC[1] */ PACK( 1, 1 ),
- /* SCFS */ PACK( 2, 0 ),
- /* MD[0] */ PACK( 2, 1 ),
- /* MD[1] */ PACK( 2, 1 ),
- /* MPPEM */ PACK( 0, 1 ),
- /* MPS */ PACK( 0, 1 ),
- /* FlipON */ PACK( 0, 0 ),
- /* FlipOFF */ PACK( 0, 0 ),
- /* DEBUG */ PACK( 1, 0 ),
-
- /* LT */ PACK( 2, 1 ),
- /* LTEQ */ PACK( 2, 1 ),
- /* GT */ PACK( 2, 1 ),
- /* GTEQ */ PACK( 2, 1 ),
- /* EQ */ PACK( 2, 1 ),
- /* NEQ */ PACK( 2, 1 ),
- /* ODD */ PACK( 1, 1 ),
- /* EVEN */ PACK( 1, 1 ),
- /* IF */ PACK( 1, 0 ),
- /* EIF */ PACK( 0, 0 ),
- /* AND */ PACK( 2, 1 ),
- /* OR */ PACK( 2, 1 ),
- /* NOT */ PACK( 1, 1 ),
- /* DeltaP1 */ PACK( 1, 0 ),
- /* SDB */ PACK( 1, 0 ),
- /* SDS */ PACK( 1, 0 ),
-
- /* ADD */ PACK( 2, 1 ),
- /* SUB */ PACK( 2, 1 ),
- /* DIV */ PACK( 2, 1 ),
- /* MUL */ PACK( 2, 1 ),
- /* ABS */ PACK( 1, 1 ),
- /* NEG */ PACK( 1, 1 ),
- /* FLOOR */ PACK( 1, 1 ),
- /* CEILING */ PACK( 1, 1 ),
- /* ROUND[0] */ PACK( 1, 1 ),
- /* ROUND[1] */ PACK( 1, 1 ),
- /* ROUND[2] */ PACK( 1, 1 ),
- /* ROUND[3] */ PACK( 1, 1 ),
- /* NROUND[0] */ PACK( 1, 1 ),
- /* NROUND[1] */ PACK( 1, 1 ),
- /* NROUND[2] */ PACK( 1, 1 ),
- /* NROUND[3] */ PACK( 1, 1 ),
-
- /* WCvtF */ PACK( 2, 0 ),
- /* DeltaP2 */ PACK( 1, 0 ),
- /* DeltaP3 */ PACK( 1, 0 ),
- /* DeltaCn[0] */ PACK( 1, 0 ),
- /* DeltaCn[1] */ PACK( 1, 0 ),
- /* DeltaCn[2] */ PACK( 1, 0 ),
- /* SROUND */ PACK( 1, 0 ),
- /* S45Round */ PACK( 1, 0 ),
- /* JROT */ PACK( 2, 0 ),
- /* JROF */ PACK( 2, 0 ),
- /* ROFF */ PACK( 0, 0 ),
- /* INS_$7B */ PACK( 0, 0 ),
- /* RUTG */ PACK( 0, 0 ),
- /* RDTG */ PACK( 0, 0 ),
- /* SANGW */ PACK( 1, 0 ),
- /* AA */ PACK( 1, 0 ),
-
- /* FlipPT */ PACK( 0, 0 ),
- /* FlipRgON */ PACK( 2, 0 ),
- /* FlipRgOFF */ PACK( 2, 0 ),
- /* INS_$83 */ PACK( 0, 0 ),
- /* INS_$84 */ PACK( 0, 0 ),
- /* ScanCTRL */ PACK( 1, 0 ),
- /* SDVPTL[0] */ PACK( 2, 0 ),
- /* SDVPTL[1] */ PACK( 2, 0 ),
- /* GetINFO */ PACK( 1, 1 ),
- /* IDEF */ PACK( 1, 0 ),
- /* ROLL */ PACK( 3, 3 ),
- /* MAX */ PACK( 2, 1 ),
- /* MIN */ PACK( 2, 1 ),
- /* ScanTYPE */ PACK( 1, 0 ),
- /* InstCTRL */ PACK( 2, 0 ),
- /* INS_$8F */ PACK( 0, 0 ),
-
- /* INS_$90 */ PACK( 0, 0 ),
- /* INS_$91 */ PACK( 0, 0 ),
- /* INS_$92 */ PACK( 0, 0 ),
- /* INS_$93 */ PACK( 0, 0 ),
- /* INS_$94 */ PACK( 0, 0 ),
- /* INS_$95 */ PACK( 0, 0 ),
- /* INS_$96 */ PACK( 0, 0 ),
- /* INS_$97 */ PACK( 0, 0 ),
- /* INS_$98 */ PACK( 0, 0 ),
- /* INS_$99 */ PACK( 0, 0 ),
- /* INS_$9A */ PACK( 0, 0 ),
- /* INS_$9B */ PACK( 0, 0 ),
- /* INS_$9C */ PACK( 0, 0 ),
- /* INS_$9D */ PACK( 0, 0 ),
- /* INS_$9E */ PACK( 0, 0 ),
- /* INS_$9F */ PACK( 0, 0 ),
-
- /* INS_$A0 */ PACK( 0, 0 ),
- /* INS_$A1 */ PACK( 0, 0 ),
- /* INS_$A2 */ PACK( 0, 0 ),
- /* INS_$A3 */ PACK( 0, 0 ),
- /* INS_$A4 */ PACK( 0, 0 ),
- /* INS_$A5 */ PACK( 0, 0 ),
- /* INS_$A6 */ PACK( 0, 0 ),
- /* INS_$A7 */ PACK( 0, 0 ),
- /* INS_$A8 */ PACK( 0, 0 ),
- /* INS_$A9 */ PACK( 0, 0 ),
- /* INS_$AA */ PACK( 0, 0 ),
- /* INS_$AB */ PACK( 0, 0 ),
- /* INS_$AC */ PACK( 0, 0 ),
- /* INS_$AD */ PACK( 0, 0 ),
- /* INS_$AE */ PACK( 0, 0 ),
- /* INS_$AF */ PACK( 0, 0 ),
-
- /* PushB[0] */ PACK( 0, 1 ),
- /* PushB[1] */ PACK( 0, 2 ),
- /* PushB[2] */ PACK( 0, 3 ),
- /* PushB[3] */ PACK( 0, 4 ),
- /* PushB[4] */ PACK( 0, 5 ),
- /* PushB[5] */ PACK( 0, 6 ),
- /* PushB[6] */ PACK( 0, 7 ),
- /* PushB[7] */ PACK( 0, 8 ),
- /* PushW[0] */ PACK( 0, 1 ),
- /* PushW[1] */ PACK( 0, 2 ),
- /* PushW[2] */ PACK( 0, 3 ),
- /* PushW[3] */ PACK( 0, 4 ),
- /* PushW[4] */ PACK( 0, 5 ),
- /* PushW[5] */ PACK( 0, 6 ),
- /* PushW[6] */ PACK( 0, 7 ),
- /* PushW[7] */ PACK( 0, 8 ),
-
- /* MDRP[00] */ PACK( 1, 0 ),
- /* MDRP[01] */ PACK( 1, 0 ),
- /* MDRP[02] */ PACK( 1, 0 ),
- /* MDRP[03] */ PACK( 1, 0 ),
- /* MDRP[04] */ PACK( 1, 0 ),
- /* MDRP[05] */ PACK( 1, 0 ),
- /* MDRP[06] */ PACK( 1, 0 ),
- /* MDRP[07] */ PACK( 1, 0 ),
- /* MDRP[08] */ PACK( 1, 0 ),
- /* MDRP[09] */ PACK( 1, 0 ),
- /* MDRP[10] */ PACK( 1, 0 ),
- /* MDRP[11] */ PACK( 1, 0 ),
- /* MDRP[12] */ PACK( 1, 0 ),
- /* MDRP[13] */ PACK( 1, 0 ),
- /* MDRP[14] */ PACK( 1, 0 ),
- /* MDRP[15] */ PACK( 1, 0 ),
-
- /* MDRP[16] */ PACK( 1, 0 ),
- /* MDRP[17] */ PACK( 1, 0 ),
- /* MDRP[18] */ PACK( 1, 0 ),
- /* MDRP[19] */ PACK( 1, 0 ),
- /* MDRP[20] */ PACK( 1, 0 ),
- /* MDRP[21] */ PACK( 1, 0 ),
- /* MDRP[22] */ PACK( 1, 0 ),
- /* MDRP[23] */ PACK( 1, 0 ),
- /* MDRP[24] */ PACK( 1, 0 ),
- /* MDRP[25] */ PACK( 1, 0 ),
- /* MDRP[26] */ PACK( 1, 0 ),
- /* MDRP[27] */ PACK( 1, 0 ),
- /* MDRP[28] */ PACK( 1, 0 ),
- /* MDRP[29] */ PACK( 1, 0 ),
- /* MDRP[30] */ PACK( 1, 0 ),
- /* MDRP[31] */ PACK( 1, 0 ),
-
- /* MIRP[00] */ PACK( 2, 0 ),
- /* MIRP[01] */ PACK( 2, 0 ),
- /* MIRP[02] */ PACK( 2, 0 ),
- /* MIRP[03] */ PACK( 2, 0 ),
- /* MIRP[04] */ PACK( 2, 0 ),
- /* MIRP[05] */ PACK( 2, 0 ),
- /* MIRP[06] */ PACK( 2, 0 ),
- /* MIRP[07] */ PACK( 2, 0 ),
- /* MIRP[08] */ PACK( 2, 0 ),
- /* MIRP[09] */ PACK( 2, 0 ),
- /* MIRP[10] */ PACK( 2, 0 ),
- /* MIRP[11] */ PACK( 2, 0 ),
- /* MIRP[12] */ PACK( 2, 0 ),
- /* MIRP[13] */ PACK( 2, 0 ),
- /* MIRP[14] */ PACK( 2, 0 ),
- /* MIRP[15] */ PACK( 2, 0 ),
-
- /* MIRP[16] */ PACK( 2, 0 ),
- /* MIRP[17] */ PACK( 2, 0 ),
- /* MIRP[18] */ PACK( 2, 0 ),
- /* MIRP[19] */ PACK( 2, 0 ),
- /* MIRP[20] */ PACK( 2, 0 ),
- /* MIRP[21] */ PACK( 2, 0 ),
- /* MIRP[22] */ PACK( 2, 0 ),
- /* MIRP[23] */ PACK( 2, 0 ),
- /* MIRP[24] */ PACK( 2, 0 ),
- /* MIRP[25] */ PACK( 2, 0 ),
- /* MIRP[26] */ PACK( 2, 0 ),
- /* MIRP[27] */ PACK( 2, 0 ),
- /* MIRP[28] */ PACK( 2, 0 ),
- /* MIRP[29] */ PACK( 2, 0 ),
- /* MIRP[30] */ PACK( 2, 0 ),
- /* MIRP[31] */ PACK( 2, 0 )
- };
-
-
- static const FT_String* OpStr[256] = {
- "SVTCA y", /* Set vectors to coordinate axis y */
- "SVTCA x", /* Set vectors to coordinate axis x */
- "SPvTCA y", /* Set Proj. vec. to coord. axis y */
- "SPvTCA x", /* Set Proj. vec. to coord. axis x */
- "SFvTCA y", /* Set Free. vec. to coord. axis y */
- "SFvTCA x", /* Set Free. vec. to coord. axis x */
- "SPvTL //", /* Set Proj. vec. parallel to segment */
- "SPvTL +", /* Set Proj. vec. normal to segment */
- "SFvTL //", /* Set Free. vec. parallel to segment */
- "SFvTL +", /* Set Free. vec. normal to segment */
- "SPvFS", /* Set Proj. vec. from stack */
- "SFvFS", /* Set Free. vec. from stack */
- "GPV", /* Get projection vector */
- "GFV", /* Get freedom vector */
- "SFvTPv", /* Set free. vec. to proj. vec. */
- "ISECT", /* compute intersection */
-
- "SRP0", /* Set reference point 0 */
- "SRP1", /* Set reference point 1 */
- "SRP2", /* Set reference point 2 */
- "SZP0", /* Set Zone Pointer 0 */
- "SZP1", /* Set Zone Pointer 1 */
- "SZP2", /* Set Zone Pointer 2 */
- "SZPS", /* Set all zone pointers */
- "SLOOP", /* Set loop counter */
- "RTG", /* Round to Grid */
- "RTHG", /* Round to Half-Grid */
- "SMD", /* Set Minimum Distance */
- "ELSE", /* Else */
- "JMPR", /* Jump Relative */
- "SCvTCi", /* Set CVT */
- "SSwCi", /* */
- "SSW", /* */
-
- "DUP",
- "POP",
- "CLEAR",
- "SWAP",
- "DEPTH",
- "CINDEX",
- "MINDEX",
- "AlignPTS",
- "INS_$28",
- "UTP",
- "LOOPCALL",
- "CALL",
- "FDEF",
- "ENDF",
- "MDAP[-]",
- "MDAP[r]",
-
- "IUP[y]",
- "IUP[x]",
- "SHP[0]",
- "SHP[1]",
- "SHC[0]",
- "SHC[1]",
- "SHZ[0]",
- "SHZ[1]",
- "SHPIX",
- "IP",
- "MSIRP[0]",
- "MSIRP[1]",
- "AlignRP",
- "RTDG",
- "MIAP[-]",
- "MIAP[r]",
-
- "NPushB",
- "NPushW",
- "WS",
- "RS",
- "WCvtP",
- "RCvt",
- "GC[0]",
- "GC[1]",
- "SCFS",
- "MD[0]",
- "MD[1]",
- "MPPEM",
- "MPS",
- "FlipON",
- "FlipOFF",
- "DEBUG",
-
- "LT",
- "LTEQ",
- "GT",
- "GTEQ",
- "EQ",
- "NEQ",
- "ODD",
- "EVEN",
- "IF",
- "EIF",
- "AND",
- "OR",
- "NOT",
- "DeltaP1",
- "SDB",
- "SDS",
-
- "ADD",
- "SUB",
- "DIV",
- "MUL",
- "ABS",
- "NEG",
- "FLOOR",
- "CEILING",
- "ROUND[G]",
- "ROUND[B]",
- "ROUND[W]",
- "ROUND[?]",
- "NROUND[G]",
- "NROUND[B]",
- "NROUND[W]",
- "NROUND[?]",
-
- "WCvtF",
- "DeltaP2",
- "DeltaP3",
- "DeltaC1",
- "DeltaC2",
- "DeltaC3",
- "SROUND",
- "S45Round",
- "JROT",
- "JROF",
- "ROFF",
- "INS_$7B",
- "RUTG",
- "RDTG",
- "SANGW",
- "AA",
-
- "FlipPT",
- "FlipRgON",
- "FlipRgOFF",
- "INS_$83",
- "INS_$84",
- "ScanCTRL",
- "SDPVTL[0]",
- "SDPVTL[1]",
- "GetINFO",
- "IDEF",
- "ROLL",
- "MAX",
- "MIN",
- "ScanTYPE",
- "IntCTRL",
- "INS_$8F",
-
- "INS_$90",
- "INS_$91",
- "INS_$92",
- "INS_$93",
- "INS_$94",
- "INS_$95",
- "INS_$96",
- "INS_$97",
- "INS_$98",
- "INS_$99",
- "INS_$9A",
- "INS_$9B",
- "INS_$9C",
- "INS_$9D",
- "INS_$9E",
- "INS_$9F",
-
- "INS_$A0",
- "INS_$A1",
- "INS_$A2",
- "INS_$A3",
- "INS_$A4",
- "INS_$A5",
- "INS_$A6",
- "INS_$A7",
- "INS_$A8",
- "INS_$A9",
- "INS_$AA",
- "INS_$AB",
- "INS_$AC",
- "INS_$AD",
- "INS_$AE",
- "INS_$AF",
-
- "PushB[0]",
- "PushB[1]",
- "PushB[2]",
- "PushB[3]",
- "PushB[4]",
- "PushB[5]",
- "PushB[6]",
- "PushB[7]",
- "PushW[0]",
- "PushW[1]",
- "PushW[2]",
- "PushW[3]",
- "PushW[4]",
- "PushW[5]",
- "PushW[6]",
- "PushW[7]",
-
- "MDRP[G]",
- "MDRP[B]",
- "MDRP[W]",
- "MDRP[?]",
- "MDRP[rG]",
- "MDRP[rB]",
- "MDRP[rW]",
- "MDRP[r?]",
- "MDRP[mG]",
- "MDRP[mB]",
- "MDRP[mW]",
- "MDRP[m?]",
- "MDRP[mrG]",
- "MDRP[mrB]",
- "MDRP[mrW]",
- "MDRP[mr?]",
- "MDRP[pG]",
- "MDRP[pB]",
-
- "MDRP[pW]",
- "MDRP[p?]",
- "MDRP[prG]",
- "MDRP[prB]",
- "MDRP[prW]",
- "MDRP[pr?]",
- "MDRP[pmG]",
- "MDRP[pmB]",
- "MDRP[pmW]",
- "MDRP[pm?]",
- "MDRP[pmrG]",
- "MDRP[pmrB]",
- "MDRP[pmrW]",
- "MDRP[pmr?]",
-
- "MIRP[G]",
- "MIRP[B]",
- "MIRP[W]",
- "MIRP[?]",
- "MIRP[rG]",
- "MIRP[rB]",
- "MIRP[rW]",
- "MIRP[r?]",
- "MIRP[mG]",
- "MIRP[mB]",
- "MIRP[mW]",
- "MIRP[m?]",
- "MIRP[mrG]",
- "MIRP[mrB]",
- "MIRP[mrW]",
- "MIRP[mr?]",
- "MIRP[pG]",
- "MIRP[pB]",
-
- "MIRP[pW]",
- "MIRP[p?]",
- "MIRP[prG]",
- "MIRP[prB]",
- "MIRP[prW]",
- "MIRP[pr?]",
- "MIRP[pmG]",
- "MIRP[pmB]",
- "MIRP[pmW]",
- "MIRP[pm?]",
- "MIRP[pmrG]",
- "MIRP[pmrB]",
- "MIRP[pmrW]",
- "MIRP[pmr?]"
- };
-
-
-/*********************************************************************
- *
- * Init_Keyboard : set the input file descriptor to char-by-char
- * mode on Unix..
- *
- *********************************************************************/
-
-#ifdef UNIX
-
- struct termios old_termio;
-
- static
- void Init_Keyboard( void )
- {
- struct termios termio;
-
-#ifndef HAVE_TCGETATTR
- ioctl( 0, TCGETS, &old_termio );
-#else
- tcgetattr( 0, &old_termio );
-#endif
-
- termio = old_termio;
-
-/* termio.c_lflag &= ~(ICANON+ECHO+ECHOE+ECHOK+ECHONL+ECHOKE); */
- termio.c_lflag &= ~(ICANON+ECHO+ECHOE+ECHOK+ECHONL);
-
-#ifndef HAVE_TCSETATTR
- ioctl( 0, TCSETS, &termio );
-#else
- tcsetattr( 0, TCSANOW, &termio );
-#endif
- }
-
- static
- void Reset_Keyboard( void )
- {
-#ifndef HAVE_TCSETATTR
- ioctl( 0, TCSETS, &old_termio );
-#else
- tcsetattr( 0, TCSANOW, &old_termio );
-#endif
-
- }
-
-#else
-
- static
- void Init_Keyboard( void )
- {
- }
-
- static
- void Reset_Keyboard( void )
- {
- }
-
-#endif
-
-
- void Panic( const char* message )
- {
- fprintf( stderr, "%s\n error code = 0x%04x\n", message, error );
- Reset_Keyboard();
- exit(1);
- }
-
-
-/******************************************************************
- *
- * Function : Calc_Length
- *
- * Description : Computes the length in bytes of current opcode.
- *
- *****************************************************************/
-
-#define CUR (*exc)
-
-
- static void Calc_Length( TT_ExecContext exc )
- {
- CUR.opcode = CUR.code[CUR.IP];
-
- switch ( CUR.opcode )
- {
- case 0x40:
- if ( CUR.IP + 1 >= CUR.codeSize )
- Panic( "code range overflow !!" );
-
- CUR.length = CUR.code[CUR.IP + 1] + 2;
- break;
-
- case 0x41:
- if ( CUR.IP + 1 >= CUR.codeSize )
- Panic( "code range overflow !!" );
-
- CUR.length = CUR.code[CUR.IP + 1] * 2 + 2;
- break;
-
- case 0xB0:
- case 0xB1:
- case 0xB2:
- case 0xB3:
- case 0xB4:
- case 0xB5:
- case 0xB6:
- case 0xB7:
- CUR.length = CUR.opcode - 0xB0 + 2;
- break;
-
- case 0xB8:
- case 0xB9:
- case 0xBA:
- case 0xBB:
- case 0xBC:
- case 0xBD:
- case 0xBE:
- case 0xBF:
- CUR.length = (CUR.opcode - 0xB8) * 2 + 3;
- break;
-
- default:
- CUR.length = 1;
- break;
- }
-
- /* make sure result is in range */
-
- if ( CUR.IP + CUR.length > CUR.codeSize )
- Panic( "code range overflow !!" );
- }
-
-
- /* Disassemble the current line */
- /* */
- const FT_String* Cur_U_Line( TT_ExecContext exec )
- {
- FT_String s[32];
- FT_Int op, i, n;
-
- op = exec->code[ exec->IP ];
-
- sprintf( tempStr, "%04lx: %02hx %s", exec->IP, op, OpStr[op] );
-
- if ( op == 0x40 )
- {
- n = exec->code[ exec->IP+1 ];
- sprintf( s, "(%d)", n );
- strncat( tempStr, s, 8 );
-
- if ( n > 20 ) n = 20; /* limit output */
-
- for ( i = 0; i < n; i++ )
- {
- sprintf( s, " $%02hx", exec->code[ exec->IP+i+2 ] );
- strncat( tempStr, s, 8 );
- }
- }
- else if ( op == 0x41 )
- {
- n = exec->code[ exec->IP+1 ];
- sprintf( s, "(%d)", n );
- strncat( tempStr, s, 8 );
-
- if (n > 20) n = 20; /* limit output */
-
- for ( i = 0; i < n; i++ )
- {
- sprintf( s, " $%02hx%02hx", exec->code[ exec->IP+i*2+2 ],
- exec->code[ exec->IP+i*2+3 ] );
- strncat( tempStr, s, 8 );
- }
- }
- else if ( (op & 0xF8) == 0xB0 )
- {
- n = op-0xB0;
-
- for ( i=0; i <= n; i++ )
- {
- sprintf( s, " $%02hx", exec->code[ exec->IP+i+1 ] );
- strncat( tempStr, s, 8 );
- }
- }
- else if ( (op & 0xF8) == 0xB8 )
- {
- n = op-0xB8;
-
- for ( i = 0; i <= n; i++ )
- {
- sprintf( s, " $%02hx%02hx", exec->code[ exec->IP+i*2+1 ],
- exec->code[ exec->IP+i*2+2 ] );
- strncat( tempStr, s, 8 );
- }
- }
-
- return (FT_String*)tempStr;
- }
-
-
- static
- int old_tag_to_new( int tag )
- {
- int result = tag & 1;
- if (tag & FT_Curve_Tag_Touch_X)
- result |= 2;
- if (tag & FT_Curve_Tag_Touch_Y)
- result |= 4;
-
- return result;
- }
-
- static
- FT_Error RunIns( TT_ExecContext exc )
- {
- FT_Int A, diff, key;
- FT_Long next_IP;
- FT_Char ch, oldch = '\0', *temp;
-
- FT_Error error = 0;
-
- TT_GlyphZone save;
- TT_GlyphZone pts;
-
- const FT_String* round_str[8] =
- {
- "to half-grid",
- "to grid",
- "to double grid",
- "down to grid",
- "up to grid",
- "off",
- "super",
- "super 45"
- };
-
- /* only debug the requested code range */
- if (exc->curRange != (FT_Int)debug_coderange)
- return TT_RunIns(exc);
-
- exc->pts.n_points = exc->zp0.n_points;
- exc->pts.n_contours = exc->zp0.n_contours;
-
- pts = exc->pts;
-
-
- save.n_points = pts.n_points;
- save.n_contours = pts.n_contours;
-
- save.org = (FT_Vector*)malloc( 2 * sizeof( FT_F26Dot6 ) *
- save.n_points );
- save.cur = (FT_Vector*)malloc( 2 * sizeof( FT_F26Dot6 ) *
- save.n_points );
- save.tags = (FT_Byte*)malloc( save.n_points );
-
- exc->instruction_trap = 1;
-
- do
- {
- if ( CUR.IP < CUR.codeSize )
- {
- Calc_Length( exc );
-
- CUR.args = CUR.top - (Pop_Push_Count[CUR.opcode] >> 4);
-
- /* `args' is the top of the stack once arguments have been popped. */
- /* One can also interpret it as the index of the last argument. */
-
- /* Print the current line. We use a 80-columns console with the */
- /* following formatting: */
- /* */
- /* [loc]:[addr] [opcode] [disassemby] [a][b]|[c][d] */
- /* */
-
- {
- char temp[80];
- int n, col, pop;
- int args = CUR.args;
-
- sprintf( temp, "%78c\n", ' ' );
-
- /* first letter of location */
- switch ( CUR.curRange )
- {
- case tt_coderange_glyph:
- temp[0] = 'g';
- break;
- case tt_coderange_cvt:
- temp[0] = 'c';
- break;
- default:
- temp[0] = 'f';
- }
-
- /* current IP */
- sprintf( temp+1, "%04lx: %02x %-36.36s",
- CUR.IP,
- CUR.opcode,
- Cur_U_Line(&CUR) );
-
- strncpy( temp+46, " (", 2 );
-
- args = CUR.top - 1;
- pop = Pop_Push_Count[CUR.opcode] >> 4;
- col = 48;
- for ( n = 6; n > 0; n-- )
- {
- if ( pop == 0 )
- temp[col-1] = (temp[col-1] == '(' ? ' ' : ')' );
-
- if ( args < CUR.top && args >= 0 )
- sprintf( temp+col, "%04lx", CUR.stack[args] );
- else
- sprintf( temp+col, " " );
-
- temp[col+4] = ' ';
- col += 5;
- pop--;
- args--;
- }
- temp[78] = '\n';
- temp[79] = '\0';
- printf( "%s", temp );
- }
-
- /* First, check for empty stack and overflow */
- if ( CUR.args < 0 )
- {
- printf( "ERROR : Too Few Arguments\n" );
- CUR.error = TT_Err_Too_Few_Arguments;
- goto LErrorLabel_;
- }
-
- CUR.new_top = CUR.args + (Pop_Push_Count[CUR.opcode] & 15);
-
- /* new_top is the new top of the stack, after the instruction's */
- /* execution. top will be set to new_top after the 'case' */
-
- if ( CUR.new_top > CUR.stackSize )
- {
- printf( "ERROR : Stack overflow\n" );
- CUR.error = TT_Err_Stack_Overflow;
- goto LErrorLabel_;
- }
- }
- else
- printf( "End of program reached.\n" );
-
- key = 0;
- do
- {
- /* read keyboard */
-
- ch = getch();
-
- switch ( ch )
- {
- /* Help - show keybindings */
- case '?':
- printf( "TTDebug Help\n\n" );
- printf( "? Show this page\n" );
- printf( "q Quit debugger\n" );
- printf( "n Skip to next instruction\n" );
- printf( "s Step into\n" );
- printf( "v Show vector info\n" );
- printf( "g Show graphics state\n" );
- printf( "p Show points zone\n\n" );
- break;
-
- /* Show vectors */
- case 'v':
- printf( "freedom (%04hx,%04hx)\n", exc->GS.freeVector.x,
- exc->GS.freeVector.y );
- printf( "projection (%04hx,%04hx)\n", exc->GS.projVector.x,
- exc->GS.projVector.y );
- printf( "dual (%04hx,%04hx)\n\n", exc->GS.dualVector.x,
- exc->GS.dualVector.y );
- break;
-
- /* Show graphics state */
- case 'g':
- printf( "rounding %s\n", round_str[exc->GS.round_state] );
- printf( "min dist %04lx\n", exc->GS.minimum_distance );
- printf( "cvt_cutin %04lx\n", exc->GS.control_value_cutin );
- break;
-
- /* Show points table */
- case 'p':
- for ( A = 0; A < exc->pts.n_points; A++ )
- {
- printf( "%02hx ", A );
- printf( "%08lx,%08lx - ", pts.org[A].x, pts.org[A].y );
- printf( "%08lx,%08lx\n", pts.cur[A].x, pts.cur[A].y );
- }
- printf(( "\n" ));
- break;
-
- default:
- key = 1;
- }
- } while ( !key );
-
- MEM_Copy( save.org, pts.org, pts.n_points * sizeof ( FT_Vector ) );
- MEM_Copy( save.cur, pts.cur, pts.n_points * sizeof ( FT_Vector ) );
- MEM_Copy( save.tags, pts.tags, pts.n_points );
-
- /* a return indicate the last command */
- if (ch == '\r')
- ch = oldch;
-
- switch ( ch )
- {
- /* Quit debugger */
- case 'q':
- goto LErrorLabel_;
-
- /* Step over */
- case 'n':
- if ( exc->IP < exc->codeSize )
- {
- /* `step over' is equivalent to `step into' except if */
- /* the current opcode is a CALL or LOOPCALL */
- if ( CUR.opcode != 0x2a && CUR.opcode != 0x2b )
- goto Step_into;
-
- /* otherwise, loop execution until we reach the next opcode */
- next_IP = CUR.IP + CUR.length;
- while ( exc->IP != next_IP )
- {
- if ( ( error = TT_RunIns( exc ) ) )
- goto LErrorLabel_;
- }
- }
- oldch = ch;
- break;
-
- /* Step into */
- case 's':
- if ( exc->IP < exc->codeSize )
-
- Step_into:
- if ( ( error = TT_RunIns( exc ) ) )
- goto LErrorLabel_;
- oldch = ch;
- break;
-
- default:
- printf( "unknown command. Press ? for help\n" );
- oldch = '\0';
- }
-
- for ( A = 0; A < pts.n_points; A++ )
- {
- diff = 0;
- if ( save.org[A].x != pts.org[A].x ) diff |= 1;
- if ( save.org[A].y != pts.org[A].y ) diff |= 2;
- if ( save.cur[A].x != pts.cur[A].x ) diff |= 4;
- if ( save.cur[A].y != pts.cur[A].y ) diff |= 8;
- if ( save.tags[A] != pts.tags[A] ) diff |= 16;
-
- if ( diff )
- {
- printf( "%02hx ", A );
-
- if ( diff & 16 ) temp = "(%01hx)"; else temp = " %01hx ";
- printf( temp, old_tag_to_new(save.tags[A]) );
-
- if ( diff & 1 ) temp = "(%08lx)"; else temp = " %08lx ";
- printf( temp, save.org[A].x );
-
- if ( diff & 2 ) temp = "(%08lx)"; else temp = " %08lx ";
- printf( temp, save.org[A].y );
-
- if ( diff & 4 ) temp = "(%08lx)"; else temp = " %08lx ";
- printf( temp, save.cur[A].x );
-
- if ( diff & 8 ) temp = "(%08lx)"; else temp = " %08lx ";
- printf( temp, save.cur[A].y );
-
- printf( "\n" );
-
- printf( "%02hx ", A );
-
- if ( diff & 16 ) temp = "[%01hx]"; else temp = " %01hx ";
- printf( temp, old_tag_to_new(pts.tags[A]) );
-
- if ( diff & 1 ) temp = "[%08lx]"; else temp = " %08lx ";
- printf( temp, pts.org[A].x );
-
- if ( diff & 2 ) temp = "[%08lx]"; else temp = " %08lx ";
- printf( temp, pts.org[A].y );
-
- if ( diff & 4 ) temp = "[%08lx]"; else temp = " %08lx ";
- printf( temp, pts.cur[A].x );
-
- if ( diff & 8 ) temp = "[%08lx]"; else temp = " %08lx ";
- printf( temp, pts.cur[A].y );
-
- printf( "\n\n" );
- }
- }
- } while ( TRUE );
-
- LErrorLabel_:
-
- if (error)
- Panic( "error during execution" );
- return error;
- }
-
-
-
-
-
- static
- void Usage()
- {
- fprintf( stderr, "ttdebug - a simply TrueType font debugger\n" );
- fprintf( stderr, "(c) The FreeType project - www.freetype.org\n" );
- fprintf( stderr, "-------------------------------------------\n\n" );
-
- fprintf( stderr, "usage : ttdebug [options] glyph size fontfile[.ttf]\n\n" );
-
- fprintf( stderr, " glyph - glyph index within the font file. Can be negative to query \n" );
- fprintf( stderr, " the debugging of the font 'cvt' program\n\n" );
-
- fprintf( stderr, " size - size of glyph in pixels\n\n" );
-
- fprintf( stderr, " fontfile - a valid TrueType file.\n\n" );
-
- fprintf( stderr, " valid options are:\n\n" );
- fprintf( stderr, " -d : Dump mode. Shows the glyph program and exit immediately\n" );
- fprintf( stderr, " -n : Non-interactive mode. Dumps the execution trace and exit\n" );
-
- exit(1);
- }
-
-
-int dump_mode;
-int non_interactive_mode;
-char* file_name;
-int glyph_index;
-int glyph_size;
-
- int main( int argc, char** argv )
- {
- char valid;
-
- /* Check number of arguments */
- if ( argc < 4 ) Usage();
-
- /* Check options */
- dump_mode = 0;
- non_interactive_mode = 0;
-
- argv++;
- while (argv[0][0] == '-')
- {
- valid = 0;
- switch (argv[0][1])
- {
- case 'd':
- dump_mode = 1;
- valid = 1;
- break;
-
- case 'n':
- non_interactive_mode = 1;
- valid = 1;
- break;
-
- default:
- ;
- }
-
- if (valid)
- {
- argv++;
- argc--;
- if (argc < 4) Usage();
- }
- else
- break;
- }
-
- /* Get Glyph index */
- if ( sscanf( argv[0], "%d", &glyph_index ) != 1 )
- {
- printf( "invalid glyph index = %s\n", argv[1] );
- Usage();
- }
-
- /* Get Glyph size */
- if ( sscanf( argv[1], "%d", &glyph_size ) != 1 )
- {
- printf( "invalid glyph size = %s\n", argv[1] );
- Usage();
- }
-
- /* Get file name */
- file_name = argv[2];
-
- Init_Keyboard();
-
- /* Init library, read face object, get driver, create size */
- error = FT_Init_FreeType( &library );
- if (error) Panic( "could not initialise FreeType library" );
-
- memory = library->memory;
- driver = (FT_Driver)FT_Get_Module( library, "truetype" );
- if (!driver) Panic( "could not find the TrueType driver in FreeType 2\n" );
-
- FT_Set_Debug_Hook( library,
- FT_DEBUG_HOOK_TRUETYPE,
- (FT_DebugHook_Func)RunIns );
-
- error = FT_New_Face( library, file_name, 0, (FT_Face*)&face );
- if (error) Panic( "could not open font resource" );
-
- /* find driver and check format */
- if ( face->root.driver != driver )
- {
- error = FT_Err_Invalid_File_Format;
- Panic( "This is not a TrueType font" );
- }
-
- size = (TT_Size)face->root.size;
-
- if (glyph_index < 0)
- {
- exec = TT_New_Context( face );
- size->debug = 1;
- size->context = exec;
-
- error = FT_Set_Char_Size( (FT_Face)face, glyph_size << 6, glyph_size << 6, 72, 72 );
- if (error) Panic( "could not set character sizes" );
- }
- else
- {
- error = FT_Set_Char_Size( (FT_Face)face, glyph_size << 6, glyph_size << 6, 72, 72 );
- if (error) Panic( "could not set character sizes" );
-
- glyph = (TT_GlyphSlot)face->root.glyph;
-
- /* Now load glyph */
- error = FT_Load_Glyph( (FT_Face)face, glyph_index, FT_LOAD_NO_BITMAP );
- if (error) Panic( "could not load glyph" );
- }
-
- Reset_Keyboard();
- return 0;
- }