diff options
author | bptato <nincsnevem662@gmail.com> | 2024-08-25 23:31:28 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-08-25 23:34:46 +0200 |
commit | a7420c0420546adbbb602eab2dff4d2ca342481b (patch) | |
tree | 3a1717b0d728753beeb8da33ec4597f280574b8d /src | |
parent | cd966a873ac7b6900fdca526b6db401e1548eed7 (diff) | |
download | chawan-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.nim | 27 |
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 = |