Patch title: Release 90 bulk changes
Abstract:
File: /graphic/browser/tag/image.pli
Key:
    Removed line
    Added line
module "common.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "prototype.pli"
module "/pliant/language/data/cache.pli"
module "/pliant/language/compiler/type/inherit.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/graphic/image/pixmap.pli"
module "/pliant/graphic/image/resampling.pli"
module "/pliant/graphic/image/convert.pli"
module "/pliant/graphic/filter/io.pli"
module "/pliant/graphic/color/gamut.pli"
module "/pliant/graphic/browser/xml/helper.pli"


type D2Image
  inherit D2Box
type BrowserImageCache
  inherit CachePrototype
  field Link:ImagePrototype image
  field Str url

D2Box maybe D2Image

method i configure attribute value options
  oarg_rw D2Image i ; arg Str attribute value options
  if attribute="src"
    i image :> new ImagePixmap
    i url := url_concat (options option "url" Str) value
    var ExtendedStatus status := i:image load i:url ""
    if status=failure
      console "failed to load image " i:url ": " status:message eol
      i image :> null map ImagePrototype

method i position c
  oarg_rw D2Image i ; arg_rw D2Context c
  i position_undefined c
  var Pointer:ImagePrototype image :> i image
  if exists:image
    i x0 := 0
    i y0 := (c:line_y0-c:line_y)+((c:y0-c:line_y0)-(image:y1-image:y0))/2
    i x1 := image:x1-image:x0
    i y1 := i:y0+image:y1-image:y0
    c addtoline i

method i draw img c
  oarg_rw D2Image i ; oarg_rw ImagePrototype img ; arg_rw D2Context c
  if not (exists i:image)
    return
  var Int jx0 := img index_x i:x0
  var Int jy0 := img index_y i:y0
  var Int jx1 := img index_x i:x1
  var Int jy1 := img index_y i:y1
  var Int ix0 := max jx0 0
  var Int iy0 := max jy0 0
  var Int ix1 := min jx1 img:size_x
  var Int iy1 := min jy1 img:size_y
  if ix1>ix0 and iy1>iy0
    var Link:ImageResampling rs :> new ImageResampling
    rs bind i:image i:image:x0 i:image:y0 i:image:x1 i:image:y1 jx1-jx0 jy1-jy0
    var Link:ImageConvert conv :> new ImageConvert
    conv bind rs img:gamut ""
    var Address buf := memory_allocate conv:line_size null
    if rs:gamut:transparency=1
      var Address tbuf := memory_allocate rs:line_size null
      for (var Int iy) iy0 iy1-1
        conv read ix0-jx0 iy-jy0 ix1-ix0 buf
        rs read ix0-jx0 iy-jy0 ix1-ix0 tbuf
        for (var Int ix) ix0 ix1-1
          if ((tbuf translate Byte (ix-ix0)*rs:pixel_size+rs:gamut:dimension) map uInt8)>128
            img write ix iy 1 (buf translate Byte (ix-ix0)*conv:pixel_size)
      memory_free tbuf
method c browser_image path tree -> image
  arg XmlContext c ; arg Str path ; arg_rw XmlTree tree ; oarg_RW ImagePrototype image
  var Str url := c full_url path
  var Link:BrowserImageCache ca
  if (cache_open "/pliant/browser/image/"+url BrowserImageCache ((addressof Link:BrowserImageCache ca) map Link:CachePrototype))
    ca image :> new ImagePixmap
    (var Stream s) open url "no_http_encode" in+safe
    var ExtendedStatus status := failure ""
    if s=success and ((s safe_query "mime") parse "image/" any:(var Str format)) and { status := ca:image load s "filter "+(string "."+format) ; status=success }
      cache_ready ((addressof Link:BrowserImageCache ca) map Link:CachePrototype)
      image :> ca image
    else
      for (var Int iy) iy0 iy1-1
        conv read ix0-jx0 iy-jy0 ix1-ix0 buf
        img write ix0 iy ix1-ix0 buf
    memory_free buf
      console "failed to load image " url " : " status:message eol
      cache_cancel ((addressof Link:BrowserImageCache ca) map Link:CachePrototype)
      image :> null map ImagePrototype
  else
    image :> ca image

method i event e
  oarg_rw D2Image i ; arg_rw D2Event e
  if e:status:mouse_button_1_pressed
    if e:potencial_url<>"" and i:x0=defined and e:x>=i:x0 and e:x<=i:x1 and e:y>=i:y0 and e:y<=i:y1
      e url := e potencial_url
tag_position img
  var Link:ImagePrototype img :> browser_image (query "img" "src") tree
  if exists:img
    # x0 := img x0 ; y0 := img y0 ; x1 := img x1 ; y1 := img y1
    x0 := 0 ; y0 := 0 ; x1 := img:size_x/72*25.4 ; y1 := img:size_y/72*25.4
    addtoline tree

html_tags insert "img" true addressof:D2Image
tag_draw img
  if x0=defined
    var Link:ImagePrototype img :> browser_image (query "img" "src") tree
    if exists:img
      # image img (transform x0-img:x0 y0-img:y0 1 1 0 0)
      image img (transform x0-img:x0 y0-img:y0 img:size_x/72*25.4/(img:x1-img:x0) img:size_y/72*25.4/(img:y1-img:y0) 0 0)