예제 #1
0
void Manager::updateTitleBuffer()
{
   bool active = isActive();

   Static * s = Static::instance();

   TQRect tr = titleSpacer_->tqgeometry();

   if (tr.width() == 0 || tr.height() == 0)
      titleBuf_.resize(8, 8);
   else
      titleBuf_.resize(tr.size());

   TQPainter p(&titleBuf_);

   p.drawPixmap(0, 0, s->titleTextLeft(active));

   p.drawTiledPixmap(3, 0, tr.width() - 6, Static::instance()->titleHeight(),
                     s->titleTextMid(active));

   p.setPen(options()->color(KDecorationOptions::ColorFont, active));

   p.setFont(options()->font(active));

   p.drawText(4, 2, tr.width() - 8, Static::instance()->titleHeight() - 4,
              AlignCenter, caption());

   p.drawPixmap(tr.width() - 3, 0, s->titleTextRight(active));
}
예제 #2
0
FOG_NO_EXPORT void Object_fini(void)
{
  // Destroy the shared ObjectExtra instance.
  Object_extraNull.destroy();

  // Destroy the memory pools.
  Object_memPoolConn.destroy();
  Object_memPoolExtra.destroy();

  // Destroy the locks.
  Object_memPoolLock.destroy();
  Object::_internalLock.destroy();
}
예제 #3
0
int main()
{
	Shared shlib;
	Static stlib;

	std::cout << "Static library subtract(5, 3): ";
	std::cout << stlib.subtract(5, 3) << std::endl;

	std::cout << "Shared library add(4, 5): ";
	std::cout << shlib.add(4, 5) << std::endl;

	return EXIT_SUCCESS;
}
예제 #4
0
TEST_F(MathMatrixStaticTest, Inversion) {
	// 2x2
	Static<double,2,2> c;
	c(0,0) = -5.0; c(0,1) =  2.0;
	c(1,0) =  3.0; c(1,1) = -1.0;
	EXPECT_EQ(c, a_.invert());
	EXPECT_EQ(a_, a_.invert().invert());
	EXPECT_EQ(b_, b_.invert().invert());
	// 3x3
	Static<double,3,3> d;
	d(0,0) = 1.0; d(0,1) = 5.0; d(0,2) = 13.0;
	d(1,0) = 2.0; d(1,1) = 7.0; d(1,2) = 17.0;
	d(2,0) = 3.0; d(2,1) = 11.0; d(2,2) = 19.0;
	EXPECT_EQ(d, d.invert().invert());
}
예제 #5
0
void Win32Painter::Create(Widget *w)
{
	Button *button;
	Static *label;
	TextField *textField;

	HINSTANCE inst = (HINSTANCE)GetWindowLong(parent_, GWL_HINSTANCE);
	if ((button=dynamic_cast<Button*>(w))) {
		hwnd_ = CreateWindow("BUTTON",button->Label().c_str(),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,button->X(),button->Y(),button->Width(),button->Height(),parent_,NULL,inst,NULL);
	} else if ((label=dynamic_cast<Static*>(w))) {
		hwnd_ = CreateWindow("STATIC",label->Label().c_str(),WS_CHILD|WS_VISIBLE|SS_LEFT,label->X(),label->Y(),label->Width(),label->Height(),parent_,NULL,inst,NULL);
	} else if ((textField=dynamic_cast<TextField*>(w))) {
		hwnd_ = CreateWindow("EDIT",textField->Text().c_str(),WS_CHILD|WS_VISIBLE|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER,textField->X(),textField->Y(),textField->Width(),textField->Height(),parent_,NULL,inst,NULL);
	}
	originalWndProc_ = (WNDPROC)SetWindowLong(hwnd_, GWL_WNDPROC, (LONG)WndProc);	
	SetWindowLong(hwnd_, GWL_USERDATA, (LONG)w);
}
예제 #6
0
static void ObjectExtra_destroy(ObjectExtra* extra)
{
  extra->~ObjectExtra();

  { // Synchronized.
    AutoLock locked(Object_memPoolLock);
    Object_memPoolExtra->free(extra);
  }
}
예제 #7
0
EventLoopImpl* Application::createEventLoop(const StringW &_name)
{
  StringW name(_name);

  // Redirect "Core" to "Core.Default".
  if (name == Ascii8("Core"))
    name.setAscii8("Core.Default");

  return Application_local->createEventLoop(name);
}
예제 #8
0
파일: main.cpp 프로젝트: Gajotres100/v04
	void OnLButtonDown(POINT p) {
		if (!s)
		{		
			s.Create(*this, WS_CHILD | WS_VISIBLE, "X", SHIP_ID, p.x, p.y, 15, 20);	
		}
		else
		{
			SetWindowPos(s, NULL, p.x, p.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
		}
		cp = p;
	}
예제 #9
0
TEST_F(MathMatrixStaticTest, BasicOperations) {
	Static<double,2,2> c;
	// Addition
	c(0,0) = 8.0; c(0,1) = 13.0;
	c(1,0) = 16.0; c(1,1) = 22.0;
	EXPECT_EQ(c, a_ + b_);
	// Product
	c(0,0) = 33.0; c(0,1) = 45.0;
	c(1,0) = 86.0; c(1,1) = 118.0;
	EXPECT_EQ(c, a_ * b_);
	// Operator+=
	c.zeros();
	Static<double,2,2> def;
	EXPECT_EQ(c, def);
	c += a_;
	EXPECT_EQ(c, a_);
	EXPECT_EQ(c *= 2.0, a_ * 2.0);
	// Transpose
	EXPECT_EQ(a_, a_.transpose().transpose());
}
예제 #10
0
파일: main.cpp 프로젝트: zugcic/v04
	void OnLButtonDown(POINT p) {
		
		if (!ship) {
			ship.Create(*this, WS_VISIBLE | WS_CHILD, "x", NULL, p.x, p.y, SHIP_WIDTH, SHIP_HEIGHT);
			pos.x = p.x;
			pos.y = p.y;
		} //kreiraj brod i zapamti vrijednosti koordinata
		
		SetWindowPos(ship,NULL, p.x, p.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
		pos.x = p.x;
		pos.y = p.y; //promijeni koordinate broda i zapamti nove vrijednosti
} 
예제 #11
0
static ObjectExtra* ObjectExtra_create()
{
  ObjectExtra* extra;

  { // Synchronized.
    AutoLock locked(Object_memPoolLock);

    extra = reinterpret_cast<ObjectExtra*>(Object_memPoolExtra->alloc(sizeof(ObjectExtra)));
    if (FOG_IS_NULL(extra))
      return NULL;
  }

  return fog_new_p(extra) ObjectExtra();
}
예제 #12
0
FOG_NO_EXPORT void Object_init(void)
{
  // Initialize the Object meta class.
  static MetaClass _privateObjectMetaClass;
  static const char _privateObjectClassName[] = "Fog::Object";

  _privateObjectMetaClass.base = NULL;
  _privateObjectMetaClass.name = _privateObjectClassName;

  _privateObjectMetaClass.hashCode = HashUtil::hash(StubA(_privateObjectClassName, FOG_ARRAY_SIZE(_privateObjectClassName) - 1));

  Object::_staticMetaClass = &_privateObjectMetaClass;

  // Initialize the locks.
  Object::_internalLock.init();
  Object_memPoolLock.init();

  // Initialize the memory pools.
  Object_memPoolExtra.init();
  Object_memPoolConn.init();

  // Initialize the ObjectExtra null (initial) instance.
  Object_extraNull.init();
}
예제 #13
0
void Manager::paintEvent(TQPaintEvent *e)
{
   TQPainter p(widget());

   TQRect r(e->rect());

   bool intersectsLeft = r.intersects(TQRect(0, 0, 1, height()));

   bool intersectsRight =
      r.intersects(TQRect(width() - 1, 0, width(), height()));

   if (intersectsLeft || intersectsRight)
   {
      p.setPen(TQt::black);

      if (intersectsLeft)
         p.drawLine(0, r.top(), 0, r.bottom());

      if (intersectsRight)
         p.drawLine(width() - 1, r.top(), width() - 1, r.bottom());
   }

   Static * s = Static::instance();

   bool active = isActive();

   // Title bar.

   TQRect tr = titleSpacer_->tqgeometry();
   bitBlt(widget(), tr.topLeft(), &titleBuf_);

   // Resize bar.

   if (isResizable())
   {
      int rbt = height() - Static::instance()->resizeHeight(); // Resize bar top

      bitBlt(widget(), 0, rbt, &(s->resize(active)));
      bitBlt(widget(), 30, rbt, &(s->resizeMidLeft(active)));

      p.drawTiledPixmap(32, rbt, width() - 34,
                        Static::instance()->resizeHeight(),
                        s->resizeMidMid(active));

      bitBlt(widget(), width() - 32, rbt, &(s->resizeMidRight(active)));
      bitBlt(widget(), width() - 30, rbt, &(s->resize(active)));
   }
   else
      p.drawLine(1, height() - 1, width() - 2, height() - 1);
}
예제 #14
0
FOG_NO_EXPORT void Application_init(void)
{
  Application_local.init();

  // --------------------------------------------------------------------------
  // [Default]
  // --------------------------------------------------------------------------

  Application::registerEventLoop(FOG_S(APPLICATION_Core_Default), Application_DefaultEventLoopConstructor);

  // --------------------------------------------------------------------------
  // [Windows]
  // --------------------------------------------------------------------------

#if defined(FOG_OS_WINDOWS)
  Application::registerEventLoop(FOG_S(APPLICATION_Core_Win), Application_WinEventLoopConstructor);
# if defined(FOG_BUILD_UI)
  Application::registerUIEngine(FOG_S(APPLICATION_UI_Win), Application_WinUIEngineConstructor);
# endif // FOG_BUILD_UI
#endif // FOG_OS_WINDOWS

  // --------------------------------------------------------------------------
  // [Mac]
  // --------------------------------------------------------------------------

#if defined(FOG_OS_MAC)
  Application::registerEventLoop(FOG_S(APPLICATION_Core_Mac), Application_MacEventLoopConstructor);
# if defined(FOG_BUILD_UI)
  Application::registerUIEngine(FOG_S(APPLICATION_UI_Mac), Application_MacUIEngineConstructor);
# endif // FOG_BUILD_UI && FOG_OS_MAC
#endif // FOG_OS_MAC

  // --------------------------------------------------------------------------
  // [X11]
  // --------------------------------------------------------------------------

#if defined(FOG_BUILD_UI_X11) && !defined(FOG_BUILD_UI_X11_MODULE)
  Application::registerUIEngine(FOG_S(APPLICATION_UI_X11), Application_X11UIEngineConstructor);
#endif // FOG_BUILD_UI_X11 && !FOG_BUILD_UI_X11_MODULE
}
예제 #15
0
UIEngine* Application::createUIEngine(const StringW& _name)
{
  StringW name(_name);

  // First try to detect UIEngine if not specified
  if (name == Ascii8("UI"))
    name = detectUIEngine();

  // Try to create UIEngine using list of registered 'UIEngine's.
  UIEngine* engine = Application_local->createUIEngine(name);
  if (engine)
    return engine;

  // Try to load dynamically linked library in form FogUI_${name}.
  if (!name.startsWith(Ascii8("UI.")))
    return NULL;

  // Extract the name of engine from UI.${name}.
  name.remove(Range(0, 3));

  Library lib;
  err_t err = lib.openPlugin(StringW::fromAscii8("FogUI"), name);

  if (FOG_IS_ERROR(err))
  {
    Logger::error("Fog::Application", "createUIEngine",
      "Failed to load UI library, err=%u.", err);
    return NULL;
  }

  UIEngineConstructor ctor = (UIEngineConstructor)lib.getSymbol("ctor");

  if (FOG_IS_NULL(ctor))
  {
    Logger::error("Fog::Application", "createUIEngine",
      "Failed to get UI library constructor.");
    return NULL;
  }

  engine = ctor();

  if (FOG_IS_NULL(engine))
  {
    Logger::error("Fog::Application", "createUIEngine",
      "Failed to invoke UI library constructor.");
    return NULL;
  }

  if (!engine->_isInitialized)
  {
    Logger::error("Fog::Application", "createUIEngine",
      "Failed to initialize requested engine.");
    fog_delete(engine);

    return NULL;
  }
  
  // Success.
  engine->_library = lib;
  return engine;
}
예제 #16
0
namespace Fog {

// ============================================================================
// [Fog::Object - Statics]
// ============================================================================

const MetaClass* Object::_staticMetaClass;
Static<Lock> Object::_internalLock;

static Static<ObjectExtra> Object_extraNull;
static Static<Lock> Object_memPoolLock;
static Static<MemPool> Object_memPoolExtra;
static Static<MemPool> Object_memPoolConn;

// ============================================================================
// [Fog::Object - Helpers]
// ============================================================================

static ObjectExtra* ObjectExtra_create()
{
  ObjectExtra* extra;

  { // Synchronized.
    AutoLock locked(Object_memPoolLock);

    extra = reinterpret_cast<ObjectExtra*>(Object_memPoolExtra->alloc(sizeof(ObjectExtra)));
    if (FOG_IS_NULL(extra))
      return NULL;
  }

  return fog_new_p(extra) ObjectExtra();
}

static void ObjectExtra_destroy(ObjectExtra* extra)
{
  extra->~ObjectExtra();

  { // Synchronized.
    AutoLock locked(Object_memPoolLock);
    Object_memPoolExtra->free(extra);
  }
}

// ============================================================================
// [Fog::Object - Construction / Destruction]
// ============================================================================

enum { OBJECT_VTYPE_FLAGS = OBJECT_CREATE_STATIC };
enum { OBJECT_ADOPT_FLAGS = OBJECT_CREATE_WRAPPED };

Object::Object(uint32_t createFlags) :
  _vType(VAR_TYPE_OBJECT_REF | VAR_FLAG_NONE | (createFlags & OBJECT_VTYPE_FLAGS)),
  _objectFlags(createFlags & OBJECT_ADOPT_FLAGS),
  _objectExtra(&Object_extraNull),
  _parent(NULL),
  _homeThread(Thread::getCurrentThread()),
  _events(NULL)
{
}

Object::~Object()
{
  ObjectExtra* extra = _objectExtra;

  if (extra != &Object_extraNull)
  {
    // Delete all children.
    err_t err = _removeAll();

    if (FOG_IS_ERROR(err))
    {
      Logger::error("Fog::Object", "~Object",
        "_removeAll() failed, error=%u.", err);
    }

    // Delete all connections.
    if (!extra->_forwardConnection.isEmpty())
    {
      removeAllListeners();
    }

    _objectExtra = &Object_extraNull;
    ObjectExtra_destroy(extra);
  }

  // Delete all posted events.
  if (_events)
  {
    AutoLock locked(Object::_internalLock);

    // Set "wasDeleted" for all pending events.
    Event* ev = _events;

    while (ev)
    {
      // Event will be deleted by an event loop, we need only to mark it for
      // deletion so it won't be processed (called).
      ev->_wasDeleted = 1;

      // Go to previous, because newest pending events are stored first.
      ev = ev->_prev;
    }
  }
}

// ============================================================================
// [Fog::Object - Release]
// ============================================================================

void Object::release()
{
  // First delete all children. This is last opportunity to remove them on
  // current class instance (destructor changes virtual table).
  err_t err = _removeAll();

  if (FOG_IS_ERROR(err))
  {
    Logger::error("Fog::Object", "release",
      "_removeAll() failed, error=%u.", err);
  }

  // Use delete operator only in case that the object is dynamically allocated
  // using fog_new() operator.
  if (!isStatic())
  {
    fog_delete(this);
  }
}

void Object::scheduleRelease()
{
  if ((_objectFlags & OBJECT_FLAG_RELEASE_SCHEDULED) != 0)
    return;

  Thread* thread = getHomeThread();

  if (thread == NULL)
  {
    Logger::error("Fog::Object", "scheduleRelease",
      "Can't post RELEASE event, because there is no suitable event loop.");
    return;
  }

  _objectFlags |= OBJECT_FLAG_RELEASE_SCHEDULED;
  postEvent(fog_new DestroyEvent());
}

// ============================================================================
// [Fog::Object - Object Extra]
// ============================================================================

//! @brief Get @c ObjectExtra instance ready for modification.
ObjectExtra* Object::getMutableExtra()
{
  if (FOG_LIKELY(_objectExtra != &Object_extraNull))
    return _objectExtra;

  ObjectExtra* extra = ObjectExtra_create();
  if (FOG_IS_NULL(extra))
    return NULL;

  _objectExtra = extra;
  return extra;
}

// ============================================================================
// [Fog::Object - Meta Class]
// ============================================================================

const MetaClass* Object::getStaticMetaClass()
{
  return _staticMetaClass;
}

const MetaClass* Object::_getStaticMetaClassRace(MetaClass** p)
{
  while (AtomicCore<size_t>::get((size_t*)p) == 0)
  {
    // Yield is not optimal, but this should really rarely happen and if we
    // had the luck then there is 100% probability that it will not happen
    // again.
    Thread::yield();
  }

  return *p;
}

const MetaClass* Object::getObjectMetaClass() const
{
  return _staticMetaClass;
}

// ============================================================================
// [Fog::Object - Object Id]
// ============================================================================

err_t Object::setId(const StringW& id)
{
  if (id == _objectExtra->_id)
    return ERR_OK;

  ObjectExtra* extra = getMutableExtra();
  if (FOG_IS_NULL(extra))
    return ERR_RT_OUT_OF_MEMORY;

  FOG_RETURN_ON_ERROR(extra->_id.set(id));
  return ERR_OK;
}

// ============================================================================
// [Fog::Object - Home Thread]
// ============================================================================

err_t Object::moveToThread(Thread* thread)
{
  if (_homeThread == thread)
    return ERR_OK;

  // TODO:
  return ERR_RT_NOT_IMPLEMENTED;
}

// ============================================================================
// [Fog::Object - Object Hierarchy]
// ============================================================================

err_t Object::setParent(Object* parent)
{
  // If our parent is a given parent then do nothing, it's not error.
  if (_parent == parent)
    return ERR_OK;

  // If we have a parent then it's needed to break the hierarchy first.
  if (_parent != NULL)
    FOG_RETURN_ON_ERROR(_parent->removeChild(this));

  // Now set the new parent. NULL is valid value so we must make sure the
  // object is not null before calling its method.
  if (parent)
    FOG_RETURN_ON_ERROR(parent->addChild(this));

  return ERR_OK;
}

err_t Object::addChild(Object* child)
{
  if (FOG_IS_NULL(child))
    return ERR_RT_INVALID_ARGUMENT;

  // If object is already in our hierarchy then we return quickly.
  if (child->getParent() == this)
    return ERR_OK;

  // If object has different parent then it's an error.
  if (child->hasParent())
    return ERR_OBJECT_HAS_PARENT;

  // Okay, now we can call the virtual _addChild() method.
  return _addChild(_objectExtra->_children.getLength(), child);
}

err_t Object::removeChild(Object* child)
{
  if (FOG_IS_NULL(child))
    return ERR_RT_INVALID_ARGUMENT;

  if (child->getParent() != this)
    return ERR_OBJECT_NOT_FOUND;

  size_t index = _objectExtra->_children.indexOf(child);
  // It must be here if parent check passed!
  FOG_ASSERT(index != INVALID_INDEX);

  // Okay, now we can call the virtual _removeChild() method.
  return _removeChild(index, child);
}

err_t Object::_addChild(size_t index, Object* child)
{
  // Index must be valid or equal to children list length.
  FOG_ASSERT(index <= _objectExtra->_children.getLength());

  ObjectExtra* extra = getMutableExtra();
  if (FOG_IS_NULL(extra))
    return ERR_RT_OUT_OF_MEMORY;

  FOG_RETURN_ON_ERROR(extra->_children.insert(index, child));
  child->_parent = this;

  // Send 'child-add' event.
  ChildEvent e(EVENT_CHILD_ADD, child);
  sendEvent(&e);

  return ERR_OK;
}

err_t Object::_removeChild(size_t index, Object* child)
{
  ObjectExtra* extra = _objectExtra;

  // Index must be valid.
  FOG_ASSERT(index  < extra->_children.getLength() &&
             child == extra->_children.getAt(index));

  // Extra must be mutable if we found the children.
  FOG_ASSERT(extra != &Object_extraNull);

  FOG_RETURN_ON_ERROR(extra->_children.removeAt(index));
  child->_parent = NULL;

  // Send 'child-remove' event.
  ChildEvent e(EVENT_CHILD_REMOVE, child);
  sendEvent(&e);

  return ERR_OK;
}

err_t Object::_removeAll()
{
  ObjectExtra* extra = _objectExtra;
  if (extra->_children.isEmpty())
    return ERR_OK;

  err_t err = ERR_OK;
  size_t index;

  while ((index = extra->_children.getLength()) != 0)
  {
    Object* child = extra->_children.getAt(--index);
    err = _removeChild(index, child);

    if (FOG_IS_ERROR(err))
      break;
  }

  return err;
}

// ============================================================================
// [Fog::Object - Property - Validate]
// ============================================================================

// Object name can contain characters [A-Z], [a-z], '-', '_', [0-9]. Numbers
// are not allowed for the first character.
static err_t Object_validatePropertyName(const StringW& name)
{
  const CharW* data = name.getData();
  size_t length = name.getLength();

  if (length == 0)
    return ERR_PROPERTY_INVALID;

  CharW c = data[0];
  if (!(c.isAsciiLetter() || c == CharW('_') || c == CharW('-')))
    return ERR_PROPERTY_INVALID;

  for (size_t i = 1; i < length; i++)
  {
    if (!(c.isAsciiNumlet() || c == CharW('_') || c == CharW('-')))
      return ERR_PROPERTY_INVALID;
  }

  return ERR_OK;
}

// ============================================================================
// [Fog::Object - Property - Dynamic]
// ============================================================================

static err_t Object_getDynamicProperty(const Object* self, const InternedStringW& name, Var& dst)
{
  const ObjectExtra* extra = self->_objectExtra;
  if (extra == &Object_extraNull)
    return ERR_PROPERTY_NOT_FOUND;

  const Var* var = extra->_properties.getPtr(name);
  if (var == NULL)
    return ERR_PROPERTY_NOT_FOUND;
  else
    return dst.setVar(*var);
}

static err_t Object_setDynamicProperty(Object* self, const InternedStringW& name, const Var& src)
{
  ObjectExtra* extra = self->getMutableExtra();
  if (FOG_IS_NULL(extra))
    return ERR_RT_OUT_OF_MEMORY;

  Var* var = extra->_properties.usePtr(name);
  if (var != NULL)
  {
    if (*var == src)
      return ERR_OK;

    FOG_RETURN_ON_ERROR(var->setVar(src));
  }
  else
  {
    FOG_RETURN_ON_ERROR(extra->_properties.put(name, src));
  }

  PropertyEvent e(name);
  self->sendEvent(&e);

  return ERR_OK;
}

// ============================================================================
// [Fog::Object - Property - Accessors]
// ============================================================================

err_t Object::getProperty(const StringW& name, Var& dst) const
{
  InternedStringW m_name(name, INTERNED_STRING_OPTION_LOOKUP);

  if (m_name.isEmpty())
  {
    FOG_RETURN_ON_ERROR(Object_validatePropertyName(name));

    // If the property name is valid then we must ERR_PROPERTY_NOT_FOUND.
    return ERR_PROPERTY_NOT_FOUND;
  }
  else
  {
    err_t err = _getProperty(m_name, dst);

    // If the property doesn't exist try dynamically added properties.
    if (err == ERR_PROPERTY_NOT_FOUND)
      err = Object_getDynamicProperty(this, m_name, dst);
    return err;
  }
}

err_t Object::setProperty(const StringW& name, const Var& src)
{
  InternedStringW m_name(name, INTERNED_STRING_OPTION_LOOKUP);

  if (m_name.isEmpty())
  {
    // Return error if the property name isn't valid. We are going to create
    // new InternedStringW so we must be sure that the internal hash table used
    // to store interned strings won't be polluted by strings we actually don't
    // need.
    FOG_RETURN_ON_ERROR(Object_validatePropertyName(name));

    // Create a new InternedStringW.
    FOG_RETURN_ON_ERROR(m_name.set(name));
  }
  else
  {
    // We know that there is a InternedStringW, so try Object::_setProperty().
    err_t err = _setProperty(m_name, src);

    // If something bad happened (for example wrong argument type) then we
    // report it immediately.
    if (err != ERR_PROPERTY_NOT_FOUND)
      return err;

    // We are going to set dynamic property (this means that it can be created)
    // so we must be sure that the property name is valid.
    FOG_RETURN_ON_ERROR(Object_validatePropertyName(name));
  }

  // Set dynamic property.
  return Object_setDynamicProperty(this, m_name, src);
}

err_t Object::getProperty(const InternedStringW& name, Var& dst) const
{
  err_t err = _getProperty(name, dst);
  if (err != ERR_PROPERTY_NOT_FOUND)
    return err;

  err = Object_getDynamicProperty(this, name, dst);
  if (err != ERR_PROPERTY_NOT_FOUND)
    return err;

  FOG_RETURN_ON_ERROR(Object_validatePropertyName(name));
  return ERR_PROPERTY_NOT_FOUND;
}

err_t Object::setProperty(const InternedStringW& name, const Var& src)
{
  err_t err = _setProperty(name, src);
  if (err != ERR_PROPERTY_NOT_FOUND)
    return err;

  // If property doesn't exist create a dynamic property.
  FOG_RETURN_ON_ERROR(Object_validatePropertyName(name));
  return Object_setDynamicProperty(this, name, src);
}

// ============================================================================
// [Fog::Object - Property - Virtual]
// ============================================================================

err_t Object::_getProperty(const InternedStringW& name, Var& dst) const
{
  FOG_UNUSED(name);
  FOG_UNUSED(dst);

  if (name == FOG_S(id))
    return dst.setString(_objectExtra->_id);

  return ERR_PROPERTY_NOT_FOUND;
}

err_t Object::_setProperty(const InternedStringW& name, const Var& src)
{
  FOG_UNUSED(name);
  FOG_UNUSED(src);

  if (name == FOG_S(id))
  {
    StringW src_string;
    FOG_RETURN_ON_ERROR(src.getString(src_string));
    return setId(src_string);
  }

  return ERR_PROPERTY_NOT_FOUND;
}

// ============================================================================
// [Fog::Object - Listeners]
// ============================================================================

bool Object::addListener(uint32_t code, void (*fn)(Event*))
{
  Delegate1<Event*> del(fn);
  return _addListener(code, NULL, (const void*)&del, OBJECT_EVENT_HANDLER_EVENTPTR);
}

bool Object::addListener(uint32_t code, void (*fn)())
{
  Delegate0<> del(fn);
  return _addListener(code, NULL, (const void*)&del, OBJECT_EVENT_HANDLER_VOID);
}

bool Object::removeListener(uint32_t code, void (*fn)(Event*))
{
  Delegate1<Event*> del(fn);
  return _removeListener(code, NULL, (const void*)&del, OBJECT_EVENT_HANDLER_EVENTPTR);
}

bool Object::removeListener(uint32_t code, void (*fn)())
{
  Delegate0<> del(fn);
  return _removeListener(code, NULL, (const void*)&del, OBJECT_EVENT_HANDLER_VOID);
}

uint Object::removeListener(Object* listener)
{
  ObjectExtra* extra = _objectExtra;
  if (extra == &Object_extraNull)
    return 0;

  AutoLock locked(Object::_internalLock);
  uint result = 0;

  ObjectConnection* prev;
  ObjectConnection* conn;
  ObjectConnection* next;

_Begin:
  {
    HashIterator<uint32_t, ObjectConnection*> it(extra->_forwardConnection);

    while (it.isValid())
    {
      uint32_t key = it.getKey();

      prev = NULL;
      conn = it.getItem();

      do {
        next = conn->next;
        if (conn->listener == listener)
        {
          result++;

          if (listener)
          {
            size_t index = listener->_objectExtra->_backwardConnection.indexOf(conn);
            FOG_ASSERT(index != INVALID_INDEX);
            listener->_objectExtra->_backwardConnection.removeAt(index);
          }

          fog_delete(conn);

          if (prev)
            prev->next = next;
          else if (next)
          {
            extra->_forwardConnection.put(key, next);
            goto _Begin;
          }
          else
          {
            extra->_forwardConnection.remove(key);
            goto _Begin;
          }
        }

        prev = conn;
        conn = next;
      } while (conn);

      it.next();
    }
  }

  return result;
}

uint Object::removeAllListeners()
{
  ObjectExtra* extra = _objectExtra;
  if (extra == &Object_extraNull)
    return 0;

  AutoLock locked(Object::_internalLock);

  uint result = 0;

  ObjectConnection* conn;
  ObjectConnection* next;

  HashIterator<uint32_t, ObjectConnection*> it(extra->_forwardConnection);


  while (it.isValid())
  {
    conn = it.getItem();

    do {
      next = conn->next;
      result++;

      if (conn->listener)
      {
        size_t index = conn->listener->_objectExtra->_backwardConnection.indexOf(conn);
        FOG_ASSERT(index != INVALID_INDEX);
        conn->listener->_objectExtra->_backwardConnection.removeAt(index);
      }

      fog_delete(conn);
      conn = next;
    } while (conn);

    it.next();
  }

  extra->_forwardConnection.clear();
  return result;
}

// Private.
bool Object::_addListener(uint32_t code, Object* listener, const void* del, uint32_t type)
{
  AutoLock locked(Object::_internalLock);

  ObjectExtra* extra = getMutableExtra();
  if (FOG_IS_NULL(extra))
    return false;

  if (listener->getMutableExtra() == NULL)
    return false;

  ObjectConnection* prev = NULL;
  ObjectConnection* conn = extra->_forwardConnection.get(code, NULL);
  Delegate0<> d = *(const Delegate0<> *)del;

  if (conn)
  {
    do {
      if (conn->delegateVoid() == d)
        return false;
      prev = conn;
      conn = conn->next;
    } while (conn);
  }

  conn = fog_new ObjectConnection;
  // TODO: if (conn == NULL) ...
  conn->next = NULL;
  conn->attachedObject = this;
  conn->listener = listener;
  conn->delegateVoid() = d;
  conn->type = type;
  conn->code = code;

  if (prev)
    prev->next = conn;
  else
    extra->_forwardConnection.put(code, conn);

  if (listener)
    listener->_objectExtra->_backwardConnection.append(conn);

  return true;
}

bool Object::_removeListener(uint32_t code, Object* listener, const void* del, uint32_t type)
{
  ObjectExtra* extra = _objectExtra;
  if (FOG_IS_NULL(extra))
    return false;

  AutoLock locked(Object::_internalLock);

  ObjectConnection* prev = NULL;
  ObjectConnection* conn = extra->_forwardConnection.get(code, NULL);
  if (!conn) return false;
  Delegate0<> d = *(const Delegate0<> *)del;

  do {
    ObjectConnection* next = conn->next;

    if (conn->delegateVoid() == d)
    {
      FOG_ASSERT(conn->listener == listener);

      if (prev)
        prev->next = next;
      else if (next)
        extra->_forwardConnection.put(code, next);
      else
        extra->_forwardConnection.remove(code);

      if (listener)
      {
        size_t index = listener->_objectExtra->_backwardConnection.indexOf(conn);
        FOG_ASSERT(index != INVALID_INDEX);
        listener->_objectExtra->_backwardConnection.removeAt(index);
      }

      fog_delete(conn);
      return true;
    }

    prev = conn;
    conn = next;
  } while (conn);

  return false;
}

// OBJECT TODO: Add removing possibility for currently called listeners
void Object::_callListeners(Event* ev)
{
  ObjectExtra* extra = _objectExtra;
  if (FOG_IS_NULL(extra))
    return;

  uint32_t code = ev->getCode();

  ObjectConnection* conn = extra->_forwardConnection.get(code, NULL);
  if (!conn) return;

  do {
    switch (conn->type)
    {
      case OBJECT_EVENT_HANDLER_VOID:
        conn->delegateVoid()();
        break;
      case OBJECT_EVENT_HANDLER_EVENTPTR:
        conn->delegateEvent()(ev);
        break;
      default:
        FOG_ASSERT_NOT_REACHED();
        break;
    }
  } while ((conn = conn->next));
}

// ============================================================================
// [Fog::Object - Event Management]
// ============================================================================

void Object::postEvent(Event* ev)
{
  Thread* thread = getHomeThread();

  if (FOG_IS_NULL(thread))
    goto _Fail;

  if (!thread->getEventLoop().isCreated())
    goto _Fail;

  // Link event with object`s event queue.
  {
    AutoLock locked(_internalLock);

    ev->_prev = this->_events;
    this->_events = ev;

    ev->_flags |= Event::IS_POSTED;
  }

  // Post event (event is posted as task).
  thread->getEventLoop().postTask(ev);
  return;

_Fail:
  Logger::error("Fog::Object", "postEvent",
    "Can't post event to object which has no home thread or event loop. Event destroyed!");
  fog_delete(ev);
}

void Object::postEvent(uint32_t code)
{
  Event* ev = fog_new Event(code, 0);
  if (ev) postEvent(ev);
}

void Object::sendEvent(Event* ev)
{
  // First set receiver to self.
  ev->_receiver = this;

  // Send event to object onEvent().
  onEvent(ev);

  // Send event to listeners.
  _callListeners(ev);
}

void Object::sendEventByCode(uint32_t code)
{
  Event e(code, 0);
  sendEvent(&e);
}

// ============================================================================
// [Fog::Object - Event Handlers]
// ============================================================================

// The onEvent() method is normally defined by FOG_EVENT_BEGIN() and
// FOG_EVENT_END() macros, but Fog::Object is an exception.
void Object::onEvent(Event* ev)
{
  switch (ev->getCode())
  {
    case EVENT_CREATE:
      onCreate(reinterpret_cast<CreateEvent*>(ev));
      break;
    case EVENT_DESTROY:
      onDestroy(reinterpret_cast<DestroyEvent*>(ev));
      break;

    case EVENT_CHILD_ADD:
    case EVENT_CHILD_REMOVE:
      onChild(reinterpret_cast<ChildEvent*>(ev));
      break;

    case EVENT_PROPERTY:
      onProperty(reinterpret_cast<PropertyEvent*>(ev));
      break;
  }
}

void Object::onCreate(CreateEvent* ev) {}
void Object::onDestroy(DestroyEvent* ev) {}
void Object::onChild(ChildEvent* ev) {}
void Object::onProperty(PropertyEvent* ev) {}

// ============================================================================
// [Init / Fini]
// ============================================================================

FOG_NO_EXPORT void Object_init(void)
{
  // Initialize the Object meta class.
  static MetaClass _privateObjectMetaClass;
  static const char _privateObjectClassName[] = "Fog::Object";

  _privateObjectMetaClass.base = NULL;
  _privateObjectMetaClass.name = _privateObjectClassName;

  _privateObjectMetaClass.hashCode = HashUtil::hash(StubA(_privateObjectClassName, FOG_ARRAY_SIZE(_privateObjectClassName) - 1));

  Object::_staticMetaClass = &_privateObjectMetaClass;

  // Initialize the locks.
  Object::_internalLock.init();
  Object_memPoolLock.init();

  // Initialize the memory pools.
  Object_memPoolExtra.init();
  Object_memPoolConn.init();

  // Initialize the ObjectExtra null (initial) instance.
  Object_extraNull.init();
}

FOG_NO_EXPORT void Object_fini(void)
{
  // Destroy the shared ObjectExtra instance.
  Object_extraNull.destroy();

  // Destroy the memory pools.
  Object_memPoolConn.destroy();
  Object_memPoolExtra.destroy();

  // Destroy the locks.
  Object_memPoolLock.destroy();
  Object::_internalLock.destroy();
}

} // Fog namespace
예제 #17
0
FOG_NO_EXPORT void Application_fini(void)
{
  Application_local.destroy();
}
예제 #18
0
void MapRenderer::createFastKeys(int tilex, int tiley, int maxtilex, int maxtiley) {
    if (tilex < 0)
        tilex = 0;
    if (tiley < 0)
        tiley = 0;
    if (maxtilex >= pMap_->maxX())
        maxtilex = pMap_->maxX();
    if (maxtiley >= pMap_->maxY())
        maxtiley = pMap_->maxY();

    cache_vehicles_.clear();
    cache_peds_.clear();
    cache_weapons_.clear();
    cache_statics_.clear();
    cache_sfx_objects_.clear();

    fast_vehicle_cache_.clear();
    fast_ped_cache_.clear();
    fast_weapon_cache_.clear();
    fast_statics_cache_.clear();
    fast_sfx_objects_cache_.clear();

    // updating position for visual markers
    for (size_t i = 0; i < AgentManager::kMaxSlot; i++) {
        PedInstance *p = pMission_->getSquad()->member(i);
        if (p != NULL && p->isAlive()) {
            if (p->tileX() >= tilex && p->tileX() < maxtilex
                && p->tileY() >= tiley && p->tileY() < maxtiley) {
                // sfx_objects_[i]->setPosition(p->tileX(), p->tileY(), p->tileZ(),
                    // p->offX(), p->offY(), p->offZ() + 320);
                pMission_->sfxObjects(i + 4)->setPosition(p->tileX(), p->tileY(),
                    p->tileZ(), p->offX() - 16, p->offY(), p->offZ() + 256);
            }
        } else {
             // sfx_objects_[i]->setMap(-1);
             pMission_->sfxObjects(i + 4)->setMap(-1);
        }
    }

    // vehicles
    for (unsigned int i = 0; i < pMission_->numVehicles(); i++) {
        Vehicle *v = pMission_->vehicle(i);
        if (v->tileX() >= tilex && v->tileX() < maxtilex
            && v->tileY() >= tiley && v->tileY() < maxtiley) {
            // NOTE: a trick to make vehicles be drawn correctly z+1
            fast_vehicle_cache_.insert(fastKey(v->tileX(),
                v->tileY(), v->tileZ() + 1));
            cache_vehicles_.push_back(v);
        }
    }

    // peds
    for (size_t i = 0; i < AgentManager::kMaxSlot; i++) {
        PedInstance *p = pMission_->getSquad()->member(i);
        if (p != NULL && p->map() != -1) {
            if (p->tileX() >= tilex && p->tileX() < maxtilex
                && p->tileY() >= tiley && p->tileY() < maxtiley) {
                fast_ped_cache_.insert(fastKey(p));
                cache_peds_.push_back(p);
            }
        }
    }
    for (size_t i = pMission_->getSquad()->size(); i < pMission_->numPeds(); i++) {
        PedInstance *p = pMission_->ped(i);
        if (p->map() != -1) {
            if (p->tileX() >= tilex && p->tileX() < maxtilex
                && p->tileY() >= tiley && p->tileY() < maxtiley) {
                fast_ped_cache_.insert(fastKey(p));
                cache_peds_.push_back(p);
            }
        }
    }

    // weapons
    for (unsigned int i = 0; i < pMission_->numWeapons(); i++) {
        WeaponInstance *w = pMission_->weapon(i);
        if (w->map() != -1 && w->tileX() >= tilex && w->tileX() < maxtilex
            && w->tileY() >= tiley && w->tileY() < maxtiley) {
            fast_weapon_cache_.insert(fastKey(w));
            cache_weapons_.push_back(w);
        }
    }

    // statics
    for (unsigned int i = 0; i < pMission_->numStatics(); i++) {
        Static *s = pMission_->statics(i);
        if (s->tileX() >= tilex && s->tileX() < maxtilex
            && s->tileY() >= tiley && s->tileY() < maxtiley) {
            fast_statics_cache_.insert(fastKey(s));
            cache_statics_.push_back(s);
        }
    }

    // sfx objects
    for (unsigned int i = 0; i < pMission_->numSfxObjects(); i++) {
        SFXObject *so = pMission_->sfxObjects(i);
        if (so->map() != -1 && so->tileX() >= tilex && so->tileX() < maxtilex
            && so->tileY() >= tiley && so->tileY() < maxtiley) {
            fast_sfx_objects_cache_.insert(fastKey(so));
            cache_sfx_objects_.push_back(so);
        }
    }
}