- Jump To … +
  analyze.coffee autoload.coffee blender.coffee calculate.coffee caman.coffee convert.coffee event.coffee filter.coffee io.coffee layer.coffee logger.coffee module.coffee pixel.coffee plugin.coffee renderer.coffee store.coffee util.coffee blenders.coffee filters.coffee size.coffee blur.coffee camera.coffee compoundBlur.coffee edges.coffee posterize.coffee presets.coffee rotate.coffee stackBlur.coffee threshold.coffee

- # io.coffee

- ¶

  Various I/O based operations

      class Caman.IO

- ¶

  Used for parsing image URLs for domain names.

        @domainRegex: /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/

- ¶

  Is the given URL remote? If a cross-origin setting is set, we assume you have CORS properly configured.

  @param [DOMObject] img The image to check. @return [Boolean]

        @isRemote: (img) ->
          return false unless img?
          return false if @corsEnabled(img)
          return @isURLRemote img.src

- ¶

  Given an image, we check to see if a CORS policy has been defined. @param [DOMObject] img The image to check. @return [Boolean]

        @corsEnabled: (img) ->
          img.crossOrigin? and img.crossOrigin.toLowerCase() in ['anonymous', 'use-credentials']

- ¶

  Does the given URL exist on a different domain than the current one? This is done by comparing the URL to `document.domain`. @param [String] url The URL to check. @return [Boolean]

        @isURLRemote: (url) ->
          matches = url.match @domainRegex
          return if matches then matches[1] isnt document.domain else false

- ¶

  Checks to see if the URL is remote, and if there is a proxy defined, it @param [String] src The URL to check. @return [String] The proxy URL if the image is remote. Nothing otherwise.

        @remoteCheck: (src) ->
          if @isURLRemote src
            if not Caman.remoteProxy.length
              Log.info "Attempting to load a remote image without a configured proxy. URL: #{src}"
              return
            else
              if Caman.isURLRemote Caman.remoteProxy
                Log.info "Cannot use a remote proxy for loading images."
                return

              return @proxyUrl(src)

- ¶

  Given a URL, get the proxy URL for it. @param [String] src The URL to proxy. @return [String] The proxy URL.

        @proxyUrl: (src) ->
          "#{Caman.remoteProxy}?#{Caman.proxyParam}=#{encodeURIComponent(src)}"

- ¶

  Shortcut for using one of the bundled proxies. @param [String] lang String identifier for the proxy script language. @return [String] A proxy URL.

        @useProxy: (lang) ->
          langToExt =
            ruby: 'rb'
            python: 'py'
            perl: 'pl'
            javascript: 'js'

          lang = lang.toLowerCase()
          lang = langToExt[lang] if langToExt[lang]?
          "proxies/caman_proxy.#{lang}"

- ¶

  Grabs the canvas data, encodes it to Base64, then sets the browser location to the encoded data so that the user will be prompted to download it. If we're in NodeJS, then we can save the image to disk. @see Caman

      Caman::save = ->
          if exports?
            @nodeSave.apply @, arguments
          else
            @browserSave.apply @, arguments

      Caman::browserSave = (type = "png") ->
          type = type.toLowerCase()

- ¶

  Force download (its a bit hackish)

          image = @toBase64(type).replace "image/#{type}", "image/octet-stream"
          document.location.href = image

      Caman::nodeSave = (file, overwrite = true) ->
          try
            stats = fs.statSync file
            return false if stats.isFile() and not overwrite
          catch e
            Log.debug "Creating output file #{file}"

          fs.writeFile file, @canvas.toBuffer(), ->
            Log.debug "Finished writing to #{file}"

- ¶

  Takes the current canvas data, converts it to Base64, then sets it as the source of a new Image object and returns it.

      Caman::toImage = (type) ->
          img = document.createElement 'img'
          img.src = @toBase64 type
          img.width = @dimensions.width
          img.height = @dimensions.height

          if window.devicePixelRatio
            img.width /= window.devicePixelRatio
            img.height /= window.devicePixelRatio

          return img

- ¶

  Base64 encodes the current canvas

      Caman::toBase64 = (type = "png") ->
          type = type.toLowerCase()
          return @canvas.toDataURL "image/#{type}"

      IO = Caman.IO