Vista Advanced broken (and fixed) when running high DPI displays

I recently became the proud owner of a Microsoft Surface PRO device, and was shocked to see that our main software application Vista Advanced looked absolutely horrible!  It felt like half of the UI was tiny, and the other half was massive in size.  The Splash screen graphic was even bad, having been drawn in a tiled display.  Take a look at this first-run / out-of-box experience on the surface running the latest release (4.0.1 at the time of this writing):

Splash screen background image wrapping

Splash screen background image wrapping

Oversized controls and UI elements make the app usability pretty rough

Oversized controls and UI elements make the app usability pretty rough

The Problem

The problem, it turns out, has to do with the application’s UI frameworks detecting the selected resize mode for the OS (set to 150% scale by default on high DPI devices like the Surface PRO), and scales up the bitmaps and fonts accordingly.  The really annoying part is that only some of the UI elements are affected by this, and this is due to a combination of different technologies and control libraries being used together to put Advanced together.

The Workaround (read: Hack)

There is a work-around to allow existing versions of Vista Advanced software to look normal on your high DPI device, and the way to do this is to open display resolution in control panel and look for the link that says ‘Make text and other items larger or smaller’.  That link will bring you to the dialog below, and from this dialog set the size of all items to 100% (Smaller).  This affects the entire OS, and has the additional requirement of needing you to log out and back in before the setting will take effect.   This is certainly far from ideal, but in a pinch it’ll at least get you by.

Use display settings to change the default size of items to 100%

Use display settings to change the default size of items to 100%

The Real Fix

Modification to AssemblyInfo.cs to disable DPI awareness

Modification to AssemblyInfo.cs to disable DPI awareness

Luckily there is a simple software fix for this problem that we were able to put in place. Inserting the DisableDpiAwareness attribute at the main application’s assembly level will disable the DPI scaling that happens on these high DPI devices, causing our application to render the same size on all computers.  Setting this attribute immediately brings the application back into it’s normal look and feel:

Normal looking splash screen after setting DisableDpiAwareness

Normal looking splash screen after setting DisableDpiAwareness

Normal Advanced application look after setting DisableDpiAwareness attribute

Normal Advanced application look after setting DisableDpiAwareness attribute

Now with this fix, you can see Advanced looks as one might expect it to look again, and without the user having to make any screen resolution hacks to do it.  You’ll see this fix in the next beta version of software (0.55.8), which will roll into version 4.0.2 for those of you who wait for release builds only.

Simple Spyder Preset Recall App for Windows 7 and 8

Back at NAB this year, Vista used a Microsoft Surface PRO device as a free-standing touch screen running a custom application to recall Spyder command keys.  A number of people asked about obtaining a copy of this interface during the show, citing it’s ease of use and simple functionality as a common use case that can be found across several environments.  I worked on this application in my free time leading up to the show, and as it stands this isn’t something that will be formally productized.  It’s a great application for what it does, and as such, I’m making this application available here for those who want it.

Quick screenshot of the preset recall app in action

Quick screenshot of the preset recall app in action

Now for the quick description:  this is a full-screen desktop application which leverages the Windows 8 Metro design philosophy for a modern look.  The app auto-discovers Spyder servers on the network and allows them to be selected in a drop-down (top-right of the screen).  Upon selecting a server, it’s command key pages and associated command keys are displayed.  The command key buttons are greatly oversized, optimizing them for touch-screen scenarios.  A single press of these buttons will recall the program cue of it’s associated command key, and active command key buttons will be displayed in red (take a look at the screenshot above).

If you have any questions or issues getting running, feel free to post a message on the blog here.  It takes zero configuration to get running (other than getting your client PC on the same subnet as a Spyder), and as of this writing has no known issues.  Give it a spin, enjoy, and let me know what you think!

Download the Spyder Preset Recall Application Now

Note:  This application requires the installation of the Microsoft .Net 4.5 Framework

My first Windows Azure hosted Website. Spoiler alert – your looking at it

I was super excited when I learned that shared website hosting was added to the collection of amazing things Windows Azure can do, and so I rushed out and stood up a couple sandbox websites to get the hang of the creation process.  In short, it’s super easy to do, and at free it’s hard to go wrong.  One of the sites I created used the WordPress template

For a few years now, I’ve hosted a WordPress blog under a GoDaddy web hosting account.  I thought it would be fun to stand up a WordPress site using the gallery option


Bitmap Borders and Shadows: Part 2 of n

In the first part of this series of posts I discussed how to use the bitmap border / shadow feature on Spyder X20 and how it works under the hood.  In this post, I’m going to discuss the process for creating custom shapes and getting them loaded into the X20 video processor.  You might want to create custom shapes for any number of reasons, a common one being for corporate logos.  Below are a few examples of custom shapes I’ve generated for the sales team for various demos over time.

DVD player video cut into CNN logo
Another DVD player cut into shards

So How is a Shape Defined?

The bitmap border / shadow engine uses a XAML (eXtensible Markup Language)  parser to convert a vector-based shape definition into the specially formatted raster-based image that is loaded to the video processor hardware.  The shape definition is imported into the system as a .shape file, which contains a single XAML PathGeometry definition. Below is the contents of a shape file defining one of the ‘shard’ shapes above:

    Figures="M 100,0L 62.75,0L 51.75,24.3333L 
     65.9166,24.3333L 66.25,45.3333L 75.75,30.5L
     5.5833,62.3333L 92.5833,75.5L  100,75.8333L 100,0 Z "/>

The real meat of the shape definition is defined in the Figures section of a PathGeometry object, which is written in a mini path syntax.  In practice you’ll be copying and pasting this data out of a tool like Microsoft Expression Design, but in case your curious there are several pages online that describe the XAML path mini-language (one here) that you can peruse in your free time if your curious to know more about how this syntax works.

Tools of the Trade

There are many tools capable of generating XAML output, but my personal preference is Microsoft’s Expression Design tool.  You can download a 60-day free trial of this tool on Microsoft’s site (here).

You’ll also want to have a basic template file that you can paste your custom shape data into.  You can pull this off my site here.

OK I have the Tools, now what?

The steps involved are easier to show than describe, and so I created a video walkthrough showing the process of creating a custom shape with Expression Design, saving it into a .shape file, and then finally importing that shape into Spyder using Vista Advanced.  The walkthrough moves pretty fast; if you have any questions just leave a comment on this blog post for me and I’ll try my best to help.



So hopefully this post has helped explain the basics of creating custom shapes for your X20 system.  In the next post I’ll spend some more time building custom shapes and logos in Expression Design, and I’ll cover a few tips and tricks I’ve found to make the process more efficient.

Bitmap Borders and Shadows: Part 1 of n

In this next series of posts, I’m going to discuss the bitmap borders and shadows (BBS) feature that first appeared in Vista Advanced 3.5.0.  If you haven’t played with them yet, you owe it to yourself to do so. 

This first blog post will discuss how (and when) you can use the feature, how it works under the covers, and how to get the best possible performance from it.  If you have no idea what the bitmap borders and shadows feature is, take a look at the action shot below.


The image above shows two related features, bitmap borders and shadows and window titling.  I’m going to skip over titling for this post, and concentrate only on the bitmap border / shadow feature.

What Can I do With Bitmap Borders?

Bitmap borders goes beyond the traditional supported borders to enable custom shapes and fills to be defined.  Shadows applied will keep the same shape as the bitmap border, and can even have a color other than black defined (not shown).

one layer

Features Shown:

  1. Non-Rectangular window (rounded edges in this example)
  2. Image file used as border texture
  3. Shadow shape that matches the border shape

The Spyder software comes with about a dozen border shapes that you can use, as well as a number of images that can be used to texture the border.  Of course you can create and use custom shapes and fill images, which I’ll be discussing in detail in the next blog post.

The KeyFrame property panel contains handles for all of the available bitmap border and shadow adjustments, and I’ve included a few screenshots of the most interesting ones below.  Using them is pretty self explanatory, and so I won’t bother going through them exhaustively.

border settings border texture border shape
General Settings Border Texture Border Shape


So How Does It Work?

Under the covers, the border / shadow settings selected are used to generate a specially formatted image at a size relative to the input video resolution, which gets loaded once into the target layer where it is in turn merged with the video each frame. The Images below show this process.

Example - Source Video Frame Buffer (2048×1200)

In this frame buffer, the active video is repositioned so that it will fit correctly when merged with the border image loaded.  These offsets are programmed by the server as part of the image loading process

Example - Border Bitmap  Buffer (2048×1200)

This buffer stores the generated image which will be merged with the video.  Special bit values are encoded into the image to specify what area of the image should be mixed with the video and which area should be mixed with the VI.

Example - Both Resulting Image

Once the image is loaded, the hardware in the X20 layer will perform the video cutout and merge the image with the border on a frame-by-frame basis.

Note that the image sequence above makes a point to call out the frame buffer sizes in the layer hardware; a size of 2048×1200.  This is important because the generated image file previously mentioned needs to fit within these dimensions.  Since the image file must be loaded relative to the input video resolution, there may not be enough ‘free’ frame buffer space to generate the desired effect. 

In cases where there isn’t enough space to fit the requested bitmap border / shadow settings, the server will automatically scale back the border offset and then the border thickness until the image fits.

Also note that the image files generated can be relatively large, and in almost all cases you really need to be running a still server to ensure a good experience.  While technically the bitmap borders will work when using traditional USB loading, the image load times detract much of the experience.  There is additional information on the still server on the Vista forum site, and I’ve additionally just completed a post describing the still server here.

Where Bitmap Borders Won’t Work

There are a few scenarios where bitmap border functionality isn’t available, and this section attempts to list them all to save you from surprises in the field.

  • Input Resolutions above 2048 wide OR 1200 high.  This causes the layers to enter a special mode that uses two layer frame buffers, and there is no bitmap border support when in this mode.

  • Running a VI height above 1850.  When your running a VI at a height above 1850, certain layers cannot support still images, effectively disabling bitmap borders.

Tips for Getting the Best Experience

While certainly not required, the recommendations presented here are sure to be extremely beneficial for anyone using the bitmap border / shadow feature set.

Use a Still Server

I know I mentioned this already once in this post, but it can’t possibly be stressed enough.  If your using bitmap borders and shadows (or stills for that matter), then plunk down a few hundred bucks and buy a PC to hook up to your X20 for use as a still server.  The speed performance improvement when using this accessory can easily be over 10x. 

Build Treatments to Recall Bitmap Border Settings

Using treatments is good practice in general, but the load times involved with adjusting bitmap borders and shadows make it an even more beneficial practice.  Instead of manually adjusting KeyFrame parameters each time you want to setup a bitmap border, just make a treatment for the looks you use most frequently (border / shadow treatment settings include bitmap border options).  Not only does this clean up the workflow for the operator, the on-screen experience is nicer since the system will use the smooth go processor to automatically pull the layer off screen while loading the border.


I always like knowing how things work under the hood, and if your like me then hopefully this has shed a little light on how the bitmap border and shadow feature works.  In the next post, I’m going to discuss how you can create your own custom border shapes and use them with the Spyder X20.

Using a Still Server with Spyder X20

While the still server has been a supported option for Spyder X20 and URS since the initial product release, I’m still surprised to see the number of people who either aren’t aware of it or don’t understand it’s usefulness.  Since it’s usage is essentially a core requirement when using the bitmap border and shadow features I’m planning to blog about shortly, I figured I’d provide a thorough explanation of what it is, how it works, and why you should care.

Traditional Image Loading (No Still Server)

First a little history lesson:  In a traditional scenario where a still server is not in use, images are transferred from the internal X20 computer to the hardware using an internal USB 2.0 hardware link.  This link is fairly slow, and depending on the size of the image being loaded there may be a delay of several seconds to complete a transfer to a hardware input or output frame buffer.  Note that this is the method used on the Spyder 200/300 series systems.  The image below shows a high-level overview of this process. 

Figure 1: Image loading without a still server

This approach has a few disadvantages.  As mentioned previously, the image load time can be substantial (over a minute in the case of backgrounds).  Under the covers on the server, there is a substantial amount of CPU and memory being consumed to process and stream the image out to the hardware.  The resulting effect during periods of moderate to heavy still usage can be characterized as a noticeably sluggish ‘feel’ to the system.

Enhanced Image Loading (Enter the Still Server)

When the Spyder X20 was designed, a special DVI-D input connector was added to the output board which is labeled ‘OpMon Input’ (yes the name is incredibly misleading), which allows us to increase still loading speed by relying on an external PC connection.  This external PC, typically referred to as a Still Image Server, runs a special application that connects to the existing Spyder network and listens for requests to display image files. 

Figure 2: Still Server Network / Video Wiring Diagram

When configured to use a still server, the Spyder X20 / URS server will offload the image loading instruction to the still server, and then simply instruct the hardware to do a frame capture of the image on the OpMon input and transfer the image into the target input / output frame buffer (see sequence below).

Figure 3: Image loading using a still server

This has a number of benefits, the largest of which is the raw speed increase when loading images.  The other big side effect is the reduction in CPU and memory usage on the X20 server, since the ‘heavy lifting’ gets moved off to the still server PC and the X20 hardware.

The description above about how the still server works has been  oversimplified, and there are a number of tricks employed to handle edge cases; scenarios like images with alpha channels being being captured, or where the image is larger than the still server’s output resolution.  Be assured, these are supported scenarios that still reap huge benefits from the still server.

What Scenarios Benefit from a Still Server?

In short, pretty much any operation in an X20 / URS system that loads a still image to a layer or an output will see a large benefit from using the still server.  Below is an exhaustive list, which might contain a few you may not have considered:

  • – Backgrounds (HUGE performance boost)
  • – Stills on layers
  • – Test Patterns (layers / outputs / PixelSpaces)
  • – Bitmap Borders / Shadows
  • – Window Titling
  • – SourceMonitor overlays

Performance Tips

Use a Gigabit network

When using that still server, keep in mind that image files are transferred from the X20 / URS server over the network, and so you can get an additional boost from the still server when your using a Gigabit network for communication.

Use a still server PC with a decent graphics card

While the still server application isn’t a particularly demanding application, it is a graphics application that will take advantage of hardware acceleration where it can.  If your out looking for a new PC to run as your still server, look for something with a decent ATI or NVidia (preferred) graphics card.  If the PC your looking at has one of those Intel Extreme Graphics chipsets, keep looking…


For many scenarios, the still server is a must-have accessory for the X20 / URS system, and considering the low cost of PC hardware there really isn’t a good reason not to have one.  If your not already using one, do your self a favor and get one. 

Long Christmas Weekend Over

The Christmas season always promises to be a fast paced blur of playing with toys and attending a series of family get-togethers, and this year was no exception.  Beyond the normal dinner-breakfast-dinner family events at Melissa’s grandparents house, we were able to squeeze in a trip to the Phoenix Zoo Lights and spend plenty of time with Lily playing with her new Barbie Power Wheels ATV in the front and back yard.

Lily at the Laptop     Lily on the hobby horse   Lily opening presents   Lily on the Zoo Lights Carousel   Phoenix Zoo Lights Entrance

Four days around the house also proved to be just the right amount of time to get our new fish tank up and running,  I had picked up a 60 gallon acrylic tank from a family who had posted it on Craigslist a few weeks ago, and had received an acrylic overflow piece I was waiting on just before the Christmas break.  I managed to get the tank drilled and the overflow welded into place on the evening of Christmas eve, and here and there during the rest of the weekend I was able to get the rest up and running.  The old 25 gallon tank is already out in the back yard, which is a good thing since there was more silicone patchwork holding it together than there was glass.

Fish Tank Empty Tank Overflow Holes Drilled Tank Overflow Installed Tank Spray Bar Installed Tank Running Water For the First Time Tank With Canopy Installed    Tank Glory Shot 1 Tank Glory Shot 2 Tank Glory Shot 3

Car PC Project Update – 12/02/2009

Between the honeymoon, jury duty, Thanksgiving weekend, and an overnight Christmas tree excursion, life has been pretty busy as of late.  We took the Expedition to Flagstaff the day after Thanksgiving, and so I spent a fair amount of the day in the garage on Thanksgiving getting an audio amplifier installed so that the family would have some music for the trip.  Originally I had planned on installing the amp under the passenger seat, but unfortunately there wasn’t enough space and I ended up doing the install in the center console stacked on top of the car computer.  I used 1” foam spacers and industrial strength Velcro to ensure a stable installation.  The spacers do a good job of ensuring that air flows evenly around both the amp and the car PC, and the sensors in the PC didn’t show any noticeable change in temperature during the road trip.

Before the weekend trip, and before the honeymoon for that matter, I had also managed to get the sonar sensor installed into the front grill.  It wasn’t particularly note-worthy, however, because for some reason it’s not working.  Most likely a break in the wire, but I haven’t come back to it yet to determine what the root cause is.  At any rate, I’ve put some pictures below of both the sonar sensor and the audio amplifier that are now installed in the Expedition.

CarPCWork005_thumb CarPCWork020_thumb iPhoneImport11232009018_thumb
Amp Installed in Center Console
Down and dirty video app
Sonar / Depth sensor installed in front grill

Sunday evening I also spent some time with the tin snips and made a mounting chassis for the 15” touch screen display, and then lined the chassis with industrial strength Velcro.  I had to stop short of applying the opposite Velcro pieces to the monitor, because I didn’t have any foam tape to serve as spacers in places along the monitor back.  Still determined to make some noticeable progress, I switched focus to moving the A/C controls from the dash down and into the back wall of the ‘bucket’ area of the center console normally used to hold keys and misc items while driving.  Like most things, however, this approach was unfeasible because the A/C controller was physically larger than the area available.  With tin snips still at the ready, I decided to fashion a full replacement for that ‘bucket’ area that would hold not only the A/C controls but also a 4-port USB hub as well.  It’s laughable to think of how many times I had already caught myself saying “my car is really lacking in USB ports”.

CarPCWork003_thumb CarPCWork006_thumb  CarPCWork008_thumb
Monitor placed into mount
Sheet metal outline
Relocated A/C and USB

As soon as I can find a nice rubberized material to cover the sheet metal around the A/C controller and USB this will look nice and clean.  Overall though, I’d say there has been some good ground made on the car and the way has been paved to get that screen finally installed.  If I can muster up some bravery (and some free time) this weekend then I should be in a good place to take a real crack at it.  In the mean time, I have something at least working (I’ve temporarily borrowed the Mimo touch screen monitor from my desk to give me a small UI).


PowerPoint 2007 Network Controller

Update:  The add-in described in this post is no longer available.  The concept of controlling PowerPoint over a network overlaps with  functionality used in Vista’s multi-screen background generation product, CanvasMaster, released in 2001.

I’ve managed to create  an add-in for PowerPoint 2007 that allows presentations to be controlled over the network.  The app is pretty basic, but is particularly useful for automating demos or integrating PowerPoint content playback with other systems.  Below is a screenshot of the add-in toolbar:


As it’s name suggests, the little light bulb labeled ‘Control Enabled’ toggles the add-in on or off.  When enabled, the add-in will listen for network requests on the UDP port configured under the ‘Configure’ icon.  When a packet is received, it is parsed by the network command processor and the enclosed command is executed.  The ‘Supported Commands’ icon on the toolbar opens a dialog which shows the available commands for the installed version of the add-in.  At the time of this writing (build 1.0.6), the available commands are as follows:


Pretty simple, eh?  While its true that the generic control protocol in this add-in lends itself to pretty much any network enabled controller, I originally started working on the concept as a solution for us internally to tightly integrate PowerPoint presentation playback with Spyder scripting loops at trade shows.  The first attempts didn’t really go anywhere, as the available PowerPoint interop capabilities from Visual Studio were fairly cryptic.

A month or two ago I was emailing with a friend over at InformationsTeknik (Hi Rene!) who was looking to build the same sort of application, and so I made an unfinished sample project that had this basic functionality.  A few sleepless nights later, and voila, I have it wrapped up into a redistributable installer.

I was hoping to have my website finished enough to share a link to the associated project page, but it still has a little way to go, and so while I’m using my site to host the installer download, I’ll have to come back and update this page later with a link to a full-blown project page.  In the mean time you can download from the link below:

Download the PowerPoint 2007 Network Controller (Version 1.0.6)


Control Client / Test Utility Application

clientapp_thumb2When the PowerPoint network controller is installed, a client application will be added to the start menu which can be used to send commands to a machine running the PowerPoint add-in.  This can be either the local machine or another PC on the network.  To run this application, look in the programs folder under the start menu for ‘PowerPoint Network Control’.  A debug window on the right side of the application shows transmit and receive messages in real-time; you’ll notice that every command sent to the PowerPoint add-in will result in a response.  Users building custom control applications to interact with the add-in can use this window to see the specific responses that will be returned from the add-in for any given command.

Using Spyder to Control PowerPoint

Well if you’ve read this far into the blog and you have a Spyder system, this will be a little bonus.  Spyder can easily control PowerPoint when used with the network controller add-in by simply creating a few network command function keys.  The screen shots below should be self-explanatory; a network function key is generated to ‘wrap’ each of the available control commands.  These function keys can be executed directly, or (more importantly) can be linked into script cues to tightly couple command key recalls with the PowerPoint content.  It’s like having a SourceMaster for PowerPoint!

Big Disclaimer:  This software is not maintained or supported by my employer, Vista Systems.  Please do not try to contact Vista for technical support for this application.  Post any questions or comments on this blog post, and I’ll try to get back to you as time permits.  I’ve used this software quite a few times now, and it’s worked flawlessly.  If your planning to use it for anything ‘mission critical’, make sure you do your own adequate testing in your environment before going live with it.

Next Slide Function Key
Previous Slide Function Key
FunctionKeyNext_thumb6 FunctionKeyPrevious_thumb7
Home Function Key

 What’s Next for this Project?

I think it makes pretty clear sense to add the ability to load, start, and stop presentations remotely using network clients communicating through the add-in.  Currently the add-in requires that the PowerPoint presentation being controlled be manually started before the commands will work.  If you have ideas about how to make this better, or have any comments about the project, post them in the comments for this post.

X20 Blend Loading Improvements

With the upcoming Vista Advanced 3.3.1 software, we’ve made big improvements to both the blend loading time and the user experience when working with the blend controls in the UI.  The X20 blending and black level is achieved by loading a 32-bit bitmap image onto each output, which is essentially layered over the top of the output video.  Using internal USB image transfer, the load time associated with each blend or black level change can be several seconds.  A still server reduces the load time substantially, however you can see in the figure below that we were able to beat even the still server time.

Blend Load Times

In cases where only left and/or right blends are enabled (which is all cases currently since Spyder and Spyder X20 don’t support vertical blending) each line of the still server image is identical.  Since the majority of the time penalty in loading blends was at the image transfer, we opted to write only the first line of the blend to hardware, and enable a new mode in firmware that would cause that line to be written to every line of the output.  Voila, blend loading is now under 500ms.

In the user interface we had another problem with the blend controls, specifically the curve adjustment sliders.  All image loading occurs asynchronously, and there was code disable the blend adjustment controls while any image was being loaded (a carryover from Spyder).  Since X20 blends are loaded as images, as soon as a slider started to move the entire control would become disabled.  This has been corrected, and will be available in the 3.3.1 update this week.