TweetFollow Us on Twitter

December 94 - GRAPHICAL TRUFFLES

GRAPHICAL TRUFFLES

A Space-Saving PICT Trick

GUILLERMO A. ORTIZ AND DAVE JOHNSON

[IMAGE Dave_Guillermo.gif]

On the Macintosh, the standard file format for storing images is the PICT format. When pixel maps are stored in PICTs, the color table is always included. If you have a large number of PICTs that all use the same color table, however, it's redundant to have a separate copy of the color table in each PICT. It would be better to strip the color tables out of the PICTs themselves, store only one copy of the color table on disk, and use that color table for all the PICTs. This column describes a simple way to do that.

OF COLOR TABLES AND PICTS
One of the really neat features of the Macintosh and QuickDraw is that the process to store a pixel image in a picture is really simple. The code can be as simple as opening a picture to start PICT recording, doing a CopyBits of a PixMap onto itself, and closing the picture; QuickDraw does the rest.

newPict = OpenPicture(&offRect);
CopyBits(srcPix, srcPix, &offRect, &offRect, 
	srcCopy, nil);
ClosePicture();

Here I use OpenPicture for simplicity, but as pointed out in Inside Macintosh: Imaging With QuickDraw , you should really use OpenCPicture, especially if you want to specify a resolution other than 72 dpi. *

This code works great, but there's a catch: every time you do this, the whole PixMap -- including its color table -- is recorded into the picture. For a PixMap that's 8 bits deep (256 colors), the color table takes a little over 2K. This may not be that big a deal for one or two pictures, but what if you're pressing a CD withthousands of pictures that use the same color table? Suddenly all those embedded color tables add up to a significant chunk of space. For pictures delivered on floppy disks, space may be at even more of a premium, and those extra few kilobytes might matter. Also note that if you create PICTs with multiple calls to CopyBits, a color table is stored witheach PixMap in the picture, making the problem even worse.

LEARNING TO SHARE
More often than not, a series of PICT files will all use the same color table (usually the default color table). In these cases it would be much more economical if we could somehow store only one copy of the color table, and then share it amongall the pictures. As it turns out, doing that is pretty easy. The solution has two parts: first, we need to be able to create PICTs that don't include a color table, and later we need to be able to draw those same PICTs using the appropriate color table, stored separately from the picture.

JUST SAY NIL
The first part of the solution is easy. In a PixMap, the pmTable field contains a handle to a color table. When recording a picture, QuickDraw simply stores the color table specified by the pmTable field into the PICT. But if pmTable is nil, there's no color table to put in the picture, so its size ends up smaller. Only one extra line of code is needed to do this:

// Set PixMap color table handle to nil.
(*srcPix)->pmTable = nil;

Naturally, you'll need to save the color table handle beforehand, and afterward restore it before disposing of the PixMap, so that QuickDraw can dispose of all the pieces correctly. But even more important, you'll use the color table handle to create a 'clut' resource that you can save and that can later be used to draw the PICT with its correct colors. The sample program named CLUTLess, included on this issue's CD, contains the complete code to do this.

In reality, QuickDraw adds more than just a nil color table handle to the picture when the code described above is executed. The reason for this is that some applications assume that PixMaps in a picture always have a color table, and they would die horrible deaths if QuickDraw didn't somehow protect them from themselves. To avoid this problem, QuickDraw stores a color table "stub" into the PICT that it recognizes as such when playing back the picture.

If you simply call DrawPicture to display the "clutless" picture you've made, QuickDraw will see the color table stub and create a color table for the picture on the fly. This color table is a color ramp between the current port's foreground color and its background color -- in most cases this means that you get a grayscale image. (If the foreground color and background color are not black and white, respectively, you'll get a "colorized" image.) Figure 1, which appears along with Figure 2 on the inside back cover of this issue ofdevelop , shows an example of a once-colorful picture drawn this way.

GET IT TOGETHER
To display the image in its original colors, you need to somehow get the saved color table back into the PICT before drawing. You can do this by replacing the QuickDraw low-level routine that's called when a PixMap opcode is found in a picture. This replacement low-level routine will simply add the color table to the PixMap and then let QuickDraw continue on its merry way, doing all the real work of drawing, but with the correct color table in place. Replacing a low-level routine is a standard technique:

void SetNewBitsProc (WindowPtr aWindow, CQDProcs *theProcs)
{
	// Load structure with the standard routines.
	SetStdCProcs(theProcs); 
	// Change the one we want to override.
	theProcs->bitsProc = NewQDBitsProc(AddClutProc);
	// Set our window's port to use them.
	aWindow->grafProcs = theProcs;
}

Our replacement routine first saves the contents of the PixMap's pmTable field so that it can later restore this value before returning. It then puts a handle to the appropriate color table in the pmTable field and calls StdBits to let QuickDraw do the hard work of drawing. Finally, it restores the saved pmTable value in the PixMap. (Note that to be completely bulletproof you might want this routine to check to see if the imageactually needs a color table -- that is, check to make sureit's an indexed image, not direct. In our sample code weknow this routine won't get called with a direct PixMap.)

pascal void AddClutProc (BitMap *src, Rect *srcR, 
					Rect *dstR, short mode, RgnHandle msk) 
{
	CTabHandle	saveCTH;

	// Save color table handle. 
	saveCTH = ((PixMapPtr) src)->pmTable;
	// Put 'clut' resource.
	((PixMapPtr) src)->pmTable = gSharedClut;
	// Let QuickDraw do the work.
	StdBits(src, srcR, dstR, mode, msk); 
	// Restore saved handle and return.
	((PixMapPtr) src)->pmTable = saveCTH;
}

Once the new QDProcs are in place, you can simply call DrawPicture and the correct color table will be inserted on the fly. Figure 2 shows the same PICT as in Figure 1, drawn with the correct color table this time.

BUT WHAT IF . . .
The sample code illustrates the case in which the pictures are being created from PixMaps directly and the color tables are being removed as it happens. But what if the images already exist, and they need to be "postprocessed" in order to strip out the color tables? Using techniques similar to those described above, it's not hard; see this issue's CD for an example.

Another common case might be this: you have a large number of pictures that among them share just a few color tables. To deal with this, you could use a PicComment to store a number in the PICT that will indicate which of the color tables to use for that PICT.

IS IT FOR YOU?
These techniques are probably useful only if you plan to deliver a lot of images that all use the same color table (most likely on a CD). Stripping out the color tables may help you cram more images onto your distribution media or fit a few more images in memory, perhaps allowing for faster redraw (for example, when a sequence of pictures is being used for animation).

Remember that the images thus created will be seen as grayscale (or colorized) images in any application that's not aware it needs to load a separate color table from a resource. But if you find yourself jumping through flaming hoops to try to cram just a few more PICTs on your disk, this may be just the trick you need.


GUILLERMO A. ORTIZ of Apple's Developer Technical Support group left on sabbatical just after completing the first draft of this column, but before he had a chance to write a bio. He left his office chanting his favorite mind-soothing mantra, "Nothing compensates like cash."*

DAVE JOHNSON watched in astonishment recently as a large hawk or falcon of some kind (he's not much of an ornithologist) devoured a freshly killed dove just outside his living room window in San Francisco. Whoa. *

Thanks to Cameron Esfahani, Josh Horwich, and Don Moccia for reviewing this column. *

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

WebSnapperPro 2.0.5 - $20.00
WebSnapperPro lets you capture full web pages exactly as they appear in your browser, with a single mouse click, without the need to "stitch" or cut-and-paste. Save the page as an image file or as... Read more
Cocktail 11.3.1 - General maintenance an...
Cocktail is a general purpose utility for macOS that lets you clean, repair and optimize your Mac. It is a powerful digital toolset that helps hundreds of thousands of Mac users around the world get... Read more
Fantastical 2.4.6 - Create calendar even...
Fantastical 2 is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event... Read more
Fantastical 2.4.6 - Create calendar even...
Fantastical 2 is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event... Read more
Cocktail 11.3.1 - General maintenance an...
Cocktail is a general purpose utility for macOS that lets you clean, repair and optimize your Mac. It is a powerful digital toolset that helps hundreds of thousands of Mac users around the world get... Read more
WebSnapperPro 2.0.5 - $20.00
WebSnapperPro lets you capture full web pages exactly as they appear in your browser, with a single mouse click, without the need to "stitch" or cut-and-paste. Save the page as an image file or as... Read more
VOX 3.2.1 - Music player that supports m...
VOX just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features and support for all audio formats you should ever need.... Read more
Evernote 7.0 - Create searchable notes a...
Evernote allows you to easily capture information in any environment using whatever device or platform you find most convenient, and makes this information accessible and searchable at anytime, from... Read more
Hopper Disassembler 4.3.16- - Binary dis...
Hopper Disassembler is a binary disassembler, decompiler, and debugger for 32- and 64-bit executables. It will let you disassemble any binary you want, and provide you all the information about its... Read more
VOX 3.2.1 - Music player that supports m...
VOX just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features and support for all audio formats you should ever need.... Read more

Latest Forum Discussions

See All

Our top 5 characters from casual RPG Cre...
Creature Quest definitely lives up to its name with a host of collectible creatures based on fantasy tales and world mythologies. To celebrate Creature Quest’s first birthday, we’re going to lay out what we think are the five best characters in the... | Read more »
Around the Empire: What have you missed...
Did you know that Steel Media has a whole swathe of other sites dedicated to all aspects of mobile gaming? Sure you'll get the very best iPhone news, reviews, and opinions right here at 148Apps, but we don't want you missing out on a single piece... | Read more »
All the best games on sale for iPhone an...
Oh hi there, and welcome to our round-up of the best games that are currently on sale for iPhone and iPad. You thought I didn't see you there, did you, skulking behind the bushes? Trust me though, the bushes aren't where the best deals are. The... | Read more »
The Battle of Polytopia Guide - How to H...
A new update just released for The Battle of Polytopia (formerly Super Tribes), which introduces online multiplayer. For all the fans of Midjiwan’s lite take on Civilization, this is certainly welcome news, but playing online isn’t as easy and... | Read more »
Here are the very best mobile games to p...
It's Valentine's Day! Did you get loads of cards and chocolates and other tacky, simple expressions of human affection? Did you send out tat because you find it almost impossible to express emotion unless there's a section dedicated to it at your... | Read more »
Florence (Games)
Florence 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Florence is an interactive storybook from the award-winning lead designer of Monument Valley about the heart-racing highs and... | Read more »
Purrfect Date (Games)
Purrfect Date 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Cats are a lil’ like marmite. Either you absolutely head-over-heels love’ em, or… nahhh, who are we kidding?! Everyone... | Read more »
More monsters to collect and evolve in C...
A laid-back mix of RPG and TCG, Creature Quest is all about building your deck, evolving your creatures and winning in battle. It’s the creation of VC Mobile, set up by Might and Magic producer Jon Van Caneghem. There are elements of that classic... | Read more »
Check out this awesome hands-on with the...
Well, PlayerUnknown's Battlegrounds has come out on mobile. This isn't a clone, this isn't a riff on the battleroyale mechanics of the game, it's the official mobile port by Tencent. But there's a little bit of a hitch. [Read more] | Read more »
Hostage Negotiator (Entertainment)
Hostage Negotiator 1.1.0 Device: iOS Universal Category: Entertainment Price: $3.99, Version: 1.1.0 (iTunes) Description: Official app of the board game by AJ Porfirio and Van Ryder Games. In Hostage Negotiator, you play the part of... | Read more »

Price Scanner via MacPrices.net

13″ 3.1GHz/256GB Silver Touch Bar MacBook Pro...
Amazon has the Silver 13″ 3.1GHz/256GB Touch Bar MacBook Pro (MPXX2LL/A) on sale for $1649.99 including free shipping. Their price is $150 off MSRP, and it’s the lowest price available for a new 13″... Read more
Saturday Sale: Amazon offers 13″ 1.8GHz/256GB...
Amazon has the 13″ 1.8GHz/256B Apple MacBook Air on sale today for $250 off MSRP including free shipping: – 13″ 1.8GHz/256GB MacBook Air (MQD42LL/A): $949.99, $250 off MSRP Their price is the lowest... Read more
Roundup of Apple Certified Refurbished 12″ Ma...
Apple has Certified Refurbished 2017 12″ Retina MacBooks available for $200-$240 off the cost of new models. Apple will include a standard one-year warranty with each MacBook, and shipping is free.... Read more
Apple offers Certified Refurbished 10″ and 12...
Apple is now offering Certified Refurbished 2017 10″ and 12″ iPad Pros for $100-$190 off MSRP, depending on the model. An Apple one-year warranty is included with each model, and shipping is free: –... Read more
Apple Canada offers Certified Refurbished Mac...
 Canadian shoppers can save up to $560 on the purchase of a 2017 current-generation MacBook Pro, MacBook, or MacBook Air with Certified Refurbished models at Apple Canada. Apple’s refurbished prices... Read more
Sale! 13″ MacBook Airs for up to $180 off MSR...
B&H Photo has 13″ MacBook Airs on sale for $50-$120 off MSRP. Shipping is free, and B&H charges sales tax for NY & NJ residents only: – 13″ 1.8GHz/128GB MacBook Air (MQD32LL/A): $899, $... Read more
Sale! New 8-core iMac Pro for $4799, $200 off...
Adorama has the 8-core iMac Pro on sale for $4799 including free shipping plus NY & NJ sales tax only. Their price is $200 off MSRP, and it’s the currently lowest price available for an iMac Pro. Read more
Sale! Walmart lowers prices even more on 9″ i...
Walmart has lowered their sale price on 9.7″ Apple iPads to $80 off MSRP for a limited time. Sale prices are for online orders only, in-store prices may vary: – 9″ 32GB iPad: $249.99 $80 off – 9″... Read more
Roundup of 13″ MacBook Pro sales, models avai...
B&H Photo has 13″ MacBook Pros on sale for up to $200 off MSRP. Shipping is free, and B&H charges sales tax for NY & NJ residents only. Their prices are the lowest available for these... Read more
Roundup of 15″ MacBook Pros sale, models up t...
B&H Photo has 15″ MacBook Pros on sale for up to $200 off MSRP. Shipping is free, and B&H charges sales tax for NY & NJ residents only: – 15″ 2.8GHz Touch Bar MacBook Pro Space Gray (... Read more

Jobs Board

*Apple* Retail - Multiple Positions - Apple,...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Solutions Consultant - Apple (United...
# Apple Solutions Consultant Job Number: 113501424 Norman, Oklahoma, United States Posted: 15-Feb-2018 Weekly Hours: 40.00 **Job Summary** Are you passionate about Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.