private static void GenerateCardSideImage(XmlNode sideNode, int sideCounter, XmlNode cardNode, string cardID, ItemsFile itemsFile, DeckFile deckFile, IOutputForm outputForm)
        {
            var cardSideTypeID = DetermineCardSideType(sideNode);
            string baseImagePath = GetBaseImagePathForCard(sideNode, cardNode, deckFile);
            var baseImage = Image.FromFile(baseImagePath);

            foreach (var item in itemsFile.Items) {
                string keyValue = itemsFile.GetKeyValueFromItemNode(item);
                string outputFileName = BuildOutputFileName(cardID, keyValue, sideCounter);
                string fullOutputFileName = Path.Combine(OutputDirectory, deckFile.MediaDirectoryName, outputFileName);

                switch (cardSideTypeID) {
                    case CardSideType.Image:
                        outputForm.WriteOutputMessage(string.Format("   - Generating image card side file \"{0}\"", outputFileName));
                        GenerateCardImageSideImage(sideNode, item, itemsFile, (Image) baseImage.Clone(), fullOutputFileName);
                        break;

                    case CardSideType.Text:
                        outputForm.WriteOutputMessage(string.Format("   - Generating text card side file \"{0}\"", outputFileName));
                        GenerateCardTextSideImage(sideNode, item, (Image) baseImage.Clone(), fullOutputFileName);
                        break;

                    case CardSideType.Templated:
                        string templateID = GeneratorXmlFile.GetAttributeValue(sideNode.FirstChild, "id");
                        outputFileName = BuildOutputFileName(templateID, keyValue, 0);
                        break;
                }

                if (cardNode.Name == "card") {
                    OutputDeckFile.Add(cardID, keyValue, outputFileName);
                }
            }

            baseImage.Dispose();
        }