|
|
1.1 ! root 1: .so mod.ms ! 2: .ce 1 ! 3: .ls 2 ! 4: \fBOverview of the IRIS bitblt Primitive\fP ! 5: .sp 2.5 ! 6: By Daniel Stone, Brown University/IRIS ! 7: .sp 1 ! 8: .NH 1 ! 9: Introduction ! 10: .sp ! 11: .PP ! 12: The IRIS bitblt primitive (here after referred to as "bitblt") was derived ! 13: after researching the following papers and books, \fBBitmap Graphics ! 14: Siggraph'84 Course Notes\fP, \fBSmalltalk-80 The Language and Its ! 15: Implementation\fP "The Graphics Kernel" and \fBInside Macintosh\fP "QuickDraw". ! 16: If one has any questions or does not know what a bitblt is, one should ! 17: look over these resources. People who know what a bitblt primitive does ! 18: may want to skip to the "Introduction Summary" or the "Bitblt Interface" ! 19: section of this paper. Below I will describe, in general terms where the ! 20: bitblt program came from and how it works. ! 21: .PP ! 22: "bitblt" comes from BIT-boundary BLock Transfer. It is called ! 23: a "RasterOp" by Newman and Sproull. ! 24: It originated from the \fIFrame Buffer\fP model or \fIRaster Graphics\fP. ! 25: The typical raster graphics screen has an array of memory (called a frame ! 26: buffer) and hardware that scans through that memory ! 27: and maps it onto the tube to create an image. ! 28: A raster tube is made up of a two dimensional array of tiny dots of light ! 29: called picture elements. ! 30: Pixel (or pel) is short for picture elements. ! 31: Different tubes have different amounts of memory ! 32: associated with each "pixel" on the screen. ! 33: Color and gray scale screens may have frame buffers ! 34: where 8 bits represent a pixel on the screen. ! 35: Black and white (monochrome) screens have frame ! 36: buffers where each bit represents a pixel on ! 37: the screen. Because of this attribute, these screens are sometimes ! 38: referred to as \fIbitmap\fP displays. ! 39: Bitblt was designed to work on bitmap displays. ! 40: Because one pixel is represented by one bit, pixel ! 41: and bit are used interchangeably in this paper. ! 42: The bitmap (or frame buffer memory) may be ! 43: addressable on bit, byte or WORD (16 bits or ! 44: SHORT) boundaries depending on the screen hardware. ! 45: Most displays (all that I've worked with) allow access ! 46: on byte or short boundaries. ! 47: On each screen, the line of pixels (or bits) across the screen (or ! 48: across the frame buffer or bitmap) is called a ! 49: \fIscanline\fP. ! 50: A screen that is 768 bits high by 1024 bits wide has 768 scanlines each ! 51: of which is 1024 bits (or 64 shorts) wide. ! 52: .PP ! 53: Bitblt arose from the need to move an image on the ! 54: screen from one spot to another. ! 55: Some screens allow the user to address individual bits or address ! 56: bytes or shorts in the frame buffer. Others allow byte or short ! 57: access only. The bitblt primative receives arguments ! 58: as if the screen has bit addressing ! 59: and deals with the screen in what ever addressing ! 60: mode it has. ! 61: So bitblt works on frame buffer memory that is byte or short addressable. ! 62: This has the effect of hiding the screen hardware from the user. ! 63: Bitblt is the "output primitive", it is the only function needed to ! 64: deal with the screen. It can be used to draw lines, characters, images, ! 65: shapes, and anything else. ! 66: .PP ! 67: If bitblt works on frame buffer memory that is byte or short addressable ! 68: then it should (and does) work on ANY memory that is byte or short ! 69: addressable. ! 70: So bitblt can act on bitmaps in main memory as well as on the frame buffer. ! 71: But why would one want to use bitblt on "off-screen" memory? ! 72: There are many reasons and here are a few common ones. ! 73: An application may want to store fonts off screen and then "blt" them to ! 74: the screen as needed. An application may want to store menus, icons, ! 75: windows, and any other window manager items that would have to be re-created ! 76: \fIevery time\fP they were used. ! 77: An application may wish to show animation by storing all sequences then ! 78: using bitblt to put them on and off the screen quickly. ! 79: Basicly bitmaps are a general representation of an image, and ! 80: bitblt is a general primitive for manipulating them. ! 81: .PP ! 82: Bitblt not only copies the source to the destination but a user can also ! 83: specify different bit combination rules like and, or, xor etc.. ! 84: Bitblt takes the source, combines it with the destination according to the ! 85: combination rule and puts it back in the destination. ! 86: .PP ! 87: Another bitmap operation needed is the ability to replicate a specified source ! 88: all over a bit specified area in the destination. (By "bit specified area" ! 89: I mean there is a rectangular set of bits in the destination which are to ! 90: be changed. There may also be a set of bits surrounding this area and it ! 91: is not to be changed.) This would allow a user to ! 92: easily set or blank part or all of a bitmap. ! 93: The source could be all white ! 94: or all black or some pattern and it would be "tiled" in a bit specified area ! 95: of the destination. ! 96: ("Tiled", as in taking these little squares of tile all with the same pattern ! 97: on them and lining them up on your bathroom floor or wall.) ! 98: A tile in the bitblt program is a specified size of 16 x 16 bits which is ! 99: 16 unsigned shorts. The user specifies a tile combination rule (like ! 100: TileCopy or TileOr, etc.) and a tile and (after specifying other parameters) ! 101: calls the bitblt function. Bitblt uses the tile as the source and replicates ! 102: it all over the specified area in the destination. How it replicates the ! 103: tile on the destination is very important. Think of the destination as being ! 104: totally covered by the tile so that the first bit in the tile is sitting ON ! 105: the first bit in the destination. So you've rolled the tile dough onto the ! 106: destination and now you cookie cut this dough with the bit specified area ! 107: in the destination and peel away everything on the outside of the cookie ! 108: cutter. This leaves the tile where you want it. In other words the ! 109: tile is lined up with the origin of the destination. ! 110: .PP ! 111: The last necessary bitmap operation is being able to copy a source or tile ! 112: to the destination through a bitmap. For example, say you want the letter ! 113: "A" stenciled onto your new lawn mower. ! 114: You take a can of black spray paint, the letter "A" in a stencil, ! 115: place it on your lawn mower and spray. The lawn mower now has a ! 116: black letter "A" on it. In this case, the spray paint is a black tile, ! 117: the letter ! 118: "A" stencil is the masking bitmap and the lawn mower is the destination bitmap. ! 119: .sp 1 ! 120: .NH 2 ! 121: Introduction Summary ! 122: .sp ! 123: .IP 1. ! 124: Bitblt is designed to work on monochrome ! 125: "bitmapped" displays which are byte or short ! 126: addressable. ! 127: .sp .5 ! 128: .IP 2. ! 129: Bitblt allows the user to specify in BIT addressable ! 130: form what bits in a source bitmap are to be copied ! 131: to a bit specified area in a destination bitmap. ! 132: The user sees a two dimensional array of bits, not ! 133: an array of bytes or shorts. ! 134: .sp .5 ! 135: .IP 3. ! 136: A bitmap is a general term for an allocated area ! 137: of memory that is acted on by bitblt. The bitmap ! 138: may be in main memory or it may be the frame buffer. ! 139: .sp .5 ! 140: .IP 4. ! 141: A scanline is a line of pixels (or bits) across a bitmap. ! 142: .IP 5. ! 143: Bitblt is the lowest level graphics primitive on ! 144: which all graphics output is based. ! 145: .IP 6. ! 146: Bitblt works on ALL memory that is byte or short addressable. ! 147: .sp ! 148: .LP ! 149: Advantages of bitblt: ! 150: .IP 1. ! 151: One general bitmap interface to deal with. ! 152: .IP 2. ! 153: Doing all raster manipulations in one primitive, ! 154: only one set of code to change when improvements are thought of. ! 155: .IP 3. ! 156: All applications benefit from any improvements. ! 157: .IP 4. ! 158: Portable. ! 159: .sp ! 160: .LP ! 161: Disadvantages of bitblt: ! 162: .IP 1. ! 163: For absolute speed, certain functions, like fonts, ! 164: may have to be special cased. ! 165: .sp 2 ! 166: .NH 1 ! 167: Bitblt Interface ! 168: .sp 1 ! 169: .LP ! 170: To copy a set of bits from source to destination the bitblt function ! 171: needs to have certain information. ! 172: .sp .5 ! 173: .IP 1. ! 174: It needs the address of the source bitmap (if the combination rule is a ! 175: "source" rule). ! 176: .IP 2. ! 177: It needs the address of the destination bitmap. ! 178: .IP 3. ! 179: It needs to know the location of the bits within the source ! 180: bitmap which are to be copied. ! 181: .IP 4. ! 182: It needs to know the location of bits within the destination ! 183: bitmap which are to receive the source. ! 184: .IP 5. ! 185: It needs to know how to combine the source with the ! 186: destination. Ex. COPY, OR, XOR, AND, etc. the ! 187: source to the destination, ! 188: .sp .5 ! 189: .LP ! 190: Other useful things the bitblt function does: ! 191: .sp .5 ! 192: .IP 6. ! 193: Replicate a special type of source all over the ! 194: destination - (Tiles or Textures or Patterns.) ! 195: .IP 7. ! 196: Clip down the source and destination to a clipping area. ! 197: .IP 8. ! 198: Copy the source to the destination through a mask. (Like a stencil.) ! 199: .LP ! 200: The geometry and structures involved must be discussed first before the ! 201: actual interface structure is given in detail. ! 202: .NH 2 ! 203: Geometry and Structures ! 204: .ls 2 ! 205: .PP ! 206: The bitblt function uses the "infinitely thin" coordinate system. In this ! 207: system there are infinitely thin lines running \fIbetween\fP each pixel ! 208: on a bitmap. (See Siggraph'84 course notes or Inside Macintosh as ! 209: referenced above.) The pixels or bits are between the ! 210: points on the grid. A rectangle that is H points wide and ! 211: V points tall encloses H x V bits. ! 212: Other coordinate systems (like X) say that ! 213: the points on the grid \fIare\fP the pixels. ! 214: This is important when discussing rectangles. For example, say we ! 215: have a rectangle whose origin is 1,2 and whose width is 2 \fIpixels\fP wide ! 216: and its height is 3 \fIpixels\fP high. ! 217: Using the infinitely thin coordinate system the bottom right ! 218: corner of this rectangle would be 1+2,2+3 = \fI3,5\fP and would encompass ! 219: 2 x 3 = 6 bits. ! 220: Note that because of the coordinate system there are bits either on the outside ! 221: or on the inside of the rectangle. Using the other coordinate system, ! 222: the bottom right corner of the this rectangle would be 1+2-1,2+3-1 = \fI2,4\fP. ! 223: Why? Because this coordinate system is \fIinclusive\fP, so 1 through \fIand ! 224: including\fP 2 is 2 bits and 2 through \fIand including\fP 4 is 3 bits. ! 225: I chose the infinitely thin coordinate system because I thought it was less ! 226: confusing but different people like different things. ! 227: .PP ! 228: Three structures were used to define the basic graphic entities: ! 229: rectangles, bitmaps, and tiles, that bitblt must deal with. ! 230: The Siggraph'84 Course Notes describe four structures that they used ! 231: to implement their slow bitblt function. One of them, the Point structure, ! 232: I found useless. The others I used but modified a bit. ! 233: A rectangle I defined as 4 shorts: ! 234: .DS ! 235: typedef struct Blt_Rectangle { ! 236: short origin_y; ! 237: short origin_x; ! 238: short corner_y; ! 239: short corner_x; ! 240: } ! 241: .DE ! 242: .LP ! 243: Because a rectangle uses shorts, each coordinate has a range of ! 244: -32768,-32768 to 32767,32767. ! 245: .PP ! 246: A bitmap is defined as an unsigned short pointer which points to ! 247: the actual data (usually an array of unsigned shorts which \fImust ! 248: be short aligned\fP), a rectangle which ! 249: is the bounding rectangle for that data, and a short integer ! 250: which is the number of shorts wide the bitmap is. (Very similar to Inside ! 251: Macintosh structure.) ! 252: .DS ! 253: typedef struct Blt_Bitmap { ! 254: unsigned short *base; ! 255: Blt_Rectangle rect; ! 256: short nshorts; ! 257: } Blt_Bitmap; ! 258: .DE ! 259: .LP ! 260: Base points to an array of unsigned shorts which ! 261: is the data that makes up the bitmap. However nshorts is what ! 262: gives "base", the array of unsigned shorts, a sort of 2 dimensional quality ! 263: because this arbitrary array is now broken up into x number of segments each ! 264: of which has "nshorts" number of shorts in it. ! 265: Each of these segments is called a scanline. ! 266: Previously I referred to a scanline as a line of pixels across the screen. ! 267: (See Introduction.) Now I would like to generalize and call a scanline ! 268: a line of pixels (or bits) across an arbitrary bitmap. ! 269: For example, lets say "base" points to an array of 24 unsigned shorts. ! 270: If "nshorts" was 3 then there would be 8 scanlines, 3 shorts each. ! 271: If "nshorts" was 4 then there would be 6 scanlines, 4 shorts each. ! 272: "rect" could be anything as long as (rect.corner_x - rect.origin_x (the width)) ! 273: <= (nshorts * 16) and (rect.corner_y - rect.origin_y (the height)) <= ! 274: (the size of the array(24) / nshorts) ! 275: .PP ! 276: The third structure is the tile structure also called the ! 277: Texture structure in the Siggraph course notes and referred to as ! 278: a Pattern structure in Inside Macintosh. It is an array of ! 279: 16 unsigned shorts so it forms a 16 by 16 bit tile. Note ! 280: a Pattern in Inside Macintosh is only 8 by 8 bits but its the ! 281: same idea. ! 282: .DS ! 283: typedef struct Blt_Tile { ! 284: unsigned short tile[TILE_SIZE]; ! 285: } Blt_Tile; ! 286: .DE ! 287: .LP ! 288: When a tile is put on a bitmap it is aligned to the bitmap's ! 289: origin (top left) corner. This is done so that the same tile drawn in ! 290: different places on the same bitmap will line up. ! 291: .NH 2 ! 292: The Interface Structure ! 293: .PP ! 294: The bitblt function returns -1 if a bad pointer was found or ! 295: something was wrong, 0 if the width or height of the bitblt ! 296: turned out to be less than zero and 1 if everything went ok. ! 297: It also has a global Blt_Rectangle called change_rect which ! 298: contains the final area changed by the bitblt function. At first this ! 299: was only used for debugging purposes but now it is used for the ! 300: ACIS Experimental Display (Viking). ! 301: Because bit block transfer programs must be fast, many internal routines ! 302: have been converted to macros. ! 303: .LP ! 304: The bitblt routine receives a pointer to a Blt_userdata (BLT in X) structure. ! 305: This structure looks like this: ! 306: .sp .5 ! 307: .QP ! 308: \fBBlt_Bitmap src_bitmap\fP - Bitmap to be copied from. ! 309: .sp .5 ! 310: .QP ! 311: \fBBlt_Rectangle src_rect\fP - Specifies the area in the ! 312: src_bitmap to be used, its coordinates are in the ! 313: source bitmap's coordinate system. ! 314: .sp .5 ! 315: .QP ! 316: \fBBlt_Bitmap dst_bitmap\fP - Bitmap to be changed. ! 317: .sp .5 ! 318: .QP ! 319: \fBBlt_Rectangle dst_rect\fP - Specifies the area in the ! 320: dst_bitmap to be changed. Its coordinates are in ! 321: the destination bitmap's coordinate system. ! 322: .sp .5 ! 323: .QP ! 324: \fBBlt_Rectangle clp_rect\fP - Another rectangle to clip ! 325: against if the BLT_CLIPON bit in blt_flags is a 1. ! 326: If the BLT_CLIPON bit is 0 then clp_rect is never ! 327: accessed. (In other words it does not have to be set to ! 328: anything.) Its coordinates are also in the destination ! 329: bitmap's coordinate system. ! 330: .sp .5 ! 331: .QP ! 332: \fBBlt_Tile *tile_ptr\fP - The tile (or pattern or ! 333: texture... this is a 16x16 bit area) to be used if the ! 334: combination rule uses a tile. ! 335: .sp .5 ! 336: .QP ! 337: \fBBlt_Bitmap msk_bitmap\fP - Masking bitmap, which is ! 338: like regions in the Macintosh world. This is hard to ! 339: explain. A masking bitmap is kind of like a ! 340: stencil, for every 1 or on bit in the mask bitmap the bit ! 341: operation is allowed. Where there are 0 or off bits in the ! 342: mask bitmap the destination will remain the same. ! 343: To use this feature, the BLT_MASKON bit in blt_flags ! 344: must be 1. The setup for this structure requires ! 345: some explanation. ! 346: .QP ! 347: - "base" points to the actual data used for the mask. ! 348: .QP ! 349: - "nshorts" is the number of shorts wide the bitmap is. ! 350: (These two are just like normal bitmaps.) ! 351: .QP ! 352: - "rect" is NOT just any bounding rectangle, its ! 353: coordinates have to be in the destination bitmap's ! 354: coordinate system. Furthermore, this bitmap ! 355: is expected to line up with the dst_rect or ! 356: clp_rect depending on what you want. Typically ! 357: this is set equal to either dst_rect or clp_rect. ! 358: An example of this in use is: ! 359: You have a tiny bitmap that contains the image of ! 360: the character "A". It is 1 short wide (16 bits) by ! 361: 12 scan lines high. It is in the Blt_Bitmap struct ! 362: char_A. ! 363: We set comb_rule equal to a tile rule (like ! 364: TileCopy), set the dst_bitmap equal to ! 365: bitblt_screen (see Examples at end of paper), turn off/on ! 366: clipping, set blt_flags or/equal (|=) to BLT_MASKON, ! 367: set up the dst_rect with say 10,10,22,22, set the ! 368: tile_ptr equal to a tile that is all black and now ! 369: we set up msk_bitmap. msk_bitmap.base = char_A.base, ! 370: msk_bitmap.nshorts = char_A.nshorts, and ! 371: msk_bitmap.rect = dst_rect or clip_rect depending ! 372: on whether or not clipping was on and what you wanted. ! 373: Now the character "A" is "stenciled" onto the destination at 10,10,22,22. ! 374: (Note the normal thing to do would be to ! 375: copy this "A" to the screen every time "SHIFT a" ! 376: is hit (using char_A as the source and bitblt_screen ! 377: as the destination), but in this example we were ! 378: different to make a point.) ! 379: .sp .5 ! 380: .QP ! 381: \fBshort comb_rule\fP - Combination rule to be used. If ! 382: this rule is a SOURCE combination rule then tile_ptr ! 383: is never accessed. (Again, In other words it does not ! 384: have to be set to anything.) If this rule is a ! 385: tile rule then src_bitmap and src_rect are never ! 386: accessed. ! 387: .sp .5 ! 388: .QP ! 389: \fBshort blt_flags\fP - A bit on means do a certain extra ! 390: operation. For example if the first bit is on (the ! 391: BLT_CLIPON bit) then do clipping. If the BLT_MASKON ! 392: bit is on then the masking bitmap is used. Both ! 393: of these can be set at the same time. (of course.) ! 394: (BLT_MASKON | BLT_CLIPON) ! 395: .sp ! 396: .LP ! 397: The actual C structure looks like this: ! 398: .DS ! 399: typedef struct { ! 400: Blt_Bitmap src_bitmap; ! 401: Blt_Rectangle src_rect; ! 402: Blt_Bitmap dst_bitmap; ! 403: Blt_Rectangle dst_rect; ! 404: Blt_Rectangle clp_rect; ! 405: Blt_Tile *tile_ptr; ! 406: Blt_Bitmap msk_bitmap; ! 407: short comb_rule; ! 408: short blt_flags; ! 409: } Blt_userdata; ! 410: typedef Blt_userdata BLT; ! 411: .DE ! 412: .LP ! 413: Flags blt_flags could be: ! 414: .DS ! 415: #define BLT_CLIPON 0x1 ! 416: #define BLT_MASKON 0x2 ! 417: .DE ! 418: .NH ! 419: Examples ! 420: .sp ! 421: .LP ! 422: Here is an example of setting up a Blt_Bitmap structure where the hardware ! 423: screen address is 0xF4D80000 and the visible screen is 1024 bits wide and ! 424: 768 bits high: ! 425: .sp .5 ! 426: .DS ! 427: bitblt_screen.base = (unsigned short *)0xF4D80000; ! 428: bitblt_screen.rect.origin_x = 0; ! 429: bitblt_screen.rect.origin_y = 0; ! 430: bitblt_screen.rect.corner_x = 1024; ! 431: bitblt_screen.rect.corner_y = 768; ! 432: bitblt_screen.nshorts = (1024 + 15)/16; ! 433: .DE ! 434: .LP ! 435: Note the + 15 is not needed in this case, but the width may not always be ! 436: on a short boundary and + 15 rounds it up. ! 437: Also the rectangle could have a different origin and does not have to take ! 438: up the whole screen (although that would be silly) It may be like this: ! 439: .DS ! 440: bitblt_screen.rect.origin_x = 300; ! 441: bitblt_screen.rect.origin_y = 300; ! 442: bitblt_screen.rect.corner_x = 1324; ! 443: bitblt_screen.rect.corner_y = 1068; ! 444: .DE ! 445: .LP ! 446: or use 1/4 of the screen: ! 447: .DS ! 448: bitblt_screen.rect.origin_x = 0; ! 449: bitblt_screen.rect.origin_y = 0; ! 450: bitblt_screen.rect.corner_x = 256; ! 451: bitblt_screen.rect.corner_y = 192; ! 452: .DE ! 453: .LP ! 454: Note bitblt_screen.nshorts \fImust\fP still be (1024 + 15)/16 even though the ! 455: rectangle is smaller.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.