ReadNextThumbnail();
}
+void ThumbnailStore::DecompressThumbnailFromFile(
+ TabId tab_id,
+ const base::Callback<void(bool, SkBitmap)>&
+ post_decompress_callback) {
+ base::FilePath file_path = GetFilePath(tab_id);
+
+ base::Callback<void(skia::RefPtr<SkPixelRef>, float, const gfx::Size&)>
+ decompress_task = base::Bind(
+ &ThumbnailStore::DecompressionTask, post_decompress_callback);
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&ThumbnailStore::ReadTask, true, file_path, decompress_task));
+}
+
void ThumbnailStore::RemoveFromDisk(TabId tab_id) {
base::FilePath file_path = GetFilePath(tab_id);
base::Closure task =
content::BrowserThread::PostTask(
content::BrowserThread::FILE,
FROM_HERE,
- base::Bind(&ThumbnailStore::ReadTask, file_path, post_read_task));
+ base::Bind(&ThumbnailStore::ReadTask, false, file_path, post_read_task));
}
void ThumbnailStore::MakeSpaceForNewItemIfNecessary(TabId tab_id) {
}// anonymous namespace
void ThumbnailStore::ReadTask(
+ bool decompress,
const base::FilePath& file_path,
const base::Callback<
void(skia::RefPtr<SkPixelRef>, float, const gfx::Size&)>&
if (base::PathExists(file_path)) {
base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+
bool valid_contents = ReadFromFile(file,
&content_size,
&scale,
}
}
- content::BrowserThread::PostTask(
- content::BrowserThread::UI,
- FROM_HERE,
- base::Bind(post_read_task, compressed_data, scale, content_size));
+ if (decompress) {
+ base::WorkerPool::PostTask(
+ FROM_HERE,
+ base::Bind(post_read_task, compressed_data, scale, content_size),
+ true);
+ } else {
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(post_read_task, compressed_data, scale, content_size));
+ }
}
void ThumbnailStore::PostReadTask(TabId tab_id,
return;
}
+void ThumbnailStore::DecompressionTask(
+ const base::Callback<void(bool, SkBitmap)>&
+ post_decompression_callback,
+ skia::RefPtr<SkPixelRef> compressed_data,
+ float scale,
+ const gfx::Size& content_size) {
+ SkBitmap raw_data_small;
+ bool success = false;
+
+ if (compressed_data.get()) {
+ gfx::Size buffer_size = gfx::Size(compressed_data->info().width(),
+ compressed_data->info().height());
+
+ SkBitmap raw_data;
+ raw_data.allocPixels(SkImageInfo::Make(buffer_size.width(),
+ buffer_size.height(),
+ kRGBA_8888_SkColorType,
+ kOpaque_SkAlphaType));
+ SkAutoLockPixels raw_data_lock(raw_data);
+ compressed_data->lockPixels();
+ success = etc1_decode_image(
+ reinterpret_cast<unsigned char*>(compressed_data->pixels()),
+ reinterpret_cast<unsigned char*>(raw_data.getPixels()),
+ buffer_size.width(),
+ buffer_size.height(),
+ raw_data.bytesPerPixel(),
+ raw_data.rowBytes());
+ compressed_data->unlockPixels();
+ raw_data.setImmutable();
+
+ if (!success) {
+ // Leave raw_data_small empty for consistency with other failure modes.
+ } else if (content_size == buffer_size) {
+ // Shallow copy the pixel reference.
+ raw_data_small = raw_data;
+ } else {
+ // The content size is smaller than the buffer size (likely because of
+ // a power-of-two rounding), so deep copy the bitmap.
+ raw_data_small.allocPixels(SkImageInfo::Make(content_size.width(),
+ content_size.height(),
+ kRGBA_8888_SkColorType,
+ kOpaque_SkAlphaType));
+ SkAutoLockPixels raw_data_small_lock(raw_data_small);
+ SkCanvas small_canvas(raw_data_small);
+ small_canvas.drawBitmap(raw_data, 0, 0);
+ raw_data_small.setImmutable();
+ }
+ }
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(post_decompression_callback, success, raw_data_small));
+}
+
ThumbnailStore::ThumbnailMetaData::ThumbnailMetaData() {
}