import pixie, chroma, vmath, fidget/opengl/perf, pixie/fileformats/bmp

proc inPlaceDraw*(destImage: Image, srcImage: Image, mat: Mat3, blendMode = bmNormal) =
  ## Draws one image onto another using matrix with color blending.
  for y in 0 ..< destImage.width:
    for x in 0 ..< destImage.height:
      let srcPos = mat * vec2(x.float32, y.float32)
      let destRgba = destImage.getRgbaUnsafe(x, y)
      var rgba = destRgba
      var srcRgba = rgba(0, 0, 0, 0)
      if srcImage.inside(srcPos.x.floor.int, srcPos.y.floor.int):
        srcRgba = srcImage.getRgbaSmooth(srcPos.x - 0.5, srcPos.y - 0.5)
      if blendMode.hasEffect(srcRgba):
        rgba = blendMode.mix(destRgba, srcRgba)
      destImage.setRgbaUnsafe(x, y, rgba)

proc inPlaceDraw*(destImage: Image, srcImage: Image, pos = vec2(0, 0), blendMode = bmNormal) =
  destImage.inPlaceDraw(srcImage, translate(-pos), blendMode)

block:
  var a = newImage(100, 100)
  a.fill(rgba(255, 0, 0, 255))
  var b = newImage(100, 100)
  b.fill(rgba(0, 255, 0, 255))
  a.inPlaceDraw(b, pos=vec2(25, 25))
  writeFile("tests/images/inPlaceDraw.bmp", a.encodeBmp())

block:
  var a = newImage(100, 100)
  a.fill(rgba(255, 0, 0, 255))
  var b = newImage(100, 100)
  b.fill(rgba(0, 255, 0, 255))
  var c = a.drawFast3(b, translate(vec2(25, 25)), bmNormal)
  writeFile("tests/images/copyDraw.bmp", c.encodeBmp())

timeIt "inPlaceDraw":
  var tmp = 0
  for i in 0 ..< 1000:
    var a = newImage(100, 100)
    a.fill(rgba(255, 0, 0, 255))
    var b = newImage(100, 100)
    b.fill(rgba(0, 255, 0, 255))
    a.inPlaceDraw(b, pos=vec2(25, 25))
    tmp += a.width * a.height
  echo tmp

timeIt "copyDraw":
  var tmp = 0
  for i in 0 ..< 1000:
    var a = newImage(100, 100)
    a.fill(rgba(255, 0, 0, 255))
    var b = newImage(100, 100)
    b.fill(rgba(0, 255, 0, 255))
    var c = a.drawFast3(b, translate(vec2(25, 25)), bmNormal)
    tmp += c.width * c.height
  echo tmp