Changeset 91599 in webkit
- Timestamp:
- Jul 22, 2011 1:04:56 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r91597 r91599 1 2011-07-22 Alok Priyadarshi <alokp@chromium.org> 2 3 Use software rendering for small canvas 4 https://bugs.webkit.org/show_bug.cgi?id=64958 5 6 Reviewed by Stephen White. 7 8 No new tests. Does not affect rendering output, just canvas backing. 9 If there is a regression, they should be caught by existing canvas tests. 10 11 * html/HTMLCanvasElement.cpp: 12 (WebCore::HTMLCanvasElement::reset): 13 * html/canvas/CanvasRenderingContext2D.cpp: 14 (WebCore::shouldAccelerateCanvas): 15 (WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D): 16 (WebCore::CanvasRenderingContext2D::reset): 17 (WebCore::CanvasRenderingContext2D::platformLayer): 18 (WebCore::CanvasRenderingContext2D::clearAcceleration): 19 (WebCore::CanvasRenderingContext2D::resetAcceleration): 20 * html/canvas/CanvasRenderingContext2D.h: 21 1 22 2011-07-21 Adrienne Walker <enne@google.com> 2 23 -
trunk/Source/WebCore/html/HTMLCanvasElement.cpp
r91496 r91599 246 246 #endif 247 247 248 if (m_context && m_context->is2d()) 249 static_cast<CanvasRenderingContext2D*>(m_context.get())->reset(); 248 if (m_context && m_context->is2d()) { 249 CanvasRenderingContext2D* context2D = static_cast<CanvasRenderingContext2D*>(m_context.get()); 250 bool wasAccelerated = context2D->isAccelerated(); 251 context2D->reset(); 252 #if USE(IOSURFACE_CANVAS_BACKING_STORE) || (ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING)) 253 // Recalculate compositing requirements if acceleration state changed. 254 if (context2D->isAccelerated() != wasAccelerated) 255 setNeedsStyleRecalc(SyntheticStyleChange); 256 #else 257 UNUSED_PARAM(wasAccelerated); 258 #endif 259 } 250 260 251 261 if (RenderObject* renderer = this->renderer()) { -
trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
r90872 r91599 98 98 } 99 99 100 #if ENABLE(ACCELERATED_2D_CANVAS) 101 // Number of pixels in a canvas below which we use software 102 // rendering. This is obviously an arbitrary number. A more precise 103 // number would depend on machine architecture and canvas contents. 104 static const int numPixelsThreshold = 128 * 128; 105 106 static bool shouldAccelerateCanvas(const HTMLCanvasElement* canvas) 107 { 108 const Page* page = canvas->document()->page(); 109 if (!page) 110 return false; 111 112 const Settings* settings = page->settings(); 113 if (!settings->accelerated2dCanvasEnabled()) 114 return false; 115 116 // Do not use acceleration for small canvas. 117 // For every accelerated canvas there is an extra back-buffer and a texture copy. 118 // Small canvases are also widely used for stylized fonts. Anti-aliasing 119 // text in hardware at that scale is generally slower. 120 if (canvas->width() * canvas->height() < numPixelsThreshold) 121 return false; 122 123 return true; 124 } 125 #endif 126 100 127 class CanvasStrokeStyleApplier : public StrokeStyleApplier { 101 128 public: … … 137 164 138 165 #if ENABLE(ACCELERATED_2D_CANVAS) 139 Page* p = canvas->document()->page(); 140 if (!p) 141 return; 142 if (!(p->settings()->accelerated2dCanvasEnabled() || p->settings()->legacyAccelerated2dCanvasEnabled())) 143 return; 144 if (GraphicsContext* c = drawingContext()) { 145 m_context3D = p->sharedGraphicsContext3D(); 146 if (m_context3D) { 147 m_drawingBuffer = m_context3D->createDrawingBuffer(IntSize(canvas->width(), canvas->height())); 148 if (!m_drawingBuffer) { 149 c->setGraphicsContext3D(0, 0, IntSize()); 150 m_context3D.clear(); 151 } else 152 c->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), IntSize(canvas->width(), canvas->height())); 153 } 154 } 166 resetAcceleration(); 155 167 #endif 156 168 } … … 204 216 m_path.clear(); 205 217 #if ENABLE(ACCELERATED_2D_CANVAS) 206 if (GraphicsContext* c = drawingContext()) { 207 if (m_context3D && m_drawingBuffer) { 208 if (m_drawingBuffer->reset(IntSize(canvas()->width(), canvas()->height()))) { 209 c->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), IntSize(canvas()->width(), canvas()->height())); 210 } else { 211 c->setGraphicsContext3D(0, 0, IntSize()); 212 m_drawingBuffer.clear(); 213 m_context3D.clear(); 214 } 218 resetAcceleration(); 215 219 #if USE(ACCELERATED_COMPOSITING) 216 RenderBox* renderBox = canvas()->renderBox(); 217 if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing()) 218 renderBox->layer()->contentChanged(RenderLayer::CanvasChanged); 219 #endif 220 } 221 } 220 RenderBox* renderBox = canvas()->renderBox(); 221 if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing()) 222 renderBox->layer()->contentChanged(RenderLayer::CanvasChanged); 223 #endif 222 224 #endif 223 225 } … … 2024 2026 } 2025 2027 2026 #if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING) 2028 #if ENABLE(ACCELERATED_2D_CANVAS) 2029 #if USE(ACCELERATED_COMPOSITING) 2027 2030 PlatformLayer* CanvasRenderingContext2D::platformLayer() const 2028 2031 { … … 2031 2034 #endif 2032 2035 2036 void CanvasRenderingContext2D::clearAcceleration() 2037 { 2038 if (GraphicsContext* ctx = drawingContext()) 2039 ctx->setGraphicsContext3D(0, 0, IntSize()); 2040 2041 m_drawingBuffer.clear(); 2042 m_context3D.clear(); 2043 } 2044 2045 void CanvasRenderingContext2D::resetAcceleration() 2046 { 2047 if (!shouldAccelerateCanvas(canvas())) { 2048 clearAcceleration(); 2049 return; 2050 } 2051 2052 // Try to accelerate. 2053 GraphicsContext* ctx = drawingContext(); 2054 if (!ctx) { 2055 clearAcceleration(); 2056 return; 2057 } 2058 2059 if (!m_context3D) { 2060 Page* page = canvas()->document()->page(); 2061 m_context3D = page->sharedGraphicsContext3D(); 2062 if (!m_context3D) { 2063 clearAcceleration(); 2064 return; 2065 } 2066 } 2067 2068 if (m_drawingBuffer) { 2069 if (!m_drawingBuffer->reset(canvas()->size())) { 2070 clearAcceleration(); 2071 return; 2072 } 2073 } else { 2074 m_drawingBuffer = m_context3D->createDrawingBuffer(canvas()->size()); 2075 if (!m_drawingBuffer) { 2076 clearAcceleration(); 2077 return; 2078 } 2079 } 2080 2081 ctx->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), canvas()->size()); 2082 } 2083 #endif 2084 2033 2085 } // namespace WebCore -
trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h
r90872 r91599 296 296 void prepareGradientForDashboard(CanvasGradient* gradient) const; 297 297 298 #if ENABLE(ACCELERATED_2D_CANVAS) 299 void clearAcceleration(); 300 void resetAcceleration(); 301 #endif 302 298 303 Vector<State, 1> m_stateStack; 299 304 bool m_usesCSSCompatibilityParseMode;
Note: See TracChangeset
for help on using the changeset viewer.