TweetFollow Us on Twitter

March 96 - Print Hints: QuickDraw GX Breaks the Space Hack

Print Hints: QuickDraw GX Breaks the Space Hack

Dave Polaschek

Before QuickDraw GX, when an application that generated its own PostScript(TM) code wanted to make sure the printer could print a particular font, it could send one space character in the needed font. The LaserWriter driver would check the printer to see if the font was available, and if not, the driver would send the font to the printer so that it would be available to print the space character -- and any other characters in that font that the application-generated PostScript code might require. The reason for using a space was simple: you didn't want to mark the page just to get a font to the printer, and a space wouldn't mark it. This technique, first described in "The Perils of PostScript" back in develop Issue 1, became known as the "space hack."

Unfortunately, the space hack doesn't work with QuickDraw GX. This column describes a new way for applications that generate their own PostScript code to send fonts to the printer. The code to do this is provided on this issue's CD.

QUICKDRAW GX CHANGES THE PICTURE

QuickDraw GX has a really cool imaging model, supports all kinds of whizzy features, and to top it off, introduces the long-awaited new printing architecture. But it has one snag: after all the years you've spent getting your PostScript printing tuned just the way you like it, QuickDraw GX breaks the space hack.

The space hack depends on a font's entire character set being sent to the printer in response to the need for a single character (the space character). But QuickDraw GX sends only the needed characters in a font to a printer, because it's trying to conserve memory on the printer and also because sending less data means faster transmission of that data. This isn't such a big issue with Roman fonts, where there are only 256 characters at most, but in the case of two-byte fonts such as Chinese, Japanese, and Korean fonts, where there can be tens of thousands of characters and the font can be tens of megabytes in size, sending only the required characters makes a big difference in speed.

Incidentally, with QuickDraw GX you don't need a specialized printer to print two-byte fonts. It divides fonts with more than 256 characters into several smaller fonts with new encodings containing just the characters you need, so you can print characters from the font on any PostScript printer.

THE NEW WAY TO DOWNLOAD FONTS

So QuickDraw GX has lots of advantages over QuickDraw, but the space hack is broken. What's the poor programmer to do?

You can use a new font downloading method based on calling GXFlattenFont, a handy function introduced with QuickDraw GX, to convert the font to a form that's easily sent to the printer. GXFlattenFont is intended to convert any font present on your Macintosh into the output font format of your choice. (Conversion is limited by the capabilities of the scalers present, as explained in "QuickDraw GX Font Scalers.")

    QUICKDRAW GX FONT SCALERS

    The QuickDraw GX Open Font Architecture accepts drop-in font scalers. A font scaler is a bit of code that takes a font of a given type and converts it to bitmaps for display. It also converts fonts to outline format and can optionally convert a font to another font format. QuickDraw GX includes three default scalers:

    • the bitmap scaler, which is essentially the same as in QuickDraw
    • the TrueType GX scaler, which supports the TrueType GX format
    • the Type 1 scaler, which is part of Adobe(TM) Type Manager

    All of these default scalers are capable of generating bitmaps for screen display and PostScript fonts for printing. Only the TrueType GX scaler can generate downloadable TrueType fonts.

GXFlattenFont can produce Type 1 data that's ready to be sent to your PostScript printer with no problem.

Now let's turn to the code that replaces the old space hack. The rough idea is to call GXFlattenFont on a QuickDraw font reference and a set of characters (an encoding) that you need to print, and return the result in a form that's easy to send to the printer. For simplicity, if no encoding is present, we use the standard Macintosh encoding. Listing 1 shows a font-downloading routine, FontToPict, that uses this technique if QuickDraw GX is installed. (This is a somewhat simplified version; see the CD for the full code of FontToPict and its related utility functions.)

Listing 1. FontToPict

PicHandle FontToPict(short qdFont, short qdStyle)
{
   Rect         theRect = {0, 0, 1, 1};
   PicHandle      thePict = OpenPicture(&theRect);
   const   short   kPostScriptHandle = 192;

   // If QuickDraw GX is installed, use the new method.
   if (GXInstalled()) {
      Handle            piccommentHdl;
      unsigned   short   *myEncoding = nil;
      
      MakePSHandle(qdFont, qdStyle, myEncoding, &piccommentHdl);
      PicComment(kPostScriptHandle, GetHandleSize(piccommentHdl),
          piccommentHdl);
   } else {
     // If QuickDraw GX isn't installed, use the old method.
      Point   penPoint;

      // We would normally set the clip here, but since we're just
      // drawing a space there's no need.
      GetPen(&penPoint);             // Save the pen location.
      TextFont(qdFont);
      TextFace(qdStyle);
      DrawChar(' ');
      MoveTo(penPoint.h, penPoint.v);    // Restore the pen location.
   }
   ClosePicture();
   return (thePict);
)
FontToPict starts by checking to see if QuickDraw GX is installed. If not, it uses the old hack of printing a space; otherwise, it calls MakePSHandle (Listing 2), which calls the utility function ConvertQDFontToGXFont to convert the QuickDraw font reference into a QuickDraw GX font reference. MakePSHandle then checks to see if an encoding has been passed in; if not, it builds the standard Macintosh encoding. Next it calls FontToHandle, which is just a wrapper for GXFlattenFont. GXFlattenFont converts the specified font to the Type 1 format. Error-handling and cleanup code is last. Simplicity itself! The result, whether QuickDraw GX is present or not, is a PICT that you can send to the printer by calling DrawPicture once the printer port has been opened.

When calling MakePSHandle, you should specify an encoding array that contains the characters you intend to actually print. This prevents QuickDraw GX from sending the entire font to the printer and becomes very important when you make your application WorldScript aware. There's an #ifdef in the code on the CD that generates only the encoding array you need in order to use a portion of the font. As mentioned earlier, with Chinese, Japanese, and Korean fonts, sending only the characters you need can make the difference between sending a few kilobytes or many megabytes of data to the printer. If you don't use the entire font, remember to encode the characters that you want to draw, using the same encoding that you passed in to the MakePSHandle function.

Listing 2. MakePSHandle

OSErr MakePSHandle(short qdFont, char qdStyle,
    unsigned short *encodingArray, Handle *outputHandle)
{
   OSErr            status = noErr;
   gxFont            theFont;
   unsigned short   *myEncoding;
   Boolean         madeEncoding = false;

   // Convert to a QuickDraw GX font reference.
   theFont = ConvertQDFontToGXFont(qdFont, qdStyle);

   // If no encoding, create the standard Macintosh encoding.
   if (!encodingArray) {
      long   returnLength;

      myEncoding =
          (unsigned short *)NewPtrClear(256 * sizeof(short));
      returnLength = MakeMac8BitEncoding(theFont, myEncoding);
      if (returnLength != 256) {
         DebugStr("\pHmm. We didn't get a full encoding.");
         return (returnLength);      // Pass the error along.
      }
      madeEncoding = true;
   } else {
      myEncoding = encodingArray;
   }

   *outputHandle = FontToHandle(theFont, myEncoding);
   if (madeEncoding) DisposePtr((Ptr)myEncoding);

   status = MemError();
   if (status == noErr) {
      status = GXGetGraphicsError(nil);
      if (status != noErr) {
         DisposeHandle(*outputHandle);
         *outputHandle = nil;
      }
   }
   return (status);
}
You may want to have HandleSpoolProc (which is called by GXFlattenFont and included on the CD) spool directly to the printer via picture comments. This way you won't need memory available to hold the font data at the intermediate steps.

DOWNLOADING HAPPINESS

The new font downloading method takes a little more work but produces better results in your printer font handling. You can easily send needed fonts to the printer, either the whole font or only the characters you'll be using. As a side benefit, you get support for two-byte font systems without having to write custom code for handling the large fonts or, worse yet, having to depend on the fonts being installed on the printer in a specific manner. Even if you're not ready to add QuickDraw GX imaging to your application today, adding QuickDraw GX compatibility improves the printing experience for your customers.

DAVE POLASCHEK recently relocated to California to join Apple's Developer Technical Support group. He's been told that supporting printing leads to hair loss and insanity. Dave previously lived in beautiful sunny Minnesota, and wonders if he'll get used to the harsh San Francisco Bay Area winters before he's bald and crazy, or if it's already too late.*

Thanks to Dan Lipton for providing the idea and core code illustrating the new font downloading method, and to Pete "Luke" Alexander, Dave Hersey, and Dan Lipton for reviewing this column.*

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Cyberduck 4.7.1 - FTP and SFTP browser....
Cyberduck is a robust FTP/FTP-TLS/SFTP browser for the Mac whose lack of visual clutter and cleverly intuitive features make it easy to use. Support for external editors and system technologies such... Read more
PDFpen 7.2 - Edit and annotate PDFs with...
We're also offering PDFpenPro for 30% off! PDFpen allows users to easily edit PDF's. Add text, images and signatures. Fill out PDF forms. Merge or split PDF documents. Reorder and delete pages. Even... Read more
Skype 7.9.746 - Voice-over-internet phon...
Skype allows you to talk to friends, family and co-workers across the Internet without the inconvenience of long distance telephone charges. Using peer-to-peer data transmission technology, Skype... Read more
Apple GarageBand 10.1 - Complete recordi...
The new GarageBand is a whole music creation studio right inside your Mac -- complete with keyboard, synths, orchestral and percussion instruments, presets for guitar and voice, an entirely... Read more
Duplicate Annihilator 5.7.7 - Find and d...
Duplicate Annihilator takes on the time-consuming task of comparing the images in your iPhoto library using effective algorithms to make sure that no duplicate escapes. Duplicate Annihilator... Read more
OS X Server 4.1.3 - For OS X 10.10 Yosem...
Designed for OS X and iOS devices, OS X Server makes it easy to share files, schedule meetings, synchronize contacts, develop software, host your own website, publish wikis, configure Mac, iPhone,... Read more
Firefox 39.0 - Fast, safe Web browser. (...
Firefox offers a fast, safe Web browsing experience. Browse quickly, securely, and effortlessly. With its industry-leading features, Firefox is the choice of Web development professionals and casual... Read more
pwSafe 4.1 - Secure password management...
pwSafe provides simple and secure password management across devices and computers. pwSafe uses iCloud to keep your password databases backed-up and synced between Macs and iOS devices. It is... Read more
Kodi 15.0.rc1 - Powerful media center to...
Kodi (was XBMC) is an award-winning free and open-source (GPL) software media player and entertainment hub that can be installed on Linux, OS X, Windows, iOS, and Android, featuring a 10-foot user... Read more
Coda 2.5.11 - One-window Web development...
Coda is a powerful Web editor that puts everything in one place. An editor. Terminal. CSS. Files. With Coda 2, we went beyond expectations. With loads of new, much-requested features, a few surprises... Read more

This Week at 148Apps: June 29-July 3, 20...
Into July With 148Apps How do you know what apps are worth your time and money? Just look to the review team at 148Apps. We sort through the chaos and find the apps you're looking for. The ones we love become Editor’s Choice, standing out above the... | Read more »
Sonic Runners Guide
Despite its flaws, Sonic Runners' platforming action is actually quite fun. Though it can be a little more complicated than old-school Sonic games. Here's how to make sure you're up to speed when jumping in. [Read more] | Read more »
Rage of Bahamut is Giving Almost All of...
The App Store isn't what it used to be back in 2012, so it's not unexpected to see some games changing their structures with the times. Now we can add Rage of Bahamut to that list with the recent announcement that the game is severely cutting back... | Read more »
Adventures of Pip (Games)
Adventures of Pip 1.0 Device: iOS iPhone Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: ** ONE WEEK ONLY — 66% OFF! *** “Adventures of Pip is a delightful little platformer full of charm, challenge and impeccable... | Read more »
Divide By Sheep - Tips, Tricks, and Stre...
Who would have thought splitting up sheep could be so involved? Anyone who’s played Divide by Sheep, that’s who! While we’re not about to give you complete solutions to everything (because that’s just cheating), we will happily give you some... | Read more »
NaturalMotion and Zynga Have Started Tea...
An official sequel to 2012's CSR Racing is officially on the way, with Zynga and NaturalMotion releasing a short teaser trailer to get everyone excited. Well, as excited as one can get from a trailer with no gameplay footage, anyway. [Read more] | Read more »
Grab a Friend and Pick up Overkill 3, Be...
Overkill 3 is a pretty enjoyable third-person shooter that was sort of begging for some online multiplayer. Fortunately the begging can stop, because its newest update has added an online co-op mode. [Read more] | Read more »
Scanner Pro's Newest Update Adds Au...
Scanner Pro is one of the most popular document scanning apps on iOS, thanks in no small part to its near-constant updates, I'm sure. Now we're up to update number six, and it adds some pretty handy new features. [Read more] | Read more »
Heroki (Games)
Heroki 1.0 Device: iOS Universal Category: Games Price: $7.99, Version: 1.0 (iTunes) Description: CLEAR THE SKIES FOR A NEW HERO!The peaceful sky village of Levantia is in danger! The dastardly Dr. N. Forchin and his accomplice,... | Read more »
Wars of the Roses (Games)
Wars of the Roses 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: | Read more »

Price Scanner via MacPrices.net

Apple refurbished Mac minis available startin...
The Apple Store has Apple Certified Refurbished 2014 Mac minis available starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: - 1.4GHz Mac mini: $419 $80 off... Read more
College Student Deals: Additional $100 off Ma...
Take an additional $100 off all MacBooks and iMacs at Best Buy Online with their College Students Deals Savings, valid through August 8, 2015. Anyone with a valid .EDU email address can take... Read more
Sky Atlas Star Walk 2 App For iPhone And iPa...
Vito Technology, developer of educational apps for Android and iOS, is for a limited time offering free of charge their Star Walk 2, the next generation of the company’s best-selling stargazing guide... Read more
13-inch 1.6GHz MacBook Air on sale for $849,...
Amazon has the 2015 13″ 1.6GHz/128GB MacBook Air on sale for $849.99 including free shipping. Their price is $150 off MSRP, and it’s the lowest price available for this model. Read more
13-inch 2.5GHz MacBook Pro on sale for $999,...
Adorama has the 13-inch 2.5GHz MacBook Pro on sale for $999 including free shipping plus NY & NJ sales tax only. Their price is $100 off MSRP. Read more
Updated Mac Price Trackers
We’ve updated our Mac Price Trackers with the latest information on prices, bundles, and availability on systems from Apple’s authorized internet/catalog resellers: - 15″ MacBook Pros - 13″ MacBook... Read more
15-inch Retina MacBook Pros on sale for up to...
B&H Photo has new 2015 15″ Retina MacBook Pros on sale for up to $225 off MSRP including free shipping plus NY sales tax only: - 15″ 2.2GHz Retina MacBook Pro: $1819 $180 off - 15″ 2.5GHz Retina... Read more
RamDisk4Mac App Helps Run Your Mac Faster And...
Ever use a RAM disk? If you’ve come to the Mac in the OS X era, likely not. The Classic Mac OS had a RAM disk function built-in, but that was dropped in the conversion to OS X. What is a RAM disk?... Read more
13-inch 1.6GHz MacBook Air on sale for $849,...
Best Buy has the 2015 13″ 1.6GHz/128GB MacBook Air on sale for $849.99 on their online store this weekend. Choose free shipping or free local store pickup (if available). Sale price for online orders... Read more
Apple Refurbished iMacs available for up to $...
The Apple Store has Apple Certified Refurbished iMacs available for up to $380 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 27″ 3.5GHz 5K iMac – $1949 $... Read more

Jobs Board

*Apple* Solutions Consultant - Retail Sales...
**Job Summary** As an Apple Solutions Consultant (ASC) you are the link between our customers and our products. Your role is to drive the Apple business in a retail Read more
Senior Payments Security Manager - *Apple*...
**Job Summary** Apple , Inc. is looking for a highly motivated, innovative and hands-on senior payments security manager to join the Apple Pay security team. You will Read more
Sr. Technical Services Consultant, *Apple*...
**Job Summary** Apple Professional Services (APS) has an opening for a senior technical position that contributes to Apple 's efforts for strategic and transactional Read more
Sr. Payment Program Manager, *Apple* Pay -...
**Job Summary** Apple Pay is an exciting environment and a…devices in a simple, private and secure way. The Apple Pay Team is looking for an experienced Senior Read more
Project Manager - *Apple* Pay Security - Ap...
**Job Summary** The Apple Pay Security team is seeking a highly organized, results-driven Project Manager to drive the development of Apple Pay Security. If you are Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.