2008-11-23 5 views
2

Чтобы получить некоторую плавную графику, я хочу нарисовать избыточный диск с коэффициентом 2 и затем уменьшить масштаб.wxWidgets: Есть ли способ избежать или ускорить wxBitmap :: ConvertToImage()?

Так что я делаю, чтобы рисовать передискретизацию на wxBitmap в wxMemoryDC, а затем уменьшите его перед копированием на мой постоянный ток. Код ниже работает нормально, но bitmapOversampled.ConvertToImage(); очень медленный.

Есть ли способ достичь такого же результата без необходимости конвертировать из wxBitmap в wxImage и наоборот?


    void OnPaint 
    (wxPaintEvent& event) 
    { 
     wxBitmap bitmapOversampled(m_width * 2, m_height * 2); 
     wxMemoryDC memDC(bitmapOversampled); 

     // Draw the elements. 
     drawElements(&memDC); 

     // Scale to correct size. 
     wxImage image = bitmapOversampled.ConvertToImage(); 
     image.Rescale(m_width, m_height); 
     memDC.SelectObject(wxBitmap(image)); 

     // Copy to dc. 
     wxPaintDC dc(this); 
     dc.Blit(0, 0, m_width, m_height, &memDC, 0, 0); 
    }; 

ответ

2

К сожалению, не существует портативного метода wx для ускорения этого масштабирования. Но есть метод Scale в порте Gtk в wxBitmap. Вы можете использовать это для wxGTK. Для wxMSW вы можете использовать StretchBlt API win32. В wxDC есть методы, которые предоставят вам собственный дескриптор HDC для Windows.

Вы можете сделать это несколько более прямо вперед, если вы рисуете прямо:

wxPaintDC dc(this); 
dc.DrawBitmap(image, 0, 0, false); 

Кроме того, не воссоздавать растрового изображения в каждом случае краской. Сохраните его как участника и заново создайте его, только когда вы получите wxSizeEvent. Вероятно, это значительно ускорит вашу программу.

Другой способ заключается в полном уменьшении масштаба и использовании wxGraphicsContext. Он использует Cairo на wxGTK и gdi + на wxMSW. Это относительно новое, но можно сделать сглаживание.