⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childview.cpp

📁 该源码程序实现了intel MMX16位的底层控制功能,在vc环境下完成的。
💻 CPP
字号:
// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "MMX8.h"
#include "ChildView.h"
#include ".\childview.h"
#include "MMX_SSESupport.h"
#include "TimeCounterEx.h"
#include "MainFrm.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


#define TIME_START CTimeCounter* pT = new CTimeCounter()
#define TIME_END   ShowTime(pT->GetExecutionTime())


const int c_nNumberOfCalculations = 10;

const int c_nBrightnessChange = -40;

// CChildView

CChildView::CChildView()
{
    m_pInitialImage = NULL;
    m_pImageBits = NULL;

    m_bMMX = FALSE;
}

CChildView::~CChildView()
{
    if ( m_pInitialImage )
        delete[] m_pInitialImage;
}


BEGIN_MESSAGE_MAP(CChildView, CWnd)
	ON_WM_PAINT()
    ON_WM_CREATE()
    ON_COMMAND(ID_OPERATIONS_RESET, OnOperationsReset)
    ON_COMMAND(ID_INVERTCOLORS_ASSEMBLY_MMX, OnInvertcolorsAssemblyMmx)
    ON_UPDATE_COMMAND_UI(ID_INVERTCOLORS_ASSEMBLY_MMX, OnUpdateMmx)
    ON_COMMAND(ID_INVERTCOLORS_C, OnInvertcolorsC)
    ON_COMMAND(ID_INVERTCOLORS_C_MMX, OnInvertcolorsC3Mmx)
    ON_UPDATE_COMMAND_UI(ID_INVERTCOLORS_C_MMX, OnUpdateMmx)
    ON_WM_ERASEBKGND()
    ON_COMMAND(ID_CHANGEBRIGHTNESS_C, OnChangebrightnessC)
    ON_COMMAND(ID_CHANGEBRIGHTNESS_ASSEMBLY_MMX, OnChangebrightnessAssemblyMmx)
    ON_COMMAND(ID_CHANGEBRIGHTNESS_C_MMX, OnChangebrightnessCMmx)
    ON_UPDATE_COMMAND_UI(ID_CHANGEBRIGHTNESS_ASSEMBLY_MMX, OnUpdateMmx)
    ON_UPDATE_COMMAND_UI(ID_CHANGEBRIGHTNESS_C_MMX, OnUpdateMmx)
END_MESSAGE_MAP()



// CChildView message handlers

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

	return TRUE;
}

// prevent flickering
BOOL CChildView::OnEraseBkgnd(CDC* pDC)
{
//    return CWnd::OnEraseBkgnd(pDC);

    CRect rect;
    GetClientRect(&rect);

    if ( ! m_Image.IsNull() )
        pDC->ExcludeClipRect(0, 0, m_Image.GetWidth() - 1, m_Image.GetHeight() - 1);

    pDC->FillSolidRect(&rect, RGB(255, 255, 255));

    pDC->SelectClipRgn(NULL);

    return TRUE;
}

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
    if ( ! m_Image.IsNull() )
    {
        m_Image.BitBlt(
            dc.m_hDC,
            0,
            0);
    }
}


int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    TestMMX();

    InitImage();

    return 0;
}


// Test MMX support
void CChildView::TestMMX()
{
    bool bMMX, bSSE;
    TestFeatures(&bMMX, &bSSE);

    if ( bMMX )
        m_bMMX = TRUE;
}


// Initialization
void CChildView::InitImage()
{
    CImage image;
    image.LoadFromResource(AfxGetInstanceHandle(), IDB_BITMAP_SAMPLE);

    if ( image.IsNull() )
        return;

    // create 8 bpp image
    m_Image.Create(
        image.GetWidth(),
        image.GetHeight(),
        8);

    int nPitch = m_Image.GetPitch();
    int nWidth = m_Image.GetWidth();
    int nHeight = m_Image.GetHeight();

    ASSERT( m_Image.IsDIBSection() );
    ASSERT( abs(nPitch) == nWidth );

    // fill gray-scale color table
    RGBQUAD colorTable[256];
    int i;

    for ( i = 0; i < 256; i++ )
    {
        colorTable[i].rgbBlue = colorTable[i].rgbGreen = 
            colorTable[i].rgbRed = (BYTE) i;
        colorTable[i].rgbReserved = 0;
    }

    m_Image.SetColorTable(0, 256, colorTable);

    // copy from image to m_Image
    image.BitBlt(
        m_Image.GetDC(),
        0, 
        0);

    m_Image.ReleaseDC();


    // get pointer to start of the image in memory
    if ( nPitch > 0 )
        m_pImageBits = (BYTE*) m_Image.GetBits();
    else
        m_pImageBits = (BYTE*) m_Image.GetBits() - (nHeight - 1) * nWidth;

    // keep initial image state in m_pInitialImage array
    m_pInitialImage = new BYTE[nWidth * nHeight];
    memcpy(m_pInitialImage, m_pImageBits, nWidth * nHeight);
}

// Show execution time
void CChildView::ShowTime(__int64 nTime)
{
    CString s;
    s.Format(_T("%d ms"), nTime);

    ((CMainFrame*)AfxGetMainWnd())->ShowText(s);
}

// All MMX menu items are disabled if MMX is not supported
void CChildView::OnUpdateMmx(CCmdUI *pCmdUI)
{
    pCmdUI->Enable(m_bMMX);
}

// Reset the original image
void CChildView::OnOperationsReset()
{
    if ( m_pInitialImage && m_pImageBits )
    {
        memcpy(m_pImageBits, m_pInitialImage, m_Image.GetWidth() * m_Image.GetHeight());

        Invalidate();
        UpdateWindow();
    }
}

// Change brightness using one of possible ways
// (C++, C++ and MMX, Assembly and MMX)
void CChildView::ChangeBrightness(CImg8Operations::CHANGE_BRIGHTNESS pFunction)
{
    TIME_START;

    // make operation number of times to see the difference
    for ( int i = 0; i < c_nNumberOfCalculations; i++ )
    {
        (m_Operations.*pFunction)(
            m_pInitialImage,
            m_pImageBits,
            m_Image.GetWidth() * m_Image.GetHeight(),
            c_nBrightnessChange);
    }

    TIME_END;

    Invalidate();
    UpdateWindow();
}


// Invert image using one of possible ways
// (C++, C++ and MMX, Assembly and MMX)
void CChildView::InvertImage(CImg8Operations::INVERT_IMAGE pFunction)
{
    TIME_START;

    // make operation number of times to see the difference
    for ( int i = 0; i < c_nNumberOfCalculations; i++ )
    {
        (m_Operations.*pFunction)(
            m_pInitialImage,
            m_pImageBits,
            m_Image.GetWidth() * m_Image.GetHeight());
    }

    TIME_END;

    Invalidate();
    UpdateWindow();
}

// Invert image using C++
void CChildView::OnInvertcolorsC()
{
    InvertImage(CImg8Operations::InvertImageCPlusPlus);
}

// Invert image using C++ with MMX 
void CChildView::OnInvertcolorsC3Mmx()
{
    InvertImage(CImg8Operations::InvertImageC_MMX);
}

// Invert image using Assembly 
void CChildView::OnInvertcolorsAssemblyMmx()
{
    InvertImage(CImg8Operations::InvertImageC_MMX);
}

// Change brightness using C++
void CChildView::OnChangebrightnessC()
{
    ChangeBrightness(CImg8Operations::ChangeBrightnessCPlusPlus);
}

// Change brightness using C++ with MMX
void CChildView::OnChangebrightnessCMmx()
{
    ChangeBrightness(CImg8Operations::ChangeBrightnessC_MMX);
}

// Change brightness using Assembly with MMX
void CChildView::OnChangebrightnessAssemblyMmx()
{
    ChangeBrightness(CImg8Operations::ChangeBrightnessAssembly_MMX);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -