NAME InstallLayerHook -- safely install a new Layer->BackFill hook. (V36) SYNOPSIS oldhook = InstallLayerHook( layer, hook ) d0 a0 a1 struct hook *installlayerhook( struct layer *, struct hook *); FUNCTION Installs a new Layer->Backfill hook, waiting until it is safe to do so. Locks the layer while substituting the new hook and removing the old one. If a new hook is not provided, will install the default layer BackFill hook. INPUTS layer - pointer to the layer in which to install the Backfill hook. hook - pointer to layer callback hook which will be called with object == (struct rastport *) result->rastport and message == [ (Layer *) layer, (struct Rectangle) bounds, (LONG) offsetx, (LONG) offsety ] This hook should fill the rectangle in the rastport with the BackFill pattern appropriate for offset x/y. If hook is LAYERS_BACKFILL, the default backfill is used for the layer. (Same as pre-2.0) As of V39: If hook is LAYERS_NOBACKFILL, the layer will not be backfilled (NO-OP). RESULTS oldhook - pointer to the Layer->BackFill hook that was previously active. Returns NULL if it was the default hook. In V39, it could return 1 if there was no hook. EXAMPLE The following hook is a very simple example that does rather little but gives the basis idea of what is going on. * * This is the code called by the layer hook... * Note that some other setup is required for this to work, including * the definition of the PrivateData structure (pd_...) and the * definition of the BitMapPattern structure (bmp_...) * CoolHook: xdef CoolHook movem.l d2-d7/a3-a6,-(sp) ; Save these... move.l h_SubEntry(a0),a4 ; (my private data #1 here) move.l h_Data(a0),a5 ; Put data into address reg * * Now, we do the rendering... * Note that the layer may not be important... But it is here... * move.l (a1)+,a0 ; Get the layer... * * a1 now points at the rectangle... * move.l pd_GfxBase(a4),a6 ; Point at gfxbase move.l bmp_Pattern(a5),d0 ; Get PatternBitMap beq SimpleCase ; None? Simple (0) case * * Now do the complex case of a pattern... * move.l a1,a3 ; Pointer to rectangle addq.l #8,a1 ; Get past rectangle move.l (a1)+,d2 ; X Offset (For pattern) move.l (a1)+,d3 ; Y Offset ; ; Whatever complex blitting you would do in the complex case ; goes here ; * * No bitmap, so just do the simple (0) minterm case... * SimpleCase: moveq.l #0,d2 ; Clear d2 move.w ra_MinX(a1),d2 ; Get X pos * moveq.l #0,d3 move.w ra_MinY(a1),d3 ; Get Y pos * moveq.l #0,d4 move.w ra_MaxX(a1),d4 sub.l d2,d4 addq.l #1,d4 ; Get X size * moveq.l #0,d5 move.w ra_MaxY(a1),d5 sub.l d3,d5 addq.l #1,d5 ; Get Y size * move.l d2,d0 ; X Source move.l d3,d1 ; Y Source moveq.l #0,d6 ; NULL minterm moveq.l #-1,d7 ; FF mask * move.l rp_BitMap(a2),a1 ; Get bitmap move.l a1,a0 CALLSYS bltbitmap ; do the backfill-0 * HookDone: movem.l (sp)+,d2-d7/a3-a6 ; Restore rts NOTES The rastport you are passed back is the same one passed to the function. You should *not* use "layered" rendering functions on this rastport. generally, you will wish to do bitmap operations such as bltbitmap(). the callback is a raw, low-level rendering call-back. If you need to call a rendering operation with a rastport, make sure you use a copy of the rastport and null the layer pointer. BUGS SEE ALSO graphics/clip.h utility/hooks.h