int XInitShades(Display *display, int screen) { char *bits; int count; int chars_bitmap = char_bitmap(); int bit; bits = (char *) malloc(chars_bitmap * sizeof(char)); for (count = 0; count < XShadeMax; count++) { /* Load in the next bitmap */ for (bit = 0; bit < chars_bitmap; bit++) bits[bit] = XShadeBits[count * chars_bitmap + bit]; /* Create it and put it into the Pixmap array */ XShade[count] = XCreatePixmapFromBitmapData(display, RootWindow(display, screen), bits, XShadeWidth, XShadeWidth, BlackPixel(display, screen), WhitePixel(display, screen), DisplayPlanes(display, screen)); } TileGC = XCreateGC(display, RootWindow(display, screen), 0, NULL); XSetFillStyle(display, TileGC, FillTiled); XSetTile(display, TileGC, XShade[XShadeMax / 2]); return XShadeMax; }
std::tuple<cv::Mat, cv::Mat, signed int, signed int> FreeTypeTextPrinter::GetCharMat() const { // bitmap_left为左距 bitmap_top为图形顶部到基线的距离基线 auto &bitmap = ft_face_->glyph->bitmap; // 就地构造 免除手动内存拷贝 注意,生成下一个字符时内存会被清除 cv::Mat char_bitmap(cv::Size(bitmap.width, bitmap.rows), CV_8U, bitmap.buffer); cv::Mat char_img; // 处理非打印字符问题 if (0 != char_bitmap.rows || 0 != char_bitmap.cols) { char_img = char_bitmap.clone(); } else { char_img = cv::Mat(cv::Size(std::max(bitmap.width, empty_width_), std::max(bitmap.rows, empty_width_)), CV_8U, cv::Scalar(0)); } cvtColor(char_img, char_img, CV_GRAY2BGR); cv::Mat mask; // 填涂掩码 用来挖除目标图像的掩码区域以便去除字体色彩不饱和导致字体模糊的副作用 bitwise_not(char_img, mask); LUT(char_img, color_lut_, char_img); return std::make_tuple(char_img, mask, ft_face_->glyph->bitmap_top, ft_face_->glyph->bitmap_left); }