1 /* Copyright (C) 2010 Apple Inc. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 * 1. Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * 2. Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 *
12 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
13 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
14 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
15 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
16 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
22 * THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25 #include "WindowedPluginTest.h"
26
27 #include "PluginObject.h"
28
29 using namespace std;
30
31 // Just fills its window with some gradients
32
33 class DrawsGradient : public WindowedPluginTest {
34 public:
35 DrawsGradient(NPP, const string& identifier);
36
37 private:
38 void paint(HDC) const;
39
40 LRESULT onPaint(WPARAM, LPARAM, bool& handled);
41 LRESULT onPrintClient(WPARAM, LPARAM, bool& handled);
42
43 virtual LRESULT wndProc(UINT message, WPARAM, LPARAM, bool& handled);
44 };
45
46 static PluginTest::Register<DrawsGradient> registrar("draws-gradient");
47
DrawsGradient(NPP npp,const string & identifier)48 DrawsGradient::DrawsGradient(NPP npp, const string& identifier)
49 : WindowedPluginTest(npp, identifier)
50 {
51 }
52
wndProc(UINT message,WPARAM wParam,LPARAM lParam,bool & handled)53 LRESULT DrawsGradient::wndProc(UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
54 {
55 LRESULT result = 0;
56
57 switch (message) {
58 case WM_PAINT:
59 result = onPaint(wParam, lParam, handled);
60 break;
61 case WM_PRINTCLIENT:
62 result = onPrintClient(wParam, lParam, handled);
63 break;
64 default:
65 handled = false;
66 }
67
68 return result;
69 }
70
onPaint(WPARAM,LPARAM,bool & handled)71 LRESULT DrawsGradient::onPaint(WPARAM, LPARAM, bool& handled)
72 {
73 PAINTSTRUCT paintStruct;
74 HDC dc = ::BeginPaint(window(), &paintStruct);
75 if (!dc)
76 return 0;
77
78 paint(dc);
79 ::EndPaint(window(), &paintStruct);
80
81 handled = true;
82 return 0;
83 }
84
onPrintClient(WPARAM wParam,LPARAM,bool & handled)85 LRESULT DrawsGradient::onPrintClient(WPARAM wParam, LPARAM, bool& handled)
86 {
87 paint(reinterpret_cast<HDC>(wParam));
88
89 handled = true;
90 return 0;
91 }
92
paint(HDC dc) const93 void DrawsGradient::paint(HDC dc) const
94 {
95 RECT clientRect;
96 if (!::GetClientRect(window(), &clientRect))
97 return;
98
99 TRIVERTEX vertices[] = {
100 // Upper-left: green
101 { clientRect.left, clientRect.top, 0, 0xff00, 0, 0 },
102 // Upper-right: blue
103 { clientRect.right, clientRect.top, 0, 0, 0xff00, 0 },
104 // Lower-left: yellow
105 { clientRect.left, clientRect.bottom, 0xff00, 0xff00, 0, 0 },
106 // Lower-right: red
107 { clientRect.right, clientRect.bottom, 0xff00, 0, 0, 0 },
108 };
109
110 GRADIENT_TRIANGLE mesh[] = {
111 // Upper-left triangle
112 { 0, 1, 2 },
113 // Lower-right triangle
114 { 1, 2, 3 },
115 };
116
117 ::GradientFill(dc, vertices, _countof(vertices), mesh, _countof(mesh), GRADIENT_FILL_TRIANGLE);
118 }
119