233 changed files with 250740 additions and 0 deletions
-
197example/lesson001-windows/lesson001-window.vcproj
-
76example/lesson001-windows/window.cpp
-
197example/lesson002-windows/lesson002-windows.vcproj
-
117example/lesson002-windows/window2.cpp
-
5930example/lesson003-point/CELLMath.hpp
-
17example/lesson003-point/Raster.cpp
-
60example/lesson003-point/Raster.h
-
209example/lesson003-point/lesson003-point.vcproj
-
118example/lesson003-point/lesson003.cpp
-
5930example/lesson004-point改进/CELLMath.hpp
-
54example/lesson004-point改进/Raster.cpp
-
31example/lesson004-point改进/Raster.h
-
209example/lesson004-point改进/lesson004-point改进.vcproj
-
118example/lesson004-point改进/lesson004.cpp
-
5930example/lesson005-line/CELLMath.hpp
-
86example/lesson005-line/Raster.cpp
-
33example/lesson005-line/Raster.h
-
209example/lesson005-line/lesson005-line.vcproj
-
117example/lesson005-line/lesson005.cpp
-
5930example/lesson006-line2/CELLMath.hpp
-
53example/lesson006-line2/Raster.cpp
-
134example/lesson006-line2/Raster.h
-
209example/lesson006-line2/lesson006-line2.vcproj
-
117example/lesson006-line2/lesson006.cpp
-
5930example/lesson007-line-color/CELLMath.hpp
-
118example/lesson007-line-color/Raster.cpp
-
33example/lesson007-line-color/Raster.h
-
209example/lesson007-line-color/lesson007-line-color.vcproj
-
117example/lesson007-line-color/lesson007.cpp
-
5930example/lesson008-lineStrip/CELLMath.hpp
-
116example/lesson008-lineStrip/Raster.cpp
-
94example/lesson008-lineStrip/Raster.h
-
209example/lesson008-lineStrip/lesson008-lineStrip.vcproj
-
137example/lesson008-lineStrip/lesson008.cpp
-
5930example/lesson009-贝塞尔/CELLMath.hpp
-
116example/lesson009-贝塞尔/Raster.cpp
-
94example/lesson009-贝塞尔/Raster.h
-
209example/lesson009-贝塞尔/lesson009-贝塞尔.vcproj
-
145example/lesson009-贝塞尔/lesson009.cpp
-
5930example/lesson010-rect/CELLMath.hpp
-
161example/lesson010-rect/Raster.cpp
-
67example/lesson010-rect/Raster.h
-
209example/lesson010-rect/lesson010-rect.vcproj
-
147example/lesson010-rect/lesson010.cpp
-
5930example/lesson011-rectEx/CELLMath.hpp
-
161example/lesson011-rectEx/Raster.cpp
-
73example/lesson011-rectEx/Raster.h
-
209example/lesson011-rectEx/lesson011-rectEx.vcproj
-
147example/lesson011-rectEx/lesson011.cpp
-
5930example/lesson012-rect-color/CELLMath.hpp
-
178example/lesson012-rect-color/Raster.cpp
-
82example/lesson012-rect-color/Raster.h
-
209example/lesson012-rect-color/lesson012-rect-color.vcproj
-
164example/lesson012-rect-color/lesson012.cpp
-
5930example/lesson013-triangle/CELLMath.hpp
-
202example/lesson013-triangle/Raster.cpp
-
69example/lesson013-triangle/Raster.h
-
209example/lesson013-triangle/lesson013-triangle.vcproj
-
164example/lesson013-triangle/lesson013.cpp
-
5930example/lesson014-span/CELLMath.hpp
-
202example/lesson014-span/Raster.cpp
-
149example/lesson014-span/Raster.h
-
209example/lesson014-span/lesson014-span.vcproj
-
164example/lesson014-span/lesson014.cpp
-
5930example/lesson015-span/CELLMath.hpp
-
202example/lesson015-span/Raster.cpp
-
183example/lesson015-span/Raster.h
-
209example/lesson015-span/lesson015-span.vcproj
-
122example/lesson015-span/lesson015.cpp
-
5930example/lesson016-triangle-color/CELLMath.hpp
-
202example/lesson016-triangle-color/Raster.cpp
-
204example/lesson016-triangle-color/Raster.h
-
209example/lesson016-triangle-color/lesson016-triangle-color.vcproj
-
126example/lesson016-triangle-color/lesson016.cpp
-
5938example/lesson017-优化/CELLMath.hpp
-
53example/lesson017-优化/CELLTimestamp.hpp
-
202example/lesson017-优化/Raster.cpp
-
208example/lesson017-优化/Raster.h
-
211example/lesson017-优化/lesson017-优化.vcproj
-
142example/lesson017-优化/lesson017.cpp
-
5938example/lesson018-优化2/CELLMath.hpp
-
53example/lesson018-优化2/CELLTimestamp.hpp
-
202example/lesson018-优化2/Raster.cpp
-
222example/lesson018-优化2/Raster.h
-
211example/lesson018-优化2/lesson018-优化2.vcproj
-
142example/lesson018-优化2/lesson018.cpp
-
5938example/lesson019-优化3/CELLMath.hpp
-
53example/lesson019-优化3/CELLTimestamp.hpp
-
202example/lesson019-优化3/Raster.cpp
-
229example/lesson019-优化3/Raster.h
-
211example/lesson019-优化3/lesson019-优化3.vcproj
-
142example/lesson019-优化3/lesson019.cpp
-
5938example/lesson020-优化4/CELLMath.hpp
-
53example/lesson020-优化4/CELLTimestamp.hpp
-
202example/lesson020-优化4/Raster.cpp
-
232example/lesson020-优化4/Raster.h
-
142example/lesson020-优化4/lesson019.cpp
-
211example/lesson020-优化4/lesson020-优化4.vcproj
-
5938example/lesson200-drawImage/CELLMath.hpp
-
53example/lesson200-drawImage/CELLTimestamp.hpp
@ -0,0 +1,197 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson001-window" |
||||
|
ProjectGUID="{A8549F81-52DC-490D-8D42-BF70939CF963}" |
||||
|
RootNamespace="window" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\window.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,76 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowEx( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
@ -0,0 +1,197 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson002-windows" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF001}" |
||||
|
RootNamespace="lesson002-windows" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\window2.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,117 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 注册窗口类
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 创建窗口
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
|
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
memset(buffer,0,width * height * 4); |
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
|
||||
|
memset(buffer,0,width * height * 4); |
||||
|
//! 修改其中一部分
|
||||
|
unsigned char* rgba = (unsigned char*)buffer; |
||||
|
int pitch = width * 4; |
||||
|
|
||||
|
memset(rgba + pitch * 10,255, pitch); |
||||
|
|
||||
|
|
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson003-point/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,17 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
|
||||
|
|
||||
|
Raster::Raster() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster(void) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba _buffer[256][256]; |
||||
|
public: |
||||
|
Raster(); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear() |
||||
|
{ |
||||
|
memset(_buffer,0,sizeof(_buffer)); |
||||
|
} |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void setPixel(int x,int y,Rgba color) |
||||
|
{ |
||||
|
if (x < 0 || y < 0 || x >= 256 || y >= 256) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y][x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson003-point" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF003}" |
||||
|
RootNamespace="lesson003-point" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson003.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,118 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_POPUPWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
256, |
||||
|
256, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = 256; |
||||
|
bmpInfor.bmiHeader.biHeight = 256; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster; |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
for (int i = 0 ;i < 100 ; ++ i) |
||||
|
{ |
||||
|
raster.drawPoint(rand()%256,rand()%256,CELL::Rgba(255,0,0),2); |
||||
|
} |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,sizeof(raster._buffer)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson004-point改进/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,54 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
public: |
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson004-point改进" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF004}" |
||||
|
RootNamespace="lesson004-point改进" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="源文件" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson004.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="头文件" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="资源文件" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,118 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_POPUPWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
256, |
||||
|
256, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
for (int i = 0 ;i < 100 ; ++ i) |
||||
|
{ |
||||
|
raster.drawPoint(rand()%256,rand()%256,CELL::Rgba(255,0,0),2); |
||||
|
} |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson005-line/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,86 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0) |
||||
|
{ |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float y = pt1.y; y <= pt2.y ; y += 1.0f) |
||||
|
{ |
||||
|
setPixel(pt2.x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else if(yOffset == 0) |
||||
|
{ |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = pt1.x; x <= pt2.x ; x += 1.0f) |
||||
|
{ |
||||
|
setPixel(x,pt2.y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = pt1.x; x <= pt2.x ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,33 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color); |
||||
|
|
||||
|
public: |
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson005-line" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF005}" |
||||
|
RootNamespace="lesson005-line" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson005.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,117 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_POPUPWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
256, |
||||
|
256, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
|
||||
|
raster.drawLine(CELL::float2(100,100),CELL::float2(200,200),CELL::Rgba(255,0,0)); |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson006-line2/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,53 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,134 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color); |
||||
|
} |
||||
|
|
||||
|
if (xOffset == 0) |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
setPixel(pt2.x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else if(yOffset == 0) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
setPixel(x,pt2.y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float slope = yOffset / xOffset; |
||||
|
|
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float slope = xOffset / yOffset; |
||||
|
|
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
for (float y = pt1.y; y <= pt2.y ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
setPixel(pt2.x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public: |
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson006-line2" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF006}" |
||||
|
RootNamespace="lesson006-line2" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson006.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,117 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_POPUPWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
256, |
||||
|
256, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
|
||||
|
raster.drawLine(CELL::float2(-11,111),CELL::float2(666,222),CELL::Rgba(255,0,0)); |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson007-line-color/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,118 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float slope = yOffset / xOffset; |
||||
|
|
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float slope = xOffset / yOffset; |
||||
|
|
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
for (float y = pt1.y; y <= pt2.y ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(pt2.x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,33 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
public: |
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson007-line-color" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF007}" |
||||
|
RootNamespace="lesson007-line-color" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson007.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,117 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_POPUPWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
256, |
||||
|
256, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
|
||||
|
raster.drawLine(CELL::float2(1,100),CELL::float2(200,33),CELL::Rgba(255,0,0),CELL::Rgba(0,255,0)); |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson008-lineStrip/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,116 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,94 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson008-lineStrip" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF008}" |
||||
|
RootNamespace="lesson008-lineStrip" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson008.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,137 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
256, |
||||
|
256, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 arPoints[] = |
||||
|
{ |
||||
|
CELL::float2(11,34), |
||||
|
CELL::float2(33,66), |
||||
|
CELL::float2(1,100), |
||||
|
CELL::float2(22,88), |
||||
|
CELL::float2(100,1), |
||||
|
}; |
||||
|
raster.drawArrays(CELL::DM_LINE_STRIP,arPoints,sizeof(arPoints)/sizeof(arPoints[0])); |
||||
|
|
||||
|
CELL::float2 center(100,100); |
||||
|
|
||||
|
float radius = 80; |
||||
|
|
||||
|
CELL::float2 arCircle[360]; |
||||
|
for (int i = 0 ;i < 360 ; ++ i) |
||||
|
{ |
||||
|
float rad = DEG2RAD(i); |
||||
|
arCircle[i].x = radius * cos(rad) + center.x; |
||||
|
arCircle[i].y = radius * sin(rad) + center.y; |
||||
|
} |
||||
|
raster.drawArrays(CELL::DM_LINE_STRIP,arCircle,sizeof(arCircle)/sizeof(arCircle[0])); |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson009-贝塞尔/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,116 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,94 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson009-贝塞尔" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF009}" |
||||
|
RootNamespace="lesson009-贝塞尔" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="源文件" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson009.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="头文件" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="资源文件" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,145 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 points[] = |
||||
|
{ |
||||
|
CELL::float2(50,50), |
||||
|
CELL::float2(200,50), |
||||
|
CELL::float2(33,88), |
||||
|
CELL::float2(159,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::float2 prev[2]; |
||||
|
for (float t = 0 ;t < 1.0f ; t += 0.01f) |
||||
|
{ |
||||
|
float x = points[0].x * pow(1-t,3) |
||||
|
+ 3 * points[1].x * t * pow(1-t,2) |
||||
|
+ 3 * points[2].x * t*t * (1-t) |
||||
|
+ points[3].x * t * t * t; |
||||
|
float y = points[0].y * pow(1-t,3) |
||||
|
+ 3 * points[1].y * t * pow(1-t,2) |
||||
|
+ 3 * points[2].y * t*t * (1-t) |
||||
|
+ points[3].y * t * t * t; |
||||
|
if (t == 0) |
||||
|
{ |
||||
|
prev[0] = CELL::float2(x,y); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
prev[1] = CELL::float2(x,y); |
||||
|
raster.drawArrays(CELL::DM_LINES,prev,2); |
||||
|
prev[0] = prev[1]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson010-rect/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,161 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,67 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h) |
||||
|
{ |
||||
|
for (int x = startX ; x < startX + w ; ++ x) |
||||
|
{ |
||||
|
for (int y = startY ; y < startY + h ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson010-rect" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF010}" |
||||
|
RootNamespace="lesson010-rect" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson010.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,147 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 points[] = |
||||
|
{ |
||||
|
CELL::float2(50,50), |
||||
|
CELL::float2(200,50), |
||||
|
CELL::float2(33,88), |
||||
|
CELL::float2(159,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::float2 prev[2]; |
||||
|
for (float t = 0 ;t < 1.0f ; t += 0.01f) |
||||
|
{ |
||||
|
float x = points[0].x * pow(1-t,3) |
||||
|
+ 3 * points[1].x * t * pow(1-t,2) |
||||
|
+ 3 * points[2].x * t*t * (1-t) |
||||
|
+ points[3].x * t * t * t; |
||||
|
float y = points[0].y * pow(1-t,3) |
||||
|
+ 3 * points[1].y * t * pow(1-t,2) |
||||
|
+ 3 * points[2].y * t*t * (1-t) |
||||
|
+ points[3].y * t * t * t; |
||||
|
if (t == 0) |
||||
|
{ |
||||
|
prev[0] = CELL::float2(x,y); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
prev[1] = CELL::float2(x,y); |
||||
|
raster.drawArrays(CELL::DM_LINES,prev,2); |
||||
|
prev[0] = prev[1]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
raster.drawFilleRect(-10,-10,80,80); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson011-rectEx/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,161 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,73 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson011-rectEx" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF011}" |
||||
|
RootNamespace="lesson011-rectEx" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson011.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,147 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 points[] = |
||||
|
{ |
||||
|
CELL::float2(50,50), |
||||
|
CELL::float2(200,50), |
||||
|
CELL::float2(33,88), |
||||
|
CELL::float2(159,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::float2 prev[2]; |
||||
|
for (float t = 0 ;t < 1.0f ; t += 0.01f) |
||||
|
{ |
||||
|
float x = points[0].x * pow(1-t,3) |
||||
|
+ 3 * points[1].x * t * pow(1-t,2) |
||||
|
+ 3 * points[2].x * t*t * (1-t) |
||||
|
+ points[3].x * t * t * t; |
||||
|
float y = points[0].y * pow(1-t,3) |
||||
|
+ 3 * points[1].y * t * pow(1-t,2) |
||||
|
+ 3 * points[2].y * t*t * (1-t) |
||||
|
+ points[3].y * t * t * t; |
||||
|
if (t == 0) |
||||
|
{ |
||||
|
prev[0] = CELL::float2(x,y); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
prev[1] = CELL::float2(x,y); |
||||
|
raster.drawArrays(CELL::DM_LINES,prev,2); |
||||
|
prev[0] = prev[1]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
raster.drawFilleRect(300,260,200,200); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson012-rect-color/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,178 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,82 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson012-rect-color" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF012}" |
||||
|
RootNamespace="lesson012-rect-color" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson012.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,164 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 points[] = |
||||
|
{ |
||||
|
CELL::float2(50,50), |
||||
|
CELL::float2(200,50), |
||||
|
CELL::float2(33,88), |
||||
|
CELL::float2(159,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::float2 prev[2]; |
||||
|
for (float t = 0 ;t < 1.0f ; t += 0.01f) |
||||
|
{ |
||||
|
float x = points[0].x * pow(1-t,3) |
||||
|
+ 3 * points[1].x * t * pow(1-t,2) |
||||
|
+ 3 * points[2].x * t*t * (1-t) |
||||
|
+ points[3].x * t * t * t; |
||||
|
float y = points[0].y * pow(1-t,3) |
||||
|
+ 3 * points[1].y * t * pow(1-t,2) |
||||
|
+ 3 * points[2].y * t*t * (1-t) |
||||
|
+ points[3].y * t * t * t; |
||||
|
if (t == 0) |
||||
|
{ |
||||
|
prev[0] = CELL::float2(x,y); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
prev[1] = CELL::float2(x,y); |
||||
|
raster.drawArrays(CELL::DM_LINES,prev,2); |
||||
|
prev[0] = prev[1]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
CELL::int2 pt[] = |
||||
|
{ |
||||
|
CELL::int2(10,10), |
||||
|
CELL::int2(110,10), |
||||
|
CELL::int2(110,110), |
||||
|
CELL::int2(10,110), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba colors[] = |
||||
|
{ |
||||
|
CELL::Rgba (255,0,0), |
||||
|
CELL::Rgba (0,255,0), |
||||
|
CELL::Rgba (0,0,255), |
||||
|
CELL::Rgba (255,255,255), |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
raster.drawRect(pt,colors); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson013-triangle/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,69 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawLine(int startX,int endX, int y,Rgba color1,Rgba color2) |
||||
|
{ |
||||
|
float length = tmax<int>(endX - startX,1); |
||||
|
for (int x = startX ; x <= endX ; ++ x) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,( x - startX)/length); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson013-triangle" |
||||
|
ProjectGUID="{A8549F81-8888-490D-8D42-BF70939CF013}" |
||||
|
RootNamespace="lesson013-triangle" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson013.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,164 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 points[] = |
||||
|
{ |
||||
|
CELL::float2(50,50), |
||||
|
CELL::float2(200,50), |
||||
|
CELL::float2(33,88), |
||||
|
CELL::float2(159,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::float2 prev[2]; |
||||
|
for (float t = 0 ;t < 1.0f ; t += 0.01f) |
||||
|
{ |
||||
|
float x = points[0].x * pow(1-t,3) |
||||
|
+ 3 * points[1].x * t * pow(1-t,2) |
||||
|
+ 3 * points[2].x * t*t * (1-t) |
||||
|
+ points[3].x * t * t * t; |
||||
|
float y = points[0].y * pow(1-t,3) |
||||
|
+ 3 * points[1].y * t * pow(1-t,2) |
||||
|
+ 3 * points[2].y * t*t * (1-t) |
||||
|
+ points[3].y * t * t * t; |
||||
|
if (t == 0) |
||||
|
{ |
||||
|
prev[0] = CELL::float2(x,y); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
prev[1] = CELL::float2(x,y); |
||||
|
raster.drawArrays(CELL::DM_LINES,prev,2); |
||||
|
prev[0] = prev[1]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
CELL::int2 pt[] = |
||||
|
{ |
||||
|
CELL::int2(10,10), |
||||
|
CELL::int2(110,10), |
||||
|
CELL::int2(110,110), |
||||
|
CELL::int2(10,110), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba colors[] = |
||||
|
{ |
||||
|
CELL::Rgba (255,0,0), |
||||
|
CELL::Rgba (0,255,0), |
||||
|
CELL::Rgba (0,0,255), |
||||
|
CELL::Rgba (255,255,255), |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
raster.drawRect(pt,colors); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson014-span/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,149 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
int _y; |
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Ege(int x1,int y1,int x2,int y2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
|
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
|
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
float scale1 = 0; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
for (int y = e2._y1 ; y <= e2._y2 ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + scale1 * xOffset1; |
||||
|
int x2 = e2._x1 + scale * xOffset; |
||||
|
|
||||
|
Span span(x1,x2,y); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
for (int x = span._xStart ; x <= span._xEnd; ++ x) |
||||
|
{ |
||||
|
setPixel(x,span._y,_color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson014-triangle-span" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C014}" |
||||
|
RootNamespace="lesson014-triangle-span" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson014.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,164 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::float2 points[] = |
||||
|
{ |
||||
|
CELL::float2(50,50), |
||||
|
CELL::float2(200,50), |
||||
|
CELL::float2(33,88), |
||||
|
CELL::float2(159,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::float2 prev[2]; |
||||
|
for (float t = 0 ;t < 1.0f ; t += 0.01f) |
||||
|
{ |
||||
|
float x = points[0].x * pow(1-t,3) |
||||
|
+ 3 * points[1].x * t * pow(1-t,2) |
||||
|
+ 3 * points[2].x * t*t * (1-t) |
||||
|
+ points[3].x * t * t * t; |
||||
|
float y = points[0].y * pow(1-t,3) |
||||
|
+ 3 * points[1].y * t * pow(1-t,2) |
||||
|
+ 3 * points[2].y * t*t * (1-t) |
||||
|
+ points[3].y * t * t * t; |
||||
|
if (t == 0) |
||||
|
{ |
||||
|
prev[0] = CELL::float2(x,y); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
prev[1] = CELL::float2(x,y); |
||||
|
raster.drawArrays(CELL::DM_LINES,prev,2); |
||||
|
prev[0] = prev[1]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
CELL::int2 pt[] = |
||||
|
{ |
||||
|
CELL::int2(10,10), |
||||
|
CELL::int2(110,10), |
||||
|
CELL::int2(110,110), |
||||
|
CELL::int2(10,110), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba colors[] = |
||||
|
{ |
||||
|
CELL::Rgba (255,0,0), |
||||
|
CELL::Rgba (0,255,0), |
||||
|
CELL::Rgba (0,0,255), |
||||
|
CELL::Rgba (255,255,255), |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
raster.drawRect(pt,colors); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson015-span/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,183 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
int _y; |
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Ege(int x1,int y1,int x2,int y2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
|
||||
|
|
||||
|
public: |
||||
|
void drawTriangle(int2 p0,int2 p1,int2 p2) |
||||
|
{ |
||||
|
Ege eges[3] = |
||||
|
{ |
||||
|
Ege(p0.x,p0.y,p1.x,p1.y), |
||||
|
Ege(p1.x,p1.y,p2.x,p2.y), |
||||
|
Ege(p2.x,p2.y,p0.x,p0.y), |
||||
|
}; |
||||
|
int iMax = 0; |
||||
|
int length = eges[0]._y2 - eges[0]._y1; |
||||
|
|
||||
|
for (int i = 1 ;i < 3 ; ++ i) |
||||
|
{ |
||||
|
int len = eges[i]._y2 - eges[i]._y1; |
||||
|
if (len > length) |
||||
|
{ |
||||
|
length = i; |
||||
|
} |
||||
|
} |
||||
|
int iShort1 = (iMax + 1)%3; |
||||
|
int iShort2 = (iMax + 2)%3; |
||||
|
|
||||
|
drawEge(eges[iMax],eges[iShort1]); |
||||
|
drawEge(eges[iMax],eges[iShort2]); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
if (yOffset1 == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
if (yOffset == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float scale1 = (float)(e2._y1 - e1._y1)/yOffset1; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
for (int y = e2._y1 ; y < e2._y2 ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + (int)(scale1 * xOffset1); |
||||
|
int x2 = e2._x1 + (int)(scale * xOffset); |
||||
|
|
||||
|
Span span(x1,x2,y); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
for (int x = span._xStart ; x < span._xEnd; ++ x) |
||||
|
{ |
||||
|
setPixel(x,span._y,_color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson015-triangle-span" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C015}" |
||||
|
RootNamespace="lesson015-triangle-span" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson015.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,122 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::int2 pt[3] = |
||||
|
{ |
||||
|
CELL::int2(100,10), |
||||
|
CELL::int2(10,100), |
||||
|
CELL::int2(200,100), |
||||
|
}; |
||||
|
|
||||
|
raster.drawTriangle(pt[0],pt[1],pt[2]); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5930
example/lesson016-triangle-color/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (Rgba*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,204 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
Rgba _colorStart; |
||||
|
Rgba _colorEnd; |
||||
|
int _y; |
||||
|
|
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y,Rgba colorStart,Rgba colorEnd) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_colorStart = colorStart; |
||||
|
_colorEnd = colorEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
|
||||
|
_colorStart = colorEnd; |
||||
|
_colorEnd = colorStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
Rgba _color1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Rgba _color2; |
||||
|
|
||||
|
Ege(int x1,int y1,Rgba color1,int x2,int y2,Rgba color2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
_color1 = color1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
_color2 = color2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
_color1 = color2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
_color2 = color1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
Rgba* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
public: |
||||
|
void drawTriangle(int2 p0,int2 p1,int2 p2,Rgba c0,Rgba c1,Rgba c2) |
||||
|
{ |
||||
|
Ege eges[3] = |
||||
|
{ |
||||
|
Ege(p0.x,p0.y,c0, p1.x,p1.y,c1), |
||||
|
Ege(p1.x,p1.y,c1, p2.x,p2.y,c2), |
||||
|
Ege(p2.x,p2.y,c2, p0.x,p0.y,c0), |
||||
|
}; |
||||
|
int iMax = 0; |
||||
|
int length = eges[0]._y2 - eges[0]._y1; |
||||
|
|
||||
|
for (int i = 1 ;i < 3 ; ++ i) |
||||
|
{ |
||||
|
int len = eges[i]._y2 - eges[i]._y1; |
||||
|
if (len > length) |
||||
|
{ |
||||
|
length = i; |
||||
|
} |
||||
|
} |
||||
|
int iShort1 = (iMax + 1)%3; |
||||
|
int iShort2 = (iMax + 2)%3; |
||||
|
|
||||
|
drawEge(eges[iMax],eges[iShort1]); |
||||
|
drawEge(eges[iMax],eges[iShort2]); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
if (yOffset1 == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
if (yOffset == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float scale1 = (float)(e2._y1 - e1._y1)/yOffset1; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
for (int y = e2._y1 ; y < e2._y2 ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + (int)(scale1 * xOffset1); |
||||
|
int x2 = e2._x1 + (int)(scale * xOffset); |
||||
|
Rgba color2 = colorLerp(e2._color1,e2._color2,scale); |
||||
|
Rgba color1 = colorLerp(e1._color1,e1._color2,scale1); |
||||
|
|
||||
|
Span span(x1,x2,y,color1,color2); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
float length = span._xEnd - span._xStart; |
||||
|
for (int x = span._xStart ; x < span._xEnd; ++ x) |
||||
|
{ |
||||
|
Rgba color = colorLerp( |
||||
|
span._colorStart |
||||
|
,span._colorEnd |
||||
|
,(float)(x - span._xStart)/length |
||||
|
); |
||||
|
setPixel(x,span._y,color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson016-triangle-color" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C016}" |
||||
|
RootNamespace="lesson016-triangle-color" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="Ô´Îļþ" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson016.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="Í·Îļþ" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="×ÊÔ´Îļþ" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,126 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::int2 pt[3] = |
||||
|
{ |
||||
|
CELL::int2(100,10), |
||||
|
CELL::int2(10,100), |
||||
|
CELL::int2(200,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba color1(255,0,0); |
||||
|
CELL::Rgba color2(0,255,0); |
||||
|
CELL::Rgba color3(0,0,255); |
||||
|
|
||||
|
raster.drawTriangle(pt[0],pt[1],pt[2],color1,color2,color3); |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5938
example/lesson017-优化/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,53 @@ |
|||||
|
#pragma once
|
||||
|
|
||||
|
#include <windows.h>
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class CELLTimestamp |
||||
|
{ |
||||
|
public: |
||||
|
CELLTimestamp() |
||||
|
{ |
||||
|
QueryPerformanceFrequency(&_frequency); |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
~CELLTimestamp() |
||||
|
{} |
||||
|
|
||||
|
void update() |
||||
|
{ |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡µ±Ç°Ãë |
||||
|
*/ |
||||
|
double getElapsedSecond() |
||||
|
{ |
||||
|
return getElapsedTimeInMicroSec() * 0.000001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡ºÁÃë |
||||
|
*/ |
||||
|
double getElapsedTimeInMilliSec() |
||||
|
{ |
||||
|
return this->getElapsedTimeInMicroSec() * 0.001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñȡ΢Ãî |
||||
|
*/ |
||||
|
double getElapsedTimeInMicroSec() |
||||
|
{ |
||||
|
LARGE_INTEGER endCount; |
||||
|
QueryPerformanceCounter(&endCount); |
||||
|
|
||||
|
double startTimeInMicroSec = _startCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
|
||||
|
return endTimeInMicroSec - startTimeInMicroSec; |
||||
|
} |
||||
|
protected: |
||||
|
LARGE_INTEGER _frequency; |
||||
|
LARGE_INTEGER _startCount; |
||||
|
}; |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (uint*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,208 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
Rgba _colorStart; |
||||
|
Rgba _colorEnd; |
||||
|
int _y; |
||||
|
|
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y,Rgba colorStart,Rgba colorEnd) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_colorStart = colorStart; |
||||
|
_colorEnd = colorEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
|
||||
|
_colorStart = colorEnd; |
||||
|
_colorEnd = colorStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
Rgba _color1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Rgba _color2; |
||||
|
|
||||
|
Ege(int x1,int y1,Rgba color1,int x2,int y2,Rgba color2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
_color1 = color1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
_color2 = color2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
_color1 = color2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
_color2 = color1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
uint* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
public: |
||||
|
void drawTriangle(int2 p0,int2 p1,int2 p2,Rgba c0,Rgba c1,Rgba c2) |
||||
|
{ |
||||
|
Ege eges[3] = |
||||
|
{ |
||||
|
Ege(p0.x,p0.y,c0, p1.x,p1.y,c1), |
||||
|
Ege(p1.x,p1.y,c1, p2.x,p2.y,c2), |
||||
|
Ege(p2.x,p2.y,c2, p0.x,p0.y,c0), |
||||
|
}; |
||||
|
int iMax = 0; |
||||
|
int length = eges[0]._y2 - eges[0]._y1; |
||||
|
|
||||
|
for (int i = 1 ;i < 3 ; ++ i) |
||||
|
{ |
||||
|
int len = eges[i]._y2 - eges[i]._y1; |
||||
|
if (len > length) |
||||
|
{ |
||||
|
length = i; |
||||
|
} |
||||
|
} |
||||
|
int iShort1 = (iMax + 1)%3; |
||||
|
int iShort2 = (iMax + 2)%3; |
||||
|
|
||||
|
drawEge(eges[iMax],eges[iShort1]); |
||||
|
drawEge(eges[iMax],eges[iShort2]); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
if (yOffset1 == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
if (yOffset == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float scale1 = (float)(e2._y1 - e1._y1)/yOffset1; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
for (int y = e2._y1 ; y < e2._y2 ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + (int)(scale1 * xOffset1); |
||||
|
int x2 = e2._x1 + (int)(scale * xOffset); |
||||
|
Rgba color2 = colorLerp(e2._color1,e2._color2,scale); |
||||
|
Rgba color1 = colorLerp(e1._color1,e1._color2,scale1); |
||||
|
|
||||
|
Span span(x1,x2,y,color1,color2); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
float length = span._xEnd - span._xStart; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/length; |
||||
|
for (int x = span._xStart ; x < span._xEnd; ++ x) |
||||
|
{ |
||||
|
Rgba color = colorLerp( |
||||
|
span._colorStart |
||||
|
,span._colorEnd |
||||
|
,scale |
||||
|
); |
||||
|
scale += step; |
||||
|
|
||||
|
setPixel(x,span._y,color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,211 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson017-优化" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C017}" |
||||
|
RootNamespace="lesson017-优化" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
EnableEnhancedInstructionSet="0" |
||||
|
FloatingPointModel="0" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="源文件" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson017.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="头文件" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="资源文件" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,142 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
#include "CELLTimestamp.hpp"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::int2 pt[3] = |
||||
|
{ |
||||
|
CELL::int2(100,10), |
||||
|
CELL::int2(10,100), |
||||
|
CELL::int2(200,100), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba color1(255,0,0); |
||||
|
CELL::Rgba color2(0,255,0); |
||||
|
CELL::Rgba color3(0,0,255); |
||||
|
|
||||
|
CELL::CELLTimestamp tms; |
||||
|
|
||||
|
tms.update(); |
||||
|
|
||||
|
raster.drawTriangle(pt[0],pt[1],pt[2],color1,color2,color3); |
||||
|
|
||||
|
|
||||
|
|
||||
|
double mis = tms.getElapsedTimeInMicroSec(); |
||||
|
|
||||
|
char szBuf[128]; |
||||
|
sprintf(szBuf,"%f ",mis); |
||||
|
int i = 00; |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
|
||||
|
TextOut(hMem,10,10,szBuf,strlen(szBuf)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5938
example/lesson018-优化2/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,53 @@ |
|||||
|
#pragma once
|
||||
|
|
||||
|
#include <windows.h>
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class CELLTimestamp |
||||
|
{ |
||||
|
public: |
||||
|
CELLTimestamp() |
||||
|
{ |
||||
|
QueryPerformanceFrequency(&_frequency); |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
~CELLTimestamp() |
||||
|
{} |
||||
|
|
||||
|
void update() |
||||
|
{ |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡µ±Ç°Ãë |
||||
|
*/ |
||||
|
double getElapsedSecond() |
||||
|
{ |
||||
|
return getElapsedTimeInMicroSec() * 0.000001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡ºÁÃë |
||||
|
*/ |
||||
|
double getElapsedTimeInMilliSec() |
||||
|
{ |
||||
|
return this->getElapsedTimeInMicroSec() * 0.001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñȡ΢Ãî |
||||
|
*/ |
||||
|
double getElapsedTimeInMicroSec() |
||||
|
{ |
||||
|
LARGE_INTEGER endCount; |
||||
|
QueryPerformanceCounter(&endCount); |
||||
|
|
||||
|
double startTimeInMicroSec = _startCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
|
||||
|
return endTimeInMicroSec - startTimeInMicroSec; |
||||
|
} |
||||
|
protected: |
||||
|
LARGE_INTEGER _frequency; |
||||
|
LARGE_INTEGER _startCount; |
||||
|
}; |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (uint*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,222 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
Rgba _colorStart; |
||||
|
Rgba _colorEnd; |
||||
|
int _y; |
||||
|
|
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y,Rgba colorStart,Rgba colorEnd) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_colorStart = colorStart; |
||||
|
_colorEnd = colorEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
|
||||
|
_colorStart = colorEnd; |
||||
|
_colorEnd = colorStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
Rgba _color1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Rgba _color2; |
||||
|
|
||||
|
Ege(int x1,int y1,Rgba color1,int x2,int y2,Rgba color2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
_color1 = color1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
_color2 = color2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
_color1 = color2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
_color2 = color1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
uint* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
bool isInRect(int2 pt) |
||||
|
{ |
||||
|
if (pt.x >= 0 && pt.x <= _width && pt.y >= 0 && pt.y <= _height) |
||||
|
{ |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
void drawTriangle(int2 p0,int2 p1,int2 p2,Rgba c0,Rgba c1,Rgba c2) |
||||
|
{ |
||||
|
// if ((!isInRect(p0)) && (!isInRect(p1)) && (!isInRect(p2))) |
||||
|
// { |
||||
|
// return; |
||||
|
// } |
||||
|
Ege eges[3] = |
||||
|
{ |
||||
|
Ege(p0.x,p0.y,c0, p1.x,p1.y,c1), |
||||
|
Ege(p1.x,p1.y,c1, p2.x,p2.y,c2), |
||||
|
Ege(p2.x,p2.y,c2, p0.x,p0.y,c0), |
||||
|
}; |
||||
|
int iMax = 0; |
||||
|
int length = eges[0]._y2 - eges[0]._y1; |
||||
|
|
||||
|
for (int i = 1 ;i < 3 ; ++ i) |
||||
|
{ |
||||
|
int len = eges[i]._y2 - eges[i]._y1; |
||||
|
if (len > length) |
||||
|
{ |
||||
|
length = len; |
||||
|
iMax = i; |
||||
|
} |
||||
|
} |
||||
|
int iShort1 = (iMax + 1)%3; |
||||
|
int iShort2 = (iMax + 2)%3; |
||||
|
|
||||
|
drawEge(eges[iMax],eges[iShort1]); |
||||
|
drawEge(eges[iMax],eges[iShort2]); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
if (yOffset1 == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
if (yOffset == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float scale1 = (float)(e2._y1 - e1._y1)/yOffset1; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
for (int y = e2._y1 ; y < e2._y2 ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + (int)(scale1 * xOffset1); |
||||
|
int x2 = e2._x1 + (int)(scale * xOffset); |
||||
|
Rgba color2 = colorLerp(e2._color1,e2._color2,scale); |
||||
|
Rgba color1 = colorLerp(e1._color1,e1._color2,scale1); |
||||
|
|
||||
|
Span span(x1,x2,y,color1,color2); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
float length = span._xEnd - span._xStart; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/length; |
||||
|
for (int x = span._xStart ; x < span._xEnd; ++ x) |
||||
|
{ |
||||
|
Rgba color = colorLerp( |
||||
|
span._colorStart |
||||
|
,span._colorEnd |
||||
|
,scale |
||||
|
); |
||||
|
scale += step; |
||||
|
|
||||
|
setPixel(x,span._y,color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,211 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson018-优化2" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C018}" |
||||
|
RootNamespace="lesson018-优化2" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
EnableEnhancedInstructionSet="0" |
||||
|
FloatingPointModel="0" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="源文件" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson018.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="头文件" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="资源文件" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,142 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
#include "CELLTimestamp.hpp"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::int2 pt[3] = |
||||
|
{ |
||||
|
CELL::int2(-100,-10), |
||||
|
CELL::int2(-10,-100), |
||||
|
CELL::int2(-200,-100), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba color1(255,0,0); |
||||
|
CELL::Rgba color2(0,255,0); |
||||
|
CELL::Rgba color3(0,0,255); |
||||
|
|
||||
|
CELL::CELLTimestamp tms; |
||||
|
|
||||
|
tms.update(); |
||||
|
|
||||
|
raster.drawTriangle(pt[0],pt[1],pt[2],color1,color2,color3); |
||||
|
|
||||
|
|
||||
|
|
||||
|
double mis = tms.getElapsedTimeInMicroSec(); |
||||
|
|
||||
|
char szBuf[128]; |
||||
|
sprintf(szBuf,"%f ",mis); |
||||
|
int i = 00; |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
|
||||
|
TextOut(hMem,10,10,szBuf,strlen(szBuf)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5938
example/lesson019-优化3/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,53 @@ |
|||||
|
#pragma once
|
||||
|
|
||||
|
#include <windows.h>
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class CELLTimestamp |
||||
|
{ |
||||
|
public: |
||||
|
CELLTimestamp() |
||||
|
{ |
||||
|
QueryPerformanceFrequency(&_frequency); |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
~CELLTimestamp() |
||||
|
{} |
||||
|
|
||||
|
void update() |
||||
|
{ |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡µ±Ç°Ãë |
||||
|
*/ |
||||
|
double getElapsedSecond() |
||||
|
{ |
||||
|
return getElapsedTimeInMicroSec() * 0.000001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡ºÁÃë |
||||
|
*/ |
||||
|
double getElapsedTimeInMilliSec() |
||||
|
{ |
||||
|
return this->getElapsedTimeInMicroSec() * 0.001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñȡ΢Ãî |
||||
|
*/ |
||||
|
double getElapsedTimeInMicroSec() |
||||
|
{ |
||||
|
LARGE_INTEGER endCount; |
||||
|
QueryPerformanceCounter(&endCount); |
||||
|
|
||||
|
double startTimeInMicroSec = _startCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
|
||||
|
return endTimeInMicroSec - startTimeInMicroSec; |
||||
|
} |
||||
|
protected: |
||||
|
LARGE_INTEGER _frequency; |
||||
|
LARGE_INTEGER _startCount; |
||||
|
}; |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (uint*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,229 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
Rgba _colorStart; |
||||
|
Rgba _colorEnd; |
||||
|
int _y; |
||||
|
|
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y,Rgba colorStart,Rgba colorEnd) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_colorStart = colorStart; |
||||
|
_colorEnd = colorEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
|
||||
|
_colorStart = colorEnd; |
||||
|
_colorEnd = colorStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
Rgba _color1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Rgba _color2; |
||||
|
|
||||
|
Ege(int x1,int y1,Rgba color1,int x2,int y2,Rgba color2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
_color1 = color1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
_color2 = color2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
_color1 = color2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
_color2 = color1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
uint* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
bool isInRect(int2 pt) |
||||
|
{ |
||||
|
if (pt.x >= 0 && pt.x <= _width && pt.y >= 0 && pt.y <= _height) |
||||
|
{ |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
void drawTriangle(int2 p0,int2 p1,int2 p2,Rgba c0,Rgba c1,Rgba c2) |
||||
|
{ |
||||
|
// if ((!isInRect(p0)) && (!isInRect(p1)) && (!isInRect(p2))) |
||||
|
// { |
||||
|
// return; |
||||
|
// } |
||||
|
Ege eges[3] = |
||||
|
{ |
||||
|
Ege(p0.x,p0.y,c0, p1.x,p1.y,c1), |
||||
|
Ege(p1.x,p1.y,c1, p2.x,p2.y,c2), |
||||
|
Ege(p2.x,p2.y,c2, p0.x,p0.y,c0), |
||||
|
}; |
||||
|
int iMax = 0; |
||||
|
int length = eges[0]._y2 - eges[0]._y1; |
||||
|
|
||||
|
for (int i = 1 ;i < 3 ; ++ i) |
||||
|
{ |
||||
|
int len = eges[i]._y2 - eges[i]._y1; |
||||
|
if (len > length) |
||||
|
{ |
||||
|
length = len; |
||||
|
iMax = i; |
||||
|
} |
||||
|
} |
||||
|
int iShort1 = (iMax + 1)%3; |
||||
|
int iShort2 = (iMax + 2)%3; |
||||
|
|
||||
|
drawEge(eges[iMax],eges[iShort1]); |
||||
|
drawEge(eges[iMax],eges[iShort2]); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
if (yOffset1 == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
if (yOffset == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
int startY = tmax<int>(e2._y1,0); |
||||
|
int endY = tmin<int>(e2._y2,_height); |
||||
|
scale += (startY - e2._y1)/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float scale1 = (float)(e2._y1 - e1._y1)/yOffset1; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
int startY1 = tmax<int>(e1._y1,0); |
||||
|
int endY1 = tmin<int>(e1._y2,_height); |
||||
|
scale1 += (startY1 - e1._y1)/yOffset1; |
||||
|
|
||||
|
for (int y = startY ; y < endY ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + (int)(scale1 * xOffset1); |
||||
|
int x2 = e2._x1 + (int)(scale * xOffset); |
||||
|
Rgba color2 = colorLerp(e2._color1,e2._color2,scale); |
||||
|
Rgba color1 = colorLerp(e1._color1,e1._color2,scale1); |
||||
|
|
||||
|
Span span(x1,x2,y,color1,color2); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
float length = span._xEnd - span._xStart; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/length; |
||||
|
for (int x = span._xStart ; x < span._xEnd; ++ x) |
||||
|
{ |
||||
|
Rgba color = colorLerp( |
||||
|
span._colorStart |
||||
|
,span._colorEnd |
||||
|
,scale |
||||
|
); |
||||
|
scale += step; |
||||
|
|
||||
|
setPixel(x,span._y,color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,211 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson019-优化3" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C019}" |
||||
|
RootNamespace="lesson019-优化3" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
EnableEnhancedInstructionSet="0" |
||||
|
FloatingPointModel="0" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="源文件" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson019.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="头文件" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="资源文件" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
@ -0,0 +1,142 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
#include "CELLTimestamp.hpp"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::int2 pt[3] = |
||||
|
{ |
||||
|
CELL::int2(230,-80), |
||||
|
CELL::int2(10,280), |
||||
|
CELL::int2(600,280), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba color1(255,0,0); |
||||
|
CELL::Rgba color2(0,255,0); |
||||
|
CELL::Rgba color3(0,0,255); |
||||
|
|
||||
|
CELL::CELLTimestamp tms; |
||||
|
|
||||
|
tms.update(); |
||||
|
|
||||
|
raster.drawTriangle(pt[0],pt[1],pt[2],color1,color2,color3); |
||||
|
|
||||
|
|
||||
|
|
||||
|
double mis = tms.getElapsedTimeInMicroSec(); |
||||
|
|
||||
|
char szBuf[128]; |
||||
|
sprintf(szBuf,"%f ",mis); |
||||
|
int i = 00; |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
|
||||
|
TextOut(hMem,10,10,szBuf,strlen(szBuf)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
5938
example/lesson020-优化4/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,53 @@ |
|||||
|
#pragma once
|
||||
|
|
||||
|
#include <windows.h>
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class CELLTimestamp |
||||
|
{ |
||||
|
public: |
||||
|
CELLTimestamp() |
||||
|
{ |
||||
|
QueryPerformanceFrequency(&_frequency); |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
~CELLTimestamp() |
||||
|
{} |
||||
|
|
||||
|
void update() |
||||
|
{ |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡µ±Ç°Ãë |
||||
|
*/ |
||||
|
double getElapsedSecond() |
||||
|
{ |
||||
|
return getElapsedTimeInMicroSec() * 0.000001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡ºÁÃë |
||||
|
*/ |
||||
|
double getElapsedTimeInMilliSec() |
||||
|
{ |
||||
|
return this->getElapsedTimeInMicroSec() * 0.001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñȡ΢Ãî |
||||
|
*/ |
||||
|
double getElapsedTimeInMicroSec() |
||||
|
{ |
||||
|
LARGE_INTEGER endCount; |
||||
|
QueryPerformanceCounter(&endCount); |
||||
|
|
||||
|
double startTimeInMicroSec = _startCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
|
||||
|
return endTimeInMicroSec - startTimeInMicroSec; |
||||
|
} |
||||
|
protected: |
||||
|
LARGE_INTEGER _frequency; |
||||
|
LARGE_INTEGER _startCount; |
||||
|
}; |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
Raster::Raster( int w,int h,void* buffer ) |
||||
|
{ |
||||
|
_width = w; |
||||
|
_height = h; |
||||
|
_buffer = (uint*)buffer; |
||||
|
} |
||||
|
|
||||
|
Raster::~Raster( void ) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Raster::clear() |
||||
|
{ |
||||
|
memset(_buffer,0,_width * _height * sizeof(Rgba)); |
||||
|
} |
||||
|
|
||||
|
void Raster::drawPoint( int x,int y, Rgba color,int ptSize ) |
||||
|
{ |
||||
|
switch(ptSize) |
||||
|
{ |
||||
|
case 1: |
||||
|
setPixel(x,y,color); |
||||
|
break; |
||||
|
case 2: |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
break; |
||||
|
case 3: |
||||
|
|
||||
|
setPixel(x - 1, y - 1,color); |
||||
|
setPixel(x + 0, y - 1,color); |
||||
|
setPixel(x + 1, y - 1,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 0,color); |
||||
|
setPixel(x + 0, y + 0,color); |
||||
|
setPixel(x + 1, y + 0,color); |
||||
|
|
||||
|
setPixel(x - 1, y + 1,color); |
||||
|
setPixel(x + 0, y + 1,color); |
||||
|
setPixel(x + 1, y + 1,color); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawLine( float2 pt1,float2 pt2,Rgba color1,Rgba color2 ) |
||||
|
{ |
||||
|
float xOffset = pt1.x - pt2.x; |
||||
|
float yOffset = pt1.y - pt2.y; |
||||
|
|
||||
|
if (xOffset == 0 && yOffset == 0) |
||||
|
{ |
||||
|
setPixel(pt1.x,pt1.y,color1); |
||||
|
} |
||||
|
|
||||
|
if (fabs(xOffset) > fabs(yOffset)) |
||||
|
{ |
||||
|
float xMin; |
||||
|
float xMax; |
||||
|
if (pt1.x < pt2.x) |
||||
|
{ |
||||
|
xMin = pt1.x; |
||||
|
xMax = pt2.x; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xMin = pt2.x; |
||||
|
xMax = pt1.x; |
||||
|
} |
||||
|
|
||||
|
float lenth = xMax - xMin; |
||||
|
float slope = yOffset / xOffset; |
||||
|
for (float x = xMin; x <= xMax ; x += 1.0f) |
||||
|
{ |
||||
|
float y = pt1.y + (x - pt1.x) * slope; |
||||
|
float scaler = (x - xMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
float yMin; |
||||
|
float yMax; |
||||
|
if (pt1.y < pt2.y) |
||||
|
{ |
||||
|
yMin = pt1.y; |
||||
|
yMax = pt2.y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
yMin = pt2.y; |
||||
|
yMax = pt1.y; |
||||
|
} |
||||
|
|
||||
|
float lenth = yMax - yMin; |
||||
|
float slope = xOffset / yOffset; |
||||
|
for (float y = yMin; y <= yMax ; y += 1.0f) |
||||
|
{ |
||||
|
float x = pt1.x + (y - pt1.y) * slope; |
||||
|
float scaler = (y - yMin)/lenth; |
||||
|
Rgba color = colorLerp(color1,color2,scaler); |
||||
|
setPixel(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawArrays( DRAWMODE mode,const float2* points,int count ) |
||||
|
{ |
||||
|
switch (mode) |
||||
|
{ |
||||
|
case DM_POINTS: |
||||
|
{ |
||||
|
for (int i = 0 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawPoints(points[i],_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINES: |
||||
|
{ |
||||
|
count = count/2 * 2; |
||||
|
for (int i = 0 ;i < count ; i += 2) |
||||
|
{ |
||||
|
drawLine(points[i],points[i + 1],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_LOOP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
drawLine(points[0],points[count - 1],_color,_color); |
||||
|
} |
||||
|
break; |
||||
|
case DM_LINE_STRIP: |
||||
|
{ |
||||
|
drawLine(points[0],points[1],_color,_color); |
||||
|
for (int i = 2 ;i < count ; ++ i) |
||||
|
{ |
||||
|
drawLine(points[i - 1],points[i],_color,_color); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawFilleRect( int startX,int startY,int w,int h ) |
||||
|
{ |
||||
|
int left = tmax<int>(startX,0); |
||||
|
int top = tmax<int>(startY,0); |
||||
|
|
||||
|
int right = tmin<int>(startX + w,_width); |
||||
|
int bottom = tmin<int>(startY + h,_height); |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
setPixelEx(x,y,_color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Raster::drawRect( const int2* points,const Rgba* colors ) |
||||
|
{ |
||||
|
int left = tmax<int>(points[0].x,0); |
||||
|
int top = tmax<int>(points[0].y,0); |
||||
|
|
||||
|
int right = tmin<int>(points[2].x,_width); |
||||
|
int bottom = tmin<int>(points[2].y,_height); |
||||
|
|
||||
|
float w = right - left; |
||||
|
float h = bottom - top; |
||||
|
|
||||
|
for (int x = left ; x < right ; ++ x) |
||||
|
{ |
||||
|
Rgba color1 = colorLerp(colors[0],colors[1],(x - left)/w); |
||||
|
Rgba color2 = colorLerp(colors[3],colors[2],(x - left)/w); |
||||
|
|
||||
|
for (int y = top ; y < bottom ; ++ y) |
||||
|
{ |
||||
|
Rgba color = colorLerp(color1,color2,(y - top)/h); |
||||
|
setPixelEx(x,y,color); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,232 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "CELLMath.hpp" |
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
enum DRAWMODE |
||||
|
{ |
||||
|
DM_POINTS = 0, |
||||
|
DM_LINES = 1, |
||||
|
DM_LINE_LOOP = 2, |
||||
|
DM_LINE_STRIP = 3, |
||||
|
}; |
||||
|
|
||||
|
class Span |
||||
|
{ |
||||
|
public: |
||||
|
int _xStart; |
||||
|
int _xEnd; |
||||
|
Rgba _colorStart; |
||||
|
Rgba _colorEnd; |
||||
|
int _y; |
||||
|
|
||||
|
public: |
||||
|
Span(int xStart,int xEnd,int y,Rgba colorStart,Rgba colorEnd) |
||||
|
{ |
||||
|
if (xStart < xEnd) |
||||
|
{ |
||||
|
_xStart = xStart; |
||||
|
_xEnd = xEnd; |
||||
|
_colorStart = colorStart; |
||||
|
_colorEnd = colorEnd; |
||||
|
_y = y; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_xStart = _xEnd; |
||||
|
_xEnd = _xStart; |
||||
|
|
||||
|
_colorStart = colorEnd; |
||||
|
_colorEnd = colorStart; |
||||
|
_y = y; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
class Ege |
||||
|
{ |
||||
|
public: |
||||
|
int _x1; |
||||
|
int _y1; |
||||
|
Rgba _color1; |
||||
|
|
||||
|
int _x2; |
||||
|
int _y2; |
||||
|
Rgba _color2; |
||||
|
|
||||
|
Ege(int x1,int y1,Rgba color1,int x2,int y2,Rgba color2) |
||||
|
{ |
||||
|
if (y1 < y2) |
||||
|
{ |
||||
|
_x1 = x1; |
||||
|
_y1 = y1; |
||||
|
_color1 = color1; |
||||
|
|
||||
|
_x2 = x2; |
||||
|
_y2 = y2; |
||||
|
_color2 = color2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_x1 = x2; |
||||
|
_y1 = y2; |
||||
|
_color1 = color2; |
||||
|
|
||||
|
_x2 = x1; |
||||
|
_y2 = y1; |
||||
|
_color2 = color1; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
class Raster |
||||
|
{ |
||||
|
public: |
||||
|
uint* _buffer; |
||||
|
int _width; |
||||
|
int _height; |
||||
|
Rgba _color; |
||||
|
public: |
||||
|
Raster(int w,int h,void* buffer); |
||||
|
~Raster(void); |
||||
|
|
||||
|
void clear(); |
||||
|
|
||||
|
void drawPoint(int x,int y, Rgba color,int ptSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void drawArrays(DRAWMODE mode,const float2* points,int count); |
||||
|
|
||||
|
void drawFilleRect(int startX,int startY,int w,int h); |
||||
|
|
||||
|
void drawRect(const int2* points,const Rgba* colors); |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
bool isInRect(int2 pt) |
||||
|
{ |
||||
|
if (pt.x >= 0 && pt.x <= _width && pt.y >= 0 && pt.y <= _height) |
||||
|
{ |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
void drawTriangle(int2 p0,int2 p1,int2 p2,Rgba c0,Rgba c1,Rgba c2) |
||||
|
{ |
||||
|
// if ((!isInRect(p0)) && (!isInRect(p1)) && (!isInRect(p2))) |
||||
|
// { |
||||
|
// return; |
||||
|
// } |
||||
|
Ege eges[3] = |
||||
|
{ |
||||
|
Ege(p0.x,p0.y,c0, p1.x,p1.y,c1), |
||||
|
Ege(p1.x,p1.y,c1, p2.x,p2.y,c2), |
||||
|
Ege(p2.x,p2.y,c2, p0.x,p0.y,c0), |
||||
|
}; |
||||
|
int iMax = 0; |
||||
|
int length = eges[0]._y2 - eges[0]._y1; |
||||
|
|
||||
|
for (int i = 1 ;i < 3 ; ++ i) |
||||
|
{ |
||||
|
int len = eges[i]._y2 - eges[i]._y1; |
||||
|
if (len > length) |
||||
|
{ |
||||
|
length = len; |
||||
|
iMax = i; |
||||
|
} |
||||
|
} |
||||
|
int iShort1 = (iMax + 1)%3; |
||||
|
int iShort2 = (iMax + 2)%3; |
||||
|
|
||||
|
drawEge(eges[iMax],eges[iShort1]); |
||||
|
drawEge(eges[iMax],eges[iShort2]); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void drawEge(const Ege& e1,const Ege& e2) |
||||
|
{ |
||||
|
float yOffset1 = e1._y2 - e1._y1; |
||||
|
if (yOffset1 == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
float yOffset = e2._y2 - e2._y1; |
||||
|
if (yOffset == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
float xOffset = e2._x2 - e2._x1; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/yOffset; |
||||
|
int startY = tmax<int>(e2._y1,0); |
||||
|
int endY = tmin<int>(e2._y2,_height); |
||||
|
scale += (startY - e2._y1)/yOffset; |
||||
|
|
||||
|
|
||||
|
float xOffset1 = e1._x2 - e1._x1; |
||||
|
float scale1 = (float)(e2._y1 - e1._y1)/yOffset1; |
||||
|
float step1 = 1.0f/yOffset1; |
||||
|
|
||||
|
int startY1 = tmax<int>(e1._y1,0); |
||||
|
int endY1 = tmin<int>(e1._y2,_height); |
||||
|
scale1 += (startY1 - e1._y1)/yOffset1; |
||||
|
|
||||
|
for (int y = startY ; y < endY ; ++ y) |
||||
|
{ |
||||
|
int x1 = e1._x1 + (int)(scale1 * xOffset1); |
||||
|
int x2 = e2._x1 + (int)(scale * xOffset); |
||||
|
Rgba color2 = colorLerp(e2._color1,e2._color2,scale); |
||||
|
Rgba color1 = colorLerp(e1._color1,e1._color2,scale1); |
||||
|
|
||||
|
Span span(x1,x2,y,color1,color2); |
||||
|
drawSpan(span); |
||||
|
|
||||
|
scale += step; |
||||
|
scale1 += step1; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void drawSpan(const Span& span) |
||||
|
{ |
||||
|
float length = span._xEnd - span._xStart; |
||||
|
float scale = 0; |
||||
|
float step = 1.0f/length; |
||||
|
int startX = tmax<int>(span._xStart,0); |
||||
|
int endX = tmin<int>(span._xEnd,_width); |
||||
|
scale += (startX - span._xStart)/length; |
||||
|
for (int x = startX ; x < endX; ++ x) |
||||
|
{ |
||||
|
Rgba color = colorLerp( |
||||
|
span._colorStart |
||||
|
,span._colorEnd |
||||
|
,scale |
||||
|
); |
||||
|
scale += step; |
||||
|
|
||||
|
setPixelEx(x,span._y,color); |
||||
|
} |
||||
|
} |
||||
|
void drawLine(float2 pt1,float2 pt2,Rgba color1,Rgba color2); |
||||
|
|
||||
|
void drawPoints(float2 pt1,Rgba4Byte color) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
inline void setPixelEx(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
|
||||
|
inline void setPixel(unsigned x,unsigned y,Rgba color) |
||||
|
{ |
||||
|
if (x >= _width || y >= _height) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
_buffer[y * _width + x] = color._color; |
||||
|
} |
||||
|
}; |
||||
|
} |
@ -0,0 +1,142 @@ |
|||||
|
#include <windows.h>
|
||||
|
#include <tchar.h>
|
||||
|
|
||||
|
#include "Raster.h"
|
||||
|
|
||||
|
#include "CELLTimestamp.hpp"
|
||||
|
|
||||
|
|
||||
|
|
||||
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
|
{ |
||||
|
switch(msg) |
||||
|
{ |
||||
|
case WM_SIZE: |
||||
|
break; |
||||
|
case WM_CLOSE: |
||||
|
case WM_DESTROY: |
||||
|
PostQuitMessage(0); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return DefWindowProc( hWnd, msg, wParam, lParam ); |
||||
|
} |
||||
|
|
||||
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) |
||||
|
{ |
||||
|
// 1 ×¢²á´°¿ÚÀà
|
||||
|
::WNDCLASSEXA winClass; |
||||
|
winClass.lpszClassName = "Raster"; |
||||
|
winClass.cbSize = sizeof(::WNDCLASSEX); |
||||
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; |
||||
|
winClass.lpfnWndProc = windowProc; |
||||
|
winClass.hInstance = hInstance; |
||||
|
winClass.hIcon = 0; |
||||
|
winClass.hIconSm = 0; |
||||
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
||||
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH); |
||||
|
winClass.lpszMenuName = NULL; |
||||
|
winClass.cbClsExtra = 0; |
||||
|
winClass.cbWndExtra = 0; |
||||
|
RegisterClassExA(&winClass); |
||||
|
|
||||
|
// 2 ´´½¨´°¿Ú
|
||||
|
HWND hWnd = CreateWindowExA( |
||||
|
NULL, |
||||
|
"Raster", |
||||
|
"Raster", |
||||
|
WS_OVERLAPPEDWINDOW, |
||||
|
0, |
||||
|
0, |
||||
|
480, |
||||
|
320, |
||||
|
0, |
||||
|
0, |
||||
|
hInstance, |
||||
|
0 |
||||
|
); |
||||
|
|
||||
|
UpdateWindow( hWnd ); |
||||
|
ShowWindow(hWnd,SW_SHOW); |
||||
|
|
||||
|
RECT rt = {0}; |
||||
|
GetClientRect(hWnd,&rt); |
||||
|
|
||||
|
int width = rt.right - rt.left; |
||||
|
int height = rt.bottom - rt.top; |
||||
|
void* buffer = 0; |
||||
|
|
||||
|
HDC hDC = GetDC(hWnd); |
||||
|
HDC hMem = ::CreateCompatibleDC(hDC); |
||||
|
|
||||
|
BITMAPINFO bmpInfor; |
||||
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
||||
|
bmpInfor.bmiHeader.biWidth = width; |
||||
|
bmpInfor.bmiHeader.biHeight = -height; |
||||
|
bmpInfor.bmiHeader.biPlanes = 1; |
||||
|
bmpInfor.bmiHeader.biBitCount = 32; |
||||
|
bmpInfor.bmiHeader.biCompression = BI_RGB; |
||||
|
bmpInfor.bmiHeader.biSizeImage = 0; |
||||
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0; |
||||
|
bmpInfor.bmiHeader.biClrUsed = 0; |
||||
|
bmpInfor.bmiHeader.biClrImportant = 0; |
||||
|
|
||||
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0); |
||||
|
SelectObject(hMem,hBmp); |
||||
|
|
||||
|
|
||||
|
CELL::Raster raster(width,height,buffer); |
||||
|
|
||||
|
|
||||
|
MSG msg = {0}; |
||||
|
while(true) |
||||
|
{ |
||||
|
if (msg.message == WM_DESTROY |
||||
|
||msg.message == WM_CLOSE |
||||
|
||msg.message == WM_QUIT) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) |
||||
|
{ |
||||
|
TranslateMessage( &msg ); |
||||
|
DispatchMessage( &msg ); |
||||
|
} |
||||
|
raster.clear(); |
||||
|
|
||||
|
CELL::int2 pt[3] = |
||||
|
{ |
||||
|
CELL::int2(230,-80), |
||||
|
CELL::int2(10,280), |
||||
|
CELL::int2(600,280), |
||||
|
}; |
||||
|
|
||||
|
CELL::Rgba color1(255,0,0); |
||||
|
CELL::Rgba color2(0,255,0); |
||||
|
CELL::Rgba color3(0,0,255); |
||||
|
|
||||
|
CELL::CELLTimestamp tms; |
||||
|
|
||||
|
tms.update(); |
||||
|
|
||||
|
raster.drawTriangle(pt[0],pt[1],pt[2],color1,color2,color3); |
||||
|
|
||||
|
|
||||
|
|
||||
|
double mis = tms.getElapsedTimeInMicroSec(); |
||||
|
|
||||
|
char szBuf[128]; |
||||
|
sprintf(szBuf,"%f ",mis); |
||||
|
int i = 00; |
||||
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba)); |
||||
|
|
||||
|
TextOut(hMem,10,10,szBuf,strlen(szBuf)); |
||||
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
@ -0,0 +1,211 @@ |
|||||
|
<?xml version="1.0" encoding="gb2312"?> |
||||
|
<VisualStudioProject |
||||
|
ProjectType="Visual C++" |
||||
|
Version="9.00" |
||||
|
Name="lesson020-优化4" |
||||
|
ProjectGUID="{4880A4A6-8888-4A22-910F-F65223B5C020}" |
||||
|
RootNamespace="lesson020-优化4" |
||||
|
Keyword="Win32Proj" |
||||
|
TargetFrameworkVersion="196613" |
||||
|
> |
||||
|
<Platforms> |
||||
|
<Platform |
||||
|
Name="Win32" |
||||
|
/> |
||||
|
</Platforms> |
||||
|
<ToolFiles> |
||||
|
</ToolFiles> |
||||
|
<Configurations> |
||||
|
<Configuration |
||||
|
Name="Debug|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="0" |
||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" |
||||
|
MinimalRebuild="true" |
||||
|
BasicRuntimeChecks="3" |
||||
|
RuntimeLibrary="3" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="4" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="2" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
<Configuration |
||||
|
Name="Release|Win32" |
||||
|
OutputDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
IntermediateDirectory="../../temp/$(ConfigurationName)/$(ProjectName)" |
||||
|
ConfigurationType="1" |
||||
|
CharacterSet="2" |
||||
|
WholeProgramOptimization="1" |
||||
|
> |
||||
|
<Tool |
||||
|
Name="VCPreBuildEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCustomBuildTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXMLDataGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCWebServiceProxyGeneratorTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCMIDLTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCCLCompilerTool" |
||||
|
Optimization="2" |
||||
|
EnableIntrinsicFunctions="true" |
||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
||||
|
RuntimeLibrary="0" |
||||
|
EnableFunctionLevelLinking="true" |
||||
|
EnableEnhancedInstructionSet="0" |
||||
|
FloatingPointModel="0" |
||||
|
UsePrecompiledHeader="0" |
||||
|
WarningLevel="3" |
||||
|
DebugInformationFormat="3" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManagedResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCResourceCompilerTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPreLinkEventTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCLinkerTool" |
||||
|
AdditionalDependencies="FreeImage.lib" |
||||
|
OutputFile="../../bin/$(ConfigurationName)/$(ProjectName).exe" |
||||
|
LinkIncremental="1" |
||||
|
AdditionalLibraryDirectories="../../dependencies" |
||||
|
GenerateDebugInformation="true" |
||||
|
SubSystem="2" |
||||
|
OptimizeReferences="2" |
||||
|
EnableCOMDATFolding="2" |
||||
|
TargetMachine="1" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCALinkTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCManifestTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCXDCMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCBscMakeTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCFxCopTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCAppVerifierTool" |
||||
|
/> |
||||
|
<Tool |
||||
|
Name="VCPostBuildEventTool" |
||||
|
/> |
||||
|
</Configuration> |
||||
|
</Configurations> |
||||
|
<References> |
||||
|
</References> |
||||
|
<Files> |
||||
|
<Filter |
||||
|
Name="源文件" |
||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" |
||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\lesson019.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="头文件" |
||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd" |
||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
||||
|
> |
||||
|
<File |
||||
|
RelativePath=".\CELLMath.hpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.cpp" |
||||
|
> |
||||
|
</File> |
||||
|
<File |
||||
|
RelativePath=".\Raster.h" |
||||
|
> |
||||
|
</File> |
||||
|
</Filter> |
||||
|
<Filter |
||||
|
Name="资源文件" |
||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
||||
|
> |
||||
|
</Filter> |
||||
|
</Files> |
||||
|
<Globals> |
||||
|
</Globals> |
||||
|
</VisualStudioProject> |
5938
example/lesson200-drawImage/CELLMath.hpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,53 @@ |
|||||
|
#pragma once
|
||||
|
|
||||
|
#include <windows.h>
|
||||
|
|
||||
|
namespace CELL |
||||
|
{ |
||||
|
class CELLTimestamp |
||||
|
{ |
||||
|
public: |
||||
|
CELLTimestamp() |
||||
|
{ |
||||
|
QueryPerformanceFrequency(&_frequency); |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
~CELLTimestamp() |
||||
|
{} |
||||
|
|
||||
|
void update() |
||||
|
{ |
||||
|
QueryPerformanceCounter(&_startCount); |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡µ±Ç°Ãë |
||||
|
*/ |
||||
|
double getElapsedSecond() |
||||
|
{ |
||||
|
return getElapsedTimeInMicroSec() * 0.000001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñÈ¡ºÁÃë |
||||
|
*/ |
||||
|
double getElapsedTimeInMilliSec() |
||||
|
{ |
||||
|
return this->getElapsedTimeInMicroSec() * 0.001; |
||||
|
} |
||||
|
/**
|
||||
|
* »ñȡ΢Ãî |
||||
|
*/ |
||||
|
double getElapsedTimeInMicroSec() |
||||
|
{ |
||||
|
LARGE_INTEGER endCount; |
||||
|
QueryPerformanceCounter(&endCount); |
||||
|
|
||||
|
double startTimeInMicroSec = _startCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / _frequency.QuadPart); |
||||
|
|
||||
|
return endTimeInMicroSec - startTimeInMicroSec; |
||||
|
} |
||||
|
protected: |
||||
|
LARGE_INTEGER _frequency; |
||||
|
LARGE_INTEGER _startCount; |
||||
|
}; |
||||
|
} |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue