diff --git a/src/Parse.js b/src/Parse.js
index c94f325..3aeb3fe 100644
--- a/src/Parse.js
+++ b/src/Parse.js
@@ -200,16 +200,56 @@ _html2canvas.Parse = function ( images, options ) {
   }
 
   function drawText(currentText, x, y, ctx){
-    if (trimText(currentText).length > 0) {
+    if (currentText !== null && trimText(currentText).length > 0) {
       ctx.fillText(currentText, x, y);
       numDraws+=1;
     }
   }
 
-  function renderText(el, textNode, stack) {
-    var ctx = stack.ctx,
+  function setTextVariables(ctx, el, text_decoration, color) {
+    var align = false,
+    font_style = getCSS(el, "fontStyle"),
+    bold = getCSS(el, "fontWeight"),
     family = getCSS(el, "fontFamily"),
     size = getCSS(el, "fontSize"),
+    font_variant = getCSS(el, "fontVariant");
+
+    switch(parseInt(bold, 10)){
+      case 401:
+        bold = "bold";
+        break;
+      case 400:
+        bold = "normal";
+        break;
+    }
+
+    ctx.setVariable("fillStyle", color);
+    ctx.setVariable("font", font_style+ " " + font_variant  + " " + bold + " " + size + " " + family);
+    ctx.setVariable("textAlign", (align) ? "right" : "left");
+    if (text_decoration !== "none"){
+      return fontMetrics(family, size);
+    }
+  }
+
+  function renderTextDecoration(text_decoration, bounds, metrics, color) {
+    switch(text_decoration) {
+      case "underline":
+        // Draws a line at the baseline of the font
+        // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size
+        renderRect(ctx, bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, color);
+        break;
+      case "overline":
+        renderRect(ctx, bounds.left, bounds.top, bounds.width, 1, color);
+        break;
+      case "line-through":
+        // TODO try and find exact position for line-through
+        renderRect(ctx, bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, color);
+        break;
+    }
+  }
+
+  function renderText(el, textNode, stack) {
+    var ctx = stack.ctx,
     color = getCSS(el, "color"),
     text_decoration = getCSS(el, "textDecoration"),
     text_align = getCSS(el, "textAlign"),
@@ -219,10 +259,6 @@ _html2canvas.Parse = function ( images, options ) {
     metrics,
     renderList,
     listLen,
-    bold = getCSS(el, "fontWeight"),
-    font_style = getCSS(el, "fontStyle"),
-    font_variant = getCSS(el, "fontVariant"),
-    align = false,
     newTextNode,
     textValue,
     textOffset = 0,
@@ -236,29 +272,13 @@ _html2canvas.Parse = function ( images, options ) {
     textNode.nodeValue = textTransform(textNode.nodeValue, getCSS(el, "textTransform"));
     text = trimText(textNode.nodeValue);
 
-    if (text.length>0){
-
-      if (text_decoration !== "none"){
-        metrics = fontMetrics(family, size);
-      }
+    if (text.length > 0){
 
       text_align = text_align.replace(["-webkit-auto"],["auto"]);
 
       renderList = (!options.letterRendering && /^(left|right|justify|auto)$/.test(text_align) && noLetterSpacing(letter_spacing)) ? textNode.nodeValue.split(/(\b| )/) : textNode.nodeValue.split("");
 
-      switch(parseInt(bold, 10)){
-        case 401:
-          bold = "bold";
-          break;
-        case 400:
-          bold = "normal";
-          break;
-      }
-
-      ctx.setVariable("fillStyle", color);
-      ctx.setVariable("font", font_style+ " " + font_variant  + " " + bold + " " + size + " " + family);
-      ctx.setVariable("textAlign", (align) ? "right" : "left");
-
+      metrics = setTextVariables(ctx, el, text_decoration, color);
       oldTextNode = textNode;
 
       for ( c=0, listLen = renderList.length; c < listLen; c+=1 ) {
@@ -311,24 +331,9 @@ _html2canvas.Parse = function ( images, options ) {
 
         }
 
-        if (textValue !== null){
-          drawText(textValue, bounds.left, bounds.bottom, ctx);
-        }
 
-        switch(text_decoration) {
-          case "underline":
-            // Draws a line at the baseline of the font
-            // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size
-            renderRect(ctx, bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, color);
-            break;
-          case "overline":
-            renderRect(ctx, bounds.left, bounds.top, bounds.width, 1, color);
-            break;
-          case "line-through":
-            // TODO try and find exact position for line-through
-            renderRect(ctx, bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, color);
-            break;
-        }
+        drawText(textValue, bounds.left, bounds.bottom, ctx);
+        renderTextDecoration(text_decoration, bounds, metrics, color);
 
         textOffset += renderList[c].length;
 
@@ -358,8 +363,6 @@ _html2canvas.Parse = function ( images, options ) {
     return bounds;
   }
 
-
-
   function elementIndex( el ) {
     var i = -1,
     count = 1,