modules/graphics/src/main/java/com/sun/javafx/tk/quantum/ViewPainter.java

Print this page

        

*** 172,184 **** // This "g" variable might represent the back buffer graphics, or it // might be reassigned to the sceneBuffer graphics. Graphics g = backBufferGraphics; // Take into account the pixel scale factor for retina displays ! final float pixelScale = getPixelScaleFactor(); // Cache pixelScale in Graphics for use in 3D shaders such as camera and light positions. ! g.setPixelScaleFactor(pixelScale); // Initialize renderEverything based on various conditions that will cause us to render // the entire scene every time. boolean renderEverything = overlayRoot != null || freshBackBuffer || --- 172,185 ---- // This "g" variable might represent the back buffer graphics, or it // might be reassigned to the sceneBuffer graphics. Graphics g = backBufferGraphics; // Take into account the pixel scale factor for retina displays ! final float pixelScaleX = getPixelScaleFactorX(); ! final float pixelScaleY = getPixelScaleFactorY(); // Cache pixelScale in Graphics for use in 3D shaders such as camera and light positions. ! g.setPixelScaleFactors(pixelScaleX, pixelScaleY); // Initialize renderEverything based on various conditions that will cause us to render // the entire scene every time. boolean renderEverything = overlayRoot != null || freshBackBuffer ||
*** 190,201 **** final boolean showDirtyOpts = PrismSettings.showDirtyRegions || PrismSettings.showOverdraw; // If showDirtyOpts is turned on and we're not using a depth buffer // then we will render the scene to an intermediate texture, and then at the end we'll // draw that intermediate texture to the back buffer. if (showDirtyOpts && !sceneState.getScene().getDepthBuffer()) { ! final int bufferWidth = (int) Math.ceil(width * pixelScale); ! final int bufferHeight = (int) Math.ceil(height * pixelScale); // Check whether the sceneBuffer texture needs to be reconstructed if (sceneBuffer != null) { sceneBuffer.lock(); if (sceneBuffer.isSurfaceLost() || bufferWidth != sceneBuffer.getContentWidth() || --- 191,202 ---- final boolean showDirtyOpts = PrismSettings.showDirtyRegions || PrismSettings.showOverdraw; // If showDirtyOpts is turned on and we're not using a depth buffer // then we will render the scene to an intermediate texture, and then at the end we'll // draw that intermediate texture to the back buffer. if (showDirtyOpts && !sceneState.getScene().getDepthBuffer()) { ! final int bufferWidth = (int) Math.ceil(width * pixelScaleX); ! final int bufferHeight = (int) Math.ceil(height * pixelScaleY); // Check whether the sceneBuffer texture needs to be reconstructed if (sceneBuffer != null) { sceneBuffer.lock(); if (sceneBuffer.isSurfaceLost() || bufferWidth != sceneBuffer.getContentWidth() ||
*** 217,227 **** renderEverything = true; } sceneBuffer.contentsUseful(); // Hijack the "g" graphics variable g = sceneBuffer.createGraphics(); ! g.scale(pixelScale, pixelScale); } else if (sceneBuffer != null) { // We're in a situation where we have previously rendered to the sceneBuffer, but in // this render pass for whatever reason we're going to draw directly to the back buffer. // In this case we need to release the sceneBuffer. sceneBuffer.dispose(); --- 218,229 ---- renderEverything = true; } sceneBuffer.contentsUseful(); // Hijack the "g" graphics variable g = sceneBuffer.createGraphics(); ! g.setPixelScaleFactors(pixelScaleX, pixelScaleY); ! g.scale(pixelScaleX, pixelScaleY); } else if (sceneBuffer != null) { // We're in a situation where we have previously rendered to the sceneBuffer, but in // this render pass for whatever reason we're going to draw directly to the back buffer. // In this case we need to release the sceneBuffer. sceneBuffer.dispose();
*** 310,324 **** // Set the clip rectangle using integer bounds since a fractional bounding box will // still require a complete repaint on pixel boundaries dirtyRect.setBounds(dirtyRegion); // TODO I don't understand why this is needed. And if it is, are fractional pixelScale // values OK? And if not, shouldn't pixelScale be an int instead? ! if (pixelScale != 1.0f) { ! dirtyRect.x *= pixelScale; ! dirtyRect.y *= pixelScale; ! dirtyRect.width *= pixelScale; ! dirtyRect.height *= pixelScale; } g.setClipRect(dirtyRect); g.setClipRectIndex(i); doPaint(g, getRootPath(i)); } --- 312,326 ---- // Set the clip rectangle using integer bounds since a fractional bounding box will // still require a complete repaint on pixel boundaries dirtyRect.setBounds(dirtyRegion); // TODO I don't understand why this is needed. And if it is, are fractional pixelScale // values OK? And if not, shouldn't pixelScale be an int instead? ! if (pixelScaleX != 1.0f || pixelScaleY != 1.0f) { ! dirtyRect.x *= pixelScaleX; ! dirtyRect.y *= pixelScaleY; ! dirtyRect.width *= pixelScaleX; ! dirtyRect.height *= pixelScaleY; } g.setClipRect(dirtyRect); g.setClipRectIndex(i); doPaint(g, getRootPath(i)); }
*** 435,446 **** height = viewHeight = sceneState.getHeight(); return sceneState.isWindowVisible() && !sceneState.isWindowMinimized(); } ! protected float getPixelScaleFactor() { ! return presentable == null ? 1.0f : presentable.getPixelScaleFactor(); } private void doPaint(Graphics g, NodePath renderRootPath) { // Null path indicates that occlusion culling is not used if (renderRootPath != null) { --- 437,452 ---- height = viewHeight = sceneState.getHeight(); return sceneState.isWindowVisible() && !sceneState.isWindowMinimized(); } ! protected float getPixelScaleFactorX() { ! return presentable == null ? 1.0f : presentable.getPixelScaleFactorX(); ! } ! ! protected float getPixelScaleFactorY() { ! return presentable == null ? 1.0f : presentable.getPixelScaleFactorY(); } private void doPaint(Graphics g, NodePath renderRootPath) { // Null path indicates that occlusion culling is not used if (renderRootPath != null) {