Posterizing Images

A message on a Flash list posed the question of whether there was any way to dynamically generate a posterized version of a bitmap image in Director. My response: “Nothing could be simpler.”

The following movie script takes an image object and applies the built-in Web 216 palette to the picture without dithering, which results in a fair amount of posterization. Using a more restricted palette would result in more dramatic effects.

on posterize imageRef
  memberRef = new (#bitmap)
  posterizedImage = image (imageRef.rect.width, imageRef.rect.height, 8, #web216)
  posterizedImage.copyPixels (imageRef, imageRef.rect, imageRef.rect)
  memberRef.image = posterizedImage
end

You can see the results of this script here (click to open up a larger version):

To execute the script, if you’ve got a bitmap image in cast member position 1, you just type “posterize member (1).image” in the Message window.

The first command creates a new cast member for the posterized bitmap.

The second command assigns an image object to a variable, using the size of the original image, setting the color depth of the posterized image, and specifying a palette to use.

The third command copies the original image into the image object.

Finally, the image object is assigned to the image property of the new member.

To make the third version of the original image in the JPG, I just substituted a 4 for the 8 in the third parameter of the image function, to make it 16-color instead of 256-color. For more control over the colors of the posterization, you can create a custom palette and substitute its member reference for the fourth parameter. There are all other sorts of effects you can do automatically using copyPixels, including things like inverting the brightness of the colors. If you’re not in a hurry, it’s certainly possible to do a pixel-by-pixel processing of the image.

You can download the source file (compatible with Director 8.5 and later) here.

The Netherlands Rock!

So I’m listening to a piece on the South by Southwest music festival on NPR’s “Morning Edition” today, and they’re talking about how the Australian and Scottish governments (among others) send their bands to the festival because they see them as another potential export commodity. Then they mention that eight bands from the Netherlands are there because of the “government-funded Dutch Rock and Pop Institute”. Man, we gotta get one of those…

Who Won?

The cultural chauvinism of US pundits has been in full swing since the elections in Spain over the weekend. New York Times columnist David Brooks leads off this morning’s opinion piece: “I am trying not to think harshly of the Spanish.” Well, la-di-dah, Mr. Brooks.

In the minds of most of the pro-war opinionators, the Spanish “caved” (one of last night’s banners from MSNBC’s “Scarborough Country”) to terrorists by electing José Luis Rodríguez Zapatero as prime minister over José María Aznar, despite the fact that Aznar had joined the US “Coalition of the Willing” (COW) against the wishes of some 90% of the voters last year. Guys, that’s democracy. Sure, Aznar’s party was up a few points in the polls before the bombings last week, but so was Howard Dean before he landed in third place in the Iowa caucuses.

In the minds of Brooks and his ilk, the Spanish are now no better than the French; shameful sheep who can be terrorized into “appeasement”. I have to say, he doesn’t seem to have had a very high opinion of one of the primary partners in the COW. You have to wonder what he thinks of the Italians.

What I find intriguing is that at the same time Spanish voters are repudiated for supposedly letting a terrorist attack affect their elections, US voters are being urged by ads for George W. Bush to vote for him because — wait for it — of September 11.

Love to Hate Shockwave.com?

Eight years of wrestling with Shockwave installs got you down? Still sick at heart about how each install leads to some foreign site?

Mark Reijnders passed along the link to this delightful story about what happened when Shockwave.com gave a reported $2 million to “South Park” creators Matt Stone and Trey Parker to develop an online series called “Princess”. Could be Stone and Parker pushing the limits of taste, could be they were out of ideas, but it never went live on Shockwave.com.

Cable channel Trio has made “Shocked”, a short documentary about the series, and a couple of episodes of “Princess” available online. See for yourself what $2 million of venture capital can buy!

More Director Guys in the Media

In those hazy days back before the Web, the name Marvyn Hortman rose high in the Director community. Marvyn set up an FTP site where developers could post tutorials, samples, and information in an era (only a decade ago) when getting up-to-date material wasn’t exactly easy.

Late last Saturday night, Marvyn and his neighbor came home late and just missed running into a bank robber who’ been featured that night on America’s Most Wanted. The fugitive, Terence Washington, stole the neighbor’s Hummer and headed off into the night.

Marvyn reports that a camera crew from AMW was due to interview him and his neighbor Friday, and it should air as a lead story on Saturday, March 20.

Director/Shockwave/Flash Game Developers at GDC

Haven’t determined whether I’m going to make it this year, but if you’re attending the Game Developers Conference 2004 — or if you’re just in the San Jose area on March 26 — Brian Robbins announced the meeting time and place for the annual gathering of Director/Shockwave and Flash game developers.

Most of the show’s oriented toward the big-time console and computer-based markets, but a number of folks from our community, including Brian and Gray Rosenzweig, regularly present at the conference (see my article at DOUG on last year’s dinner).

Brian says to meet up from 4-5PM, Friday, March 26 at the IGDA booth outside the main entrance to the Expo hall at the San Jose Convention Center (you don’t need a pass to get that far). It’s a great way to meet people who love to play and develop (and sell) games!

A Few <P>s on HTML Display in Flash

If you intend to repurpose html-formatted text for use in Flash, you will be surprised by Flash’s rather unique parsing. This can be a pleasant surprise [like when Flash skates over certain tags that you can then reserve for browser-only content], but this can also be a very frustrating constraint. A glaring case in point is Flash’s parsing of the paragraph tag.

The standard browser method of displaying a paragraph is to block the text and follow it with a line feed. This provides a visual gutter between paragraphs and improves legibility of the text. In Flash, the paragraph tag blocks the text and follows it with a break, but not a line feed. The result can be a scrunched-up mess.

One possible solution is to add artificial ingredients to set the paragraphs apart. Unfortunately, this will also double-space these items when the source html is parsed raw to a browser — not to mention how this will complicate editing the source via a WYSIWYG application such as Dreamweaver. You can try applying disparate CSS styles or a Flash TextFormat — one or the other, mind you — but you will be frustrated in finding an adequate solution.

A solution that I have developed takes the html source and parses it as an xml structure in Flash. Once parsed, you can then traverse the nodes and slip an empty <br> node into the end of each paragraph node and toss the result into the htmlText property of a TextField object. It works and it keeps your source pristine. Plus, this subroutine can easily be conditioned out if future players modify the parsing behavior.

Note, however, that If you do this it will be very important that your source be xhtml compliant, otherwise the content will “break off” when open or overlapping nodes are encountered in the source. Most notably, you must self-close all image and break tags, ie: <img src=”pix.jpg”/><br/>. Do that, then do this …

xhtml = new XML();
xhtml.ignoreWhite = true;
xhtml.load (“someSource.html”);
xhtml.onLoad = function () {

  massage (this);
  someTextInstance_txt.htmlText = this;
};

massage = function (xml, node) {
  if ( !node ) { var node = xml; }
    for ( var pnode = node.firstChild; pnode; pnode = pnode.nextSibling ) {
      if ( pnode.nodeName.toLowerCase () == “p” ) {
      pnode.appendChild (xml.createElement (“br”));
    }
    // recursively search through deeper nodes
    if ( pnode.hasChildNodes ) { massage (xml, pnode); }
  }
};

Lingo PDF Generators

Years ago, I thought I was pretty cool for knowing enough about PostScript to be able to write a tool to import simple EPS and PostScript files into Director as vector shape data (PS2VS).

Now that I’m old and all of my creativity has dried up, I can only look admiringly on as people move into areas I thought about but never managed to explore. Specifically, Daniel Nelson and Valentin Schmidt, who have both posted code demos and libraries showing how to generate PDF files with Lingo.

Check out Daniel’s BlueJade demo page or download Valentin’s latest PDF Class library.

P.S. Valentin also has a Windows-only PDF-creation Xtra!

P.P.S. Daniel’s got a set of vector shape import scripts that beat PS2VS on speed, too.