johnmac@fawlty.towers.oz (John MacLean) (08/15/90)
Before anyone asks this is roughly how such a paint program should plot a pixel at XCOORD, YCOORD with color NEWRGB: * store your entire graphic as RGB tripples. * extract old RGB from graphic (not from screen) LDA OLDRGB ASL TAY LDA [FREQ_FOR_THIS_LINE],Y DEC STA [FREQ_FOR_THIS_LINE],Y BNE SKIPDEC DEC COLORS_IN_THIS_PALETTE ;one less color in this palette SKIPDEC EQU * * put new RGB value into this graphic (not onto screen) LDA NEWRGB ASL TAY LDA [FREQ_FOR_THIS_LINE],Y BNE SKIPINC INC COLORS_IN_THIS_PALETTE ;one more color in this palette SKIPINC EQU * INC STA [FREQ_FOR_THIS_LINE],Y * if there are now more than 16 colors in the palette then you need to * select a new palette and re-map your pixels in every scanline using this * palette on the screen. It is this last step that can be slow - the most frequent colors DO NOT make the best palette - you could have 18 blues that occur frequently and 1 red that appears in 1 or two pixels - unless you have a red in your palette you are in big trouble. You need to work out a good algorithm to keep info around about your last palette optimization so that the incremental cost of updating the palette is very small. I have tried a couple - but never put them into a fully operational paint program. I have also only done it with 16 palettes - not 200. John MacLean. -- This net: johnmac@fawlty.towers.oz.au Phone: +61 2 427 2999 That net: uunet!fawlty.towers.oz.au!johnmac Fax: +61 2 427 7072 Snail: Tower Technology, Unit D 31-33 Sirius Rd, Home: +61 2 960 1453 Lane Cove, NSW 2066, Australia.