X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fchrome%2Fbrowser%2Fandroid%2Fthumbnail%2Fthumbnail_store.cc;h=dbe0fb23b71ea1758199f580a27c9837cb74ddce;hb=ac5c4e12d0a033d1c358a787e329f167d4ded761;hp=52d92059275cf0530bf13f859855bb543ea756be;hpb=0a7e0ff458505735434b51cfa564902cdb901fc1;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/chrome/browser/android/thumbnail/thumbnail_store.cc b/src/chrome/browser/android/thumbnail/thumbnail_store.cc index 52d9205..dbe0fb2 100644 --- a/src/chrome/browser/android/thumbnail/thumbnail_store.cc +++ b/src/chrome/browser/android/thumbnail/thumbnail_store.cc @@ -295,6 +295,22 @@ void ThumbnailStore::UpdateVisibleIds(const TabIdList& priority) { ReadNextThumbnail(); } +void ThumbnailStore::DecompressThumbnailFromFile( + TabId tab_id, + const base::Callback& + post_decompress_callback) { + base::FilePath file_path = GetFilePath(tab_id); + + base::Callback, 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 = @@ -388,7 +404,7 @@ void ThumbnailStore::ReadNextThumbnail() { 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) { @@ -718,6 +734,7 @@ bool ReadFromFile(base::File& file, }// anonymous namespace void ThumbnailStore::ReadTask( + bool decompress, const base::FilePath& file_path, const base::Callback< void(skia::RefPtr, float, const gfx::Size&)>& @@ -729,6 +746,7 @@ void ThumbnailStore::ReadTask( 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, @@ -743,10 +761,17 @@ void ThumbnailStore::ReadTask( } } - 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, @@ -803,6 +828,61 @@ void ThumbnailStore::RemoveOnMatchedTimeStamp(TabId tab_id, return; } +void ThumbnailStore::DecompressionTask( + const base::Callback& + post_decompression_callback, + skia::RefPtr 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(compressed_data->pixels()), + reinterpret_cast(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() { }