OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/android/thumbnail/thumbnail_store.h" | 5 #include "chrome/browser/android/thumbnail/thumbnail_store.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/big_endian.h" | 10 #include "base/big_endian.h" |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
833 Remove(tab_id); | 833 Remove(tab_id); |
834 } | 834 } |
835 return; | 835 return; |
836 } | 836 } |
837 | 837 |
838 void ThumbnailStore::DecompressionTask( | 838 void ThumbnailStore::DecompressionTask( |
839 const base::Callback<void(bool, SkBitmap)>& | 839 const base::Callback<void(bool, SkBitmap)>& |
840 post_decompression_callback, | 840 post_decompression_callback, |
841 skia::RefPtr<SkPixelRef> compressed_data, | 841 skia::RefPtr<SkPixelRef> compressed_data, |
842 float scale, | 842 float scale, |
843 const gfx::Size& encoded_size) { | 843 const gfx::Size& content_size) { |
844 SkBitmap raw_data; | 844 SkBitmap raw_data_small; |
845 bool success = false; | 845 bool success = false; |
846 | 846 |
847 if (compressed_data.get()) { | 847 if (compressed_data.get()) { |
848 gfx::Size buffer_size = gfx::Size(compressed_data->info().width(), | |
849 compressed_data->info().height()); | |
850 | |
848 size_t pixel_size = 4; // Pixel size is 4 bytes for kARGB_8888_Config. | 851 size_t pixel_size = 4; // Pixel size is 4 bytes for kARGB_8888_Config. |
849 size_t stride = pixel_size * encoded_size.width(); | 852 size_t stride = pixel_size * buffer_size.width(); |
850 | 853 |
851 raw_data.allocPixels(SkImageInfo::Make(encoded_size.width(), | 854 SkBitmap raw_data; |
852 encoded_size.height(), | 855 raw_data.allocPixels(SkImageInfo::Make(buffer_size.width(), |
853 kRGBA_8888_SkColorType, | 856 buffer_size.height(), |
854 kOpaque_SkAlphaType)); | 857 kRGBA_8888_SkColorType, |
858 kOpaque_SkAlphaType)); | |
855 SkAutoLockPixels raw_data_lock(raw_data); | 859 SkAutoLockPixels raw_data_lock(raw_data); |
860 compressed_data->lockPixels(); | |
856 success = etc1_decode_image( | 861 success = etc1_decode_image( |
857 reinterpret_cast<unsigned char*>(compressed_data->pixels()), | 862 reinterpret_cast<unsigned char*>(compressed_data->pixels()), |
858 reinterpret_cast<unsigned char*>(raw_data.getPixels()), | 863 reinterpret_cast<unsigned char*>(raw_data.getPixels()), |
859 encoded_size.width(), | 864 buffer_size.width(), |
860 encoded_size.height(), | 865 buffer_size.height(), |
861 pixel_size, | 866 pixel_size, |
862 stride); | 867 stride); |
868 compressed_data->unlockPixels(); | |
863 raw_data.setImmutable(); | 869 raw_data.setImmutable(); |
870 | |
871 if (!success || content_size == buffer_size) { | |
872 // Shallow copy the pixel reference. | |
873 raw_data_small = raw_data; | |
874 } else { | |
875 // The content size is smaller than the buffer size (likely because of | |
876 // a power-of-two rounding), so deep copy the bitmap. | |
877 raw_data_small.allocPixels(SkImageInfo::Make(content_size.width(), | |
Yusuf
2014/09/23 23:52:49
indent +4
| |
878 content_size.height(), | |
879 kRGBA_8888_SkColorType, | |
880 kOpaque_SkAlphaType)); | |
881 SkAutoLockPixels raw_data_small_lock(raw_data_small); | |
882 SkCanvas small_canvas(raw_data_small); | |
883 small_canvas.drawBitmap(raw_data, 0, 0); | |
884 raw_data_small.setImmutable(); | |
885 } | |
864 } | 886 } |
865 | 887 |
866 content::BrowserThread::PostTask( | 888 content::BrowserThread::PostTask( |
867 content::BrowserThread::UI, | 889 content::BrowserThread::UI, |
868 FROM_HERE, | 890 FROM_HERE, |
869 base::Bind(post_decompression_callback, success, raw_data)); | 891 base::Bind(post_decompression_callback, success, raw_data_small)); |
870 } | 892 } |
871 | 893 |
872 ThumbnailStore::ThumbnailMetaData::ThumbnailMetaData() { | 894 ThumbnailStore::ThumbnailMetaData::ThumbnailMetaData() { |
873 } | 895 } |
874 | 896 |
875 ThumbnailStore::ThumbnailMetaData::ThumbnailMetaData( | 897 ThumbnailStore::ThumbnailMetaData::ThumbnailMetaData( |
876 const base::Time& current_time, | 898 const base::Time& current_time, |
877 const GURL& url) | 899 const GURL& url) |
878 : capture_time_(current_time), url_(url) { | 900 : capture_time_(current_time), url_(url) { |
879 } | 901 } |
(...skipping 16 matching lines...) Expand all Loading... | |
896 dst_bitmap.eraseColor(0); | 918 dst_bitmap.eraseColor(0); |
897 SkAutoLockPixels dst_bitmap_lock(dst_bitmap); | 919 SkAutoLockPixels dst_bitmap_lock(dst_bitmap); |
898 | 920 |
899 SkCanvas canvas(dst_bitmap); | 921 SkCanvas canvas(dst_bitmap); |
900 canvas.scale(new_scale, new_scale); | 922 canvas.scale(new_scale, new_scale); |
901 canvas.drawBitmap(bitmap, 0, 0, NULL); | 923 canvas.drawBitmap(bitmap, 0, 0, NULL); |
902 dst_bitmap.setImmutable(); | 924 dst_bitmap.setImmutable(); |
903 | 925 |
904 return std::make_pair(dst_bitmap, new_scale * scale); | 926 return std::make_pair(dst_bitmap, new_scale * scale); |
905 } | 927 } |
OLD | NEW |