| 1159 | FUNCTION tintSFSymbol |
| 1160 | ------------------------------------------------------------------*/ |
| 1161 | async function tintSFSymbol(image, color) { |
| 1162 | let html = ` |
| 1163 | <img id="image" src="data:image/png;base64,${Data.fromPNG(image).toBase64String()}" /> |
| 1164 | <canvas id="canvas"></canvas> |
| 1165 | `; |
| 1166 | |
| 1167 | let js = ` |
| 1168 | let img = document.getElementById("image"); |
| 1169 | let canvas = document.getElementById("canvas"); |
| 1170 | let color = 0x${color.hex}; |
| 1171 | canvas.width = img.width; |
| 1172 | canvas.height = img.height; |
| 1173 | let ctx = canvas.getContext("2d"); |
| 1174 | ctx.drawImage(img, 0, 0); |
| 1175 | let imgData = ctx.getImageData(0, 0, img.width, img.height); |
| 1176 | // ordered in RGBA format |
| 1177 | let data = imgData.data; |
| 1178 | for (let i = 0; i < data.length; i++) { |
| 1179 | // skip alpha channel |
| 1180 | if (i % 4 === 3) continue; |
| 1181 | // bit shift the color value to get the correct channel |
| 1182 | data[i] = (color >> (2 - i % 4) * 8) & 0xFF |
| 1183 | } |
| 1184 | ctx.putImageData(imgData, 0, 0); |
| 1185 | canvas.toDataURL("image/png").replace(/^data:image\\/png;base64,/, ""); |
| 1186 | `; |
| 1187 | let wv = new WebView(); |
| 1188 | await wv.loadHTML(html); |
| 1189 | let base64 = await wv.evaluateJavaScript(js); |
| 1190 | const tintedImage = Image.fromData(Data.fromBase64String(base64)); |
| 1191 | |
| 1192 | // Above function expands the image based on Device scale, resize it to original image size |
| 1193 | const symbolCanvas=new DrawContext(); |
| 1194 | symbolCanvas.opaque = false; |
| 1195 | symbolCanvas.size = image.size; |
| 1196 | symbolCanvas.drawImageInRect(tintedImage, new Rect(0,0,image.size.width,image.size.height)); |
| 1197 | return symbolCanvas.getImage(); |
| 1198 | } |
| 1199 | /*------------------------------------------------------------------ |
| 1200 | FUNCTION getTextWidth |
| 1201 | ------------------------------------------------------------------*/ |