Index: blimp/client/feature/compositor/client_image_serialization_processor.cc |
diff --git a/blimp/client/feature/compositor/client_image_serialization_processor.cc b/blimp/client/feature/compositor/client_image_serialization_processor.cc |
index df41181c8b694ccc586514edacdac2c17a194b0d..712e40dc6c7b671fa63a8f52f7a6906bafab8132 100644 |
--- a/blimp/client/feature/compositor/client_image_serialization_processor.cc |
+++ b/blimp/client/feature/compositor/client_image_serialization_processor.cc |
@@ -4,27 +4,81 @@ |
#include "blimp/client/feature/compositor/client_image_serialization_processor.h" |
-#include "blimp/client/feature/compositor/blimp_image_decoder.h" |
-#include "third_party/skia/include/core/SkPicture.h" |
+#include <stddef.h> |
+#include <string> |
+#include <vector> |
-class SkPixelSerializer; |
+#include "base/logging.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/sha1.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "blimp/client/feature/compositor/blimp_image_decoder.h" |
+#include "blimp/common/blob_cache/blob_cache.h" |
+#include "blimp/common/blob_cache/id_util.h" |
+#include "blimp/common/proto/blob_cache.pb.h" |
+#include "blimp/net/blob_channel/blob_channel_receiver.h" |
namespace blimp { |
namespace client { |
-ClientImageSerializationProcessor::ClientImageSerializationProcessor() { |
- pixel_deserializer_ = &BlimpImageDecoder; |
-} |
+ClientImageSerializationProcessor::ClientImageSerializationProcessor() {} |
ClientImageSerializationProcessor::~ClientImageSerializationProcessor() {} |
+ClientImageSerializationProcessor* |
+ClientImageSerializationProcessor::GetInstance() { |
+ return base::Singleton<ClientImageSerializationProcessor>::get(); |
+} |
+ |
+// static |
+bool ClientImageSerializationProcessor::InstallPixelRefProc(const void* input, |
+ size_t input_size, |
+ SkBitmap* bitmap) { |
+ DCHECK(input); |
+ DCHECK(bitmap); |
+ |
+ return ClientImageSerializationProcessor::GetInstance()->GetAndDecodeBlob( |
+ input, input_size, bitmap); |
+} |
+ |
+bool ClientImageSerializationProcessor::GetAndDecodeBlob(const void* input, |
+ size_t input_size, |
+ SkBitmap* bitmap) { |
+ BlobCacheImageMetadata parsed_metadata; |
+ if (!parsed_metadata.ParseFromArray(input, input_size)) { |
+ LOG(WARNING) << "Couldn't parse blob metadata structure."; |
Wez
2016/05/21 01:08:03
This seems like an error, not a warning? Presumabl
Kevin M
2016/05/27 22:35:29
Done.
|
+ return false; |
+ } |
+ if (!IsValidBlobId(parsed_metadata.id())) { |
+ DLOG(ERROR) << "Image payload is not a valid blob ID."; |
Wez
2016/05/21 01:08:03
Why only DLOG(ERROR) - you are LOG(WARNING)ing abo
Kevin M
2016/05/27 22:35:29
Done.
|
+ return false; |
+ } |
+ |
+ // Get the image blob synchronously. |
+ // TODO(kmarshall): Add support for asynchronous Get() completion after Skia |
+ // supports image replacement. |
+ BlobDataPtr blob = blob_receiver_->Get(parsed_metadata.id()); |
+ if (!blob) { |
+ DLOG(WARNING) << "No blob found with ID: " |
+ << BlobIdToString(parsed_metadata.id()); |
Wez
2016/05/21 01:08:03
While we have synchronous fetch isn't this also a
Kevin M
2016/05/27 22:35:29
Done.
|
+ return false; |
+ } |
+ |
+ DVLOG(1) << "GetAndDecodeBlob(" << BlobIdToString(parsed_metadata.id()) |
+ << ")"; |
+ |
+ return BlimpImageDecoder(reinterpret_cast<const void*>(&blob->data[0]), |
+ blob->data.size(), bitmap); |
+} |
+ |
SkPixelSerializer* ClientImageSerializationProcessor::GetPixelSerializer() { |
+ NOTREACHED(); |
return nullptr; |
} |
SkPicture::InstallPixelRefProc |
ClientImageSerializationProcessor::GetPixelDeserializer() { |
- return pixel_deserializer_; |
+ return &ClientImageSerializationProcessor::InstallPixelRefProc; |
} |
} // namespace client |