| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "CCRendererSoftware.h" | 7 #include "CCRendererSoftware.h" |
| 8 | 8 |
| 9 #include "CCDebugBorderDrawQuad.h" | 9 #include "CCDebugBorderDrawQuad.h" |
| 10 #include "CCSolidColorDrawQuad.h" | 10 #include "CCSolidColorDrawQuad.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 { | 57 { |
| 58 return SkScalarNearlyZero(matrix[SkMatrix::kMSkewX]) && | 58 return SkScalarNearlyZero(matrix[SkMatrix::kMSkewX]) && |
| 59 SkScalarNearlyZero(matrix[SkMatrix::kMSkewY]) && | 59 SkScalarNearlyZero(matrix[SkMatrix::kMSkewY]) && |
| 60 SkScalarNearlyZero(matrix[SkMatrix::kMPersp0]) && | 60 SkScalarNearlyZero(matrix[SkMatrix::kMPersp0]) && |
| 61 SkScalarNearlyZero(matrix[SkMatrix::kMPersp1]) && | 61 SkScalarNearlyZero(matrix[SkMatrix::kMPersp1]) && |
| 62 SkScalarNearlyZero(matrix[SkMatrix::kMPersp2] - 1.0f); | 62 SkScalarNearlyZero(matrix[SkMatrix::kMPersp2] - 1.0f); |
| 63 } | 63 } |
| 64 | 64 |
| 65 } // anonymous namespace | 65 } // anonymous namespace |
| 66 | 66 |
| 67 scoped_ptr<CCRendererSoftware> CCRendererSoftware::create(CCRendererClient* clie
nt, CCResourceProvider* resourceProvider, WebCompositorSoftwareOutputDevice* out
putDevice) | 67 scoped_ptr<SoftwareRenderer> SoftwareRenderer::create(RendererClient* client, Re
sourceProvider* resourceProvider, WebCompositorSoftwareOutputDevice* outputDevic
e) |
| 68 { | 68 { |
| 69 return make_scoped_ptr(new CCRendererSoftware(client, resourceProvider, outp
utDevice)); | 69 return make_scoped_ptr(new SoftwareRenderer(client, resourceProvider, output
Device)); |
| 70 } | 70 } |
| 71 | 71 |
| 72 CCRendererSoftware::CCRendererSoftware(CCRendererClient* client, CCResourceProvi
der* resourceProvider, WebCompositorSoftwareOutputDevice* outputDevice) | 72 SoftwareRenderer::SoftwareRenderer(RendererClient* client, ResourceProvider* res
ourceProvider, WebCompositorSoftwareOutputDevice* outputDevice) |
| 73 : CCDirectRenderer(client, resourceProvider) | 73 : DirectRenderer(client, resourceProvider) |
| 74 , m_visible(true) | 74 , m_visible(true) |
| 75 , m_outputDevice(outputDevice) | 75 , m_outputDevice(outputDevice) |
| 76 , m_skCurrentCanvas(0) | 76 , m_skCurrentCanvas(0) |
| 77 { | 77 { |
| 78 m_resourceProvider->setDefaultResourceType(CCResourceProvider::Bitmap); | 78 m_resourceProvider->setDefaultResourceType(ResourceProvider::Bitmap); |
| 79 | 79 |
| 80 m_capabilities.maxTextureSize = INT_MAX; | 80 m_capabilities.maxTextureSize = INT_MAX; |
| 81 m_capabilities.bestTextureFormat = GraphicsContext3D::RGBA; | 81 m_capabilities.bestTextureFormat = GraphicsContext3D::RGBA; |
| 82 m_capabilities.contextHasCachedFrontBuffer = true; | 82 m_capabilities.contextHasCachedFrontBuffer = true; |
| 83 m_capabilities.usingSetVisibility = true; | 83 m_capabilities.usingSetVisibility = true; |
| 84 | 84 |
| 85 viewportChanged(); | 85 viewportChanged(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 CCRendererSoftware::~CCRendererSoftware() | 88 SoftwareRenderer::~SoftwareRenderer() |
| 89 { | 89 { |
| 90 } | 90 } |
| 91 | 91 |
| 92 const RendererCapabilities& CCRendererSoftware::capabilities() const | 92 const RendererCapabilities& SoftwareRenderer::capabilities() const |
| 93 { | 93 { |
| 94 return m_capabilities; | 94 return m_capabilities; |
| 95 } | 95 } |
| 96 | 96 |
| 97 void CCRendererSoftware::viewportChanged() | 97 void SoftwareRenderer::viewportChanged() |
| 98 { | 98 { |
| 99 m_outputDevice->didChangeViewportSize(WebSize(viewportSize().width(), viewpo
rtSize().height())); | 99 m_outputDevice->didChangeViewportSize(WebSize(viewportSize().width(), viewpo
rtSize().height())); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void CCRendererSoftware::beginDrawingFrame(DrawingFrame& frame) | 102 void SoftwareRenderer::beginDrawingFrame(DrawingFrame& frame) |
| 103 { | 103 { |
| 104 m_skRootCanvas = make_scoped_ptr(new SkCanvas(m_outputDevice->lock(true)->ge
tSkBitmap())); | 104 m_skRootCanvas = make_scoped_ptr(new SkCanvas(m_outputDevice->lock(true)->ge
tSkBitmap())); |
| 105 } | 105 } |
| 106 | 106 |
| 107 void CCRendererSoftware::finishDrawingFrame(DrawingFrame& frame) | 107 void SoftwareRenderer::finishDrawingFrame(DrawingFrame& frame) |
| 108 { | 108 { |
| 109 m_currentFramebufferLock.reset(); | 109 m_currentFramebufferLock.reset(); |
| 110 m_skCurrentCanvas = 0; | 110 m_skCurrentCanvas = 0; |
| 111 m_skRootCanvas.reset(); | 111 m_skRootCanvas.reset(); |
| 112 m_outputDevice->unlock(); | 112 m_outputDevice->unlock(); |
| 113 } | 113 } |
| 114 | 114 |
| 115 bool CCRendererSoftware::flippedFramebuffer() const | 115 bool SoftwareRenderer::flippedFramebuffer() const |
| 116 { | 116 { |
| 117 return false; | 117 return false; |
| 118 } | 118 } |
| 119 | 119 |
| 120 void CCRendererSoftware::finish() | 120 void SoftwareRenderer::finish() |
| 121 { | 121 { |
| 122 } | 122 } |
| 123 | 123 |
| 124 void CCRendererSoftware::bindFramebufferToOutputSurface(DrawingFrame& frame) | 124 void SoftwareRenderer::bindFramebufferToOutputSurface(DrawingFrame& frame) |
| 125 { | 125 { |
| 126 m_currentFramebufferLock.reset(); | 126 m_currentFramebufferLock.reset(); |
| 127 m_skCurrentCanvas = m_skRootCanvas.get(); | 127 m_skCurrentCanvas = m_skRootCanvas.get(); |
| 128 } | 128 } |
| 129 | 129 |
| 130 bool CCRendererSoftware::bindFramebufferToTexture(DrawingFrame& frame, const CCS
copedTexture* texture, const IntRect& framebufferRect) | 130 bool SoftwareRenderer::bindFramebufferToTexture(DrawingFrame& frame, const Scope
dTexture* texture, const IntRect& framebufferRect) |
| 131 { | 131 { |
| 132 m_currentFramebufferLock = make_scoped_ptr(new CCResourceProvider::ScopedWri
teLockSoftware(m_resourceProvider, texture->id())); | 132 m_currentFramebufferLock = make_scoped_ptr(new ResourceProvider::ScopedWrite
LockSoftware(m_resourceProvider, texture->id())); |
| 133 m_skCurrentCanvas = m_currentFramebufferLock->skCanvas(); | 133 m_skCurrentCanvas = m_currentFramebufferLock->skCanvas(); |
| 134 initializeMatrices(frame, framebufferRect, false); | 134 initializeMatrices(frame, framebufferRect, false); |
| 135 setDrawViewportSize(framebufferRect.size()); | 135 setDrawViewportSize(framebufferRect.size()); |
| 136 | 136 |
| 137 return true; | 137 return true; |
| 138 } | 138 } |
| 139 | 139 |
| 140 void CCRendererSoftware::enableScissorTestRect(const IntRect& scissorRect) | 140 void SoftwareRenderer::enableScissorTestRect(const IntRect& scissorRect) |
| 141 { | 141 { |
| 142 m_skCurrentCanvas->clipRect(toSkRect(scissorRect), SkRegion::kReplace_Op); | 142 m_skCurrentCanvas->clipRect(toSkRect(scissorRect), SkRegion::kReplace_Op); |
| 143 } | 143 } |
| 144 | 144 |
| 145 void CCRendererSoftware::disableScissorTest() | 145 void SoftwareRenderer::disableScissorTest() |
| 146 { | 146 { |
| 147 IntRect canvasRect(IntPoint(), viewportSize()); | 147 IntRect canvasRect(IntPoint(), viewportSize()); |
| 148 m_skCurrentCanvas->clipRect(toSkRect(canvasRect), SkRegion::kReplace_Op); | 148 m_skCurrentCanvas->clipRect(toSkRect(canvasRect), SkRegion::kReplace_Op); |
| 149 } | 149 } |
| 150 | 150 |
| 151 void CCRendererSoftware::clearFramebuffer(DrawingFrame& frame) | 151 void SoftwareRenderer::clearFramebuffer(DrawingFrame& frame) |
| 152 { | 152 { |
| 153 if (frame.currentRenderPass->hasTransparentBackground()) { | 153 if (frame.currentRenderPass->hasTransparentBackground()) { |
| 154 m_skCurrentCanvas->clear(SkColorSetARGB(0, 0, 0, 0)); | 154 m_skCurrentCanvas->clear(SkColorSetARGB(0, 0, 0, 0)); |
| 155 } else { | 155 } else { |
| 156 #ifndef NDEBUG | 156 #ifndef NDEBUG |
| 157 // On DEBUG builds, opaque render passes are cleared to blue to easily s
ee regions that were not drawn on the screen. | 157 // On DEBUG builds, opaque render passes are cleared to blue to easily s
ee regions that were not drawn on the screen. |
| 158 m_skCurrentCanvas->clear(SkColorSetARGB(255, 0, 0, 255)); | 158 m_skCurrentCanvas->clear(SkColorSetARGB(255, 0, 0, 255)); |
| 159 #endif | 159 #endif |
| 160 } | 160 } |
| 161 } | 161 } |
| 162 | 162 |
| 163 void CCRendererSoftware::setDrawViewportSize(const IntSize& viewportSize) | 163 void SoftwareRenderer::setDrawViewportSize(const IntSize& viewportSize) |
| 164 { | 164 { |
| 165 } | 165 } |
| 166 | 166 |
| 167 bool CCRendererSoftware::isSoftwareResource(CCResourceProvider::ResourceId id) c
onst | 167 bool SoftwareRenderer::isSoftwareResource(ResourceProvider::ResourceId id) const |
| 168 { | 168 { |
| 169 switch (m_resourceProvider->resourceType(id)) { | 169 switch (m_resourceProvider->resourceType(id)) { |
| 170 case CCResourceProvider::GLTexture: | 170 case ResourceProvider::GLTexture: |
| 171 return false; | 171 return false; |
| 172 case CCResourceProvider::Bitmap: | 172 case ResourceProvider::Bitmap: |
| 173 return true; | 173 return true; |
| 174 } | 174 } |
| 175 | 175 |
| 176 CRASH(); | 176 CRASH(); |
| 177 return false; | 177 return false; |
| 178 } | 178 } |
| 179 | 179 |
| 180 void CCRendererSoftware::drawQuad(DrawingFrame& frame, const CCDrawQuad* quad) | 180 void SoftwareRenderer::drawQuad(DrawingFrame& frame, const DrawQuad* quad) |
| 181 { | 181 { |
| 182 WebTransformationMatrix quadRectMatrix; | 182 WebTransformationMatrix quadRectMatrix; |
| 183 quadRectTransform(&quadRectMatrix, quad->quadTransform(), quad->quadRect()); | 183 quadRectTransform(&quadRectMatrix, quad->quadTransform(), quad->quadRect()); |
| 184 WebTransformationMatrix contentsDeviceTransform = (frame.windowMatrix * fram
e.projectionMatrix * quadRectMatrix).to2dTransform(); | 184 WebTransformationMatrix contentsDeviceTransform = (frame.windowMatrix * fram
e.projectionMatrix * quadRectMatrix).to2dTransform(); |
| 185 SkMatrix skDeviceMatrix; | 185 SkMatrix skDeviceMatrix; |
| 186 toSkMatrix(&skDeviceMatrix, contentsDeviceTransform); | 186 toSkMatrix(&skDeviceMatrix, contentsDeviceTransform); |
| 187 m_skCurrentCanvas->setMatrix(skDeviceMatrix); | 187 m_skCurrentCanvas->setMatrix(skDeviceMatrix); |
| 188 | 188 |
| 189 m_skCurrentPaint.reset(); | 189 m_skCurrentPaint.reset(); |
| 190 if (!isScaleAndTranslate(skDeviceMatrix)) { | 190 if (!isScaleAndTranslate(skDeviceMatrix)) { |
| 191 m_skCurrentPaint.setAntiAlias(true); | 191 m_skCurrentPaint.setAntiAlias(true); |
| 192 m_skCurrentPaint.setFilterBitmap(true); | 192 m_skCurrentPaint.setFilterBitmap(true); |
| 193 } | 193 } |
| 194 if (quad->needsBlending()) { | 194 if (quad->needsBlending()) { |
| 195 m_skCurrentPaint.setAlpha(quad->opacity() * 255); | 195 m_skCurrentPaint.setAlpha(quad->opacity() * 255); |
| 196 m_skCurrentPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode); | 196 m_skCurrentPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode); |
| 197 } else { | 197 } else { |
| 198 m_skCurrentPaint.setXfermodeMode(SkXfermode::kSrc_Mode); | 198 m_skCurrentPaint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 199 } | 199 } |
| 200 | 200 |
| 201 switch (quad->material()) { | 201 switch (quad->material()) { |
| 202 case CCDrawQuad::DebugBorder: | 202 case DrawQuad::DebugBorder: |
| 203 drawDebugBorderQuad(frame, CCDebugBorderDrawQuad::materialCast(quad)); | 203 drawDebugBorderQuad(frame, DebugBorderDrawQuad::materialCast(quad)); |
| 204 break; | 204 break; |
| 205 case CCDrawQuad::SolidColor: | 205 case DrawQuad::SolidColor: |
| 206 drawSolidColorQuad(frame, CCSolidColorDrawQuad::materialCast(quad)); | 206 drawSolidColorQuad(frame, SolidColorDrawQuad::materialCast(quad)); |
| 207 break; | 207 break; |
| 208 case CCDrawQuad::TextureContent: | 208 case DrawQuad::TextureContent: |
| 209 drawTextureQuad(frame, CCTextureDrawQuad::materialCast(quad)); | 209 drawTextureQuad(frame, TextureDrawQuad::materialCast(quad)); |
| 210 break; | 210 break; |
| 211 case CCDrawQuad::TiledContent: | 211 case DrawQuad::TiledContent: |
| 212 drawTileQuad(frame, CCTileDrawQuad::materialCast(quad)); | 212 drawTileQuad(frame, TileDrawQuad::materialCast(quad)); |
| 213 break; | 213 break; |
| 214 case CCDrawQuad::RenderPass: | 214 case DrawQuad::RenderPass: |
| 215 drawRenderPassQuad(frame, CCRenderPassDrawQuad::materialCast(quad)); | 215 drawRenderPassQuad(frame, RenderPassDrawQuad::materialCast(quad)); |
| 216 break; | 216 break; |
| 217 default: | 217 default: |
| 218 drawUnsupportedQuad(frame, quad); | 218 drawUnsupportedQuad(frame, quad); |
| 219 break; | 219 break; |
| 220 } | 220 } |
| 221 | 221 |
| 222 m_skCurrentCanvas->resetMatrix(); | 222 m_skCurrentCanvas->resetMatrix(); |
| 223 } | 223 } |
| 224 | 224 |
| 225 void CCRendererSoftware::drawDebugBorderQuad(const DrawingFrame& frame, const CC
DebugBorderDrawQuad* quad) | 225 void SoftwareRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const Debu
gBorderDrawQuad* quad) |
| 226 { | 226 { |
| 227 // We need to apply the matrix manually to have pixel-sized stroke width. | 227 // We need to apply the matrix manually to have pixel-sized stroke width. |
| 228 SkPoint vertices[4]; | 228 SkPoint vertices[4]; |
| 229 toSkRect(quadVertexRect()).toQuad(vertices); | 229 toSkRect(quadVertexRect()).toQuad(vertices); |
| 230 SkPoint transformedVertices[4]; | 230 SkPoint transformedVertices[4]; |
| 231 m_skCurrentCanvas->getTotalMatrix().mapPoints(transformedVertices, vertices,
4); | 231 m_skCurrentCanvas->getTotalMatrix().mapPoints(transformedVertices, vertices,
4); |
| 232 m_skCurrentCanvas->resetMatrix(); | 232 m_skCurrentCanvas->resetMatrix(); |
| 233 | 233 |
| 234 m_skCurrentPaint.setColor(quad->color()); | 234 m_skCurrentPaint.setColor(quad->color()); |
| 235 m_skCurrentPaint.setAlpha(quad->opacity() * SkColorGetA(quad->color())); | 235 m_skCurrentPaint.setAlpha(quad->opacity() * SkColorGetA(quad->color())); |
| 236 m_skCurrentPaint.setStyle(SkPaint::kStroke_Style); | 236 m_skCurrentPaint.setStyle(SkPaint::kStroke_Style); |
| 237 m_skCurrentPaint.setStrokeWidth(quad->width()); | 237 m_skCurrentPaint.setStrokeWidth(quad->width()); |
| 238 m_skCurrentCanvas->drawPoints(SkCanvas::kPolygon_PointMode, 4, transformedVe
rtices, m_skCurrentPaint); | 238 m_skCurrentCanvas->drawPoints(SkCanvas::kPolygon_PointMode, 4, transformedVe
rtices, m_skCurrentPaint); |
| 239 } | 239 } |
| 240 | 240 |
| 241 void CCRendererSoftware::drawSolidColorQuad(const DrawingFrame& frame, const CCS
olidColorDrawQuad* quad) | 241 void SoftwareRenderer::drawSolidColorQuad(const DrawingFrame& frame, const Solid
ColorDrawQuad* quad) |
| 242 { | 242 { |
| 243 m_skCurrentPaint.setColor(quad->color()); | 243 m_skCurrentPaint.setColor(quad->color()); |
| 244 m_skCurrentPaint.setAlpha(quad->opacity() * SkColorGetA(quad->color())); | 244 m_skCurrentPaint.setAlpha(quad->opacity() * SkColorGetA(quad->color())); |
| 245 m_skCurrentCanvas->drawRect(toSkRect(quadVertexRect()), m_skCurrentPaint); | 245 m_skCurrentCanvas->drawRect(toSkRect(quadVertexRect()), m_skCurrentPaint); |
| 246 } | 246 } |
| 247 | 247 |
| 248 void CCRendererSoftware::drawTextureQuad(const DrawingFrame& frame, const CCText
ureDrawQuad* quad) | 248 void SoftwareRenderer::drawTextureQuad(const DrawingFrame& frame, const TextureD
rawQuad* quad) |
| 249 { | 249 { |
| 250 if (!isSoftwareResource(quad->resourceId())) { | 250 if (!isSoftwareResource(quad->resourceId())) { |
| 251 drawUnsupportedQuad(frame, quad); | 251 drawUnsupportedQuad(frame, quad); |
| 252 return; | 252 return; |
| 253 } | 253 } |
| 254 | 254 |
| 255 // FIXME: Add support for non-premultiplied alpha. | 255 // FIXME: Add support for non-premultiplied alpha. |
| 256 CCResourceProvider::ScopedReadLockSoftware quadResourceLock(m_resourceProvid
er, quad->resourceId()); | 256 ResourceProvider::ScopedReadLockSoftware quadResourceLock(m_resourceProvider
, quad->resourceId()); |
| 257 FloatRect uvRect = quad->uvRect(); | 257 FloatRect uvRect = quad->uvRect(); |
| 258 uvRect.scale(quad->quadRect().width(), quad->quadRect().height()); | 258 uvRect.scale(quad->quadRect().width(), quad->quadRect().height()); |
| 259 SkIRect skUvRect = toSkIRect(enclosingIntRect(uvRect)); | 259 SkIRect skUvRect = toSkIRect(enclosingIntRect(uvRect)); |
| 260 if (quad->flipped()) | 260 if (quad->flipped()) |
| 261 m_skCurrentCanvas->scale(1, -1); | 261 m_skCurrentCanvas->scale(1, -1); |
| 262 m_skCurrentCanvas->drawBitmapRect(*quadResourceLock.skBitmap(), &skUvRect, t
oSkRect(quadVertexRect()), &m_skCurrentPaint); | 262 m_skCurrentCanvas->drawBitmapRect(*quadResourceLock.skBitmap(), &skUvRect, t
oSkRect(quadVertexRect()), &m_skCurrentPaint); |
| 263 } | 263 } |
| 264 | 264 |
| 265 void CCRendererSoftware::drawTileQuad(const DrawingFrame& frame, const CCTileDra
wQuad* quad) | 265 void SoftwareRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQua
d* quad) |
| 266 { | 266 { |
| 267 ASSERT(isSoftwareResource(quad->resourceId())); | 267 ASSERT(isSoftwareResource(quad->resourceId())); |
| 268 CCResourceProvider::ScopedReadLockSoftware quadResourceLock(m_resourceProvid
er, quad->resourceId()); | 268 ResourceProvider::ScopedReadLockSoftware quadResourceLock(m_resourceProvider
, quad->resourceId()); |
| 269 | 269 |
| 270 SkIRect uvRect = toSkIRect(IntRect(quad->textureOffset(), quad->quadRect().s
ize())); | 270 SkIRect uvRect = toSkIRect(IntRect(quad->textureOffset(), quad->quadRect().s
ize())); |
| 271 m_skCurrentCanvas->drawBitmapRect(*quadResourceLock.skBitmap(), &uvRect, toS
kRect(quadVertexRect()), &m_skCurrentPaint); | 271 m_skCurrentCanvas->drawBitmapRect(*quadResourceLock.skBitmap(), &uvRect, toS
kRect(quadVertexRect()), &m_skCurrentPaint); |
| 272 } | 272 } |
| 273 | 273 |
| 274 void CCRendererSoftware::drawRenderPassQuad(const DrawingFrame& frame, const CCR
enderPassDrawQuad* quad) | 274 void SoftwareRenderer::drawRenderPassQuad(const DrawingFrame& frame, const Rende
rPassDrawQuad* quad) |
| 275 { | 275 { |
| 276 CachedTexture* contentsTexture = m_renderPassTextures.get(quad->renderPassId
()); | 276 CachedTexture* contentsTexture = m_renderPassTextures.get(quad->renderPassId
()); |
| 277 if (!contentsTexture || !contentsTexture->id()) | 277 if (!contentsTexture || !contentsTexture->id()) |
| 278 return; | 278 return; |
| 279 | 279 |
| 280 ASSERT(isSoftwareResource(contentsTexture->id())); | 280 ASSERT(isSoftwareResource(contentsTexture->id())); |
| 281 CCResourceProvider::ScopedReadLockSoftware contentsTextureLock(m_resourcePro
vider, contentsTexture->id()); | 281 ResourceProvider::ScopedReadLockSoftware contentsTextureLock(m_resourceProvi
der, contentsTexture->id()); |
| 282 | 282 |
| 283 const SkBitmap* bitmap = contentsTextureLock.skBitmap(); | 283 const SkBitmap* bitmap = contentsTextureLock.skBitmap(); |
| 284 | 284 |
| 285 SkRect sourceRect; | 285 SkRect sourceRect; |
| 286 bitmap->getBounds(&sourceRect); | 286 bitmap->getBounds(&sourceRect); |
| 287 | 287 |
| 288 SkRect destRect = toSkRect(quadVertexRect()); | 288 SkRect destRect = toSkRect(quadVertexRect()); |
| 289 | 289 |
| 290 SkMatrix matrix; | 290 SkMatrix matrix; |
| 291 matrix.setRectToRect(sourceRect, destRect, SkMatrix::kFill_ScaleToFit); | 291 matrix.setRectToRect(sourceRect, destRect, SkMatrix::kFill_ScaleToFit); |
| 292 | 292 |
| 293 SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(*bitmap, | 293 SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(*bitmap, |
| 294 SkShader::kClamp_
TileMode, | 294 SkShader::kClamp_
TileMode, |
| 295 SkShader::kClamp_
TileMode)); | 295 SkShader::kClamp_
TileMode)); |
| 296 shader->setLocalMatrix(matrix); | 296 shader->setLocalMatrix(matrix); |
| 297 m_skCurrentPaint.setShader(shader); | 297 m_skCurrentPaint.setShader(shader); |
| 298 | 298 |
| 299 if (quad->maskResourceId()) { | 299 if (quad->maskResourceId()) { |
| 300 CCResourceProvider::ScopedReadLockSoftware maskResourceLock(m_resourcePr
ovider, quad->maskResourceId()); | 300 ResourceProvider::ScopedReadLockSoftware maskResourceLock(m_resourceProv
ider, quad->maskResourceId()); |
| 301 const SkBitmap* maskBitmap = maskResourceLock.skBitmap(); | 301 const SkBitmap* maskBitmap = maskResourceLock.skBitmap(); |
| 302 | 302 |
| 303 SkMatrix maskMat; | 303 SkMatrix maskMat; |
| 304 maskMat.setRectToRect(toSkRect(quad->quadRect()), destRect, SkMatrix::kF
ill_ScaleToFit); | 304 maskMat.setRectToRect(toSkRect(quad->quadRect()), destRect, SkMatrix::kF
ill_ScaleToFit); |
| 305 maskMat.postTranslate(quad->maskTexCoordOffsetX(), quad->maskTexCoordOff
setY()); | 305 maskMat.postTranslate(quad->maskTexCoordOffsetX(), quad->maskTexCoordOff
setY()); |
| 306 | 306 |
| 307 SkAutoTUnref<SkShader> maskShader(SkShader::CreateBitmapShader(*maskBitm
ap, | 307 SkAutoTUnref<SkShader> maskShader(SkShader::CreateBitmapShader(*maskBitm
ap, |
| 308 SkShader:
:kClamp_TileMode, | 308 SkShader:
:kClamp_TileMode, |
| 309 SkShader:
:kClamp_TileMode)); | 309 SkShader:
:kClamp_TileMode)); |
| 310 maskShader->setLocalMatrix(maskMat); | 310 maskShader->setLocalMatrix(maskMat); |
| 311 | 311 |
| 312 SkPaint maskPaint; | 312 SkPaint maskPaint; |
| 313 maskPaint.setShader(maskShader); | 313 maskPaint.setShader(maskShader); |
| 314 | 314 |
| 315 SkAutoTUnref<SkLayerRasterizer> maskRasterizer(new SkLayerRasterizer); | 315 SkAutoTUnref<SkLayerRasterizer> maskRasterizer(new SkLayerRasterizer); |
| 316 maskRasterizer->addLayer(maskPaint); | 316 maskRasterizer->addLayer(maskPaint); |
| 317 | 317 |
| 318 m_skCurrentPaint.setRasterizer(maskRasterizer); | 318 m_skCurrentPaint.setRasterizer(maskRasterizer); |
| 319 m_skCurrentCanvas->drawRect(destRect, m_skCurrentPaint); | 319 m_skCurrentCanvas->drawRect(destRect, m_skCurrentPaint); |
| 320 } else { | 320 } else { |
| 321 // FIXME: Apply background filters and blend with contents | 321 // FIXME: Apply background filters and blend with contents |
| 322 m_skCurrentCanvas->drawRect(destRect, m_skCurrentPaint); | 322 m_skCurrentCanvas->drawRect(destRect, m_skCurrentPaint); |
| 323 } | 323 } |
| 324 } | 324 } |
| 325 | 325 |
| 326 void CCRendererSoftware::drawUnsupportedQuad(const DrawingFrame& frame, const CC
DrawQuad* quad) | 326 void SoftwareRenderer::drawUnsupportedQuad(const DrawingFrame& frame, const Draw
Quad* quad) |
| 327 { | 327 { |
| 328 m_skCurrentPaint.setColor(SK_ColorMAGENTA); | 328 m_skCurrentPaint.setColor(SK_ColorMAGENTA); |
| 329 m_skCurrentPaint.setAlpha(quad->opacity() * 255); | 329 m_skCurrentPaint.setAlpha(quad->opacity() * 255); |
| 330 m_skCurrentCanvas->drawRect(toSkRect(quadVertexRect()), m_skCurrentPaint); | 330 m_skCurrentCanvas->drawRect(toSkRect(quadVertexRect()), m_skCurrentPaint); |
| 331 } | 331 } |
| 332 | 332 |
| 333 bool CCRendererSoftware::swapBuffers() | 333 bool SoftwareRenderer::swapBuffers() |
| 334 { | 334 { |
| 335 if (CCProxy::hasImplThread()) | 335 if (Proxy::hasImplThread()) |
| 336 m_client->onSwapBuffersComplete(); | 336 m_client->onSwapBuffersComplete(); |
| 337 return true; | 337 return true; |
| 338 } | 338 } |
| 339 | 339 |
| 340 void CCRendererSoftware::getFramebufferPixels(void *pixels, const IntRect& rect) | 340 void SoftwareRenderer::getFramebufferPixels(void *pixels, const IntRect& rect) |
| 341 { | 341 { |
| 342 SkBitmap fullBitmap = m_outputDevice->lock(false)->getSkBitmap(); | 342 SkBitmap fullBitmap = m_outputDevice->lock(false)->getSkBitmap(); |
| 343 SkBitmap subsetBitmap; | 343 SkBitmap subsetBitmap; |
| 344 SkIRect invertRect = SkIRect::MakeXYWH(rect.x(), viewportSize().height() - r
ect.maxY(), rect.width(), rect.height()); | 344 SkIRect invertRect = SkIRect::MakeXYWH(rect.x(), viewportSize().height() - r
ect.maxY(), rect.width(), rect.height()); |
| 345 fullBitmap.extractSubset(&subsetBitmap, invertRect); | 345 fullBitmap.extractSubset(&subsetBitmap, invertRect); |
| 346 subsetBitmap.copyPixelsTo(pixels, rect.width() * rect.height() * 4, rect.wid
th() * 4); | 346 subsetBitmap.copyPixelsTo(pixels, rect.width() * rect.height() * 4, rect.wid
th() * 4); |
| 347 m_outputDevice->unlock(); | 347 m_outputDevice->unlock(); |
| 348 } | 348 } |
| 349 | 349 |
| 350 void CCRendererSoftware::setVisible(bool visible) | 350 void SoftwareRenderer::setVisible(bool visible) |
| 351 { | 351 { |
| 352 if (m_visible == visible) | 352 if (m_visible == visible) |
| 353 return; | 353 return; |
| 354 m_visible = visible; | 354 m_visible = visible; |
| 355 } | 355 } |
| 356 | 356 |
| 357 } | 357 } |
| OLD | NEW |