1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00
ruby-opencv/ext/opencv/cvfont.cpp
ser1zw d679ef49a8 Merge branch 'master' into documentation
Conflicts:
	.gitignore
	ext/opencv/cvmat.cpp
2013-01-20 05:33:11 +09:00

228 lines
6.5 KiB
C++

/************************************************************
cvfont.cpp -
$Author: lsxi $
Copyright (C) 2005-2006 Masakazu Yonekura
************************************************************/
#include "cvfont.h"
/*
* Document-class: OpenCV::CvFont
*
* Font structure that can be passed to text rendering functions.
* see CvMat#put_text, CvMat#put_text!
*/
__NAMESPACE_BEGIN_OPENCV
__NAMESPACE_BEGIN_CVFONT
VALUE rb_klass;
int
rb_font_option_line_type(VALUE font_option)
{
VALUE line_type = LOOKUP_HASH(font_option, "line_type");
if (FIXNUM_P(line_type)) {
return FIX2INT(line_type);
}
else if (line_type == ID2SYM(rb_intern("aa"))) {
return CV_AA;
}
return 0;
}
VALUE
rb_class()
{
return rb_klass;
}
VALUE
rb_allocate(VALUE klass)
{
CvFont *ptr;
return Data_Make_Struct(klass, CvFont, 0, -1, ptr);
}
/*
* Create font object
* @overload new(face, font_option = nil)
* @param face [Symbol] Font name identifier. Only a subset of Hershey fonts (http://sources.isc.org/utils/misc/hershey-font.txt) are supported now:
* - :simplex - normal size sans-serif font
* - :plain - small size sans-serif font
* - :duplex - normal size sans-serif font (more complex than :simplex)
* - :complex - normal size serif font
* - :triplex - normal size serif font (more complex than :complex)
* - :complex_small - smaller version of :complex
* - :script_simplex - hand-writing style font
* - :script_complex - more complex variant of :script_simplex
*
* @param font_option [Hash] should be Hash include these keys.
* @option font_option [Number] :hscale Horizontal scale. If equal to 1.0, the characters have the original width depending on the font type. If equal to 0.5, the characters are of half the original width.
* @option font_option [Number] :vscale Vertical scale. If equal to 1.0, the characters have the original height depending on the font type. If equal to 0.5, the characters are of half the original height.
* @option font_option [Number] :shear Approximate tangent of the character slope relative to the vertical line. Zero value means a non-italic font, 1.0f means ~45 degree slope, etc.
* @option font_option [Number] :thickness Thickness of the text strokes.
* @option font_option [Number] :line_type Type of the strokes, see CvMat#Line description.
* @option font_option [Number] :italic If value is not nil or false that means italic or oblique font.
*
* @example Create Font
* OpenCV::CvFont.new(:simplex, :hscale => 2, :vslace => 2, :italic => true)
* # create 2x bigger than normal, italic type font.
*
* @opencv_func cvInitFont
*/
VALUE
rb_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE face, font_option;
rb_scan_args(argc, argv, "11", &face, &font_option);
Check_Type(face, T_SYMBOL);
face = rb_hash_lookup(rb_const_get(cCvFont::rb_class(), rb_intern("FACE")), face);
if (NIL_P(face)) {
rb_raise(rb_eArgError, "undefined face.");
}
font_option = FONT_OPTION(font_option);
int font_face = NUM2INT(face);
if (FO_ITALIC(font_option)) {
font_face |= CV_FONT_ITALIC;
}
try {
cvInitFont(CVFONT(self),
font_face,
FO_HSCALE(font_option),
FO_VSCALE(font_option),
FO_SHEAR(font_option),
FO_THICKNESS(font_option),
FO_LINE_TYPE(font_option));
}
catch (cv::Exception& e) {
raise_cverror(e);
}
return self;
}
/*
* Returns font face
* @overload face
* @return [Fixnum] Font face
*/
VALUE
rb_face(VALUE self)
{
return INT2FIX(CVFONT(self)->font_face);
}
/*
* Returns hscale
* @overload hscale
* @return [Number] hscale
*/
VALUE
rb_hscale(VALUE self)
{
return rb_float_new(CVFONT(self)->hscale);
}
/*
* Returns vscale
* @overload vscale
* @return [Number] vscale
*/
VALUE
rb_vscale(VALUE self)
{
return rb_float_new(CVFONT(self)->vscale);
}
/*
* Returns shear
* @overload shear
* @return [Number] shear
*/
VALUE
rb_shear(VALUE self)
{
return rb_float_new(CVFONT(self)->shear);
}
/*
* Returns thickness
* @overload thickness
* @return [Fixnum] thickness
*/
VALUE
rb_thickness(VALUE self)
{
return INT2FIX(CVFONT(self)->thickness);
}
/*
* Returns line type
* @overload line_type
* @return [Fixnum] line_type
*/
VALUE
rb_line_type(VALUE self)
{
return INT2FIX(CVFONT(self)->line_type);
}
/*
* Returns italic or not
* @overload italic
* @return [Boolean] self is italic or not
*/
VALUE
rb_italic(VALUE self)
{
return ((CVFONT(self)->font_face & CV_FONT_ITALIC) > 0) ? Qtrue : Qfalse;
}
void
init_ruby_class()
{
#if 0
// For documentation using YARD
VALUE opencv = rb_define_module("OpenCV");
#endif
if (rb_klass)
return;
VALUE opencv = rb_module_opencv();
rb_klass = rb_define_class_under(opencv, "CvFont", rb_cObject);
rb_define_alloc_func(rb_klass, rb_allocate);
VALUE face = rb_hash_new();
rb_define_const(rb_klass, "FACE", face);
rb_hash_aset(face, ID2SYM(rb_intern("simplex")), INT2FIX(CV_FONT_HERSHEY_SIMPLEX));
rb_hash_aset(face, ID2SYM(rb_intern("plain")), INT2FIX(CV_FONT_HERSHEY_PLAIN));
rb_hash_aset(face, ID2SYM(rb_intern("duplex")), INT2FIX(CV_FONT_HERSHEY_DUPLEX));
rb_hash_aset(face, ID2SYM(rb_intern("triplex")), INT2FIX(CV_FONT_HERSHEY_TRIPLEX));
rb_hash_aset(face, ID2SYM(rb_intern("complex_small")), INT2FIX(CV_FONT_HERSHEY_COMPLEX_SMALL));
rb_hash_aset(face, ID2SYM(rb_intern("script_simplex")), INT2FIX(CV_FONT_HERSHEY_SCRIPT_SIMPLEX));
rb_hash_aset(face, ID2SYM(rb_intern("script_complex")), INT2FIX(CV_FONT_HERSHEY_SCRIPT_COMPLEX));
VALUE default_option = rb_hash_new();
rb_define_const(rb_klass, "FONT_OPTION", default_option);
rb_hash_aset(default_option, ID2SYM(rb_intern("hscale")), rb_float_new(1.0));
rb_hash_aset(default_option, ID2SYM(rb_intern("vscale")), rb_float_new(1.0));
rb_hash_aset(default_option, ID2SYM(rb_intern("shear")), INT2FIX(0));
rb_hash_aset(default_option, ID2SYM(rb_intern("thickness")), INT2FIX(1));
rb_hash_aset(default_option, ID2SYM(rb_intern("line_type")), INT2FIX(8));
rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
rb_define_method(rb_klass, "face", RUBY_METHOD_FUNC(rb_face), 0);
rb_define_method(rb_klass, "hscale", RUBY_METHOD_FUNC(rb_hscale), 0);
rb_define_method(rb_klass, "vscale", RUBY_METHOD_FUNC(rb_vscale), 0);
rb_define_method(rb_klass, "shear", RUBY_METHOD_FUNC(rb_shear), 0);
rb_define_method(rb_klass, "thickness", RUBY_METHOD_FUNC(rb_thickness), 0);
rb_define_method(rb_klass, "line_type", RUBY_METHOD_FUNC(rb_line_type), 0);
rb_define_method(rb_klass, "italic", RUBY_METHOD_FUNC(rb_italic), 0);
}
__NAMESPACE_END_CVFONT
__NAMESPACE_END_OPENCV