add shader plugin

This commit is contained in:
pengfei.zhou 2019-07-22 14:36:32 +08:00
parent 6b0b98a0ad
commit b73312d1e4
9 changed files with 63 additions and 11 deletions

View File

@ -5,6 +5,7 @@ import android.os.Bundle;
import com.github.penfeizhou.doric.DoricContext; import com.github.penfeizhou.doric.DoricContext;
import com.github.penfeizhou.doric.utils.DoricUtils; import com.github.penfeizhou.doric.utils.DoricUtils;
import com.github.pengfeizhou.jscore.JSONBuilder;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
@ -13,6 +14,7 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
DoricContext doricContext = DoricContext.create(this, DoricUtils.readAssetFile("demo.js"), "demo"); DoricContext doricContext = DoricContext.create(this, DoricUtils.readAssetFile("demo.js"), "demo");
doricContext.callEntity("__init__", new JSONBuilder().put("width", 100).put("height", 100));
doricContext.callEntity("log"); doricContext.callEntity("log");
} }
} }

View File

@ -2,6 +2,7 @@ package com.github.penfeizhou.doric;
import android.text.TextUtils; import android.text.TextUtils;
import com.github.penfeizhou.doric.plugin.ShaderPlugin;
import com.github.penfeizhou.doric.widget.ViewNode; import com.github.penfeizhou.doric.widget.ViewNode;
import com.github.penfeizhou.doric.utils.DoricMetaInfo; import com.github.penfeizhou.doric.utils.DoricMetaInfo;
import com.github.penfeizhou.doric.plugin.DoricJavaPlugin; import com.github.penfeizhou.doric.plugin.DoricJavaPlugin;
@ -36,6 +37,7 @@ public class DoricRegistry {
} }
public DoricRegistry() { public DoricRegistry() {
this.registerNativePlugin(ShaderPlugin.class);
this.registerNativePlugin(ModalPlugin.class); this.registerNativePlugin(ModalPlugin.class);
initRegistry(this); initRegistry(this);
} }

View File

@ -0,0 +1,31 @@
package com.github.penfeizhou.doric.plugin;
import com.github.penfeizhou.doric.DoricContext;
import com.github.penfeizhou.doric.extension.bridge.DoricMethod;
import com.github.penfeizhou.doric.extension.bridge.DoricPlugin;
import com.github.penfeizhou.doric.utils.DoricLog;
import com.github.pengfeizhou.jscore.JSDecoder;
import com.github.pengfeizhou.jscore.JSObject;
/**
* @Description: com.github.penfeizhou.doric.plugin
* @Author: pengfei.zhou
* @CreateDate: 2019-07-22
*/
@DoricPlugin(name = "shader")
public class ShaderPlugin extends DoricJavaPlugin {
public ShaderPlugin(DoricContext doricContext) {
super(doricContext);
}
@DoricMethod
public void render(JSDecoder jsDecoder) {
try {
JSObject jsObject = jsDecoder.decode().asObject();
} catch (Exception e) {
e.printStackTrace();
DoricLog.e("Shader.render:error%s", e.getLocalizedMessage());
}
}
}

View File

@ -10,6 +10,7 @@ import android.view.WindowManager;
import com.github.penfeizhou.doric.Doric; import com.github.penfeizhou.doric.Doric;
import com.github.pengfeizhou.jscore.JSArray; import com.github.pengfeizhou.jscore.JSArray;
import com.github.pengfeizhou.jscore.JSDecoder; import com.github.pengfeizhou.jscore.JSDecoder;
import com.github.pengfeizhou.jscore.JSONBuilder;
import com.github.pengfeizhou.jscore.JSValue; import com.github.pengfeizhou.jscore.JSValue;
import com.github.pengfeizhou.jscore.JavaValue; import com.github.pengfeizhou.jscore.JavaValue;
@ -52,6 +53,8 @@ public class DoricUtils {
public static JavaValue toJavaValue(Object arg) { public static JavaValue toJavaValue(Object arg) {
if (arg == null) { if (arg == null) {
return new JavaValue(); return new JavaValue();
} else if (arg instanceof JSONBuilder) {
return new JavaValue(((JSONBuilder) arg).toJSONObject());
} else if (arg instanceof JSONObject) { } else if (arg instanceof JSONObject) {
return new JavaValue((JSONObject) arg); return new JavaValue((JSONObject) arg);
} else if (arg instanceof String) { } else if (arg instanceof String) {

View File

@ -1,12 +1,18 @@
import { NativeCall, Text, Alignment, Color, VLayout, Panel, log, logw, loge } from "./index" import { NativeCall, Text, Alignment, Color, VLayout, Panel, log, logw, loge } from "./index"
import { Group } from "./src/ui/view";
@Entry @Entry
export class MyPage extends Panel { export class MyPage extends Panel {
build() {
return new Text build(rootView: Group): void {
log('build view')
const text = new Text
text.text = "hello"
rootView.children.push(text)
} }
@NativeCall @NativeCall
log() { log() {
log("Hello.HEGO") log("Hello.HEGO")

View File

@ -26,6 +26,7 @@ export default [
plugins: [ plugins: [
resolve({ jsnext: true, main: true }), resolve({ jsnext: true, main: true }),
], ],
external: ['reflect-metadata']
}, },
{ {
input: "build/demo.js", input: "build/demo.js",

View File

@ -1,5 +1,5 @@
import { Context } from "./sandbox"; import { Context } from "./sandbox";
require('reflect-metadata'); export * from 'reflect-metadata'
declare global { declare global {
const context: Context; const context: Context;

View File

@ -1,6 +1,8 @@
import { } from './../runtime/global'; import './../runtime/global'
import { View, Stack, Group } from "./view"; import { View, Stack, Group } from "./view";
import { loge, log } from '../util/log'; import { loge, log } from '../util/log';
import { Model } from '../util/types';
import { Context } from '../runtime/sandbox';
export function NativeCall(target: Panel, propertyKey: string, descriptor: PropertyDescriptor) { export function NativeCall(target: Panel, propertyKey: string, descriptor: PropertyDescriptor) {
@ -15,7 +17,7 @@ export function NativeCall(target: Panel, propertyKey: string, descriptor: Prope
type Frame = { width: number, height: number } type Frame = { width: number, height: number }
export abstract class Panel { export abstract class Panel {
context?: Context
onCreate() { } onCreate() { }
onDestory() { } onDestory() { }
onShow() { } onShow() { }
@ -35,6 +37,7 @@ export abstract class Panel {
@NativeCall @NativeCall
private __init__(frame: Frame, data: any) { private __init__(frame: Frame, data: any) {
log('__init__:', frame, data)
this.__data__ = data this.__data__ = data
this.__rootView__.width = frame.width this.__rootView__.width = frame.width
this.__rootView__.height = frame.height this.__rootView__.height = frame.height
@ -88,15 +91,19 @@ export abstract class Panel {
}, this.__rootView__) }, this.__rootView__)
} }
private nativeRender(model: Model) {
if (this.context) {
this.context.bridge.shader_render(model)
}
}
private hookBeforeNativeCall() { private hookBeforeNativeCall() {
log('__hookBeforeNativeCall__')
} }
private hookAfterNativeCall() { private hookAfterNativeCall() {
log('__hookAfterNativeCall__')
if (this.__rootView__.isDirty()) { if (this.__rootView__.isDirty()) {
const model = this.__rootView__.toModel() const model = this.__rootView__.toModel()
log('needRefresh:' + JSON.stringify(model)) this.nativeRender(model)
this.__rootView__.clean() this.__rootView__.clean()
} }
} }

View File

@ -119,13 +119,13 @@ export abstract class View implements Modeling {
clean() { clean() {
for (const key in this.__dirty_props__) { for (const key in this.__dirty_props__) {
if (this.__dirty_props__.hasOwnProperty(key)) { if (Reflect.has(this.__dirty_props__, key)) {
this.__dirty_props__[key] = undefined Reflect.deleteProperty(this.__dirty_props__, key)
} }
} }
} }
isDirty() { isDirty() {
return Reflect.ownKeys(this.__dirty_props__).length === 0 return Reflect.ownKeys(this.__dirty_props__).length !== 0
} }
responseCallback(id: string, ...args: any) { responseCallback(id: string, ...args: any) {
const f = this.id2Callback(id) const f = this.id2Callback(id)