Last active
November 1, 2016 19:14
-
-
Save mattpodwysocki/f477a5d3770980ea7c6a552e14052b06 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "csslayoutnode.h" | |
Nan::Persistent<v8::Function> CSSLayoutNode::constructor; | |
CSSLayoutNode::CSSLayoutNode(v8::Local<v8::Object> self) { | |
this->_node = CSSNodeNew(); | |
CSSNodeInit(this->_node); | |
CSSNodeSetContext(this->_node, *self); | |
} | |
CSSLayoutNode::~CSSLayoutNode() { | |
} | |
void CSSLayoutNode::Init(v8::Local<v8::Object> exports) { | |
Nan::HandleScope scope; | |
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New); | |
tpl->SetClassName(Nan::New("CSSLayoutNode").ToLocalChecked()); | |
tpl->InstanceTemplate()->SetInternalFieldCount(1); | |
Nan::SetPrototypeMethod(tpl, "free", Free); | |
Nan::SetPrototypeMethod(tpl, "freeRecursive", FreeRecursive); | |
Nan::SetPrototypeMethod(tpl, "markDirty", MarkDirty); | |
Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New("isDirty").ToLocalChecked(), GetIsDirty); | |
CSSNODE_GETTER_SETTER(isTextNode, IsTextNode); | |
CSSNODE_GETTER_SETTER(hasNewLayout, HasNewLayout); | |
CSSNODE_GETTER_SETTER(styleDirection, StyleDirection); | |
CSSNODE_GETTER_SETTER(flexDirection, FlexDirection); | |
CSSNODE_GETTER_SETTER(justifyContent, JustifyContent); | |
CSSNODE_GETTER_SETTER(alignContent, AlignContent); | |
CSSNODE_GETTER_SETTER(alignItems, AlignItems); | |
CSSNODE_GETTER_SETTER(alignSelf, AlignSelf); | |
CSSNODE_GETTER_SETTER(positionType, PositionType); | |
CSSNODE_GETTER_SETTER(wrap, Wrap); | |
CSSNODE_GETTER_SETTER(overflow, Overflow); | |
CSSNODE_GETTER_SETTER(flex, Flex); | |
CSSNODE_GETTER_SETTER(flexGrow, FlexGrow); | |
CSSNODE_GETTER_SETTER(flexShrink, FlexShrink); | |
CSSNODE_GETTER_SETTER(flexBasis, FlexBasis); | |
Nan::SetMethod(tpl, "instanceCount", InstanceCount); | |
constructor.Reset(tpl->GetFunction()); | |
exports->Set(Nan::New("CSSLayoutNode").ToLocalChecked(), tpl->GetFunction()); | |
} | |
NAN_METHOD(CSSLayoutNode::New) { | |
if (!info.IsConstructCall()) { | |
Nan::ThrowReferenceError("CSSLayoutNode requires new to instantiate."); | |
} | |
v8::Local<v8::Object> self = info.This(); | |
CSSLayoutNode* obj = new CSSLayoutNode(self); | |
obj->Wrap(self); | |
info.GetReturnValue().Set(self); | |
} | |
NAN_METHOD(CSSLayoutNode::Free) { | |
CSSNODE_ASSERT | |
CSSNodeFree(obj->_node); | |
obj->_node = nullptr; | |
} | |
NAN_METHOD(CSSLayoutNode::FreeRecursive) { | |
CSSNODE_ASSERT | |
CSSNodeFreeRecursive(obj->_node); | |
obj->_node = nullptr; | |
} | |
NAN_METHOD(CSSLayoutNode::ValueIsUndefined) { | |
float value = static_cast<float>(info[0]->NumberValue()); | |
info.GetReturnValue().Set(Nan::New(CSSValueIsUndefined(value))); | |
} | |
NAN_GETTER(CSSLayoutNode::GetIsDirty) { | |
CSSNODE_ASSERT | |
info.GetReturnValue().Set(Nan::New(CSSNodeIsDirty(obj->_node))); | |
} | |
NAN_METHOD(CSSLayoutNode::MarkDirty) { | |
CSSNODE_ASSERT | |
CSSNodeMarkDirty(obj->_node); | |
} | |
NAN_METHOD(CSSLayoutNode::InstanceCount) { | |
int32_t count = CSSNodeGetInstanceCount(); | |
info.GetReturnValue().Set(Nan::New(count)); | |
} | |
NAN_GETTER(CSSLayoutNode::GetIsTextNode) { | |
CSSNODE_ASSERT | |
info.GetReturnValue().Set(Nan::New(CSSNodeGetIsTextnode(obj->_node))); | |
} | |
NAN_SETTER(CSSLayoutNode::SetIsTextNode) { | |
V8BOOLEAN_ASSERT | |
CSSNODE_ASSERT | |
bool bValue = value->BooleanValue(); | |
CSSNodeSetIsTextnode(obj->_node, bValue); | |
} | |
NAN_GETTER(CSSLayoutNode::GetHasNewLayout) { | |
CSSNODE_ASSERT | |
info.GetReturnValue().Set(Nan::New(CSSNodeGetHasNewLayout(obj->_node))); | |
} | |
NAN_SETTER(CSSLayoutNode::SetHasNewLayout) { | |
V8BOOLEAN_ASSERT | |
CSSNODE_ASSERT | |
bool bValue = value->BooleanValue(); | |
CSSNodeSetHasNewLayout(obj->_node, bValue); | |
} | |
CSSNODE_PROP_ENUM(StyleDirection, Direction, CSSDirection, 0, 2); | |
CSSNODE_PROP_ENUM(FlexDirection, FlexDirection, CSSFlexDirection, 0, 4); | |
CSSNODE_PROP_ENUM(JustifyContent, JustifyContent, CSSJustify, 0, 4); | |
CSSNODE_PROP_ENUM(AlignContent, AlignContent, CSSAlign, 0, 4); | |
CSSNODE_PROP_ENUM(AlignItems, AlignItems, CSSAlign, 0, 4); | |
CSSNODE_PROP_ENUM(AlignSelf, AlignSelf, CSSAlign, 0, 4); | |
CSSNODE_PROP_ENUM(PositionType, PositionType, CSSPositionType, 0, 1); | |
CSSNODE_PROP_ENUM(Wrap, FlexWrap, CSSWrapType, 0, 1); | |
CSSNODE_PROP_ENUM(Overflow, Overflow, CSSOverflow, 0, 2); | |
CSSNODE_PROP_FLOAT(Flex, Flex); | |
CSSNODE_PROP_FLOAT(FlexGrow, FlexGrow); | |
CSSNODE_PROP_FLOAT(FlexShrink, FlexShrink); | |
CSSNODE_PROP_FLOAT(FlexBasis, FlexBasis); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef CSSLAYOUT_H | |
#define CSSLAYOUT_H | |
#include <nan.h> | |
#include "CSSLayout.h" | |
#ifndef CSSNODE_GETTER_SETTER | |
#define CSSNODE_GETTER_SETTER(NAME, PROP) \ | |
Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New(#NAME).ToLocalChecked(), Get##PROP, Set##PROP); | |
#endif | |
#ifndef CSSNODE_ASSERT | |
#define CSSNODE_ASSERT \ | |
CSSLayoutNode* obj = ObjectWrap::Unwrap<CSSLayoutNode>(info.Holder()); \ | |
if (obj->_node == nullptr) { \ | |
Nan::ThrowReferenceError("CSSLayoutNode has been freed."); \ | |
} | |
#endif | |
#ifndef V8BOOLEAN_ASSERT | |
#define V8BOOLEAN_ASSERT \ | |
if (!value->IsBoolean()) { \ | |
Nan::ThrowTypeError("argument must be a Boolean"); \ | |
} | |
#endif | |
#ifndef V8INT32_ASSERT | |
#define V8INT32_ASSERT \ | |
if (!value->IsInt32()) { \ | |
Nan::ThrowTypeError("argument must be an integer"); \ | |
} | |
#endif | |
#ifndef V8NUMBER_ASSERT | |
#define V8NUMBER_ASSERT \ | |
if (!value->IsNumber()) { \ | |
Nan::ThrowTypeError("argument must be a number"); \ | |
} | |
#endif | |
#ifndef V8RANGE_ASSERT | |
#define V8RANGE_ASSERT(MIN, MAX) \ | |
int32_t iValue = value->Int32Value(); \ | |
if (iValue < MIN || iValue > MAX) { \ | |
Nan::ThrowRangeError("argument out of range"); \ | |
} | |
#endif | |
#ifndef CSSNODE_PROPERTY | |
#define CSSNODE_PROPERTY(PROP) \ | |
static NAN_GETTER(Get##PROP); \ | |
static NAN_SETTER(Set##PROP); | |
#endif | |
#ifndef CSSNODE_PROP_ENUM | |
#define CSSNODE_PROP_ENUM(PROP, NATIVE, ENUM, MIN, MAX) \ | |
NAN_GETTER(CSSLayoutNode::Get##PROP) { \ | |
CSSNODE_ASSERT \ | |
info.GetReturnValue().Set(Nan::New((int32_t)CSSNodeStyleGet##NATIVE(obj->_node))); \ | |
} \ | |
\ | |
NAN_SETTER(CSSLayoutNode::Set##PROP) { \ | |
V8INT32_ASSERT \ | |
CSSNODE_ASSERT \ | |
V8RANGE_ASSERT(MIN, MAX) \ | |
CSSNodeStyleSet##NATIVE(obj->_node, (ENUM)iValue); \ | |
} | |
#endif | |
#ifndef CSSNODE_PROP_FLOAT | |
#define CSSNODE_PROP_FLOAT(PROP, NATIVE) \ | |
NAN_GETTER(CSSLayoutNode::Get##PROP) { \ | |
CSSNODE_ASSERT \ | |
info.GetReturnValue().Set(Nan::New(CSSNodeStyleGet##NATIVE(obj->_node))); \ | |
} \ | |
\ | |
NAN_SETTER(CSSLayoutNode::Set##PROP) { \ | |
V8NUMBER_ASSERT; \ | |
CSSNODE_ASSERT; \ | |
float fValue = static_cast<float>(value->NumberValue()); \ | |
CSSNodeStyleSet##NATIVE(obj->_node, fValue); \ | |
} | |
#endif | |
class CSSLayoutNode : public Nan::ObjectWrap { | |
public: | |
static void Init(v8::Local<v8::Object> exports); | |
private: | |
explicit CSSLayoutNode(v8::Local<v8::Object> self); | |
~CSSLayoutNode(); | |
static NAN_METHOD(New); | |
static NAN_METHOD(Free); | |
static NAN_METHOD(FreeRecursive); | |
static NAN_METHOD(ValueIsUndefined); | |
static NAN_GETTER(GetIsDirty); | |
static NAN_METHOD(MarkDirty); | |
static NAN_METHOD(InstanceCount); | |
// CSS_NODE_PROPERTY | |
CSSNODE_PROPERTY(IsTextNode); | |
CSSNODE_PROPERTY(HasNewLayout); | |
// CSS_NODE_STYLE_PROPERTY | |
CSSNODE_PROPERTY(StyleDirection); | |
CSSNODE_PROPERTY(FlexDirection); | |
CSSNODE_PROPERTY(JustifyContent); | |
CSSNODE_PROPERTY(AlignContent); | |
CSSNODE_PROPERTY(AlignItems); | |
CSSNODE_PROPERTY(AlignSelf); | |
CSSNODE_PROPERTY(PositionType); | |
CSSNODE_PROPERTY(Wrap); | |
CSSNODE_PROPERTY(Overflow); | |
CSSNODE_PROPERTY(Flex); | |
CSSNODE_PROPERTY(FlexGrow); | |
CSSNODE_PROPERTY(FlexShrink); | |
CSSNODE_PROPERTY(FlexBasis); | |
static Nan::Persistent<v8::Function> constructor; | |
CSSNodeRef _node; | |
}; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment