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

Unified Diff: src/core/SkMipMapLevel.cpp

Issue 1249543003: Creating functions for uploading a mipmapped texture. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Refactoring the mipmap level count out. Cleaning includes. Created 4 years, 11 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: src/core/SkMipMapLevel.cpp
diff --git a/src/core/SkMipMapLevel.cpp b/src/core/SkMipMapLevel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4bb0195704ea441b62a2970b5e4b86e5e3dd09a5
--- /dev/null
+++ b/src/core/SkMipMapLevel.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#include "SkMath.h"
+#include "SkMipMapLevel.h"
+#include "SkTypes.h"
+
+SkMipMapLevel::SkMipMapLevel(const void* texelsOrOffset, size_t rowBytes, int width, int height)
+ : fTexelsOrOffset(texelsOrOffset)
+ , fRowBytes(rowBytes)
+ , fWidth(width)
+ , fHeight(height)
+{
+}
+
+SkMipMapLevel::SkMipMapLevel(SkMipMapLevel&& rhs)
+ : fTexelsOrOffset(rhs.fTexelsOrOffset)
+ , fRowBytes(rhs.fRowBytes)
+ , fWidth(rhs.fWidth)
+ , fHeight(rhs.fHeight)
+{
+ rhs.fTexelsOrOffset = nullptr;
+ rhs.fRowBytes = 0;
+ rhs.fWidth = 0;
+ rhs.fHeight = 0;
+}
+
+SkMipMapLevel& SkMipMapLevel::operator =(SkMipMapLevel&& rhs) {
+ fTexelsOrOffset = rhs.fTexelsOrOffset;
+ fRowBytes = rhs.fRowBytes;
+ fWidth = rhs.fWidth;
+ fHeight = rhs.fHeight;
+
+ rhs.fTexelsOrOffset = nullptr;
+ rhs.fRowBytes = 0;
+ rhs.fWidth = 0;
+ rhs.fHeight = 0;
+
+ return *this;
+}
+
+int SkMipMapLevelCount(int baseWidth, int baseHeight) {
+ // OpenGL's spec requires that each mipmap level have height/width equal to
+ // max(1, floor(original_height / 2^i)
+ // (or original_width) where i is the mipmap level.
+ // Continue scaling down until both axes are size 1.
+
+ const int largestAxis = SkTMax(baseWidth, baseHeight);
+ if (largestAxis < 0) {
+ return 0;
+ }
+ const int leadingZeros = SkCLZ(static_cast<uint32_t>(largestAxis));
+ // If the value 00011010 has 3 leading 0s then it has 5 significant bits
+ // (the bits which are not leading zeros)
+ const int significantBits = (sizeof(uint32_t) * 8) - leadingZeros;
+ // This is making the assumption that the size of a byte is 8 bits
+ // and that sizeof(uint32_t)'s implementation-defined behavior is 4.
+ const int mipLevelCount = significantBits;
+
+ return mipLevelCount;
+}

Powered by Google App Engine
This is Rietveld 408576698