Skip to content

Commit

Permalink
Merge pull request #128 from fe/nezha/feat/path_2d
Browse files Browse the repository at this point in the history
[FEAT][1.81.0][NEZ] support path2d for JS
  • Loading branch information
edmond-l-20230331 authored and GitHub Enterprise committed Mar 21, 2024
2 parents 77c9916 + b6dfc88 commit f67e7bf
Show file tree
Hide file tree
Showing 22 changed files with 282 additions and 29 deletions.
4 changes: 2 additions & 2 deletions .cicd/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ pipeline:
npm i
# BUILD_ID=92
ANDROID_BINARY_URL="https://flow-static.toolsfdg.net/artifact/binance-github/fe/webf/${CI_BUILD_NUMBER}/build/android_binary.zip"
IOS_BINARY_URL="https://flow-static.toolsfdg.net/artifact/binance-github/fe/webf/${CI_BUILD_NUMBER}/build/ios_binary.zip"
ANDROID_BINARY_URL="https://flow-static.toolsfdg.net/artifact/mainsite-github/fe/webf/${CI_BUILD_NUMBER}/build/android_binary.zip"
IOS_BINARY_URL="https://flow-static.toolsfdg.net/artifact/mainsite-github/fe/webf/${CI_BUILD_NUMBER}/build/ios_binary.zip"
# echo "Uploaded zip url: $ANDROID_BINARY_URL" >> $CL_PLUGIN_IOS_WEA_CONTENT_FILE
# echo "Uploaded zip url: $IOS_BINARY_URL" >> $CL_PLUGIN_IOS_WEA_CONTENT_FILE
Expand Down
2 changes: 2 additions & 0 deletions bridge/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ if ($ENV{WEBF_JS_ENGINE} MATCHES "quickjs")
core/html/canvas/canvas_rendering_context_2d.cc
core/html/canvas/canvas_gradient.cc
core/html/canvas/canvas_pattern.cc
core/html/canvas/path_2d.cc
core/geometry/dom_matrix.cc
core/geometry/dom_matrix_readonly.cc
core/html/forms/html_button_element.cc
Expand Down Expand Up @@ -552,6 +553,7 @@ if ($ENV{WEBF_JS_ENGINE} MATCHES "quickjs")
out/qjs_canvas_rendering_context.cc
out/qjs_canvas_gradient.cc
out/qjs_canvas_pattern.cc
out/qjs_path_2d.cc
out/qjs_dom_matrix.cc
out/qjs_dom_matrix_readonly.cc
out/qjs_union_dom_string_sequencedouble.cc
Expand Down
2 changes: 2 additions & 0 deletions bridge/bindings/qjs/binding_initializer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "qjs_bounding_client_rect.h"
#include "qjs_canvas_gradient.h"
#include "qjs_canvas_pattern.h"
#include "qjs_path_2d.h"
#include "qjs_canvas_rendering_context.h"
#include "qjs_canvas_rendering_context_2d.h"
#include "qjs_character_data.h"
Expand Down Expand Up @@ -180,6 +181,7 @@ void InstallBindings(ExecutingContext* context) {
QJSCanvasRenderingContext2D::Install(context);
QJSCanvasPattern::Install(context);
QJSCanvasGradient::Install(context);
QJSPath2D::Install(context);
QJSDOMMatrixReadonly::Install(context);
QJSDOMMatrix::Install(context);
QJSCSSStyleDeclaration::Install(context);
Expand Down
1 change: 1 addition & 0 deletions bridge/bindings/qjs/wrapper_type_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ enum {
JS_CLASS_CANVAS_RENDERING_CONTEXT_2_D,
JS_CLASS_CANVAS_GRADIENT,
JS_CLASS_CANVAS_PATTERN,
JS_CLASS_PATH_2_D,
JS_CLASS_DOM_MATRIX,
JS_CLASS_DOM_MATRIX_READONLY,
JS_CLASS_HTML_TEMPLATE_ELEMENT,
Expand Down
1 change: 1 addition & 0 deletions bridge/core/binding_call_methods.json5
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
"scale",
"strokeText",
"setTransform",
"addPath",
"transform",
"translate",
"reset",
Expand Down
5 changes: 4 additions & 1 deletion bridge/core/binding_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ enum BindingMethodCallOperations {
kAsyncAnonymousFunction,
};

enum CreateBindingObjectType { kCreateDOMMatrix = 0 };
enum CreateBindingObjectType {
kCreateDOMMatrix = 0,
kCreatePath2D = 1,
};

struct BindingObjectPromiseContext : public DartReadable {
ExecutingContext* context;
Expand Down
7 changes: 7 additions & 0 deletions bridge/core/geometry/dom_matrix.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ DOMMatrix* DOMMatrix::Create(ExecutingContext* context,
return MakeGarbageCollected<DOMMatrix>(context, init, exception_state);
}

DOMMatrix* DOMMatrix::Create(webf::ExecutingContext* context, webf::ExceptionState& exception_state) {
return MakeGarbageCollected<DOMMatrix>(context, exception_state);
}

DOMMatrix::DOMMatrix(webf::ExecutingContext* context, webf::ExceptionState& exception_state):
DOMMatrixReadonly(context, exception_state) {}

DOMMatrix::DOMMatrix(ExecutingContext* context,
const std::shared_ptr<QJSUnionDomStringSequenceDouble>& init,
ExceptionState& exception_state)
Expand Down
2 changes: 1 addition & 1 deletion bridge/core/geometry/dom_matrix.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
interface DOMMatrix extends DOMMatrixReadonly {
new(init: string | double[]): DOMMatrix;
new(init?: string | double[]): DOMMatrix;
}
4 changes: 4 additions & 0 deletions bridge/core/geometry/dom_matrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,12 @@ class DOMMatrix : public DOMMatrixReadonly {
static DOMMatrix* Create(ExecutingContext* context,
const std::shared_ptr<QJSUnionDomStringSequenceDouble>& init,
ExceptionState& exception_state);
static DOMMatrix* Create(ExecutingContext* context,
ExceptionState& exception_state);

DOMMatrix() = delete;
explicit DOMMatrix(ExecutingContext* context,
ExceptionState& exception_state);
explicit DOMMatrix(ExecutingContext* context,
const std::shared_ptr<QJSUnionDomStringSequenceDouble>& init,
ExceptionState& exception_state);
Expand Down
7 changes: 7 additions & 0 deletions bridge/core/geometry/dom_matrix_readonly.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ DOMMatrixReadonly::DOMMatrixReadonly(ExecutingContext* context,
CreateBindingObjectType::kCreateDOMMatrix, arguments, 1);
}

DOMMatrixReadonly::DOMMatrixReadonly(webf::ExecutingContext* context, webf::ExceptionState& exception_state)
: BindingObject(context->ctx()) {
GetExecutingContext()->dartMethodPtr()->createBindingObject(GetExecutingContext()->isDedicated(),
GetExecutingContext()->contextId(), bindingObject(),
CreateBindingObjectType::kCreateDOMMatrix, nullptr, 0);
}

NativeValue DOMMatrixReadonly::HandleCallFromDartSide(const AtomicString& method,
int32_t argc,
const NativeValue* argv,
Expand Down
2 changes: 2 additions & 0 deletions bridge/core/geometry/dom_matrix_readonly.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class DOMMatrixReadonly : public BindingObject {
explicit DOMMatrixReadonly(ExecutingContext* context,
const std::shared_ptr<QJSUnionDomStringSequenceDouble>& init,
ExceptionState& exception_state);
explicit DOMMatrixReadonly(ExecutingContext* context,
ExceptionState& exception_state);

NativeValue HandleCallFromDartSide(const AtomicString& method,
int32_t argc,
Expand Down
8 changes: 5 additions & 3 deletions bridge/core/html/canvas/canvas_rendering_context_2d.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ interface CanvasRenderingContext2D extends CanvasRenderingContext {
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): DartImpl<void>;
clearRect(x: number, y: number, w: number, h: number): DartImpl<void>;
closePath(): DartImpl<void>;
clip(path?: string): DartImpl<void>;
clip(fillRule?: string): DartImpl<void>;
clip(path: Path2D, fillRule?: string): DartImpl<void>;
drawImage(image: HTMLImageElement, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): DartImpl<void>;
drawImage(image: HTMLImageElement, dx: number, dy: number, dw: number, dh: number): DartImpl<void>;
drawImage(image: HTMLImageElement, dx: number, dy: number): DartImpl<void>;
ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean): DartImpl<void>;
fill(path?: string): DartImpl<void>;
fill(fillRule?: string): DartImpl<void>;
fill(path: Path2D, fillRule?: string): DartImpl<void>;
fillRect(x: number, y: number, w: number, h: number): DartImpl<void>;
fillText(text: string, x: number, y: number, maxWidth?: number): DartImpl<void>;
lineTo(x: number, y: number): DartImpl<void>;
Expand All @@ -36,7 +38,7 @@ interface CanvasRenderingContext2D extends CanvasRenderingContext {
resetTransform(): DartImpl<void>;
rotate(angle: number): DartImpl<void>;
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): DartImpl<void>;
stroke(): DartImpl<void>;
stroke(path?: Path2D): DartImpl<void>;
strokeRect(x: number, y: number, w: number, h: number): DartImpl<void>;
save(): DartImpl<void>;
scale(x: number, y: number): DartImpl<void>;
Expand Down
1 change: 1 addition & 0 deletions bridge/core/html/canvas/canvas_rendering_context_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "canvas_gradient.h"
#include "canvas_pattern.h"
#include "path_2d.h"
#include "canvas_rendering_context.h"
#include "qjs_union_dom_stringcanvas_gradient.h"
#include "qjs_unionhtml_image_elementhtml_canvas_element.h"
Expand Down
41 changes: 41 additions & 0 deletions bridge/core/html/canvas/path_2d.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright (C) 2022-present The WebF authors. All rights reserved.
*/

#include "path_2d.h"
#include "binding_call_methods.h"
#include "foundation/native_value_converter.h"

namespace webf {

Path2D* Path2D::Create(ExecutingContext* context, ExceptionState& exception_state) {
return MakeGarbageCollected<Path2D>(context, exception_state);
}

Path2D::Path2D(ExecutingContext* context, ExceptionState& exception_state)
: BindingObject(context->ctx()) {
NativeValue arguments[0];
GetExecutingContext()->dartMethodPtr()->createBindingObject(GetExecutingContext()->isDedicated(),
GetExecutingContext()->contextId(), bindingObject(),
CreateBindingObjectType::kCreatePath2D, arguments, 0);
}

void Path2D::addPath(Path2D* path, DOMMatrixReadonly* dom_matrix, ExceptionState& exception_state) {
NativeValue arguments[] = {NativeValueConverter<NativeTypePointer<Path2D>>::ToNativeValue(path),
NativeValueConverter<NativeTypePointer<DOMMatrixReadonly>>::ToNativeValue(dom_matrix)};
InvokeBindingMethod(binding_call_methods::kaddPath, 2, arguments, exception_state);
}

void Path2D::addPath(webf::Path2D* path, webf::ExceptionState& exception_state) {
NativeValue arguments[] = {NativeValueConverter<NativeTypePointer<Path2D>>::ToNativeValue(path)};
InvokeBindingMethod(binding_call_methods::kaddPath, 1, arguments, exception_state);
}

NativeValue Path2D::HandleCallFromDartSide(const AtomicString& method,
int32_t argc,
const NativeValue* argv,
Dart_Handle dart_object) {
return Native_NewNull();
}

} // namespace webf
13 changes: 13 additions & 0 deletions bridge/core/html/canvas/path_2d.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
interface Path2D {
closePath(): DartImpl<void>;
moveTo(x: number, y: number): DartImpl<void>;
lineTo(x: number, y: number): DartImpl<void>;
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): DartImpl<void>;
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): DartImpl<void>;
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): DartImpl<void>;
arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): DartImpl<void>;
ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean): DartImpl<void>;
rect(x: number, y: number, w: number, h: number): DartImpl<void>;
addPath(path: Path2D, matrix?: DOMMatrix): void;
new(): Path2D;
}
37 changes: 37 additions & 0 deletions bridge/core/html/canvas/path_2d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright (C) 2022-present The WebF authors. All rights reserved.
*/

#ifndef WEBF_CORE_HTML_CANVAS_CANVAS_PATH_2D_H_
#define WEBF_CORE_HTML_CANVAS_CANVAS_PATH_2D_H_

#include "bindings/qjs/script_wrappable.h"
#include "core/binding_object.h"
#include "core/geometry/dom_matrix.h"

namespace webf {

class Path2D : public BindingObject {
DEFINE_WRAPPERTYPEINFO();

public:
using ImplType = Path2D*;
static Path2D* Create(ExecutingContext* context, ExceptionState& exception_state);
Path2D() = delete;

explicit Path2D(ExecutingContext* context, ExceptionState& exception_state);

void addPath(Path2D* path, DOMMatrixReadonly* dom_matrix, ExceptionState& exception_state);
void addPath(Path2D* path, ExceptionState& exception_state);

NativeValue HandleCallFromDartSide(const AtomicString& method,
int32_t argc,
const NativeValue* argv,
Dart_Handle dart_object) override;

private:
}; // namespace webf

}

#endif // WEBF_CORE_HTML_CANVAS_CANVAS_PATH_2D_H_a
2 changes: 1 addition & 1 deletion bridge/scripts/code_generator/src/idl/generateSource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ function generateNativeValueTypeConverter(type: ParameterType): string {
function generateRequiredInitBody(argument: FunctionArguments, argsIndex: number) {
let type = generateIDLTypeConverter(argument.type, !argument.required);

let hasArgumentCheck = type.indexOf('Element') >= 0 || type.indexOf('Node') >= 0 || type === 'EventTarget' || type.indexOf('DOMMatrix') >= 0;
let hasArgumentCheck = type.indexOf('Element') >= 0 || type.indexOf('Node') >= 0 || type === 'EventTarget' || type.indexOf('DOMMatrix') >= 0 || type.indexOf('Path2D') >= 0;

let body = '';
if (argument.isDotDotDot) {
Expand Down
9 changes: 8 additions & 1 deletion webf/lib/src/bridge/binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:webf/html.dart';
import 'package:webf/geometry.dart';
import 'package:webf/foundation.dart';
import 'package:webf/launcher.dart';
import 'package:webf/src/html/canvas/canvas_path_2d.dart';

// We have some integrated built-in behavior starting with string prefix reuse the callNativeMethod implements.
enum BindingMethodCallOperations {
Expand Down Expand Up @@ -98,7 +99,8 @@ void _dispatchEventToNative(Event event, bool isCapture) {
}

enum CreateBindingObjectType {
createDOMMatrix
createDOMMatrix,
createPath2D,
}

abstract class BindingBridge {
Expand All @@ -119,6 +121,11 @@ abstract class BindingBridge {
controller.view.setBindingObject(pointer, domMatrix);
return;
}
case CreateBindingObjectType.createPath2D: {
Path2D path2D = Path2D(context: BindingContext(controller.view, contextId, pointer), path2DInit: arguments);
controller.view.setBindingObject(pointer, path2D);
return;
}
}
}

Expand Down
8 changes: 7 additions & 1 deletion webf/lib/src/css/text.dart
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,13 @@ mixin CSSTextMixin on RenderStyle {
@override
CSSLengthValue get lineHeight {
if ((_lineHeight == null || target.style.getPropertyValue(LINE_HEIGHT) == INHERIT) && parent != null) {
return parent!.lineHeight;
var value = parent!.lineHeight;
// When a unitless number is used, it's a multiplier for the font-size of the element, not the font-size of the parent element.
if (_lineHeight == null && value.value != null && value.type == CSSLengthType.EM) {
value = CSSLength.parseLength('${value.value}EM', this, LINE_HEIGHT);
_lineHeight = value;
}
return value;
}

return _lineHeight ?? CSSText.DEFAULT_LINE_HEIGHT;
Expand Down
3 changes: 2 additions & 1 deletion webf/lib/src/geometry/dom_matrix_readonly.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import 'package:webf/foundation.dart';

class DOMMatrixReadonly extends BindingObject {
DOMMatrixReadonly(BindingContext context, List<dynamic> domMatrixInit): super(context);
final List<dynamic> domMatrixInit;
DOMMatrixReadonly(BindingContext context, this.domMatrixInit): super(context);

@override
void initializeMethods(Map<String, BindingObjectMethod> methods) {
Expand Down
Loading

0 comments on commit f67e7bf

Please sign in to comment.