Blob Blame Raw
// Copyright © 1999 Middlesoft, Inc. All rights reserved.
// First Created By Lee Thomason.
// First Created On 09/08/1999.
// Last Modified On 11/09/1999.
// Last Modified On 18/06/2002  by DV for Fixes
/****************************************************************************************

				File Summary: Macromedia.h

	This header file defines various structs and enums used by Flash File Format SDK
	low-level manager.

****************************************************************************************/

#ifndef _MACROMEDIA_H_
#define _MACROMEDIA_H_

#ifdef WIN32 // added by DV
#pragma warning(disable : 4786)
#endif

#include "tcommon.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>

class FSWFStream;

#ifdef _DEBUG
#ifndef DEBUG
#define DEBUG
#endif
#endif

// Some basic defines for debugging:
#ifdef DEBUG
#define FLASHOUTPUT printf
#define FLASHASSERT assert
#define FLASHPRINT printf
//
// 	#define FLASHOUTPUT ((void)0)
// 	#define FLASHASSERT ((void)0)
// 	#define FLASHPRINT  ((void)0)
#else
inline void nothing(...)
{
}
#define FLASHOUTPUT nothing //((void)0)
#define FLASHASSERT nothing //((void)0)
#define FLASHPRINT printf
#endif

/*  // removed by DV
#ifndef min
	#define min( a, b ) ( ( a < b ) ? a : b )
#endif
#ifndef max
	#define max( a, b ) ( ( a > b ) ? a : b )
#endif
*/

// Global Types
typedef float FLOAT;
typedef TUINT32 U32, *P_U32, **PP_U32;
typedef TINT32 S32, *P_S32, **PP_S32;
typedef unsigned short U16, *P_U16, **PP_U16;
typedef signed short S16, *P_S16, **PP_S16;
typedef unsigned char U8, *P_U8, **PP_U8;
typedef signed char S8, *P_S8, **PP_S8;
typedef TINT32 SFIXED, *P_SFIXED;
typedef TINT32 SCOORD, *P_SCOORD;
typedef int BOOL;

const SFIXED Fixed1 = 0x00010000;
const SCOORD SCoord1 = 20;

typedef struct SRECT {
	SCOORD xmin;
	SCOORD xmax;
	SCOORD ymin;
	SCOORD ymax;
} SRECT, *P_SRECT;

const U8 Snd5k = 0;
const U8 Snd11k = 1;
const U8 Snd22k = 2;
const U8 Snd44k = 3;

const U8 Snd8Bit = 0;
const U8 Snd16Bit = 1;

const U8 SndMono = 0;
const U8 SndStereo = 1;

typedef struct SSound {
	U8 format;		 // 0 none, 1 PCM
	U8 rate;		 // Snd5k...Snd44k
	U8 size;		 // 0 8bit, 1 16bit
	U8 type;		 // 0 mono, 1 stereo
	U32 sampleCount; // the number of samples
	U32 soundSize;   // the number of bytes in the sample
	U8 *sound;		 // pointer to the sound data
} SSound, *P_SSound;

typedef struct SPOINT {
	SCOORD x;
	SCOORD y;
} SPOINT, *P_SPOINT;

// Start Sound Flags
enum {
	soundHasInPoint = 0x01,
	soundHasOutPoint = 0x02,
	soundHasLoops = 0x04,
	soundHasEnvelope = 0x08

	// the upper 4 bits are reserved for synchronization flags
};

enum {
	fillSolid = 0x00,
	fillGradient = 0x10,
	fillLinearGradient = 0x10,
	fillRadialGradient = 0x12,
	fillMaxGradientColors = 8,
	// Texture/bitmap fills
	fillTiledBits = 0x40, // if this bit is set, must be a bitmap pattern
	fillClippedBits = 0x41
};

enum {
	CURVED_EDGE = 0,
	STRAIGHT_EDGE = 1
};

enum {
	NOT_EDGE_REC = 0,
	EDGE_REC = 1
};

// Flags for defining a shape character
enum {
	// These flag codes are used for state changes - and as return values from ShapeParser::GetEdge()
	eflagsMoveTo = 0x01,
	eflagsFill0 = 0x02,
	eflagsFill1 = 0x04,
	eflagsLine = 0x08,
	eflagsNewStyles = 0x10,

	eflagsEnd = 0x80 // a state change with no change marks the end
};

#ifndef NULL
#define NULL 0
#endif

// Tag values that represent actions or data in a Flash script.
enum {
	stagEnd = 0,
	stagShowFrame = 1,
	stagDefineShape = 2,
	stagFreeCharacter = 3,
	stagPlaceObject = 4,
	stagRemoveObject = 5,
	stagDefineBits = 6,
	stagDefineButton = 7,
	stagJPEGTables = 8,
	stagSetBackgroundColor = 9,
	stagDefineFont = 10,
	stagDefineText = 11,
	stagDoAction = 12,
	stagDefineFontInfo = 13,
	stagDefineSound = 14, // Event sound tags.
	stagStartSound = 15,
	stagDefineButtonSound = 17,
	stagSoundStreamHead = 18,
	stagSoundStreamBlock = 19,
	stagDefineBitsLossless = 20, // A bitmap using lossless zlib compression.
	stagDefineBitsJPEG2 = 21,	// A bitmap using an internal JPEG compression table.
	stagDefineShape2 = 22,
	stagDefineButtonCxform = 23,
	stagProtect = 24, // This file should not be importable for editing.

	stagPathsArePostScript = 25, // assume shapes are filled as PostScript style paths

	// These are the new tags for Flash 3.
	stagPlaceObject2 = 26,  // The new style place w/ alpha color transform and name.
	stagRemoveObject2 = 28, // A more compact remove object that omits the character tag (just depth).

	// This tag is used for RealMedia only
	stagSyncFrame = 29, // Handle a synchronization of the display list

	stagFreeAll = 31, // Free all of the characters

	stagDefineShape3 = 32,		  // A shape V3 includes alpha values.
	stagDefineText2 = 33,		  // A text V2 includes alpha values.
	stagDefineButton2 = 34,		  // A button V2 includes color transform, alpha and multiple actions
	stagDefineBitsJPEG3 = 35,	 // A JPEG bitmap with alpha info.
	stagDefineBitsLossless2 = 36, // A lossless bitmap with alpha info.
	stagDefineSprite = 39,		  // Define a sequence of tags that describe the behavior of a sprite.
	stagNameCharacter = 40,		  // Name a character definition, character id and a string, (used for buttons, bitmaps, sprites and sounds).

	stagSerialNumber = 41,	 // a tag command for the Flash Generator customer serial id and cpu information
	stagDefineTextFormat = 42, // define the contents of a text block with formating information

	stagFrameLabel = 43,	   // A string label for the current frame.
	stagSoundStreamHead2 = 45, // For lossless streaming sound, should not have needed this...
	stagDefineMorphShape = 46, // A morph shape definition

	stagFrameTag = 47,		   // a tag command for the Flash Generator (WORD duration, STRING label)
	stagDefineFont2 = 48,	  // a tag command for the Flash Generator Font information
	stagGenCommand = 49,	   // a tag command for the Flash Generator intrinsic
	stagDefineCommandObj = 50, // a tag command for the Flash Generator intrinsic Command
	stagCharacterSet = 51,	 // defines the character set used to store strings
	stagFontRef = 52,		   // defines a reference to an external font source

	// Flash 4 tags
	stagDefineEditText = 37, // an edit text object (bounds, width, font, variable name)
	stagDefineVideo = 38,	// a reference to an external video stream

	// NOTE: If tag values exceed 255 we need to expand SCharacter::tagCode from a BYTE to a WORD
	stagDefineBitsPtr = 1023 // a special tag used only in the editor
};

// PlaceObject2 Flags
enum {
	splaceMove = 0x01,				 // this place moves an exisiting object
	splaceCharacter = 0x02,			 // there is a character tag	(if no tag, must be a move)
	splaceMatrix = 0x04,			 // there is a matrix (matrix)
	splaceColorTransform = 0x08,	 // there is a color transform (cxform with alpha)
	splaceRatio = 0x10,				 // there is a blend ratio (word)
	splaceName = 0x20,				 // there is an object name (string)
	splaceDefineClip = 0x40,		 // this shape should open or close a clipping bracket (character != 0 to open, character == 0 to close)
	splaceCloneExternalSprite = 0x80 // cloning a movie which was loaded externally
									 // one bit left for expansion
};

//ActionConditions
enum {
	OverDownToIdle = 1,
	IdleToOverDown = 2,
	OutDownToIdle = 3,
	OutDownToOverDown = 4,
	OverDownToOutDown = 5,
	OverDownToOverUp = 6,
	OverUpToOverDown = 7,
	OverUpToIdle = 8,
	IdleToOverUp = 9
};

//Clip Action
enum {
	//Flash 5-
	ClipEventLoad = 0x00000001,
	ClipEventEnterFrame = 0x00000002,
	ClipEventUnload = 0x00000004,
	ClipEventMouseMove = 0x00000008,
	ClipEventMouseDown = 0x00000010,
	ClipEventMouseUp = 0x00000020,
	ClipEventKeyDown = 0x00000040,
	ClipEventKeyUp = 0x00000080,
	ClipEventData = 0x00000100,

	//Flash 6+
	ClipEventInitialize = 0x00000200,
	ClipEventPress = 0x00000400,
	ClipEventRelease = 0x00000800,
	ClipEventReleaseOutside = 0x00001000,
	ClipEventRollOver = 0x00002000,
	ClipEventRollOut = 0x00004000,
	ClipEventDragOver = 0x00008000,
	ClipEventDragOut = 0x00010000,
	ClipEventKeyPress = 0x00020000,
};

//Key Codes
enum {
	ID_KEY_LEFT = 0x01,
	ID_KEY_RIGHT = 0x02,
	ID_KEY_HOME = 0x03,
	ID_KEY_END = 0x04,
	ID_KEY_INSERT = 0x05,
	ID_KEY_DELETE = 0x06,
	ID_KEY_CLEAR = 0x07,
	ID_KEY_BACKSPACE = 0x08,
	ID_KEY_ENTER = 0x0D,
	ID_KEY_UP = 0x0E,
	ID_KEY_DOWN = 0x0F,
	ID_KEY_PAGE_UP = 0x10,
	ID_KEY_PAGE_DOWN = 0x11,
	ID_KEY_TAB = 0x12
};

// Action codes
enum {
	// Flash 1 and 2 actions
	sactionHasLength = 0x80,
	sactionNone = 0x00,
	sactionGotoFrame = 0x81, // frame num (WORD)
	sactionGetURL = 0x83,	// url (STR), window (STR)
	sactionNextFrame = 0x04,
	sactionPrevFrame = 0x05,
	sactionPlay = 0x06,
	sactionStop = 0x07,
	sactionToggleQuality = 0x08,
	sactionStopSounds = 0x09,
	sactionWaitForFrame = 0x8A, // frame needed (WORD), actions to skip (BYTE)

	// Flash 3 Actions
	sactionSetTarget = 0x8B, // name (STR)
	sactionGotoLabel = 0x8C, // name (STR)

	// Flash 4 Actions
	sactionAdd = 0x0A,			   // Stack IN: number, number, OUT: number
	sactionSubtract = 0x0B,		   // Stack IN: number, number, OUT: number
	sactionMultiply = 0x0C,		   // Stack IN: number, number, OUT: number
	sactionDivide = 0x0D,		   // Stack IN: dividend, divisor, OUT: number
	sactionEquals = 0x0E,		   // Stack IN: number, number, OUT: bool
	sactionLess = 0x0F,			   // Stack IN: number, number, OUT: bool
	sactionAnd = 0x10,			   // Stack IN: bool, bool, OUT: bool
	sactionOr = 0x11,			   // Stack IN: bool, bool, OUT: bool
	sactionNot = 0x12,			   // Stack IN: bool, OUT: bool
	sactionStringEquals = 0x13,	// Stack IN: string, string, OUT: bool
	sactionStringLength = 0x14,	// Stack IN: string, OUT: number
	sactionStringAdd = 0x21,	   // Stack IN: string, strng, OUT: string
	sactionStringExtract = 0x15,   // Stack IN: string, index, count, OUT: substring
	sactionPush = 0x96,			   // type (BYTE), value (STRING or FLOAT)
	sactionPop = 0x17,			   // no arguments
	sactionToInteger = 0x18,	   // Stack IN: number, OUT: integer
	sactionJump = 0x99,			   // offset (WORD)
	sactionIf = 0x9D,			   // offset (WORD) Stack IN: bool
	sactionCall = 0x9E,			   // Stack IN: name
	sactionGetVariable = 0x1C,	 // Stack IN: name, OUT: value
	sactionSetVariable = 0x1D,	 // Stack IN: name, value
	sactionGetURL2 = 0x9A,		   // method (BYTE) Stack IN: url, window
	sactionGotoFrame2 = 0x9F,	  // flags (BYTE) Stack IN: frame
	sactionSetTarget2 = 0x20,	  // Stack IN: target
	sactionGetProperty = 0x22,	 // Stack IN: target, property, OUT: value
	sactionSetProperty = 0x23,	 // Stack IN: target, property, value
	sactionCloneSprite = 0x24,	 // Stack IN: source, target, depth
	sactionRemoveSprite = 0x25,	// Stack IN: target
	sactionTrace = 0x26,		   // Stack IN: message
	sactionStartDrag = 0x27,	   // Stack IN: no constraint: 0, center, target
								   //           constraint: x1, y1, x2, y2, 1, center, target
	sactionEndDrag = 0x28,		   // no arguments
	sactionStringLess = 0x29,	  // Stack IN: string, string, OUT: bool
	sactionWaitForFrame2 = 0x8D,   // skipCount (BYTE) Stack IN: frame
	sactionRandomNumber = 0x30,	// Stack IN: maximum, OUT: result
	sactionMBStringLength = 0x31,  // Stack IN: string, OUT: length
	sactionCharToAscii = 0x32,	 // Stack IN: character, OUT: ASCII code
	sactionAsciiToChar = 0x33,	 // Stack IN: ASCII code, OUT: character
	sactionGetTime = 0x34,		   // Stack OUT: milliseconds since Player start
	sactionMBStringExtract = 0x35, // Stack IN: string, index, count, OUT: substring
	sactionMBCharToAscii = 0x36,   // Stack IN: character, OUT: ASCII code
	sactionMBAsciiToChar = 0x37,   // Stack IN: ASCII code, OUT: character

	// Flash 5 Actions
	sactionConstantPool = 0x88, // create a set of constant
	sactionLess2 = 0x48,		// Stack IN: number, number, OUT: bool
	sactionEquals2 = 0x49,		// Stack IN: number, number, OUT: bool
	sactionCallMethod = 0x52,   // Stack IN: string, string, number, [number] OUT: return value or undefined

	// Reserved for Quicktime
	sactionQuickTime = 0xAA // I think this is what they are using...
};

enum {
	kStringType = 0,
	kFloatType = 1
};

enum {
	kSpritePosX = 0,
	kSpritePosY,
	kSpriteScaleX,
	kSpriteScaleY,
	kSpriteCurFrame,	// (can only get but not set)
	kSpriteTotalframes, // (can only get but  not set)
	kSpriteAlpha,		// (a value between 0 and 100 %)
	kSpriteVisible,		// (if zero this means we don't hit test the object)
	kSpriteWidth,		// (can only get, but not set)
	kSpriteHeight,		// (can only get, but not set),
	kSpriteRotate,
	kSpriteTarget,
	kSpriteLastFrameLoaded,
	kSpriteName,
	kSpriteDropTarget,
	kSpriteURL,
	kSpriteHighQuality,	// (global)
	kSpriteFocusRect,	  // (global)
	kSpriteSoundBufferTime // (global)
};

// Mouse target conditions
enum {
	stargetMouseEnter = 1,
	stargetMouseExit = 2,
	stargetMouseDown = 3,
	stargetMouseUp = 4
};

// Bitmap Alpha types
enum {
	sbitsAlphaFlag = 0, // just a flag that the alpha channel is valid
	sbitsAlphaCTab = 1, // alpha values for a color table
	sbitsAlphaMask = 2  // a complete alpha mask for a jpeg image
};

// Server Packet Flags
enum {
	spktObject = 0x00, // packet types
	spktFrame = 0x01,
	spktMask = 0x03,

	spktResend = 0x04, // flags for object packets

	spktSeekPoint = 0x04, // flags for frame packets
	spktKeyFrame = 0x08

	// Upper 4 bits are reserved for a sequence number
};

// Template Text Flags.
enum {
	stextEnd = 0x00,	   // end of text flag
	stextStyle = 0x80,	 // font style: followed by 8-bit flags (bold, italic, etc...)
	stextFont = 0x81,	  // font identifier: followed by 16-bit font identifier
	stextSize = 0x82,	  // font size: followed by 16-bit value in twips
	stextColor = 0x83,	 // font color: followed by 32-bit RGB value
	stextPosition = 0x84,  // font position: followed by 8-bit position (normal, super or subscript)
	stextKerning = 0x85,   // font kerning: followed by 16-bit kerning value in twips
	stextReserved1 = 0x86, // reserved value
	stextReserved2 = 0x87, // reserved value
	stextAlignment = 0x88, // paragraph alignment: followed by 8-bit alignment value
	stextIndent = 0x89,	// paragraph alignment: followed by 16-bit indent value in twips
	stextLMargin = 0x8a,   // paragraph left margin: followed by 16-bit left margin value in twips
	stextRMargin = 0x8b,   // paragraph right margin: followed by 16-bit right margin value in twips
	stextLeading = 0x8c,   // paragraph leading: followed by 16-bit leading value in twips
	stextReserved3 = 0x8d, // reserved value
	stextReserved4 = 0x8e, // reserved value
	stextReserved5 = 0x8f  // reserved value
};

// Template Text Style Flags
enum {
	stextStyleNone = 0x00,
	stextStyleBold = 0x01,
	stextStyleItalic = 0x02
	// 6 bits left for expansion
};

// Template Text Position Values
enum {
	stextPosNormal = 0x00,
	stextPosSuperScript = 0x01,
	stextPosSubScript = 0x02
};

// Template Text Alignment Values
enum {
	stextAlignLeft = 0x00,
	stextAlignRight = 0x01,
	stextAlignCenter = 0x02,
	stextAlignJustify = 0x03
};

// Template Text Flags
enum {
	sfontFlagsBold = 0x01,
	sfontFlagsItalic = 0x02,
	sfontFlagsWideCodes = 0x04,
	sfontFlagsWideOffsets = 0x08,
	sfontFlagsANSI = 0x10,
	sfontFlagsUnicode = 0x20,
	sfontFlagsShiftJIS = 0x40,
	sfontFlagsHasLayout = 0x80
};

// GetURL2 methods
enum {
	kHttpDontSend = 0,
	kHttpSendUseGet = 1,
	kHttpSendUsePost = 2,
	kHttpLoadTarget = 0x40,
	kHttpLoadVariables = 0x80
};

// Edit Text Flags
enum {
	seditTextFlagsHasFont = 0x0001,
	seditTextFlagsHasMaxLength = 0x0002,
	seditTextFlagsHasTextColor = 0x0004,
	seditTextFlagsReadOnly = 0x0008,
	seditTextFlagsPassword = 0x0010,
	seditTextFlagsMultiline = 0x0020,
	seditTextFlagsWordWrap = 0x0040,
	seditTextFlagsHasText = 0x0080,
	seditTextFlagsUseOutlines = 0x0100,
	seditTextFlagsBorder = 0x0800,
	seditTextFlagsNoSelect = 0x1000,
	seditTextFlagsHasLayout = 0x2000
};

// Drag constrants
enum {
	sdragFromPoint = 0,
	sdragFromCenter = 1
};
enum {
	sdragNoConstraint = 0,
	sdragRectConstraint = 1
};

#endif