blob: aa61e57ce3711e16a10a472312b39c835db1b29d [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/ws/public/cpp/property_type_converters.h"
#include <stdint.h>
#include "base/strings/utf_string_conversions.h"
#include "base/unguessable_token.h"
#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
#include "mojo/public/mojom/base/unguessable_token.mojom.h"
#include "skia/public/interfaces/bitmap.mojom.h"
#include "skia/public/interfaces/bitmap_skbitmap_struct_traits.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace mojo {
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, gfx::Rect>::Convert(
const gfx::Rect& input) {
std::vector<uint8_t> vec(16);
vec[0] = (input.x() >> 24) & 0xFF;
vec[1] = (input.x() >> 16) & 0xFF;
vec[2] = (input.x() >> 8) & 0xFF;
vec[3] = input.x() & 0xFF;
vec[4] = (input.y() >> 24) & 0xFF;
vec[5] = (input.y() >> 16) & 0xFF;
vec[6] = (input.y() >> 8) & 0xFF;
vec[7] = input.y() & 0xFF;
vec[8] = (input.width() >> 24) & 0xFF;
vec[9] = (input.width() >> 16) & 0xFF;
vec[10] = (input.width() >> 8) & 0xFF;
vec[11] = input.width() & 0xFF;
vec[12] = (input.height() >> 24) & 0xFF;
vec[13] = (input.height() >> 16) & 0xFF;
vec[14] = (input.height() >> 8) & 0xFF;
vec[15] = input.height() & 0xFF;
return vec;
}
// static
gfx::Rect TypeConverter<gfx::Rect, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
if (input.size() != 16)
return gfx::Rect();
return gfx::Rect(
input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3],
input[4] << 24 | input[5] << 16 | input[6] << 8 | input[7],
input[8] << 24 | input[9] << 16 | input[10] << 8 | input[11],
input[12] << 24 | input[13] << 16 | input[14] << 8 | input[15]);
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, gfx::Size>::Convert(
const gfx::Size& input) {
std::vector<uint8_t> vec(8);
vec[0] = (input.width() >> 24) & 0xFF;
vec[1] = (input.width() >> 16) & 0xFF;
vec[2] = (input.width() >> 8) & 0xFF;
vec[3] = input.width() & 0xFF;
vec[4] = (input.height() >> 24) & 0xFF;
vec[5] = (input.height() >> 16) & 0xFF;
vec[6] = (input.height() >> 8) & 0xFF;
vec[7] = input.height() & 0xFF;
return vec;
}
// static
gfx::Size TypeConverter<gfx::Size, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
if (input.size() != 8)
return gfx::Size();
return gfx::Size(input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3],
input[4] << 24 | input[5] << 16 | input[6] << 8 | input[7]);
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, int32_t>::Convert(
const int32_t& input) {
std::vector<uint8_t> vec(4);
vec[0] = (input >> 24) & 0xFF;
vec[1] = (input >> 16) & 0xFF;
vec[2] = (input >> 8) & 0xFF;
vec[3] = input & 0xFF;
return vec;
}
// static
int32_t TypeConverter<int32_t, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
if (input.size() != 4)
return 0;
return input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3];
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, int64_t>::Convert(
const int64_t& input) {
std::vector<uint8_t> vec(8);
vec[0] = (input >> 56) & 0xFF;
vec[1] = (input >> 48) & 0xFF;
vec[2] = (input >> 40) & 0xFF;
vec[3] = (input >> 32) & 0xFF;
vec[4] = (input >> 24) & 0xFF;
vec[5] = (input >> 16) & 0xFF;
vec[6] = (input >> 8) & 0xFF;
vec[7] = input & 0xFF;
return vec;
}
// static
int64_t TypeConverter<int64_t, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
if (input.size() != 8)
return 0;
return static_cast<int64_t>(input[0]) << 56 |
static_cast<int64_t>(input[1]) << 48 |
static_cast<int64_t>(input[2]) << 40 |
static_cast<int64_t>(input[3]) << 32 |
static_cast<int64_t>(input[4]) << 24 |
static_cast<int64_t>(input[5]) << 16 |
static_cast<int64_t>(input[6]) << 8 | static_cast<int64_t>(input[7]);
}
// static
std::vector<uint8_t>
TypeConverter<std::vector<uint8_t>, base::string16>::Convert(
const base::string16& input) {
return ConvertTo<std::vector<uint8_t>>(base::UTF16ToUTF8(input));
}
// static
base::string16 TypeConverter<base::string16, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
return base::UTF8ToUTF16(ConvertTo<std::string>(input));
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, std::string>::Convert(
const std::string& input) {
return std::vector<uint8_t>(input.begin(), input.end());
}
// static
std::string TypeConverter<std::string, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
return std::string(input.begin(), input.end());
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, SkBitmap>::Convert(
const SkBitmap& input) {
return skia::mojom::InlineBitmap::Serialize(&input);
}
// static
SkBitmap TypeConverter<SkBitmap, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
SkBitmap output;
return skia::mojom::InlineBitmap::Deserialize(input, &output) ? output
: SkBitmap();
}
// static
std::vector<uint8_t>
TypeConverter<std::vector<uint8_t>, base::UnguessableToken>::Convert(
const base::UnguessableToken& input) {
if (input.is_empty())
return std::vector<uint8_t>();
return mojo_base::mojom::UnguessableToken::Serialize(&input);
}
// static
base::UnguessableToken
TypeConverter<base::UnguessableToken, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
if (input.empty())
return base::UnguessableToken();
base::UnguessableToken output;
return mojo_base::mojom::UnguessableToken::Deserialize(input, &output)
? output
: base::UnguessableToken();
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, bool>::Convert(
bool input) {
std::vector<uint8_t> vec(1);
vec[0] = input ? 1 : 0;
return vec;
}
// static
bool TypeConverter<bool, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
// Empty vectors are interpreted as false.
return !input.empty() && (input[0] == 1);
}
// static
std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, uint64_t>::Convert(
uint64_t input) {
return TypeConverter<std::vector<uint8_t>, int64_t>::Convert(
static_cast<int64_t>(input));
}
// static
ws::Id TypeConverter<uint64_t, std::vector<uint8_t>>::Convert(
const std::vector<uint8_t>& input) {
return static_cast<uint64_t>(
TypeConverter<int64_t, std::vector<uint8_t>>::Convert(input));
}
} // namespace mojo