ftp.nice.ch/pub/next/graphics/convertors/Convert_PICT.NIHS.bs.tar.gz#/Convert_PICT/Source/RegionConverter.h

This is RegionConverter.h in view mode; [Download] [Up]

/***********************************************************************\
region converter for Convert PICT which converts graphics from PICT to eps formats.
Copyright (C) 1993 David John Burrowes

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

The author, David John Burrowes, can be reached at:
	davidjohn@kira.net.netcom.com
	David John Burrowes
	1926 Ivy #10
	San Mateo, CA 94403-1367
\***********************************************************************/


#import "ResultObject.h"
#import "common.h"



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	Definitions:	region types:
//	Description:
//		The following data types are used by the region converter when converting
//		a Mac region into a set of coordinates for a PS description of the same.
//	NOTE:
//		Please read RegionConverter.rtf, since that describes much more about how
//		this object behaves!
//	Bugs:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//
//	A structure for describing an integral coordinate
//
typedef struct
{
	Integer x;
	Integer y;
}
Coordinate;

//
//	This is used to represent a segment where both coordinates reside on one y coordinate.
//	Thus, one only needs to store the x values.  Note: left is always <= right
//
typedef struct
{
	Integer	left;
	Integer	right;
}
Segment, * SegmentAddr;

#define	NullSegment	((SegmentAddr) NULL)

//
//	Used to build a chain of segments.
//
typedef struct SegmentLink
{
	Integer	left;
	Integer	right;
	 struct SegmentLink* 	nextSegment;
}
SegmentLink, *SegmentLinkAddr;

#define	EndOfChain	((SegmentLinkAddr)  NULL)

//
//	This describes a line segment as it is stored as part of a shape being accumulated.
//	It stores the coordinates of the start and end of a line segment.  If it has been
//	connected to another line segment, the left and right pointers refer to other lines it
//	has been attached to. (left < right.  If line is vertical, left means top, right means bottom,
//	since top < bottom).   If a shape is incomplete, then it may not be connected to another
//	line on one or both sides, but a segment on the `active' list may point to it.
//
typedef struct LineSegment *LineSegmentAddr;
typedef struct LineSegment
{
	Coordinate	left;
	Coordinate	right;
	LineSegmentAddr		leftNext;
	LineSegmentAddr		rightNext;
	Boolean				used;	// used to mark that this linesegment has been touched.
} LineSegment;

#define	NoLine	((LineSegmentAddr) NULL)

//
//	If a segment of a line/space is being considered, then an ActiveSegment is stored on
//	the Active list.  Such a segment consists of a left and right x coordinate, and pointers
//	to the line or lines that the area this segment will attach to.
//
typedef struct ActiveSegment * ActiveSegmentAddr;
typedef struct ActiveSegment
{
	Integer				left;
	Integer				right;
	LineSegmentAddr		leftLine;
	LineSegmentAddr		rightLine;
	ActiveSegmentAddr	next;
	ActiveSegmentAddr	previous;
}
ActiveSegment;

#define	EndOfActiveList	((ActiveSegmentAddr) NULL)

//
//	each SegmentGroup holds all the segments, from the region data, that occurr on
//	one Y coordinate.  So, this stores the y they occrr on, the chain of segments, and a
//	pointer to the next segment.
//

typedef struct SegmentGroup *SegmentGroupAddr;
typedef struct SegmentGroup
{
	Integer				y;
	SegmentLinkAddr	segmentData;
	SegmentGroupAddr	next;
}
SegmentGroup;

#define	EndOfGroups	NULL


//
//	This stucture is used to hold the shapes that are built from the REgion data
//	It holds a pointer to the next shape, and a pointer to the first line segment of the shape.
typedef struct Shape *ShapeAddr;
typedef struct Shape
{
	LineSegmentAddr		theLine;
	ShapeAddr			nextShape;
} Shape;

#define	NoShape	((ShapeAddr) NULL)

//
//	Define kinds of segment intersection
//
typedef enum
{
	None,
	TouchOuterLeft, TouchOuterRight,
	TouchInnerLeft, TouchInnerRight,
	TouchInnerLeftExtendRight, TouchInnerRightExtendLeft,
	LeftOverlap, RightOverlap,
	Larger, Within,
	Equal
}
OverlapKind;
//
//	Used to store what direction a routine is `moving' in.
//
typedef enum
{
	toLeft, toRight
}
DirectionType;

#define	EndOfRegion	32767
#define	EndOfRegionLine	32767


@interface regionConverter:ResultObject
{
	ActiveSegmentAddr	ActiveList;
	ShapeAddr			ShapeStorage;
	SegmentGroupAddr	RegionData;
	PICTRect*			boundsRect;
}

- ConvertRegionFrom: PictFile  To: PsFile;
- ReadInRegionFrom: PictFile;
- ConvertRegionData;
-WriteTo: PsFile;
- WriteShapeFromLine:  (LineSegmentAddr) startLine  To: PsFile;

- (OverlapKind) CheckHowSegment: (SegmentAddr) segment
						Intersects: (ActiveSegmentAddr) active;

-AddSegmentFrom: (Integer) left  To: (Integer) right  ToGroup: (SegmentGroupAddr) group;
-(SegmentAddr) GetNextSegmentFromGroup: (SegmentGroupAddr) group;

- AddShapeFrom: (Integer) left  To: (Integer) right  At: (Integer) y;
-(LineSegmentAddr) AddAntiShapeFrom: (Integer) left  To: (Integer) right  At: (Integer) y;

- (LineSegmentAddr)  AddLineFrom: (Integer) left  To: (Integer) right  At: (Integer) y
	WithLeft: (LineSegmentAddr) leftline  AndRight: (LineSegmentAddr) rightline;

- AddActiveFrom: (Integer) left  To: (Integer) right  WithLeft:
		(LineSegmentAddr) leftline  AndRight: (LineSegmentAddr) rightline;
- RemoveActive: (ActiveSegmentAddr) theActive;
- (ActiveSegmentAddr) FindFirstActiveLeftIn: (Integer) left  To: (Integer) right;
- CleanUp;
@end



#define	ERR_BADDATA	-1000
#define	ERR_WEIRDDATA	1000
#define	ERR_BADSIZE	500
#define	ERR_NOSEGMENTS	100



These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.