about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-08-25 23:31:28 +0200
committerbptato <nincsnevem662@gmail.com>2024-08-25 23:34:46 +0200
commita7420c0420546adbbb602eab2dff4d2ca342481b (patch)
tree3a1717b0d728753beeb8da33ec4597f280574b8d /src
parentcd966a873ac7b6900fdca526b6db401e1548eed7 (diff)
downloadchawan-a7420c0420546adbbb602eab2dff4d2ca342481b.tar.gz
dom: toBlob fixes
* fix return type
* don't choke on empty bitmaps
* don't check for Cha-Image-Dimensions in encoder output (it was unused
  anyways)

Mainly so that I can spec the encoder without Cha-Image-Dimensions as an
output header - it's pointless redundancy.
Diffstat (limited to 'src')
-rw-r--r--src/html/dom.nim27
1 files changed, 7 insertions, 20 deletions
diff --git a/src/html/dom.nim b/src/html/dom.nim
index 707c35f5..22462db2 100644
--- a/src/html/dom.nim
+++ b/src/html/dom.nim
@@ -4465,7 +4465,7 @@ proc getContext*(jctx: JSContext; this: HTMLCanvasElement; contextId: string;
 # Note: the standard says quality should be converted in a strange way for
 # backwards compat, but I don't care.
 proc toBlob(ctx: JSContext; this: HTMLCanvasElement; callback: JSValue;
-    contentType = "image/png"; quality = none(float64)): JSValue {.jsfunc.} =
+    contentType = "image/png"; quality = none(float64)) {.jsfunc.} =
   if not contentType.startsWith("image/"):
     return
   let url = newURL("img-codec+" & contentType.after('/') & ":encode")
@@ -4473,7 +4473,8 @@ proc toBlob(ctx: JSContext; this: HTMLCanvasElement; callback: JSValue;
     return
   #TODO this is dumb (and slow)
   var s = newString(this.bitmap.px.len * 4)
-  copyMem(addr s[0], addr this.bitmap.px[0], this.bitmap.px.len * 4)
+  if s.len > 0:
+    copyMem(addr s[0], addr this.bitmap.px[0], s.len)
   let headers = newHeaders({
     "Cha-Image-Dimensions": $this.bitmap.width & 'x' & $this.bitmap.height
   })
@@ -4491,32 +4492,19 @@ proc toBlob(ctx: JSContext; this: HTMLCanvasElement; callback: JSValue;
   let callback = JS_DupValue(ctx, callback)
   let window = this.document.window
   let contentType = contentType.toLowerAscii()
-  window.loader.fetch(request).then(proc(res: JSResult[Response]):
-      EmptyPromise =
+  window.loader.fetch(request).then(proc(res: JSResult[Response]) =
     if res.isNone:
       if contentType != "image/png":
         # redo as PNG.
         # Note: this sounds dumb, and is dumb, but also standard mandated so
         # whatever.
-        discard ctx.toBlob(this, callback, "image/png", quality)
+        ctx.toBlob(this, callback, "image/png") # PNG doesn't understand quality
       else: # the png encoder doesn't work...
         window.console.error("missing/broken PNG encoder")
       JS_FreeValue(ctx, callback)
       return
-    let response = res.get
-    if "Cha-Image-Dimensions" notin response.headers.table:
-      window.console.error("Cha-Image-Dimensions missing")
-      JS_FreeValue(ctx, callback)
-      return
-    let dims = response.headers.table["Cha-Image-Dimensions"][0]
-    let width = parseUInt64(dims.until('x'), allowSign = false)
-    let height = parseUInt64(dims.after('x'), allowSign = false)
-    if width.isNone or height.isNone:
-      window.console.error("wrong Cha-Image-Dimensions")
-      JS_FreeValue(ctx, callback)
-      return
-    response.blob().then(proc(blob: JSResult[Blob]) =
-      let jsBlob = toJS(ctx, blob)
+    res.get.blob().then(proc(blob: JSResult[Blob]) =
+      let jsBlob = ctx.toJS(blob)
       let res = JS_Call(ctx, callback, JS_UNDEFINED, 1, jsBlob.toJSValueArray())
       if JS_IsException(res):
         window.console.error("Exception in canvas toBlob:",
@@ -4526,7 +4514,6 @@ proc toBlob(ctx: JSContext; this: HTMLCanvasElement; callback: JSValue;
       JS_FreeValue(ctx, callback)
     )
   )
-  return JS_UNDEFINED
 
 # https://w3c.github.io/DOM-Parsing/#dfn-fragment-parsing-algorithm
 proc fragmentParsingAlgorithm*(element: Element; s: string): DocumentFragment =