frame_ = core::draw_frame(std::move(frame));
}
- text::string_metrics measure_string(const std::wstring& str)
- {
- return font_.measure_string(str);
- }
-
// frame_producer
draw_frame receive_impl()
std::future<std::wstring> text_producer::call(const std::vector<std::wstring>& param) { return impl_->call(param); }
variable& text_producer::get_variable(const std::wstring& name) { return impl_->get_variable(name); }
const std::vector<std::wstring>& text_producer::get_variables() const { return impl_->get_variables(); }
-text::string_metrics text_producer::measure_string(const std::wstring& str) { return impl_->measure_string(str); }
constraints& text_producer::pixel_constraints() { return impl_->pixel_constraints(); }
std::wstring text_producer::print() const { return impl_->print(); }
#include "utils/text_info.h"
namespace caspar { namespace core {
- namespace text
+ namespace text
{
void init(module_dependencies dependencies);
std::vector<std::pair<std::wstring, std::wstring>> list_fonts();
class text_producer : public frame_producer_base
{
public:
- text_producer(const spl::shared_ptr<frame_factory>& frame_factory, int x, int y, const std::wstring& str,
+ text_producer(const spl::shared_ptr<frame_factory>& frame_factory, int x, int y, const std::wstring& str,
text::text_info& text_info, long parent_width, long parent_height, bool standalone);
static spl::shared_ptr<text_producer> create(const spl::shared_ptr<frame_factory>& frame_factory, int x, int y, const std::wstring& str, text::text_info& text_info, long parent_width, long parent_height, bool standalone = false);
-
+
draw_frame receive_impl() override;
std::future<std::wstring> call(const std::vector<std::wstring>& param) override;
variable& get_variable(const std::wstring& name) override;
const std::vector<std::wstring>& get_variables() const override;
- text::string_metrics measure_string(const std::wstring& str);
-
constraints& pixel_constraints() override;
std::wstring print() const override;
std::wstring name() const override;
return result;
}
- string_metrics measure_string(const std::wstring& str)
- {
- string_metrics result;
-
- bool use_kerning = (face_->face_flags & FT_FACE_FLAG_KERNING) == FT_FACE_FLAG_KERNING;
- int index = 0;
- FT_UInt previous = 0;
- double pos_x = 0;
-// float pos_y = 0;
-
- auto end = str.end();
- for(auto it = str.begin(); it != end; ++it, ++index)
- {
- auto glyph_it = glyphs_.find(*it);
- if(glyph_it != glyphs_.end())
- {
- const glyph_info& coords = glyph_it->second;
-
- FT_UInt glyph_index = FT_Get_Char_Index(face_.get(), (*it));
-
- if(use_kerning && previous && glyph_index)
- {
- FT_Vector delta;
- FT_Get_Kerning(face_.get(), previous, glyph_index, FT_KERNING_DEFAULT, &delta);
-
- pos_x += delta.x / 64.0;
- }
-
- FT_Load_Glyph(face_.get(), glyph_index, FT_LOAD_NO_BITMAP | FT_LOAD_FORCE_AUTOHINT | FT_LOAD_TARGET_NORMAL);
-
- int bearingY = face_->glyph->metrics.horiBearingY >> 6;
- if(bearingY > result.bearingY)
- result.bearingY = bearingY;
-
- int protrudeUnderY = coords.height - bearingY;
-
- if (protrudeUnderY > result.protrudeUnderY)
- result.protrudeUnderY = protrudeUnderY;
-
- if (result.bearingY + result.protrudeUnderY > result.height)
- result.height = result.bearingY + result.protrudeUnderY;
-
- pos_x += face_->glyph->advance.x / 64.0;
- previous = glyph_index;
- }
- }
-
- result.width = (int)(pos_x+.5f);
- return result;
- }
-
std::wstring get_name() const
{
return name_;
void texture_font::load_glyphs(unicode_block range, const color<double>& col) { impl_->load_glyphs(range, col); }
void texture_font::set_tracking(double tracking) { impl_->set_tracking(tracking); }
std::vector<frame_geometry::coord> texture_font::create_vertex_stream(const std::wstring& str, int x, int y, int parent_width, int parent_height, string_metrics* metrics, double shear) { return impl_->create_vertex_stream(str, x, y, parent_width, parent_height, metrics, shear); }
-string_metrics texture_font::measure_string(const std::wstring& str) { return impl_->measure_string(str); }
std::wstring texture_font::get_name() const { return impl_->get_name(); }
double texture_font::get_size() const { return impl_->get_size(); }
void load_glyphs(unicode_block block, const color<double>& col);
void set_tracking(double tracking);
std::vector<frame_geometry::coord> create_vertex_stream(const std::wstring& str, int x, int y, int parent_width, int parent_height, string_metrics* metrics, double shear = 0.0);
- string_metrics measure_string(const std::wstring& str);
std::wstring get_name() const;
double get_size() const;
auto text_producer = core::text_producer::create(dependencies.frame_factory, 0, 0, str, text_info, doc.width(), doc.height());
//text_producer->pixel_constraints().width.set(psd_layer->size().width);
//text_producer->pixel_constraints().height.set(psd_layer->size().height);
- core::text::string_metrics metrics = text_producer->measure_string(str);
layer_producer = text_producer;
scene_layer = ¤t.scene()->create_layer(spl::make_shared_ptr(layer_producer), static_cast<int>(psd_layer->text_pos().x), static_cast<int>(psd_layer->text_pos().y), layer_name);