Implement Expressions (#9439)
Ports https://github.com/mapbox/mapbox-gl-js/pull/4777 (and its several follow-ups)
This commit is contained in:
230
platform/node/src/node_expression.cpp
Normal file
230
platform/node/src/node_expression.cpp
Normal file
@@ -0,0 +1,230 @@
|
||||
#include "node_conversion.hpp"
|
||||
#include "node_expression.hpp"
|
||||
|
||||
#include <mbgl/style/expression/parsing_context.hpp>
|
||||
#include <mbgl/style/expression/is_constant.hpp>
|
||||
#include <mbgl/style/conversion/geojson.hpp>
|
||||
#include <mbgl/util/geojson.hpp>
|
||||
#include <nan.h>
|
||||
|
||||
using namespace mbgl::style;
|
||||
using namespace mbgl::style::expression;
|
||||
|
||||
namespace node_mbgl {
|
||||
|
||||
Nan::Persistent<v8::Function> NodeExpression::constructor;
|
||||
|
||||
void NodeExpression::Init(v8::Local<v8::Object> target) {
|
||||
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
|
||||
tpl->SetClassName(Nan::New("Expression").ToLocalChecked());
|
||||
tpl->InstanceTemplate()->SetInternalFieldCount(1); // what is this doing?
|
||||
|
||||
Nan::SetPrototypeMethod(tpl, "evaluate", Evaluate);
|
||||
Nan::SetPrototypeMethod(tpl, "getType", GetType);
|
||||
Nan::SetPrototypeMethod(tpl, "isFeatureConstant", IsFeatureConstant);
|
||||
Nan::SetPrototypeMethod(tpl, "isZoomConstant", IsZoomConstant);
|
||||
|
||||
Nan::SetMethod(tpl, "parse", Parse);
|
||||
|
||||
constructor.Reset(tpl->GetFunction()); // what is this doing?
|
||||
Nan::Set(target, Nan::New("Expression").ToLocalChecked(), tpl->GetFunction());
|
||||
}
|
||||
|
||||
type::Type parseType(v8::Local<v8::Object> type) {
|
||||
static std::unordered_map<std::string, type::Type> types = {
|
||||
{"string", type::String},
|
||||
{"number", type::Number},
|
||||
{"noolean", type::Boolean},
|
||||
{"object", type::Object},
|
||||
{"color", type::Color},
|
||||
{"value", type::Value}
|
||||
};
|
||||
|
||||
v8::Local<v8::Value> v8kind = Nan::Get(type, Nan::New("kind").ToLocalChecked()).ToLocalChecked();
|
||||
std::string kind(*v8::String::Utf8Value(v8kind));
|
||||
|
||||
if (kind == "array") {
|
||||
type::Type itemType = parseType(Nan::Get(type, Nan::New("itemType").ToLocalChecked()).ToLocalChecked()->ToObject());
|
||||
mbgl::optional<std::size_t> N;
|
||||
|
||||
v8::Local<v8::String> Nkey = Nan::New("N").ToLocalChecked();
|
||||
if (Nan::Has(type, Nkey).FromMaybe(false)) {
|
||||
N = Nan::Get(type, Nkey).ToLocalChecked()->ToInt32()->Value();
|
||||
}
|
||||
return type::Array(itemType, N);
|
||||
}
|
||||
|
||||
return types[kind];
|
||||
}
|
||||
|
||||
void NodeExpression::Parse(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
v8::Local<v8::Function> cons = Nan::New(constructor);
|
||||
|
||||
if (info.Length() < 1 || info[0]->IsUndefined()) {
|
||||
return Nan::ThrowTypeError("Requires a JSON style expression argument.");
|
||||
}
|
||||
|
||||
mbgl::optional<type::Type> expected;
|
||||
if (info.Length() > 1 && info[1]->IsObject()) {
|
||||
expected = parseType(info[1]->ToObject());
|
||||
}
|
||||
|
||||
auto expr = info[0];
|
||||
|
||||
try {
|
||||
ParsingContext ctx(expected);
|
||||
ParseResult parsed = ctx.parse(mbgl::style::conversion::Convertible(expr));
|
||||
if (parsed) {
|
||||
assert(ctx.getErrors().size() == 0);
|
||||
auto nodeExpr = new NodeExpression(std::move(*parsed));
|
||||
const int argc = 0;
|
||||
v8::Local<v8::Value> argv[0] = {};
|
||||
auto wrapped = Nan::NewInstance(cons, argc, argv).ToLocalChecked();
|
||||
nodeExpr->Wrap(wrapped);
|
||||
info.GetReturnValue().Set(wrapped);
|
||||
return;
|
||||
}
|
||||
|
||||
v8::Local<v8::Array> result = Nan::New<v8::Array>();
|
||||
for (std::size_t i = 0; i < ctx.getErrors().size(); i++) {
|
||||
const auto& error = ctx.getErrors()[i];
|
||||
v8::Local<v8::Object> err = Nan::New<v8::Object>();
|
||||
Nan::Set(err,
|
||||
Nan::New("key").ToLocalChecked(),
|
||||
Nan::New(error.key.c_str()).ToLocalChecked());
|
||||
Nan::Set(err,
|
||||
Nan::New("error").ToLocalChecked(),
|
||||
Nan::New(error.message.c_str()).ToLocalChecked());
|
||||
Nan::Set(result, Nan::New((uint32_t)i), err);
|
||||
}
|
||||
info.GetReturnValue().Set(result);
|
||||
} catch(std::exception &ex) {
|
||||
return Nan::ThrowError(ex.what());
|
||||
}
|
||||
}
|
||||
|
||||
void NodeExpression::New(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
if (!info.IsConstructCall()) {
|
||||
return Nan::ThrowTypeError("Use the new operator to create new Expression objects");
|
||||
}
|
||||
|
||||
info.GetReturnValue().Set(info.This());
|
||||
}
|
||||
|
||||
struct ToValue {
|
||||
v8::Local<v8::Value> operator()(mbgl::NullValue) {
|
||||
Nan::EscapableHandleScope scope;
|
||||
return scope.Escape(Nan::Null());
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> operator()(bool t) {
|
||||
Nan::EscapableHandleScope scope;
|
||||
return scope.Escape(Nan::New(t));
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> operator()(double t) {
|
||||
Nan::EscapableHandleScope scope;
|
||||
return scope.Escape(Nan::New(t));
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> operator()(const std::string& t) {
|
||||
Nan::EscapableHandleScope scope;
|
||||
return scope.Escape(Nan::New(t).ToLocalChecked());
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> operator()(const std::vector<Value>& array) {
|
||||
Nan::EscapableHandleScope scope;
|
||||
v8::Local<v8::Array> result = Nan::New<v8::Array>();
|
||||
for (unsigned int i = 0; i < array.size(); i++) {
|
||||
result->Set(i, toJS(array[i]));
|
||||
}
|
||||
return scope.Escape(result);
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> operator()(const mbgl::Color& color) {
|
||||
return operator()(std::vector<Value> {
|
||||
static_cast<double>(color.r),
|
||||
static_cast<double>(color.g),
|
||||
static_cast<double>(color.b),
|
||||
static_cast<double>(color.a)
|
||||
});
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> operator()(const std::unordered_map<std::string, Value>& map) {
|
||||
Nan::EscapableHandleScope scope;
|
||||
v8::Local<v8::Object> result = Nan::New<v8::Object>();
|
||||
for (const auto& entry : map) {
|
||||
Nan::Set(result, Nan::New(entry.first).ToLocalChecked(), toJS(entry.second));
|
||||
}
|
||||
|
||||
return scope.Escape(result);
|
||||
}
|
||||
};
|
||||
|
||||
v8::Local<v8::Value> toJS(const Value& value) {
|
||||
return Value::visit(value, ToValue());
|
||||
}
|
||||
|
||||
void NodeExpression::Evaluate(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
NodeExpression* nodeExpr = ObjectWrap::Unwrap<NodeExpression>(info.Holder());
|
||||
const std::unique_ptr<Expression>& expression = nodeExpr->expression;
|
||||
|
||||
if (info.Length() < 2 || !info[0]->IsObject()) {
|
||||
return Nan::ThrowTypeError("Requires globals and feature arguments.");
|
||||
}
|
||||
|
||||
mbgl::optional<float> zoom;
|
||||
v8::Local<v8::Value> v8zoom = Nan::Get(info[0]->ToObject(), Nan::New("zoom").ToLocalChecked()).ToLocalChecked();
|
||||
if (v8zoom->IsNumber()) zoom = v8zoom->NumberValue();
|
||||
|
||||
mbgl::optional<double> heatmapDensity;
|
||||
v8::Local<v8::Value> v8heatmapDensity = Nan::Get(info[0]->ToObject(), Nan::New("heatmapDensity").ToLocalChecked()).ToLocalChecked();
|
||||
if (v8heatmapDensity->IsNumber()) heatmapDensity = v8heatmapDensity->NumberValue();
|
||||
|
||||
Nan::JSON NanJSON;
|
||||
conversion::Error conversionError;
|
||||
mbgl::optional<mbgl::GeoJSON> geoJSON = conversion::convert<mbgl::GeoJSON>(info[1], conversionError);
|
||||
if (!geoJSON) {
|
||||
Nan::ThrowTypeError(conversionError.message.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
mapbox::geojson::feature feature = geoJSON->get<mapbox::geojson::feature>();
|
||||
auto result = expression->evaluate(zoom, feature, heatmapDensity);
|
||||
if (result) {
|
||||
info.GetReturnValue().Set(toJS(*result));
|
||||
} else {
|
||||
v8::Local<v8::Object> res = Nan::New<v8::Object>();
|
||||
Nan::Set(res,
|
||||
Nan::New("error").ToLocalChecked(),
|
||||
Nan::New(result.error().message.c_str()).ToLocalChecked());
|
||||
info.GetReturnValue().Set(res);
|
||||
}
|
||||
} catch(std::exception &ex) {
|
||||
return Nan::ThrowTypeError(ex.what());
|
||||
}
|
||||
}
|
||||
|
||||
void NodeExpression::GetType(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
NodeExpression* nodeExpr = ObjectWrap::Unwrap<NodeExpression>(info.Holder());
|
||||
const std::unique_ptr<Expression>& expression = nodeExpr->expression;
|
||||
|
||||
const type::Type type = expression->getType();
|
||||
const std::string name = type.match([&] (const auto& t) { return t.getName(); });
|
||||
info.GetReturnValue().Set(Nan::New(name.c_str()).ToLocalChecked());
|
||||
}
|
||||
|
||||
void NodeExpression::IsFeatureConstant(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
NodeExpression* nodeExpr = ObjectWrap::Unwrap<NodeExpression>(info.Holder());
|
||||
const std::unique_ptr<Expression>& expression = nodeExpr->expression;
|
||||
info.GetReturnValue().Set(Nan::New(isFeatureConstant(*expression)));
|
||||
}
|
||||
|
||||
void NodeExpression::IsZoomConstant(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
NodeExpression* nodeExpr = ObjectWrap::Unwrap<NodeExpression>(info.Holder());
|
||||
const std::unique_ptr<Expression>& expression = nodeExpr->expression;
|
||||
info.GetReturnValue().Set(Nan::New(isZoomConstant(*expression)));
|
||||
}
|
||||
|
||||
} // namespace node_mbgl
|
||||
40
platform/node/src/node_expression.hpp
Normal file
40
platform/node/src/node_expression.hpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include <mbgl/style/conversion.hpp>
|
||||
#include <mbgl/style/expression/expression.hpp>
|
||||
#include <exception>
|
||||
#include <memory>
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||
#pragma GCC diagnostic ignored "-Wshadow"
|
||||
#include <nan.h>
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
using namespace mbgl::style::expression;
|
||||
|
||||
namespace node_mbgl {
|
||||
|
||||
v8::Local<v8::Value> toJS(const Value&);
|
||||
|
||||
class NodeExpression : public Nan::ObjectWrap {
|
||||
public:
|
||||
static void Init(v8::Local<v8::Object>);
|
||||
|
||||
private:
|
||||
NodeExpression(std::unique_ptr<Expression> expression_) :
|
||||
expression(std::move(expression_))
|
||||
{};
|
||||
|
||||
static void New(const Nan::FunctionCallbackInfo<v8::Value>&);
|
||||
static void Parse(const Nan::FunctionCallbackInfo<v8::Value>&);
|
||||
static void Evaluate(const Nan::FunctionCallbackInfo<v8::Value>&);
|
||||
static void GetType(const Nan::FunctionCallbackInfo<v8::Value>&);
|
||||
static void IsFeatureConstant(const Nan::FunctionCallbackInfo<v8::Value>&);
|
||||
static void IsZoomConstant(const Nan::FunctionCallbackInfo<v8::Value>&);
|
||||
static Nan::Persistent<v8::Function> constructor;
|
||||
|
||||
std::unique_ptr<Expression> expression;
|
||||
};
|
||||
|
||||
} // namespace node_mbgl
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "node_map.hpp"
|
||||
#include "node_logging.hpp"
|
||||
#include "node_request.hpp"
|
||||
#include "node_expression.hpp"
|
||||
|
||||
void RegisterModule(v8::Local<v8::Object> target, v8::Local<v8::Object> module) {
|
||||
// This has the effect of:
|
||||
@@ -20,6 +21,7 @@ void RegisterModule(v8::Local<v8::Object> target, v8::Local<v8::Object> module)
|
||||
|
||||
node_mbgl::NodeMap::Init(target);
|
||||
node_mbgl::NodeRequest::Init();
|
||||
node_mbgl::NodeExpression::Init(target);
|
||||
|
||||
// Exports Resource constants.
|
||||
v8::Local<v8::Object> resource = Nan::New<v8::Object>();
|
||||
|
||||
71
platform/node/test/expression.test.js
Normal file
71
platform/node/test/expression.test.js
Normal file
@@ -0,0 +1,71 @@
|
||||
'use strict';
|
||||
|
||||
var suite = require('../../../mapbox-gl-js/test/integration').expression;
|
||||
var mbgl = require('../index');
|
||||
var ignores = require('./ignores.json');
|
||||
|
||||
var tests;
|
||||
|
||||
if (process.argv[1] === __filename && process.argv.length > 2) {
|
||||
tests = process.argv.slice(2);
|
||||
}
|
||||
|
||||
function getExpectedType(spec) {
|
||||
if (spec.type === 'array') {
|
||||
const itemType = getExpectedType({ type: spec.value });
|
||||
const array = {
|
||||
kind: 'array',
|
||||
itemType: itemType || { kind: 'value' },
|
||||
};
|
||||
if (typeof spec.length === 'number') {
|
||||
array.N = spec.length;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
if (spec.type === 'enum') {
|
||||
return { kind: 'string' };
|
||||
}
|
||||
|
||||
return typeof spec.type === 'string' ? {kind: spec.type} : null;
|
||||
}
|
||||
|
||||
suite.run('native', {ignores: ignores, tests: tests}, (fixture) => {
|
||||
const compiled = {};
|
||||
const result = {
|
||||
compiled
|
||||
};
|
||||
|
||||
const spec = fixture.propertySpec || {};
|
||||
const expression = mbgl.Expression.parse(fixture.expression, getExpectedType(spec));
|
||||
|
||||
if (expression instanceof mbgl.Expression) {
|
||||
compiled.result = 'success';
|
||||
compiled.isFeatureConstant = expression.isFeatureConstant();
|
||||
compiled.isZoomConstant = expression.isZoomConstant();
|
||||
compiled.type = expression.getType();
|
||||
|
||||
const evaluate = fixture.inputs || [];
|
||||
const evaluateResults = [];
|
||||
for (const input of evaluate) {
|
||||
const feature = Object.assign({
|
||||
type: 'Feature',
|
||||
properties: {},
|
||||
geometry: { type: 'Point', coordinates: [0, 0] }
|
||||
}, input[1])
|
||||
|
||||
const output = expression.evaluate(input[0], feature);
|
||||
evaluateResults.push(output);
|
||||
}
|
||||
|
||||
if (fixture.inputs) {
|
||||
result.outputs = evaluateResults;
|
||||
}
|
||||
} else {
|
||||
compiled.result = 'error';
|
||||
compiled.errors = expression;
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
@@ -1,62 +1,39 @@
|
||||
{
|
||||
"expression-tests/curve/step": "https://github.com/mapbox/mapbox-gl-js/issues/5580",
|
||||
"expression-tests/curve/interpolate": "https://github.com/mapbox/mapbox-gl-js/issues/5580",
|
||||
"query-tests/circle-stroke-width/inside": "https://github.com/mapbox/mapbox-gl-native/issues/10307",
|
||||
"query-tests/geometry/multilinestring": "needs investigation",
|
||||
"query-tests/geometry/multipolygon": "needs investigation",
|
||||
"query-tests/geometry/polygon": "needs investigation",
|
||||
"query-tests/regressions/mapbox-gl-js#3534": "https://github.com/mapbox/mapbox-gl-native/issues/8193",
|
||||
"query-tests/regressions/mapbox-gl-js#4417": "https://github.com/mapbox/mapbox-gl-native/issues/8007",
|
||||
"query-tests/regressions/mapbox-gl-js#5554": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"query-tests/symbol/panned-after-insert": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"query-tests/symbol/rotated-after-insert": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"query-tests/symbol/rotated-inside": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"query-tests/symbol-features-in/pitched-screen": "https://github.com/mapbox/mapbox-gl-native/issues/6817",
|
||||
"query-tests/symbol-features-in/tilted-inside": "https://github.com/mapbox/mapbox-gl-native/issues/5056",
|
||||
"query-tests/symbol-features-in/tilted-outside": "https://github.com/mapbox/mapbox-gl-native/issues/9435",
|
||||
"query-tests/world-wrapping/box": "skip - needs issue",
|
||||
"query-tests/world-wrapping/point": "skip - needs issue",
|
||||
"render-tests/debug/collision-overscaled": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/collision-pitched-wrapped": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/collision-pitched": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/collision": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/tile-overscaled": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/collision-lines": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/debug/collision-lines-pitched": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/debug/collision-overscaled": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/collision-pitched": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/collision-pitched-wrapped": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/tile": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/debug/tile-overscaled": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
|
||||
"render-tests/extent/1024-circle": "needs investigation",
|
||||
"render-tests/extent/1024-symbol": "needs investigation",
|
||||
"render-tests/fill-extrusion-pattern/@2x": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/fill-extrusion-pattern/function-2": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/fill-extrusion-pattern/function": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/fill-extrusion-pattern/function-2": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/fill-extrusion-pattern/literal": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/fill-extrusion-pattern/missing": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/fill-extrusion-pattern/opacity": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
|
||||
"render-tests/geojson/inline-linestring-fill": "current behavior is arbitrary",
|
||||
"render-tests/geojson/inline-polygon-symbol": "behavior needs reconciliation with gl-js",
|
||||
"render-tests/icon-size/composite-function-high-base-plain": "https://github.com/mapbox/mapbox-gl-native/issues/8654",
|
||||
"render-tests/icon-size/composite-function-high-base-sdf": "https://github.com/mapbox/mapbox-gl-native/issues/8654",
|
||||
"render-tests/icon-text-fit/both-padding": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/both": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/height": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/width-padding": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/width": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/line-width/property-function": "https://github.com/mapbox/mapbox-gl-js/issues/3682#issuecomment-264348200",
|
||||
"render-tests/line-join/property-function": "https://github.com/mapbox/mapbox-gl-js/pull/5020",
|
||||
"render-tests/line-join/property-function-dasharray": "https://github.com/mapbox/mapbox-gl-js/pull/5020",
|
||||
"render-tests/line-opacity/step-curve": "https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/raster-masking/overlapping-zoom": "https://github.com/mapbox/mapbox-gl-native/issues/10195",
|
||||
"render-tests/regressions/mapbox-gl-js#2305": "https://github.com/mapbox/mapbox-gl-native/issues/6927",
|
||||
"render-tests/regressions/mapbox-gl-js#3682": "https://github.com/mapbox/mapbox-gl-js/issues/3682",
|
||||
"render-tests/regressions/mapbox-gl-js#5370": "skip - https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/regressions/mapbox-gl-native#7357": "https://github.com/mapbox/mapbox-gl-native/issues/7357",
|
||||
"render-tests/runtime-styling/image-add-sdf": "https://github.com/mapbox/mapbox-gl-native/issues/9847",
|
||||
"render-tests/runtime-styling/paint-property-fill-flat-to-extrude": "https://github.com/mapbox/mapbox-gl-native/issues/6745",
|
||||
"render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude": "https://github.com/mapbox/mapbox-gl-native/issues/6745",
|
||||
"render-tests/symbol-placement/line": "needs issue",
|
||||
"render-tests/text-font/camera-function": "https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/text-pitch-alignment/auto-text-rotation-alignment-map": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/map-text-rotation-alignment-map": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/viewport-overzoomed": "https://github.com/mapbox/mapbox-gl-js/issues/5095",
|
||||
"render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph": "https://github.com/mapbox/mapbox-gl-js/issues/5095",
|
||||
"render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-scaling/line-half": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-size/composite-expression": "https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/video/default": "skip - https://github.com/mapbox/mapbox-gl-native/issues/601",
|
||||
"render-tests/heatmap-color/default": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
"render-tests/heatmap-color/expression": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
"render-tests/heatmap-color/function": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
@@ -73,5 +50,50 @@
|
||||
"render-tests/heatmap-radius/pitch30": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
"render-tests/heatmap-weight/default": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
"render-tests/heatmap-weight/identity-property-function": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
"render-tests/heatmap-weight/literal": "https://github.com/mapbox/mapbox-gl-native/issues/10146"
|
||||
"render-tests/heatmap-weight/literal": "https://github.com/mapbox/mapbox-gl-native/issues/10146",
|
||||
"render-tests/icon-size/composite-function-high-base-plain": "https://github.com/mapbox/mapbox-gl-native/issues/8654",
|
||||
"render-tests/icon-size/composite-function-high-base-sdf": "https://github.com/mapbox/mapbox-gl-native/issues/8654",
|
||||
"render-tests/icon-text-fit/both": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/both-padding": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/height": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/placement-line": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/icon-text-fit/width": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/icon-text-fit/width-padding": "https://github.com/mapbox/mapbox-gl-native/issues/5602",
|
||||
"render-tests/line-join/property-function": "https://github.com/mapbox/mapbox-gl-js/pull/5020",
|
||||
"render-tests/line-join/property-function-dasharray": "https://github.com/mapbox/mapbox-gl-js/pull/5020",
|
||||
"render-tests/line-opacity/step-curve": "https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/line-width/property-function": "https://github.com/mapbox/mapbox-gl-js/issues/3682#issuecomment-264348200",
|
||||
"render-tests/mixed-zoom/z10-z11": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/raster-masking/overlapping-zoom": "https://github.com/mapbox/mapbox-gl-native/issues/10195",
|
||||
"render-tests/regressions/mapbox-gl-js#2305": "https://github.com/mapbox/mapbox-gl-native/issues/6927",
|
||||
"render-tests/regressions/mapbox-gl-js#3682": "https://github.com/mapbox/mapbox-gl-js/issues/3682",
|
||||
"render-tests/regressions/mapbox-gl-js#4647": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/regressions/mapbox-gl-js#5370": "skip - https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/regressions/mapbox-gl-js#5599": "https://github.com/mapbox/mapbox-gl-native/issues/10399",
|
||||
"render-tests/regressions/mapbox-gl-native#7357": "https://github.com/mapbox/mapbox-gl-native/issues/7357",
|
||||
"render-tests/runtime-styling/image-add-sdf": "https://github.com/mapbox/mapbox-gl-native/issues/9847",
|
||||
"render-tests/runtime-styling/paint-property-fill-flat-to-extrude": "https://github.com/mapbox/mapbox-gl-native/issues/6745",
|
||||
"render-tests/runtime-styling/set-style-glyphs": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/runtime-styling/set-style-paint-property-fill-flat-to-extrude": "https://github.com/mapbox/mapbox-gl-native/issues/6745",
|
||||
"render-tests/symbol-placement/line": "needs issue",
|
||||
"render-tests/symbol-placement/line-overscaled": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/symbol-placement/point": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/symbol-spacing/line-close": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/symbol-spacing/line-far": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/symbol-visibility/visible": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/text-font/camera-function": "https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/text-font/chinese": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/text-pitch-alignment/auto-text-rotation-alignment-map": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/auto-text-rotation-alignment-viewport": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/map-text-rotation-alignment-map": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/map-text-rotation-alignment-viewport": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/viewport-overzoomed": "https://github.com/mapbox/mapbox-gl-js/issues/5095",
|
||||
"render-tests/text-pitch-alignment/viewport-overzoomed-single-glyph": "https://github.com/mapbox/mapbox-gl-js/issues/5095",
|
||||
"render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-alignment/viewport-text-rotation-alignment-viewport": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-pitch-scaling/line-half": "https://github.com/mapbox/mapbox-gl-native/issues/9732",
|
||||
"render-tests/text-size/composite-expression": "https://github.com/mapbox/mapbox-gl-native/pull/9439",
|
||||
"render-tests/text-tile-edge-clipping/default": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/text-visibility/visible": "https://github.com/mapbox/mapbox-gl-native/pull/10103",
|
||||
"render-tests/video/default": "skip - https://github.com/mapbox/mapbox-gl-native/issues/601"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user