[canvaskit] Fix incorrect malloc for text style shadows
Change-Id: Id0de9a3a557dc712d947a80f0bc7333122773870
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/416687
Reviewed-by: Kevin Lubick <kjlubick@google.com>
diff --git a/modules/canvaskit/paragraph.js b/modules/canvaskit/paragraph.js
index a741cdb..6dc7ad0 100644
--- a/modules/canvaskit/paragraph.js
+++ b/modules/canvaskit/paragraph.js
@@ -123,49 +123,9 @@
s['wordSpacing'] = s['wordSpacing'] || 0;
s['heightMultiplier'] = s['heightMultiplier'] || 0;
s['halfLeading'] = s['halfLeading'] || false;
- if (s['locale']) {
- var str = s['locale'];
- s['_localePtr'] = cacheOrCopyString(str);
- s['_localeLen'] = lengthBytesUTF8(str) + 1; // add 1 for the null terminator.
- } else {
- s['_localePtr'] = nullptr;
- s['_localeLen'] = 0;
- }
s['fontStyle'] = fontStyle(s['fontStyle']);
- if (s['shadows']) {
- var shadows = s['shadows'];
- var shadowColors = shadows.map(function(s) { return s['color'] || CanvasKit.BLACK; });
- var shadowBlurRadii = shadows.map(function(s) { return s['blurRadius'] || 0.0; });
- s['_shadowLen'] = shadows.length;
- var ptr = CanvasKit._malloc(shadows.length * 2, 'HEAPF32');
- var adjustedPtr = ptr / 4; // 4 bytes per float
- for (var i = 0; i < shadows.length; i++) {
- var offset = shadows[i]['offset'] || [0, 0];
- CanvasKit.HEAPF32[adjustedPtr] = offset[0];
- CanvasKit.HEAPF32[adjustedPtr + 1] = offset[1];
- adjustedPtr += 2;
- }
- s['_shadowColorsPtr'] = copyFlexibleColorArray(shadowColors).colorPtr;
- s['_shadowOffsetsPtr'] = ptr;
- s['_shadowBlurRadiiPtr'] = copy1dArray(shadowBlurRadii, 'HEAPF32');
- } else {
- s['_shadowLen'] = 0;
- s['_shadowColorsPtr'] = nullptr;
- s['_shadowOffsetsPtr'] = nullptr;
- s['_shadowBlurRadiiPtr'] = nullptr;
- }
- if (s['fontFeatures']) {
- var fontFeatures = s['fontFeatures'];
- var fontFeatureNames = fontFeatures.map(function(s) { return s['name']; });
- var fontFeatureValues = fontFeatures.map(function(s) { return s['value']; });
- s['_fontFeatureLen'] = fontFeatures.length;
- s['_fontFeatureNamesPtr'] = naiveCopyStrArray(fontFeatureNames);
- s['_fontFeatureValuesPtr'] = copy1dArray(fontFeatureValues, 'HEAPU32');
- } else {
- s['_fontFeatureLen'] = 0;
- s['_fontFeatureNamesPtr'] = nullptr;
- s['_fontFeatureValuesPtr'] = nullptr;
- }
+
+ // Properties which need to be Malloc'ed are set in `copyArrays`.
return s;
};
@@ -240,12 +200,64 @@
textStyle['_fontFamiliesLen'] = 0;
Debug('no font families provided, text may draw wrong or not at all');
}
+
+ if (textStyle['locale']) {
+ var str = textStyle['locale'];
+ textStyle['_localePtr'] = cacheOrCopyString(str);
+ textStyle['_localeLen'] = lengthBytesUTF8(str) + 1; // add 1 for the null terminator.
+ } else {
+ textStyle['_localePtr'] = nullptr;
+ textStyle['_localeLen'] = 0;
+ }
+
+ if (Array.isArray(textStyle['shadows']) && textStyle['shadows'].length) {
+ var shadows = textStyle['shadows'];
+ var shadowColors = shadows.map(function (s) { return s['color'] || CanvasKit.BLACK; });
+ var shadowBlurRadii = shadows.map(function (s) { return s['blurRadius'] || 0.0; });
+ textStyle['_shadowLen'] = shadows.length;
+ // 2 floats per point, 4 bytes per float
+ var ptr = CanvasKit._malloc(shadows.length * 2 * 4);
+ var adjustedPtr = ptr / 4; // 4 bytes per float
+ for (var i = 0; i < shadows.length; i++) {
+ var offset = shadows[i]['offset'] || [0, 0];
+ CanvasKit.HEAPF32[adjustedPtr] = offset[0];
+ CanvasKit.HEAPF32[adjustedPtr + 1] = offset[1];
+ adjustedPtr += 2;
+ }
+ textStyle['_shadowColorsPtr'] = copyFlexibleColorArray(shadowColors).colorPtr;
+ textStyle['_shadowOffsetsPtr'] = ptr;
+ textStyle['_shadowBlurRadiiPtr'] = copy1dArray(shadowBlurRadii, 'HEAPF32');
+ } else {
+ textStyle['_shadowLen'] = 0;
+ textStyle['_shadowColorsPtr'] = nullptr;
+ textStyle['_shadowOffsetsPtr'] = nullptr;
+ textStyle['_shadowBlurRadiiPtr'] = nullptr;
+ }
+
+ if (Array.isArray(textStyle['fontFeatures']) && textStyle['fontFeatures'].length) {
+ var fontFeatures = textStyle['fontFeatures'];
+ var fontFeatureNames = fontFeatures.map(function (s) { return s['name']; });
+ var fontFeatureValues = fontFeatures.map(function (s) { return s['value']; });
+ textStyle['_fontFeatureLen'] = fontFeatures.length;
+ textStyle['_fontFeatureNamesPtr'] = naiveCopyStrArray(fontFeatureNames);
+ textStyle['_fontFeatureValuesPtr'] = copy1dArray(fontFeatureValues, 'HEAPU32');
+ } else {
+ textStyle['_fontFeatureLen'] = 0;
+ textStyle['_fontFeatureNamesPtr'] = nullptr;
+ textStyle['_fontFeatureValuesPtr'] = nullptr;
+ }
}
function freeArrays(textStyle) {
// The font family strings will get copied to a vector on the C++ side, which is owned by
// the text style.
CanvasKit._free(textStyle['_fontFamiliesPtr']);
+ CanvasKit._free(textStyle['_localePtr']);
+ CanvasKit._free(textStyle['_shadowColorsPtr']);
+ CanvasKit._free(textStyle['_shadowOffsetsPtr']);
+ CanvasKit._free(textStyle['_shadowBlurRadiiPtr']);
+ CanvasKit._free(textStyle['_fontFeatureNamesPtr']);
+ CanvasKit._free(textStyle['_fontFeatureValuesPtr']);
}
CanvasKit.ParagraphBuilder.Make = function(paragraphStyle, fontManager) {