1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef YUV_STAMPER_H_
#define YUV_STAMPER_H_
#include <cstdint>
namespace mozilla {
class YuvStamper {
public:
bool WriteDigits(uint32_t value);
template <typename T>
static bool Write(uint32_t width, uint32_t height, uint32_t stride,
unsigned char* pYData, const T& value, uint32_t x = 0,
uint32_t y = 0) {
YuvStamper stamper(pYData, width, height, stride, x, y,
(sDigitWidth + sInterDigit) * sPixelSize,
(sDigitHeight + sInterLine) * sPixelSize);
return stamper.WriteDigits(value);
}
static bool Encode(uint32_t width, uint32_t height, uint32_t stride,
unsigned char* pYData, unsigned char* pMsg, size_t msg_len,
uint32_t x = 0, uint32_t y = 0);
static bool Decode(uint32_t width, uint32_t height, uint32_t stride,
unsigned char* pYData, unsigned char* pMsg, size_t msg_len,
uint32_t x = 0, uint32_t y = 0);
private:
YuvStamper(unsigned char* pYData, uint32_t width, uint32_t height,
uint32_t stride, uint32_t x, uint32_t y,
unsigned char symbol_width, unsigned char symbol_height);
bool WriteDigit(unsigned char digit);
void WritePixel(unsigned char* data, uint32_t x, uint32_t y);
uint32_t Capacity();
bool AdvanceCursor();
bool WriteBit(bool one);
bool Write8(unsigned char value);
bool ReadBit(unsigned char& value);
bool Read8(unsigned char& bit);
const static unsigned char sPixelSize = 3;
const static unsigned char sDigitWidth = 6;
const static unsigned char sDigitHeight = 7;
const static unsigned char sInterDigit = 1;
const static unsigned char sInterLine = 1;
const static uint32_t sBitSize = 4;
const static uint32_t sBitThreshold = 60;
const static unsigned char sYOn = 0x80;
const static unsigned char sYOff = 0;
const static unsigned char sLumaThreshold = 96;
const static unsigned char sLumaMin = 16;
const static unsigned char sLumaMax = 235;
unsigned char* pYData;
uint32_t mStride;
uint32_t mWidth;
uint32_t mHeight;
unsigned char mSymbolWidth;
unsigned char mSymbolHeight;
struct Cursor {
Cursor(uint32_t x, uint32_t y) : x(x), y(y) {}
uint32_t x;
uint32_t y;
} mCursor;
};
} // namespace mozilla
#endif
|