Upstream version 10.38.220.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / android / thumbnail / thumbnail_store.cc
index 52d9205..dbe0fb2 100644 (file)
@@ -295,6 +295,22 @@ void ThumbnailStore::UpdateVisibleIds(const TabIdList& priority) {
   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 =
@@ -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<SkPixelRef>, 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<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() {
 }