@carto/kepler.gl 0.0.65-alpha.labels.9 → 0.0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,281 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.PointLabelLayer = void 0;
9
-
10
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
-
12
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
-
14
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
19
-
20
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
-
22
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
-
24
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
-
26
- var _core = require("@deck.gl/core");
27
-
28
- var _layers = require("@deck.gl/layers");
29
-
30
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
31
-
32
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
33
-
34
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
35
-
36
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
37
-
38
- // TODO remove prior to release
39
- var SHOW_TEXT_BORDER = false;
40
- var LEFT = 0,
41
- TOP = 1,
42
- RIGHT = 2,
43
- BOTTOM = 3;
44
-
45
- var EnhancedTextBackgroundLayer = /*#__PURE__*/function (_TextBackgroundLayer) {
46
- (0, _inherits2["default"])(EnhancedTextBackgroundLayer, _TextBackgroundLayer);
47
-
48
- var _super = _createSuper(EnhancedTextBackgroundLayer);
49
-
50
- function EnhancedTextBackgroundLayer() {
51
- (0, _classCallCheck2["default"])(this, EnhancedTextBackgroundLayer);
52
- return _super.apply(this, arguments);
53
- }
54
-
55
- (0, _createClass2["default"])(EnhancedTextBackgroundLayer, [{
56
- key: "getShaders",
57
- value: function getShaders() {
58
- var shaders = (0, _get2["default"])((0, _getPrototypeOf2["default"])(EnhancedTextBackgroundLayer.prototype), "getShaders", this).call(this);
59
- var vs = shaders.vs; // Modify shader so that the padding is offset by the pixel offset to ensure the padding
60
- // always captures the anchor point. As padding is uniform we cannot pass it a per-label value
61
-
62
- vs = vs.replaceAll('padding.', '_padding.');
63
- vs = vs.replace('void main(void) {', 'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);');
64
- return _objectSpread(_objectSpread({}, shaders), {}, {
65
- vs: vs
66
- });
67
- }
68
- }]);
69
- return EnhancedTextBackgroundLayer;
70
- }(_layers._TextBackgroundLayer); // TextLayer which includes modified text-background-layer-vertex shader and only renders the
71
- // primary background layer in the collision pass
72
-
73
-
74
- var EnhancedTextLayer = /*#__PURE__*/function (_TextLayer) {
75
- (0, _inherits2["default"])(EnhancedTextLayer, _TextLayer);
76
-
77
- var _super2 = _createSuper(EnhancedTextLayer);
78
-
79
- function EnhancedTextLayer() {
80
- (0, _classCallCheck2["default"])(this, EnhancedTextLayer);
81
- return _super2.apply(this, arguments);
82
- }
83
-
84
- (0, _createClass2["default"])(EnhancedTextLayer, [{
85
- key: "filterSubLayer",
86
- value: function filterSubLayer(_ref) {
87
- var layer = _ref.layer,
88
- renderPass = _ref.renderPass;
89
- var background = layer.id.includes('primary-background');
90
-
91
- if (renderPass === 'collision') {
92
- return background; // Only draw primary background layer in collision pass
93
- } else {
94
- return !background || SHOW_TEXT_BORDER && this.props.getBorderWidth; // Do not draw background layer in other passes
95
- }
96
- }
97
- }]);
98
- return EnhancedTextLayer;
99
- }(_layers.TextLayer);
100
-
101
- var defaultProps = _objectSpread(_objectSpread({}, _layers.TextLayer.defaultProps), {}, {
102
- getRadius: {
103
- type: 'accessor',
104
- value: 1
105
- },
106
- radiusScale: {
107
- type: 'number',
108
- min: 0,
109
- value: 1
110
- }
111
- });
112
-
113
- var PointLabelLayer = /*#__PURE__*/function (_CompositeLayer) {
114
- (0, _inherits2["default"])(PointLabelLayer, _CompositeLayer);
115
-
116
- var _super3 = _createSuper(PointLabelLayer);
117
-
118
- function PointLabelLayer() {
119
- (0, _classCallCheck2["default"])(this, PointLabelLayer);
120
- return _super3.apply(this, arguments);
121
- }
122
-
123
- (0, _createClass2["default"])(PointLabelLayer, [{
124
- key: "calculatePixelOffset",
125
- value: function calculatePixelOffset(secondary) {
126
- var _this$props = this.props,
127
- anchor = _this$props.getTextAnchor,
128
- alignment = _this$props.getAlignmentBaseline,
129
- getRadius = _this$props.getRadius,
130
- getSecondaryText = _this$props.getSecondaryText,
131
- radiusScale = _this$props.radiusScale,
132
- secondarySizeScale = _this$props.secondarySizeScale,
133
- sizeScale = _this$props.sizeScale;
134
- var xMult = anchor === 'middle' ? 0 : anchor === 'start' ? 1 : -1;
135
- var yMult = alignment === 'center' ? 0 : alignment === 'bottom' ? 1 : -1; // Padding based on font size (font size / 4)
136
-
137
- var xPadding = sizeScale / 4;
138
- var yPadding = sizeScale * (1 + 1 / 4); // Place secondary label under main label (secondary label always 'top' baseline aligned)
139
-
140
- var secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
141
- var yOffset = secondary ? secondaryOffset : 0; // Special case, position relative to secondary label
142
-
143
- if (anchor === 'middle' && alignment === 'top' && getSecondaryText) {
144
- yOffset -= secondaryOffset;
145
- yOffset -= secondarySizeScale;
146
- yOffset += sizeScale;
147
- } // Padding based on point radius (radius/ 4)
148
-
149
-
150
- var radiusPadding = 1 + 1 / 4;
151
- return typeof getRadius === 'function' ? function (d, info) {
152
- var r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
153
- return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
154
- } : [xMult * (getRadius * radiusScale * radiusPadding + xPadding), yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset];
155
- }
156
- }, {
157
- key: "calculateBackgroundPadding",
158
- value: function calculateBackgroundPadding() {
159
- var _this$props2 = this.props,
160
- anchor = _this$props2.getTextAnchor,
161
- alignment = _this$props2.getAlignmentBaseline,
162
- sizeScale = _this$props2.sizeScale; // Heuristics to avoid label overlap (should we base this on the text length?)
163
-
164
- var paddingX = 12 * sizeScale;
165
- var paddingY = 3 * sizeScale;
166
- var backgroundPadding = [0, 0, 0, 0];
167
-
168
- if (alignment === 'top') {
169
- backgroundPadding[TOP] = paddingY;
170
- } else if (alignment === 'bottom') {
171
- backgroundPadding[BOTTOM] = paddingY;
172
- } else {
173
- backgroundPadding[TOP] = 0.5 * paddingY;
174
- backgroundPadding[BOTTOM] = 0.5 * paddingY;
175
- }
176
-
177
- if (anchor === 'start') {
178
- backgroundPadding[LEFT] = paddingX;
179
- } else if (anchor === 'end') {
180
- backgroundPadding[RIGHT] = paddingX;
181
- } else {
182
- backgroundPadding[LEFT] = 0.5 * paddingX;
183
- backgroundPadding[RIGHT] = 0.5 * paddingX;
184
- }
185
-
186
- return backgroundPadding;
187
- }
188
- }, {
189
- key: "renderTextLayer",
190
- value: function renderTextLayer(id, _ref2) {
191
- var updateTriggersOverride = _ref2.updateTriggers,
192
- props = (0, _objectWithoutProperties2["default"])(_ref2, ["updateTriggers"]);
193
- var _this$props3 = this.props,
194
- data = _this$props3.data,
195
- characterSet = _this$props3.characterSet,
196
- fontFamily = _this$props3.fontFamily,
197
- fontSettings = _this$props3.fontSettings,
198
- fontWeight = _this$props3.fontWeight,
199
- outlineColor = _this$props3.outlineColor,
200
- outlineWidth = _this$props3.outlineWidth,
201
- sizeScale = _this$props3.sizeScale,
202
- radiusScale = _this$props3.radiusScale,
203
- getAlignmentBaseline = _this$props3.getAlignmentBaseline,
204
- getColor = _this$props3.getColor,
205
- getPosition = _this$props3.getPosition,
206
- getTextAnchor = _this$props3.getTextAnchor,
207
- updateTriggers = _this$props3.updateTriggers;
208
- return new EnhancedTextLayer(this.getSubLayerProps({
209
- id: id,
210
- data: data,
211
- characterSet: characterSet,
212
- fontFamily: fontFamily,
213
- fontSettings: fontSettings,
214
- fontWeight: fontWeight,
215
- outlineColor: outlineColor,
216
- outlineWidth: outlineWidth,
217
- sizeScale: sizeScale,
218
- getAlignmentBaseline: getAlignmentBaseline,
219
- getColor: getColor,
220
- getPosition: getPosition,
221
- getTextAnchor: getTextAnchor,
222
- updateTriggers: _objectSpread(_objectSpread(_objectSpread({}, updateTriggers), updateTriggersOverride), {}, {
223
- getPixelOffset: [updateTriggers.getRadius, updateTriggers.getTextAnchor, updateTriggers.getAlignmentBaseline, radiusScale, sizeScale]
224
- })
225
- }), {
226
- getSize: 1,
227
- _subLayerProps: {
228
- background: {
229
- type: EnhancedTextBackgroundLayer
230
- }
231
- }
232
- }, // DEBUG
233
- SHOW_TEXT_BORDER ? {
234
- getBackgroundColor: [0, 0, 0, 0],
235
- getBorderColor: [255, 0, 0, 80],
236
- getBorderWidth: 1
237
- } : {}, props);
238
- }
239
- }, {
240
- key: "renderLayers",
241
- value: function renderLayers() {
242
- var _this$props4 = this.props,
243
- getText = _this$props4.getText,
244
- getSecondaryColor = _this$props4.getSecondaryColor,
245
- getSecondaryText = _this$props4.getSecondaryText,
246
- secondaryOutlineColor = _this$props4.secondaryOutlineColor,
247
- secondarySizeScale = _this$props4.secondarySizeScale,
248
- updateTriggers = _this$props4.updateTriggers;
249
- var getPixelOffset = this.calculatePixelOffset(false);
250
- var backgroundPadding = this.calculateBackgroundPadding();
251
- var out = [// Text doesn't update via updateTrigger for some reason
252
- this.renderTextLayer("".concat(updateTriggers.getText, "-primary"), {
253
- backgroundPadding: backgroundPadding,
254
- getText: getText,
255
- getPixelOffset: getPixelOffset,
256
- background: true // Only use background for primary label for faster collisions
257
-
258
- }), getSecondaryText && this.renderTextLayer("".concat(updateTriggers.getSecondaryText, "-secondary"), _objectSpread(_objectSpread(_objectSpread({
259
- getText: getSecondaryText,
260
- getPixelOffset: this.calculatePixelOffset(true),
261
- getAlignmentBaseline: 'top',
262
- updateTriggers: {
263
- getText: updateTriggers.getSecondaryText
264
- }
265
- }, getSecondaryColor && {
266
- getColor: getSecondaryColor
267
- }), secondarySizeScale && {
268
- sizeScale: secondarySizeScale
269
- }), secondaryOutlineColor && {
270
- outlineColor: secondaryOutlineColor
271
- }))];
272
- return out;
273
- }
274
- }]);
275
- return PointLabelLayer;
276
- }(_core.CompositeLayer);
277
-
278
- exports.PointLabelLayer = PointLabelLayer;
279
- (0, _defineProperty2["default"])(PointLabelLayer, "layerName", 'PointLabelLayer');
280
- (0, _defineProperty2["default"])(PointLabelLayer, "defaultProps", defaultProps);
281
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL3BvaW50LWxhYmVsLWxheWVyL3BvaW50LWxhYmVsLWxheWVyLmpzIl0sIm5hbWVzIjpbIlNIT1dfVEVYVF9CT1JERVIiLCJMRUZUIiwiVE9QIiwiUklHSFQiLCJCT1RUT00iLCJFbmhhbmNlZFRleHRCYWNrZ3JvdW5kTGF5ZXIiLCJzaGFkZXJzIiwidnMiLCJyZXBsYWNlQWxsIiwicmVwbGFjZSIsIlRleHRCYWNrZ3JvdW5kTGF5ZXIiLCJFbmhhbmNlZFRleHRMYXllciIsImxheWVyIiwicmVuZGVyUGFzcyIsImJhY2tncm91bmQiLCJpZCIsImluY2x1ZGVzIiwicHJvcHMiLCJnZXRCb3JkZXJXaWR0aCIsIlRleHRMYXllciIsImRlZmF1bHRQcm9wcyIsImdldFJhZGl1cyIsInR5cGUiLCJ2YWx1ZSIsInJhZGl1c1NjYWxlIiwibWluIiwiUG9pbnRMYWJlbExheWVyIiwic2Vjb25kYXJ5IiwiYW5jaG9yIiwiZ2V0VGV4dEFuY2hvciIsImFsaWdubWVudCIsImdldEFsaWdubWVudEJhc2VsaW5lIiwiZ2V0U2Vjb25kYXJ5VGV4dCIsInNlY29uZGFyeVNpemVTY2FsZSIsInNpemVTY2FsZSIsInhNdWx0IiwieU11bHQiLCJ4UGFkZGluZyIsInlQYWRkaW5nIiwic2Vjb25kYXJ5T2Zmc2V0IiwieU9mZnNldCIsInJhZGl1c1BhZGRpbmciLCJkIiwiaW5mbyIsInIiLCJwYWRkaW5nWCIsInBhZGRpbmdZIiwiYmFja2dyb3VuZFBhZGRpbmciLCJ1cGRhdGVUcmlnZ2Vyc092ZXJyaWRlIiwidXBkYXRlVHJpZ2dlcnMiLCJkYXRhIiwiY2hhcmFjdGVyU2V0IiwiZm9udEZhbWlseSIsImZvbnRTZXR0aW5ncyIsImZvbnRXZWlnaHQiLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lV2lkdGgiLCJnZXRDb2xvciIsImdldFBvc2l0aW9uIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsImdldFBpeGVsT2Zmc2V0IiwiZ2V0U2l6ZSIsIl9zdWJMYXllclByb3BzIiwiZ2V0QmFja2dyb3VuZENvbG9yIiwiZ2V0Qm9yZGVyQ29sb3IiLCJnZXRUZXh0IiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlPdXRsaW5lQ29sb3IiLCJjYWxjdWxhdGVQaXhlbE9mZnNldCIsImNhbGN1bGF0ZUJhY2tncm91bmRQYWRkaW5nIiwib3V0IiwicmVuZGVyVGV4dExheWVyIiwiQ29tcG9zaXRlTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTUEsZ0JBQWdCLEdBQUcsS0FBekI7SUFFT0MsSSxHQUE2QixDO0lBQXZCQyxHLEdBQTBCLEM7SUFBckJDLEssR0FBd0IsQztJQUFqQkMsTSxHQUFvQixDOztJQUV2Q0MsMkI7Ozs7Ozs7Ozs7OztXQUNKLHNCQUFhO0FBQ1gsVUFBTUMsT0FBTyxnSUFBYjtBQUNBLFVBQUlDLEVBQUUsR0FBR0QsT0FBTyxDQUFDQyxFQUFqQixDQUZXLENBSVg7QUFDQTs7QUFDQUEsTUFBQUEsRUFBRSxHQUFHQSxFQUFFLENBQUNDLFVBQUgsQ0FBYyxVQUFkLEVBQTBCLFdBQTFCLENBQUw7QUFDQUQsTUFBQUEsRUFBRSxHQUFHQSxFQUFFLENBQUNFLE9BQUgsQ0FDSCxtQkFERyxFQUVILHdHQUZHLENBQUw7QUFLQSw2Q0FBV0gsT0FBWDtBQUFvQkMsUUFBQUEsRUFBRSxFQUFGQTtBQUFwQjtBQUNEOzs7RUFkdUNHLDRCLEdBaUIxQztBQUNBOzs7SUFDTUMsaUI7Ozs7Ozs7Ozs7OztXQUNKLDhCQUFvQztBQUFBLFVBQXBCQyxLQUFvQixRQUFwQkEsS0FBb0I7QUFBQSxVQUFiQyxVQUFhLFFBQWJBLFVBQWE7QUFDbEMsVUFBTUMsVUFBVSxHQUFHRixLQUFLLENBQUNHLEVBQU4sQ0FBU0MsUUFBVCxDQUFrQixvQkFBbEIsQ0FBbkI7O0FBQ0EsVUFBSUgsVUFBVSxLQUFLLFdBQW5CLEVBQWdDO0FBQzlCLGVBQU9DLFVBQVAsQ0FEOEIsQ0FDWDtB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LFVBQU1yQixpQkFBaUIsR0FBRyxLQUFLc0IsMEJBQUwsRUFBMUI7QUFDQSxVQUFNQyxHQUFHLEdBQUcsQ0FDVjtBQUNBLFdBQUtDLGVBQUwsV0FBd0J0QixjQUFjLENBQUNnQixPQUF2QyxlQUEwRDtBQUN4RGxCLFFBQUFBLGlCQUFpQixFQUFqQkEsaUJBRHdEO0FBRXhEa0IsUUFBQUEsT0FBTyxFQUFQQSxPQUZ3RDtBQUd4REwsUUFBQUEsY0FBYyxFQUFkQSxjQUh3RDtBQUl4RDlDLFFBQUFBLFVBQVUsRUFBRSxJQUo0QyxDQUl2Qzs7QUFKdUMsT0FBMUQsQ0FGVSxFQVFWa0IsZ0JBQWdCLElBQ2QsS0FBS3VDLGVBQUwsV0FBd0J0QixjQUFjLENBQUNqQixnQkFBdkM7QUFDRWlDLFFBQUFBLE9BQU8sRUFBRWpDLGdCQURYO0FBRUU0QixRQUFBQSxjQUFjLEVBQUUsS0FBS1Esb0JBQUwsQ0FBMEIsSUFBMUIsQ0FGbEI7QUFHRXJDLFFBQUFBLG9CQUFvQixFQUFFLEtBSHhCO0FBSUVrQixRQUFBQSxjQUFjLEVBQUU7QUFBQ2dCLFVBQUFBLE9BQU8sRUFBRWhCLGNBQWMsQ0FBQ2pCO0FBQXpCO0FBSmxCLFNBT01rQyxpQkFBaUIsSUFBSTtBQUFDVCxRQUFBQSxRQUFRLEVBQUVTO0FBQVgsT0FQM0IsR0FRTWpDLGtCQUFrQixJQUFJO0FBQUNDLFFBQUFBLFNBQVMsRUFBRUQ7QUFBWixPQVI1QixHQVNNa0MscUJBQXFCLElBQUk7QUFBQ1osUUFBQUEsWUFBWSxFQUFFWTtBQUFmLE9BVC9CLEVBVFEsQ0FBWjtBQXNCQSxhQUFPRyxHQUFQO0FBQ0Q7OztFQTFLa0NFLG9COzs7aUNBQXhCOUMsZSxlQUNRLGlCO2lDQURSQSxlLGtCQUVXTixZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb3NpdGVMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1RleHRMYXllciwgX1RleHRCYWNrZ3JvdW5kTGF5ZXIgYXMgVGV4dEJhY2tncm91bmRMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcblxuLy8gVE9ETyByZW1vdmUgcHJpb3IgdG8gcmVsZWFzZVxuY29uc3QgU0hPV19URVhUX0JPUkRFUiA9IGZhbHNlO1xuXG5jb25zdCBbTEVGVCwgVE9QLCBSSUdIVCwgQk9UVE9NXSA9IFswLCAxLCAyLCAzXTtcblxuY2xhc3MgRW5oYW5jZWRUZXh0QmFja2dyb3VuZExheWVyIGV4dGVuZHMgVGV4dEJhY2tncm91bmRMYXllciB7XG4gIGdldFNoYWRlcnMoKSB7XG4gICAgY29uc3Qgc2hhZGVycyA9IHN1cGVyLmdldFNoYWRlcnMoKTtcbiAgICBsZXQgdnMgPSBzaGFkZXJzLnZzO1xuXG4gICAgLy8gTW9kaWZ5IHNoYWRlciBzbyB0aGF0IHRoZSBwYWRkaW5nIGlzIG9mZnNldCBieSB0aGUgcGl4ZWwgb2Zmc2V0IHRvIGVuc3VyZSB0aGUgcGFkZGluZ1xuICAgIC8vIGFsd2F5cyBjYXB0dXJlcyB0aGUgYW5jaG9yIHBvaW50LiBBcyBwYWRkaW5nIGlzIHVuaWZvcm0gd2UgY2Fubm90IHBhc3MgaXQgYSBwZXItbGFiZWwgdmFsdWVcbiAgICB2cyA9IHZzLnJlcGxhY2VBbGwoJ3BhZGRpbmcuJywgJ19wYWRkaW5nLicpO1xuICAgIHZzID0gdnMucmVwbGFjZShcbiAgICAgICd2b2lkIG1haW4odm9pZCkgeycsXG4gICAgICAndm9pZCBtYWluKHZvaWQpIHtcXG4gIHZlYzQgX3BhZGRpbmcgPSBwYWRkaW5nICsgaW5zdGFuY2VQaXhlbE9mZnNldHMueHl4eSAqIHZlYzQoMS4wLCAxLjAsIC0xLjAsIC0xLjApOydcbiAgICApO1xuXG4gICAgcmV0dXJuIHsuLi5zaGFkZXJzLCB2c307XG4gIH1cbn1cblxuLy8gVGV4dExheWVyIHdoaWNoIGluY2x1ZGVzIG1vZGlmaWVkIHRleHQtYmFja2dyb3VuZC1sYXllci12ZXJ0ZXggc2hhZGVyIGFuZCBvbmx5IHJlbmRlcnMgdGhlXG4vLyBwcmltYXJ5IGJhY2tncm91bmQgbGF5ZXIgaW4gdGhlIGNvbGxpc2lvbiBwYXNzXG5jbGFzcyBFbmhhbmNlZFRleHRMYXllciBleHRlbmRzIFRleHRMYXllciB7XG4gIGZpbHRlclN1YkxheWVyKHtsYXllciwgcmVuZGVyUGFzc30pIHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gbGF5ZXIuaWQuaW5jbHVkZXMoJ3ByaW1hcnktYmFja2dyb3VuZCcpO1xuICAgIGlmIChyZW5kZXJQYXNzID09PSAnY29sbGlzaW9uJykge1xuICAgICAgcmV0dXJuIGJhY2tncm91bmQ7IC8vIE9ubHkgZHJhdyBwcmltYXJ5IGJhY2tncm91bmQgbGF5ZXIgaW4gY29sbGlzaW9uIHBhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICFiYWNrZ3JvdW5kIHx8IChTSE9XX1RFWFRfQk9SREVSICYmIHRoaXMucHJvcHMuZ2V0Qm9yZGVyV2lkdGgpOyAvLyBEbyBub3QgZHJhdyBiYWNrZ3JvdW5kIGxheWVyIGluIG90aGVyIHBhc3Nlc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIC4uLlRleHRMYXllci5kZWZhdWx0UHJvcHMsXG4gIGdldFJhZGl1czoge3R5cGU6ICdhY2Nlc3NvcicsIHZhbHVlOiAxfSxcbiAgcmFkaXVzU2NhbGU6IHt0eXBlOiAnbnVtYmVyJywgbWluOiAwLCB2YWx1ZTogMX1cbn07XG5cbmV4cG9ydCBjbGFzcyBQb2ludExhYmVsTGF5ZXIgZXh0ZW5kcyBDb21wb3NpdGVMYXllciB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnUG9pbnRMYWJlbExheWVyJztcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBjYWxjdWxhdGVQaXhlbE9mZnNldChzZWNvbmRhcnkpIHtcbiAgICBjb25zdCB7XG4gICAgICBnZXRUZXh0QW5jaG9yOiBhbmNob3IsXG4gICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogYWxpZ25tZW50LFxuICAgICAgZ2V0UmFkaXVzLFxuICAgICAgZ2V0U2Vjb25kYXJ5VGV4dCxcbiAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgc2Vjb25kYXJ5U2l6ZVNjYWxlLFxuICAgICAgc2l6ZVNjYWxlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeE11bHQgPSBhbmNob3IgPT09ICdtaWRkbGUnID8gMCA6IGFuY2hvciA9PT0gJ3N0YXJ0JyA/IDEgOiAtMTtcbiAgICBjb25zdCB5TXVsdCA9IGFsaWdubWVudCA9PT0gJ2NlbnRlcicgPyAwIDogYWxpZ25tZW50ID09PSAnYm90dG9tJyA/IDEgOiAtMTtcblxuICAgIC8vIFBhZGRpbmcgYmFzZWQgb24gZm9udCBzaXplIChmb250IHNpemUgLyA0KVxuICAgIGNvbnN0IHhQYWRkaW5nID0gc2l6ZVNjYWxlIC8gNDtcbiAgICBjb25zdCB5UGFkZGluZyA9IHNpemVTY2FsZSAqICgxICsgMSAvIDQpO1xuXG4gICAgLy8gUGxhY2Ugc2Vjb25kYXJ5IGxhYmVsIHVuZGVyIG1haW4gbGFiZWwgKHNlY29uZGFyeSBsYWJlbCBhbHdheXMgJ3RvcCcgYmFzZWxpbmUgYWxpZ25lZClcbiAgICBjb25zdCBzZWNvbmRhcnlPZmZzZXQgPSAwLjYgKiAoMSAtIHlNdWx0KSAqIHNpemVTY2FsZTtcbiAgICBsZXQgeU9mZnNldCA9IHNlY29uZGFyeSA/IHNlY29uZGFyeU9mZnNldCA6IDA7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHNlY29uZGFyeSBsYWJlbFxuICAgIGlmIChhbmNob3IgPT09ICdtaWRkbGUnICYmIGFsaWdubWVudCA9PT0gJ3RvcCcgJiYgZ2V0U2Vjb25kYXJ5VGV4dCkge1xuICAgICAgeU9mZnNldCAtPSBzZWNvbmRhcnlPZmZzZXQ7XG4gICAgICB5T2Zmc2V0IC09IHNlY29uZGFyeVNpemVTY2FsZTtcbiAgICAgIHlPZmZzZXQgKz0gc2l6ZVNjYWxlO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmcgYmFzZWQgb24gcG9pbnQgcmFkaXVzIChyYWRpdXMvIDQpXG4gICAgY29uc3QgcmFkaXVzUGFkZGluZyA9IDEgKyAxIC8gNDtcblxuICAgIHJldHVybiB0eXBlb2YgZ2V0UmFkaXVzID09PSAnZnVuY3Rpb24nXG4gICAgICA/IChkLCBpbmZvKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IChpbmZvID8gZ2V0UmFkaXVzKGQsIGluZm8pIDogMSkgKiByYWRpdXNTY2FsZSAqIHJhZGl1c1BhZGRpbmc7XG4gICAgICAgICAgcmV0dXJuIFt4TXVsdCAqIChyICsgeFBhZGRpbmcpLCB5TXVsdCAqIChyICsgeVBhZGRpbmcpICsgeU9mZnNldF07XG4gICAgICAgIH1cbiAgICAgIDogW1xuICAgICAgICAgIHhNdWx0ICogKGdldFJhZGl1cyAqIHJhZGl1c1NjYWxlICogcmFkaXVzUGFkZGluZyArIHhQYWRkaW5nKSxcbiAgICAgICAgICB5TXVsdCAqIChnZXRSYWRpdXMgKiByYWRpdXNTY2FsZSAqIHJhZGl1c1BhZGRpbmcgKyB5UGFkZGluZykgKyB5T2Zmc2V0XG4gICAgICAgIF07XG4gIH1cblxuICBjYWxjdWxhdGVCYWNrZ3JvdW5kUGFkZGluZygpIHtcbiAgICBjb25zdCB7Z2V0VGV4dEFuY2hvcjogYW5jaG9yLCBnZXRBbGlnbm1lbnRCYXNlbGluZTogYWxpZ25tZW50LCBzaXplU2NhbGV9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIEhldXJpc3RpY3MgdG8gYXZvaWQgbGFiZWwgb3ZlcmxhcCAoc2hvdWxkIHdlIGJhc2UgdGhpcyBvbiB0aGUgdGV4dCBsZW5ndGg/KVxuICAgIGNvbnN0IHBhZGRpbmdYID0gMTIgKiBzaXplU2NhbGU7XG4gICAgY29uc3QgcGFkZGluZ1kgPSAzICogc2l6ZVNjYWxlO1xuICAgIGNvbnN0IGJhY2tncm91bmRQYWRkaW5nID0gWzAsIDAsIDAsIDBdO1xuICAgIGlmIChhbGlnbm1lbnQgPT09ICd0b3AnKSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tUT1BdID0gcGFkZGluZ1k7XG4gICAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09ICdib3R0b20nKSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tCT1RUT01dID0gcGFkZGluZ1k7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW1RPUF0gPSAwLjUgKiBwYWRkaW5nWTtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW0JPVFRPTV0gPSAwLjUgKiBwYWRkaW5nWTtcbiAgICB9XG4gICAgaWYgKGFuY2hvciA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbTEVGVF0gPSBwYWRkaW5nWDtcbiAgICB9IGVsc2UgaWYgKGFuY2hvciA9PT0gJ2VuZCcpIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW1JJR0hUXSA9IHBhZGRpbmdYO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tMRUZUXSA9IDAuNSAqIHBhZGRpbmdYO1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbUklHSFRdID0gMC41ICogcGFkZGluZ1g7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2tncm91bmRQYWRkaW5nO1xuICB9XG5cbiAgcmVuZGVyVGV4dExheWVyKGlkLCB7dXBkYXRlVHJpZ2dlcnM6IHVwZGF0ZVRyaWdnZXJzT3ZlcnJpZGUsIC4uLnByb3BzfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG5cbiAgICAgIGNoYXJhY3RlclNldCxcbiAgICAgIGZvbnRGYW1pbHksXG4gICAgICBmb250U2V0dGluZ3MsXG4gICAgICBmb250V2VpZ2h0LFxuICAgICAgb3V0bGluZUNvbG9yLFxuICAgICAgb3V0bGluZVdpZHRoLFxuICAgICAgc2l6ZVNjYWxlLFxuICAgICAgcmFkaXVzU2NhbGUsXG5cbiAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lLFxuICAgICAgZ2V0Q29sb3IsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldFRleHRBbmNob3IsXG5cbiAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gbmV3IEVuaGFuY2VkVGV4dExheWVyKFxuICAgICAgdGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgaWQsXG4gICAgICAgIGRhdGE6IGRhdGEsXG5cbiAgICAgICAgY2hhcmFjdGVyU2V0LFxuICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICBmb250U2V0dGluZ3MsXG4gICAgICAgIGZvbnRXZWlnaHQsXG4gICAgICAgIG91dGxpbmVDb2xvcixcbiAgICAgICAgb3V0bGluZVdpZHRoLFxuICAgICAgICBzaXplU2NhbGUsXG5cbiAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmUsXG4gICAgICAgIGdldENvbG9yLFxuICAgICAgICBnZXRQb3NpdGlvbixcbiAgICAgICAgZ2V0VGV4dEFuY2hvcixcblxuICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzT3ZlcnJpZGUsXG4gICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IFtcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzLmdldFJhZGl1cyxcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzLmdldFRleHRBbmNob3IsXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2Vycy5nZXRBbGlnbm1lbnRCYXNlbGluZSxcbiAgICAgICAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgICAgICAgc2l6ZVNjYWxlXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgZ2V0U2l6ZTogMSxcbiAgICAgICAgX3N1YkxheWVyUHJvcHM6IHtiYWNrZ3JvdW5kOiB7dHlwZTogRW5oYW5jZWRUZXh0QmFja2dyb3VuZExheWVyfX1cbiAgICAgIH0sXG4gICAgICAvLyBERUJVR1xuICAgICAgU0hPV19URVhUX0JPUkRFUlxuICAgICAgICA/IHtnZXRCYWNrZ3JvdW5kQ29sb3I6IFswLCAwLCAwLCAwXSwgZ2V0Qm9yZGVyQ29sb3I6IFsyNTUsIDAsIDAsIDgwXSwgZ2V0Qm9yZGVyV2lkdGg6IDF9XG4gICAgICAgIDoge30sXG4gICAgICBwcm9wc1xuICAgICk7XG4gIH1cblxuICByZW5kZXJMYXllcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZ2V0VGV4dCxcbiAgICAgIGdldFNlY29uZGFyeUNvbG9yLFxuICAgICAgZ2V0U2Vjb25kYXJ5VGV4dCxcbiAgICAgIHNlY29uZGFyeU91dGxpbmVDb2xvcixcbiAgICAgIHNlY29uZGFyeVNpemVTY2FsZSxcbiAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZ2V0UGl4ZWxPZmZzZXQgPSB0aGlzLmNhbGN1bGF0ZVBpeGVsT2Zmc2V0KGZhbHNlKTtcbiAgICBjb25zdCBiYWNrZ3JvdW5kUGFkZGluZyA9IHRoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBhZGRpbmcoKTtcbiAgICBjb25zdCBvdXQgPSBbXG4gICAgICAvLyBUZXh0IGRvZXNuJ3QgdXBkYXRlIHZpYSB1cGRhdGVUcmlnZ2VyIGZvciBzb21lIHJlYXNvblxuICAgICAgdGhpcy5yZW5kZXJUZXh0TGF5ZXIoYCR7dXBkYXRlVHJpZ2dlcnMuZ2V0VGV4dH0tcHJpbWFyeWAsIHtcbiAgICAgICAgYmFja2dyb3VuZFBhZGRpbmcsXG4gICAgICAgIGdldFRleHQsXG4gICAgICAgIGdldFBpeGVsT2Zmc2V0LFxuICAgICAgICBiYWNrZ3JvdW5kOiB0cnVlIC8vIE9ubHkgdXNlIGJhY2tncm91bmQgZm9yIHByaW1hcnkgbGFiZWwgZm9yIGZhc3RlciBjb2xsaXNpb25zXG4gICAgICB9KSxcbiAgICAgIGdldFNlY29uZGFyeVRleHQgJiZcbiAgICAgICAgdGhpcy5yZW5kZXJUZXh0TGF5ZXIoYCR7dXBkYXRlVHJpZ2dlcnMuZ2V0U2Vjb25kYXJ5VGV4dH0tc2Vjb25kYXJ5YCwge1xuICAgICAgICAgIGdldFRleHQ6IGdldFNlY29uZGFyeVRleHQsXG4gICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IHRoaXMuY2FsY3VsYXRlUGl4ZWxPZmZzZXQodHJ1ZSksXG4gICAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6ICd0b3AnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7Z2V0VGV4dDogdXBkYXRlVHJpZ2dlcnMuZ2V0U2Vjb25kYXJ5VGV4dH0sXG5cbiAgICAgICAgICAvLyBPcHRpb25hbCBvdmVycmlkZXNcbiAgICAgICAgICAuLi4oZ2V0U2Vjb25kYXJ5Q29sb3IgJiYge2dldENvbG9yOiBnZXRTZWNvbmRhcnlDb2xvcn0pLFxuICAgICAgICAgIC4uLihzZWNvbmRhcnlTaXplU2NhbGUgJiYge3NpemVTY2FsZTogc2Vjb25kYXJ5U2l6ZVNjYWxlfSksXG4gICAgICAgICAgLi4uKHNlY29uZGFyeU91dGxpbmVDb2xvciAmJiB7b3V0bGluZUNvbG9yOiBzZWNvbmRhcnlPdXRsaW5lQ29sb3J9KVxuICAgICAgICB9KVxuICAgIF07XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG59XG4iXX0=
@@ -1,216 +0,0 @@
1
- import {CompositeLayer} from '@deck.gl/core';
2
- import {TextLayer, _TextBackgroundLayer as TextBackgroundLayer} from '@deck.gl/layers';
3
-
4
- // TODO remove prior to release
5
- const SHOW_TEXT_BORDER = false;
6
-
7
- const [LEFT, TOP, RIGHT, BOTTOM] = [0, 1, 2, 3];
8
-
9
- class EnhancedTextBackgroundLayer extends TextBackgroundLayer {
10
- getShaders() {
11
- const shaders = super.getShaders();
12
- let vs = shaders.vs;
13
-
14
- // Modify shader so that the padding is offset by the pixel offset to ensure the padding
15
- // always captures the anchor point. As padding is uniform we cannot pass it a per-label value
16
- vs = vs.replaceAll('padding.', '_padding.');
17
- vs = vs.replace(
18
- 'void main(void) {',
19
- 'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);'
20
- );
21
-
22
- return {...shaders, vs};
23
- }
24
- }
25
-
26
- // TextLayer which includes modified text-background-layer-vertex shader and only renders the
27
- // primary background layer in the collision pass
28
- class EnhancedTextLayer extends TextLayer {
29
- filterSubLayer({layer, renderPass}) {
30
- const background = layer.id.includes('primary-background');
31
- if (renderPass === 'collision') {
32
- return background; // Only draw primary background layer in collision pass
33
- } else {
34
- return !background || (SHOW_TEXT_BORDER && this.props.getBorderWidth); // Do not draw background layer in other passes
35
- }
36
- }
37
- }
38
-
39
- const defaultProps = {
40
- ...TextLayer.defaultProps,
41
- getRadius: {type: 'accessor', value: 1},
42
- radiusScale: {type: 'number', min: 0, value: 1}
43
- };
44
-
45
- export class PointLabelLayer extends CompositeLayer {
46
- static layerName = 'PointLabelLayer';
47
- static defaultProps = defaultProps;
48
-
49
- calculatePixelOffset(secondary) {
50
- const {
51
- getTextAnchor: anchor,
52
- getAlignmentBaseline: alignment,
53
- getRadius,
54
- getSecondaryText,
55
- radiusScale,
56
- secondarySizeScale,
57
- sizeScale
58
- } = this.props;
59
- const xMult = anchor === 'middle' ? 0 : anchor === 'start' ? 1 : -1;
60
- const yMult = alignment === 'center' ? 0 : alignment === 'bottom' ? 1 : -1;
61
-
62
- // Padding based on font size (font size / 4)
63
- const xPadding = sizeScale / 4;
64
- const yPadding = sizeScale * (1 + 1 / 4);
65
-
66
- // Place secondary label under main label (secondary label always 'top' baseline aligned)
67
- const secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
68
- let yOffset = secondary ? secondaryOffset : 0;
69
-
70
- // Special case, position relative to secondary label
71
- if (anchor === 'middle' && alignment === 'top' && getSecondaryText) {
72
- yOffset -= secondaryOffset;
73
- yOffset -= secondarySizeScale;
74
- yOffset += sizeScale;
75
- }
76
-
77
- // Padding based on point radius (radius/ 4)
78
- const radiusPadding = 1 + 1 / 4;
79
-
80
- return typeof getRadius === 'function'
81
- ? (d, info) => {
82
- const r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
83
- return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
84
- }
85
- : [
86
- xMult * (getRadius * radiusScale * radiusPadding + xPadding),
87
- yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset
88
- ];
89
- }
90
-
91
- calculateBackgroundPadding() {
92
- const {getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale} = this.props;
93
-
94
- // Heuristics to avoid label overlap (should we base this on the text length?)
95
- const paddingX = 12 * sizeScale;
96
- const paddingY = 3 * sizeScale;
97
- const backgroundPadding = [0, 0, 0, 0];
98
- if (alignment === 'top') {
99
- backgroundPadding[TOP] = paddingY;
100
- } else if (alignment === 'bottom') {
101
- backgroundPadding[BOTTOM] = paddingY;
102
- } else {
103
- backgroundPadding[TOP] = 0.5 * paddingY;
104
- backgroundPadding[BOTTOM] = 0.5 * paddingY;
105
- }
106
- if (anchor === 'start') {
107
- backgroundPadding[LEFT] = paddingX;
108
- } else if (anchor === 'end') {
109
- backgroundPadding[RIGHT] = paddingX;
110
- } else {
111
- backgroundPadding[LEFT] = 0.5 * paddingX;
112
- backgroundPadding[RIGHT] = 0.5 * paddingX;
113
- }
114
-
115
- return backgroundPadding;
116
- }
117
-
118
- renderTextLayer(id, {updateTriggers: updateTriggersOverride, ...props}) {
119
- const {
120
- data,
121
-
122
- characterSet,
123
- fontFamily,
124
- fontSettings,
125
- fontWeight,
126
- outlineColor,
127
- outlineWidth,
128
- sizeScale,
129
- radiusScale,
130
-
131
- getAlignmentBaseline,
132
- getColor,
133
- getPosition,
134
- getTextAnchor,
135
-
136
- updateTriggers
137
- } = this.props;
138
-
139
- return new EnhancedTextLayer(
140
- this.getSubLayerProps({
141
- id,
142
- data: data,
143
-
144
- characterSet,
145
- fontFamily,
146
- fontSettings,
147
- fontWeight,
148
- outlineColor,
149
- outlineWidth,
150
- sizeScale,
151
-
152
- getAlignmentBaseline,
153
- getColor,
154
- getPosition,
155
- getTextAnchor,
156
-
157
- updateTriggers: {
158
- ...updateTriggers,
159
- ...updateTriggersOverride,
160
- getPixelOffset: [
161
- updateTriggers.getRadius,
162
- updateTriggers.getTextAnchor,
163
- updateTriggers.getAlignmentBaseline,
164
- radiusScale,
165
- sizeScale
166
- ]
167
- }
168
- }),
169
- {
170
- getSize: 1,
171
- _subLayerProps: {background: {type: EnhancedTextBackgroundLayer}}
172
- },
173
- // DEBUG
174
- SHOW_TEXT_BORDER
175
- ? {getBackgroundColor: [0, 0, 0, 0], getBorderColor: [255, 0, 0, 80], getBorderWidth: 1}
176
- : {},
177
- props
178
- );
179
- }
180
-
181
- renderLayers() {
182
- const {
183
- getText,
184
- getSecondaryColor,
185
- getSecondaryText,
186
- secondaryOutlineColor,
187
- secondarySizeScale,
188
- updateTriggers
189
- } = this.props;
190
- const getPixelOffset = this.calculatePixelOffset(false);
191
- const backgroundPadding = this.calculateBackgroundPadding();
192
- const out = [
193
- // Text doesn't update via updateTrigger for some reason
194
- this.renderTextLayer(`${updateTriggers.getText}-primary`, {
195
- backgroundPadding,
196
- getText,
197
- getPixelOffset,
198
- background: true // Only use background for primary label for faster collisions
199
- }),
200
- getSecondaryText &&
201
- this.renderTextLayer(`${updateTriggers.getSecondaryText}-secondary`, {
202
- getText: getSecondaryText,
203
- getPixelOffset: this.calculatePixelOffset(true),
204
- getAlignmentBaseline: 'top',
205
- updateTriggers: {getText: updateTriggers.getSecondaryText},
206
-
207
- // Optional overrides
208
- ...(getSecondaryColor && {getColor: getSecondaryColor}),
209
- ...(secondarySizeScale && {sizeScale: secondarySizeScale}),
210
- ...(secondaryOutlineColor && {outlineColor: secondaryOutlineColor})
211
- })
212
- ];
213
-
214
- return out;
215
- }
216
- }