Merge pull request #3933 from BKNio:putText_3_0
This commit is contained in:
commit
b4aa37aa30
@ -448,3 +448,81 @@ protected:
|
||||
};
|
||||
|
||||
TEST(Imgcodecs_Drawing, fillconvexpoly_clipping) { CV_FillConvexPolyTest test; test.safe_run(); }
|
||||
|
||||
class CV_DrawingTest_UTF8 : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_DrawingTest_UTF8() {}
|
||||
~CV_DrawingTest_UTF8() {}
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
vector<string> lines;
|
||||
lines.push_back("abcdefghijklmnopqrstuvwxyz1234567890");
|
||||
// cyrillic letters small
|
||||
lines.push_back("\xD0\xB0\xD0\xB1\xD0\xB2\xD0\xB3\xD0\xB4\xD0\xB5\xD1\x91\xD0\xB6\xD0\xB7"
|
||||
"\xD0\xB8\xD0\xB9\xD0\xBA\xD0\xBB\xD0\xBC\xD0\xBD\xD0\xBE\xD0\xBF\xD1\x80"
|
||||
"\xD1\x81\xD1\x82\xD1\x83\xD1\x84\xD1\x85\xD1\x86\xD1\x87\xD1\x88\xD1\x89"
|
||||
"\xD1\x8A\xD1\x8B\xD1\x8C\xD1\x8D\xD1\x8E\xD1\x8F");
|
||||
// cyrillic letters capital
|
||||
lines.push_back("\xD0\x90\xD0\x91\xD0\x92\xD0\x93\xD0\x94\xD0\x95\xD0\x81\xD0\x96\xD0\x97"
|
||||
"\xD0\x98\xD0\x99\xD0\x9A\xD0\x9B\xD0\x9C\xD0\x9D\xD0\x9E\xD0\x9F\xD0\xA0"
|
||||
"\xD0\xA1\xD0\xA2\xD0\xA3\xD0\xA4\xD0\xA5\xD0\xA6\xD0\xA7\xD0\xA8\xD0\xA9"
|
||||
"\xD0\xAA\xD0\xAB\xD0\xAC\xD0\xAD\xD0\xAE\xD0\xAF");
|
||||
// bounds
|
||||
lines.push_back("-\xD0\x80-\xD0\x8E-\xD0\x8F-");
|
||||
lines.push_back("-\xD1\x90-\xD1\x91-\xD1\xBF-");
|
||||
// bad utf8
|
||||
lines.push_back("-\x81-\x82-\x83-");
|
||||
lines.push_back("--\xF0--");
|
||||
lines.push_back("-\xF0");
|
||||
|
||||
vector<int> fonts;
|
||||
fonts.push_back(FONT_HERSHEY_SIMPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_PLAIN);
|
||||
fonts.push_back(FONT_HERSHEY_DUPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_COMPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_TRIPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_COMPLEX_SMALL);
|
||||
fonts.push_back(FONT_HERSHEY_SCRIPT_SIMPLEX);
|
||||
fonts.push_back(FONT_HERSHEY_SCRIPT_COMPLEX);
|
||||
|
||||
vector<Mat> results;
|
||||
Size bigSize(0, 0);
|
||||
for (vector<int>::const_iterator font = fonts.begin(); font != fonts.end(); ++font)
|
||||
{
|
||||
for (int italic = 0; italic <= FONT_ITALIC; italic += FONT_ITALIC)
|
||||
{
|
||||
for (vector<string>::const_iterator line = lines.begin(); line != lines.end(); ++line)
|
||||
{
|
||||
const float fontScale = 1;
|
||||
const int thickness = 1;
|
||||
const Scalar color(20,20,20);
|
||||
int baseline = 0;
|
||||
|
||||
Size textSize = getTextSize(*line, *font | italic, fontScale, thickness, &baseline);
|
||||
Point textOrg(0, textSize.height + 2);
|
||||
Mat img(textSize + Size(0, baseline), CV_8UC3, Scalar(255, 255, 255));
|
||||
putText(img, *line, textOrg, *font | italic, fontScale, color, thickness, CV_AA);
|
||||
|
||||
results.push_back(img);
|
||||
bigSize.width = max(bigSize.width, img.size().width);
|
||||
bigSize.height += img.size().height + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int shift = 0;
|
||||
Mat result(bigSize, CV_8UC3, Scalar(100, 100, 100));
|
||||
for (vector<Mat>::const_iterator img = results.begin(); img != results.end(); ++img)
|
||||
{
|
||||
Rect roi(Point(0, shift), img->size());
|
||||
Mat sub(result, roi);
|
||||
img->copyTo(sub);
|
||||
shift += img->size().height + 1;
|
||||
}
|
||||
imwrite("/tmp/all_fonts.png", result);
|
||||
}
|
||||
};
|
||||
|
||||
TEST(Highgui_Drawing, utf8_support) { CV_DrawingTest_UTF8 test; test.safe_run(); }
|
||||
|
@ -1941,7 +1941,11 @@ static const int HersheyComplex[] = {
|
||||
2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2223, 2084,
|
||||
2224, 2247, 587, 2249, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111,
|
||||
2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126,
|
||||
2225, 2229, 2226, 2246 };
|
||||
2225, 2229, 2226, 2246, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811,
|
||||
2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826,
|
||||
2827, 2828, 2829, 2830, 2831, 2832, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909,
|
||||
2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924,
|
||||
2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932};
|
||||
|
||||
static const int HersheyComplexItalic[] = {
|
||||
(9 + 12*16) + FONT_ITALIC_ALPHA + FONT_ITALIC_DIGIT + FONT_ITALIC_PUNCT +
|
||||
@ -2033,6 +2037,50 @@ static const int* getFontData(int fontFace)
|
||||
return ascii;
|
||||
}
|
||||
|
||||
inline void readCheck(int &c, int &i, const String &text, int fontFace)
|
||||
{
|
||||
|
||||
int leftBoundary = ' ', rightBoundary = 127;
|
||||
|
||||
if(c >= 0x80 && fontFace == FONT_HERSHEY_COMPLEX)
|
||||
{
|
||||
if(c == 0xD0 && (uchar)text[i + 1] >= 0x90 && (uchar)text[i + 1] <= 0xBF)
|
||||
{
|
||||
c = (uchar)text[++i] - 17;
|
||||
leftBoundary = 127;
|
||||
rightBoundary = 175;
|
||||
}
|
||||
else if(c == 0xD1 && (uchar)text[i + 1] >= 0x80 && (uchar)text[i + 1] <= 0x8F)
|
||||
{
|
||||
c = (uchar)text[++i] + 47;
|
||||
leftBoundary = 175;
|
||||
rightBoundary = 191;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(c >= 0xC0 && text[i+1] != 0) //2 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xE0 && text[i+1] != 0) //3 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xF0 && text[i+1] != 0) //4 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xF8 && text[i+1] != 0) //5 bytes utf
|
||||
i++;
|
||||
|
||||
if(c >= 0xFC && text[i+1] != 0) //6 bytes utf
|
||||
i++;
|
||||
|
||||
c = '?';
|
||||
}
|
||||
}
|
||||
|
||||
if(c >= rightBoundary || c < leftBoundary)
|
||||
c = '?';
|
||||
}
|
||||
|
||||
extern const char* g_HersheyGlyphs[];
|
||||
|
||||
void putText( InputOutputArray _img, const String& text, Point org,
|
||||
@ -2066,8 +2114,7 @@ void putText( InputOutputArray _img, const String& text, Point org,
|
||||
int c = (uchar)text[i];
|
||||
Point p;
|
||||
|
||||
if( c >= 127 || c < ' ' )
|
||||
c = '?';
|
||||
readCheck(c, i, text, fontFace);
|
||||
|
||||
const char* ptr = faces[ascii[(c-' ')+1]];
|
||||
p.x = (uchar)ptr[0] - 'R';
|
||||
@ -2114,8 +2161,7 @@ Size getTextSize( const String& text, int fontFace, double fontScale, int thickn
|
||||
int c = (uchar)text[i];
|
||||
Point p;
|
||||
|
||||
if( c >= 127 || c < ' ' )
|
||||
c = '?';
|
||||
readCheck(c, i, text, fontFace);
|
||||
|
||||
const char* ptr = faces[ascii[(c-' ')+1]];
|
||||
p.x = (uchar)ptr[0] - 'R';
|
||||
|
Loading…
Reference in New Issue
Block a user