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 |