/** * clip this view so that outside of the visible bounds can be hidden. */ void ScrollView::onBeforeDraw() { if (_clippingToBounds) { _scissorRestored = false; Rect frame = getViewRect(); auto glview = Director::getInstance()->getOpenGLView(); if (glview->isScissorEnabled()) { _scissorRestored = true; _parentScissorRect = glview->getScissorRect(); //set the intersection of _parentScissorRect and frame as the new scissor rect if (frame.intersectsRect(_parentScissorRect)) { float x = MAX(frame.origin.x, _parentScissorRect.origin.x); float y = MAX(frame.origin.y, _parentScissorRect.origin.y); float xx = MIN(frame.origin.x+frame.size.width, _parentScissorRect.origin.x+_parentScissorRect.size.width); float yy = MIN(frame.origin.y+frame.size.height, _parentScissorRect.origin.y+_parentScissorRect.size.height); glview->setScissorInPoints(x, y, xx-x, yy-y); } } else { glEnable(GL_SCISSOR_TEST); glview->setScissorInPoints(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); } } }
void Layout::onBeforeVisitScissor() { auto glview = Director::DirectorInstance->getOpenGLView(); // apply scissor test _scissorOldState = glview->isScissorEnabled(); if (false == _scissorOldState) { glEnable(GL_SCISSOR_TEST); } // apply scissor box Rect clippingRect = getClippingRect(); _clippingOldRect = glview->getScissorRect(); if (false == _clippingOldRect.equals(clippingRect)) { glview->setScissorInPoints(clippingRect.origin.x, clippingRect.origin.y, clippingRect.size.width, clippingRect.size.height); } }