Index: skia/ext/image_operations.cc |
=================================================================== |
--- skia/ext/image_operations.cc (revision 14712) |
+++ skia/ext/image_operations.cc (working copy) |
@@ -15,8 +15,6 @@ |
#include "base/stack_container.h" |
#include "SkBitmap.h" |
#include "skia/ext/convolver.h" |
-#include "skia/include/SkColorPriv.h" |
-#include "skia/ext/skia_utils.h" |
namespace skia { |
@@ -265,7 +263,7 @@ |
"The supplied subset does not fall within the destination image."; |
// If the size of source or destination is 0, i.e. 0x0, 0xN or Nx0, just |
- // return empty. |
+ // return empty |
if (source.width() < 1 || source.height() < 1 || |
dest_width < 1 || dest_height < 1) |
return SkBitmap(); |
@@ -317,10 +315,11 @@ |
// Optimize for case where we won't need to blend anything. |
static const double alpha_min = 1.0 / 255; |
static const double alpha_max = 254.0 / 255; |
- if (alpha < alpha_min) |
+ if (alpha < alpha_min) { |
return first; |
- else if (alpha > alpha_max) |
+ } else if (alpha > alpha_max) { |
return second; |
+ } |
SkAutoLockPixels lock_first(first); |
SkAutoLockPixels lock_second(second); |
@@ -362,206 +361,5 @@ |
return blended; |
} |
-// static |
-SkBitmap ImageOperations::CreateMaskedBitmap(const SkBitmap& rgb, |
- const SkBitmap& alpha) { |
- DCHECK(rgb.width() == alpha.width()); |
- DCHECK(rgb.height() == alpha.height()); |
- DCHECK(rgb.bytesPerPixel() == alpha.bytesPerPixel()); |
- DCHECK(rgb.config() == SkBitmap::kARGB_8888_Config); |
- DCHECK(alpha.config() == SkBitmap::kARGB_8888_Config); |
- |
- SkBitmap masked; |
- masked.setConfig(SkBitmap::kARGB_8888_Config, rgb.width(), rgb.height(), 0); |
- masked.allocPixels(); |
- masked.eraseARGB(0, 0, 0, 0); |
- |
- SkAutoLockPixels lock_rgb(rgb); |
- SkAutoLockPixels lock_alpha(alpha); |
- SkAutoLockPixels lock_masked(masked); |
- |
- for (int y = 0; y < rgb.height(); y++) { |
- uint32* rgb_row = rgb.getAddr32(0, y); |
- uint32* alpha_row = alpha.getAddr32(0, y); |
- uint32* dst_row = masked.getAddr32(0, y); |
- |
- for (int x = 0; x < rgb.width(); x++) { |
- uint32 alpha_pixel = alpha_row[x]; |
- uint32 rgb_pixel = rgb_row[x]; |
- |
- int alpha = SkColorGetA(alpha_pixel); |
- dst_row[x] = SkColorSetARGB(alpha, |
- SkAlphaMul(SkColorGetR(rgb_pixel), alpha), |
- SkAlphaMul(SkColorGetG(rgb_pixel), alpha), |
- SkAlphaMul(SkColorGetB(rgb_pixel), alpha)); |
- } |
- } |
- |
- return masked; |
-} |
- |
-SkBitmap ImageOperations::CreateBlurredBitmap(const SkBitmap& bitmap, |
- int blur_amount ) { |
- DCHECK(bitmap.config() == SkBitmap::kARGB_8888_Config); |
- |
- // Blur factor (1 divided by how many pixels the blur takes place over). |
- double v = 1.0 / pow(static_cast<double>(blur_amount * 2 + 1), 2); |
- |
- SkBitmap blurred; |
- blurred.setConfig(SkBitmap::kARGB_8888_Config, bitmap.width(), |
- bitmap.height(), 0); |
- blurred.allocPixels(); |
- blurred.eraseARGB(0, 0, 0, 0); |
- |
- SkAutoLockPixels lock_bitmap(bitmap); |
- SkAutoLockPixels lock_blurred(blurred); |
- |
- // Loop through every pixel in the image. |
- for (int y = 0; y < bitmap.height(); y++) { // Skip top and bottom edges. |
- uint32* dst_row = blurred.getAddr32(0, y); |
- |
- for (int x = 0; x < bitmap.width(); x++) { // Skip left and right edges. |
- // Sums for this pixel. |
- double a = 0; |
- double r = 0; |
- double g = 0; |
- double b = 0; |
- |
- for (int ky = -blur_amount; ky <= blur_amount; ky++) { |
- for (int kx = -blur_amount; kx <= blur_amount; kx++) { |
- // Calculate the adjacent pixel for this kernel point. Blurs |
- // are wrapped. |
- int bx = (x + kx) % bitmap.width(); |
- while (bx < 0) |
- bx += bitmap.width(); |
- int by = (y + ky) % bitmap.height(); |
- while (by < 0) |
- by += bitmap.height(); |
- |
- uint32 src_pixel = bitmap.getAddr32(0, by)[bx]; |
- |
- a += v * static_cast<double>(SkColorGetA(src_pixel)); |
- r += v * static_cast<double>(SkColorGetR(src_pixel)); |
- g += v * static_cast<double>(SkColorGetG(src_pixel)); |
- b += v * static_cast<double>(SkColorGetB(src_pixel)); |
- } |
- } |
- |
- dst_row[x] = SkColorSetARGB( |
- static_cast<int>(a), |
- static_cast<int>(r), |
- static_cast<int>(g), |
- static_cast<int>(b)); |
- } |
- } |
- |
- return blurred; |
-} |
- |
-// static |
-SkBitmap ImageOperations::CreateHSLShiftedBitmap(const SkBitmap& bitmap, |
- float hsl_shift[3]) { |
- DCHECK(bitmap.config() == SkBitmap::kARGB_8888_Config); |
- |
- SkBitmap shifted; |
- shifted.setConfig(SkBitmap::kARGB_8888_Config, bitmap.width(), |
- bitmap.height(), 0); |
- shifted.allocPixels(); |
- shifted.eraseARGB(0, 0, 0, 0); |
- shifted.setIsOpaque(false); |
- |
- SkAutoLockPixels lock_bitmap(bitmap); |
- SkAutoLockPixels lock_shifted(shifted); |
- |
- // Loop through the pixels of the original bitmap. |
- for (int y = 0; y < bitmap.height(); y++) { |
- SkColor* pixels = bitmap.getAddr32(0, y); |
- SkColor* tinted_pixels = shifted.getAddr32(0, y); |
- |
- for (int x = 0; x < bitmap.width(); x++) { |
- // Convert the color of this pixel to HSL. |
- SkPMColor color = pixels[x]; |
- int alpha = SkColorGetA(color); |
- if (alpha != 255) { |
- // We have to normalize the colors as they're pre-multiplied. |
- double r = SkColorGetR(color) / static_cast<double>(alpha); |
- double g = SkColorGetG(color) / static_cast<double>(alpha); |
- double b = SkColorGetB(color) / static_cast<double>(alpha); |
- color = SkColorSetARGB(255, |
- static_cast<int>(r * 255.0), |
- static_cast<int>(g * 255.0), |
- static_cast<int>(b * 255.0)); |
- } |
- |
- float pixel_hsl[3]; |
- SkColorToHSL(color, pixel_hsl); |
- |
- // Replace the hue with the tint's hue. |
- if (hsl_shift[0] >= 0) |
- pixel_hsl[0] = hsl_shift[0]; |
- |
- // Change the saturation. |
- if (hsl_shift[1] >= 0) { |
- if (hsl_shift[1] <= 0.5) { |
- pixel_hsl[1] *= hsl_shift[1] * 2.0; |
- } else { |
- pixel_hsl[1] = pixel_hsl[1] + (1.0 - pixel_hsl[1]) * |
- ((hsl_shift[1] - 0.5) * 2.0); |
- } |
- } |
- |
- // Change the lightness. |
- if (hsl_shift[2] >= 0) { |
- if (hsl_shift[2] <= 0.5) { |
- pixel_hsl[2] *= hsl_shift[2] * 2.0; |
- } else { |
- pixel_hsl[2] = pixel_hsl[2] + (1.0 - pixel_hsl[2]) * |
- ((hsl_shift[2] - 0.5) * 2.0); |
- } |
- } |
- |
- // Convert back to RGB. |
- tinted_pixels[x] = HSLToSKColor(alpha, pixel_hsl); |
- } |
- } |
- |
- return shifted; |
-} |
- |
-// static |
-SkBitmap ImageOperations::CreateTiledBitmap(const SkBitmap& source, |
- int src_x, int src_y, |
- int dst_w, int dst_h) { |
- DCHECK(source.getConfig() == SkBitmap::kARGB_8888_Config); |
- |
- SkBitmap cropped; |
- cropped.setConfig(SkBitmap::kARGB_8888_Config, dst_w, dst_h, 0); |
- cropped.allocPixels(); |
- cropped.eraseARGB(0, 0, 0, 0); |
- |
- SkAutoLockPixels lock_source(source); |
- SkAutoLockPixels lock_cropped(cropped); |
- |
- // Loop through the pixels of the original bitmap. |
- for (int y = 0; y < dst_h; y++) { |
- int y_pix = (src_y + y) % source.height(); |
- while (y_pix < 0) |
- y_pix += source.height(); |
- |
- uint32* source_row = source.getAddr32(0, y_pix); |
- uint32* dst_row = cropped.getAddr32(0, y); |
- |
- for (int x = 0; x < dst_w; x++) { |
- int x_pix = (src_x + x) % source.width(); |
- while (x_pix < 0) |
- x_pix += source.width(); |
- |
- dst_row[x] = source_row[x_pix]; |
- } |
- } |
- |
- return cropped; |
-} |
- |
} // namespace skia |