Index: experimental/flocking_geese/nacl_app/sprite.cc |
diff --git a/experimental/flocking_geese/nacl_app/sprite.cc b/experimental/flocking_geese/nacl_app/sprite.cc |
deleted file mode 100644 |
index ed0e45c17d41dc0027cd8cff1062c8648bf348dc..0000000000000000000000000000000000000000 |
--- a/experimental/flocking_geese/nacl_app/sprite.cc |
+++ /dev/null |
@@ -1,104 +0,0 @@ |
-// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "nacl_app/sprite.h" |
- |
-#include <algorithm> |
- |
-namespace { |
-const uint32_t kRedBlueMask = 0x00FF00FF; |
-const uint32_t kGreenMask = 0x0000FF00; |
-const uint32_t kAlphaMask = 0xFF000000; |
-const uint32_t k8x2Scale = 0x800080; |
-const uint32_t kPixelOne = 0xFF; |
-const uint32_t kAlphaShift = 24; |
- |
-// Use Blinn & Smith's method of scaling by 256, instead of 255. Blends two |
-// colour channels simultaneously: the R and B of an ARGB pixel. |
-// This code expects rb as a packed 16:16 fixed point number, and a as an 8-bit |
-// value in [0..255]. |
-inline uint32_t Blend8x2(uint32_t rb, uint32_t a) { |
- rb &= kRedBlueMask; |
- uint32_t blend = a * rb + k8x2Scale; // Scale by 256. |
- return (blend + ((blend >> 8) & kRedBlueMask)) >> 8 & kRedBlueMask; |
-} |
- |
-} // namespace |
- |
-namespace flocking_geese { |
- |
-Sprite::Sprite(uint32_t* pixel_buffer, |
- const pp::Size& size, |
- int32_t row_bytes) { |
- SetPixelBuffer(pixel_buffer, size, row_bytes); |
-} |
- |
-void Sprite::SetPixelBuffer(uint32_t* pixel_buffer, |
- const pp::Size& size, |
- int32_t row_bytes) { |
- pixel_buffer_.reset(pixel_buffer); |
- pixel_buffer_size_ = size; |
- row_bytes_ = row_bytes ? row_bytes : size.width() * sizeof(uint32_t); |
-} |
- |
-void Sprite::CompositeFromRectToPoint(const pp::Rect& src_rect, |
- uint32_t* dest_pixel_buffer, |
- const pp::Rect& dest_bounds, |
- int32_t dest_row_bytes, |
- const pp::Point& dest_point) const { |
- // Clip the source rect to the source image bounds. |
- pp::Rect src_bounds(pp::Point(), size()); |
- pp::Rect src_rect_clipped(src_rect.Intersect(src_bounds)); |
- if (src_rect_clipped.IsEmpty()) |
- return; |
- |
- // Create a clipped rect in the destination coordinate space that contains the |
- // final image. |
- pp::Rect draw_rect(dest_point, src_rect_clipped.size()); |
- pp::Rect draw_rect_clipped(dest_bounds.Intersect(draw_rect)); |
- if (draw_rect_clipped.IsEmpty()) |
- return; |
- // Transform the destination rectangle back to the source image coordinate |
- // system: Translate(-dest_point) . Translate(src_rect_clipped.origin). |
- pp::Point src_offset(draw_rect_clipped.point()); |
- src_offset -= dest_point; |
- src_rect_clipped.Offset(src_offset); |
- src_rect_clipped.set_size(draw_rect_clipped.size()); |
- size_t src_byte_offset = src_rect_clipped.x() * sizeof(uint32_t) + |
- src_rect_clipped.y() * row_bytes_; |
- const uint8_t* src_pixels = |
- reinterpret_cast<const uint8_t*>(pixel_buffer_.get()) + src_byte_offset; |
- |
- if (dest_row_bytes == 0) |
- dest_row_bytes = dest_bounds.width() * sizeof(uint32_t); |
- size_t dest_byte_offset = draw_rect_clipped.point().x() * sizeof(uint32_t) + |
- draw_rect_clipped.point().y() * dest_row_bytes; |
- uint8_t* dest_pixels = reinterpret_cast<uint8_t*>(dest_pixel_buffer) + |
- dest_byte_offset; |
- |
- // All the pointers are set up, now do the SOver. Note that the only pre- |
- // multiplied alpha formats are supported. |
- for (int32_t y = 0; y < src_rect_clipped.height(); ++y) { |
- const uint32_t* src_scanline = |
- reinterpret_cast<const uint32_t*>(src_pixels); |
- uint32_t* dest_scanline = reinterpret_cast<uint32_t*>(dest_pixels); |
- for (int32_t x = 0; x < src_rect_clipped.width(); ++x) { |
- uint32_t src = *src_scanline++; |
- uint32_t dst = *dest_scanline; |
- uint32_t alpha = (src >> kAlphaShift) & kPixelOne; |
- uint32_t one_minus_alpha = kPixelOne - alpha; |
- // Compute RB and G separately: this allows for SIMD-like behaviour |
- // when multiplying the channels by alpha. Note that over-saturated |
- // pixels will wrap to 0 and not clamp. |
- uint32_t dst_rb = Blend8x2(dst, one_minus_alpha); |
- uint32_t dst_ga = Blend8x2(dst >> 8, one_minus_alpha) << 8; |
- *dest_scanline++ = src + dst_rb + dst_ga; |
- } |
- src_pixels += row_bytes_; |
- dest_pixels += dest_row_bytes; |
- } |
-} |
- |
-} // namespace flocking_geese |
- |