void Shape::render(lua_State *L) { renderState.alpha = parent ? parent->renderState.alpha * alpha : alpha; renderState.clampAlpha(); if (renderState.alpha == 0.0f) { return; } DisplayObject::render(L); updateLocalTransform(); if (!renderCached(L)) { Matrix transform; getTargetTransformationMatrix(NULL, &transform); renderState.clipRect = parent ? parent->renderState.clipRect : Loom2D::Rectangle(0, 0, -1, -1); renderState.blendMode = (blendMode == BlendMode::AUTO && parent) ? parent->renderState.blendMode : blendMode; if (GFX::Graphics::getFlags() & GFX::Graphics::FLAG_INVERTED) { transform.scale(1, -1); transform.translate(0, GFX::Graphics::getHeight()); } graphics->render(&renderState, &transform); } }
void DisplayObjectContainer::renderChildren(lua_State *L) { if (!visible) { return; } // containers can set a new view to render into, but we must restore the // current view after, so take a snapshot int viewRestore = GFX::Graphics::getView(); // set the current view we will be rendering into. if (viewRestore != _view) { GFX::Graphics::setView(_view); } renderState.alpha = parent ? parent->renderState.alpha * alpha : alpha; renderState.cachedClipRect = parent ? parent->renderState.cachedClipRect : (unsigned short)-1; int docidx = lua_gettop(L); lua_rawgeti(L, docidx, (int)childrenOrdinal); lua_rawgeti(L, -1, LSINDEXVECTOR); int childrenVectorIdx = lua_gettop(L); int numChildren = lsr_vector_get_length(L, -2); if (_depthSort && ((int)sSortBucket.size() < numChildren)) { sSortBucket.resize(numChildren); } // Is there a cliprect? If so, set it. if ((clipX != 0) || (clipY != 0) || (clipWidth != 0) || (clipHeight != 0)) { GFX::QuadRenderer::submit(); Matrix res; DisplayObject *stage = this; while (stage->parent) { stage = stage->parent; } getTargetTransformationMatrix(NULL, &res); int x1 = (int) ((float)clipX * res.a + res.tx) ; int y1 = (int) ((float)clipY * res.d + res.ty); int x2 = (int) ((float)clipWidth * res.a); int y2 = (int) ((float)clipHeight * res.d); renderState.cachedClipRect = GFX::Graphics::setClipRect(x1, y1, x2, y2); } else { GFX::Graphics::setClipRect(renderState.cachedClipRect); } for (int i = 0; i < numChildren; i++) { lua_rawgeti(L, childrenVectorIdx, i); DisplayObject *dobj = (DisplayObject *)lualoom_getnativepointer(L, -1); lua_rawgeti(L, -1, LSINDEXTYPE); dobj->type = (Type *)lua_topointer(L, -1); lua_pop(L, 1); dobj->validate(L, lua_gettop(L)); if (!_depthSort) { renderType(L, dobj->type, dobj); } else { sSortBucket[i].index = i; sSortBucket[i].displayObject = dobj; } // pop instance lua_pop(L, 1); } if (_depthSort) { qsort(sSortBucket.ptr(), numChildren, sizeof(DisplayObjectSort), DisplayObjectSortFunction); for (int i = 0; i < numChildren; i++) { DisplayObjectSort *ds = &sSortBucket[i]; lua_rawgeti(L, childrenVectorIdx, ds->index); renderType(L, ds->displayObject->type, ds->displayObject); // pop instance lua_pop(L, 1); } } lua_settop(L, docidx); // Restore clip state. if ((clipX != 0) || (clipY != 0) || (clipWidth != 0) || (clipHeight != 0)) { GFX::QuadRenderer::submit(); GFX::Graphics::clearClipRect(); } // restore view if (viewRestore != _view) { GFX::Graphics::setView(viewRestore); } }