티스토리 뷰

카테고리 없음

Detecting ClearType

토르웰 2011. 10. 23. 16:57
/*
 * TypeHelpers version 1.0
 * Zoltan Hawryluk, Nov 24 2009.
 * @see http://www.useragentman.com/blog/2009/11/29/how-to-detect-font-smoothing-using-javascript/
 * 
 * Released under the MIT License. http://www.opensource.org/licenses/mit-license.php
 * 
 * Works for 
 *   - IE6+ (Windows), 
 *   - Firefox 3.5+ (Windows, Mac, Linux), 
 *   - Safari 4+ (Windows, Mac OS X), 
 *   - Chrome 3.0+ (Windows).
 * Opera 10.10 and under reports unknown support for font-smoothing.
 *
 * Modified by Christian Beier (www.beier-christian.eu) to detect the ClearType technology.
 * 
 * Required: jQuery 1.3.x
 * 
 * 
 * METHODS
 * -------
 * 
 * hasSmoothing() returns:
 *     true if font smoothing is enabled
 *     false if font smoothing isn't enabled
 *     null if it cannot detect if it's on or not.
 *     
 * addClasses() adds the following classes to the html tag:
 *     "hasFontSmoothing-true" if font smoothing is enabled
 *     "hasFontSmoothing-false" if it isn't
 *     "hasFontSmoothing-unknown" if it cannot detect it.
 *       
 */

var TypeHelpers = new function(){
  var me = this;
  
  me.hasSmoothing = function(){
    // IE has screen.fontSmoothingEnabled - sweet!      
    if (typeof(screen.fontSmoothingEnabled) != "undefined") {
      return screen.fontSmoothingEnabled;  
    } else {
   try {
      // Create a 35x35 Canvas block.
        var canvasNode = document.createElement("canvas");
        canvasNode.width = "35";
        canvasNode.height = "35"
        
        // We must put this node into the body, otherwise 
        // Safari Windows does not report correctly.
        canvasNode.style.display = "none";
        document.body.appendChild(canvasNode);
        var ctx = canvasNode.getContext("2d");
        
        // draw a black letter "O", 32px Arial.
        ctx.textBaseline = "top";
        ctx.font = "32px Arial";
        ctx.fillStyle = "black";
        ctx.strokeStyle = "black";
        
        ctx.fillText("O", 0, 0);
        
        // start at (8,1) and search the canvas from left to right,
        // top to bottom to see if we can find a non-black pixel.  If
        // so we return true.
        for (var j = 8; j <= 32; j++) {
          for (var i = 1; i <= 32; i++) {
            var imageData = ctx.getImageData(i, j, 1, 1).data
            var alpha = imageData[3];
                                    
            if (alpha != 255 && alpha != 0 && alpha > 180) {
              return true; // font-smoothing must be on.
              }
            }
 
          }
         
          // didn't find any non-black pixels - return false.
          return false;
        } 
        catch (ex) {
          // Something went wrong (for example, Opera cannot use the
          // canvas fillText() method.  Return null (unknown).
          return null;
        }
      }
    }
   
  $(document).ready(function() {
    var result = me.hasSmoothing();
    if (result == true) {
      $('html').addClass('hasFontSmoothing-true');
    } else if (result == false) {
      $('html').addClass('hasFontSmoothing-false');
    } else { // result == null
      $('html').addClass('hasFontSmoothing-unknown'); 
    }
  });
}

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크