TweetFollow Us on Twitter

Dissolve
Volume Number:2
Issue Number:6
Column Tag:Graphics Lab: Asm

Wizzo Shows Dissolve Effects

By Chris Yerga, Berkely, CA, MacTutor Contributing Editor

Fair Warning

Welcome to the second installment of the Graphic Lab. In this column we will explore the Mac's graphic capablilities and try to exploit them for all their worth. But I must warn prospective readers: This column is not for the so-called "power-users" or anyone else who bought their Mac to print out mailing labels. If you own a numeric keypad, this one isn't for you. This column is for people who'd rather watch a spaceship fly around on their screen than boot up Excel, given the choice. This column is for programmers who look forward to designing the title graphics for their applications, not the I/O drivers. This column is for those who never turn off the animation option in Switcher. So you've been warned. Everything beyond this paragraph will be pure frivolity. Let's go!

Crimes of Graphics

This second installment will deal with two crimes: one bad, and one good. First the bad one. Many of the people I've spoken with don't fully understand the potential of the Mac's graphics. They're blown away by some of the things they see, but they are convinced that the techniques are so involved that such feats are beyond their grasp. As a result, we haven't seen a lot of programs that push the Mac as far as they could. The good crime is one that we will commit, and one that will help us understand some basic principles of QuickDraw and graphics in general.

This is the crime of theft. We are going to use a Desk Accessory called BitNapper published in last month's column to steal graphics from other applications. Then we will show some title animation using those stolen bit maps in a fun little animation demo called Wizzo. The BitNapper DA is listed in last month's Graphics Lab column. With it, we can cut BitMaps from any application that supports desk accessories, or we can use it to cut our own graphics from MacPaint. BitNapper saves the stolen BitMap to disk as an MDS source file which allows us to install them as resources into our applications much like we have done with icons and the icon converter program published previously in Vol. 2 No.1 of MacTutor.

To use the BitNapper, install it into the system file on the disk with the application whose graphics you want to pilfer. When the picture you want is on the screen, select the BitNapper. It will install its own menu into the menu bar. Now select "Steal Bits" from its menu. Position the upper left hand corner of the selection rectangle at the upper left hand corner of the BitMap you want to steal. Now drag down to the lower right hand corner. The BitNapper will invert those bits within the selected rectangle. Release the button and the rest is self explanatory. The word constraint option will not be needed until later. It forces the selected BitMap to have left and right sides that coincide with word boundaries, which is sometimes useful. The BitNapper source, published last month, is also available on the source code disk #8 from MacTutor's mail order store.

What the good book has to say

Since we don't want to be complete outlaws, we will begin with some standard QuickDraw info taken straight from Inside Macintosh. The main QD data structure we will concern ourselves with is the BitMap. The BitMap is a rectangular arrangement of bits that describes some image. As a matter of fact, the Mac screen itself is a BitMap. Lets look at the structure of a BitMap.

From figure #1 we can see that the actual bit image of the BitMap is not a part of the BitMap data structure. Rather, there is a pointer to the bit image. This is because bit images, such as that of the Mac screen, tend to be quite large. The way that BitMaps are defined allows several different BitMaps use the same bit image. This is useful, as many times BitMaps only differ in their bounds rectangles. Another item of note is the fact that the rowBytes value should always be even. The reason for this is shown in figure #2. It makes sure that the beginning of each row of data, or each scanline in the case of the Mac screen, occurs on a word boundary. This allows us to access the rows using word or long sized instructions, which generally makes life simpler.

Peaceful coexistence

Now that we have grabbed a chunk of graphics from our favorite application, what shall we do next? How do we get our application to access the BitMap with ease? The answer is to keep the BitMap in the resource fork of the application. In the resource file for our application we do something like:

Resource 'GNRL' 135
Include  MyPicture.BMAP

Where MyPicture.BMAP is the filename of the BitMap that you saved with BitNapper. The ID number can be whatever you want. Although I was tempted to use my own resource type, I decided to go by the book and use GNRL, which Apple considers legal. To facilitate the use of BitMaps in resources, I have written a few utilities which simplify things a bit.

The first utility is a routine called GetBitMap, which loads a BitMap in from resources. It looks for an ID number in D0 and returns a handle to the BitMap in A2. The handle allows the BitMap to be relocatable in memory, preventing heap fragmentation, but creating a problem. The way that BitNapper stores the data is shown in figure #3. Since our resource BitMaps can move around in memory behind our backs, we can never be sure if the basAddr pointer actually points to the bit image that follows it.

The answer is a routine called LockBitMap. It locks the BitMap in memory and correctly sets the basAddr pointer according to the current position of the BitMap in memory. It takes a handle to the BitMap in A2 and returns a pointer to the BitMap in A3. Call LockBitMap just before you start using the BitMap. If memory is sparse, try to avoid allocating memory when there are locked BitMaps in memory. This will sidestep any heap fragmentation problems.

After you are done working with a BitMap, call UnLockBitMap to allow the memory manager to relocate the BitMap as it sees fit. UnlockBitMap takes a handle to the BitMap in A2. But be sure to lock it down again before using it.

The final routine is KillBitMap which, given a handle to the BitMap in A2, releases the memory occupied by the BitMap. If you don't want to kill your application as well, be sure not to use the handle after killing the BitMap.

More than one way to skin a BitMap

So we've stolen a BitMap, linked it into our resource fork, and are holding onto it by the handle. Now lets get it on the screen. This month's source code contains a couple examples of alternate ways to display a BitMap.

These routines fall into two general categories: ones that employ patterns and ones that employ regions. Lets start with the pattern based copies.

Wizzo Shows Bit Map Animation

Our Wizzo program shows how we can read in the stolen bit maps created with BitNapper and display it on the screen with some dissolve effects. Wizzo has two pattern based routines for use in titling or other dramatic drawing of the bit map. The two examples of pattern based routines are FadeIn and FadeOut.

FadeIn Shows Dissolve Effect

FadeIn takes a BitMap handle in A2 and dissolves it slowly onto the screen. The top,left corner of the destination is passed to FadeIn in D3,D4. First it locks the BitMap in memory. Then it makes a duplicate copy of the BitMap.

In the main loop it copies the source BitMap to the destination BitMap (which is off the screen). It then sets the pen mode to notPatBic. In this mode, any time a pattern is drawn on the BitMap, it performs a logical AND with the BitMap's current bit image. Figure #4 should make this more clear. The application has a table of 18 patterns of increasing darkness. In each iteration, a pattern is drawn over the entire duplicate BitMap, which at this point contains a copy of the source BitMap. Now we have a copy of the source BitMap in which only those bits set in our current pattern are set. I know...confusing, but the illustration is more clear.

After this, the duplicate is copied to the screen. Then the process begins again with a slightly darker pattern, until finally we have an all-black pattern which copies the entire BitMap. FadeIn then unlocks the source BitMap and disposes of the memory it allocated for the duplicate BitMap.

FadeOut does the opposite, as you may have guessed. Except that FadeOut only requires that you pass it a pointer to a rectangle in A4. It dissolves the bits enclosed within the rectangle on the screen. When it returns, the rectangle will be completely white.

FadeOut simply sets the pen mode to notPatBic and repeatedly does a _PaintRect with successively lighter patterns. It works from the end of our pattern list to the beginning.

These are fairly simple examples. Other possibilities are patterns of diagonal lines which move in barbershop-polelike fashion. Or perhaps altternating checkerboard patterns. Experiment with different variations.

A two-edged sword

The next set of copy routines are region based. They facilitate the use of QuickDraw's ability to clip graphics to an arbitraty region. The problem that arises here is that QuickDraw, as David Letterman might say, is "just too darn powerful." It can do all sorts of fabulous calculations with regions, but it requires great sacrifices in speed. When any kind of region calculations are involved, QuickDraw bogs down. There are certain solutions, but in some cases it is better to write your own application-specific routines which are frightfully optimized for your specific case. Examples of this will come in future issues. Stay tuned, campers.

Our region based routines, OpenRight and OpenOut repeatedy call _CopyBits with maskRgns that reveal more and more of the BitMap with each iteration. If you are not aware of it, _CopyBits allows the caller to pass it a region to which the copied bits will be clipped. OpenRight starts with a rectangular region which clips all but the leftmost vertical row of bits, and expands the region to the right until the entire BitMap is copied. OpenOut starts with a region that clips all but the centermost bit of the BitMap and expands outward in all directions until the entire BitMap is copied. Both of these routines use the routine _RectRgn which creates a rectangular region, given a rectangle and a region handle.

Fig. 5 Output of the BitNapper DA Formatted for an MDS Resource Include File

The saga continues...

These examples were intended to give you a basic familiarity with the techniques involved with using the BitNapper and the sample routines. In the coming months we will explore other areas of interest, such as scrolling and animation techniques. I'm very interested in hearing from readers. If you have any suggestions or questions, drop me a line at:

2556 Mabel St.

Berkeley, CA 94702-2141

Figure 5 shows the MDS text file format that BitNapper creates for us. As you can see, this is all ready to be included in our resource file. Figure 6 shows the bit map example used by Wizzo. Of course with any animation example, the real action is over by the time we get a screen shot. Perhaps next time we will look at exploding and imploding BitMaps...see you then.

Fig. 6 Output of our Wizzo program after Fadein Animation.

Chris Yerga wins $50 as our outstanding article for his Bitnapper DA and this month's Wizzo program!

!START

/Output WizzoGraf

]

Wizzo
/Resources
WizzoRes

/TYPE 'APPL' 'WIZZ'

$



;  BitMap Demo #1  
;
; © 1986 by Chris Yerga for MacTutor

INCLUDE MacTraps.D

;  Declare external labels

XDEF  START

MACRO   Center String,MidPT,Y =

 CLR.W  -(SP)    
 PEA    '{String}'
 _StringWidth
 CLR.L  D3; Clear high word of D3 for DIVU
 MOVE.W (SP)+,D3 ; Get the width (in pixels) in D3
 DIVU   #2,D3    ; Divide by 2
 MOVE.L #{MidPT},D4
 SUB.W  D3,D4    ;103-(width/2) to center text
 MOVE.W D4,-(SP) ;Push the X coordinate
 MOVE.W #{Y},-(SP) ;Push the Y coordinate
 _MoveTo;Position the pen
 
 PEA  '{String}'
 _DrawString
 | ;End of Macro
 
;========= Local Constants =================

AllEvents EQU  $0000FFFF  ; Mask for FlushEvents
MaxEvents EQU  12
DWindLenEQU $AA  ; size of a Dialog Record
windowSizeEQU  $9C   ; size of window data struct
DiskEvent EQU  7
shiftKeyEQU 512  ; eventRec mask modifier bits

;======= Start of Main Program ================

BadPtr: _Debugger;Should never get here.  

START:  
 MOVEM.LD0-D7/A0-A6,-(SP) ;The routine 
 LEA    SaveRegs(A5),A0 ;which saves the registers
 MOVE.L A6,(A0)  
 MOVE.L A7,4(A0)
 
;======== Initialize the ROM routines =============

 PEA    -4(A5) ;QD Global ptr
 _InitGraf;Init QD global
 _InitFonts ;Init font manager
 _InitWindows    ;Init Window Manager
 _InitMenus ;Guess what...you got it!
 CLR.L  -(SP)    ;Standard SysErr/DS dialog
 _InitDialogs    ;Init Dialog Manger
 _TEInit;Init ROM Text edit
 MOVE.L #AllEvents,D0;And flush ALL previous
 _FlushEvents    ;events
 _InitCursor;Get the standard arrow
 
;======== Begin our routine processing ==========

 MOVE #128,D0    ;get bitmap #128
 BSR    GetBitMap;from resources into A2
 
; This is where the BitMap routines are called

BMTest: 
 PEA    Screen
 PEA    White
 _FillRect
 MOVE #2,-(SP)   ;Get Geneva 12
 _TextFont
 MOVE #12,-(SP)
 _TextSize 
 Center MacTutor BitMap Demo,256,50
 
 MOVE #100,D3    ;top coordinate
 MOVE #140,D4    ;left coordinate
 BSR    FadeIn   ;FadeIn (Note handle in A2)
 
 LEA    TempRect(A5),A4 ;get tempRect 
 BSR    FadeOut  ;and erase its contents
 
 MOVE #100,D3    ;top coordinate
 MOVE #140,D4    ;left coordinate
 BSR    OpenRight;OpenRight
 
 LEA    TempRect(A5),A4 ;get tempRect again
 BSR    FadeOut  ;and erase its contents
 
 MOVE #100,D3    ;top
 MOVE #140,D4    ;left
 BSR    OpenOut  ;OpenOut
 
 BSR    BlackOut
 
 BSR    GetEvent ;check for any events
 MOVE Event(A5), D0
 CMP    #0, D0   ;do we have an event?
 BEQ    BMTest   ;no, keep going
 
Adios:
 LEA    SaveRegs(A5),A0 ;yes prepare to exit
 MOVE.L (A0),A6
 MOVE.L 4(A0),A7
 MOVEM.L(SP)+,D0-D7/A0-A6
 RTS  

; ========== Subroutines ==================

GetEvent: 
 
 CLR    -(SP)    ;returned event 
 MOVE #AllEvents,-(SP)  ;mask all events
 PEA    EventRecord(A5) ; event record block
 _GetNextEvent   ;go check the mouse 
 MOVE (SP)+,D0   ;get event result
 MOVE D0, Event(A5);save event in our global
 RTS    ;return
 
; =======These are the general BitMap utilities ======

; GetBitMap : Reads a BitMap in from resources
;
;on entry : D0 = BitMap resource ID
;returns a handle to the BitMap in A2

GetBitMap:
 CLR.L  -(SP)    ;room for Handle
 MOVE.L #'GNRL',-(SP);the resType
 MOVE D0,-(SP)   ;resID
 _GetResource
 MOVE.L (SP)+,A2 ;get the handle
 RTS
 
; LockBitMap : Locks the BitMap in memory and calculates the 
;       BasAddr field so that it's ready to use.
;
;on entry : A2 = handle to BitMap
;returns a pointer to the locked BitMap in A3

LockBitMap:
 MOVE.L A2,A0    ;copy handle
 _HLock ;lock it
 MOVE.L (A2),A3  ;get pointer
 ADDA   #14,A3   ;point to bit image
 MOVE.L A3,-14(A3) ;set basAddr field
 MOVE.L (A2),A3  ;get pointer
 RTS
 
; UnLockBitMap : makes the BitMap relocatable.  Called
; whenever processing has been finished on a bitMap
; that will be used again so that Heap Fragmentation
; doesn't occur.
;
;on entry : A2 = handle to bitMap

UnLockBitMap:
 MOVE.L A2,A0    ;copy handle
 _HUnLock ;unlock it
 RTS
 
; KillBitMap : Does what it says
;
;on entry : A2 = handle to bitMap
;
;BE SURE NOT TO REUSE A DEAD BITMAP! DANGLING
;POINTERS! YOUR APPLICATION WILL DIE ALSO!

KillBitMap:
 MOVE.L A2,A0    ;copy handle
 _DisposHandle
 RTS
 
; ====These are the sample BitMap display routines =====

 
; FadeIn : Displays the BitMap with a reverse dissolving effect
;
;on entry : A2 = bitMap handle
;D3,D4 = top,left coordinates of display rect

FadeIn:
 MOVE.L A2,A0    ;copy handle
 _GetHandleSize  ;get handle size
 _NewPtr,Clear   ;allocate an equal sized block
 MOVE.L A0,A4    ;copy pointer
 BSR    LockBitMap ;lock and init bitMap
 LEA    TempRect(A5),A0 ;get ptr to dest rect
 MOVE D3,(A0)    ;copy top
 MOVE D4,2(A0)   ;copy left
 ADD    10(A3),D3;calculate bottom
 MOVE D3,4(A0)
 ADD    12(A3),D4;calculate right
 MOVE D4,6(A0)   ;copy the header info
 MOVE.L 4(A3),4(A4)
 MOVE.L 8(A3),8(A4)
 MOVE 12(A3),12(A4)
 LEA    14(A4),A0
 MOVE.L A0,(A4)  ;set basAddr
 MOVE.L A4,-(SP) ;the dest bitMap
 _SetPBits
 MOVE #15,-(SP)  ;notPatBic mode
 _PenMode
 
 MOVE #0,D3 ;pat counter
@1 MOVE.L A3,-(SP) ;source BitMap
 MOVE.L A4,-(SP) ;dest BitMap
 LEA    6(A3),A0 ;get pointer to bitMap bounds
 MOVE.L A0,-(SP) ;sourceRect
 MOVE.L A0,-(SP) ;destRect
 MOVE #0,-(SP)   ;srcCopy
 CLR.L  -(SP)
 _CopyBits
 
 LEA    PatList,A0 ;ptr to patterns
 MOVE D3,D0 ;copy pattern index
 MULU   #8,D0    ;offset to pattern
 ADDA   D0,A0
 MOVE.L A0,-(SP) ;point to pattern
 _PenPat
 PEA    6(A4)    ;BitMap bounds
 _PaintRect ;paint the rect
 
 MOVE.L A4,-(SP) ;source BitMap
 MOVE.L (A5),A0  
 PEA    $FFFFFF86(A0);dest BitMap (GrafPort)
 PEA    6(A4)    ;sourceRect
 PEA    TempRect(A5) ;destRect
 MOVE #0,-(SP)   ;srcCopy
 CLR.L  -(SP)
 _CopyBits
 
 ADDQ #1,D3 ;next pattern...
 CMP    #19,D3   ;done?
 BNE    @1;not done..
 
 MOVE.L (A5),A0  ;restore screenbits
 PEA    $FFFFFF86(A0)
 _SetPBits
 MOVE.L A4,A0    ;free up memory
 _DisposPtr
 BSR    UnLockBitMap
 RTS
 
; FadeOut : Erases the contents of a rect with a dissolve
;
;on entry : A4 = pointer to rect to be erased

FadeOut
 MOVE #15,-(SP)  ;set pattern mode to notPatBic
 _PenMode
 MOVE #18,D3;init pattern counter
@1 LEA  PatList,A0 ;ptr to patterns
 MOVE D3,D0 ;copy pattern index
 MULU   #8,D0    ;offset to pattern
 ADDA   D0,A0
 MOVE.L A0,-(SP) ;point to pattern
 _PenPat
 MOVE.L A4,-(SP) ;BitMap bounds
 _PaintRect ;paint the rect
 
 TST    D3;are we done
 BEQ    @2;yes
 SUBQ #1,D3 ;decrement the pattern number
 BRA    @1;loop
@2 RTS  
 
; OpenRight : Opens the BitMap on the screen from left to right
;
;on entry : D3,D4 = top,left of screen destination
;     A2 = handle to bitMap

OpenRight
 BSR    LockBitMap ;lock the handle in memory
 CLR.L  -(SP)    ;room for rgnHandle
 _NewRgn
 MOVE.L (SP)+,TempRgn(A5) ;save the handle
 MOVE D3,RgnRect(A5) ;copy top  of bounds
 MOVE D4,RgnRect+2(A5)    ;copy left of bounds
 MOVE D3,D0
 ADD    10(A3),D0;calc bottom
 MOVE D0,RgnRect+4(A5)
 MOVE D4,RgnRect+6(A5)    ;make it 1 pixel wide    
 
@1 ADD  #1,RgnRect+6(A5)  ;extend right edge 1 pixel
 MOVE.L TempRgn(A5),-(SP) ;push rgnHandle
 PEA    RgnRect(A5);push the rect
 _RectRgn ;make it a region
 MOVE.L TempRgn(A5),A4  ;copy rgnHandle to A4
 BSR    ShowBitMap
 ADD    #1,RgnRect+2(A5)  ;extend left edge 1 pixel
 MOVE 12(A3),D0  ;get right edge of BitMap
 ADD    D4,D0    ;calculate width
 CMP    RgnRect+6(A5),D0  ;have we extended the rect
 ;all the way there?
 BNE    @1;no...keep going
 MOVE.L TempRgn(A5),-(SP) ;free up memory
 _DisposRgn
 RTS

; OpenOut : Opens the BitMap up from the center outward
;
;on entry : D3,D4 = top,left of display rect
;   A2 = handle to bitMap

OpenOut 
 BSR    LockBitMap ;lock the handle in memory
 CLR.L  -(SP)    ;room for rgnHandle
 _NewRgn
 MOVE.L (SP)+,TempRgn(A5) ;save the handle
 
 MOVE D3,D0 ;copy top
 ADD    D3,D0    ;multiply by 2
 ADD    10(A3),D0;add offset
 EXT.L  D0;extend to 32 bit precision
 DIVU   #2,D0    ;find center
 MOVE D4,D1 ;copy left
 ADD    D4,D1    ;multiply by 2
 ADD    12(A3),D1;add offset
 EXT.L  D1;extend precision
 DIVU   #2,D1    ;find center
 MOVE D0,RgnRect(A5) ;top of the rect
 MOVE D1,RgnRect+2(A5)  ;left
 ADD    #1,D0
 MOVE D0,RgnRect+4(A5)  ;bottom
 ADD    #1,D1
 MOVE D1,RgnRect+6(A5)  ;right
 
@1 MOVE.L TempRgn(A5),-(SP) ;push the rgnHandle
 PEA    RgnRect(A5);and the rect
 _RectRgn
 MOVE.L TempRgn(A5),A4  ;copy rgnHandle to A4
 BSR    ShowBitMap
 ADD    #1,RgnRect+4(A5)  ;extend the bottom 1 pixel
 ADD    #1,RgnRect+6(A5)  ;extend the right  1 pixel
 SUB    #1,RgnRect(A5)  ;extend the top 1 pixel
 SUB    #1,RgnRect+2(A5)  ;extend the left 1 pixel
 MOVE 12(A3),D0  ;get right edge of BitMap
 ADD    D4,D0    ;calculate width
 CMP    RgnRect+6(A5),D0  ;have we extended the rect
 ;all the way there?
 BGE    @1;no...keep going
 MOVE 10(A3),D0  ;get bottom of BitMap
 ADD    D3,D0
 CMP    RgnRect+4(A5),D0  ;are we done?
 BGE    @1;no...
 MOVE.L TempRgn(A5),-(SP)
 _DisposRgn
 RTS

; ShowBitMap : Displays the BitMap on the screen
;
;on entry : D3,D4 top,left of screen destination
;   A4 = maskRgn or NIL
 
ShowBitMap
 BSR    LockBitMap ;lock it in memory
 LEA    TempRect(A5),A0 ;get ptr to dest rect
 MOVE D3,(A0)    ;copy top
 MOVE D4,2(A0)   ;copy left
 MOVE D3,D0
 MOVE D4,D1
 ADD    10(A3),D0;calculate bottom
 MOVE D0,4(A0)
 ADD    12(A3),D1;calculate right
 MOVE D1,6(A0)
 
 MOVE.L A3,-(SP) ;source BitMap
 PEA    thePort(A5);get GrafPtr
 _GetPort
 MOVE.L thePort(A5),A0
 PEA    2(A0)    ;dest BitMap (GrafPort)
 PEA    6(A3)    ;sourceRect
 PEA    TempRect(A5) ;destRect
 MOVE #0,-(SP)
 MOVE.L A4,-(SP)
 _CopyBits
 RTS
 
; BlackOut :  Matthias Jabs would be proud...

BlackOut:
 MOVE #8,-(SP) ;set the pattern mode to patCopy
 _PenMode
 MOVE #0,D3 ;init pattern counter
@1 LEA  PatList,A0 ;ptr to patterns
 MOVE D3,D0 ;copy pattern index
 MULU   #8,D0    ;offset to pattern
 ADDA   D0,A0
 MOVE.L A0,-(SP) ;point to pattern
 _PenPat
 PEA    Screen   ;the whole screen
 _PaintRect ;paint the rect
 
 CMP    #18,D3   ;are we done
 BEQ    @2;yes
 ADDQ #1,D3 ;decrement the pattern number
 BRA    @1;loop
@2 RTS  
 
;======== Program Variables ==================

SaveRegs: DS.L 2 ;For saving the SP etc..

thePort:DS.L1
TempRect: DS.W 4
RgnRect:DS.W4
TempRgn:DS.L1

EventRecord:DS.B 16;event record block
Event:  DS.W1  ;save event number
 
; ======Program Constants =================

BlackPat: DC.L $FFFFFFFF,$FFFFFFFF
White:  DC.L0,0
GrayPat:DC.B$55,$AA,$55,$AA,$55,$AA,$55,$AA

Screen: DC.W0,0,342,512


PatList:;Pattern data for fade routines...if you have
 ;to type this in,  you have my sympathy
DC.B 0,0,0,0,0,0,0,0
DC.B $08,$00,$00,$00,$02 
DC.B $00,$00,$00,$08 
DC.B $00,$00,$00,$02 
DC.B $20,$00,$00,$08 
DC.B $00,$40,$00,$02 
DC.B $24,$00,$00,$08 
DC.B $00,$42,$00,$02 
DC.B $24,$80,$08,$88 
DC.B $00,$42,$00,$02 
DC.B $26,$80,$28,$A8 
DC.B $00,$42,$00,$82 
DC.B $26,$80,$28,$A8 
DC.B $00,$4E,$20,$82 
DC.B $A6,$80,$2E,$A9 
DC.B $01,$4E,$21,$82 
DC.B $A6,$C0,$2E,$A9 
DC.B $01,$5E,$21,$86 
DC.B $A6,$C0,$2E,$A9 
DC.B $23,$5E,$25,$C6 
DC.B $A6,$C0,$2E,$A9 
DC.B $23,$5E,$25,$C6 
DC.B $AE,$D1,$2E,$AD 
DC.B $23,$DF,$25,$D6 
DC.B $AE,$D1,$AE,$AD 
DC.B $23,$DF,$E5,$D6 
DC.B $AE,$D7,$AE,$FF 
DC.B $6F,$DF,$E5,$DF 
DC.B $AF,$F7,$BE,$FF 
DC.B $6F,$DF,$F5,$FF 
DC.B $AF,$F7,$BE,$FF 
DC.B $7F,$DF,$FD,$FF 
DC.B $EF,$FF,$FE,$FF 
DC.B $FF,$DF,$FD,$FF 
DC.B $FF,$FF,$FF,$FF 
DC.B $FF,$FF,$FF,$FF 
DC.B $FF,$FF,$FF,$FF

;  Thats it...



; This is how you get your BitMaps 
; in your resource fork

.Align 2
Resource  'GNRL' 128  'test BitMap'
INCLUDE SpinalTap.BMAP 
 
AAPL
$101.67
Apple Inc.
+1.91
MSFT
$44.48
Microsoft Corpora
+0.40
GOOG
$521.48
Google Inc.
+0.63

MacTech Search:
Community Search:

Software Updates via MacUpdate

NTFS 12.0.39 - Provides full read and wr...
Paragon NTFS breaks down the barriers between Windows and OS X. Paragon NTFS effectively solves the communication problems between the Mac system and NTFS, providing full read and write access to... Read more
RestoreMeNot 2.0.3 - Disable window rest...
RestoreMeNot provides a simple way to disable the window restoration for individual applications so that you can fine-tune this behavior to suit your needs. Please note that RestoreMeNot is designed... Read more
Macgo Blu-ray Player 2.10.9.1750 - Blu-r...
Macgo Mac Blu-ray Player can bring you the most unforgettable Blu-ray experience on your Mac. Overview Macgo Mac Blu-ray Player can satisfy just about every need you could possibly have in a Blu-ray... Read more
Apple iOS 8.1 - The latest version of Ap...
The latest version of iOS can be downloaded through iTunes. Apple iOS 8 comes with big updates to apps you use every day, like Messages and Photos. A whole new way to share content with your family.... Read more
TechTool Pro 7.0.5 - Hard drive and syst...
TechTool Pro is now 7, and this is the most advanced version of the acclaimed Macintosh troubleshooting utility created in its 20-year history. Micromat has redeveloped TechTool Pro 7 to be fully 64... Read more
PDFKey Pro 4.0.2 - Edit and print passwo...
PDFKey Pro can unlock PDF documents protected for printing and copying when you've forgotten your password. It can now also protect your PDF files with a password to prevent unauthorized access and/... Read more
Yasu 2.9.1 - System maintenance app; per...
Yasu was originally created with System Administrators who service large groups of workstations in mind, Yasu (Yet Another System Utility) was made to do a specific group of maintenance tasks... Read more
Hazel 3.3 - Create rules for organizing...
Hazel is your personal housekeeper, organizing and cleaning folders based on rules you define. Hazel can also manage your trash and uninstall your applications. Organize your files using a... Read more
Autopano Giga 3.7 - Stitch multiple imag...
Autopano Giga allows you to stitch 2, 20, or 2,000 images. Version 3.0 integrates impressive new features that will definitely make you adopt Autopano Pro or Autopano Giga: Choose between 9... Read more
MenuMeters 1.8 - CPU, memory, disk, and...
MenuMeters is a set of CPU, memory, disk, and network monitoring tools for Mac OS X. Although there are numerous other programs which do the same thing, none had quite the feature set I was looking... Read more

Latest Forum Discussions

See All

Clips Review
Clips Review By Jennifer Allen on October 21st, 2014 Our Rating: :: CONVENIENT PASTINGUniversal App - Designed for iPhone and iPad Making copying and pasting more powerful than usual, Clips is a great way to move stuff around.   | Read more »
MonSense Review
MonSense Review By Jennifer Allen on October 21st, 2014 Our Rating: :: ORGANIZED FINANCESiPhone App - Designed for the iPhone, compatible with the iPad Organize your finances with the quick and easy to use, MonSense.   | Read more »
This Week at 148Apps: October 13-17, 201...
Expert App Reviewers   So little time and so very many apps. What’s a poor iPhone/iPad lover to do? Fortunately, 148Apps is here to give you the rundown on the latest and greatest releases. And we even have a tremendous back catalog of reviews; just... | Read more »
Angry Birds Transformers Review
Angry Birds Transformers Review By Jennifer Allen on October 20th, 2014 Our Rating: :: TRANSFORMED BIRDSUniversal App - Designed for iPhone and iPad Transformed in a way you wouldn’t expect, Angry Birds Transformers is a quite... | Read more »
GAMEVIL Announces the Upcoming Launch of...
GAMEVIL Announces the Upcoming Launch of Mark of the Dragon Posted by Jessica Fisher on October 20th, 2014 [ permalink ] Mark of the Dragon, by GAMEVIL, put | Read more »
Interview With the Angry Birds Transform...
Angry Birds Transformers recently transformed and rolled out worldwide. This run-and-gun title is a hit with young Transformers fans, but the ample references to classic Transformers fandom has also earned it a place in the hearts of long-time... | Read more »
Hail to the King: Deathbat Review
Hail to the King: Deathbat Review By Rob Thomas on October 20th, 2014 Our Rating: :: SO FAR AWAYUniversal App - Designed for iPhone and iPad Hail to the King: Deathbat may feel like “Coming Home” for Avenged Sevenfold’s faithful,... | Read more »
Find Free Food on Campus with Ypay
Find Free Food on Campus with Ypay Posted by Jessica Fisher on October 20th, 2014 [ permalink ] iPhone App - Designed for the iPhone, compatible with the iPad | Read more »
Strung Along Review
Strung Along Review By Jordan Minor on October 20th, 2014 Our Rating: :: GOT NO STRINGSUniversal App - Designed for iPhone and iPad A cool gimmick and a great art style keep Strung Along from completely falling apart.   | Read more »
P2P file transferring app Send Anywhere...
File sharing services like Dropbox have security issues. Email attachments can be problematic when it comes to sharing large files. USB dongles don’t fit into your phone. Send Anywhere, a peer-to-peer file transferring application, solves all of... | Read more »

Price Scanner via MacPrices.net

Deals on 2011 13-inch MacBook Airs, from $649
Daily Steals has the Mid-2011 13″ 1.7GHz i5 MacBook Air (4GB/128GB) available for $699 with a 90 day warranty. The Mid-2011 13″ 1.7GHz i5 MacBook Air (4GB/128GB SSD) is available for $649 at Other... Read more
2013 15-inch 2.0GHz Retina MacBook Pro availa...
B&H Photo has leftover previous-generation 15″ 2.0GHz Retina MacBook Pros now available for $1599 including free shipping plus NY sales tax only. Their price is $400 off original MSRP. B&H... Read more
Updated iPad Prices
We’ve updated our iPad Air Price Tracker and our iPad mini Price Tracker with the latest information on prices and availability from Apple and other resellers, including the new iPad Air 2 and the... Read more
Apple Pay Available to Millions of Visa Cardh...
Visa Inc. brings secure, convenient payments to iPad Air 2 and iPad mini 3as well as iPhone 6 and 6 Plus. Starting October 20th, eligible Visa cardholders in the U.S. will be able to use Apple Pay,... Read more
Textkraft Pocket – the missing TextEdit for i...
infovole GmbH has announced the release and immediate availability of Textkraft Pocket 1.0, a professional text editor and note taking app for Apple’s iPhone. In March 2014 rumors were all about... Read more
C Spire to offer iPad Air 2 and iPad mini 3,...
C Spire on Friday announced that it will offer iPad Air 2 and iPad mini 3, both with Wi-Fi + Cellular, on its 4G+ LTE network in the coming weeks. C Spire will offer the new iPads with a range of... Read more
Belkin Announces Full Line of Keyboards and C...
Belkin International has unveiled a new lineup of keyboard cases and accessories for Apple’s newest iPads, featuring three QODE keyboards and a collection of thin, lightweight folios for both the... Read more
Verizon offers new iPad Air 2 preorders for $...
Verizon Wireless is accepting preorders for the new iPad Air 2, cellular models, for $100 off MSRP with a 2-year service agreement: - 16GB iPad Air 2 WiFi + Cellular: $529.99 - 64GB iPad Air 2 WiFi... Read more
Price drops on refurbished Mac minis, now ava...
The Apple Store has dropped prices on Apple Certified Refurbished previous-generation Mac minis, with models now available starting at $419. Apple’s one-year warranty is included with each mini, and... Read more
Apple refurbished 2014 MacBook Airs available...
The Apple Store has Apple Certified Refurbished 2014 MacBook Airs available for up to $180 off the cost of new models. An Apple one-year warranty is included with each MacBook, and shipping is free.... Read more

Jobs Board

Project Manager / Business Analyst, WW *Appl...
…a senior project manager / business analyst to work within our Worldwide Apple Fulfillment Operations and the Business Process Re-engineering team. This role will work Read more
*Apple* Retail - Multiple Positions (US) - A...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Position Opening at *Apple* - Apple (United...
…customers purchase our products, you're the one who helps them get more out of their new Apple technology. Your day in the Apple Store is filled with a range of Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** At the Apple Store, you connect business professionals and entrepreneurs with the tools they need in order to put Apple solutions to work in their Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** The Apple Store is a retail environment like no other - uniquely focused on delivering amazing customer experiences. As an Expert, you introduce people Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.