| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 University of Szeged | 2 * Copyright (C) 2010 University of Szeged |
| 3 * Copyright (C) 2010 Zoltan Herczeg | 3 * Copyright (C) 2010 Zoltan Herczeg |
| 4 * Copyright (C) 2013 Google Inc. All rights reserved. | 4 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 offset -= widthMultipliedByPixelSize; | 180 offset -= widthMultipliedByPixelSize; |
| 181 int topLeft = static_cast<int>(pixels->item(offset - cPixelSize + cAlphaChan
nelOffset)); | 181 int topLeft = static_cast<int>(pixels->item(offset - cPixelSize + cAlphaChan
nelOffset)); |
| 182 int top = static_cast<int>(pixels->item(offset + cAlphaChannelOffset)); | 182 int top = static_cast<int>(pixels->item(offset + cAlphaChannelOffset)); |
| 183 normalVector.setX(-topLeft + top - (left << 1) + (center << 1)); | 183 normalVector.setX(-topLeft + top - (left << 1) + (center << 1)); |
| 184 normalVector.setY(-topLeft - (top << 1) + left + (center << 1)); | 184 normalVector.setY(-topLeft - (top << 1) + left + (center << 1)); |
| 185 } | 185 } |
| 186 | 186 |
| 187 inline void FELighting::inlineSetPixel(int offset, LightingData& data, LightSour
ce::PaintingData& paintingData, | 187 inline void FELighting::inlineSetPixel(int offset, LightingData& data, LightSour
ce::PaintingData& paintingData, |
| 188 int lightX, int lightY, float factorX, fl
oat factorY, IntPoint& normal2DVector) | 188 int lightX, int lightY, float factorX, fl
oat factorY, IntPoint& normal2DVector) |
| 189 { | 189 { |
| 190 m_lightSource->updatePaintingData(paintingData, lightX, lightY, static_cast<
float>(data.pixels->item(offset + cAlphaChannelOffset)) * data.surfaceScale); | 190 data.lightSource->updatePaintingData(paintingData, lightX, lightY, static_ca
st<float>(data.pixels->item(offset + cAlphaChannelOffset)) * data.surfaceScale); |
| 191 | 191 |
| 192 float lightStrength; | 192 float lightStrength; |
| 193 if (!normal2DVector.x() && !normal2DVector.y()) { | 193 if (!normal2DVector.x() && !normal2DVector.y()) { |
| 194 // Normal vector is (0, 0, 1). This is a quite frequent case. | 194 // Normal vector is (0, 0, 1). This is a quite frequent case. |
| 195 if (m_lightingType == FELighting::DiffuseLighting) { | 195 if (m_lightingType == FELighting::DiffuseLighting) { |
| 196 lightStrength = m_diffuseConstant * paintingData.lightVector.z() / p
aintingData.lightVectorLength; | 196 lightStrength = m_diffuseConstant * paintingData.lightVector.z() / p
aintingData.lightVectorLength; |
| 197 } else { | 197 } else { |
| 198 FloatPoint3D halfwayVector = paintingData.lightVector; | 198 FloatPoint3D halfwayVector = paintingData.lightVector; |
| 199 halfwayVector.setZ(halfwayVector.z() + paintingData.lightVectorLengt
h); | 199 halfwayVector.setZ(halfwayVector.z() + paintingData.lightVectorLengt
h); |
| 200 float halfwayVectorLength = halfwayVector.length(); | 200 float halfwayVectorLength = halfwayVector.length(); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 inline void FELighting::platformApply(LightingData& data, LightSource::PaintingD
ata& paintingData) | 295 inline void FELighting::platformApply(LightingData& data, LightSource::PaintingD
ata& paintingData) |
| 296 { | 296 { |
| 297 // The selection here eventually should happen dynamically on some platforms
. | 297 // The selection here eventually should happen dynamically on some platforms
. |
| 298 #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC) | 298 #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC) |
| 299 platformApplyNeon(data, paintingData); | 299 platformApplyNeon(data, paintingData); |
| 300 #else | 300 #else |
| 301 platformApplyGeneric(data, paintingData); | 301 platformApplyGeneric(data, paintingData); |
| 302 #endif | 302 #endif |
| 303 } | 303 } |
| 304 | 304 |
| 305 void FELighting::getTransform(FloatPoint3D* scale, FloatSize* offset) const |
| 306 { |
| 307 FloatRect initialEffectRect = effectBoundaries(); |
| 308 FloatRect absoluteEffectRect = filter()->mapLocalRectToAbsoluteRect(initialE
ffectRect); |
| 309 FloatPoint absoluteLocation(absolutePaintRect().location()); |
| 310 FloatSize positionOffset(absoluteLocation - absoluteEffectRect.location()); |
| 311 offset->setWidth(positionOffset.width()); |
| 312 offset->setHeight(positionOffset.height()); |
| 313 scale->setX(initialEffectRect.width() > 0.0f && initialEffectRect.width() >
0.0f ? absoluteEffectRect.width() / initialEffectRect.width() : 1.0f); |
| 314 scale->setY(initialEffectRect.height() > 0.0f && initialEffectRect.height()
> 0.0f ? absoluteEffectRect.height() / initialEffectRect.height() : 1.0f); |
| 315 // X and Y scale should be the same, but, if not, do a best effort by averag
ing the 2 for Z scale |
| 316 scale->setZ(0.5f * (scale->x() + scale->y())); |
| 317 } |
| 318 |
| 305 bool FELighting::drawLighting(Uint8ClampedArray* pixels, int width, int height) | 319 bool FELighting::drawLighting(Uint8ClampedArray* pixels, int width, int height) |
| 306 { | 320 { |
| 307 LightSource::PaintingData paintingData; | 321 LightSource::PaintingData paintingData; |
| 308 LightingData data; | 322 LightingData data; |
| 309 | 323 |
| 310 if (!m_lightSource) | 324 if (!m_lightSource) |
| 311 return false; | 325 return false; |
| 312 | 326 |
| 313 // FIXME: do something if width or height (or both) is 1 pixel. | 327 // FIXME: do something if width or height (or both) is 1 pixel. |
| 314 // The W3 spec does not define this case. Now the filter just returns. | 328 // The W3 spec does not define this case. Now the filter just returns. |
| 315 if (width <= 2 || height <= 2) | 329 if (width <= 2 || height <= 2) |
| 316 return false; | 330 return false; |
| 317 | 331 |
| 318 data.pixels = pixels; | 332 data.pixels = pixels; |
| 319 data.surfaceScale = m_surfaceScale / 255.0f; | 333 data.surfaceScale = m_surfaceScale / 255.0f; |
| 320 data.widthMultipliedByPixelSize = width * cPixelSize; | 334 data.widthMultipliedByPixelSize = width * cPixelSize; |
| 321 data.widthDecreasedByOne = width - 1; | 335 data.widthDecreasedByOne = width - 1; |
| 322 data.heightDecreasedByOne = height - 1; | 336 data.heightDecreasedByOne = height - 1; |
| 337 FloatPoint3D worldScale; |
| 338 FloatSize originOffset; |
| 339 getTransform(&worldScale, &originOffset); |
| 340 RefPtr<LightSource> lightSource = m_lightSource->create(worldScale, originOf
fset); |
| 341 data.lightSource = lightSource.get(); |
| 323 Color lightColor = adaptColorToOperatingColorSpace(m_lightingColor); | 342 Color lightColor = adaptColorToOperatingColorSpace(m_lightingColor); |
| 324 paintingData.colorVector = FloatPoint3D(lightColor.red(), lightColor.green()
, lightColor.blue()); | 343 paintingData.colorVector = FloatPoint3D(lightColor.red(), lightColor.green()
, lightColor.blue()); |
| 325 m_lightSource->initPaintingData(paintingData); | 344 data.lightSource->initPaintingData(paintingData); |
| 326 | 345 |
| 327 // Top/Left corner. | 346 // Top/Left corner. |
| 328 IntPoint normalVector; | 347 IntPoint normalVector; |
| 329 int offset = 0; | 348 int offset = 0; |
| 330 data.topLeft(offset, normalVector); | 349 data.topLeft(offset, normalVector); |
| 331 setPixel(offset, data, paintingData, 0, 0, cFactor2div3, cFactor2div3, norma
lVector); | 350 setPixel(offset, data, paintingData, 0, 0, cFactor2div3, cFactor2div3, norma
lVector); |
| 332 | 351 |
| 333 // Top/Right pixel. | 352 // Top/Right pixel. |
| 334 offset = data.widthMultipliedByPixelSize - cPixelSize; | 353 offset = data.widthMultipliedByPixelSize - cPixelSize; |
| 335 data.topRight(offset, normalVector); | 354 data.topRight(offset, normalVector); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 GraphicsContext* dstContext = resultImage->context(); | 505 GraphicsContext* dstContext = resultImage->context(); |
| 487 | 506 |
| 488 SkPaint paint; | 507 SkPaint paint; |
| 489 RefPtr<SkImageFilter> filter = createImageFilter(0); | 508 RefPtr<SkImageFilter> filter = createImageFilter(0); |
| 490 paint.setImageFilter(filter.get()); | 509 paint.setImageFilter(filter.get()); |
| 491 dstContext->drawBitmap(nativeImage->bitmap(), drawingRegion.location().x(),
drawingRegion.location().y(), &paint); | 510 dstContext->drawBitmap(nativeImage->bitmap(), drawingRegion.location().x(),
drawingRegion.location().y(), &paint); |
| 492 return true; | 511 return true; |
| 493 } | 512 } |
| 494 | 513 |
| 495 } // namespace WebCore | 514 } // namespace WebCore |
| OLD | NEW |