void BitmapContainer::clipRect(_R<BitmapContainer> source, const RECT& sourceRect, int32_t destX, int32_t destY, RECT& outputSourceRect, int32_t& outputX, int32_t& outputY) const { int sLeft = imax(sourceRect.Xmin, 0); int sTop = imax(sourceRect.Ymin, 0); int sRight = imax(imin(sourceRect.Xmax, source->getWidth()), 0); int sBottom = imax(imin(sourceRect.Ymax, source->getHeight()), 0); int dLeft = destX; int dTop = destY; if (dLeft < 0) { sLeft += -dLeft; dLeft = 0; } if (dTop < 0) { sTop += -dTop; dTop = 0; } int clippedWidth = imax(imin(sRight - sLeft, getWidth() - dLeft), 0); int clippedHeight = imax(imin(sBottom - sTop, getHeight() - dTop), 0); outputSourceRect.Xmin = sLeft; outputSourceRect.Xmax = sLeft + clippedWidth; outputSourceRect.Ymin = sTop; outputSourceRect.Ymax = sTop + clippedHeight; outputX = dLeft; outputY = dTop; }
void EventDispatcher::handleEvent(_R<Event> e) { check(); e->check(); Locker l(handlersMutex); map<tiny_string, list<listener> >::iterator h=handlers.find(e->type); if(h==handlers.end()) { LOG(LOG_CALLS,_("Not handled event ") << e->type); return; } LOG(LOG_CALLS, _("Handling event ") << h->first); //Create a temporary copy of the listeners, as the list can be modified during the calls vector<listener> tmpListener(h->second.begin(),h->second.end()); l.release(); //TODO: check, ok we should also bind the level for(unsigned int i=0;i<tmpListener.size();i++) { if( (e->eventPhase == EventPhase::BUBBLING_PHASE && tmpListener[i].use_capture) || (e->eventPhase == EventPhase::CAPTURING_PHASE && !tmpListener[i].use_capture)) continue; incRef(); //The object needs to be used multiple times e->incRef(); //tmpListener is now also owned by the vector tmpListener[i].f->incRef(); //If the f is a class method, the 'this' is ignored ASObject* const arg0=e.getPtr(); ASObject* ret=tmpListener[i].f->call(this,&arg0,1); if(ret) ret->decRef(); //And now no more, f can also be deleted tmpListener[i].f->decRef(); } e->check(); }
ExtVariant::ExtVariant(_R<ASObject> other) : strValue(""), intValue(0), doubleValue(0), booleanValue(false) { switch(other->getObjectType()) { case T_STRING: strValue = other->toString().raw_buf(); type = EV_STRING; break; case T_INTEGER: intValue = other->toInt(); type = EV_INT32; break; case T_NUMBER: doubleValue = other->toNumber(); type = EV_DOUBLE; break; case T_BOOLEAN: booleanValue = Boolean_concrete(other.getPtr()); type = EV_BOOLEAN; break; case T_ARRAY: objectValue.setType(ExtObject::EO_ARRAY); case T_OBJECT: type = EV_OBJECT; { unsigned int index = 0; while((index=other->nextNameIndex(index))!=0) { _R<ASObject> nextName=other->nextName(index); _R<ASObject> nextValue=other->nextValue(index); if(nextName->getObjectType() == T_INTEGER) objectValue.setProperty(nextName->toInt(), nextValue); else objectValue.setProperty(nextName->toString().raw_buf(), nextValue); } } break; case T_NULL: type = EV_NULL; break; case T_UNDEFINED: default: type = EV_VOID; break; } }
void BitmapContainer::copyRectangle(_R<BitmapContainer> source, const RECT& sourceRect, int32_t destX, int32_t destY, bool mergeAlpha) { RECT clippedSourceRect; int32_t clippedX; int32_t clippedY; clipRect(source, sourceRect, destX, destY, clippedSourceRect, clippedX, clippedY); int copyWidth = clippedSourceRect.Xmax - clippedSourceRect.Xmin; int copyHeight = clippedSourceRect.Ymax - clippedSourceRect.Ymin; if (copyWidth <= 0 || copyHeight <= 0) return; int sx = clippedSourceRect.Xmin; int sy = clippedSourceRect.Ymin; if (mergeAlpha==false) { //Fast path using memmove for (int i=0; i<copyHeight; i++) { memmove(&data[(clippedY+i)*stride + 4*clippedX], &source->data[(sy+i)*source->stride + 4*sx], 4*copyWidth); } } else { //Slow path using Cairo CairoRenderContext ctxt(&data[0], width, height); ctxt.simpleBlit(clippedX, clippedY, &source->data[0], source->getWidth(), source->getHeight(), sx, sy, copyWidth, copyHeight); } }
URLStreamThread::URLStreamThread(_R<URLRequest> request, _R<URLStream> ldr, _R<ByteArray> bytes) : DownloaderThreadBase(request, ldr.getPtr()), loader(ldr), data(bytes),streambuffer(NULL) { }
void SystemState::registerFrameListener(_R<DisplayObject> obj) { Locker l(mutexFrameListeners); obj->incRef(); frameListeners.insert(obj); }