OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 return; | 339 return; |
340 | 340 |
341 GraphicsContext3D* context = layerRendererContext(); | 341 GraphicsContext3D* context = layerRendererContext(); |
342 const LayerTilerChromium::Program* program = layerRenderer()->tilerProgram()
; | 342 const LayerTilerChromium::Program* program = layerRenderer()->tilerProgram()
; |
343 GLC(context, context->useProgram(program->program())); | 343 GLC(context, context->useProgram(program->program())); |
344 GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(),
0)); | 344 GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(),
0)); |
345 GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0)); | 345 GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0)); |
346 | 346 |
347 int left, top, right, bottom; | 347 int left, top, right, bottom; |
348 contentRectToTileIndices(contentRect, left, top, right, bottom); | 348 contentRectToTileIndices(contentRect, left, top, right, bottom); |
| 349 IntRect layerRect = contentRectToLayerRect(contentRect); |
349 for (int j = top; j <= bottom; ++j) { | 350 for (int j = top; j <= bottom; ++j) { |
350 for (int i = left; i <= right; ++i) { | 351 for (int i = left; i <= right; ++i) { |
351 Tile* tile = tileAt(i, j); | 352 Tile* tile = tileAt(i, j); |
352 if (!tile) | 353 if (!tile) |
353 continue; | 354 continue; |
354 | 355 |
355 tile->texture()->bindTexture(); | 356 tile->texture()->bindTexture(); |
356 | 357 |
357 TransformationMatrix tileMatrix(globalTransform); | 358 TransformationMatrix tileMatrix(globalTransform); |
358 | 359 |
359 // Don't use tileContentRect here, as that contains the full | 360 // Don't use tileContentRect here, as that contains the full |
360 // rect with border texels which shouldn't be drawn. | 361 // rect with border texels which shouldn't be drawn. |
361 IntRect tileRect = m_tilingData.tileBounds(m_tilingData.tileIndex(ti
le->i(), tile->j())); | 362 IntRect tileRect = m_tilingData.tileBounds(m_tilingData.tileIndex(ti
le->i(), tile->j())); |
| 363 IntRect displayRect = tileRect; |
| 364 tileRect.intersect(layerRect); |
| 365 // Keep track of how the top left has moved, so the texture can be |
| 366 // offset the same amount. |
| 367 IntSize offset = tileRect.minXMinYCorner() - displayRect.minXMinYCor
ner(); |
362 tileRect.move(m_layerPosition.x(), m_layerPosition.y()); | 368 tileRect.move(m_layerPosition.x(), m_layerPosition.y()); |
363 tileMatrix.translate3d(tileRect.x() + tileRect.width() / 2.0, tileRe
ct.y() + tileRect.height() / 2.0, 0); | 369 tileMatrix.translate3d(tileRect.x() + tileRect.width() / 2.0, tileRe
ct.y() + tileRect.height() / 2.0, 0); |
364 | 370 |
365 IntPoint texOffset = m_tilingData.textureOffset(tile->i(), tile->j()
); | 371 IntPoint texOffset = m_tilingData.textureOffset(tile->i(), tile->j()
) + offset; |
366 float tileWidth = static_cast<float>(m_tileSize.width()); | 372 float tileWidth = static_cast<float>(m_tileSize.width()); |
367 float tileHeight = static_cast<float>(m_tileSize.height()); | 373 float tileHeight = static_cast<float>(m_tileSize.height()); |
368 float texTranslateX = texOffset.x() / tileWidth; | 374 float texTranslateX = texOffset.x() / tileWidth; |
369 float texTranslateY = texOffset.y() / tileHeight; | 375 float texTranslateY = texOffset.y() / tileHeight; |
370 float texScaleX = tileRect.width() / tileWidth; | 376 float texScaleX = tileRect.width() / tileWidth; |
371 float texScaleY = tileRect.height() / tileHeight; | 377 float texScaleY = tileRect.height() / tileHeight; |
372 // OpenGL coordinate system is bottom-up. | 378 // OpenGL coordinate system is bottom-up. |
373 // If tile texture is top-down, we need to flip the texture coordina
tes. | 379 // If tile texture is top-down, we need to flip the texture coordina
tes. |
374 if (m_textureUpdater->orientation() == LayerTextureUpdater::TopDownO
rientation) { | 380 if (m_textureUpdater->orientation() == LayerTextureUpdater::TopDownO
rientation) { |
375 texTranslateY += 1.0; | 381 texTranslateY += 1.0; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 | 419 |
414 GLC(context, context->uniform4f(program->vertexShader().texTransformLocation
(), | 420 GLC(context, context->uniform4f(program->vertexShader().texTransformLocation
(), |
415 texTranslateX, texTranslateY, texScaleX, texScaleY)); | 421 texTranslateX, texTranslateY, texScaleX, texScaleY)); |
416 | 422 |
417 GLC(context, context->drawElements(GraphicsContext3D::TRIANGLES, 6, Graphics
Context3D::UNSIGNED_SHORT, 0)); | 423 GLC(context, context->drawElements(GraphicsContext3D::TRIANGLES, 6, Graphics
Context3D::UNSIGNED_SHORT, 0)); |
418 } | 424 } |
419 | 425 |
420 } // namespace WebCore | 426 } // namespace WebCore |
421 | 427 |
422 #endif // USE(ACCELERATED_COMPOSITING) | 428 #endif // USE(ACCELERATED_COMPOSITING) |
OLD | NEW |