TweetFollow Us on Twitter

January 92 - UOrnaments: Half-price Icons

UOrnaments: Half-price Icons

Thomas E. Burns

What if you want to display a bunch of icons, but find that TIcons are too big and slow? This type of situation calls for a class of objects that know how to draw themselves, but don't process events. To minimize memory usage, it's nice if these classes require only one instance per icon, no matter how many places an icon appears within a view.

I developed two classes for this purpose, TOrnament and TOrnamentServer, have proven useful. TOrnament is a simple abstract class that defines objects that know how to draw themselves within a view, but do not respond to events. Because of their simplicity, ornaments are about twice as fast at drawing and consume far less memory than similar views. TOrnamentServers make using ornaments easy and efficient by managing their creation and imaging.

Using ornaments

Adding ornaments to a view is straight-forward. First, by modifying your ISomeView and IRes methods, ask the appropriate OrnamentServer, gPictureOrnamentServer for pictures or gIconOrnamentServer for icons, to load the ornament. The AddOrnament method will either create and initialize the ornament, if it hasn't already been created, or increment the ornament's reference count.
gPictureOrnamentServer->AddOrnament( kTestPicture );

Then add code to your view's Draw method that draws the ornament. This example draws the ornament kTestPicture in your view(this) at location where with highlighting hlOff:

gPictureOrnamentServer->Draw( this, kTestPicture, where, hlOff );

The final step is to delete the ornament in the view's free method. DeleteOrnament will decrement the ornament's reference count and, if the reference count is zero, free the ornament.

gPictureOrnamentServer->DeleteOrnament( kTestPicture );

Even though ornaments do a lot of work for you, only four methods are needed to implement a new subclass. I will stroll through the implementation of TPictureOrnament and TPictureOrnamentServer to demonstrate the creation of new ornament subclasses.

Implementing TPictureOrnament

Subclasses of TOrnament are used to implement specific, resource-based images, such as pictures and icons. Because TOrnament implements the methods used for reference counting, Add and Delete, its subclasses need to implement only three methods: IPictureOrnament, Draw and GetExtent.

The IPictureOrnament calls IOrnament and then loads the picture resource. IOrnament merely calls IObject, sets the reference count to zero and sets fRsrcId to rsrcId. The essential code (without failure handling) for the IPictureOrnament method is:

virtual pascal void
TPictureOrnament::IPictureOrnament
(
    short   rsrcId
)
{
    this->IOrnament( pictureRsrcId );
    fPicture = GetPicture( fRsrcId );   // fPicture holds the
                                        // picture
    FailNILResource( (Handle)fPicture );
}

The Draw method is the core of an ornament. Its implementation will, of course, vary greatly for different classes of ornaments. Typically, a Draw method will call inherited::Draw (which calls PenNormal()), load and make unpurgeable the ornament's resource, and then draw with the appropriate highlighting. Because the code for drawing pictures is rather long and specific for 'PICT' resources, I will only show the definition for the method.

UOrnaments
virtual pascal void
Draw
(
    TView*              theView,    // view to draw in
    const VPoint&       where,      // top,left corner to draw at
    HLState             hilite      // the hilite to use
);

The next method, GetExtent, returns an ornament's size in a Point. This method is usually very similar to Draw. It must load and make unpurgeable the ornament's resource and then calculate its extent. Here's TOrnament's definition of this method:

virtual pascal Point
GetExtent
(
    void
);

The next step for creating a new ornament is to make a subclass of TOrnamentServer that overrides the DoMakeOrnament method. The function of TOrnamentServers is to manage the interactions between views and ornaments. A view never needs to refer to an ornament directly; it always uses an ornaments resource number instead. The advantages of this setup are:

  • A view can assume that it always needs to load and unload an ornament because TOrnamentServer will only do what is necessary. TOrnamentServer loads an ornament only once and then unloads it only after all views are finished with it.
  • There is no need for a view to add instance variables just to keep track of all the ornaments it is using.
  • Memory is saved because an ornament is loaded only once, no matter how many views are using it.

TOrnamentServers need to create ornaments when a new one is added to its list. To maintain the "object-oriented" nature of this unit, I didn't want to make TOrnamentServer know about all the possible types of ornaments. Therefore, TOrnamentServer has a DoMakeOrnament method that returns a new TOrnament of the appropriate subclass. This method for TPictureOrnamentServer is:

pascal TOrnament*
TPictureOrnamentServer::DoMakeOrnament
(
    short       rsrcId
)
{
    TPictureOrnament*       pictureOrnament;

    pictureOrnament = new TPictureOrnament;
    pictureOrnament->IPictureOrnament( rsrcId );
    return( pictureOrnament );
}

As an optional last step, write the InitPictureOrnamentServer function. This function creates and initializes an instance of the TPictureOrnamentServer class.

pascal void
InitPictureOrnamentServer
(
    void
)
{
    if ( gPictureOrnamentServer == NULL )
    {
        gPictureOrnamentServer = new TPictureOrnamentServer;
        gPictureOrnamentServer->IPictureOrnamentServer();
    }
}

Good indications

While it only required a couple of hours to write the original UOrnaments unit, it has proven to be a useful tool. The project I was working on when creating this unit, a robot controller, requires frequent use of indicators that can appear many, many times within a view. Full fledged views would be too big and slow to be practical. I hope ornaments prove to be as useful for you.
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

The beginner's guide to Warbits
Warbits is a turn-based strategy that's clearly inspired by Nintendo's Advance Wars series. Since turn-based strategy games can be kind of tricky to dive into, see below for a few tips to help you in the beginning. Positioning is crucial [Read... | Read more »
How to upgrade your character in Spellsp...
So you’ve mastered the basics of Spellspire. By which I mean you’ve realised it’s all about spelling things in a spire. What next? Well you’re going to need to figure out how to toughen up your character. It’s all well and good being able to spell... | Read more »
5 slither.io mash-ups we'd love to...
If there's one thing that slither.io has proved, it's that the addictive gameplay of Agar.io can be transplanted onto basically anything and it will still be good fun. It wouldn't be surprising if we saw other developers jumping on the bandwagon,... | Read more »
How to navigate the terrain in Sky Charm...
Sky Charms is a whimsical match-'em up adventure that uses creative level design to really ramp up the difficulty. [Read more] | Read more »
Victorious Knight (Games)
Victorious Knight 1.3 Device: iOS Universal Category: Games Price: $1.99, Version: 1.3 (iTunes) Description: New challenges awaits you! Experience fresh RPG experience with a unique combat mechanic, packed with high quality 3D... | Read more »
Agent Gumball - Roguelike Spy Game (Gam...
Agent Gumball - Roguelike Spy Game 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Someone’s been spying on Gumball. What the what?! Two can play at that game! GO UNDERCOVERSneak past enemy... | Read more »
Runaway Toad (Games)
Runaway Toad 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: It ain’t easy bein’ green! Tap, hold, and swipe to help Toad hop to safety in this gorgeous new action game from the creators of... | Read more »
PsyCard (Games)
PsyCard 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: From the makers och Card City Nights, Progress To 100 and Ittle Dew PSYCARD is a minesweeper-like game set in a cozy cyberpunk... | Read more »
Sago Mini Robot Party (Education)
Sago Mini Robot Party 1.0 Device: iOS Universal Category: Education Price: $2.99, Version: 1.0 (iTunes) Description: -- Children's Technology Review Editor's Choice -- | Read more »
Egz – The Origin of the Universe (Games...
Egz – The Origin of the Universe 1.0.2 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0.2 (iTunes) Description: ►►► Special offer until 2nd may : get the game at 2.99€ instead of 3.99€ ! ◄◄◄ Egz is a mesmerizing mix... | Read more »

Price Scanner via MacPrices.net

Apple restocks Certified Refurbished Mac mini...
Apple has restocked Certified Refurbished 2014 Mac minis, with models available starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: - 1.4GHz Mac mini: $419 $... Read more
15-inch 2.2GHz Retina MacBook Pro on sale for...
Amazon.com has the 15″ 2.2GHz Retina MacBook Pro on sale for $1699.99 including free shipping. Their price is $300 off MSRP, and it’s the lowest price available for this model from any reseller (and... Read more
Apple Beats Microsoft at Own Game; Amazon Pri...
First quarter seasonality combined with an overall disinterested customer base led to an annual decline of 14.7% in worldwide tablet shipments during the first quarter of 2016 (1Q16). Worldwide... Read more
Tablets Had Worst Quarter Since 2012, says St...
The global tablet market began 2016 just as 2015 left off, down. Tablet shipments fell 10% to 46.5 million units during the Q1 2016, according to the new “Preliminary Global Tablet Shipments and... Read more
Clearance 13-inch MacBook Airs, Apple refurbi...
Apple recently dropped prices on certified refurbished 2015 13″ MacBook Airs with 4GB of RAM with models now available starting at $759. An Apple one-year warranty is included with each MacBook, and... Read more
Clearance 12-inch Retina MacBooks, Apple refu...
Apple has dropped prices on Certified Refurbished 2015 12″ Retina MacBooks with models now available starting at $929. Apple will include a standard one-year warranty with each MacBook, and shipping... Read more
Aleratec Releases Mac Software Upgrade for 1...
California based Aleratec Inc., designer, developer and manufacturer of Portable Device Management (PDM) charge/sync products for mobile devices and professional-grade duplicators for hard disk... Read more
Sale! Amazon offers 27-inch iMac, 13-inch 2.9...
Amazon has the 27″ 3.2GHz 5K iMac and the 13″ 3.9GHz Retina MacBook Pro on sale for $300 off MSRP, each including free shipping, for a limited time: - 27″ 3.2GHz/1TB HD 5K iMac (model MK462LL/A): $... Read more
Apple refurbished 13-inch Retina MacBook Pros...
Apple has Certified Refurbished 13″ Retina MacBook Pros available for up to $270 off the cost of new models. An Apple one-year warranty is included with each model, and shipping is free: - 13″ 2.7GHz... Read more
13-inch 2.7GHz/128GB Retina MacBook Pro on sa...
Take $200 off MSRP on the price of a new 13″ 2.7GHz/128GB Retina MacBook Pro (model MF839LL/A) at Amazon. Shipping is free: - 13″ 2.7GHz/128GB Retina MacBook Pro: $1099.99 $200 off MSRP Act now if... Read more

Jobs Board

Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
Automotive Sales Consultant - Apple Ford Linc...
…you. The best candidates are smart, technologically savvy and are customer focused. Apple Ford Lincoln Apple Valley is different, because: $30,000 annual salary 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: 48260200 Phoenix, Arizona, United States Posted: Apr. 22, 2016 Weekly Hours: 40.00 **Job Summary** As an Apple Solutions Read more
Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.