128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu/* Copyright (C) 2010 Apple Inc. All rights reserved.
228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Redistribution and use in source and binary forms, with or without
428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * modification, are permitted provided that the following conditions
528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * are met:
628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 1. Redistributions of source code must retain the above copyright
728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    notice, this list of conditions and the following disclaimer.
828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 2. Redistributions in binary form must reproduce the above copyright
928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    notice, this list of conditions and the following disclaimer in the
1028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    documentation and/or other materials provided with the distribution.
1128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
1228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THE POSSIBILITY OF SUCH DAMAGE.
2328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu */
2428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "WindowedPluginTest.h"
2628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "PluginObject.h"
2828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuusing namespace std;
3028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu// Just fills its window with some gradients
3228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass DrawsGradient : public WindowedPluginTest {
3428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhupublic:
3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    DrawsGradient(NPP, const string& identifier);
3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuprivate:
3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void paint(HDC) const;
3928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    LRESULT onPaint(WPARAM, LPARAM, bool& handled);
4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    LRESULT onPrintClient(WPARAM, LPARAM, bool& handled);
4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    virtual LRESULT wndProc(UINT message, WPARAM, LPARAM, bool& handled);
4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu};
4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhustatic PluginTest::Register<DrawsGradient> registrar("draws-gradient");
4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuDrawsGradient::DrawsGradient(NPP npp, const string& identifier)
4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    : WindowedPluginTest(npp, identifier)
5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuLRESULT DrawsGradient::wndProc(UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    LRESULT result = 0;
5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    switch (message) {
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case WM_PAINT:
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        result = onPaint(wParam, lParam, handled);
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        break;
6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case WM_PRINTCLIENT:
6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        result = onPrintClient(wParam, lParam, handled);
6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        break;
6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    default:
6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        handled = false;
6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
6728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return result;
6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuLRESULT DrawsGradient::onPaint(WPARAM, LPARAM, bool& handled)
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    PAINTSTRUCT paintStruct;
7428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    HDC dc = ::BeginPaint(window(), &paintStruct);
7528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!dc)
7628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return 0;
7728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
7828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    paint(dc);
7928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    ::EndPaint(window(), &paintStruct);
8028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
8128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    handled = true;
8228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return 0;
8328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
8428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
8528040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuLRESULT DrawsGradient::onPrintClient(WPARAM wParam, LPARAM, bool& handled)
8628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
8728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    paint(reinterpret_cast<HDC>(wParam));
8828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
8928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    handled = true;
9028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return 0;
9128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
9228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
9328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid DrawsGradient::paint(HDC dc) const
9428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
9528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    RECT clientRect;
9628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!::GetClientRect(window(), &clientRect))
9728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return;
9828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
9928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    TRIVERTEX vertices[] = {
10028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // Upper-left: green
10128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        { clientRect.left, clientRect.top, 0, 0xff00, 0, 0 },
10228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // Upper-right: blue
10328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        { clientRect.right, clientRect.top, 0, 0, 0xff00, 0 },
10428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // Lower-left: yellow
10528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        { clientRect.left, clientRect.bottom, 0xff00, 0xff00, 0, 0 },
10628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // Lower-right: red
10728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        { clientRect.right, clientRect.bottom, 0xff00, 0, 0, 0 },
10828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    };
10928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
11028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    GRADIENT_TRIANGLE mesh[] = {
11128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // Upper-left triangle
11228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        { 0, 1, 2 },
11328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // Lower-right triangle
11428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        { 1, 2, 3 },
11528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    };
11628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
11728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    ::GradientFill(dc, vertices, _countof(vertices), mesh, _countof(mesh), GRADIENT_FILL_TRIANGLE);
11828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
119