From 789536016714dc38b9e2f0b01c814a877a64c9f2 Mon Sep 17 00:00:00 2001 From: rachytski Date: Wed, 26 Oct 2011 18:52:36 +0300 Subject: [PATCH] fixed GlyphInfo to make copy of the glyph to make it possible to obtain and upload glyphs in the different threads. --- yg/glyph_cache.cpp | 49 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/yg/glyph_cache.cpp b/yg/glyph_cache.cpp index ba20b96ab6..9d946280a4 100644 --- a/yg/glyph_cache.cpp +++ b/yg/glyph_cache.cpp @@ -45,10 +45,20 @@ namespace yg } GlyphInfo::GlyphInfo() - {} + { + } GlyphInfo::~GlyphInfo() - {} + { + } + + struct RawGlyphInfo : public GlyphInfo + { + ~RawGlyphInfo() + { + delete m_bitmapData; + } + }; struct FTGlyphInfo : public GlyphInfo { @@ -225,7 +235,7 @@ namespace yg FTCHECK(FT_Glyph_Stroke(&glyph, m_impl->m_stroker, 0)); FTCHECK(FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1)); - info = new FTStrokedGlyphInfo(glyph); +// info = new FTStrokedGlyphInfo(glyph); } else { @@ -238,9 +248,11 @@ namespace yg &node )); - info = new FTGlyphInfo(node, m_impl->m_manager); +// info = new FTGlyphInfo(node, m_impl->m_manager); } + info = new RawGlyphInfo(); + FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph; info->m_metrics.m_height = bitmapGlyph ? bitmapGlyph->bitmap.rows : 0; @@ -256,31 +268,18 @@ namespace yg if ((info->m_metrics.m_width != 0) && (info->m_metrics.m_height != 0)) { - info->m_bitmapData = bitmapGlyph->bitmap.buffer; +// info->m_bitmapData = bitmapGlyph->bitmap.buffer; +// info->m_bitmapPitch = bitmapGlyph->bitmap.pitch; + info->m_bitmapPitch = bitmapGlyph->bitmap.pitch; + info->m_bitmapData = new unsigned char[info->m_bitmapPitch * info->m_metrics.m_height]; -/* gil::gray8c_view_t srcView = gil::interleaved_view( - info->m_metrics.m_width, - info->m_metrics.m_height, - (gil::gray8_pixel_t*)bitmapGlyph->bitmap.buffer, - bitmapGlyph->bitmap.pitch - ); - - DATA_TRAITS::pixel_t c; - - gil::get_color(c, gil::red_t()) = key.m_color.r / DATA_TRAITS::channelScaleFactor; - gil::get_color(c, gil::green_t()) = key.m_color.g / DATA_TRAITS::channelScaleFactor; - gil::get_color(c, gil::blue_t()) = key.m_color.b / DATA_TRAITS::channelScaleFactor; - gil::get_color(c, gil::alpha_t()) = key.m_color.a / DATA_TRAITS::channelScaleFactor; - - for (size_t y = 0; y < static_cast(srcView.height()); ++y) - for (size_t x = 0; x < static_cast(srcView.width()); ++x) - { - gil::get_color(c, gil::alpha_t()) = srcView(x, y) / DATA_TRAITS::channelScaleFactor; - dstView(x, y) = c; - }*/ + memcpy(info->m_bitmapData, bitmapGlyph->bitmap.buffer, info->m_bitmapPitch * info->m_metrics.m_height); } + if (key.m_isMask) + FT_Done_Glyph(glyph); + return make_shared_ptr(info); }