Short: Link library for fast chunky-gfx-routines Author: pernathw@cip.ub.uni-muenchen.de (Wanja Pernath) Uploader: Author Type: dev/lib Version: 1.0 Requires: AGA, OS3.x, MC68020 + some FASTRAM Architecture: m68k-amigaos INTRODUCTION ============ A while ago I've tried to code a game for the Amiga which should have SVGA quality. But I don't have expected the sillyness of Commodore as they designed the new AGA-Custom chips. My tears have washed my t-shirt when I saw the 'great' chip-ram-bandwidth and my neighbours thought of a bloody-mess as I expected that the Blitter is simply useless when it comes to a display of 640x480x256 After a while I saw that the cpu is several times faster in blitting with or without a mask and later I expected that it is more-than-10-times as fast as the system graphics routines when I use a temporary chunky buffer to draw my graphics in and then blast it over the bitmap. That was the time I decided to code a chunky-graphics-link-library for everybody's use. And that's it. CONTENTS ======== When you receive a copy of chunky.lha, it should contain this files: lib-src/ chunky.c the main chunky-gfx-routines chunky.h the header file text.c functions for rendering text c2p.asm a simple chunky to planar routine by Morten Eriksen p2c.asm a simple planar to chunky routine by Morten Eriksen makefile a makefile for GNU/C libchunky.a the link lib for GNU/C tst-src/ chunky.h a copy of the above test1.c the lines test source test2.c the Insertion test source test3.c the text test source test4.c the fixed-width font test for WB chunky.readme this file test1 the lines test executable test2 the Insertion test executable test3 the text test executable test4 the fixed-width font test for WB results040.txt all test results for a MC68040 results030.txt all test results for a MC68030 TIME TABLE ========== This is the result of the program 'test' which opens a display of 640x480x256 and calls several timed graphic routines with the original gfx.OS and with my new gfx.chunky. Test-Machine: A1200 with MC68040 and 8MB Fast I suppose, you should have a MC68030 + 4MB as minimum 1. Several Graphic functions ( test1.c ) ---------------------------------------- I've timed DrawChunkyPort() seperatly to make the results clearer. Draw 640 vertical lines with color raising: Elapsed time for function v_lines_chk(): 0.195829 sec. Elapsed time for function v_lines_rpt(): 12.308480 sec. Draw 480 horizontal lines with color raising: Elapsed time for function h_lines_chk(): 0.058839 sec. Elapsed time for function h_lines_rpt(): 12.255457 sec. Draw 480 diagonal lines from 0/0 -> 640/y with color raising: Elapsed time for function s_lines_chk(): 0.418446 sec. Elapsed time for function s_lines_rpt(): 12.247091 sec. Draw 256 filled boxes with color raising from 0->255: Elapsed time for function rect1_chk(): 0.052174 sec. Elapsed time for function rect1_rpt(): 0.873216 sec. Time to convert the 640x480x256 ChunkyPort to the display: Elapsed time for function DrawChunkyPort(): 0.299809 sec. 2. Draw on background ( test2.c ) --------------------------------- The first function creates its own ChunkyPort, draws there and then copy the chunkyContents into the RastPort w/o destroying background gfx The second one creates its ChunkyPort from RastPort at the position of the later rewritten ChunkyBuffer. This ensures that all the rendering does not destroy the background. As you can see, the second one is four times as fast as the first one Elapsed time for function InsertChunkyPort(): 0.417537 sec. Elapsed time for function CreateChunkyFromRastPort(): 0.108726 sec. 3. Draw some text ( test3.c ) ----------------------------- This program writes 512 times the text 'This is a test...' with different colors onto the screen The font is set to 'courier.font/13' Elapsed time for function chk_test: 0.721666 sec. Elapsed time for function rpt_test: 3.921369 sec. 4. Fixed-Font-Width test ( test4.c ) ------------------------------------ This is only present, because I've expected last-minute that the fixed-width fonts do not use the TextFont->tf_CharSpace and TextFont->tf_CharKern entries. Indeed this pointers are set to NULL --> GURU on some times. Now I use a better TextLength-Algorithm and Text()- one, so you can use those fixed-width-bitmapped fonts, too. FUNCTIONS ========= The functions in libchunky.a are namely the same as in the Amiga OS. The exeption is the suffix 'Chk' See lib-src/*.c for more details. USAGE ===== Very simple. Open your screen with preferrable 256 colors and setup the so-called 'struct ChunkyPort' using the function like this: ... struct ChunkyPort *cp; struct RastPort *rport = INITIALIZE_IT; // Initialize ChunkyPort if( cp = InitChunkyPort( CHUNKY_SIZEX, CHUNKY_SIZEY ) ){ // Do your rendering here ... SetAPenChk( cp, x ); RectFillChk( cp, x1, y1, x2, y2 ); ... // Blast the ChunkyPort onto the screen DrawChunkyPort( cp, rport, POS_ON_SCREEN_X, POS_ON_SCREEN_Y ); FreeChunkyPort( cp ); } ... Now you're able to use most of the chunky-rendering functions, except the text ones. To use text-rendering, you _MUST_ first call SetFontChk(): ... struct ChunkyPort *cp; struct RastPort *rport = INITIALIZE_IT; if( cp = InitChunkyPort( CHUNKY_SIZEX, CHUNKY_SIZEY ) ){ // Setup the struct TextFont you want to use SetFontChk( cp, rport->Font ); // Do your rendering here SetAPenChk(cp, x); MoveChk( cp, 100, 100 ); TextChk( cp, "Hi, my name is Wanja" ); // Blast the ChunkyPort onto the screen DrawChunkyPort( cp, rport, POS_ON_SCREEN_X, POS_ON_SCREEN_Y ); // Free ChunkyPort FreeChunkyPort( cp ); } ... See tst-src/test#? for further details DISCLAIMER & THANKS =================== libchunky.a and all the corresponding files are FREEWARE. Spread it around the world as much as you can, but please remember to spread the full archive. If you have used the whole or a part of libchunky.a's code and files, remember to mention me. I've used libchunky.a for a while and I've not expected any bugs, but I can't be sure of this. If you found a bug (or two), I would be glad to hear from you. In other words: I take no responsibility for any crashes that might occur during developement or during execution of the executable program. ---- I would like to thank the following people for help, suggestions and bug-reports: - Andreas Zunke (Na, wie geht's Deinem MEMCONTROL?) - Stefan Dirnstorfer ( For math-hints ) - Morten Eriksen for the great but slow c2p/p2c routines - various AMIGA-Magazines for programming tips and tricks ---- THE FUTURE ========== There are many things to do but the highest priority on my own to-do-list have those pretty routines for cpu-blitting from ChunkyPort to ChunkyPort and with or without a mask using. Another one is to implement this functions as a standard amiga library. Further I want to fix this ugly DrawEllipseChk() bug. If there's anybody out there who knows of a good and fast standard Circle() routine, then please email me. And if there's anybody out there who knows of a highly optimized speedy c2p routine for standard amiga OS-Bitmaps as a replacement for the ones I used in my code, then please, please email me, too. And your questions and suggestions are highly wellcome. Write to: Wanja Pernath Joergstr. 74 D-80689 München Tel.: 089/54662171 email: pernathw@cip.ub.uni-muenchen.de ---- And always remember: TAKE THIS PICE OF CODE AND PROGRAM GREAT AMIGA SOFTWARE HELP THE AMIGA TO BE ALIVE HELP THE DEVELOPERS BY BUYING GFX-CARDS AND SOFT BYE