Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: chrome/browser/android/thumbnail/thumbnail_store.cc

Issue 470233003: Restrict ETC1 power-of-two rounding to old IMG drivers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/thumbnail/thumbnail_store.cc
diff --git a/chrome/browser/android/thumbnail/thumbnail_store.cc b/chrome/browser/android/thumbnail/thumbnail_store.cc
index 52d92059275cf0530bf13f859855bb543ea756be..272f6ab845825a61b0dd0ae515329cdc5eeeb872 100644
--- a/chrome/browser/android/thumbnail/thumbnail_store.cc
+++ b/chrome/browser/android/thumbnail/thumbnail_store.cc
@@ -38,8 +38,6 @@ const int kCurrentExtraVersion = 1;
// Indicates whether we prefer to have more free CPU memory over GPU memory.
const bool kPreferCPUMemory = true;
-// TODO(): ETC1 texture sizes should be multiples of four, but some drivers only
-// allow power-of-two ETC1 textures. Find better work around.
size_t NextPowerOfTwo(size_t x) {
--x;
x |= x >> 1;
@@ -50,10 +48,22 @@ size_t NextPowerOfTwo(size_t x) {
return x + 1;
}
-gfx::Size GetEncodedSize(const gfx::Size& bitmap_size) {
+size_t RoundUpMod4(size_t x) {
David Trainor- moved to gerrit 2014/08/21 22:15:00 (x + 3) & ~3 (is what most ETC1 libs use).
aelias_OOO_until_Jul13 2014/08/21 22:56:12 Done.
+ size_t mod = x % 4;
+ if (mod) {
+ x += 4 - mod;
+ }
+ return x;
+}
+
+gfx::Size GetEncodedSize(const gfx::Size& bitmap_size, bool supports_npot) {
DCHECK(!bitmap_size.IsEmpty());
- return gfx::Size(NextPowerOfTwo(bitmap_size.width()),
- NextPowerOfTwo(bitmap_size.height()));
+ if (!supports_npot)
+ return gfx::Size(NextPowerOfTwo(bitmap_size.width()),
+ NextPowerOfTwo(bitmap_size.height()));
+ else
+ return gfx::Size(RoundUpMod4(bitmap_size.width()),
+ RoundUpMod4(bitmap_size.height()));
}
template<typename T>
@@ -365,11 +375,16 @@ void ThumbnailStore::CompressThumbnailIfNecessary(
time_stamp,
scale);
- base::WorkerPool::PostTask(
- FROM_HERE,
- base::Bind(
- &ThumbnailStore::CompressionTask, bitmap, post_compression_task),
- true);
+ gfx::Size raw_data_size(bitmap.width(), bitmap.height());
+ gfx::Size encoded_size = GetEncodedSize(
+ raw_data_size, ui_resource_provider_->SupportsETC1NonPowerOfTwo());
+
+ base::WorkerPool::PostTask(FROM_HERE,
+ base::Bind(&ThumbnailStore::CompressionTask,
+ bitmap,
+ encoded_size,
+ post_compression_task),
+ true);
}
void ThumbnailStore::ReadNextThumbnail() {
@@ -539,6 +554,7 @@ void ThumbnailStore::PostWriteTask() {
void ThumbnailStore::CompressionTask(
SkBitmap raw_data,
+ gfx::Size encoded_size,
const base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)>&
post_compression_task) {
skia::RefPtr<SkPixelRef> compressed_data;
@@ -550,7 +566,6 @@ void ThumbnailStore::CompressionTask(
size_t pixel_size = 4; // Pixel size is 4 bytes for kARGB_8888_Config.
size_t stride = pixel_size * raw_data_size.width();
- gfx::Size encoded_size = GetEncodedSize(raw_data_size);
size_t encoded_bytes =
etc1_get_encoded_data_size(encoded_size.width(), encoded_size.height());
SkImageInfo info = {encoded_size.width(),

Powered by Google App Engine
This is Rietveld 408576698