void CCRenderSurface::drawLayer(LayerRendererChromium* layerRenderer, CCLayerImpl* maskLayer, const TransformationMatrix& drawTransform, int contentsTextureId) { TransformationMatrix deviceMatrix = computeDeviceTransform(layerRenderer, drawTransform); // Can only draw surface if device matrix is invertible. if (!deviceMatrix.isInvertible()) return; // Draw the background texture if there is one. if (m_backgroundTexture && m_backgroundTexture->isReserved()) copyTextureToFramebuffer(layerRenderer, m_backgroundTexture->textureId(), m_contentRect.size(), drawTransform); FloatQuad quad = deviceMatrix.mapQuad(layerRenderer->sharedGeometryQuad()); CCLayerQuad deviceRect = CCLayerQuad(FloatQuad(quad.boundingBox())); CCLayerQuad layerQuad = CCLayerQuad(quad); // Use anti-aliasing programs only when necessary. bool useAA = (!quad.isRectilinear() || !quad.boundingBox().isExpressibleAsIntRect()); if (useAA) { deviceRect.inflateAntiAliasingDistance(); layerQuad.inflateAntiAliasingDistance(); } bool useMask = false; if (maskLayer && maskLayer->drawsContent()) if (!maskLayer->bounds().isEmpty()) useMask = true; // FIXME: pass in backgroundTextureId and blend the background in with this draw instead of having a separate drawBackground() pass. if (useMask) { if (useAA) { const LayerRendererChromium::RenderSurfaceMaskProgramAA* program = layerRenderer->renderSurfaceMaskProgramAA(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, contentsTextureId, program, program->fragmentShader().maskSamplerLocation(), program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation()); } else { const LayerRendererChromium::RenderSurfaceMaskProgram* program = layerRenderer->renderSurfaceMaskProgram(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, contentsTextureId, program, program->fragmentShader().maskSamplerLocation(), -1, -1); } } else { if (useAA) { const LayerRendererChromium::RenderSurfaceProgramAA* program = layerRenderer->renderSurfaceProgramAA(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, contentsTextureId, program, -1, program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation()); } else { const LayerRendererChromium::RenderSurfaceProgram* program = layerRenderer->renderSurfaceProgram(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, contentsTextureId, program, -1, -1, -1); } } }
void CCRenderSurface::drawLayer(LayerRendererChromium* layerRenderer, CCLayerImpl* maskLayer, const TransformationMatrix& drawTransform) { TransformationMatrix renderMatrix = drawTransform; // Apply a scaling factor to size the quad from 1x1 to its intended size. renderMatrix.scale3d(m_contentRect.width(), m_contentRect.height(), 1); TransformationMatrix deviceMatrix = TransformationMatrix(layerRenderer->windowMatrix() * layerRenderer->projectionMatrix() * renderMatrix).to2dTransform(); // Can only draw surface if device matrix is invertible. if (!deviceMatrix.isInvertible()) return; FloatQuad quad = deviceMatrix.mapQuad(layerRenderer->sharedGeometryQuad()); CCLayerQuad deviceRect = CCLayerQuad(FloatQuad(quad.boundingBox())); CCLayerQuad layerQuad = CCLayerQuad(quad); // Use anti-aliasing programs only when necessary. bool useAA = (!quad.isRectilinear() || !quad.boundingBox().isExpressibleAsIntRect()); if (useAA) { deviceRect.inflateAntiAliasingDistance(); layerQuad.inflateAntiAliasingDistance(); } bool useMask = false; if (maskLayer && maskLayer->drawsContent()) if (!maskLayer->bounds().isEmpty()) useMask = true; if (useMask) { if (useAA) { const MaskProgramAA* program = layerRenderer->renderSurfaceMaskProgramAA(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, program->fragmentShader().maskSamplerLocation(), program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation()); } else { const MaskProgram* program = layerRenderer->renderSurfaceMaskProgram(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, program->fragmentShader().maskSamplerLocation(), -1, -1); } } else { if (useAA) { const ProgramAA* program = layerRenderer->renderSurfaceProgramAA(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, -1, program->vertexShader().pointLocation(), program->fragmentShader().edgeLocation()); } else { const Program* program = layerRenderer->renderSurfaceProgram(); drawSurface(layerRenderer, maskLayer, drawTransform, deviceMatrix, deviceRect, layerQuad, program, -1, -1, -1); } } }