void TextureMapperNode::paintSelfAndChildren(const TexmapPaintOptions& options, TexmapPaintOptions& optionsForDescendants) { bool didPaintSelf = false; if (!m_state.preserves3D || m_children.isEmpty()) { paintSelf(options); didPaintSelf = true; } if (m_children.isEmpty() && !options.isSurface) return; if (m_layerType == ScissorLayer) optionsForDescendants.scissorRect.intersect(m_transforms.target.mapRect(IntRect(0, 0, m_size.width(), m_size.height()))); for (int i = 0; i < m_children.size(); ++i) { TextureMapperNode* layer = m_children[i]; if (!layer) continue; if (!didPaintSelf && layer->m_transforms.centerZ >= 0) { paintSelf(options); didPaintSelf = true; } layer->paintRecursive(optionsForDescendants); if (options.isSurface) { ASSERT(m_surface); options.cache->mark(m_surface.get()); options.textureMapper->bindSurface(m_surface.get()); } } if (!didPaintSelf) { paintSelf(options); didPaintSelf = true; } }
QRegion KstViewArrow::clipRegion() { if (_clipMask.isNull()) { _myClipMask = QRegion(); QBitmap bm1(_geom.bottomRight().x(), _geom.bottomRight().y(), true); if (!bm1.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm1); p.setViewXForm(true); KstViewLine::paintSelf(p, QRegion()); p.end(); _clipMask = QRegion(bm1); } QBitmap bm2(_geom.bottomRight().x(), _geom.bottomRight().y(), true); if (!bm2.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm2); p.setViewXForm(true); paintSelf(p, QRegion()); p.end(); _myClipMask = QRegion(bm2); } } return _myClipMask | _clipMask; }
QRegion KstViewPicture::clipRegion() { if (_clipMask.isNull()) { _myClipMask = QRegion(); QBitmap bm1(_geom.bottomRight().x() + 1, _geom.bottomRight().y() + 1, true); if (!bm1.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm1); p.setViewXForm(true); KstBorderedViewObject::paintSelf(p, QRegion()); p.flush(); p.end(); _clipMask = QRegion(bm1); } QBitmap bm2(_geom.bottomRight().x() + 1, _geom.bottomRight().y() + 1, true); if (!bm2.isNull()) { KstPainter p; p.setMakingMask(true); p.begin(&bm2); p.setViewXForm(true); paintSelf(p, QRegion()); p.flush(); p.end(); _myClipMask = QRegion(bm2); } } return _myClipMask | _clipMask; }
void TextureMapperLayer::paintSelfAndChildren(const TextureMapperPaintOptions& options) { paintSelf(options); if (m_children.isEmpty()) return; bool shouldClip = m_state.masksToBounds && !m_state.preserves3D; if (shouldClip) options.textureMapper->beginClip(TransformationMatrix(options.transform).multiply(m_transform.combined()), layerRect()); for (size_t i = 0; i < m_children.size(); ++i) m_children[i]->paintRecursive(options); if (shouldClip) options.textureMapper->endClip(); }
void TextureMapperLayer::paintSelfAndChildren(const TextureMapperPaintOptions& options) { paintSelf(options); if (m_children.isEmpty()) return; bool shouldClip = m_state.masksToBounds && !m_state.preserves3D; if (shouldClip) { TransformationMatrix clipTransform; clipTransform.translate(options.offset.width(), options.offset.height()); clipTransform.multiply(options.transform); clipTransform.multiply(m_currentTransform.combined()); options.textureMapper->beginClip(clipTransform, layerRect()); } for (auto* child : m_children) child->paintRecursive(options); if (shouldClip) options.textureMapper->endClip(); }
void TextureMapperLayer::applyMask(const TextureMapperPaintOptions& options) { options.textureMapper->setMaskMode(true); paintSelf(options); options.textureMapper->setMaskMode(false); }
bool OpenGLComponent::performRender() { const ScopedLock sl (contextLock); #if JUCE_LINUX updateContext(); #endif if (context != nullptr) { if (! makeCurrentRenderingTarget()) return false; if (needToUpdateViewport) { needToUpdateViewport = false; glViewport (0, 0, getWidth(), getHeight()); } renderOpenGL(); if (needToRepaint && (flags & allowSubComponents) != 0) { needToRepaint = false; contextLock.exit(); // (MM must be locked before the context lock) MessageManagerLock mmLock (renderThread); contextLock.enter(); if (! mmLock.lockWasGained()) return false; // you mustn't set your own cached image object for an OpenGLComponent! jassert (dynamic_cast<OpenGLCachedComponentImage*> (getCachedComponentImage()) == cachedImage); const Rectangle<int> bounds (getLocalBounds()); OpenGLFrameBuffer& frameBuffer = cachedImage->getFrameBuffer (bounds.getWidth(), bounds.getHeight()); { RectangleList invalid (bounds); invalid.subtract (cachedImage->validArea); cachedImage->validArea = bounds; if (! invalid.isEmpty()) { jassert (getCurrentContext() != nullptr); { OpenGLGraphicsContext g (*getCurrentContext(), frameBuffer); g.clipToRectangleList (invalid); g.setFill (Colours::transparentBlack); g.fillRect (bounds, true); g.setFill (Colours::black); paintSelf (g); } makeCurrentRenderingTarget(); } } glEnable (GL_TEXTURE_2D); context->extensions.glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, frameBuffer.getTextureID()); context->copyTexture (bounds, Rectangle<int> (bounds.getWidth(), bounds.getHeight())); glBindTexture (GL_TEXTURE_2D, 0); } swapBuffers(); } return true; }