OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #ifndef SkKTXFile_DEFINED | 9 #ifndef SkKTXFile_DEFINED |
10 #define SkKTXFile_DEFINED | 10 #define SkKTXFile_DEFINED |
(...skipping 16 matching lines...) Expand all Loading... |
27 // texture in an OpenGL application, including the use of compressed data. | 27 // texture in an OpenGL application, including the use of compressed data. |
28 // | 28 // |
29 // A full format specification can be found here: | 29 // A full format specification can be found here: |
30 // http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/ | 30 // http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/ |
31 | 31 |
32 class SkKTXFile { | 32 class SkKTXFile { |
33 public: | 33 public: |
34 // The ownership of the data remains with the caller. This class is intended | 34 // The ownership of the data remains with the caller. This class is intended |
35 // to be used as a logical wrapper around the data in order to properly | 35 // to be used as a logical wrapper around the data in order to properly |
36 // access the pixels. | 36 // access the pixels. |
37 SkKTXFile(SkData* data) | 37 SkKTXFile(SkData* data) : fData(data), fSwapBytes(false) { |
38 : fData(data), fSwapBytes(false) | |
39 { | |
40 data->ref(); | 38 data->ref(); |
41 fValid = this->readKTXFile(fData->bytes(), fData->size()); | 39 fValid = this->readKTXFile(fData->bytes(), fData->size()); |
42 } | 40 } |
43 | 41 |
44 bool valid() const { return fValid; } | 42 bool valid() const { return fValid; } |
45 | 43 |
46 int width() const { return static_cast<int>(fHeader.fPixelWidth); } | 44 int width() const { return static_cast<int>(fHeader.fPixelWidth); } |
47 int height() const { return static_cast<int>(fHeader.fPixelHeight); } | 45 int height() const { return static_cast<int>(fHeader.fPixelHeight); } |
48 | 46 |
49 const uint8_t *pixelData(int mipmap = 0) const { | 47 const uint8_t *pixelData(int mipmap = 0) const { |
50 SkASSERT(!this->valid() || mipmap < fPixelData.count()); | 48 SkASSERT(!this->valid() || mipmap < fPixelData.count()); |
51 return this->valid() ? fPixelData[mipmap].data() : NULL; | 49 return this->valid() ? fPixelData[mipmap].data() : NULL; |
52 } | 50 } |
53 | 51 |
54 // If the decoded KTX file has the following key, then it will | 52 // If the decoded KTX file has the following key, then it will |
55 // return the associated value. If not found, the empty string | 53 // return the associated value. If not found, the empty string |
56 // is returned. | 54 // is returned. |
57 SkString getValueForKey(const SkString& key) const; | 55 SkString getValueForKey(const SkString& key) const; |
58 | 56 |
59 int numMipmaps() const { return static_cast<int>(fHeader.fNumberOfMipmapLeve
ls); } | 57 int numMipmaps() const { return static_cast<int>(fHeader.fNumberOfMipmapLeve
ls); } |
60 | 58 |
61 bool isCompressedFormat(SkTextureCompressor::Format fmt) const; | 59 bool isCompressedFormat(SkTextureCompressor::Format fmt) const; |
62 bool isRGBA8() const; | 60 bool isRGBA8() const; |
63 bool isRGB8() const; | 61 bool isRGB8() const; |
64 | 62 |
65 static bool is_ktx(const uint8_t *data); | 63 static bool is_ktx(const uint8_t data[], size_t size); |
66 static bool is_ktx(SkStreamRewindable* stream); | 64 static bool is_ktx(SkStreamRewindable* stream); |
67 | 65 |
68 static bool WriteETC1ToKTX(SkWStream* stream, const uint8_t *etc1Data, | 66 static bool WriteETC1ToKTX(SkWStream* stream, const uint8_t *etc1Data, |
69 uint32_t width, uint32_t height); | 67 uint32_t width, uint32_t height); |
70 static bool WriteBitmapToKTX(SkWStream* stream, const SkBitmap& bitmap); | 68 static bool WriteBitmapToKTX(SkWStream* stream, const SkBitmap& bitmap); |
71 private: | 69 private: |
72 | 70 |
73 // The blob holding the file data. | 71 // The blob holding the file data. |
74 SkAutoTUnref<SkData> fData; | 72 SkAutoTUnref<SkData> fData; |
75 | 73 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 // If the endianness of the platform is different than the file, | 133 // If the endianness of the platform is different than the file, |
136 // then we need to do proper byte swapping. | 134 // then we need to do proper byte swapping. |
137 bool fSwapBytes; | 135 bool fSwapBytes; |
138 | 136 |
139 // Read an integer from a buffer, advance the buffer, and swap | 137 // Read an integer from a buffer, advance the buffer, and swap |
140 // bytes if fSwapBytes is set | 138 // bytes if fSwapBytes is set |
141 uint32_t readInt(const uint8_t** buf, size_t* bytesLeft) const; | 139 uint32_t readInt(const uint8_t** buf, size_t* bytesLeft) const; |
142 }; | 140 }; |
143 | 141 |
144 #endif // SkKTXFile_DEFINED | 142 #endif // SkKTXFile_DEFINED |
OLD | NEW |