TABLE OF CONTENTS animation.datatype/--datasheed-- animation.datatype/--model-- animation.datatype/ADTM_LOCATE animation.datatype/ADTM_PAUSE animation.datatype/ADTM_START animation.datatype/ADTM_STOP animation.datatype/DTM_COPY animation.datatype/DTM_FRAMEBOX animation.datatype/DTM_PRINT animation.datatype/DTM_PROCLAYOUT animation.datatype/DTM_REMOVEDTOBJECT animation.datatype/DTM_TRIGGER animation.datatype/DTM_WRITE animation.datatype/GM_GOACTIVE animation.datatype/GM_GOINACTIVE animation.datatype/GM_HANDLEINPUT animation.datatype/GM_HELPTEST animation.datatype/GM_HITTEST animation.datatype/GM_LAYOUT animation.datatype/GM_RENDER animation.datatype/MAIN animation.datatype/ObtainAnimationEngine animation.datatype/OM_DISPOSE animation.datatype/OM_GET animation.datatype/OM_NEW animation.datatype/OM_SET animation.datatype/OM_UPDATE animation.datatype/preferences animation.datatype/--datasheed-- animation.datatype/--datasheed-- NAME animation.datatype -- base datatype for animations SUPERCLASS datatypesclass DESCRIPTION The animation.datatype is the super-class for any animation related classes. This class is responsible for creating the controls, scaling, remapping and synchronization. METHODS OM_NEW -- Create a new animation object. Passed to superclass, then create internal resources, read preferences, then fall througth OM_SET. OM_GET -- Obtain the value of an attribute. Passed to superclass if the attribute is not recognized by animation.datatype class. OM_SET -- Set the values of multiple attributes. Passed to superclass first. OM_UPDATE -- Update the values of multiple attributes. Falls througth to OM_SET. OM_NOTIFY -- Notify new attributes. Passed to superclass. OM_DISPOSE -- Dispose of a animation object. Passed to superclass after animation.datatype instance has freed it's resources. GM_LAYOUT -- Layout the object and notify the application of the title and size. Passed to superclass first. GM_HITTEST -- Determine if the object has been hit with the mouse within the gadget domain rectange. Overrides the superclass. GM_HELPTEST -- Determinate if the object has been hit by an help test within the gadget help domain rectangle. Overrides the superclass. GM_GOACTIVE -- Tell the object to go active. Overrides the superclass. GM_HANDLEINPUT -- Handle input. Overrides the superclass. GM_GOINACTIVE -- Inactive the object. Overrides the superclass. GM_RENDER -- Cause the current frame to render. DTM_FRAMEBOX -- Obtain or set the display environment that the animation requires. Passed to superclass first. Currently, only "obtain" (e.g. FRAMEF_SPECIFY is NOT set) is implemented, "set" might be implemented by a subclass... DTM_PROCLAYOUT -- Layout object on application process. See GM_LAYOUT for functionality. DTM_REMOVEDTOBJECT -- Remove an object from the window/screen. Passed to superclass after all. DTM_TRIGGER -- Cause an async event to occur. Overrides the superclass. DTM_OBTAINDRAWINFO -- not implemented yet DTM_DRAW -- not implemented yet DTM_RELEASEDRAWINFO -- not implemented yet DTM_COPY -- Copy the current frame to the clipboard as an IFF ILBM picture. Overrides the superclass. DTM_WRITE -- Write the current or a specified frame to a file as an IFF ILBM picture. Overrides the superclass. DTM_PRINT -- Print the current or a specified frame. Overrides the superclass. ADTM_LOADFRAME -- Load a frame of the animation. ADTM_UNLOADFRAME -- Deallocate any memory allocated by ADTM_LOADFRAME. ADTM_START -- Start the animation. This MUST be passed to the super-class AFTER the sub-class has started. ADTM_PAUSE -- Pause the animation. This MUST be passed to the super-class BEFORE the sub-class pauses. ADTM_STOP -- Stop the animation. This MUST be passed to the super-class BEFORE the sub-class stops. ADTM_LOCATE -- Used to locate a frame of the animation. All other methods are passed to the superclass. ATTRIBUTES OBP_Precison (ULONG) -- Precision to use when obtaining colors. See the PRECISION_ defines in . Fixed to PRECISION_ICON (V40), Defaults to PRECISION_IMAGE V41). Applicability is () (V40) Applicability is (ISG) (V41) DTA_ControlPanel (BOOL) -- Determine whether the control panel is shown. Defaults to TRUE. (It is currently not recommned to change this attribute while the object is attached to a window/requester). Note: Chaning this attribute affects also the height returned by DTM_FRAMEBOX. Applicability is (I). Applicability is (ISGU) (V41) DTA_Repeat (BOOL) -- Determine whether the animation should repeat playing. Defaults to FALSE. Applicability is (ISGU) (V41) DTA_Immediate (BOOL) -- Indicate whether the animation should immediately begin playing. Defaults to FALSE. Applicability is (I). Applicability is (ISGU) (V41) ADTA_ModeID (ULONG) -- Set and get the graphic mode id of the picture. The mode id set here will be checked by BestModeIDA based on width/height/depth info of the animation. Defaults to 0. Applicability is (ISG). ADTA_KeyFrame (struct BitMap *) -- Pointer to the key frame. This bitmap should be allocated using AllocBitMap because this is the only way to force GetBitMapAttr and other functions to return correct attributary flags. This bitmap will be used for internal calculations and assumtions about bitmap data layout; the bitmaps got from ADTM_LOADFRAME have the same size and layout, but GetBitMapAttr may return wrong values for these bitmaps! Note that this bitmap type may change if someone says the object in which environment the object will be embedded in (DTM_FRAMEBOX). In this case a subclass may change the output format (preserving only ADTA_Width and ADTA_Height). Applicability is (ISG). ADTA_ColorRegisters (struct ColorRegister *) -- Color table. Applicability is (G). ADTA_CRegs (ULONG *) -- Color table to use with SetRGB32CM(). Applicability is (G). ADTA_GRegs (ULONG *) -- Color table (like ADTA_CRegs, but contains color values of allocated (shared) pens). Applicability is (G). ADTA_ColorTable (ULONG *) -- PRIVTAE ADTA_ColorTable2 (ULONG *) -- PRIVATE Applicability is (G). ADTA_Allocated (ULONG) -- Number of shared colors allocated. Applicability is (G). ADTA_NumColors (WORD) -- Number of colors used by the picture. (May be 0 in the case of a truecolor animatoin without a palette). Applicability is (ISG). ADTA_NumAlloc (WORD) -- Number of colors allocated by the picture. Applicability is (G). ADTA_Remap (BOOL) -- Indicate whether the animation should be remapped or not. Defaults to TRUE. Applicability is (IS). Applicability is (ISG) (V41). ADTA_Screen (struct Screen *) -- Screen to remap to Applicability is (IS) (V41). ADTA_NumSparse (UWORD) -- Number of colors used for sparse remapping Applicability is (IS) (V41). ADTA_SparseTable (UBYTE *) -- Pointer to a table of pen numbers indicating which colors should be used when remapping the image. This array must contain as many entries as there are colors specified with ADTA_NumSparse Applicability is (IS) (V41). ADTA_Width (ULONG) -- Width of a frame in pixels. Applicability is (ISG). ADTA_Height (ULONG) -- Height of a frame in pixels. Applicability is (ISG). ADTA_Depth (ULONG) -- Depth of the frame. Applicability is (ISG). ADTA_Frames (ULONG) -- Number of frames in animation. Defaults to 0, setting this attribute also affects ADTA_FrameIncrement (e.g. set it's to 10 except if ADTA_Frames < 50, then ADTA_FrameIncrement = ADTA_Frames / 5). Applicability is (ISG). ADTA_Frame (ULONG) -- Currect frame Setting of this attribute causes an ADTM_LOCATE ! Applicability is (G). Applicability is (SGU) (V41) ADTA_FramesPerSecond (ULONG) -- Number of frames per second to play. V40 limits this to 60 fps, V41 increases the limit up to 1200 fps (max. realtime.library resolution). (Setting this tag may also affect the default value for ADTA_NumPrefetchFrames.) Defaults to 10. Applicability is (ISG). ADTA_TicksPerFrame (ULONG) -- realtime.library ticks per frame Defaults to TICK_FREQ / 10 = 120 (Setting this tag may also affect the default value for ADTA_NumPrefetchFrames.) Applicability is (ISG) (V41). ADTA_CurrFramesPerSecond (ULONG) -- current frames per second rate The playback rate and sound playback speed are recalculated to match this value. If ADTA_AdaptiveFPS is TRUE, this value is recalculated to allow the maximum available playback speed on the hardware (limmitted by ADTA_FramesPerSecond) Applicability is (ISGU) (V41). ADTA_CurrTicksPerSecond (ULONG) -- current ticks per second rate The playback rate and sound playback speed are recalculated to match this value. If ADTA_AdaptiveFPS is TRUE, this value is recalculated to allow the maximum available playback speed on the hardware (limmitted by ADTA_TicksPerSecond) Applicability is (ISGU) (V41). ADTA_FrameIncrement (ULONG) -- Amount to change frame by when fast forwarding or rewinding. Defaults to 10 Applicability is (G). Applicability is (SGU) (V41) ADTA_BitMapHeader (struct BitMapHeader *) -- Set and get the base information for the animation. BitMapHeader is defined in Setting this tag causes the given struct BitMapHeader to be copie d into the object. This also causes ADTA_Width, ADTA_Height, ADTA_Depth to be set. Applicability is (G). Applicability is (ISG) (V41) ADTA_Sample (BYTE *) -- Pointer to sample data. Applicability is (ISG). ADTA_SampleLength (ULONG) -- Length of sample data. Applicability is (ISG). ADTA_Period (ULONG) -- Period to play back sample at. Defaults to 360. Applicability is (ISG). ADTA_Volume (ULONG) -- Volume to play back sample at. Defaults to 64. Applicability is (ISG). Applicability is (ISGU) (V41). ADTA_Cyles (ULONG) -- Cycles to play. Defaults to 1. Applicability is (G). ADTA_AdaptiveFPS (BOOL) -- If TRUE, the playback rate is limitted to the maximum reachable playback rate without frame skipping. Defaults to TRUE, but maybe changed using the prefs-file (V41). ADTA_SmartSkip (BOOL) -- If TRUE, some frames are skipped based on internal statistics to keep playback and sound in sync. Defaults to FALSE, but maybe changed using the prefs-file (V41). ADTA_NumPrefetchFrames (ULONG) -- Number of frames to be prefetched by the loading process. Must be at least 5, lower values are bumped to 5. Defaults to 1/2 fps value unless set explicietly by OM_SET or using the prefs-file (V41). ADTA_OvertakeScreem (BOOL) -- Overtake screen palette when not remapping. Applications should set this explicitly to FALSE if they don't want to be affected by this datatype. Defaults to TRUE, but maybe changed using the prefs-file (V41). BUGS Horrors. This version (V41.6) suffers under the 1001 nightmare bugs problem: After all, I think the current version has the following bugs: - The CPU blitter support is currently broken. Instead of doing a small speed comparisation between OS blitter and CPU blitter the CPU blitter is enabled on a mc68030 per default if remapping is required. Who likes to use the CPU blitter evertimes (if the subclass decoder creates planar output), set explicitly the CPUBLITTER switch in the prefs file, to turn off the CPU blitter evertimes is the OSBLITTER option. - timing may be slightly inaccurate. On a rate of 10 fps, this isn't bad, but using fps >= 1 or lower (e.g. ADTA_TicksPerFrame > 1200), you may see the problem. - ADTA_OvertakeScreen does not work correctly. Currently it is always set to TRUE. - Internal statistics (for ADTA_AdaptiveFPS, ADTA_SmartSkip etc.) are working now, but the wheighting of loading and display time can be made better. - ADTA_SmartSkip code has been disabled. - CyberGFX code has been disabled because it isn't tested yet. - Incompatible with the current V41.11 cgxsystem.library PLANES2FAST option, because the GetBitMapAttr function does not BMF_STANDARD flag and then animation.datatype treats the bitmaps as non-planar, which cannot be remapped. - planar bitmaps with depth > 8 are not supported yet, sorry. - tapedeck.gadget handling is very tricky, and may have some problems. - On a highly loaded system the animation playback can't be stopped on the fly (IPC communication has problems with this). This happens often when DTA_Repeat is set, and the ADTM_STOP, ADTM_START cycle occurs to rewind the animation. - IPC communication is __VERY__ complex. We have 5 (!) threads to be controlled and sync'ed: - loader process - display and control process - input.device - application process - realtime.library player interrupt Don't expect that all works fine here... - DTA_Repeat == TRUE does not work with anims with less than 3 frames, because the first frame is skipped. This causes problems with (for example) 2 frame gif animations. - ADTA_NumSpase and ADTA_SparseTable does not work yet, sorry. TODO - In HAM-mode, a box of color 0 should be drawn around the object to avoid some ugly HAM-effects when the background of the parent window is not 0. (Idea was taken from "cdgsxl"). - Remapping code HAM -> 24-bit - Remapping code EHB -> Other amiga modes - Support for non-planar bitmap types (chunkypixel etc.). - Support for 12/15/16/18/21/24-bit planar bitmaps (direct-RGB coded). - Get some more info about the mysterious tapedeck.gadget. - The CBM OS 3.1 tapedeck.gadget is limited to a height of 16 pixels. If I have time, I can write my own version WITHOUT this limitation... HISTORY V41.1 - Initial release to DataTypes Mailinglist V41.2 - Recompiled with SAS/C 6.58; this may fix mc68060 related problems. - Now the tapedeck update is slightly better because a "magic" update (using a gpr_Redraw of 100 instead of GREDRAW_UPDATE) is used. Thanks to Heinz Wrobel. - Fixed the bug that after resizing the parent window the height of the playback area was not restored. Fixed. - If the display screen is not visible, the old V40.6 turns of the bitmap display (using the VP_HIDE flags). Now V41 does the same. Thanks to Heinz Wrobel for explaining this. Because this may be a hack (not documented by the OS docs), this feature is turned off if the NOHACKS switch is set in the prefs file. - Fixed internal statistics (used for adaptive playback rate calculations). Now the datatype tracks time-to-unload-a-frame, too. - Fixed a problem with adaptive playback rate selection and dynamic timing. The new model seems to run more smoothly, but this is still a weak point. - Recompiled the project with DATA=FARONLY. I think that this should fix some problems. Thanks to Steve Krueger (sekruege@nando.net) for answering some questions. - Moved OS vs. CPU blitter selection code from GM_LAYOUT to the first GM_RENDER after GM_LAYOUT. This should be more reliable, and speeds up the initial window layout a little bit. - Seems that there is a bug in the CPU blitter (selection) code. For now I wrote a small workaround; the CPU blitter is enabled per default on a mc68030 if ADTA_Remap is set to TRUE (assuming that the cpu blitter function running on a mc68030 is a little bit faster than the OS blitter). - Updated the autodocs. - OM_DISPOSE now preserves result2 (e.g. IoErr() result) explicitly. - OM_DISPOSE now sets the embedded sound.datatype object's SDTA_Sample to NULL. This fixes possibly problems if a sound.datatype clone tries to FreeVec' the sample... - Removed code from OM_DISPOSE which is executed in DTM_REMOVEDTOBJECT (e.g. freeing of pens and tmp. bitmaps). - Now OM_GET ADTA_Sample, ADTA_SampleLength, ADTA_Period, ADTA_Volume and ADTA_Cycles are got from the current frame. This feature should work now. - Implemeted OM_GET ADTA_DestFrame (alias PDTA_DestBitMap). Note that accessing this bitmap is ONLY safe when the object does not do any playback; the same rule must be respected for ADTA_Sample, ADTA_SampleLength and ADTA_Period. - Added CBM cdxl.datatype compatibility hack (I'm __very__ angry about this problem because it took a long time to find the problem). It seems that CBM's cdxl.datatype requires that it's instance data are on long-word boundary because the data starts with a FileInfoBlock. Don't rely on this feature !!! - If the object setup (OM_NEW) failed in a sub-process, the error code is now passed to the parent process and there stored in Result2. This includes realtime.library errors, too. - Now uses AllocPooled and an internal memory management to avoid memory allocations whereever and whenever possible. - Internal divisions are now rounded when usefull. - Child processes are now starting in sequence instead of a parallel setup. This is only for testing; later I'll write the parallel setup again. - Fixed the bug that GM_RENDER with GREDRAW_REDRAW didn't work properly if the parents box was only changed of one of X- OR the Y-axis (e.g. EraseRect wasn't done in this case). - Fixed the bug that tapedeck.gadget was drawn even if the DTA_Domain height was below GA_Height (tapedeck.gadget can't clip in Y-direction). This fixes visual problems with embed.datatype. The check is also made in GM_HITTEST, GM_HELPTEST and GM_GOACTIVE. - If DTA_ControlPanel is FALSE and the mouse SELECTUP starts the playback, a following mouse SELECTUP now pauses the playback. - The stack swapping code now allocates it's memory without MEMF_CLEAR, which should result in a small speedup when doing things. - The library base now has 16 reserved lvo entries after ObtainEngine which returns all 0 for now. All these entries are reserved and private for now. - DTM_REMOVEDTOBJECT now passes the msg to superclass after doing it's work. This fixes problems with some datatypesclass internals. Fixed. - DTM_FRAMEBOX now passes the msg to superclass before doing it's work. Now datatypesclass can release the input clipboard which avoids that the clipboard unit is locked while the object exists. Fixed. - Fixed the bug that setting ADTA_ModeID to INVALID_ID caused havoc in the object (remapping code got turned off, the palette of a public screen was changed etc.). Now a ADTA_ModeID of INVALID_ID is treated as a 0UL mode id. Thanks to Francis Labrie (fb691875@er.uqam.ca) for reporting the bug. Fixed. - Fixed the bug that when the CPU blitter draws the display, a GM_RENDER showed the first frame. Now a GM_RENDER and other methods sync's the ADTA_DestFrame bitmap correctly (e.g. copy the (remapped) src bitmap) into ADTA_DestFrame) before using it. Fixed. - Changed some internals that moving the tapedeck.gadget's slider causes less overhead when loading single frames. - Now the animation.datatype instance data contents are on a long-word aligned boundary, which should speed up some things. (Tested only with Kick 3.0 yet). - Fixed a bug in the ADTA_OvertakeScreen code that caused that the last color in a palette change was set to black instead of the wanted color. Fixed. V41.3 INTERNAL RELEASE - Fixed the bug that a non-planar (chunky) bitmaps wasn't passed througth. - Improved internal GetPictureCopy (which is used to create the temp. object for DTM_COPY, DTM_WRITE, DTM_PRINT): - It now uses the key bitmap as a friend bitmap parameter. This may fix problems when processing non-planar bitmaps. WARNING: This may result in large problems if a < V43 picture.datatype is used in a GFX-card environment (CyberGFX, Picasso 96 etc.). - It now does not attempt to copy a colormap if is ADTA_NumColors == 0 (added this check to avoid some unneccesary memory copies which result all in a big NOP is this case). - Reduced the memory usage if non-planar input bitmaps are used by the subclass (the temporary bitmaps used for remapping etc. are not allocated (because they were not used...)). - Tests have shown that the PLANES2FAST option of cgxsystem.library V41.11 is incompatible with animation.datatype because the GetBitMapAttr function does not set BMF_STANDARD for these bitmaps even if they are planar. This causes that the bitmaps are treated as chunkypixel ones (where the remapping code can't touch them). Cannot be fixed yet. V41.4 Version for the "Compuler 97'" fair in Colone/Germany - Replaced the custom stack swapping code by my "standard" module - Fixed the bug that a failed palette allocation (e.g. setting of ADTA_NumColors) return random values for the ADTA_CRegs, ADTA_ColorRegisters etc. attributes if it was set more than once in objects lifetime and the allocation failes. The attributes now return correctly NULL in this case. Fixed. - If ADTA_NumColors is set to 0, now ADTA_CRegs, ADTA_ColorRegisters, ADTA_GRegs etc. return a NULL pointer instead of returning random values. - Minor code cleaup. - Oops, the last distribution missed the "datatypes/animationclassext.h" include file. V41.5 - Fixed a bug that some things (like internal CopyBitMapPlanar) only worked if the object has been added to the display. Fixed. - Fixed the bug that the alf_Duration field wasn't respected for ADTM_LOCATE and the first frames played back by ADTM_START. Fixed. - Enabled the remapping code for 8-bit chunkypixel bitmaps. This also fixes the problem with CyberGFX that planar bitmaps in are not detected in CGFX PLANES2FAST mode (but there a still a couple of bugs...). Should work now... - Fixed the bug (in theory, but it does never happen) that the load process did not clear some internal flags on exit which may cause deadlocks if an application fires ADTM_START after the object has been removed from display (which is illegal, but...). Fixed. - Major changes in the IPC communication and timing parts. Main reason was to reduce the delay gap caused by a repeat rewind (if DTA_Repeat is TRUE). - OM_GET ADTA_Sample, ADTA_SampleLength, ADTA_Period refers to the current frame, if there is no current frame the attributes refers to the first frame. The "feature" introduced in V41.2 to get the "current" values from the sound.datatype object wasn't very usefull because CBM's sound.datatype did not support OM_GET for these attributes. V41.6 - Fixed the bug that STM_LOCATE did not work properly. The DTA_TriggerMethods info says that "Locate" is (STM_LOCATE | STMD_ULONG), but the trigger command dispatcher checked the old STM_LOCATE (without the STMD_#? flag). Now the trigger command dispatcher masks the trigger method using ((trigger_method) & ~STMF_DATA_MASK) to get rid of the STMD_#? info... Fixed. - Added SHARECHIP / NOSHARECHIP options. Before V41.6, the animation.datatype tests incoming planar bitmaps of they lie in chipmem can can be passed to BltBitMapRastport directly without using a copy to a chipmem buffer. Now this test is avoided unless the SHARECHIP option is on again. The prefs docs about this option explains why this may be good in certain cases... - tapedeck.gadget's special GM_RENDER mode 100 (GREDRAW_SLIDER, e.g .. only update embedded slider) is never more treated as an hack. - Small speedup because tapedeck's rastport using for GM_RENDER/GREDRAW_SLIDER is now set up at GM_LAYOUT time instead of a once-pre-draw setup. - The 8-bit-chunkypixel remapping code has been re-written. It now remaps RPL8 / remap / WPL8 instead using a RPA8 / remap / WPA8 cycle (the line-by-line should be more cache-friendly and therefore faster...). The memory needed for this remapping is also reduced significantly... - The 8-bit-chunkypixel remapping code never more checks for the return codes of RPL8/RPA8 nor WPL8/WPA8. It seems that the GFX-Card driver software sometimes returns rubbish here... Should fix some reported blank displays... - Added support for FIF_ABILITIES (bit 31, (0x80000000UL)). This flag indicates that animation.datatype supports the FIF_#? flags. "GMultiView" for example now looks on this flag and is able to show a HAM/EHB animation on a public screen if we support the remapping for it. - Fixed the bug that DTM_TRIGGER did not send DTERROR_COULDNT_SEND_MESSAGE in the case of no receiver. Fixed. - Now SAS/C's build-in math functions are used instead of the C macros... - Changed the default value of ADTA_NumPrefetchFrames. Instead of 10 frames to prefetch now (1/2 fps) number of frames will be pre-fetched during loading. Setting ADTA_NumPrefetchFrames explicitly by OM_SET or by the prefs-file will turn this automatic selection off again... This may give a more reasonable default value for mpegvideo.datatype's NOLOADALL mode... - Fixed the bug in OM_NEW that if realtime.libary/CreatePlayerA failed with an PLAYER_ErrorCode error not of RTE_NOMEMORY or RTE_NOCONDUCTOR Result2 (IoErr) was set to 0. Due lack of a good dos.library error code if've set the code to 1234L for now. Fixed. - Small modifications in the code which may caused problems with animations with more than 16384 pixel width and/or height. These dimensions are currently therorectical, but: Fixed. - DTM_REMOVEOBJECT now causes that all queuing frames in the display queue are disposed (e.g. moved to the dispose queue). This avoids the bug that removing the object from a window and re-attaching it again may cause that next play cycle will display these frames first. Fixed. - The priority of the display and load processes are now set up based on the parent process priority (e.g. the process which executes OM_NEW). The display process gets parent process priority, the load process gets "parent priority - 1". This allows to run the playback at higher priorities. - { GA_Immediate, TRUE } is not set any more for the tapedeck.gadget. This seems to fix some problems with input processing from tapedeck.gadgets. - Fixed the bug that tapedeck.gadget's TDECK_CurrentFrame attribute wasn't updated if DTA_ControlPanel is set to TRUE. Fixed. - ADTM_START now clears the load queue explicitly if the first frame in the queue matches not the given "asa_Frame". SEE ALSO mpegsystem.datatype, mpegvideo.datatype, picmovie.datatype, cdxl.datatype. avi.datatype, quicktime.datatype, moviesetter.datatype, film.datatype THANKS TO David Junod for the design and the first implemenation, Olaf Barthel for his great help, Heinz Wrobel for explaining some things. Frank Mariak for his CPU blitter replacement and CyberGFX support, Niels Froeling for the planar remapping code, and the people of the DataTypes Mailing list for testing and their help animation.datatype/--model-- animation.datatype/--model-- MODEL The following short text should describe how the animation.datatype works (in general): The animation.datatype is split up in four parts: 1. the decoder (the subclass which sits on animation.datatype) 2. the loading process 3. the display and control process 4. a realtime.library Player (timing interrupt) 5. a control process (application process, or input.device) 1. The Decoder The decoder part belongs completely to the subclass (sitting on animation.datatype). animation.datatype communicates through methods (ADTM_START, ADTM_PAUSE, ADTM_STOP, ADTM_LOCATE, ADTM_LOADFRAME and ADTM_UNLOADFRANE) with the subclass. Mainly, ADTM_LOADFRAME and ADTM_UNLOADFRAME are used to load/unload a frame from the subclass. 2. The Loading Process The loading process has a simple task: Load as much frames as possible and store the frames into a "frame queue". The idea is that the loading process (which runns at a lower priority than the display process) consumes all CPU time which is not used by the display process. The load process is controlled by the display and the control process (the application., for example), which can set one of the following modes for the load process: a) preload: Load the next 10 (can be changed by the prefs-file) frames, then stop. b) play: Fill the "frame queue" until it is full (e.g. until it reaches 10 frames or more). c) stop: Stop loading and preloading d) flush: flush frame queue 3. The Display Process The display process is responsible for remapping and displaying of frames during playback. If signalled by the realtime.library Player, the display process gets the first frame from the frame queue, remapps it (if neccesary) and displays it. If a sample is attached to the frame, the sample is fed to the embedded sound.datatype object. 4. The realtime.library Player (Timing Interupt) The player has the job to decrase a counter each 1/1200 sec. If the counter reaches 0, it is time to display the next frame, and the interrupt fires a signal to the display process to trigger the display of the frame. 5. The Control Process There is no fixed control process. But the application is allowed to send ADTM_START, ADTM_PAUSE, ADTM_STOP and ADTM_LOCATE to trigger a playback, pause or stop it - or locate a single frame. The same counts for the user, who plays with the embedded tapedeck.gadget. animation.datatype/ADTM_LOCATE animation.datatype/ADTM_LOCATE NAME ADTM_LOCATE -- Locate a frame FUNCTION ADTM_LOCATE locates a frame and displays it. RESULT Returns non-zero on success, 0UL on failure. NOTE animation.datatype/ADTM_PAUSE animation.datatype/ADTM_PAUSE NAME ADTM_PAUSE -- Pause an animation playback FUNCTION ADTM_PAUSE pauses an animation playback. If the playback is currently active, it will be paused, then the sound is turned off. The load process is turned off, too. RESULT Non-zero if the playback has been turned off successfully. 0UL if on error (object is not attached to a window etc.). NOTE - This method MUST be passes to the super-class (animation.datatype) before the sub-class pauses ! - Subclasses can treat this method like ADTM_STOP. Unlike ADTM_STOP, a subclass should not reset any frame counter (or Seek to any other file position, for example), because in the most cases the playback starts again at this position. animation.datatype/ADTM_START animation.datatype/ADTM_START NAME ADTM_START -- Start animation playback FUNCTION ADTM_START starts the animation playback. First the timer is reset to the current frame. If the load process is inactive, it will be activated; this method waits until a preload cycle is done. Then the timer is activated and sound will be turned on. Starting with V41, this method is a NOP when the object is not attached to a window/requester (this allows custom players to use ADTM_START and the subclass optimisations made in a ADTM_START / ADTM_STOP cycle). RESULT Returns Non-Zero if playback has been started successfulls. Returns 0UL on failure (e.g. objectnot attached to a window etc.) NOTE - Subclasses can use ADTM_START to optimize playback. Starting with ADTM_START and ADTM_PAUSE/ADTM_STOP, a continous range of frames is read by the loading process. A common example usage (in a subclass) is to send the first read-packets (for the timstamp given in adtStart -> asa_Frame) asyncrounous to the filesystem. Don't wait for the packets ! ADTM_LOADFRAME should do this. - Subclasses must prepare for playback BEFORE passing this msg to animation.datatype, because the loading process will immediately start loading. - Subclasses MUST NOT hold any locks which are also locked in ADTM_LOADFRAME / ADTM_UNLOADFRAME when passing ADTM_START to animation.datatype. This causes a deadlock because the process which is running ADTM_START will wait until the load process has finished it's playback, but the load process is waiting for the semaphore which is locked by the ADTM_START process. - Starting with V41, this method gurantees that the playback has been started on exit. - Starting with V41, this method is safe when the object is not attached to a window. animation.datatype/ADTM_STOP animation.datatype/ADTM_STOP NAME ADTM_STOP -- Stops an animation.datatype playback FUNCTION ADTM_STOP stops an animation playback. If the playback is currently active, it will be stopped, then the sound is turned off. The load process is turned off, too. RESULT NOTE - This method MUST be passes to the super-class (animation.datatype) before the sub-class stops ! - Starting with V41 this method gurantees that the playback has been stopped on exit. animation.datatype/DTM_COPY animation.datatype/DTM_COPY NAME DTM_COPY -- Copy current frame to primary clipboard unit FUNCTION DTM_COPY copies the current frame as an IFF ILBM frame to the primary clipboard (unit 0). Starting with animation.datatype V41, this method creates a temporary picture.datatype object, which will be fed with bitmap, colormap, DTA_ObjName, DTA_ObjAuthor, DTA_ObjAnnotation, DTA_ObjCopyright, DTA_ObjVersion, ADTA_BitMapHeader, ADTA_ModeID, ADTA_NumColors, ADTA_ColorRegisters, ADTA_CRegs. Then this method is passes to the picture.datatype object. Before V41, animation.datatype used it's own clipboard saving code. RESULT The return code from the picture.datatype object. NOTE SEE ALSO picture.datatype/DTM_COPY animation.datatype/DTM_FRAMEBOX animation.datatype/DTM_FRAMEBOX NAME DTM_FRAMEBOX -- Get/or set the object's environment FUNCTION The DTM_FRAMEBOX method is used to set or get the object's environment. The FRAMEF_SPECIFY flag defines the mode of this method. If FRAMEF_SPECIFY is not set the object returns it's preferred (optimum) enviroment in dtf_FrameInfo (output). If FRAMEF_SPECIFY is set, the application tells the object about it's destination environment (got from dtf_ContentsInfo); animation.datatype does nothing here (NOP), but a subclass can use this to select a matching dither mode or select the best-matching stream (in multi-stream animations like MPEG-2). RESULT Returns non-zero for success, 0 for failure (NOP). NOTE animation.datatype/DTM_PRINT animation.datatype/DTM_PRINT NAME DTM_PRINT -- Print current or specified frame to file. FUNCTION DTM_PRINT prints the current or a specifed frame as an IFF ILBM picture to the printer. Starting with animation.datatype V41, this method creates a temporary picture.datatype object, which will be fed with bitmap, colormap, DTA_ObjName, DTA_ObjAuthor, DTA_ObjAnnotation, DTA_ObjCopyright, DTA_ObjVersion, ADTA_BitMapHeader, ADTA_ModeID, ADTA_NumColors, ADTA_ColorRegisters, ADTA_CRegs. Then this method is passes to the picture.datatype object. Before V41, animation.datatype used it's own printer code. TAGS ADTA_Frame (ULONG) -- (V41) Timestamp of the frame to print. Defaults to the current frame. DTA_RastPort, DTA_DestCols, DTA_DestRows and DTA_Special are also recognised by the picture.datatype DTM_PRINT code. See picture.datatype/DTM_PRINT or datatypesclass autodoc. RESULT The return code from the picture.datatype object. BUGS - DTA_SelectDomain is ignored in V41 (as the whole DTM_SELECT code is not working yet). NOTE SEE ALSO picture.datatype/DTM_PRINT animation.datatype/DTM_PROCLAYOUT animation.datatype/DTM_PROCLAYOUT NAME DTM_PROCLAYOUT -- Layout an animation.datatype object on applications process FUNCTION RESULT NOTE animation.datatype/DTM_REMOVEDTOBJECT animation.datatype/DTM_REMOVEDTOBJECT NAME DTM_REMOVEDTOBJECT -- Release all window/screen related resources FUNCTION DTM_REMOVEDTOBJECT is used to remove a animation.datatype object from screen context. The playback is stopped (using ADTM_STOP), then all resouces allocated in the initial GM_LAYOUT are freed. This includes shared or exclusive pens allocated, temporary bitmaps etc. After all, the method is passed to superclass. After using this method, the object is removed from screen's context and can be re-used in another screen. RESULT Returns return value from superclass. NOTE This method is normally invoked from within datatypes.library/RemoveDTObject. Manual usage is only neccesary where AddDTObject wasn't used (see embed.datatype for example). animation.datatype/DTM_TRIGGER animation.datatype/DTM_TRIGGER NAME DTM_TRIGGER -- Trigger an action FUNCTION Trigger an asyncrounous (!) action on the object. Supported are: Label | Command | Function | Parameters ----------------+-----------+-------------------------+------------ "Pause" | "PAUSE" | STM_PAUSE | STMD_VOID "Play" | "PLAY" | STM_PLAY | STMD_VOID "Rewind", | "REWIND" | STM_REWIND | STMD_VOID "Fast Forward" | "FF" | STM_FASTFORWARD | STMD_VOID "Stop" | "STOP" | STM_STOP | STMD_VOID "Locate" | "LOCATE" | STM_LOCATE | STMD_ULONG - Pause Pauses the current playback. The control process simply does a ADTM_PAUSE here. - Play Start playback - Rewind Skips ADTA_FrameIncrement frames back - Fast Forward Skips ADTA_FrameIncrement frames forward - Stop Stops the current playback. The control process simply does a ADTM_STOP here. - Locate The given parameter (dtt_Data; treated as ULONG) is used as the frame number (or timestamp) to locate (e.g. load and display this frame). This is simmilar to ADTM_LOCATE (but this isn't done here yet). Be sure to look at datatypes.library/GetDTTriggerMethodDataFlags to check whether a trigger method requires an argument or not ! RESULT Returns non-zero for success, 0 for failure (and result2 set to the cause: ERROR_NO_FREE_STORE - no memory DTERROR_COULDNT_SEND_MESSAGE - object not ready to send (should NOT occur) ERROR_ACTION_NOT_KNOWN - unknown STM_#? type BUGS - The given STM_#? type is not checked if it is supported or not. NOTE - Once again: This method is asyncrounous. You cannot assume that the triggered action is started nor finished after DTM_TRIGGER returns. - Common usage is a button field or a menu item to let the user to some actions on the object. SEE ALSO datatypes.library/GetDTTriggerMethodDataFlags animation.datatype/DTM_WRITE animation.datatype/DTM_WRITE NAME DTM_WRITE -- Copy current or specified frame to file. FUNCTION DTM_WRITE copies the current or a specifed frame as an IFF ILBM picture to the given filehandle. Starting with animation.datatype V41, this method creates a temporary picture.datatype object, which will be fed with bitmap, colormap, DTA_ObjName, DTA_ObjAuthor, DTA_ObjAnnotation, DTA_ObjCopyright, DTA_ObjVersion, ADTA_BitMapHeader, ADTA_ModeID, ADTA_NumColors, ADTA_ColorRegisters, ADTA_CRegs. Then this method is passes to the picture.datatype object. Before V41, animation.datatype used it's own saving code. TAGS ADTA_Frame (ULONG) -- (V41) Timestamp of the frame to save. Defaults to the current frame. RESULT The return code from the picture.datatype object. NOTE - Subclasses may implement ADTA_Frame, ADTA_Frames and ADTA_FrameIncrement for their own encoders. SEE ALSO picture.datatype/DTM_WRITE animation.datatype/GM_GOACTIVE animation.datatype/GM_GOACTIVE NAME GM_GOACTIVE -- Activate an animation.datatype gadget FUNCTION The GM_GOACTIVE method is used to indicate to a gadget that it has become active. This method overrides the superclass. See also GM_HANDLEINPUT, because this method is exactly the the same except the following things: - If the gpInput message mouse position is over the tapedeck.gadget it will become the active member (unless it has GA_Disabled == TRUE set for any reason). RESULT See GM_HANDLEINPUT NOTE animation.datatype/GM_GOINACTIVE animation.datatype/GM_GOINACTIVE NAME GM_GOINACTIVE -- Decativate an animation.datatype object FUNCTION The GM_GOINACTIBE method is used to indicate that the animation.datatype gadget has become inactive. This method overrides the superclass. If the embedded tapdeck.gadget was active, this method will be passed to it. RESULT The return code from the superclass is returned. NOTE animation.datatype/GM_HANDLEINPUT animation.datatype/GM_HANDLEINPUT NAME GM_HANDLEINPUT -- Process gadget input events FUNCTION The GM_HANDLEINPUT method is used to handle te input events of an active animation.datatype gadget. This method overrides the superclass. If there is an active member (currently only tapedeck.gadget), all messages are passed througth to it. If there is no tapedeck.gadget in the display (e.g. DTA_ControlPanel == FALSE) and the object is not playing, a mouse SELECTUP starts the playback. If the object is playing, a SELECTUP pauses the playback. RESULT Do not interpret the results here, due they're a result of private internal activity. A later version will define here valid values. NOTE animation.datatype/GM_HELPTEST animation.datatype/GM_HELPTEST NAME GM_HELPTEST -- Test if object has been hit by a help request FUNCTION The GM_HELPTEST method is used to determine if the given mouse coordinates are within the help domain of the animation.datatype gadget. This method overrides the superclass. If the mouse position is over the embedded tapdeck.gadget, this method is passed to it. RESULT GMR_HELPHIT or the return value of the embedded tapedeck.gadget NOTE animation.datatype/GM_HITTEST animation.datatype/GM_HITTEST NAME GM_HITTEST -- Test if object has been hit by mouse FUNCTION The GM_HITTEST method is used to determine if the given mouse coordinates are within the domain of the animation.datatype gadget. This method overrides the superclass. If the mouse position is over the embedded tapdeck.gadget, this method is passed to it. RESULT GMR_GADGETHIT or the return value of the embedded tapedeck.gadget NOTE animation.datatype/GM_LAYOUT animation.datatype/GM_LAYOUT NAME GM_LAYOUT -- Layout an animation.datatype object FUNCTION RESULT Returns return value from superclass. NOTE animation.datatype/GM_RENDER animation.datatype/GM_RENDER NAME GM_RENDER -- Render an animation.datatype gadget FUNCTION The GM_RENDER method is used to render an animation.datatype object with the current frame. This method is also passed to the embedded tapedeck.gadget if DTA_ControlPanel is TRUE and if there is enougth space to render it (currenty a domain height < 16 pixels causes the tapedeck.gadget not to be rendered) . This method overrides the superclass. If this is the first GM_RENDER/GREDRAW_REDRAW after the initial GM_LAYOUT and DTA_Immediate was set to TRUE, the playback is started here. RESULT This method returns 0. NOTE animation.datatype/MAIN animation.datatype/MAIN INTRODUCTION animation.datatype is the datatypes base class for all animation and movie subclasses. It is responsible for remapping, sound, scronisation, creating the controls and misc. other things FEATURES - Supports now the full animation.datatype interface like defined in include31:datatypes/animationclass.h: - Supports palette-per-frame, e.g. each frame can have it's own palette. - Dynamic timing. A frame can have a variable duration until the next frame occurs. - Fully compatible to the original animation.datatype V40.7 - Configurable througth a preferences file. - Includes a CPU blitter for planar screens. If enabled by the prefs file, animation.datatype uses a CPU blitter instead of the OS blitter. - CyberGFX compatible: - Now animation.datatype V41 can handle non-planar bitmaps, e.g. chunkypixel bitmaps, as input. (Currently they cannot be remapped, the bitmaps are displayed unchanged on the destination screen). - Supports HAM/EHB -> 24-bit remapping. (TEMPORARY DISABLED). - No skipping anymore. The aniation.datatype V41 introduces a new feature called "adaptive frame rate selection". Instead of skipping frames when they cannot be displayed in real-time, the FPS rate is now adapted to fit (e.g. the maximum available playback speed without skipping). REQUIREMENTS - You need at least Kick/WB 3.0. - "realtime.library", >= V39 - for timing - "gadgets/tapedeck.gadget" (any version) - for the controls You need "sound.datatype" >= V40 for sound support. USAGE Usage is very simply: If you have loaded an animation, you can control the animation using the tapedeck gadget at the bottom: "<<" skips some frames back ">" starts playing ">>" skips some frames forward. The slider part can be used to move manually to a specific postion in the animation/movie. Note that there is also a prefs-file where you can set various options. See "preferences" section for details. INSTALLATION After unpacking this archive: Because this version does not include an Installer script, you have to do the installation manually through the shell: - Unpack this archive and copy the "animation.datatype" to SYS:Classes/DataTypes/: Copy CLONE FROM "animation.datatype" TO "SYS:Classes/DataTypes/animation.datatype" AUTHOR If you want to blame me, report any bugs, or wants a new version send your letter to: Roland Mainz HohenstaufenstraBe 8 52388 Norvenich GERMANY Phone: (+49)(0)2426/901568 Fax: (+49)(0)2426/901569 EMAIL is also available (if you want to send me attachments larger than 1MB (up to 5MB, more with my permission): GISBURN@w-specht.rhein-ruhr.de Up to April 1998 I'm reachable using this email address, too: Reinhold.A.Mainz@KBV.DE | Please put your name and address in your mails ! | German mailers should add their phone numbers. | See BUGS section above when submitting bug reports. Sorry, but I can only look once a week for mails. If you don't hear something from me within three weeks, please send your mail again (but watch about new releases) (problems with this email port are caused by reconfigurations, hackers, network problems etc.). The entire "animation.datatype" package may be noncommercially redistributed, provided that the package is always distributed in it's complete form (including it's documentation). A small copy fee for media costs is okay but any kind of commercial distribution is strictly forbidden without my permission ! Comments and suggestions how to improve this program are generally appreciated! Thanks to: See "--datasheed--/THANKS TO" section... animation.datatype/ObtainAnimationEnginemation.datatype/ObtainAnimationEngine NAME ObtainAnimationEngine -- Obtain the pointer to the animation class. SYNOPSIS class = ObtainAnimationEngine(); d0 struct IClass *ObtainAnimationEngine( void ); FUNCTION This function is used to obtain the pointer to the class structure for this public BOOPSI class. RETURNS Returns a pointer to a valid public BOOPSI class pointer. NOTE - This function is also known as ObtainEngine. See "include31:clib/dtclass_protos.h" - Starting with V41, animation.datatype has a struct ClassLibrary structure (see V42 "include:intuition/classes.h") in it's classbase, where the BOOPSI class pointer can be obtained from. This method should be preferred over ObtainAnimationEngine. animation.datatype/OM_DISPOSE animation.datatype/OM_DISPOSE NAME OM_DISPOSE -- Dispose aniation.datatype class instance FUNCTION This method disposed all animation.datatype instance related rousources, including the tapedeck.gadget, the player etc. RESULT Returns the return value of the superclass. NOTE animation.datatype/OM_GET animation.datatype/OM_GET NAME OM_GET -- Get the value of an attribute FUNCTION The OM_GET method is used to get a value of an attribute. ADTA_DestFrame (struct BitMap *) (V41) -- current remapped frame (the matching palette can be found in ADTA_GRegs). Note that reading this attribute is only save when the object is NOT playing. ADTA_Sample (UBYTE *) (V41) -- current frame's sample. Note that reading this attribute is only safe when the object is NOT playing. ADTA_SampleLength (ULONG) (V41) -- current frame's sample length. Note that reading this attribute is only safe when the object is NOT playing. ADTA_Period (ULONG) (V41) -- current frame's sample period. Note that reading this attribute is only safe when the object is NOT playing. ADTA_Volume (ULONG) (V41) -- global volume. ADTA_Cycles (ULONG (V41) -- fixed to 1 RESULT Returns non-zero on success, 0 on failure (attribute not recognized by OM_GET). NOTE animation.datatype/OM_NEW animation.datatype/OM_NEW NAME OM_NEW -- Create a new animation.datatype object FUNCTION The OM_NEW method is used to create an instance of the animation.datatype class. This method is passed to the superclass first. After this, it sets up the instance data, creates sound and tapedeck objects, and the load and display processes. After all, when the object and the embedded objects and threads are ready for action, this method returns. On error this method calls OM_DISPOSE for it's own instance (e.g. CoerceMethod( cl, (Object *)retval, OM_DISPOSE );) and returns an error code. RESULT On success, a ptr to the object is returned, on failure, 0UL is returned, Result2 (IoErr()) contains the cause. NOTE animation.datatype/OM_SET animation.datatype/OM_SET NAME OM_SET -- Set the attributes of a animation.datatype object FUNCTION The OM_SET method is used to set the attributes of a animation.datatype gadget. This method is passed to the superclass first. TAGS DTA_TopVert (LONG) -- Used to specify the vertical top image position. The value is stored in struct DTSpecialInfo -> si_TopVert. Values < 0 are set to 0. Setting this value causes that the object returns non-zero for OM_SET/OM_UPDATE, which should trigger an GM_RENDER with GREDRAW_UPDATE (the topmost instance is responsible for doing this). This overrides superclass's functionality. DTA_TopHoriz (LONG) -- Used to specify the horizontal top image position. The value is stored in struct DTSpecialInfo -> si_TopHoriz. Values < 0 are set to 0. Setting this value causes that the object returns non-zero for OM_SET/OM_UPDATE, which should trigger an GM_RENDER with GREDRAW_UPDATE (the topmost instance is responsible for doing this). This overrides superclass's functionality. ADTA_Remap (BOOL) -- Indicate whether the picture should be remapped or not. ADTA_Remap == TRUE does only work if DTM_FRAMEBOX sets the FIF_REMAPABLE flag to indicate that animation.datatype can remap the incoming data. WARNING: This tag MUST not be changed while the object is attached to a window or requester ! Applicability is (ISGU). RESULT Non-zero if a GM_RENDER with GREDRAW_UPDATE should be triggered by the topmost class. NOTE SEE ALSO OM_UPDATE, OM_NEW animation.datatype/OM_UPDATE animation.datatype/OM_UPDATE NAME OM_UPDATE -- Update attributes FUNCTION OM_UPDATE updates anmation.datatype attributes, see OM_SET for details. TAGS See OM_SET autodoc. RESULT NOTE SEE ALSO OM_SET, OM_NEW animation.datatype/preferences animation.datatype/preferences NAME preferences DESCRIPTION The "ENV:Classes/DataTypes/animation.prefs" file contains global settings for the animation datatype. The preferences file is an ASCII file containing one line where the preferences can be set. It can be superset by a local variable with the same name. Each line can contain settings, special settings for some subclasses can be set using the MATCHCLASS option. Lines beginning with a '#' or ';' chars are treated as comments. Lines are limitted to 256 chars. TEMPLATE MATCHCLASS/K,VERBOSE/S,ADAPTIVEFPS/S,NOADAPTIVEFPS/S, NUMPREFETCHFRAMES/K/N,WAITBOVP/S,NOWAITBOVP/S,OSBLITTER/S, CPUBLITTER/S,CHOOSEBLITTER/S,SHARECHIP/S,NOSHARECHIP/S,HACKS/S, NOHACKS/S MATCHCLASS -- Public class name. If given, the current prefs line is only for this subclass only. Example: MATCHCLASS="cdxl.datatype" VERBOSE -- Print information about the animation. ADAPTIVEFPS -- If set, the animation.datatype recalculates the playback rate that all frames and sounds can be displayed without skipping. This option is on per default starting with animation.datatype V41 NOADAPTIVEFPS -- Turns the ADAPTIVEFPS flag off. NUMPREFETCHFRAMES -- Increases the number of frams which should be pre-fetched by the load process. Note: Increasing this value may cause the animation to run more smoothly, but takes also more memory. Defaults to 10. WAITBOVP -- Wait until raster beam reaches the bottom of the current viewport (screen). Only useful with some Gfx-Card-Software or graphics.library > V40. (In the future this option should be enabled if CyberGFX >= V41 is detected). NOWAITBOVP -- Turns WAITBOVP flag off. OSBLITTER -- Use OS blitter even on planar screens. It is mutually exclusive to CPUBLITTER and CHOOSEBLITTER options. This option is off per default. CPUBLITTER - Use CPU blitter on planar screens. It is mutually exclusive to OSBLITTER and CHOOSEBLITTER options. This option is off per default. CHOOSEBLITTER -- If destination is a planar screen, the datatype makes a speed comparisation whether CPU or OS blitter is faster. It is mutually exclusive to OSBLITTER and CPUBLITTER options. This option is on per default. SHARECHIP -- animation.datatype <= V41.5 tests incoming planar bitmaps if they're in chipmem (using TypeOfMem) or not; if they're in chipmem and there's no remapping required, they're passed througth to BltBitMap rastport directly instead of copy'ing them to a chipmem buffer and blit from there. Using this option the TypeOfMem test can be turned on again, which may be usefull for high-speed animations (> 30 fps) on an own MultiView screen using the Amiga native screen modes. This option is off per default. NOSHARECHIP -- Turns the SHARECHIP option off. This option is on per default. HACKS -- Use some internal hacks (system-conform, but I don't like them). This option is on per default. NOHACKS -- Turns HACKS option off. NOTE An invalid prefs file line will be ignored and forces the VERBOSE output. BUGS - Low memory may cause that the prefs file won't be parsed. - Lines are limitted to 256 chars - An invalid prefs file line will be ignored. - The sample path length is limitted to 200 chars. A larger value may crash the machine if an error occurs. .