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

Latest Forum Discussions

See All

Fallout Shelter pulls in ten times its u...
When the Fallout TV series was announced I, like I assume many others, assumed it was going to be an utter pile of garbage. Well, as we now know that couldn't be further from the truth. It was a smash hit, and this success has of course given the... | Read more »
Recruit two powerful-sounding students t...
I am a fan of anime, and I hear about a lot that comes through, but one that escaped my attention until now is A Certain Scientific Railgun T, and that name is very enticing. If it's new to you too, then players of Blue Archive can get a hands-on... | Read more »
Top Hat Studios unveils a new gameplay t...
There are a lot of big games coming that you might be excited about, but one of those I am most interested in is Athenian Rhapsody because it looks delightfully silly. The developers behind this project, the rather fancy-sounding Top Hat Studios,... | Read more »
Bound through time on the hunt for sneak...
Have you ever sat down and wondered what would happen if Dr Who and Sherlock Holmes went on an adventure? Well, besides probably being the best mash-up of English fiction, you'd get the Hidden Through Time series, and now Rogueside has announced... | Read more »
The secrets of Penacony might soon come...
Version 2.2 of Honkai: Star Rail is on the horizon and brings the culmination of the Penacony adventure after quite the escalation in the latest story quests. To help you through this new expansion is the introduction of two powerful new... | Read more »
The Legend of Heroes: Trails of Cold Ste...
I adore game series that have connecting lore and stories, which of course means the Legend of Heroes is very dear to me, Trails lore has been building for two decades. Excitedly, the next stage is upon us as Userjoy has announced the upcoming... | Read more »
Go from lowly lizard to wicked Wyvern in...
Do you like questing, and do you like dragons? If not then boy is this not the announcement for you, as Loongcheer Game has unveiled Quest Dragon: Idle Mobile Game. Yes, it is amazing Square Enix hasn’t sued them for copyright infringement, but... | Read more »
Aether Gazer unveils Chapter 16 of its m...
After a bit of maintenance, Aether Gazer has released Chapter 16 of its main storyline, titled Night Parade of the Beasts. This big update brings a new character, a special outfit, some special limited-time events, and, of course, an engaging... | Read more »
Challenge those pesky wyverns to a dance...
After recently having you do battle against your foes by wildly flailing Hello Kitty and friends at them, GungHo Online has whipped out another surprising collaboration for Puzzle & Dragons. It is now time to beat your opponents by cha-cha... | Read more »
Pack a magnifying glass and practice you...
Somehow it has already been a year since Torchlight: Infinite launched, and XD Games is celebrating by blending in what sounds like a truly fantastic new update. Fans of Cthulhu rejoice, as Whispering Mist brings some horror elements, and tests... | Read more »

Price Scanner via MacPrices.net

Verizon has Apple AirPods on sale this weeken...
Verizon has Apple AirPods on sale for up to 31% off MSRP on their online store this weekend. Their prices are the lowest price available for AirPods from any Apple retailer. Verizon service is not... Read more
Apple has 15-inch M2 MacBook Airs available s...
Apple has clearance, Certified Refurbished, 15″ M2 MacBook Airs available starting at $1019 and ranging up to $300 off original MSRP. These are the cheapest 15″ MacBook Airs for sale today at Apple.... Read more
May 2024 Apple Education discounts on MacBook...
If you’re a student, teacher, or staff member at any educational institution, you can use your .edu email address when ordering at Apple Education to take up to $300 off the purchase of a new MacBook... Read more
Clearance 16-inch M2 Pro MacBook Pros in stoc...
Apple has clearance 16″ M2 Pro MacBook Pros available in their Certified Refurbished store starting at $2049 and ranging up to $450 off original MSRP. Each model features a new outer case, shipping... Read more
Save $300 at Apple on 14-inch M3 MacBook Pros...
Apple has 14″ M3 MacBook Pros with 16GB of RAM, Certified Refurbished, available for $270-$300 off MSRP. Each model features a new outer case, shipping is free, and an Apple 1-year warranty is... Read more
Apple continues to offer 14-inch M3 MacBook P...
Apple has 14″ M3 MacBook Pros, Certified Refurbished, available starting at only $1359 and ranging up to $270 off MSRP. Each model features a new outer case, shipping is free, and an Apple 1-year... Read more
Apple AirPods Pro with USB-C return to all-ti...
Amazon has Apple’s AirPods Pro with USB-C in stock and on sale for $179.99 including free shipping. Their price is $70 (28%) off MSRP, and it’s currently the lowest price available for new AirPods... Read more
Apple Magic Keyboards for iPads are on sale f...
Amazon has Apple Magic Keyboards for iPads on sale today for up to $70 off MSRP, shipping included: – Magic Keyboard for 10th-generation Apple iPad: $199, save $50 – Magic Keyboard for 11″ iPad Pro/... Read more
Apple’s 13-inch M2 MacBook Airs return to rec...
Apple retailers have 13″ MacBook Airs with M2 CPUs in stock and on sale this weekend starting at only $849 in Space Gray, Silver, Starlight, and Midnight colors. These are the lowest prices currently... Read more
Best Buy is clearing out iPad Airs for up to...
In advance of next week’s probably release of new and updated iPad Airs, Best Buy has 10.9″ M1 WiFi iPad Airs on record-low sale prices for up to $200 off Apple’s MSRP, starting at $399. Sale prices... Read more

Jobs Board

Liquor Stock Clerk - S. *Apple* St. - Idaho...
Liquor Stock Clerk - S. Apple St. Boise Posting Begin Date: 2023/10/10 Posting End Date: 2024/10/14 Category: Retail Sub Category: Customer Service Work Type: Part Read more
*Apple* App Developer - Datrose (United Stat...
…year experiencein programming and have computer knowledge with SWIFT. Job Responsibilites: Apple App Developer is expected to support essential tasks for the RxASL Read more
Omnichannel Associate - *Apple* Blossom Mal...
Omnichannel Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Operations Associate - *Apple* Blossom Mall...
Operations Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Cashier - *Apple* Blossom Mall - JCPenney (...
Cashier - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Mall Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.