         df.notify((originalW - sW) / (originalW - w))
         run()
 
-    df.promise()
+    runNative = ->
+      canvas = document.createElement('canvas')
+      canvas.width = w
+      canvas.height = h
+      cx = canvas.getContext('2d')
+      cx.imageSmoothingQuality = 'high'
+      cx.drawImage(img, 0, 0, w, h)
+      img.src = '//:0'            # for image
+      img.width = img.height = 1  # for canvas
+      df.resolve(canvas)
+
+    cx = document.createElement('canvas').getContext('2d')
+    if 'imageSmoothingQuality' of cx
+      runNative()
+    else
+      run()
+
+    df.promise()
+
 
   ns.drawFileToCanvas = (file, mW, mH, bg, maxSource) ->
     # in -> file

          df.notify(.2)
          isJPEG = @state() is 'resolved'

          op = ns.shrinkImage(e.target, settings)
          op.progress (progress) ->
            df.notify(.2 + progress * .6)
          op.fail(df.reject)
          op.done (canvas) ->
            # start = new Date()
            format = 'image/jpeg'
            quality = settings.quality or 0.8

    if img.width * step * img.height * step < settings.size
      return df.reject('not required')

    sW = originalW = img.width
    sH = img.height
    ratio = sW / sH
