18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2007 Apple Inc. All rights reserved.
35af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "config.h"
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSHTMLCanvasElement.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "CanvasContextAttributes.h"
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLCanvasElement.h"
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSCanvasRenderingContext2D.h"
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEBGL)
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "JSWebGLRenderingContext.h"
35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "WebGLContextAttributes.h"
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/GetPtr.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace JSC;
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSHTMLCanvasElement::markChildren(MarkStack& markStack)
44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Base::markChildren(markStack);
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl());
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSGlobalData& globalData = *Heap::heap(this)->globalData();
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    markDOMObjectWrapper(markStack, globalData, canvas->renderingContext());
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
535af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSHTMLCanvasElement::getContext(ExecState* exec)
54d0825bca7fe65beaee391d30da42e937db621564Steve Block{
55d0825bca7fe65beaee391d30da42e937db621564Steve Block    HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl());
565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    const UString& contextId = exec->argument(0).toString(exec);
57d0825bca7fe65beaee391d30da42e937db621564Steve Block    RefPtr<CanvasContextAttributes> attrs;
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEBGL)
59d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (contextId == "experimental-webgl" || contextId == "webkit-3d") {
60d0825bca7fe65beaee391d30da42e937db621564Steve Block        attrs = WebGLContextAttributes::create();
61d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebGLContextAttributes* webGLAttrs = static_cast<WebGLContextAttributes*>(attrs.get());
625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (exec->argumentCount() > 1 && exec->argument(1).isObject()) {
635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            JSObject* jsAttrs = exec->argument(1).getObject();
64d0825bca7fe65beaee391d30da42e937db621564Steve Block            Identifier alpha(exec, "alpha");
65d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (jsAttrs->hasProperty(exec, alpha))
66d0825bca7fe65beaee391d30da42e937db621564Steve Block                webGLAttrs->setAlpha(jsAttrs->get(exec, alpha).toBoolean(exec));
67d0825bca7fe65beaee391d30da42e937db621564Steve Block            Identifier depth(exec, "depth");
68d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (jsAttrs->hasProperty(exec, depth))
69d0825bca7fe65beaee391d30da42e937db621564Steve Block                webGLAttrs->setDepth(jsAttrs->get(exec, depth).toBoolean(exec));
70d0825bca7fe65beaee391d30da42e937db621564Steve Block            Identifier stencil(exec, "stencil");
71d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (jsAttrs->hasProperty(exec, stencil))
72d0825bca7fe65beaee391d30da42e937db621564Steve Block                webGLAttrs->setStencil(jsAttrs->get(exec, stencil).toBoolean(exec));
73d0825bca7fe65beaee391d30da42e937db621564Steve Block            Identifier antialias(exec, "antialias");
74d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (jsAttrs->hasProperty(exec, antialias))
75d0825bca7fe65beaee391d30da42e937db621564Steve Block                webGLAttrs->setAntialias(jsAttrs->get(exec, antialias).toBoolean(exec));
76d0825bca7fe65beaee391d30da42e937db621564Steve Block            Identifier premultipliedAlpha(exec, "premultipliedAlpha");
77d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (jsAttrs->hasProperty(exec, premultipliedAlpha))
78d0825bca7fe65beaee391d30da42e937db621564Steve Block                webGLAttrs->setPremultipliedAlpha(jsAttrs->get(exec, premultipliedAlpha).toBoolean(exec));
792bde8e466a4451c7319e3a072d118917957d6554Steve Block            Identifier preserveDrawingBuffer(exec, "preserveDrawingBuffer");
802bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (jsAttrs->hasProperty(exec, preserveDrawingBuffer))
812bde8e466a4451c7319e3a072d118917957d6554Steve Block                webGLAttrs->setPreserveDrawingBuffer(jsAttrs->get(exec, preserveDrawingBuffer).toBoolean(exec));
82d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
83d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
84d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    CanvasRenderingContext* context = canvas->getContext(ustringToString(contextId), attrs.get());
866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!context)
876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return jsNull();
886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return toJS(exec, globalObject(), WTF::getPtr(context));
89d0825bca7fe65beaee391d30da42e937db621564Steve Block}
90d0825bca7fe65beaee391d30da42e937db621564Steve Block
915af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSHTMLCanvasElement::toDataURL(ExecState* exec)
925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    const String& type = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0));
94545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl());
95545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ExceptionCode ec = 0;
96545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    JSC::JSValue result;
98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    double quality;
99545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    double* qualityPtr = 0;
1005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (exec->argumentCount() > 1) {
1015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue v = exec->argument(1);
102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (v.isNumber()) {
1035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            quality = v.toNumber(exec);
104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            qualityPtr = &quality;
105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
107545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
108545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    result = jsString(exec, canvas->toDataURL(type, qualityPtr, ec));
1095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    setDOMException(exec, ec);
1105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    return result;
1115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
1125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // namespace WebCore
114