From fbe47c0ef0653d75af9e45038f453ba84b27f6fe Mon Sep 17 00:00:00 2001 From: Grace Kloba Date: Thu, 14 May 2009 17:31:45 -0700 Subject: [PATCH] Move browser test plugin from webkit project to development project. --- samples/SampleBrowserPlugin/Android.mk | 36 ++ .../SampleBrowserPlugin/AndroidManifest.xml | 35 ++ .../MODULE_LICENSE_APACHE2 | 0 samples/SampleBrowserPlugin/NOTICE | 190 ++++++++ samples/SampleBrowserPlugin/jni/Android.mk | 50 ++ .../SampleBrowserPlugin/jni/PluginObject.cpp | 178 +++++++ .../SampleBrowserPlugin/jni/PluginObject.h | 70 +++ samples/SampleBrowserPlugin/jni/main.cpp | 435 ++++++++++++++++++ samples/SampleBrowserPlugin/jni/main.h | 30 ++ .../jni/pluginGraphics.cpp | 210 +++++++++ .../SampleBrowserPlugin/jni/pluginGraphics.h | 40 ++ .../res/drawable/sample_browser_plugin.png | Bin 0 -> 3610 bytes .../res/values/strings.xml | 19 + .../android/sampleplugin/SamplePlugin.java | 15 + 14 files changed, 1308 insertions(+) create mode 100644 samples/SampleBrowserPlugin/Android.mk create mode 100644 samples/SampleBrowserPlugin/AndroidManifest.xml create mode 100644 samples/SampleBrowserPlugin/MODULE_LICENSE_APACHE2 create mode 100644 samples/SampleBrowserPlugin/NOTICE create mode 100644 samples/SampleBrowserPlugin/jni/Android.mk create mode 100644 samples/SampleBrowserPlugin/jni/PluginObject.cpp create mode 100644 samples/SampleBrowserPlugin/jni/PluginObject.h create mode 100644 samples/SampleBrowserPlugin/jni/main.cpp create mode 100644 samples/SampleBrowserPlugin/jni/main.h create mode 100644 samples/SampleBrowserPlugin/jni/pluginGraphics.cpp create mode 100644 samples/SampleBrowserPlugin/jni/pluginGraphics.h create mode 100755 samples/SampleBrowserPlugin/res/drawable/sample_browser_plugin.png create mode 100644 samples/SampleBrowserPlugin/res/values/strings.xml create mode 100644 samples/SampleBrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java diff --git a/samples/SampleBrowserPlugin/Android.mk b/samples/SampleBrowserPlugin/Android.mk new file mode 100644 index 000000000..16047d595 --- /dev/null +++ b/samples/SampleBrowserPlugin/Android.mk @@ -0,0 +1,36 @@ +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +TOP_LOCAL_PATH:= $(call my-dir) + +# Build application + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_PACKAGE_NAME := SampleBrowserPlugin + +LOCAL_JNI_SHARED_LIBRARIES := libsampleplugin + +include $(BUILD_PACKAGE) + +# ============================================================ + +# Also build all of the sub-targets under this one: the shared library. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/samples/SampleBrowserPlugin/AndroidManifest.xml b/samples/SampleBrowserPlugin/AndroidManifest.xml new file mode 100644 index 000000000..ae6b5dbe7 --- /dev/null +++ b/samples/SampleBrowserPlugin/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + diff --git a/samples/SampleBrowserPlugin/MODULE_LICENSE_APACHE2 b/samples/SampleBrowserPlugin/MODULE_LICENSE_APACHE2 new file mode 100644 index 000000000..e69de29bb diff --git a/samples/SampleBrowserPlugin/NOTICE b/samples/SampleBrowserPlugin/NOTICE new file mode 100644 index 000000000..c5b1efa7a --- /dev/null +++ b/samples/SampleBrowserPlugin/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/samples/SampleBrowserPlugin/jni/Android.mk b/samples/SampleBrowserPlugin/jni/Android.mk new file mode 100644 index 000000000..6d997377b --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/Android.mk @@ -0,0 +1,50 @@ +## +## +## Copyright 2008, The Android Open Source Project +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions +## are met: +## * Redistributions of source code must retain the above copyright +## notice, this list of conditions and the following disclaimer. +## * Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +## EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +## PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +## PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +## OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + main.cpp \ + PluginObject.cpp \ + pluginGraphics.cpp + +LOCAL_C_INCLUDES += \ + $(LOCAL_PATH) \ + external/webkit/WebCore/bridge \ + external/webkit/WebCore/plugins \ + external/webkit/WebCore/platform/android/JavaVM \ + external/webkit/WebKit/android/plugins + +LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) +LOCAL_CFLAGS += -fvisibility=hidden +LOCAL_PRELINK_MODULE:=false +LOCAL_MODULE_CLASS := SHARED_LIBRARIES + +LOCAL_MODULE:= libsampleplugin + +include $(BUILD_SHARED_LIBRARY) + diff --git a/samples/SampleBrowserPlugin/jni/PluginObject.cpp b/samples/SampleBrowserPlugin/jni/PluginObject.cpp new file mode 100644 index 000000000..5499072f9 --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/PluginObject.cpp @@ -0,0 +1,178 @@ +/* + IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in + consideration of your agreement to the following terms, and your use, installation, + modification or redistribution of this Apple software constitutes acceptance of these + terms. If you do not agree with these terms, please do not use, install, modify or + redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject to these + terms, Apple grants you a personal, non-exclusive license, under AppleÕs copyrights in + this original Apple software (the "Apple Software"), to use, reproduce, modify and + redistribute the Apple Software, with or without modifications, in source and/or binary + forms; provided that if you redistribute the Apple Software in its entirety and without + modifications, you must retain this notice and the following text and disclaimers in all + such redistributions of the Apple Software. Neither the name, trademarks, service marks + or logos of Apple Computer, Inc. may be used to endorse or promote products derived from + the Apple Software without specific prior written permission from Apple. Except as expressly + stated in this notice, no other rights or licenses, express or implied, are granted by Apple + herein, including but not limited to any patent rights that may be infringed by your + derivative works or by other works in which the Apple Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, + EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS + USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, + REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND + WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR + OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "main.h" +#include "PluginObject.h" + +static void pluginInvalidate(NPObject *obj); +static bool pluginHasProperty(NPObject *obj, NPIdentifier name); +static bool pluginHasMethod(NPObject *obj, NPIdentifier name); +static bool pluginGetProperty(NPObject *obj, NPIdentifier name, NPVariant *variant); +static bool pluginSetProperty(NPObject *obj, NPIdentifier name, const NPVariant *variant); +static bool pluginInvoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); +static bool pluginInvokeDefault(NPObject *obj, const NPVariant *args, uint32_t argCount, NPVariant *result); +static NPObject *pluginAllocate(NPP npp, NPClass *theClass); +static void pluginDeallocate(NPObject *obj); +static bool pluginRemoveProperty(NPObject *npobj, NPIdentifier name); +static bool pluginEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); + + + +static NPClass pluginClass = { + NP_CLASS_STRUCT_VERSION, + pluginAllocate, + pluginDeallocate, + pluginInvalidate, + pluginHasMethod, + pluginInvoke, + pluginInvokeDefault, + pluginHasProperty, + pluginGetProperty, + pluginSetProperty, + pluginRemoveProperty, + pluginEnumerate +}; + +NPClass *getPluginClass(void) +{ + return &pluginClass; +} + +static bool identifiersInitialized = false; + +#define ID_TESTFILE_PROPERTY 0 +#define NUM_PROPERTY_IDENTIFIERS 1 + +static NPIdentifier pluginPropertyIdentifiers[NUM_PROPERTY_IDENTIFIERS]; +static const NPUTF8 *pluginPropertyIdentifierNames[NUM_PROPERTY_IDENTIFIERS] = { + "testfile" +}; + +#define ID_GETTESTFILE_METHOD 0 +#define NUM_METHOD_IDENTIFIERS 1 + +static NPIdentifier pluginMethodIdentifiers[NUM_METHOD_IDENTIFIERS]; +static const NPUTF8 *pluginMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = { + "getTestFile" +}; + +static void initializeIdentifiers(void) +{ + browser->getstringidentifiers(pluginPropertyIdentifierNames, NUM_PROPERTY_IDENTIFIERS, pluginPropertyIdentifiers); + browser->getstringidentifiers(pluginMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, pluginMethodIdentifiers); +} + +static bool pluginHasProperty(NPObject *obj, NPIdentifier name) +{ + int i; + for (i = 0; i < NUM_PROPERTY_IDENTIFIERS; i++) + if (name == pluginPropertyIdentifiers[i]) + return true; + return false; +} + +static bool pluginHasMethod(NPObject *obj, NPIdentifier name) +{ + int i; + for (i = 0; i < NUM_METHOD_IDENTIFIERS; i++) + if (name == pluginMethodIdentifiers[i]) + return true; + return false; +} + +static bool pluginGetProperty(NPObject *obj, NPIdentifier name, NPVariant *variant) +{ + PluginObject *plugin = (PluginObject *)obj; + if (name == pluginPropertyIdentifiers[ID_TESTFILE_PROPERTY]) { + BOOLEAN_TO_NPVARIANT(true, *variant); + return true; + } + return false; +} + +static bool pluginSetProperty(NPObject *obj, NPIdentifier name, const NPVariant *variant) +{ + return false; +} + +static bool pluginInvoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) +{ + PluginObject *plugin = (PluginObject *)obj; + if (name == pluginMethodIdentifiers[ID_GETTESTFILE_METHOD]) { + return true; + } + return false; +} + +static bool pluginInvokeDefault(NPObject *obj, const NPVariant *args, uint32_t argCount, NPVariant *result) +{ + return false; +} + +static void pluginInvalidate(NPObject *obj) +{ + // Release any remaining references to JavaScript objects. +} + +static NPObject *pluginAllocate(NPP npp, NPClass *theClass) +{ + PluginObject *newInstance = (PluginObject*) malloc(sizeof(PluginObject)); + newInstance->header._class = theClass; + newInstance->header.referenceCount = 1; + + if (!identifiersInitialized) { + identifiersInitialized = true; + initializeIdentifiers(); + } + + newInstance->npp = npp; + + return &newInstance->header; +} + +static void pluginDeallocate(NPObject *obj) +{ + free(obj); +} + +static bool pluginRemoveProperty(NPObject *npobj, NPIdentifier name) +{ + return false; +} + +static bool pluginEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) +{ + return false; +} + diff --git a/samples/SampleBrowserPlugin/jni/PluginObject.h b/samples/SampleBrowserPlugin/jni/PluginObject.h new file mode 100644 index 000000000..ae8963d13 --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/PluginObject.h @@ -0,0 +1,70 @@ +/* + IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in + consideration of your agreement to the following terms, and your use, installation, + modification or redistribution of this Apple software constitutes acceptance of these + terms. If you do not agree with these terms, please do not use, install, modify or + redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject to these + terms, Apple grants you a personal, non-exclusive license, under AppleÕs copyrights in + this original Apple software (the "Apple Software"), to use, reproduce, modify and + redistribute the Apple Software, with or without modifications, in source and/or binary + forms; provided that if you redistribute the Apple Software in its entirety and without + modifications, you must retain this notice and the following text and disclaimers in all + such redistributions of the Apple Software. Neither the name, trademarks, service marks + or logos of Apple Computer, Inc. may be used to endorse or promote products derived from + the Apple Software without specific prior written permission from Apple. Except as expressly + stated in this notice, no other rights or licenses, express or implied, are granted by Apple + herein, including but not limited to any patent rights that may be infringed by your + derivative works or by other works in which the Apple Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, + EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS + USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, + REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND + WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR + OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PluginObject__DEFINED +#define PluginObject__DEFINED + +#include "npapi.h" + +struct ANPCanvas; +struct ANPAudioTrack; + +class Animation { +public: + Animation(NPP inst) : m_inst(inst) {} + virtual ~Animation() {} + virtual void draw(ANPCanvas*) = 0; + + NPP inst() const { return m_inst; } + +private: + NPP m_inst; +}; + +typedef struct PluginObject { + NPObject header; + NPP npp; + NPWindow* window; + Animation* anim; + ANPAudioTrack* track; + int32_t mUnichar; + + bool mTestTimers; + uint32_t mStartTime; + uint32_t mPrevTime; + int mTimerCount; +} PluginObject; + +NPClass *getPluginClass(void); + +#endif // PluginObject__DEFINED diff --git a/samples/SampleBrowserPlugin/jni/main.cpp b/samples/SampleBrowserPlugin/jni/main.cpp new file mode 100644 index 000000000..4abc07c4c --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/main.cpp @@ -0,0 +1,435 @@ +/* + * Copyright 2008, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include "main.h" +#include "PluginObject.h" +#include "pluginGraphics.h" +#include "android_npapi.h" + +NPNetscapeFuncs* browser; +#define EXPORT __attribute__((visibility("default"))) + +NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, + char* argn[], char* argv[], NPSavedData* saved); +NPError NPP_Destroy(NPP instance, NPSavedData** save); +NPError NPP_SetWindow(NPP instance, NPWindow* window); +NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, + NPBool seekable, uint16* stype); +NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason); +int32 NPP_WriteReady(NPP instance, NPStream* stream); +int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, + void* buffer); +void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname); +void NPP_Print(NPP instance, NPPrint* platformPrint); +int16 NPP_HandleEvent(NPP instance, void* event); +void NPP_URLNotify(NPP instance, const char* URL, NPReason reason, + void* notifyData); +NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value); +NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value); + +extern "C" { +EXPORT NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env, void *application_context); +EXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value); +EXPORT const char* NP_GetMIMEDescription(void); +EXPORT void NP_Shutdown(void); +}; + +ANPAudioTrackInterfaceV0 gSoundI; +ANPCanvasInterfaceV0 gCanvasI; +ANPLogInterfaceV0 gLogI; +ANPPaintInterfaceV0 gPaintI; +ANPPathInterfaceV0 gPathI; +ANPTypefaceInterfaceV0 gTypefaceI; + +#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) + +NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env, void *application_context) +{ + // Make sure we have a function table equal or larger than we are built against. + if (browserFuncs->size < sizeof(NPNetscapeFuncs)) { + return NPERR_GENERIC_ERROR; + } + + // Copy the function table (structure) + browser = (NPNetscapeFuncs*) malloc(sizeof(NPNetscapeFuncs)); + memcpy(browser, browserFuncs, sizeof(NPNetscapeFuncs)); + + // Build the plugin function table + pluginFuncs->version = 11; + pluginFuncs->size = sizeof(pluginFuncs); + pluginFuncs->newp = NPP_New; + pluginFuncs->destroy = NPP_Destroy; + pluginFuncs->setwindow = NPP_SetWindow; + pluginFuncs->newstream = NPP_NewStream; + pluginFuncs->destroystream = NPP_DestroyStream; + pluginFuncs->asfile = NPP_StreamAsFile; + pluginFuncs->writeready = NPP_WriteReady; + pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write; + pluginFuncs->print = NPP_Print; + pluginFuncs->event = NPP_HandleEvent; + pluginFuncs->urlnotify = NPP_URLNotify; + pluginFuncs->getvalue = NPP_GetValue; + pluginFuncs->setvalue = NPP_SetValue; + + static const struct { + NPNVariable v; + uint32_t size; + ANPInterface* i; + } gPairs[] = { + { kLogInterfaceV0_ANPGetValue, sizeof(gLogI), &gLogI }, + { kCanvasInterfaceV0_ANPGetValue, sizeof(gCanvasI), &gCanvasI }, + { kPaintInterfaceV0_ANPGetValue, sizeof(gPaintI), &gPaintI }, + { kPathInterfaceV0_ANPGetValue, sizeof(gPathI), &gPathI }, + { kTypefaceInterfaceV0_ANPGetValue, sizeof(gPaintI), &gTypefaceI }, + { kAudioTrackInterfaceV0_ANPGetValue, sizeof(gSoundI), &gSoundI }, + }; + for (size_t i = 0; i < ARRAY_COUNT(gPairs); i++) { + gPairs[i].i->inSize = gPairs[i].size; + NPError err = browser->getvalue(NULL, gPairs[i].v, gPairs[i].i); + if (err) { + return err; + } + } + + return NPERR_NO_ERROR; +} + +void NP_Shutdown(void) +{ + +} + +const char *NP_GetMIMEDescription(void) +{ + return "application/x-testplugin:tst:Test plugin mimetype is application/x-testplugin"; +} + +NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, + char* argn[], char* argv[], NPSavedData* saved) +{ + PluginObject *obj = NULL; + + // Scripting functions appeared in NPAPI version 14 + if (browser->version >= 14) { + instance->pdata = browser->createobject (instance, getPluginClass()); + obj = static_cast(instance->pdata); + bzero(obj, sizeof(*obj)); + } + + uint32_t bits; + NPError err = browser->getvalue(instance, kSupportedDrawingModel_ANPGetValue, &bits); + if (err) { + gLogI.log(instance, kError_ANPLogType, "supported model err %d", err); + return err; + } + + ANPDrawingModel model = kBitmap_ANPDrawingModel; + + int count = argc; + for (int i = 0; i < count; i++) { + if (!strcmp(argn[i], "DrawingModel")) { + if (!strcmp(argv[i], "Bitmap")) { + model = kBitmap_ANPDrawingModel; + } + if (!strcmp(argv[i], "Canvas")) { + // obj->mTestTimers = true; + } + gLogI.log(instance, kDebug_ANPLogType, "------ %p DrawingModel is %d", instance, model); + break; + } + } + + // comment this out to draw via bitmaps (the default) + err = browser->setvalue(instance, kRequestDrawingModel_ANPSetValue, + reinterpret_cast(model)); + if (err) { + gLogI.log(instance, kError_ANPLogType, "request model %d err %d", model, err); + } + return err; +} + +NPError NPP_Destroy(NPP instance, NPSavedData** save) +{ + PluginObject *obj = (PluginObject*) instance->pdata; + delete obj->anim; + gSoundI.deleteTrack(obj->track); + + return NPERR_NO_ERROR; +} + +static void timer_oneshot(NPP instance, uint32 timerID) { + gLogI.log(instance, kDebug_ANPLogType, "-------- oneshot timer\n"); +} + +static int gTimerRepeatCount; +static void timer_repeat(NPP instance, uint32 timerID) { + + gLogI.log(instance, kDebug_ANPLogType, "-------- repeat timer %d\n", + gTimerRepeatCount); + if (--gTimerRepeatCount == 0) { + browser->unscheduletimer(instance, timerID); + } +} + +static void timer_neverfires(NPP instance, uint32 timerID) { + gLogI.log(instance, kError_ANPLogType, "-------- timer_neverfires!!!\n"); +} + +#define TIMER_INTERVAL 50 + +static void timer_latency(NPP instance, uint32 timerID) { + PluginObject *obj = (PluginObject*) instance->pdata; + + obj->mTimerCount += 1; + + uint32_t now = getMSecs(); + uint32_t interval = now - obj->mPrevTime; + + uint32_t dur = now - obj->mStartTime; + uint32_t expectedDur = obj->mTimerCount * TIMER_INTERVAL; + int32_t drift = dur - expectedDur; + int32_t aveDrift = drift / obj->mTimerCount; + + obj->mPrevTime = now; + + gLogI.log(instance, kDebug_ANPLogType, + "-------- latency test: [%3d] interval %d expected %d, total %d expected %d, drift %d ave %d\n", + obj->mTimerCount, interval, TIMER_INTERVAL, dur, expectedDur, + drift, aveDrift); +} + +NPError NPP_SetWindow(NPP instance, NPWindow* window) +{ + PluginObject *obj = (PluginObject*) instance->pdata; + + // Do nothing if browser didn't support NPN_CreateObject which would have created the PluginObject. + if (obj != NULL) { + obj->window = window; + } + + static bool gTestTimers; + if (!gTestTimers) { + gTestTimers = true; + // test for bogus timerID + browser->unscheduletimer(instance, 999999); + // test oneshot + browser->scheduletimer(instance, 100, false, timer_oneshot); + // test repeat + gTimerRepeatCount = 10; + browser->scheduletimer(instance, 50, true, timer_repeat); + // test unschedule immediately + uint32 id = browser->scheduletimer(instance, 100, false, timer_neverfires); + browser->unscheduletimer(instance, id); + // test double unschedlue (should be no-op) + browser->unscheduletimer(instance, id); + } + + if (obj->mTestTimers) { + browser->scheduletimer(instance, TIMER_INTERVAL, true, timer_latency); + obj->mStartTime = obj->mPrevTime = getMSecs(); + obj->mTestTimers = false; + } + + browser->invalidaterect(instance, NULL); + + return NPERR_NO_ERROR; +} + + +NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) +{ + *stype = NP_ASFILEONLY; + return NPERR_NO_ERROR; +} + +NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) +{ + return NPERR_NO_ERROR; +} + +int32 NPP_WriteReady(NPP instance, NPStream* stream) +{ + return 0; +} + +int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) +{ + return 0; +} + +void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) +{ +} + +void NPP_Print(NPP instance, NPPrint* platformPrint) +{ + +} + +struct SoundPlay { + NPP instance; + ANPAudioTrack* track; + FILE* file; +}; + +static void audioCallback(ANPAudioEvent evt, void* user, ANPAudioBuffer* buffer) { + switch (evt) { + case kMoreData_ANPAudioEvent: { + SoundPlay* play = reinterpret_cast(user); + size_t amount = fread(buffer->bufferData, 1, buffer->size, play->file); + buffer->size = amount; + if (amount == 0) { + gSoundI.stop(play->track); + fclose(play->file); + play->file = NULL; + // need to notify our main thread to delete the track now + } + break; + } + default: + break; + } +} + +static ANPAudioTrack* createTrack(NPP instance, const char path[]) { + FILE* f = fopen(path, "r"); + gLogI.log(instance, kWarning_ANPLogType, "--- path %s FILE %p", path, f); + if (NULL == f) { + return NULL; + } + SoundPlay* play = new SoundPlay; + play->file = f; + play->track = gSoundI.newTrack(44100, kPCM16Bit_ANPSampleFormat, 2, audioCallback, play); + if (NULL == play->track) { + fclose(f); + delete play; + return NULL; + } + return play->track; +} + +int16 NPP_HandleEvent(NPP instance, void* event) +{ + PluginObject *obj = reinterpret_cast(instance->pdata); + const ANPEvent* evt = reinterpret_cast(event); + + switch (evt->eventType) { + case kDraw_ANPEventType: + switch (evt->data.drawContext.model) { + case kBitmap_ANPDrawingModel: + drawPlugin(instance, evt->data.drawContext.data.bitmap, + evt->data.drawContext.clip); + return 1; + default: + break; // unknown drawing model + } + + case kKey_ANPEventType: + gLogI.log(instance, kDebug_ANPLogType, "---- %p Key action=%d" + " code=%d vcode=%d unichar=%d repeat=%d mods=%x", instance, + evt->data.key.action, + evt->data.key.nativeCode, + evt->data.key.virtualCode, + evt->data.key.unichar, + evt->data.key.repeatCount, + evt->data.key.modifiers); + if (evt->data.key.action == kDown_ANPKeyAction) { + obj->mUnichar = evt->data.key.unichar; + browser->invalidaterect(instance, NULL); + } + return 1; + + case kTouch_ANPEventType: + gLogI.log(instance, kDebug_ANPLogType, "---- %p Touch action=%d [%d %d]", + instance, evt->data.touch.action, evt->data.touch.x, + evt->data.touch.y); + if (kUp_ANPTouchAction == evt->data.touch.action) { + if (NULL == obj->track) { + obj->track = createTrack(instance, "/sdcard/sample.snd"); + } + if (obj->track) { + gLogI.log(instance, kDebug_ANPLogType, "track %p %d", + obj->track, gSoundI.isStopped(obj->track)); + if (gSoundI.isStopped(obj->track)) { + gSoundI.start(obj->track); + } else { + gSoundI.pause(obj->track); + } + } + } + return 1; + + default: + break; + } + return 0; // unknown or unhandled event +} + +void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) +{ + +} + +EXPORT NPError NP_GetValue(NPP instance, NPPVariable variable, void *value) { + + if (variable == NPPVpluginNameString) { + const char **str = (const char **)value; + *str = "Test Plugin"; + return NPERR_NO_ERROR; + } + + if (variable == NPPVpluginDescriptionString) { + const char **str = (const char **)value; + *str = "Description of Test Plugin"; + return NPERR_NO_ERROR; + } + + return NPERR_GENERIC_ERROR; +} + +NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) +{ + if (variable == NPPVpluginScriptableNPObject) { + void **v = (void **)value; + PluginObject *obj = (PluginObject*) instance->pdata; + + if (obj) + browser->retainobject((NPObject*)obj); + + *v = obj; + return NPERR_NO_ERROR; + } + + return NPERR_GENERIC_ERROR; +} + +NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) +{ + return NPERR_GENERIC_ERROR; +} + diff --git a/samples/SampleBrowserPlugin/jni/main.h b/samples/SampleBrowserPlugin/jni/main.h new file mode 100644 index 000000000..8bf520e26 --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/main.h @@ -0,0 +1,30 @@ +/* + * Copyright 2008, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +extern NPNetscapeFuncs* browser; diff --git a/samples/SampleBrowserPlugin/jni/pluginGraphics.cpp b/samples/SampleBrowserPlugin/jni/pluginGraphics.cpp new file mode 100644 index 000000000..7fbf7a7d3 --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/pluginGraphics.cpp @@ -0,0 +1,210 @@ +/* + * Copyright 2008, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pluginGraphics.h" + +#include "android_npapi.h" +#include +#include +#include +#include +#include + +extern NPNetscapeFuncs* browser; +extern ANPLogInterfaceV0 gLogI; +extern ANPCanvasInterfaceV0 gCanvasI; +extern ANPPaintInterfaceV0 gPaintI; +extern ANPPathInterfaceV0 gPathI; +extern ANPTypefaceInterfaceV0 gTypefaceI; + +static void inval(NPP instance) { + browser->invalidaterect(instance, NULL); +} + +static uint16 rnd16(float x, int inset) { + int ix = (int)roundf(x) + inset; + if (ix < 0) { + ix = 0; + } + return static_cast(ix); +} + +static void inval(NPP instance, const ANPRectF& r, bool doAA) { + const int inset = doAA ? -1 : 0; + + PluginObject *obj = reinterpret_cast(instance->pdata); + NPRect inval; + inval.left = rnd16(r.left, inset); + inval.top = rnd16(r.top, inset); + inval.right = rnd16(r.right, -inset); + inval.bottom = rnd16(r.bottom, -inset); + browser->invalidaterect(instance, &inval); +} + +uint32_t getMSecs() { + struct timeval tv; + gettimeofday(&tv, NULL); + return (uint32_t) (tv.tv_sec * 1000 + tv.tv_usec / 1000 ); // microseconds to milliseconds +} + +/////////////////////////////////////////////////////////////////////////////// + +class BallAnimation : public Animation { +public: + BallAnimation(NPP inst); + virtual ~BallAnimation(); + virtual void draw(ANPCanvas*); +private: + float m_x; + float m_y; + float m_dx; + float m_dy; + + ANPRectF m_oval; + ANPPaint* m_paint; + + static const float SCALE = 0.1; +}; + +BallAnimation::BallAnimation(NPP inst) : Animation(inst) { + m_x = m_y = 0; + m_dx = 7 * SCALE; + m_dy = 5 * SCALE; + + memset(&m_oval, 0, sizeof(m_oval)); + + m_paint = gPaintI.newPaint(); + gPaintI.setFlags(m_paint, gPaintI.getFlags(m_paint) | kAntiAlias_ANPPaintFlag); + gPaintI.setColor(m_paint, 0xFFFF0000); + gPaintI.setTextSize(m_paint, 24); + + ANPTypeface* tf = gTypefaceI.createFromName("serif", kItalic_ANPTypefaceStyle); + gPaintI.setTypeface(m_paint, tf); + gTypefaceI.unref(tf); +} + +BallAnimation::~BallAnimation() { + gPaintI.deletePaint(m_paint); +} + +static void bounce(float* x, float* dx, const float max) { + *x += *dx; + if (*x < 0) { + *x = 0; + if (*dx < 0) { + *dx = -*dx; + } + } else if (*x > max) { + *x = max; + if (*dx > 0) { + *dx = -*dx; + } + } +} + +void BallAnimation::draw(ANPCanvas* canvas) { + NPP instance = this->inst(); + PluginObject *obj = (PluginObject*) instance->pdata; + const float OW = 20; + const float OH = 20; + const int W = obj->window->width; + const int H = obj->window->height; + + inval(instance, m_oval, true); // inval the old + m_oval.left = m_x; + m_oval.top = m_y; + m_oval.right = m_x + OW; + m_oval.bottom = m_y + OH; + inval(instance, m_oval, true); // inval the new + + gCanvasI.drawColor(canvas, 0xFFFFFFFF); + + // test out the Path API + { + ANPPath* path = gPathI.newPath(); + + float cx = W * 0.5f; + float cy = H * 0.5f; + gPathI.moveTo(path, 0, 0); + gPathI.quadTo(path, cx, cy, W, 0); + gPathI.quadTo(path, cx, cy, W, H); + gPathI.quadTo(path, cx, cy, 0, H); + gPathI.quadTo(path, cx, cy, 0, 0); + + gPaintI.setColor(m_paint, 0xFF0000FF); + gCanvasI.drawPath(canvas, path, m_paint); + + ANPRectF bounds; + memset(&bounds, 0, sizeof(bounds)); + gPathI.getBounds(path, &bounds); +#if 0 + gLogI.log(instance, kDebug_ANPLogType, "drawpath: center %g %g bounds [%g %g %g %g]\n", + cx, cy, + bounds.left, bounds.top, bounds.right, bounds.bottom); +#endif + gPathI.deletePath(path); + } + + gPaintI.setColor(m_paint, 0xFFFF0000); + gCanvasI.drawOval(canvas, &m_oval, m_paint); + + bounce(&m_x, &m_dx, obj->window->width - OW); + bounce(&m_y, &m_dy, obj->window->height - OH); + + if (obj->mUnichar) { + ANPFontMetrics fm; + gPaintI.getFontMetrics(m_paint, &fm); + + gPaintI.setColor(m_paint, 0xFF0000FF); + char c = static_cast(obj->mUnichar); + gCanvasI.drawText(canvas, &c, 1, 10, -fm.fTop, m_paint); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void drawPlugin(NPP instance, const ANPBitmap& bitmap, const ANPRectI& clip) { + ANPCanvas* canvas = gCanvasI.newCanvas(&bitmap); + + ANPRectF clipR; + clipR.left = clip.left; + clipR.top = clip.top; + clipR.right = clip.right; + clipR.bottom = clip.bottom; + gCanvasI.clipRect(canvas, &clipR); + + drawPlugin(instance, canvas); + + gCanvasI.deleteCanvas(canvas); +} + +void drawPlugin(NPP instance, ANPCanvas* canvas) { + PluginObject *obj = (PluginObject*) instance->pdata; + if (obj->anim == NULL) { + obj->anim = new BallAnimation(instance); + } + obj->anim->draw(canvas); +} + diff --git a/samples/SampleBrowserPlugin/jni/pluginGraphics.h b/samples/SampleBrowserPlugin/jni/pluginGraphics.h new file mode 100644 index 000000000..4dceb26b0 --- /dev/null +++ b/samples/SampleBrowserPlugin/jni/pluginGraphics.h @@ -0,0 +1,40 @@ +/* + * Copyright 2008, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "main.h" // for NPAPI definitions +#include "PluginObject.h" + +#ifndef pluginGraphics__DEFINED +#define pluginGraphics__DEFINED + +struct ANPBitmap; +struct ANPCanvas; +struct ANPRectI; + +void drawPlugin(NPP instance, const ANPBitmap& bitmap, const ANPRectI& clip); +void drawPlugin(NPP instance, ANPCanvas*); +uint32_t getMSecs(); + +#endif // pluginGraphics__DEFINED diff --git a/samples/SampleBrowserPlugin/res/drawable/sample_browser_plugin.png b/samples/SampleBrowserPlugin/res/drawable/sample_browser_plugin.png new file mode 100755 index 0000000000000000000000000000000000000000..47c79d1c149e90a2765af3b972eb9439498f91b6 GIT binary patch literal 3610 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 literal 0 HcmV?d00001 diff --git a/samples/SampleBrowserPlugin/res/values/strings.xml b/samples/SampleBrowserPlugin/res/values/strings.xml new file mode 100644 index 000000000..1f8dd4946 --- /dev/null +++ b/samples/SampleBrowserPlugin/res/values/strings.xml @@ -0,0 +1,19 @@ + + + + Sample Browser Plugin + diff --git a/samples/SampleBrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java b/samples/SampleBrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java new file mode 100644 index 000000000..9b8ce955e --- /dev/null +++ b/samples/SampleBrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java @@ -0,0 +1,15 @@ +package com.android.sampleplugin; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +public class SamplePlugin extends Service { + + @Override + public IBinder onBind(Intent intent) { + // TODO Auto-generated method stub + return null; + } + +}