溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AGG第四十一課 AGG和GDI渲染字體大小對比

發布時間:2020-08-02 02:21:08 來源:網絡 閱讀:868 作者:fengyuzaitu 欄目:系統運維

如下是GDI渲染字體的代碼:

  CClientDC dc(this);

  CPen pen(PS_SOLID,3,RGB(0,255,255)); 

  CPen* pOldPen; 

  pOldPen=dc.SelectObject (&pen); 


  dc.SelectObject (&pOldPen);

  CFont font;

  CFont* pOLdFont = NULL;

  font.CreatePointFont(10,_T("System"),&dc);

  pOLdFont = dc.SelectObject(&font);

  dc.SetBkMode(TRANSPARENT);

  dc.TextOut(1074 - 100, 800 - 293, _T("A"));

  dc.SelectObject(pOLdFont);

  font.DeleteObject();


  font.CreatePointFont(100,_T("System"),&dc);

  pOLdFont = dc.SelectObject(&font);

  dc.SetBkMode(TRANSPARENT);

  dc.TextOut(1074 - 90, 800 - 280, _T("A"));

  dc.SelectObject(pOLdFont);

  font.DeleteObject();

結論:發現字體的高度最小為100,設置其他的最小值,字體沒有發生改變。


如下是AGG渲染字體大小的代碼:

  void RenderTestByGsv()

  {

    agg::rendering_buffer &rbuf = rbuf_window();

    agg::pixfmt_bgr24 pixf(rbuf);


    typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

    renderer_base_type renb(pixf);


    typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderder_scanline_type;

    renderder_scanline_type rensl(renb);


    agg::rasterizer_scanline_aa<> ras;

    agg::scanline_u8 sl;

    ras.reset();

    agg::gsv_text text;

    text.text("123ABC");

    text.size(10, 8);

    text.flip(true);

    text.start_point(150,150);


    agg::trans_affine mtx;

    mtx.reset();


    agg::gsv_text_outline<agg::trans_affine> text_p(text, mtx);

    text_p.width(1.0);



    rensl.color(agg::rgba(0.0, 0.0, 0.0));


    ras.add_path(text_p, 0);

    agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));


  }



郵件原文:

This is going to come off as a smart-ass reply, and I don't intend it to be.

If agg doesn't work well with small fonts, why not just use GDI in those

cases?  Its easy to have a single buffer that can be operated on by both agg

and gdi.



if (font_height < 10)

{

   renderWithGdi()

}

else

{

   renderWithAgg()

}

Since I am bothering everybody today, I am wondering about rendering small

true type fonts.


When the font height gets below 10 or so, Windows draws the font with

vectors.  This keeps the characters readable as the font gets smaller.


With AGG I'm using outlines, and that tends to "smoosh" the characters

together.


I've set the contour width to 0.01, and even 0.0, but when the fonts get

small, the characters Become unreadable.  More so, when displaying Kanji.




What I'd like to do is to figure out a way to force the glyphs to be drawn

as vector's (like GDI).


I want to keep using glyph_ren_outline, as I can rotate and scale the

results nicely.


Any Ideas?

Here is a simple version of code that I use (I removed extra stuff):



//

//  feng is create before as font_engine_win32_tt_int32 // typedef

agg::conv_contour<agg::conv_curve<font_manager_type::path_adaptor_type> >

contour_type; typedef agg::conv_curve<font_manager_type::path_adaptor_type>

curve_type;

typedef agg::font_cache_manager<font_engine_type>

font_manager_type;


font_manager_type       fman(feng);

curve_type               curves(fman.path_adaptor());

contour_type                        contour(curves);



//

// Draw Text Routine

//

agg::rasterizer_scanline_aa<>       ras;

agg::scanline_u8                    sl;

agg::glyph_rendering                gren = agg::glyph_ren_outline;


agg::path_storage                   path;

agg::conv_stroke<agg::path_storage> conv(path);


agg::trans_affine mtx;

mtx *= agg::trans_affine_translation(-x, -y); mtx *=

agg::trans_affine_rotation(-1.0 * rotation ); mtx *=

agg::trans_affine_translation(x, y);


feng.char_set( SHIFTJIS_CHARSET );

if(m_feng.create_font( "MS GOTHIC", gren ))

    {

    feng.weight( 100 ); // FW_LIGHT == 300

    contour.width( 0.01 );

    font_trans_type ftrans( contour, mtx );


    const char              *pp = pString;

    const agg::glyph_cache  *glyph;


    while(*pp)

        {

        if(isJIS(pp))   // Check for Multibtye Japanese String

            {

            WCHAR   ws[2];

         MultiByteToWideChar( 932, 0, pp, 2, ws, sizeof(ws));

            glyph = pT->m_fman.glyph(ws[0]);

            ++pp; // Multi byte

            }

        else

            {

            glyph = pT->m_fman.glyph(*pp);

            }

        pp++;


        if(glyph)

            {

            ras.reset();

            ras.add_path(ftrans);


            fman.add_kerning(&x, &y);

            agg::render_scanlines(ras, sl, ren_aa);


            x += glyph->advance_x;

            y += glyph->advance_y;

            }

        }

    }


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女