Make DividerItemDecoration a public API. am: 7febb12fee am: a4c8d62156
am: 9f12302a14
Change-Id: I2438bcc95cead86da45b2d4dbf14a306c2fd414c
diff --git a/api/current.txt b/api/current.txt
index cdb9b0d..f0be290 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1226,6 +1226,7 @@
method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
method public int getSelectedPosition();
+ method public final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
method public void onTransitionEnd();
method public boolean onTransitionPrepare();
method public void onTransitionStart();
@@ -1240,6 +1241,7 @@
method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
method public int getSelectedPosition();
+ method public final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
method public void onTransitionEnd();
method public boolean onTransitionPrepare();
method public void onTransitionStart();
@@ -2094,6 +2096,25 @@
package android.support.v17.leanback.graphics {
+ public class BoundsRule {
+ ctor public BoundsRule();
+ method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule absoluteValue(int);
+ method public void calculateBounds(android.graphics.Rect, android.graphics.Rect);
+ method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParent(float);
+ method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParentWithOffset(float, int);
+ field public android.support.v17.leanback.graphics.BoundsRule.ValueRule mBottom;
+ field public android.support.v17.leanback.graphics.BoundsRule.ValueRule mLeft;
+ field public android.support.v17.leanback.graphics.BoundsRule.ValueRule mRight;
+ field public android.support.v17.leanback.graphics.BoundsRule.ValueRule mTop;
+ }
+
+ public static final class BoundsRule.ValueRule {
+ method public int getAbsoluteValue();
+ method public float getFraction();
+ method public void setAbsoluteValue(int);
+ method public void setFraction(float);
+ }
+
public final class ColorFilterCache {
method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
method public android.graphics.ColorFilter getFilterForLevel(float);
@@ -2120,6 +2141,67 @@
method public void setActiveLevel(float);
}
+ public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public CompositeDrawable();
+ method public void addChildDrawable(android.graphics.drawable.Drawable);
+ method public void draw(android.graphics.Canvas);
+ method public android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable getChildAt(int);
+ method public int getChildCount();
+ method public android.graphics.drawable.Drawable getDrawable(int);
+ method public int getOpacity();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void removeChild(int);
+ method public void removeDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ field protected java.util.ArrayList<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable> children;
+ }
+
+ public static final class CompositeDrawable.ChildDrawable {
+ ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable, android.support.v17.leanback.graphics.CompositeDrawable);
+ method public android.support.v17.leanback.graphics.BoundsRule getBoundsRule();
+ method public android.graphics.drawable.Drawable getDrawable();
+ method public void recomputeBounds();
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> BOTTOM_ABSOLUTE;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> BOTTOM_FRACTION;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> LEFT_ABSOLUTE;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> LEFT_FRACTION;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> RIGHT_ABSOLUTE;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> RIGHT_FRACTION;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> TOP_ABSOLUTE;
+ field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> TOP_FRACTION;
+ }
+
+ public final class DetailsBackgroundParallaxHelper {
+ method public android.graphics.drawable.Drawable getDrawable();
+ method public void setBitmap(android.graphics.Bitmap);
+ method public void setColor(int);
+ }
+
+ public static class DetailsBackgroundParallaxHelper.ParallaxBuilder {
+ method public android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper build();
+ method public static android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper.ParallaxBuilder newBuilder();
+ method public android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper.ParallaxBuilder setBitmapMinVerticalOffset(int);
+ method public android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper.ParallaxBuilder setColor(int);
+ method public android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper.ParallaxBuilder setRecyclerView(android.support.v7.widget.RecyclerView);
+ }
+
+ public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
+ ctor public FitWidthBitmapDrawable();
+ method public void draw(android.graphics.Canvas);
+ method public android.graphics.Bitmap getBitmap();
+ method public int getOpacity();
+ method public android.graphics.Rect getSource();
+ method public int getVerticalOffset();
+ method public void setAlpha(int);
+ method public void setBitmap(android.graphics.Bitmap);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setSource(android.graphics.Rect);
+ method public void setVerticalOffset(int);
+ }
+
}
package android.support.v17.leanback.system {
@@ -2707,9 +2789,11 @@
ctor public HeaderItem(long, java.lang.String);
ctor public HeaderItem(java.lang.String);
method public java.lang.CharSequence getContentDescription();
+ method public java.lang.CharSequence getDescription();
method public final long getId();
method public final java.lang.String getName();
method public void setContentDescription(java.lang.CharSequence);
+ method public void setDescription(java.lang.CharSequence);
}
public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
@@ -3007,6 +3091,122 @@
method public final boolean isRenderedAsRowView();
}
+ public final class Parallax {
+ ctor public Parallax();
+ method public void addEffect(android.support.v17.leanback.widget.ParallaxEffect);
+ method public android.support.v17.leanback.widget.ParallaxEffect addEffect(android.support.v17.leanback.widget.ParallaxSource.IntVariableKeyValue...);
+ method public android.support.v17.leanback.widget.ParallaxEffect addEffect(android.support.v17.leanback.widget.ParallaxSource.FloatVariableKeyValue...);
+ method public java.util.List<android.support.v17.leanback.widget.ParallaxEffect> getEffects();
+ method public android.support.v17.leanback.widget.ParallaxSource getSource();
+ method public void removeAllEffects();
+ method public void removeEffect(android.support.v17.leanback.widget.ParallaxEffect);
+ method public void setSource(android.support.v17.leanback.widget.ParallaxSource);
+ }
+
+ public abstract class ParallaxEffect {
+ ctor public ParallaxEffect();
+ method public final void addTarget(android.support.v17.leanback.widget.ParallaxTarget);
+ method protected abstract float calculateFraction(android.support.v17.leanback.widget.ParallaxSource);
+ method public final java.util.List<android.support.v17.leanback.widget.ParallaxTarget> getTargets();
+ method public final java.util.List<VariableKeyValueT> getVariableRanges();
+ method public final void performMapping(android.support.v17.leanback.widget.ParallaxSource);
+ method public final void removeTarget(android.support.v17.leanback.widget.ParallaxTarget);
+ method public final void setVariableRanges(VariableKeyValueT...);
+ method public final android.support.v17.leanback.widget.ParallaxEffect target(android.support.v17.leanback.widget.ParallaxTarget);
+ method public final android.support.v17.leanback.widget.ParallaxEffect target(java.lang.Object, android.animation.PropertyValuesHolder);
+ }
+
+ public static final class ParallaxEffect.FloatEffect extends android.support.v17.leanback.widget.ParallaxEffect {
+ ctor public ParallaxEffect.FloatEffect();
+ method protected float calculateFraction(android.support.v17.leanback.widget.ParallaxSource);
+ }
+
+ public static final class ParallaxEffect.IntEffect extends android.support.v17.leanback.widget.ParallaxEffect {
+ ctor public ParallaxEffect.IntEffect();
+ method protected float calculateFraction(android.support.v17.leanback.widget.ParallaxSource);
+ }
+
+ public class ParallaxRecyclerViewSource extends android.support.v17.leanback.widget.ParallaxSource {
+ ctor public ParallaxRecyclerViewSource(android.support.v7.widget.RecyclerView);
+ method public android.support.v17.leanback.widget.ParallaxSource.IntVariable addVariable(int, int, int, float);
+ method public android.support.v17.leanback.widget.ParallaxSource.IntVariable getMaxParentVisibleSize();
+ method public java.util.List<android.support.v17.leanback.widget.ParallaxSource.IntVariable> getVariables();
+ method public void setListener(android.support.v17.leanback.widget.ParallaxSource.Listener);
+ }
+
+ public abstract class ParallaxSource {
+ ctor public ParallaxSource();
+ method public abstract VariableT getMaxParentVisibleSize();
+ method public abstract java.util.List<VariableT> getVariables();
+ method public abstract void setListener(android.support.v17.leanback.widget.ParallaxSource.Listener);
+ method public static void verifyFloatVariables(java.util.List<android.support.v17.leanback.widget.ParallaxSource.FloatVariable>) throws java.lang.IllegalStateException;
+ method public static void verifyIntVariables(java.util.List<android.support.v17.leanback.widget.ParallaxSource.IntVariable>) throws java.lang.IllegalStateException;
+ }
+
+ public static class ParallaxSource.FloatVariable extends android.support.v17.leanback.widget.ParallaxSource.Variable {
+ ctor public ParallaxSource.FloatVariable(android.support.v17.leanback.widget.ParallaxSource<android.support.v17.leanback.widget.ParallaxSource.FloatVariable>);
+ method public android.support.v17.leanback.widget.ParallaxSource.FloatVariableKeyValue at(float);
+ method public android.support.v17.leanback.widget.ParallaxSource.FloatVariableKeyValue at(float, float);
+ method public final float getFloatValue();
+ method public java.lang.Object getValue();
+ method public final void setFloatValue(float);
+ field public static final float UNKNOWN_AFTER = 3.4028235E38f;
+ field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
+ }
+
+ public static class ParallaxSource.FloatVariableKeyValue extends android.support.v17.leanback.widget.ParallaxSource.VariableKeyValue {
+ ctor public ParallaxSource.FloatVariableKeyValue(android.support.v17.leanback.widget.ParallaxSource.FloatVariable, float);
+ ctor public ParallaxSource.FloatVariableKeyValue(android.support.v17.leanback.widget.ParallaxSource.FloatVariable, float, float);
+ method public final float getFloatValue();
+ }
+
+ public static class ParallaxSource.IntVariable extends android.support.v17.leanback.widget.ParallaxSource.Variable {
+ ctor public ParallaxSource.IntVariable(android.support.v17.leanback.widget.ParallaxSource<android.support.v17.leanback.widget.ParallaxSource.IntVariable>);
+ method public android.support.v17.leanback.widget.ParallaxSource.IntVariableKeyValue at(int);
+ method public android.support.v17.leanback.widget.ParallaxSource.IntVariableKeyValue at(int, float);
+ method public final int getIntValue();
+ method public java.lang.Object getValue();
+ method public final void setIntValue(int);
+ field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
+ field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
+ }
+
+ public static class ParallaxSource.IntVariableKeyValue extends android.support.v17.leanback.widget.ParallaxSource.VariableKeyValue {
+ ctor public ParallaxSource.IntVariableKeyValue(android.support.v17.leanback.widget.ParallaxSource.IntVariable, int);
+ ctor public ParallaxSource.IntVariableKeyValue(android.support.v17.leanback.widget.ParallaxSource.IntVariable, int, float);
+ method public final int getIntValue();
+ }
+
+ public static abstract class ParallaxSource.Listener {
+ ctor public ParallaxSource.Listener();
+ method public void onVariableChanged(android.support.v17.leanback.widget.ParallaxSource);
+ }
+
+ public static abstract class ParallaxSource.Variable {
+ ctor public ParallaxSource.Variable(android.support.v17.leanback.widget.ParallaxSource<VariableT>);
+ method public final java.lang.String getName();
+ method public android.support.v17.leanback.widget.ParallaxSource<VariableT> getSource();
+ method public abstract java.lang.Object getValue();
+ method public final void setName(java.lang.String);
+ }
+
+ public static class ParallaxSource.VariableKeyValue {
+ ctor public ParallaxSource.VariableKeyValue(VariableT);
+ method public final VariableT getVariable();
+ }
+
+ public abstract class ParallaxTarget {
+ ctor public ParallaxTarget();
+ method public abstract float getFraction();
+ method public abstract void update(float);
+ }
+
+ public static final class ParallaxTarget.PropertyValuesHolderTarget extends android.support.v17.leanback.widget.ParallaxTarget {
+ ctor public ParallaxTarget.PropertyValuesHolderTarget(java.lang.Object, android.animation.PropertyValuesHolder);
+ method public float getFraction();
+ method public void update(float);
+ }
+
public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
ctor public PlaybackControlsRow(java.lang.Object);
ctor public PlaybackControlsRow();
@@ -5571,6 +5771,7 @@
public class BuildCompat {
method public static boolean isAtLeastN();
method public static boolean isAtLeastNMR1();
+ method public static boolean isAtLeastO();
}
public final class CancellationSignal {
diff --git a/compat/gingerbread/android/support/v4/os/BuildCompat.java b/compat/gingerbread/android/support/v4/os/BuildCompat.java
index 3c73e4d..d406caf 100644
--- a/compat/gingerbread/android/support/v4/os/BuildCompat.java
+++ b/compat/gingerbread/android/support/v4/os/BuildCompat.java
@@ -45,4 +45,14 @@
public static boolean isAtLeastNMR1() {
return VERSION.SDK_INT >= 25;
}
+
+ /**
+ * Check if the device is running on the Android O release or newer.
+ *
+ * @return {@code true} if O APIs are available for use
+ */
+ public static boolean isAtLeastO() {
+ return !"REL".equals(VERSION.CODENAME)
+ && "O".compareTo(VERSION.CODENAME) <= 0;
+ }
}
diff --git a/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java b/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java
index 89566eb..5818ec4 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java
@@ -15,76 +15,110 @@
*/
package android.support.v4.app;
+import android.app.Activity;
import android.app.Fragment;
+import android.app.Instrumentation;
import android.support.fragment.test.R;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SdkSuppress;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
import android.support.v4.app.test.FragmentTestActivity;
import android.support.v4.app.test.FragmentTestActivity.TestFragment;
-import android.test.ActivityInstrumentationTestCase2;
import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
/**
* Test to prevent regressions in SupportFragmentManager fragment replace method. See b/24693644
*/
-public class FragmentReplaceTest extends
- ActivityInstrumentationTestCase2<FragmentTestActivity> {
- private FragmentTestActivity mActivity;
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class FragmentReplaceTest {
+ @Rule
+ public ActivityTestRule<FragmentTestActivity> mActivityRule =
+ new ActivityTestRule<FragmentTestActivity>(FragmentTestActivity.class);
+ private Instrumentation mInstrumentation;
- public FragmentReplaceTest() {
- super(FragmentTestActivity.class);
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
}
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mActivity = getActivity();
- }
-
+ @Test
@UiThreadTest
public void testReplaceFragment() throws Throwable {
- mActivity.getSupportFragmentManager().beginTransaction()
+ final FragmentActivity activity = mActivityRule.getActivity();
+ final FragmentManager fm = activity.getSupportFragmentManager();
+
+ fm.beginTransaction()
.add(R.id.content, TestFragment.create(R.layout.fragment_a))
.addToBackStack(null)
.commit();
- mActivity.getSupportFragmentManager().executePendingTransactions();
- assertNotNull(mActivity.findViewById(R.id.textA));
- assertNull(mActivity.findViewById(R.id.textB));
- assertNull(mActivity.findViewById(R.id.textC));
+ executePendingTransactions(fm);
+ assertNotNull(activity.findViewById(R.id.textA));
+ assertNull(activity.findViewById(R.id.textB));
+ assertNull(activity.findViewById(R.id.textC));
- mActivity.getSupportFragmentManager().beginTransaction()
+ fm.beginTransaction()
.add(R.id.content, TestFragment.create(R.layout.fragment_b))
.addToBackStack(null)
.commit();
- mActivity.getSupportFragmentManager().executePendingTransactions();
- assertNotNull(mActivity.findViewById(R.id.textA));
- assertNotNull(mActivity.findViewById(R.id.textB));
- assertNull(mActivity.findViewById(R.id.textC));
+ executePendingTransactions(fm);
+ assertNotNull(activity.findViewById(R.id.textA));
+ assertNotNull(activity.findViewById(R.id.textB));
+ assertNull(activity.findViewById(R.id.textC));
- mActivity.getSupportFragmentManager().beginTransaction()
+ activity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, TestFragment.create(R.layout.fragment_c))
.addToBackStack(null)
.commit();
- mActivity.getSupportFragmentManager().executePendingTransactions();
- assertNull(mActivity.findViewById(R.id.textA));
- assertNull(mActivity.findViewById(R.id.textB));
- assertNotNull(mActivity.findViewById(R.id.textC));
+ executePendingTransactions(fm);
+ assertNull(activity.findViewById(R.id.textA));
+ assertNull(activity.findViewById(R.id.textB));
+ assertNotNull(activity.findViewById(R.id.textC));
+ }
+
+ private void executePendingTransactions(final FragmentManager fm) {
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ fm.executePendingTransactions();
+ }
+ });
}
@SdkSuppress(minSdkVersion = 11)
+ @Test
@UiThreadTest
public void testBackPressWithFrameworkFragment() throws Throwable {
- mActivity.getFragmentManager().beginTransaction()
+ final Activity activity = mActivityRule.getActivity();
+
+ activity.getFragmentManager().beginTransaction()
.add(R.id.content, new Fragment())
.addToBackStack(null)
.commit();
- mActivity.getFragmentManager().executePendingTransactions();
- assertEquals(1, mActivity.getFragmentManager().getBackStackEntryCount());
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ activity.getFragmentManager().executePendingTransactions();
+ }
+ });
+ assertEquals(1, activity.getFragmentManager().getBackStackEntryCount());
- getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
- assertEquals(0, mActivity.getFragmentManager().getBackStackEntryCount());
+ assertEquals(0, activity.getFragmentManager().getBackStackEntryCount());
}
}
diff --git a/samples/Support13Demos/Android.mk b/samples/Support13Demos/Android.mk
index 52646b3..a227e10 100644
--- a/samples/Support13Demos/Android.mk
+++ b/samples/Support13Demos/Android.mk
@@ -1,12 +1,14 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+
LOCAL_MODULE_TAGS := samples tests
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
+LOCAL_STATIC_ANDROID_LIBRARIES += android-support-v13
LOCAL_PACKAGE_NAME := Support13Demos
diff --git a/samples/Support4Demos/Android.mk b/samples/Support4Demos/Android.mk
index eefbdab..0ba19b0 100644
--- a/samples/Support4Demos/Android.mk
+++ b/samples/Support4Demos/Android.mk
@@ -1,12 +1,13 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_MODULE_TAGS := samples tests
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
+LOCAL_STATIC_ANDROID_LIBRARIES += android-support-v4
LOCAL_PACKAGE_NAME := Support4Demos
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
index 8f3871d..b2e7094 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
@@ -15,9 +15,8 @@
*/
package com.example.android.supportv7.util;
-import com.example.android.supportv7.R;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
import android.support.v7.util.SortedList;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -32,10 +31,12 @@
import android.widget.EditText;
import android.widget.TextView;
+import com.example.android.supportv7.R;
+
/**
* A sample activity that uses {@link SortedList} in combination with RecyclerView.
*/
-public class SortedListActivity extends ActionBarActivity {
+public class SortedListActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private LinearLayoutManager mLinearLayoutManager;
private SortedListAdapter mAdapter;
diff --git a/samples/SupportAppNavigation/Android.mk b/samples/SupportAppNavigation/Android.mk
index 8e6ec46..ea9322f 100644
--- a/samples/SupportAppNavigation/Android.mk
+++ b/samples/SupportAppNavigation/Android.mk
@@ -1,13 +1,15 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+
LOCAL_MODULE_TAGS := samples tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := SupportAppNavigation
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
+LOCAL_STATIC_ANDROID_LIBRARIES += android-support-v4
LOCAL_SDK_VERSION := current
diff --git a/samples/SupportDesignDemos/Android.mk b/samples/SupportDesignDemos/Android.mk
index de9e302..7725af0 100644
--- a/samples/SupportDesignDemos/Android.mk
+++ b/samples/SupportDesignDemos/Android.mk
@@ -18,27 +18,18 @@
# We need to add some special AAPT flags to generate R classes
# for resources that are included from the libraries.
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_PACKAGE_NAME := SupportDesignDemos
LOCAL_MODULE_TAGS := samples
LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 7
LOCAL_DEX_PREOPT := false
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
+LOCAL_STATIC_ANDROID_LIBRARIES := \
android-support-v4 \
android-support-v7-appcompat \
android-support-v7-recyclerview \
android-support-design
-LOCAL_RESOURCE_DIR = \
- $(LOCAL_PATH)/res \
- frameworks/support/v7/appcompat/res \
- frameworks/support/v7/recyclerview/res \
- frameworks/support/design/res
-LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.v7.appcompat \
- --extra-packages android.support.v7.recyclerview \
- --extra-packages android.support.design \
- --no-version-vectors
+LOCAL_AAPT_FLAGS := --no-version-vectors
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
diff --git a/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml b/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml
index ab00ece..c4dfcab 100644
--- a/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml
+++ b/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml
@@ -15,8 +15,7 @@
limitations under the License.
-->
<merge xmlns:tools="http://schemas.android.com/tools"
- xmlns:android="http://schemas.android.com/apk/res/android"
- tools:showIn="@layout/design_bottom_sheet">
+ xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
diff --git a/samples/SupportLeanbackDemos/Android.mk b/samples/SupportLeanbackDemos/Android.mk
index 53bb778..ee031e5 100644
--- a/samples/SupportLeanbackDemos/Android.mk
+++ b/samples/SupportLeanbackDemos/Android.mk
@@ -18,22 +18,15 @@
# We need to add some special AAPT flags to generate R classes
# for resources that are included from the libraries.
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_PACKAGE_NAME := SupportLeanbackDemos
LOCAL_MODULE_TAGS := samples tests
LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 17
LOCAL_DEX_PREOPT := false
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
+LOCAL_STATIC_ANDROID_LIBRARIES := \
android-support-v4 \
android-support-v7-recyclerview \
android-support-v17-leanback
-LOCAL_RESOURCE_DIR = \
- $(LOCAL_PATH)/res \
- frameworks/support/v17/leanback/res \
- frameworks/support/v7/recyclerview/res
-LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.v17.leanback \
- --extra-packages android.support.v7.recyclerview
include $(BUILD_PACKAGE)
diff --git a/samples/SupportLeanbackDemos/generatev4.py b/samples/SupportLeanbackDemos/generatev4.py
index 7c9f0fe..ba5ab81 100755
--- a/samples/SupportLeanbackDemos/generatev4.py
+++ b/samples/SupportLeanbackDemos/generatev4.py
@@ -117,6 +117,7 @@
line = line.replace('DetailsActivity', 'DetailsSupportActivity')
line = line.replace('PlaybackOverlayActivity', 'PlaybackOverlaySupportActivity')
line = line.replace('SearchActivity', 'SearchSupportActivity')
+ line = line.replace('getRowsFragment', 'getRowsSupportFragment')
outfile.write(line)
file.close()
outfile.close()
diff --git a/samples/SupportLeanbackDemos/res/drawable/spiderman.jpg b/samples/SupportLeanbackDemos/res/drawable/spiderman.jpg
new file mode 100644
index 0000000..b68384c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/spiderman.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
index 99943df..12c2e83 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
@@ -136,6 +136,14 @@
mHandler.postDelayed(mRunnable, SET_BACKGROUND_DELAY_MS);
}
+ public void setDrawable(Activity activity, Drawable drawable) {
+ BackgroundManager backgroundManager = BackgroundManager.getInstance(activity);
+ if (!backgroundManager.isAttached()) {
+ backgroundManager.attach(activity.getWindow());
+ }
+ backgroundManager.setDrawable(drawable);
+ }
+
static public void attach(Activity activity) {
if (!ENABLED) {
return;
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
index 802c4d3..865ea99 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
@@ -115,7 +115,7 @@
private void setupRows() {
ListRowPresenter listRowPresenter = new ListRowPresenter();
- listRowPresenter.setNumRows(2);
+ listRowPresenter.setNumRows(1);
mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
setAdapter(mRowsAdapter);
}
@@ -128,7 +128,9 @@
mRowsAdapter.add(new SectionRow(new HeaderItem("section 0")));
for (; i < NUM_ROWS; ++i) {
- mRowsAdapter.add(new ListRow(new HeaderItem(i, "Row " + i), createListRowAdapter(i)));
+ HeaderItem headerItem = new HeaderItem(i, "Row " + i);
+ headerItem.setDescription("Description for Row "+i);
+ mRowsAdapter.add(new ListRow(headerItem, createListRowAdapter(i)));
}
mRowsAdapter.add(new DividerRow());
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
index 48c1462..6df853f 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
@@ -117,7 +117,7 @@
private void setupRows() {
ListRowPresenter listRowPresenter = new ListRowPresenter();
- listRowPresenter.setNumRows(2);
+ listRowPresenter.setNumRows(1);
mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
setAdapter(mRowsAdapter);
}
@@ -130,7 +130,9 @@
mRowsAdapter.add(new SectionRow(new HeaderItem("section 0")));
for (; i < NUM_ROWS; ++i) {
- mRowsAdapter.add(new ListRow(new HeaderItem(i, "Row " + i), createListRowAdapter(i)));
+ HeaderItem headerItem = new HeaderItem(i, "Row " + i);
+ headerItem.setDescription("Description for Row "+i);
+ mRowsAdapter.add(new ListRow(headerItem, createListRowAdapter(i)));
}
mRowsAdapter.add(new DividerRow());
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
index 4d04502..8aa3a57 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
@@ -13,11 +13,13 @@
*/
package com.example.android.leanback;
-import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
+import android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
@@ -48,7 +50,6 @@
private ArrayObjectAdapter mRowsAdapter;
private PhotoItem mPhotoItem;
final CardPresenter cardPresenter = new CardPresenter();
- private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
private static final int ACTION_PLAY = 1;
private static final int ACTION_RENT = 2;
@@ -66,6 +67,8 @@
private Action mActionBuy;
private FullWidthDetailsOverviewSharedElementHelper mHelper;
+ private DetailsBackgroundParallaxHelper mParallaxHelper;
+ private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
private void initializeTest() {
TEST_SHARED_ELEMENT_TRANSITION = null != getActivity().getWindow().getSharedElementEnterTransition();
@@ -244,10 +247,19 @@
@Override
public void onStart() {
super.onStart();
- if (mPhotoItem != null) {
- mBackgroundHelper.setBackground(
- getActivity(), mPhotoItem.getImageResourceId());
- }
+ mParallaxHelper = DetailsBackgroundParallaxHelper.ParallaxBuilder
+ .newBuilder()
+ .setRecyclerView(getRowsFragment().getVerticalGridView())
+ .setBitmapMinVerticalOffset(-300)
+ .build();
+ mBackgroundHelper.setDrawable(getActivity(), mParallaxHelper.getDrawable());
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(),
+ R.drawable.spiderman);
+ mParallaxHelper.setBitmap(bitmap);
+ }
}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
index 8a43d8b..38a0927 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
@@ -15,11 +15,13 @@
*/
package com.example.android.leanback;
-import android.support.v4.app.FragmentActivity;
import android.content.Intent;
import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
+import android.support.v17.leanback.graphics.DetailsBackgroundParallaxHelper;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
@@ -50,7 +52,6 @@
private ArrayObjectAdapter mRowsAdapter;
private PhotoItem mPhotoItem;
final CardPresenter cardPresenter = new CardPresenter();
- private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
private static final int ACTION_PLAY = 1;
private static final int ACTION_RENT = 2;
@@ -68,6 +69,8 @@
private Action mActionBuy;
private FullWidthDetailsOverviewSharedElementHelper mHelper;
+ private DetailsBackgroundParallaxHelper mParallaxHelper;
+ private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
private void initializeTest() {
TEST_SHARED_ELEMENT_TRANSITION = null != getActivity().getWindow().getSharedElementEnterTransition();
@@ -246,10 +249,19 @@
@Override
public void onStart() {
super.onStart();
- if (mPhotoItem != null) {
- mBackgroundHelper.setBackground(
- getActivity(), mPhotoItem.getImageResourceId());
- }
+ mParallaxHelper = DetailsBackgroundParallaxHelper.ParallaxBuilder
+ .newBuilder()
+ .setRecyclerView(getRowsSupportFragment().getVerticalGridView())
+ .setBitmapMinVerticalOffset(-300)
+ .build();
+ mBackgroundHelper.setDrawable(getActivity(), mParallaxHelper.getDrawable());
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(),
+ R.drawable.spiderman);
+ mParallaxHelper.setBitmap(bitmap);
+ }
}
diff --git a/samples/SupportPercentDemos/Android.mk b/samples/SupportPercentDemos/Android.mk
index e2d4e4a7..54c980f 100644
--- a/samples/SupportPercentDemos/Android.mk
+++ b/samples/SupportPercentDemos/Android.mk
@@ -18,20 +18,15 @@
# We need to add some special AAPT flags to generate R classes
# for resources that are included from the libraries.
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_PACKAGE_NAME := SupportPercentDemos
LOCAL_MODULE_TAGS := samples
LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 7
LOCAL_DEX_PREOPT := false
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
+LOCAL_STATIC_ANDROID_LIBRARIES := \
android-support-percent \
android-support-v4 \
android-support-v13
-LOCAL_RESOURCE_DIR = \
- $(LOCAL_PATH)/res \
- frameworks/support/percent/res
-LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.percent
include $(BUILD_PACKAGE)
diff --git a/samples/SupportTransitionDemos/Android.mk b/samples/SupportTransitionDemos/Android.mk
index 1d077a2..90e45d7 100644
--- a/samples/SupportTransitionDemos/Android.mk
+++ b/samples/SupportTransitionDemos/Android.mk
@@ -18,23 +18,15 @@
# We need to add some special AAPT flags to generate R classes
# for resources that are included from the libraries.
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_PACKAGE_NAME := SupportTransitionDemos
LOCAL_MODULE_TAGS := samples
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
+LOCAL_STATIC_ANDROID_LIBRARIES := \
android-support-v4 \
android-support-v7-appcompat \
android-support-transition
-LOCAL_RESOURCE_DIR = \
- $(LOCAL_PATH)/res \
- frameworks/support/v7/appcompat/res \
- frameworks/support/transition/res
-LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.v7.appcompat \
- --extra-packages android.support.v7.recyclerview \
- --extra-packages android.support.transition \
- --no-version-vectors
+LOCAL_AAPT_FLAGS := --no-version-vectors
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
diff --git a/samples/SupportVectorDrawable/animated/Android.mk b/samples/SupportVectorDrawable/animated/Android.mk
index 1a34f53..ae01691 100644
--- a/samples/SupportVectorDrawable/animated/Android.mk
+++ b/samples/SupportVectorDrawable/animated/Android.mk
@@ -16,6 +16,8 @@
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+
LOCAL_MODULE_TAGS := tests
LOCAL_SDK_VERSION := current
@@ -26,13 +28,12 @@
LOCAL_PACKAGE_NAME := SupportAnimatedVectorDrawable
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-animatedvectordrawable \
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+ android-support-animatedvectordrawable \
android-support-vectordrawable \
android-support-v4
-LOCAL_AAPT_FLAGS += --auto-add-overlay \
- --extra-packages android.support.graphics.drawable \
- --no-version-vectors
+LOCAL_AAPT_FLAGS += --no-version-vectors
include $(BUILD_PACKAGE)
diff --git a/samples/SupportVectorDrawable/static/Android.mk b/samples/SupportVectorDrawable/static/Android.mk
index 88d76c5..bdc102a 100644
--- a/samples/SupportVectorDrawable/static/Android.mk
+++ b/samples/SupportVectorDrawable/static/Android.mk
@@ -1,21 +1,21 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+
LOCAL_MODULE_TAGS := samples tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := SupportVectorDrawable
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-vectordrawable android-support-v4
+LOCAL_STATIC_ANDROID_LIBRARIES := android-support-vectordrawable android-support-v4
LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 7
-LOCAL_AAPT_FLAGS += --auto-add-overlay \
- --extra-packages android.support.graphics.drawable \
- --no-version-vectors
+LOCAL_AAPT_FLAGS += --no-version-vectors
include $(BUILD_PACKAGE)
diff --git a/transition/Android.mk b/transition/Android.mk
index a401d77..4721533 100644
--- a/transition/Android.mk
+++ b/transition/Android.mk
@@ -19,6 +19,7 @@
# SDK version than the resources. The resources library and the R class that it
# contains will not be linked into the final static library.
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_MODULE := android-support-transition-res
LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
LOCAL_SRC_FILES := $(call all-java-files-under, dummy)
@@ -79,14 +80,20 @@
include $(BUILD_STATIC_JAVA_LIBRARY)
# Here is the final static library that apps can link against.
-# The R class is automatically excluded from the generated library.
-# Applications that use this library must specify LOCAL_RESOURCE_DIR
-# in their makefiles to include the resources in their package.
+# Applications that use this library must specify
+#
+# LOCAL_STATIC_ANDROID_LIBRARIES := \
+# android-support-transition \
+# android-support-v4
+#
+# in their makefiles to include the resources and their dependencies in their package.
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_MODULE := android-support-transition
LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := android-support-transition-api23
-LOCAL_JAVA_LIBRARIES := android-support-transition-res \
- android-support-v4
+LOCAL_STATIC_ANDROID_LIBRARIES := android-support-transition-res
+LOCAL_SHARED_ANDROID_LIBRARIES := android-support-v4
+LOCAL_JAR_EXCLUDE_FILES := none
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v17/leanback/res/layout/lb_details_overview.xml b/v17/leanback/res/layout/lb_details_overview.xml
index a32f393..7943150 100644
--- a/v17/leanback/res/layout/lb_details_overview.xml
+++ b/v17/leanback/res/layout/lb_details_overview.xml
@@ -84,7 +84,7 @@
android:focusableInTouchMode="true"
android:paddingStart="@dimen/lb_details_overview_description_margin_start"
android:paddingEnd="@dimen/lb_details_overview_description_margin_end"
- lb:horizontalMargin="@dimen/lb_details_overview_action_items_margin"
+ android:horizontalSpacing="@dimen/lb_details_overview_action_items_spacing"
lb:rowHeight="@dimen/lb_details_overview_actions_height" />
</LinearLayout>
diff --git a/v17/leanback/res/layout/lb_divider.xml b/v17/leanback/res/layout/lb_divider.xml
index 389b3ab..e05223b 100644
--- a/v17/leanback/res/layout/lb_divider.xml
+++ b/v17/leanback/res/layout/lb_divider.xml
@@ -23,5 +23,5 @@
android:layout_height="1dp"
android:focusable="false"
android:focusableInTouchMode="false"
- android:background="?android:attr/listDivider"
- />
+ android:importantForAccessibility="no"
+ android:background="?android:attr/listDivider" />
diff --git a/v17/leanback/res/layout/lb_fullwidth_details_overview.xml b/v17/leanback/res/layout/lb_fullwidth_details_overview.xml
index 415bd82..234abb2 100644
--- a/v17/leanback/res/layout/lb_fullwidth_details_overview.xml
+++ b/v17/leanback/res/layout/lb_fullwidth_details_overview.xml
@@ -61,7 +61,7 @@
android:focusableInTouchMode="true"
android:paddingStart="@dimen/lb_details_v2_description_margin_start"
android:paddingEnd="@dimen/lb_details_v2_description_margin_end"
- lb:horizontalMargin="@dimen/lb_details_overview_action_items_margin"
+ android:horizontalSpacing="@dimen/lb_details_overview_action_items_spacing"
lb:rowHeight="@dimen/lb_details_v2_actions_height" />
</LinearLayout>
diff --git a/v17/leanback/res/layout/lb_picker_column.xml b/v17/leanback/res/layout/lb_picker_column.xml
index 1f218a6..afa6dee 100644
--- a/v17/leanback/res/layout/lb_picker_column.xml
+++ b/v17/leanback/res/layout/lb_picker_column.xml
@@ -20,6 +20,7 @@
android:layout_width="wrap_content"
android:layout_height="@dimen/picker_item_height"
android:importantForAccessibility="no"
+ android:verticalSpacing="@dimen/picker_item_spacing"
lb:columnWidth="wrap_content"
android:clipToPadding="false"
android:paddingStart="@dimen/picker_column_horizontal_padding"
diff --git a/v17/leanback/res/layout/lb_row_header.xml b/v17/leanback/res/layout/lb_row_header.xml
index 67da907..8962e9a 100644
--- a/v17/leanback/res/layout/lb_row_header.xml
+++ b/v17/leanback/res/layout/lb_row_header.xml
@@ -15,11 +15,26 @@
limitations under the License.
-->
-<android.support.v17.leanback.widget.RowHeaderView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/row_header"
- android:importantForAccessibility="no"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="?rowHeaderStyle"
- />
+<android:LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <android.support.v17.leanback.widget.RowHeaderView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/row_header"
+ android:importantForAccessibility="no"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?rowHeaderStyle"/>
+
+ <TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/row_header_description"
+ android:importantForAccessibility="no"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?rowHeaderDescriptionStyle" />
+
+</android:LinearLayout>
diff --git a/v17/leanback/res/values/attrs.xml b/v17/leanback/res/values/attrs.xml
index 0069ec8..b4e7692 100644
--- a/v17/leanback/res/values/attrs.xml
+++ b/v17/leanback/res/values/attrs.xml
@@ -28,10 +28,14 @@
<!-- Allow DPAD key to navigate out of last row, for HorizontalGridView, it's the
bottom edge, for VerticalGridView it's the "end" edge. Default value is true. -->
<attr name="focusOutSideEnd" format="boolean" />
- <!-- Defining margin between two items horizontally -->
+ <!-- Deprecated, use android:horizontalSpacing -->
<attr name="horizontalMargin" format="dimension" />
- <!-- Defining margin between two items vertically -->
+ <!-- Deprecated, use android:verticalSpacing -->
<attr name="verticalMargin" format="dimension" />
+ <!-- Defining space between two items horizontally -->
+ <attr name="android:horizontalSpacing" />
+ <!-- Defining space between two items vertically -->
+ <attr name="android:verticalSpacing" />
<!-- Defining gravity of child view -->
<attr name="android:gravity" />
</declare-styleable>
@@ -249,6 +253,10 @@
<attr name="rowHorizontalGridStyle" format="reference" />
<!-- header style inside a row -->
<attr name="rowHeaderStyle" format="reference" />
+
+ <!-- header description style inside a row -->
+ <attr name="rowHeaderDescriptionStyle" format="reference" />
+
<!-- style for the layout that hosting Header inside a row -->
<attr name="rowHeaderDockStyle" format="reference" />
diff --git a/v17/leanback/res/values/colors.xml b/v17/leanback/res/values/colors.xml
index ec9102c..bebb115 100644
--- a/v17/leanback/res/values/colors.xml
+++ b/v17/leanback/res/values/colors.xml
@@ -20,6 +20,7 @@
<color name="lb_browse_title_color">#EEEEEE</color>
<color name="lb_browse_header_color">#FFFFFF</color>
+ <color name="lb_browse_header_description_color">#AAFFFFFF</color>
<color name="lb_list_item_unselected_text_color">#FFF1F1F1</color>
<color name="lb_background_protection">#99000000</color>
diff --git a/v17/leanback/res/values/dimens.xml b/v17/leanback/res/values/dimens.xml
index e0a366a..3390c66 100644
--- a/v17/leanback/res/values/dimens.xml
+++ b/v17/leanback/res/values/dimens.xml
@@ -38,8 +38,9 @@
<item name="lb_browse_rows_scale" type="fraction">80%</item>
<!-- Derived from the ux spec of 48dp baseline to baseline -->
- <dimen name="lb_browse_headers_vertical_margin">21dp</dimen>
+ <dimen name="lb_browse_headers_vertical_spacing">21dp</dimen>
<dimen name="lb_browse_header_text_size">20sp</dimen>
+ <dimen name="lb_browse_header_description_text_size">14sp</dimen>
<dimen name="lb_browse_header_height">24dp</dimen>
<dimen name="lb_browse_section_header_text_size">16sp</dimen>
<dimen name="lb_browse_header_fading_length">12dp</dimen>
@@ -52,8 +53,8 @@
<dimen name="lb_browse_row_hovercard_max_width">400dp</dimen>
<dimen name="lb_browse_row_hovercard_title_font_size">18sp</dimen>
<dimen name="lb_browse_row_hovercard_description_font_size">14sp</dimen>
- <dimen name="lb_browse_item_horizontal_margin">8dp</dimen>
- <dimen name="lb_browse_item_vertical_margin">8dp</dimen>
+ <dimen name="lb_browse_item_horizontal_spacing">8dp</dimen>
+ <dimen name="lb_browse_item_vertical_spacing">8dp</dimen>
<dimen name="lb_browse_selected_row_top_padding">20dp</dimen>
<dimen name="lb_browse_expanded_selected_row_top_padding">16dp</dimen>
<dimen name="lb_browse_expanded_row_no_hovercard_bottom_padding">28dp</dimen>
@@ -75,7 +76,7 @@
<dimen name="lb_details_overview_description_margin_bottom">12dp</dimen>
<dimen name="lb_details_overview_image_margin_horizontal">24dp</dimen>
<dimen name="lb_details_overview_image_margin_vertical">24dp</dimen>
- <dimen name="lb_details_overview_action_items_margin">16dp</dimen>
+ <dimen name="lb_details_overview_action_items_spacing">16dp</dimen>
<item name="lb_details_overview_action_select_duration" format="integer" type="dimen">150</item>
<dimen name="lb_details_overview_actions_padding_start">294dp</dimen>
<dimen name="lb_details_overview_actions_padding_end">132dp</dimen>
@@ -285,7 +286,9 @@
<!-- end GuidedStepFragment -->
<!-- height for picker item. -->
- <dimen name="picker_item_height">64dp</dimen>
+ <dimen name="picker_item_height">32dp</dimen>
+ <!-- vertical space between two picker item -->
+ <dimen name="picker_item_spacing">32dp</dimen>
<!-- picker column horizontal padding-->
<dimen name="picker_column_horizontal_padding">8dp</dimen>
<!-- picker separator horizontal padding -->
diff --git a/v17/leanback/res/values/styles.xml b/v17/leanback/res/values/styles.xml
index 491364e..717bcfc 100644
--- a/v17/leanback/res/values/styles.xml
+++ b/v17/leanback/res/values/styles.xml
@@ -42,6 +42,11 @@
<style name="TextAppearance.Leanback.Row.Header" parent="TextAppearance.Leanback.Header">
</style>
+ <style name="TextAppearance.Leanback.Row.Header.Description" parent="TextAppearance.Leanback.Header">
+ <item name="android:textSize">@dimen/lb_browse_header_description_text_size</item>
+ <item name="android:textColor">@color/lb_browse_header_description_color</item>
+ </style>
+
<style name="TextAppearance.Leanback.SearchTextEdit" parent="TextAppearance.Leanback">
<item name="android:textSize">@dimen/lb_search_bar_text_size</item>
</style>
@@ -211,7 +216,7 @@
<item name="android:paddingStart">?attr/browsePaddingStart</item>
<item name="focusOutFront">true</item>
<item name="focusOutEnd">true</item>
- <item name="verticalMargin">@dimen/lb_browse_headers_vertical_margin</item>
+ <item name="android:verticalSpacing">@dimen/lb_browse_headers_vertical_spacing</item>
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:contentDescription">@string/lb_navigation_menu_contentDescription</item>
@@ -245,10 +250,10 @@
<item name="android:focusableInTouchMode">true</item>
<item name="android:paddingStart">?attr/browsePaddingStart</item>
<item name="android:paddingEnd">?attr/browsePaddingEnd</item>
- <item name="android:paddingBottom">@dimen/lb_browse_item_vertical_margin</item>
- <item name="android:paddingTop">@dimen/lb_browse_item_vertical_margin</item>
- <item name="horizontalMargin">@dimen/lb_browse_item_horizontal_margin</item>
- <item name="verticalMargin">@dimen/lb_browse_item_vertical_margin</item>
+ <item name="android:paddingBottom">@dimen/lb_browse_item_vertical_spacing</item>
+ <item name="android:paddingTop">@dimen/lb_browse_item_vertical_spacing</item>
+ <item name="android:horizontalSpacing">@dimen/lb_browse_item_horizontal_spacing</item>
+ <item name="android:verticalSpacing">@dimen/lb_browse_item_vertical_spacing</item>
<item name="focusOutFront">true</item>
</style>
@@ -260,8 +265,8 @@
<item name="android:paddingBottom">@dimen/lb_vertical_grid_padding_bottom</item>
<item name="android:paddingTop">?attr/browseRowsMarginTop</item>
<item name="android:gravity">center_horizontal</item>
- <item name="horizontalMargin">@dimen/lb_browse_item_horizontal_margin</item>
- <item name="verticalMargin">@dimen/lb_browse_item_vertical_margin</item>
+ <item name="android:horizontalSpacing">@dimen/lb_browse_item_horizontal_spacing</item>
+ <item name="android:verticalSpacing">@dimen/lb_browse_item_vertical_spacing</item>
<item name="focusOutFront">true</item>
</style>
@@ -269,6 +274,10 @@
<item name="android:textAppearance">@style/TextAppearance.Leanback.Row.Header</item>
</style>
+ <style name="Widget.Leanback.Row.Header.Description" parent="Widget.Leanback.Header">
+ <item name="android:textAppearance">@style/TextAppearance.Leanback.Row.Header.Description</item>
+ </style>
+
<style name="Widget.Leanback.Row.HeaderDock">
<item name="android:paddingStart">?attr/browsePaddingStart</item>
</style>
@@ -571,7 +580,7 @@
<item name="android:focusableInTouchMode">false</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
- <item name="verticalMargin">@dimen/lb_guidedactions_list_vertical_spacing</item>
+ <item name="android:verticalSpacing">@dimen/lb_guidedactions_list_vertical_spacing</item>
<item name="android:paddingStart">@dimen/lb_guidedactions_list_padding_start</item>
<item name="android:paddingEnd">@dimen/lb_guidedactions_list_padding_end</item>
<item name="focusOutEnd">false</item>
diff --git a/v17/leanback/res/values/themes.xml b/v17/leanback/res/values/themes.xml
index cae45ac..231e8bd 100644
--- a/v17/leanback/res/values/themes.xml
+++ b/v17/leanback/res/values/themes.xml
@@ -60,6 +60,7 @@
<item name="browseTitleViewStyle">@style/Widget.Leanback.TitleView</item>
<item name="rowHeaderStyle">@style/Widget.Leanback.Row.Header</item>
+ <item name="rowHeaderDescriptionStyle">@style/Widget.Leanback.Row.Header.Description</item>
<item name="rowHoverCardTitleStyle">@style/Widget.Leanback.Row.HoverCardTitle</item>
<item name="rowHoverCardDescriptionStyle">@style/Widget.Leanback.Row.HoverCardDescription</item>
<item name="rowHeaderDockStyle">@style/Widget.Leanback.Row.HeaderDock</item>
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
index 2ddea53..71e0870 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
@@ -216,7 +216,7 @@
}
}
- final VerticalGridView getVerticalGridView() {
+ public final VerticalGridView getVerticalGridView() {
return mVerticalGridView;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
index 847eb57..f7635ae 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
@@ -218,7 +218,7 @@
}
}
- final VerticalGridView getVerticalGridView() {
+ public final VerticalGridView getVerticalGridView() {
return mVerticalGridView;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/graphics/BoundsRule.java b/v17/leanback/src/android/support/v17/leanback/graphics/BoundsRule.java
new file mode 100644
index 0000000..216beb7
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/graphics/BoundsRule.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+package android.support.v17.leanback.graphics;
+
+import android.graphics.Rect;
+
+/**
+ * This class contains the rules for updating the bounds of a
+ * {@link CompositeDrawable.ChildDrawable}. It contains four rules, one for each value of the
+ * rectangular bound - left/top/right/bottom.
+ */
+public class BoundsRule {
+ static final int INHERIT_PARENT = 0;
+ static final int ABSOLUTE_VALUE = 1;
+ static final int INHERIT_WITH_OFFSET = 2;
+
+ /**
+ * This class represents individual rules for updating the bounds. Currently we support
+ * 3 different rule types -
+ *
+ * <ul>
+ * <li>inheritFromParent: it applies a percentage to the parent property to compute
+ * the final value </li>
+ * <li>absoluteValue: it always used the supplied absolute value</li>
+ * <li>inheritFromParentWithOffset: this uses a combination of INHERIT_PARENT
+ * and ABSOLUTE_VALUE. First it applies the percentage on the parent and then adds the
+ * offset to compute the final value</li>
+ * </ul>
+ */
+ public final static class ValueRule {
+ private final int type;
+ private float fraction;
+ private int absoluteValue;
+
+ ValueRule(int type, int absoluteValue, float fraction) {
+ this.type = type;
+ this.absoluteValue = absoluteValue;
+ this.fraction = fraction;
+ }
+
+ /**
+ * Sets the fractional value (percentage of parent) for this rule.
+ */
+ public void setFraction(float fraction) {
+ this.fraction = fraction;
+ }
+
+ /**
+ * Returns the current fractional value.
+ */
+ public float getFraction() {
+ return fraction;
+ }
+
+ /**
+ * Sets the absolute value for this rule.
+ */
+ public void setAbsoluteValue(int absoluteValue) {
+ this.absoluteValue = absoluteValue;
+ }
+
+ /**
+ * Returns the current absolute value.
+ */
+ public int getAbsoluteValue() {
+ return absoluteValue;
+ }
+ }
+
+ /**
+ * Factory method for creating ValueRule of type INHERIT_FROM_PARENT.
+ */
+ public static ValueRule inheritFromParent(float fraction) {
+ return new ValueRule(INHERIT_PARENT, 0, fraction);
+ }
+
+ /**
+ * Factory method for creating ValueRule of type ABSOLUTE_VALUE.
+ */
+ public static ValueRule absoluteValue(int value) {
+ return new ValueRule(ABSOLUTE_VALUE, value, 0);
+ }
+
+ /**
+ * Factory method for creating ValueRule of type INHERIT_WITH_OFFSET.
+ */
+ public static ValueRule inheritFromParentWithOffset(float fraction, int value) {
+ return new ValueRule(INHERIT_WITH_OFFSET, value, fraction);
+ }
+
+ /**
+ * Takes in the current bounds and sets the final values based on the individual rules in the
+ * result object.
+ *
+ * @param rect Represents the current bounds.
+ * @param result Represents the final bounds.
+ */
+ public void calculateBounds(Rect rect, Rect result) {
+ if (mLeft == null) {
+ result.left = rect.left;
+ } else {
+ result.left = doCalculate(rect.left, mLeft, rect.width());
+ }
+
+ if (mRight == null) {
+ result.right = rect.right;
+ } else {
+ result.right = doCalculate(rect.left, mRight, rect.width());
+ }
+
+ if (mTop == null) {
+ result.top = rect.top;
+ } else {
+ result.top = doCalculate(rect.top, mTop, rect.height());
+ }
+
+ if (mBottom == null) {
+ result.bottom = rect.bottom;
+ } else {
+ result.bottom = doCalculate(rect.top, mBottom, rect.height());
+ }
+ }
+
+ private int doCalculate(int value, ValueRule rule, int size) {
+ int offset = 0;
+ switch(rule.type) {
+ case INHERIT_WITH_OFFSET:
+ offset = rule.absoluteValue;
+ case INHERIT_PARENT:
+ return value + offset + (int)(rule.fraction * size);
+ case ABSOLUTE_VALUE:
+ return rule.absoluteValue;
+ }
+
+ throw new IllegalArgumentException("Invalid type: "+rule.type);
+ }
+
+ /** {@link ValueRule} for left attribute of {@link BoundsRule} */
+ public ValueRule mLeft;
+
+ /** {@link ValueRule} for top attribute of {@link BoundsRule} */
+ public ValueRule mTop;
+
+ /** {@link ValueRule} for right attribute of {@link BoundsRule} */
+ public ValueRule mRight;
+
+ /** {@link ValueRule} for bottom attribute of {@link BoundsRule} */
+ public ValueRule mBottom;
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/graphics/CompositeDrawable.java b/v17/leanback/src/android/support/v17/leanback/graphics/CompositeDrawable.java
new file mode 100644
index 0000000..d7b9b24
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/graphics/CompositeDrawable.java
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+package android.support.v17.leanback.graphics;
+
+import android.annotation.TargetApi;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.util.Property;
+
+import java.util.ArrayList;
+
+/**
+ * Generic drawable class that can be composed of multiple children. Whenever the bounds changes
+ * for this class, it updates those of it's children.
+ */
+@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+public class CompositeDrawable extends Drawable implements Drawable.Callback {
+ protected ArrayList<ChildDrawable> children = new ArrayList();
+
+ /**
+ * Adds the supplied region.
+ */
+ public void addChildDrawable(Drawable drawable) {
+ children.add(new ChildDrawable(drawable, this));
+ drawable.setCallback(this);
+ }
+
+ /**
+ * Returns the {@link Drawable} for the given index.
+ */
+ public Drawable getDrawable(int index) {
+ return children.get(index).mDrawable;
+ }
+
+ /**
+ * Returns the {@link ChildDrawable} at the given index.
+ */
+ public ChildDrawable getChildAt(int index) {
+ return children.get(index);
+ }
+
+ /**
+ * Removes the child corresponding to the given index.
+ */
+ public void removeChild(int index) {
+ children.remove(index);
+ }
+
+ /**
+ * Removes the given region.
+ */
+ public void removeDrawable(Drawable drawable) {
+ for (int i = 0; i < children.size(); i++) {
+ if (drawable == children.get(i).mDrawable) {
+ children.get(i).mDrawable.setCallback(null);
+ children.remove(i);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Returns the total number of children.
+ */
+ public int getChildCount() {
+ return children.size();
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ for (int i = 0; i < children.size(); i++) {
+ children.get(i).mDrawable.draw(canvas);
+ }
+ }
+
+ @Override
+ protected void onBoundsChange(Rect bounds) {
+ super.onBoundsChange(bounds);
+ updateBounds(bounds);
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+ for (int i = 0; i < children.size(); i++) {
+ children.get(i).mDrawable.setColorFilter(colorFilter);
+ }
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.UNKNOWN;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ for (int i = 0; i < children.size(); i++) {
+ children.get(i).mDrawable.setAlpha(alpha);
+ }
+ }
+
+ @Override
+ public void invalidateDrawable(Drawable who) {
+ invalidateSelf();
+ }
+
+ @Override
+ public void scheduleDrawable(Drawable who, Runnable what, long when) {
+ scheduleSelf(what, when);
+ }
+
+ @Override
+ public void unscheduleDrawable(Drawable who, Runnable what) {
+ unscheduleSelf(what);
+ }
+
+ /**
+ * Updates the bounds based on the {@link BoundsRule}.
+ */
+ void updateBounds(Rect bounds) {
+ for (int i = 0; i < children.size(); i++) {
+ ChildDrawable childDrawable = children.get(i);
+ childDrawable.updateBounds(bounds);
+ }
+ }
+
+ /**
+ * Wrapper class holding a drawable object and {@link BoundsRule} to update drawable bounds
+ * when parent bound changes.
+ */
+ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+ public static final class ChildDrawable {
+ private final BoundsRule boundsRule = new BoundsRule();
+ private final Drawable mDrawable;
+ private final Rect adjustedBounds = new Rect();
+ private final CompositeDrawable mParent;
+
+ public ChildDrawable(Drawable drawable, CompositeDrawable parent) {
+ this.mDrawable = drawable;
+ this.mParent = parent;
+ }
+
+ /**
+ * Returns the instance of {@link BoundsRule}.
+ */
+ public BoundsRule getBoundsRule() {
+ return this.boundsRule;
+ }
+
+ /**
+ * Returns the {@link Drawable}.
+ */
+ public Drawable getDrawable() {
+ return mDrawable;
+ }
+
+ /**
+ * Updates the bounds based on the {@link BoundsRule}.
+ */
+ void updateBounds(Rect bounds) {
+ boundsRule.calculateBounds(bounds, adjustedBounds);
+ mDrawable.setBounds(adjustedBounds);
+ }
+
+ /**
+ * After changing the {@link BoundsRule}, user should call this function
+ * for the drawable to recalculate its bounds.
+ */
+ public void recomputeBounds() {
+ updateBounds(mParent.getBounds());
+ }
+
+ /**
+ * Implementation of {@link Property} for overrideTop attribute.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Integer> TOP_ABSOLUTE
+ = new Property<CompositeDrawable.ChildDrawable, Integer>(Integer.class, "absoluteTop") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
+ if (obj.getBoundsRule().mTop == null) {
+ obj.getBoundsRule().mTop = BoundsRule.absoluteValue(value);
+ } else {
+ obj.getBoundsRule().mTop.setAbsoluteValue(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Integer get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mTop.getAbsoluteValue();
+ }
+ };
+
+
+ /**
+ * Implementation of {@link Property} for overrideBottom attribute.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Integer> BOTTOM_ABSOLUTE
+ = new Property<CompositeDrawable.ChildDrawable, Integer>(
+ Integer.class, "absoluteBottom") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
+ if (obj.getBoundsRule().mBottom == null) {
+ obj.getBoundsRule().mBottom = BoundsRule.absoluteValue(value);
+ } else {
+ obj.getBoundsRule().mBottom.setAbsoluteValue(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Integer get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mBottom.getAbsoluteValue();
+ }
+ };
+
+
+ /**
+ * Implementation of {@link Property} for overrideLeft attribute.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Integer> LEFT_ABSOLUTE
+ = new Property<CompositeDrawable.ChildDrawable, Integer>(
+ Integer.class, "absoluteLeft") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
+ if (obj.getBoundsRule().mLeft == null) {
+ obj.getBoundsRule().mLeft = BoundsRule.absoluteValue(value);
+ } else {
+ obj.getBoundsRule().mLeft.setAbsoluteValue(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Integer get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mLeft.getAbsoluteValue();
+ }
+ };
+
+ /**
+ * Implementation of {@link Property} for overrideRight attribute.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Integer> RIGHT_ABSOLUTE
+ = new Property<CompositeDrawable.ChildDrawable, Integer>(
+ Integer.class, "absoluteRight") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
+ if (obj.getBoundsRule().mRight == null) {
+ obj.getBoundsRule().mRight = BoundsRule.absoluteValue(value);
+ } else {
+ obj.getBoundsRule().mRight.setAbsoluteValue(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Integer get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mRight.getAbsoluteValue();
+ }
+ };
+
+ /**
+ * Implementation of {@link Property} for overwriting the bottom attribute of
+ * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
+ * change the bounds rules as a percentage of parent size. This is preferable over
+ * {@see PROPERTY_TOP_ABSOLUTE} when the exact start/end position of scroll movement
+ * isn't available at compile time.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Float> TOP_FRACTION
+ = new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionTop") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Float value) {
+ if (obj.getBoundsRule().mTop == null) {
+ obj.getBoundsRule().mTop = BoundsRule.inheritFromParent(value);
+ } else {
+ obj.getBoundsRule().mTop.setFraction(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Float get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mTop.getFraction();
+ }
+ };
+
+ /**
+ * Implementation of {@link Property} for overwriting the bottom attribute of
+ * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
+ * change the bounds rules as a percentage of parent size. This is preferable over
+ * {@see PROPERTY_BOTTOM_ABSOLUTE} when the exact start/end position of scroll movement
+ * isn't available at compile time.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Float> BOTTOM_FRACTION
+ = new Property<CompositeDrawable.ChildDrawable, Float>(
+ Float.class, "fractionBottom") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Float value) {
+ if (obj.getBoundsRule().mBottom == null) {
+ obj.getBoundsRule().mBottom = BoundsRule.inheritFromParent(value);
+ } else {
+ obj.getBoundsRule().mBottom.setFraction(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Float get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mBottom.getFraction();
+ }
+ };
+
+ /**
+ * Implementation of {@link Property} for overwriting the bottom attribute of
+ * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
+ * change the bounds rules as a percentage of parent size. This is preferable over
+ * {@see PROPERTY_LEFT_ABSOLUTE} when the exact start/end position of scroll movement
+ * isn't available at compile time.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Float> LEFT_FRACTION
+ = new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionLeft") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Float value) {
+ if (obj.getBoundsRule().mLeft == null) {
+ obj.getBoundsRule().mLeft = BoundsRule.inheritFromParent(value);
+ } else {
+ obj.getBoundsRule().mLeft.setFraction(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Float get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mLeft.getFraction();
+ }
+ };
+
+ /**
+ * Implementation of {@link Property} for overwriting the bottom attribute of
+ * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
+ * change the bounds rules as a percentage of parent size. This is preferable over
+ * {@see PROPERTY_RIGHT_ABSOLUTE} when the exact start/end position of scroll movement
+ * isn't available at compile time.
+ */
+ public static final Property<CompositeDrawable.ChildDrawable, Float> RIGHT_FRACTION
+ = new Property<CompositeDrawable.ChildDrawable, Float>(
+ Float.class, "fractoinRight") {
+
+ @Override
+ public void set(CompositeDrawable.ChildDrawable obj, Float value) {
+ if (obj.getBoundsRule().mRight == null) {
+ obj.getBoundsRule().mRight = BoundsRule.inheritFromParent(value);
+ } else {
+ obj.getBoundsRule().mRight.setFraction(value);
+ }
+
+ obj.recomputeBounds();
+ }
+
+ @Override
+ public Float get(CompositeDrawable.ChildDrawable obj) {
+ return obj.getBoundsRule().mRight.getFraction();
+ }
+ };
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/graphics/DetailsBackgroundParallaxHelper.java b/v17/leanback/src/android/support/v17/leanback/graphics/DetailsBackgroundParallaxHelper.java
new file mode 100644
index 0000000..d30dfe2
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/graphics/DetailsBackgroundParallaxHelper.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.graphics;
+
+import android.animation.PropertyValuesHolder;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.v17.leanback.R;
+import android.support.v17.leanback.widget.Parallax;
+import android.support.v17.leanback.widget.ParallaxRecyclerViewSource;
+import android.support.v17.leanback.widget.ParallaxSource;
+import android.support.v7.widget.RecyclerView;
+import android.util.TypedValue;
+
+/**
+ * Helper class responsible for wiring in parallax effect in
+ * {@link android.support.v17.leanback.app.DetailsFragment}. The default effect will render
+ * a drawable like the following -
+ * <pre>
+ * ***************************
+ * * Bitmap *
+ * ***************************
+ * * DetailsOverviewRow *
+ * * *
+ * ***************************
+ * * Solid Color *
+ * * Related *
+ * * Content *
+ * ***************************
+ * </pre>
+ * As the user scrolls through the page, the bounds of the bitmap and related content section
+ * will be updated to simulate the parallax effect. Users have to do the following to setup the
+ * parallax -
+ *
+ * <ul>
+ * <li>First users should use
+ * {@link ParallaxBuilder} class to set the appropriate attributes and call build() to
+ * create an instance of {@link DetailsBackgroundParallaxHelper}. Users must set the RecyclerView
+ * instance on {@link ParallaxBuilder}. Then they should set the drawable obtained by
+ * calling {@link #getDrawable} as the background of their current activity.
+ * <pre>
+ * {@code
+ * public void onStart() {
+ * super.onStart();
+ * mParallaxHelper = DetailsBackgroundParallaxHelper.ParallaxBuilder
+ * .newBuilder()
+ * .setRecyclerView(getRowsFragment().getVerticalGridView())
+ * .setmBitmapMinVerticalOffset(-300)
+ * .build();
+ * mBackgroundManager.setDrawable(mParallaxHelper.getDrawable());
+ * }
+ * }
+ * </pre>
+ * </li>
+ * </li>
+ * <li>Finally, users can set the bitmap through {@link #setBitmap(Bitmap)} call.
+ * <pre>
+ * {@code
+ * public void onBitmapLoaded(Bitmap bitmap) {
+ * mParallaxHelper.setBitmap(bitmap);
+ * }
+ * }
+ * </pre>
+ * </li>
+ * </ul>
+ *
+ * In case the color is not set, it will use defaultBrandColorDark from LeanbackTheme.
+ */
+public final class DetailsBackgroundParallaxHelper {
+ private final RecyclerView mRecyclerView;
+ private Parallax mParallax;
+ private CompositeDrawable mCompositeDrawable;
+ private FitWidthBitmapDrawable mFitWidthBitmapDrawable;
+ private ColorDrawable mSolidColorDrawable;
+ private int minTopCoverImage;
+
+ private DetailsBackgroundParallaxHelper(
+ RecyclerView recyclerView,
+ int minTopCoverImage,
+ int color) {
+ this.mRecyclerView = recyclerView;
+ this.minTopCoverImage = minTopCoverImage;
+ mCompositeDrawable = new CompositeDrawable();
+ mFitWidthBitmapDrawable = new FitWidthBitmapDrawable();
+ mSolidColorDrawable = new ColorDrawable(color);
+ mCompositeDrawable.addChildDrawable(mFitWidthBitmapDrawable);
+ mCompositeDrawable.addChildDrawable(mSolidColorDrawable);
+ mCompositeDrawable.getChildAt(1).getBoundsRule().mTop = BoundsRule.inheritFromParent(1f);
+ setupParallaxEffect();
+ }
+
+ /**
+ * Builder class used for creating an instance of {@link DetailsBackgroundParallaxHelper}.
+ */
+ public static class ParallaxBuilder {
+ // Default value for image translation is -100px.
+ private int mBitmapMinVerticalOffset = -100;
+ private int mColor;
+ private boolean mIsColorSet;
+ private RecyclerView mRecyclerView;
+
+ private ParallaxBuilder() {}
+
+ /**
+ * Returns an instance of itself.
+ */
+ public static ParallaxBuilder newBuilder() {
+ return new ParallaxBuilder();
+ }
+
+ /**
+ * Sets the minimum top position the image is going to translate to during the
+ * parallax motion.
+ */
+ public ParallaxBuilder setBitmapMinVerticalOffset(int minTop) {
+ this.mBitmapMinVerticalOffset = minTop;
+ return this;
+ }
+
+ /**
+ * Sets the color for the bottom section of the
+ * {@link android.support.v17.leanback.app.DetailsFragment}.
+ */
+ public ParallaxBuilder setColor(int color) {
+ this.mColor = color;
+ mIsColorSet = true;
+ return this;
+ }
+
+ /**
+ * Sets the RecyclerView used in the
+ * {@link android.support.v17.leanback.app.DetailsFragment}.
+ */
+ public ParallaxBuilder setRecyclerView(RecyclerView recyclerView) {
+ this.mRecyclerView = recyclerView;
+ return this;
+ }
+
+ /**
+ * Builds and returns an instance of {@link DetailsBackgroundParallaxHelper}.
+ */
+ public DetailsBackgroundParallaxHelper build() {
+ if (mRecyclerView == null) {
+ throw new IllegalArgumentException("Must set RecyclerView!!!");
+ }
+
+ if (!mIsColorSet) {
+ mColor = getDefaultBackgroundColor(mRecyclerView.getContext());
+ }
+
+ return new DetailsBackgroundParallaxHelper(
+ mRecyclerView, mBitmapMinVerticalOffset, mColor);
+ }
+
+ private int getDefaultBackgroundColor(Context context) {
+ TypedValue outValue = new TypedValue();
+ if (context.getTheme().resolveAttribute(R.attr.defaultBrandColorDark, outValue, true)) {
+ return context.getResources().getColor(outValue.resourceId);
+ }
+ return context.getResources().getColor(R.color.lb_default_brand_color_dark);
+ }
+ }
+
+ /**
+ * Returns the special drawable instance that is used to simulate the parallax effect. Users
+ * must set this drawable as the background for their activity.
+ */
+ public Drawable getDrawable() {
+ return mCompositeDrawable;
+ }
+
+ /**
+ * Sets the bitmap in drawable instance returned during {@link #getDrawable()} call.
+ */
+ public void setBitmap(Bitmap bitmap) {
+ if (bitmap == null) {
+ throw new IllegalArgumentException("Invalid bitmap");
+ }
+ mFitWidthBitmapDrawable.setBitmap(bitmap);
+ }
+
+ /**
+ * Changes the background color of the related content section.
+ */
+ public void setColor(@ColorInt int color) {
+ mSolidColorDrawable.setColor(color);
+ }
+
+ private void setupParallaxEffect() {
+ ParallaxRecyclerViewSource parallaxSource = new ParallaxRecyclerViewSource(
+ mRecyclerView);
+ ParallaxSource.IntVariable frameTop = parallaxSource.addVariable(
+ 0 /* adapter pos */,
+ R.id.details_frame /* view id */,
+ 0 /* offset */,
+ 0f /* fraction */);
+
+ ParallaxSource.IntVariable frameBottom = parallaxSource.addVariable(
+ 0 /* adapter pos */,
+ R.id.details_frame /* view id */,
+ 0 /* offset */,
+ 1.0f /* fraction */);
+
+ mParallax = new Parallax();
+ mParallax.setSource(parallaxSource);
+
+ // Add bitmap effect.
+ mParallax.addEffect(frameTop.at(0, 0.5f), frameTop.at(0, 0f))
+ .target(mFitWidthBitmapDrawable,
+ PropertyValuesHolder.ofInt("verticalOffset", 0, minTopCoverImage))
+ .target(mCompositeDrawable.getChildAt(0),
+ PropertyValuesHolder.ofFloat(
+ CompositeDrawable.ChildDrawable.BOTTOM_FRACTION, 0.5f, 0f));
+
+ // Add solid color effect.
+ mParallax.addEffect(frameBottom.at(0, 1f), frameBottom.at(0, 0f))
+ .target(mCompositeDrawable.getChildAt(1),
+ PropertyValuesHolder.ofFloat(
+ CompositeDrawable.ChildDrawable.TOP_FRACTION, 1f, 0f));
+ }
+}
+
diff --git a/v17/leanback/src/android/support/v17/leanback/graphics/FitWidthBitmapDrawable.java b/v17/leanback/src/android/support/v17/leanback/graphics/FitWidthBitmapDrawable.java
new file mode 100644
index 0000000..69a1347
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/graphics/FitWidthBitmapDrawable.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+package android.support.v17.leanback.graphics;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+
+/**
+ * Subclass of {@link Drawable} that can be used to draw a bitmap into a region. Bitmap
+ * will be scaled to fit the full width of the region and will be aligned to the top left corner.
+ * Any region outside the bounds will be clipped during {@link #draw(Canvas)} call. Top
+ * position of the bitmap can be controlled by {@link #setVerticalOffset(int)} call.
+ */
+public class FitWidthBitmapDrawable extends Drawable {
+ private final Rect mDest = new Rect();
+ private Paint mPaint = new Paint();
+ private Bitmap mBitmap;
+ private Rect mSource;
+ private final Rect mDefaultSource = new Rect();
+ private int mOffset;
+
+ /**
+ * Constructor.
+ */
+ public FitWidthBitmapDrawable() {
+ }
+
+ /**
+ * Sets the bitmap.
+ */
+ public void setBitmap(Bitmap bitmap) {
+ this.mBitmap = bitmap;
+ if (bitmap != null) {
+ this.mDefaultSource.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
+ } else {
+ this.mDefaultSource.set(0, 0, 0, 0);
+ }
+ mSource = null;
+ }
+
+ /**
+ * Returns the bitmap.
+ */
+ public Bitmap getBitmap() {
+ return mBitmap;
+ }
+
+ /**
+ * Sets the {@link Rect} used for extracting the bitmap.
+ */
+ public void setSource(Rect source) {
+ this.mSource = source;
+ }
+
+ /**
+ * Returns the {@link Rect} used for extracting the bitmap.
+ */
+ public Rect getSource() {
+ return mSource;
+ }
+
+ /**
+ * Sets the vertical offset which will be used for drawing the bitmap. The bitmap drawing
+ * will start the provided vertical offset.
+ */
+ public void setVerticalOffset(int offset) {
+ this.mOffset = offset;
+ invalidateSelf();
+ }
+
+ /**
+ * Returns the current vertical offset.
+ */
+ public int getVerticalOffset() {
+ return this.mOffset;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ if (mBitmap != null) {
+ Rect bounds = getBounds();
+ mDest.left = 0;
+ mDest.top = mOffset;
+ mDest.right = bounds.width();
+
+ Rect source = validateSource();
+ float scale = (float) bounds.width() / source.width();
+ mDest.bottom = mDest.top + (int) (source.height() * scale);
+ int i = canvas.save();
+ canvas.clipRect(bounds);
+ canvas.drawBitmap(mBitmap, source, mDest, mPaint);
+ canvas.restoreToCount(i);
+ }
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ final int oldAlpha = mPaint.getAlpha();
+ if (alpha != oldAlpha) {
+ mPaint.setAlpha(alpha);
+ invalidateSelf();
+ }
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+ mPaint.setColorFilter(colorFilter);
+ invalidateSelf();
+ }
+
+ @Override
+ public int getOpacity() {
+ return (mBitmap == null || mBitmap.hasAlpha() || mPaint.getAlpha() < 255) ?
+ PixelFormat.TRANSLUCENT : PixelFormat.OPAQUE;
+ }
+
+
+ private Rect validateSource() {
+ if (mSource == null) {
+ return mDefaultSource;
+ } else {
+ return mSource;
+ }
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
index 013060f..1578085 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
@@ -222,10 +222,12 @@
boolean throughSideStart = a.getBoolean(R.styleable.lbBaseGridView_focusOutSideStart, true);
boolean throughSideEnd = a.getBoolean(R.styleable.lbBaseGridView_focusOutSideEnd, true);
mLayoutManager.setFocusOutSideAllowed(throughSideStart, throughSideEnd);
- mLayoutManager.setVerticalMargin(
- a.getDimensionPixelSize(R.styleable.lbBaseGridView_verticalMargin, 0));
- mLayoutManager.setHorizontalMargin(
- a.getDimensionPixelSize(R.styleable.lbBaseGridView_horizontalMargin, 0));
+ mLayoutManager.setVerticalSpacing(
+ a.getDimensionPixelSize(R.styleable.lbBaseGridView_android_verticalSpacing,
+ a.getDimensionPixelSize(R.styleable.lbBaseGridView_verticalMargin, 0)));
+ mLayoutManager.setHorizontalSpacing(
+ a.getDimensionPixelSize(R.styleable.lbBaseGridView_android_horizontalSpacing,
+ a.getDimensionPixelSize(R.styleable.lbBaseGridView_horizontalMargin, 0)));
if (a.hasValue(R.styleable.lbBaseGridView_android_gravity)) {
setGravity(a.getInt(R.styleable.lbBaseGridView_android_gravity, Gravity.NO_GRAVITY));
}
@@ -426,41 +428,86 @@
}
/**
- * Sets the margin in pixels between two child items.
+ * Sets the spacing in pixels between two child items.
+ * @deprecated use {@link #setItemSpacing(int)}
*/
+ @Deprecated
public void setItemMargin(int margin) {
- mLayoutManager.setItemMargin(margin);
+ setItemSpacing(margin);
+ }
+
+ /**
+ * Sets the spacing in pixels between two child items.
+ */
+ public void setItemSpacing(int spacing) {
+ mLayoutManager.setItemSpacing(spacing);
requestLayout();
}
/**
- * Sets the margin in pixels between two child items vertically.
+ * Sets the spacing in pixels between two child items vertically.
+ * @deprecated Use {@link #setVerticalSpacing(int)}
*/
+ @Deprecated
public void setVerticalMargin(int margin) {
- mLayoutManager.setVerticalMargin(margin);
- requestLayout();
+ setVerticalSpacing(margin);
}
/**
- * Returns the margin in pixels between two child items vertically.
+ * Returns the spacing in pixels between two child items vertically.
+ * @deprecated Use {@link #getVerticalSpacing()}
*/
+ @Deprecated
public int getVerticalMargin() {
- return mLayoutManager.getVerticalMargin();
+ return mLayoutManager.getVerticalSpacing();
}
/**
- * Sets the margin in pixels between two child items horizontally.
+ * Sets the spacing in pixels between two child items horizontally.
+ * @deprecated Use {@link #setHorizontalSpacing(int)}
*/
+ @Deprecated
public void setHorizontalMargin(int margin) {
- mLayoutManager.setHorizontalMargin(margin);
+ setHorizontalSpacing(margin);
+ }
+
+ /**
+ * Returns the spacing in pixels between two child items horizontally.
+ * @deprecated Use {@link #getHorizontalSpacing()}
+ */
+ @Deprecated
+ public int getHorizontalMargin() {
+ return mLayoutManager.getHorizontalSpacing();
+ }
+
+ /**
+ * Sets the spacing in pixels between two child items vertically.
+ */
+ public void setVerticalSpacing(int spacing) {
+ mLayoutManager.setVerticalSpacing(spacing);
requestLayout();
}
/**
- * Returns the margin in pixels between two child items horizontally.
+ * Returns the spacing in pixels between two child items vertically.
*/
- public int getHorizontalMargin() {
- return mLayoutManager.getHorizontalMargin();
+ public int getVerticalSpacing() {
+ return mLayoutManager.getVerticalSpacing();
+ }
+
+ /**
+ * Sets the spacing in pixels between two child items horizontally.
+ */
+ public void setHorizontalSpacing(int spacing) {
+ mLayoutManager.setHorizontalSpacing(spacing);
+ requestLayout();
+ }
+
+ /**
+ * Returns the spacing in pixels between two child items horizontally.
+ */
+ public int getHorizontalSpacing() {
+ return mLayoutManager.getHorizontalSpacing();
}
/**
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
index 5df965d..64d151f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
@@ -107,7 +107,7 @@
protected Provider mProvider;
protected boolean mReversedFlow;
- protected int mMargin;
+ protected int mSpacing;
protected int mNumRows;
protected int mFirstVisibleIndex = -1;
protected int mLastVisibleIndex = -1;
@@ -133,10 +133,10 @@
}
/**
- * Sets the margin between items in a row
+ * Sets the space between items in a row
*/
- public final void setMargin(int margin) {
- mMargin = margin;
+ public final void setSpacing(int spacing) {
+ mSpacing = spacing;
}
/**
@@ -292,8 +292,8 @@
if (mLastVisibleIndex < 0) {
return false;
}
- return mReversedFlow ? findRowMin(true, null) <= toLimit + mMargin :
- findRowMax(false, null) >= toLimit - mMargin;
+ return mReversedFlow ? findRowMin(true, null) <= toLimit + mSpacing :
+ findRowMax(false, null) >= toLimit - mSpacing;
}
/**
@@ -303,8 +303,8 @@
if (mLastVisibleIndex < 0) {
return false;
}
- return mReversedFlow ? findRowMax(false, null) >= toLimit - mMargin :
- findRowMin(true, null) <= toLimit + mMargin;
+ return mReversedFlow ? findRowMax(false, null) >= toLimit - mSpacing :
+ findRowMin(true, null) <= toLimit + mSpacing;
}
/**
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
index 1c6c4b0..754a841 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -516,19 +516,19 @@
/**
* Margin between items.
*/
- private int mHorizontalMargin;
+ private int mHorizontalSpacing;
/**
* Margin between items vertically.
*/
- private int mVerticalMargin;
+ private int mVerticalSpacing;
/**
* Margin in main direction.
*/
- private int mMarginPrimary;
+ private int mSpacingPrimary;
/**
* Margin in second direction.
*/
- private int mMarginSecondary;
+ private int mSpacingSecondary;
/**
* How to position child in secondary direction.
*/
@@ -758,33 +758,33 @@
}
}
- public void setItemMargin(int margin) {
- mVerticalMargin = mHorizontalMargin = margin;
- mMarginPrimary = mMarginSecondary = margin;
+ public void setItemSpacing(int space) {
+ mVerticalSpacing = mHorizontalSpacing = space;
+ mSpacingPrimary = mSpacingSecondary = space;
}
- public void setVerticalMargin(int margin) {
- if (mOrientation == HORIZONTAL) {
- mMarginSecondary = mVerticalMargin = margin;
+ public void setVerticalSpacing(int space) {
+ if (mOrientation == VERTICAL) {
+ mSpacingPrimary = mVerticalSpacing = space;
} else {
- mMarginPrimary = mVerticalMargin = margin;
+ mSpacingSecondary = mVerticalSpacing = space;
}
}
- public void setHorizontalMargin(int margin) {
+ public void setHorizontalSpacing(int space) {
if (mOrientation == HORIZONTAL) {
- mMarginPrimary = mHorizontalMargin = margin;
+ mSpacingPrimary = mHorizontalSpacing = space;
} else {
- mMarginSecondary = mHorizontalMargin = margin;
+ mSpacingSecondary = mHorizontalSpacing = space;
}
}
- public int getVerticalMargin() {
- return mVerticalMargin;
+ public int getVerticalSpacing() {
+ return mVerticalSpacing;
}
- public int getHorizontalMargin() {
- return mHorizontalMargin;
+ public int getHorizontalSpacing() {
+ return mHorizontalSpacing;
}
public void setGravity(int gravity) {
@@ -1095,7 +1095,7 @@
!mForceFullLayout && mGrid != null && mGrid.getNumRows() == mNumRows) {
updateScrollController();
updateScrollSecondAxis();
- mGrid.setMargin(mMarginPrimary);
+ mGrid.setSpacing(mSpacingPrimary);
if (!focusViewWasInTree && mFocusPosition != NO_POSITION) {
mGrid.setStart(mFocusPosition);
}
@@ -1112,7 +1112,7 @@
}
initScrollController();
updateScrollSecondAxis();
- mGrid.setMargin(mMarginPrimary);
+ mGrid.setSpacing(mSpacingPrimary);
detachAndScrapAttachedViews(mRecycler);
mGrid.resetVisibleIndex();
if (mFocusPosition == NO_POSITION) {
@@ -1148,11 +1148,11 @@
// in RTL flow
if (mReverseFlowSecondary) {
for (int i = mNumRows-1; i > rowIndex; i--) {
- start += getRowSizeSecondary(i) + mMarginSecondary;
+ start += getRowSizeSecondary(i) + mSpacingSecondary;
}
} else {
for (int i = 0; i < rowIndex; i++) {
- start += getRowSizeSecondary(i) + mMarginSecondary;
+ start += getRowSizeSecondary(i) + mSpacingSecondary;
}
}
return start;
@@ -1355,7 +1355,7 @@
mFixedRowSizeSecondary = mRowSizeSecondaryRequested == 0 ?
sizeSecondary - paddingSecondary: mRowSizeSecondaryRequested;
mNumRows = mNumRowsRequested == 0 ? 1 : mNumRowsRequested;
- measuredSizeSecondary = mFixedRowSizeSecondary * mNumRows + mMarginSecondary
+ measuredSizeSecondary = mFixedRowSizeSecondary * mNumRows + mSpacingSecondary
* (mNumRows - 1) + paddingSecondary;
break;
case MeasureSpec.AT_MOST:
@@ -1365,11 +1365,11 @@
mFixedRowSizeSecondary = sizeSecondary - paddingSecondary;
} else if (mNumRowsRequested == 0) {
mFixedRowSizeSecondary = mRowSizeSecondaryRequested;
- mNumRows = (sizeSecondary + mMarginSecondary)
- / (mRowSizeSecondaryRequested + mMarginSecondary);
+ mNumRows = (sizeSecondary + mSpacingSecondary)
+ / (mRowSizeSecondaryRequested + mSpacingSecondary);
} else if (mRowSizeSecondaryRequested == 0) {
mNumRows = mNumRowsRequested;
- mFixedRowSizeSecondary = (sizeSecondary - paddingSecondary - mMarginSecondary
+ mFixedRowSizeSecondary = (sizeSecondary - paddingSecondary - mSpacingSecondary
* (mNumRows - 1)) / mNumRows;
} else {
mNumRows = mNumRowsRequested;
@@ -1377,7 +1377,7 @@
}
measuredSizeSecondary = sizeSecondary;
if (modeSecondary == MeasureSpec.AT_MOST) {
- int childrenSize = mFixedRowSizeSecondary * mNumRows + mMarginSecondary
+ int childrenSize = mFixedRowSizeSecondary * mNumRows + mSpacingSecondary
* (mNumRows - 1) + paddingSecondary;
if (childrenSize < measuredSizeSecondary) {
measuredSizeSecondary = childrenSize;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/HeaderItem.java b/v17/leanback/src/android/support/v17/leanback/widget/HeaderItem.java
index f4e5954..00c4660 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/HeaderItem.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/HeaderItem.java
@@ -23,6 +23,7 @@
private final long mId;
private final String mName;
+ private CharSequence mDescription;
private CharSequence mContentDescription;
/**
@@ -70,4 +71,19 @@
public void setContentDescription(CharSequence contentDescription) {
mContentDescription = contentDescription;
}
+
+ /**
+ * Sets the description for the current header item. This will be visible when
+ * the row receives focus.
+ */
+ public void setDescription(CharSequence description) {
+ this.mDescription = description;
+ }
+
+ /**
+ * Returns the description for the current row.
+ */
+ public CharSequence getDescription() {
+ return mDescription;
+ }
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/MediaRowFocusView.java b/v17/leanback/src/android/support/v17/leanback/widget/MediaRowFocusView.java
index 6ec93f2..1418a2a 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/MediaRowFocusView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/MediaRowFocusView.java
@@ -23,6 +23,7 @@
/**
* Creates a view for a media item row in a playlist
+ * @hide
*/
class MediaRowFocusView extends View {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/Parallax.java b/v17/leanback/src/android/support/v17/leanback/widget/Parallax.java
new file mode 100644
index 0000000..03d4f8b
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/Parallax.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import android.support.v17.leanback.widget.ParallaxSource.IntVariableKeyValue;
+import android.support.v17.leanback.widget.ParallaxSource.FloatVariableKeyValue;
+import android.support.v17.leanback.widget.ParallaxEffect.FloatEffect;
+import android.support.v17.leanback.widget.ParallaxEffect.IntEffect;
+
+/**
+ * Parallax listens to {@link ParallaxSource} changes and invokes performMapping on each
+ * {@link ParallaxEffect} object.
+ */
+public final class Parallax {
+
+ private ParallaxSource mSource;
+ private final List<ParallaxEffect> mEffects = new ArrayList<ParallaxEffect>(4);
+
+ private final ParallaxSource.Listener mSourceListener = new ParallaxSource.Listener() {
+ @Override
+ public void onVariableChanged(ParallaxSource source) {
+ for (int i = 0; i < mEffects.size(); i++) {
+ mEffects.get(i).performMapping(source);
+ }
+ }
+ };
+
+ /**
+ * Sets a {@link ParallaxSource} object and starts listening on it. Stops listening to the
+ * previous {@link ParallaxSource} object if it exists.
+ *
+ * @param source New {@link ParallaxSource} object.
+ */
+ public void setSource(ParallaxSource source) {
+ if (mSource != null) {
+ mSource.setListener(null);
+ }
+ mSource = source;
+ if (mSource != null) {
+ mSource.setListener(mSourceListener);
+ }
+ }
+
+ /**
+ * Gets the current {@link ParallaxSource} object.
+ *
+ * @return The current {@link ParallaxSource} Object.
+ */
+ public ParallaxSource getSource() {
+ return mSource;
+ }
+
+ /**
+ * Adds a {@link ParallaxEffect} object which defines rules to perform mapping from
+ * {@link ParallaxSource} to multiple {@link ParallaxTarget}s.
+ *
+ * @param effect A {@link ParallaxEffect} object.
+ */
+ public void addEffect(ParallaxEffect effect) {
+ mEffects.add(effect);
+ }
+
+ /**
+ * Returns a list of {@link ParallaxEffect} object which defines rules to perform mapping from
+ * {@link ParallaxSource} to multiple {@link ParallaxTarget}s.
+ *
+ * @return A list of {@link ParallaxEffect} object.
+ */
+ public List<ParallaxEffect> getEffects() {
+ return mEffects;
+ }
+
+ /**
+ * Remove the {@link ParallaxEffect} object.
+ *
+ * @param effect The {@link ParallaxEffect} object to remove.
+ */
+ public void removeEffect(ParallaxEffect effect) {
+ mEffects.remove(effect);
+ }
+
+ /**
+ * Remove all {@link ParallaxEffect} objects.
+ */
+ public void removeAllEffects() {
+ mEffects.clear();
+ }
+
+ /**
+ * Create a {@link ParallaxEffect} object that will track source variable changes within a
+ * provided set of ranges.
+ *
+ * @param ranges A list of key values that defines the ranges.
+ * @return Newly created ParallaxEffect object.
+ */
+ public ParallaxEffect addEffect(IntVariableKeyValue... ranges) {
+ IntEffect effect = new IntEffect();
+ effect.setVariableRanges(ranges);
+ addEffect(effect);
+ return effect;
+ }
+
+ /**
+ * Create a {@link ParallaxEffect} object that will track source variable changes within a
+ * provided set of ranges.
+ *
+ * @param ranges A list of key values that defines the ranges.
+ * @return Newly created ParallaxEffect object.
+ */
+ public ParallaxEffect addEffect(FloatVariableKeyValue... ranges) {
+ FloatEffect effect = new FloatEffect();
+ effect.setVariableRanges(ranges);
+ addEffect(effect);
+ return effect;
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ParallaxEffect.java b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxEffect.java
new file mode 100644
index 0000000..8805b23
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxEffect.java
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.widget.ParallaxSource.FloatVariable;
+import android.support.v17.leanback.widget.ParallaxSource.FloatVariableKeyValue;
+import android.support.v17.leanback.widget.ParallaxSource.IntVariable;
+import android.support.v17.leanback.widget.ParallaxSource.IntVariableKeyValue;
+import android.support.v17.leanback.widget.ParallaxSource.Variable;
+import android.support.v17.leanback.widget.ParallaxSource.VariableKeyValue;
+
+import android.animation.PropertyValuesHolder;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * ParallaxEffect class drives changes in {@link ParallaxTarget} in response to changes in
+ * variables defined in {@link ParallaxSource}.
+ * <p>
+ * ParallaxEffect has a list of {@link VariableKeyValue}s which represents the range of values that
+ * source variables can take. The main function is
+ * {@link ParallaxEffect#performMapping(ParallaxSource)} which computes a fraction between 0 and 1
+ * based on the current values of variables in {@link ParallaxSource}. As the parallax effect goes
+ * on, the fraction increases from 0 at beginning to 1 at the end. Then the fraction is passed on
+ * to {@link ParallaxTarget#update(float)}.
+ * <p>
+ * ParallaxEffect has two concrete subclasses, {@link IntEffect} and {@link FloatEffect}.
+ */
+public abstract class ParallaxEffect<ParallaxEffectT extends ParallaxEffect,
+ VariableKeyValueT extends ParallaxSource.VariableKeyValue> {
+
+ final List<VariableKeyValueT> mKeyValues = new ArrayList<VariableKeyValueT>(2);
+ final List<Float> mWeights = new ArrayList<Float>(2);
+ final List<Float> mTotalWeights = new ArrayList<Float>(2);
+ final List<ParallaxTarget> mTargets = new ArrayList<ParallaxTarget>(4);
+
+ /**
+ * Returns the list of {@link VariableKeyValue}s, which represents the range of values that
+ * source variables can take.
+ *
+ * @return A list of {@link VariableKeyValue}s.
+ * @see #performMapping(ParallaxSource)
+ */
+ public final List<VariableKeyValueT> getVariableRanges() {
+ return mKeyValues;
+ }
+
+ /**
+ * Returns a list of Float objects that represents weight associated with each variable range.
+ * Weights are used when there are three or more key values.
+ *
+ * @return A list of Float objects that represents weight associated with each variable range.
+ * @hide
+ */
+ public final List<Float> getWeights() {
+ return mWeights;
+ }
+
+ /**
+ * Sets the list of {@link VariableKeyValue}s, which represents the range of values that
+ * source variables can take.
+ *
+ * @param keyValues A list of {@link VariableKeyValue}s.
+ * @see #performMapping(ParallaxSource)
+ */
+ public final void setVariableRanges(VariableKeyValueT... keyValues) {
+ mKeyValues.clear();
+ for (VariableKeyValueT keyValue : keyValues) {
+ mKeyValues.add(keyValue);
+ }
+ }
+
+ /**
+ * Sets a list of Float objects that represents weight associated with each variable range.
+ * Weights are used when there are three or more key values.
+ *
+ * @param weights A list of Float objects that represents weight associated with each variable
+ * range.
+ * @hide
+ */
+ public final void setWeights(float... weights) {
+ for (float weight : weights) {
+ if (weight <= 0) {
+ throw new IllegalArgumentException();
+ }
+ }
+ mWeights.clear();
+ mTotalWeights.clear();
+ float totalWeight = 0f;
+ for (float weight : weights) {
+ mWeights.add(weight);
+ totalWeight += weight;
+ mTotalWeights.add(totalWeight);
+ }
+ }
+
+ /**
+ * Sets a list of Float objects that represents weight associated with each variable range.
+ * Weights are used when there are three or more key values.
+ *
+ * @param weights A list of Float objects that represents weight associated with each variable
+ * range.
+ * @return This ParallaxEffect object, allowing calls to methods in this class to be chained.
+ * @hide
+ */
+ public final ParallaxEffect weights(float... weights) {
+ setWeights(weights);
+ return this;
+ }
+
+ /**
+ * Add a ParallaxTarget to run parallax effect.
+ *
+ * @param target ParallaxTarget to add.
+ */
+ public final void addTarget(ParallaxTarget target) {
+ mTargets.add(target);
+ }
+
+ /**
+ * Add a ParallaxTarget to run parallax effect.
+ *
+ * @param target ParallaxTarget to add.
+ * @return This ParallaxEffect object, allowing calls to methods in this class to be chained.
+ */
+ public final ParallaxEffect target(ParallaxTarget target) {
+ mTargets.add(target);
+ return this;
+ }
+
+ /**
+ * Creates a {@link ParallaxTarget} from {@link PropertyValuesHolder} and adds it to the list
+ * of targets.
+ *
+ * @param targetObject Target object for PropertyValuesHolderTarget.
+ * @param values PropertyValuesHolder for PropertyValuesHolderTarget.
+ * @return This ParallaxEffect object, allowing calls to methods in this class to be chained.
+ */
+ public final ParallaxEffect target(Object targetObject, PropertyValuesHolder values) {
+ mTargets.add(new ParallaxTarget.PropertyValuesHolderTarget(targetObject, values));
+ return this;
+ }
+
+ /**
+ * Returns the list of {@link ParallaxTarget} objects.
+ *
+ * @return The list of {@link ParallaxTarget} objects.
+ */
+ public final List<ParallaxTarget> getTargets() {
+ return mTargets;
+ }
+
+ /**
+ * Remove a {@link ParallaxTarget} object from the list.
+ * @param target The {@link ParallaxTarget} object to be removed.
+ */
+ public final void removeTarget(ParallaxTarget target) {
+ mTargets.remove(target);
+ }
+
+ /**
+ * Perform mapping from {@link ParallaxSource} to list of {@link ParallaxTarget}.
+ */
+ public final void performMapping(ParallaxSource source) {
+ if (mKeyValues.size() < 2) {
+ return;
+ }
+ float fraction = calculateFraction(source);
+ for (int i = 0; i < mTargets.size(); i++) {
+ mTargets.get(i).update(fraction);
+ }
+ }
+
+ /**
+ * This method is expected to compute a fraction between 0 and 1 based on the current values of
+ * variables in {@link ParallaxSource}. As the parallax effect goes on, the fraction increases
+ * from 0 at beginning to 1 at the end.
+ *
+ * @return Float value between 0 and 1.
+ */
+ protected abstract float calculateFraction(ParallaxSource source);
+
+ private static int getVariableIndex(Variable variable) {
+ List<Variable> variables = variable.getSource().getVariables();
+ return variables == null ? -1 : variables.indexOf(variable);
+ }
+
+ /**
+ * When there are multiple ranges (aka three or more keyvalues), this method adjust the
+ * fraction inside a range to fraction of whole range.
+ * e.g. four key values, three weight values: 6, 2, 2. totalWeights are 6, 8, 10
+ * When keyValueIndex is 3, the fraction is inside last range.
+ * adjusted_fraction = 8 / 10 + 2 / 10 * fraction.
+ */
+ final float getFractionWithWeightAdjusted(float fraction, int keyValueIndex) {
+ // when there are three or more KeyValues, take weight into consideration.
+ if (mKeyValues.size() >= 3) {
+ final boolean hasWeightsDefined = mWeights.size() == mKeyValues.size() - 1;
+ if (hasWeightsDefined) {
+ // use weights user defined
+ final float allWeights = mTotalWeights.get(mTotalWeights.size() - 1);
+ fraction = fraction * mWeights.get(keyValueIndex - 1) / allWeights;
+ if (keyValueIndex >= 2) {
+ fraction += mTotalWeights.get(keyValueIndex - 2) / allWeights;
+ }
+ } else {
+ // assume each range has same weight.
+ final float allWeights = mKeyValues.size() - 1;
+ fraction = fraction / allWeights;
+ if (keyValueIndex >= 2) {
+ fraction += (float)(keyValueIndex - 1) / allWeights;
+ }
+ }
+ }
+ return fraction;
+ }
+
+ /**
+ * Implementation of {@link ParallaxEffect} for integer type.
+ */
+ public static final class IntEffect extends ParallaxEffect<IntEffect, IntVariableKeyValue> {
+
+ @Override
+ protected float calculateFraction(ParallaxSource s) {
+ ParallaxSource<IntVariable> source = (ParallaxSource<IntVariable>) s;
+ ParallaxSource.verifyIntVariables(source.getVariables());
+ int lastIndex = 0;
+ int lastValue = 0;
+ int lastKeyValue = 0;
+ // go through all KeyValues, find first KeyValue that current value is less than.
+ for (int i = 0; i < mKeyValues.size(); i++) {
+ IntVariableKeyValue k = mKeyValues.get(i);
+ int index = getVariableIndex(k.getVariable());
+ int keyValue = k.getIntValue();
+ int currentValue = k.getVariable().getIntValue();
+
+ float fraction;
+ if (i == 0) {
+ if (currentValue >= keyValue) {
+ return 0f;
+ }
+ } else {
+ if (lastIndex == index && lastKeyValue < keyValue) {
+ throw new IllegalStateException("KeyValue of same variable must be "
+ + "descendant order");
+ }
+ if (currentValue == IntVariable.UNKNOWN_AFTER) {
+ // Implies lastValue is less than lastKeyValue and lastValue is not
+ // UNKNWON_AFTER. Estimates based on distance of two variables is screen
+ // size.
+ fraction = (float)(lastKeyValue - lastValue) /
+ source.getMaxParentVisibleSize().getIntValue();
+ return getFractionWithWeightAdjusted(fraction, i);
+ } else if (currentValue >= keyValue) {
+ if (lastIndex == index) {
+ // same variable index, same UI element at two different KeyValues,
+ // e.g. UI element moves from lastkeyValue=500 to keyValue=0,
+ // fraction moves from 0 to 1.
+ fraction = (float) (lastKeyValue - currentValue)
+ / (lastKeyValue - keyValue);
+ } else if (lastValue != IntVariable.UNKNOWN_BEFORE) {
+ // e.g. UIElement_1 at 300 scroll to UIElement_2 at 400, figure out when
+ // UIElement_1 is at keyValue=300, keyValue of UIElement_2 by adding
+ // delta of values to keyValue of UIElement_2.
+ lastKeyValue = lastKeyValue + (currentValue - lastValue);
+ fraction = (float) (lastKeyValue - currentValue)
+ / (lastKeyValue - keyValue);
+ } else {
+ // Last variable is UNKNOWN_BEFORE. Estimates based on assumption total
+ // travel distance from last variable to this variable is screen visible
+ // size.
+ fraction = 1f - (float) (currentValue - keyValue)
+ / source.getMaxParentVisibleSize().getIntValue();
+ }
+ return getFractionWithWeightAdjusted(fraction, i);
+ }
+ }
+ lastValue = currentValue;
+ lastIndex = index;
+ lastKeyValue = keyValue;
+ }
+ return 1f;
+ }
+ }
+
+ /**
+ * Implementation of {@link ParallaxEffect} for float type.
+ */
+ public static final class FloatEffect extends ParallaxEffect<FloatEffect,
+ FloatVariableKeyValue> {
+
+ @Override
+ protected float calculateFraction(ParallaxSource s) {
+ ParallaxSource<FloatVariable> source = (ParallaxSource<FloatVariable>) s;
+ ParallaxSource.verifyFloatVariables(source.getVariables());
+ int lastIndex = 0;
+ float lastValue = 0;
+ float lastKeyValue = 0;
+ // go through all KeyValues, find first KeyValue that current value is less than.
+ for (int i = 0; i < mKeyValues.size(); i++) {
+ FloatVariableKeyValue k = mKeyValues.get(i);
+ int index = getVariableIndex(k.getVariable());
+ float keyValue = k.getFloatValue();
+ float currentValue = k.getVariable().getFloatValue();
+
+ float fraction;
+ if (i == 0) {
+ if (currentValue >= keyValue) {
+ return 0f;
+ }
+ } else {
+ if (lastIndex == index && lastKeyValue < keyValue) {
+ throw new IllegalStateException("KeyValue of same variable must be "
+ + "descendant order");
+ }
+ if (currentValue == FloatVariable.UNKNOWN_AFTER) {
+ // Implies lastValue is less than lastKeyValue and lastValue is not
+ // UNKNWON_AFTER. Estimates based on distance of two variables is screen
+ // size.
+ fraction = (float)(lastKeyValue - lastValue) /
+ source.getMaxParentVisibleSize().getFloatValue();
+ return getFractionWithWeightAdjusted(fraction, i);
+ } else if (currentValue >= keyValue) {
+ if (lastIndex == index) {
+ // same variable index, same UI element at two different KeyValues,
+ // e.g. UI element moves from lastkeyValue=500 to keyValue=0,
+ // fraction moves from 0 to 1.
+ fraction = (float) (lastKeyValue - currentValue)
+ / (lastKeyValue - keyValue);
+ } else if (lastValue != FloatVariable.UNKNOWN_BEFORE) {
+ // e.g. UIElement_1 at 300 scroll to UIElement_2 at 400, figure out when
+ // UIElement_1 is at keyValue=300, keyValue of UIElement_2 by adding
+ // delta of values to keyValue of UIElement_2.
+ lastKeyValue = lastKeyValue + (currentValue - lastValue);
+ fraction = (float) (lastKeyValue - currentValue)
+ / (lastKeyValue - keyValue);
+ } else {
+ // Last variable is UNKNOWN_BEFORE. Estimates based on assumption total
+ // travel distance from last variable to this variable is screen visible
+ // size.
+ fraction = 1f - (float) (currentValue - keyValue)
+ / source.getMaxParentVisibleSize().getFloatValue();
+ }
+ return getFractionWithWeightAdjusted(fraction, i);
+ }
+ }
+ lastValue = currentValue;
+ lastIndex = index;
+ lastKeyValue = keyValue;
+ }
+ return 1f;
+ }
+ }
+
+}
+
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ParallaxRecyclerViewSource.java b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxRecyclerViewSource.java
new file mode 100644
index 0000000..2494ee2
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxRecyclerViewSource.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import android.graphics.Rect;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static android.support.v7.widget.RecyclerView.LayoutManager;
+import static android.support.v7.widget.RecyclerView.OnScrollListener;
+import static android.support.v7.widget.RecyclerView.ViewHolder;
+
+/**
+ * Implementation of {@link ParallaxSource} class for {@link RecyclerView}. This class
+ * allows users to track position of specific views inside {@link RecyclerView} relative to
+ * itself.
+ */
+public class ParallaxRecyclerViewSource extends ParallaxSource<ParallaxSource.IntVariable> {
+ private final RecyclerView mRecylerView;
+ private List<VariableDef> mVarDefs = new ArrayList<>();
+ private List<ParallaxSource.IntVariable> mParallaxSourceVars = new ArrayList<>();
+ private ParallaxSource.IntVariable mParentSize;
+ private Listener mListener;
+
+ /**
+ * Generic container for storing view information that user is interested in tracking.
+ * Using this class, users can track the view position relative to the view height i.e.
+ *
+ * tracking_pos = view.top + fraction * view.height() + offset
+ *
+ * This way we can track the start/end of the same variable just by changing the fraction
+ * attribute.
+ */
+ static final class VariableDef {
+ public int offset;
+ public int viewId;
+ public int adapterPosition;
+ public float fraction;
+
+ public VariableDef(int adapterPosition, int viewId, int offset, float fraction) {
+ this.adapterPosition = adapterPosition;
+ this.viewId = viewId;
+ this.offset = offset;
+ this.fraction = fraction;
+ }
+ }
+
+ @Override
+ public List<IntVariable> getVariables() {
+ return mParallaxSourceVars;
+ }
+
+ @Override
+ public void setListener(Listener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public IntVariable getMaxParentVisibleSize() {
+ if (mParentSize == null) {
+ mParentSize = new ParallaxSource.IntVariable(this);
+ }
+ mParentSize.setIntValue(mRecylerView.getHeight());
+ return mParentSize;
+ }
+
+ /**
+ * Adds the source variable to be tracked in relation to it's own height/width. This provides
+ * more flexibility to users for expressing the position of source variable.
+ * Following formulate is used for calculating the final position -
+ * final_pos = view.top + fraction * view.height() + offset
+ *
+ * This way we can track the start/end of the same view by changing just the fraction
+ * attribute.
+ *
+ * @param adapterPositon Adapter position used to find this view (given by viewId).
+ * @param viewId Resource id of the view.
+ * @param offset Offset used to alter the tracked position.
+ * @param fraction Percentage of the view width/height to be used for calculating the
+ * target position.
+ */
+ public IntVariable addVariable(int adapterPositon, int viewId, int offset, float fraction) {
+ mVarDefs.add(new VariableDef(adapterPositon, viewId, offset, fraction));
+ ParallaxSource.IntVariable intVariable = new ParallaxSource.IntVariable(this);
+ mParallaxSourceVars.add(intVariable);
+ return intVariable;
+ }
+
+ /**
+ * Constructor.
+ */
+ public ParallaxRecyclerViewSource(RecyclerView parent) {
+ this.mRecylerView = parent;
+ setupScrollListener();
+ }
+
+ private void setupScrollListener() {
+ mRecylerView.addOnScrollListener(new OnScrollListener() {
+ @Override
+ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
+
+ for (int i = 0; i < mVarDefs.size(); i++) {
+ VariableDef varDef = mVarDefs.get(i);
+ ParallaxSource.IntVariable parallaxSourceVar = mParallaxSourceVars.get(i);
+ ViewHolder viewHolder
+ = mRecylerView.findViewHolderForAdapterPosition(varDef.adapterPosition);
+ if (viewHolder == null) {
+ View firstChild = mRecylerView.getChildAt(0);
+ ViewHolder vh = mRecylerView.findContainingViewHolder(
+ firstChild);
+ int firstPosition = vh.getAdapterPosition();
+ if (firstPosition < varDef.adapterPosition) {
+ parallaxSourceVar.setIntValue(IntVariable.UNKNOWN_AFTER);
+ } else {
+ parallaxSourceVar.setIntValue(IntVariable.UNKNOWN_BEFORE);
+ }
+ } else {
+ View trackingView = viewHolder.itemView.findViewById(varDef.viewId);
+ if (trackingView == null) {
+ return;
+ }
+
+ Rect rect = new Rect(
+ 0, 0, trackingView.getWidth(), trackingView.getHeight());
+ mRecylerView.offsetDescendantRectToMyCoords(trackingView, rect);
+
+ LayoutManager.Properties properties = mRecylerView.getLayoutManager()
+ .getProperties(mRecylerView.getContext(), null, 0, 0);
+ if (properties.orientation == RecyclerView.VERTICAL) {
+ parallaxSourceVar.setIntValue(rect.top + varDef.offset
+ + (int) (varDef.fraction * rect.height()));
+ } else {
+ parallaxSourceVar.setIntValue(rect.left + varDef.offset
+ + (int) (varDef.fraction * rect.width()));
+ }
+ }
+ }
+
+ mListener.onVariableChanged(ParallaxRecyclerViewSource.this);
+ }
+ });
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ParallaxSource.java b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxSource.java
new file mode 100644
index 0000000..bf3afe2
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxSource.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import java.util.List;
+
+/**
+ * ParallaxSource tracks a list of dynamic {@link Variable}s typically representing foreground UI
+ * element positions on screen.
+ *
+ * <p>
+ * <ul>Restrictions
+ * <li>Values must be in ascending order.</li>
+ * <li>If the UI element is unknown above screen, use UNKNOWN_BEFORE.</li>
+ * <li>if the UI element is unknown below screen, use UNKNOWN_AFTER.</li>
+ * <li>UNKNOWN_BEFORE and USE_UNKNOWN_AFTER are not allowed to be next to each other.</li>
+ * </ul>
+ *
+ * These rules can be verified by {@link #verifyFloatVariables(List)} or
+ * {@link #verifyIntVariables(List)}.
+ * </p>
+ */
+public abstract class ParallaxSource<VariableT extends ParallaxSource.Variable> {
+
+ /**
+ * Listener for tracking Variable value changes.
+ */
+ public static abstract class Listener {
+ /**
+ * Called when the value for any of the variable in ParallaxSource changes.
+ */
+ public void onVariableChanged(ParallaxSource source) {
+ }
+ }
+
+ /**
+ * This class typically represents UI element position inside {@link ParallaxSource}.
+ */
+ public abstract static class Variable<VariableT extends Variable> {
+ private final ParallaxSource<VariableT> mSource;
+ private String mName;
+
+ public Variable(ParallaxSource<VariableT> source) {
+ mSource = source;
+ }
+
+ /**
+ * Returns the {@link ParallaxSource} this variable belongs to.
+ *
+ * @return The {@link ParallaxSource} this variable belongs to.
+ */
+ public ParallaxSource<VariableT> getSource() {
+ return mSource;
+ }
+
+ /**
+ * Sets name of the variable, used for debugging.
+ *
+ * @param name Name of the variable.
+ */
+ public final void setName(String name) {
+ mName = name;
+ }
+
+ /**
+ * Returns name of the variable, used for debugging.
+ *
+ * @return Name of the variable.
+ */
+ public final String getName() {
+ return mName;
+ }
+
+ /**
+ * Returns current value of this variable.
+ *
+ * @return Current value of this variable.
+ */
+ public abstract Object getValue();
+ }
+
+ /**
+ * Implementation of (@link Variable} class for integer type.
+ */
+ public static class IntVariable extends Variable<IntVariable> {
+
+ /**
+ * Variable value is unknown and it's above screen.
+ */
+ public static final int UNKNOWN_BEFORE = Integer.MIN_VALUE;
+ /**
+ * Variable value is unknown and it's bellow screen.
+ */
+ public static final int UNKNOWN_AFTER = Integer.MAX_VALUE;
+
+ private int mValue = UNKNOWN_AFTER;
+
+ public IntVariable(ParallaxSource<IntVariable> source) {
+ super(source);
+ }
+
+ /**
+ * Returns the current int value.
+ *
+ * @return The current int value.
+ */
+ public final int getIntValue() {
+ return mValue;
+ }
+
+ /**
+ * Sets the current int value.
+ *
+ * @param value The current value to set.
+ */
+ public final void setIntValue(int value) {
+ mValue = value;
+ }
+
+ @Override
+ public Object getValue() {
+ return mValue;
+ }
+
+ /**
+ * Creates an {@link IntVariableKeyValue} object for the given keyValue.
+ *
+ * @param keyValue The integer key value.
+ * @return A new {@link IntVariableKeyValue} object.
+ */
+ public IntVariableKeyValue at(int keyValue) {
+ return new IntVariableKeyValue(this, keyValue, 0f);
+ }
+
+ /**
+ * Create an {@link IntVariableKeyValue} object by multiplying the fraction with
+ * {@link #getMaxParentVisibleSize()} and adding offsetValue to it.
+ *
+ * @param offsetValue An offset integer value to be added to key value.
+ * @param fractionOfMaxParentVisibleSize 0 to 1 fraction to multiply with
+ * {@link #getMaxParentVisibleSize()} for the key
+ * value.
+ * @return A new {@link IntVariableKeyValue} object.
+ */
+ public IntVariableKeyValue at(int offsetValue, float fractionOfMaxParentVisibleSize) {
+ return new IntVariableKeyValue(this, offsetValue, fractionOfMaxParentVisibleSize);
+ }
+ }
+
+ /**
+ * Implementation of (@link Variable} class for float type.
+ */
+ public static class FloatVariable extends Variable<FloatVariable> {
+
+ /**
+ * Variable value is unknown and it's considered inside area before screen start.
+ */
+ public static final float UNKNOWN_BEFORE = -Float.MAX_VALUE;
+ /**
+ * Variable value is unknown and it's considered inside area after screen upper limit.
+ */
+ public static final float UNKNOWN_AFTER = Float.MAX_VALUE;
+
+ private float mValue = UNKNOWN_AFTER;
+
+ public FloatVariable(ParallaxSource<FloatVariable> source) {
+ super(source);
+ }
+
+ /**
+ * Gets current float value.
+ *
+ * @return Current float value.
+ */
+ public final float getFloatValue() {
+ return mValue;
+ }
+
+ /**
+ * Sets current float value.
+ *
+ * @param value Current value to set.
+ */
+ public final void setFloatValue(float value) {
+ mValue = value;
+ }
+
+ @Override
+ public Object getValue() {
+ return mValue;
+ }
+
+ /**
+ * Creates an {@link IntVariableKeyValue} object for the given keyValue.
+ *
+ * @param keyValue The integer key value.
+ * @return A new {@link IntVariableKeyValue} object.
+ */
+ public FloatVariableKeyValue at(float keyValue) {
+ return new FloatVariableKeyValue(this, keyValue, 0f);
+ }
+
+ /**
+ * Create an {@link FloatVariableKeyValue} object by multiplying the fraction with
+ * {@link #getMaxParentVisibleSize()} and adding offsetValue to it.
+ *
+ * @param offsetValue An offset integer value to be added to key value.
+ * @param fractionOfMaxParentVisibleSize 0 to 1 fraction to multiply with
+ * {@link #getMaxParentVisibleSize()} for the key
+ * value.
+ * @return A new {@link FloatVariableKeyValue} object.
+ */
+ public FloatVariableKeyValue at(float offsetValue, float fractionOfMaxParentVisibleSize) {
+ return new FloatVariableKeyValue(this, offsetValue, fractionOfMaxParentVisibleSize);
+ }
+ }
+
+ /**
+ * Class holding a fixed key value for a variable in {@link ParallaxSource}.
+ * Base class for {@link IntVariableKeyValue} and {@link FloatVariableKeyValue}.
+ */
+ public static class VariableKeyValue<VariableT extends Variable> {
+ private final VariableT mVariable;
+
+ public VariableKeyValue(VariableT variable) {
+ mVariable = variable;
+ }
+
+ /**
+ * Returns associated variable.
+ *
+ * @return Associated variable.
+ */
+ public final VariableT getVariable() {
+ return mVariable;
+ }
+ }
+
+ /**
+ * Implementation of {@link VariableKeyValue} for integer type.
+ */
+ public static class IntVariableKeyValue extends VariableKeyValue<IntVariable> {
+ private final int mValue;
+ private final float mFactionOfMax;
+
+ public IntVariableKeyValue(IntVariable variable, int value) {
+ this(variable, value, 0f);
+ }
+
+ public IntVariableKeyValue(IntVariable variable, int value, float fractionOfMax) {
+ super(variable);
+ mValue = value;
+ mFactionOfMax = fractionOfMax;
+ }
+
+ /**
+ * Returns the key value of integer type.
+ *
+ * @return The key value.
+ */
+ public final int getIntValue() {
+ return mFactionOfMax == 0 ? mValue : mValue + Math.round(getVariable().getSource()
+ .getMaxParentVisibleSize().getIntValue() * mFactionOfMax);
+ }
+ }
+
+ /**
+ * Implementation of {@link VariableKeyValue} for float type.
+ */
+ public static class FloatVariableKeyValue extends VariableKeyValue<FloatVariable> {
+ private final float mValue;
+ private final float mFactionOfMax;
+
+ public FloatVariableKeyValue(FloatVariable variable, float value) {
+ this(variable, value, 0f);
+ }
+
+ public FloatVariableKeyValue(FloatVariable variable, float value, float fractionOfMax) {
+ super(variable);
+ mValue = value;
+ mFactionOfMax = fractionOfMax;
+ }
+
+ /**
+ * Returns the key value of float type.
+ *
+ * @return The key value.
+ */
+ public final float getFloatValue() {
+ return mFactionOfMax == 0 ? mValue : mValue + getVariable().getSource()
+ .getMaxParentVisibleSize().getFloatValue() * mFactionOfMax;
+ }
+ }
+
+ /**
+ * Returns a list of variables. Caller should not modify returned list.
+ *
+ * @return A list of variables.
+ */
+ public abstract List<VariableT> getVariables();
+
+ /**
+ * Sets listener to monitor variable value changes.
+ *
+ * @param listener The listener to set on {@link ParallaxSource} object.
+ */
+ public abstract void setListener(Listener listener);
+
+ /**
+ * Return the size of parent visible area, e.g. parent view's height if we are tracking Y
+ * position of a child. The size can be used to calculate key value using the provided
+ * fraction.
+ *
+ * @return Size of parent visible area.
+ * @see IntVariableKeyValue
+ * @see FloatVariableKeyValue
+ */
+ public abstract VariableT getMaxParentVisibleSize();
+
+ /**
+ * Verify sanity of variable values, throws RuntimeException if fails. The variables values
+ * must be in ascending order. UNKNOW_BEFORE and UNKNOWN_AFTER are not allowed to be next to
+ * each other.
+ *
+ * @param variables Variables to verify.
+ */
+ public static void verifyIntVariables(List<IntVariable> variables)
+ throws IllegalStateException {
+ if (variables.size() < 2) {
+ return;
+ }
+ int last = variables.get(0).getIntValue();
+ for (int i = 1; i < variables.size(); i++) {
+ int v = variables.get(i).getIntValue();
+ if (v < last) {
+ throw new IllegalStateException(String.format("Parallax Variable[%d]\"%s\" is" +
+ " smaller than Varaible[%d]\"%s\"",
+ i, variables.get(i).getName(),
+ i - 1, variables.get(i - 1).getName()));
+ } else if (last == IntVariable.UNKNOWN_BEFORE && v == IntVariable.UNKNOWN_AFTER) {
+ throw new IllegalStateException(String.format("Parallax Variable[%d]\"%s\" is " +
+ "UNKNOW_BEFORE and Varaible[%d]\"%s\" is UNKNOWN_AFTER",
+ i - 1, variables.get(i - 1).getName(),
+ i, variables.get(i).getName()));
+ }
+ last = v;
+ }
+ }
+
+ /**
+ * Verify sanity of Variable values, throws RuntimeException if fails. The variables values
+ * must be in ascending order. UNKNOW_BEFORE and UNKNOWN_AFTER are not allowed to be next to
+ * each other.
+ *
+ * @param variables Variables to verify.
+ */
+ public static void verifyFloatVariables(List<FloatVariable> variables)
+ throws IllegalStateException {
+ if (variables.size() < 2) {
+ return;
+ }
+ float last = variables.get(0).getFloatValue();
+ for (int i = 1; i < variables.size(); i++) {
+ float v = variables.get(i).getFloatValue();
+ if (v < last) {
+ throw new IllegalStateException(String.format("Parallax Variable[%d]\"%s\" is" +
+ " smaller than Varaible[%d]\"%s\"",
+ i, variables.get(i).getName(),
+ i - 1, variables.get(i - 1).getName()));
+ } else if (last == FloatVariable.UNKNOWN_BEFORE && v == FloatVariable.UNKNOWN_AFTER) {
+ throw new IllegalStateException(String.format("Parallax Variable[%d]\"%s\" is " +
+ "UNKNOW_BEFORE and Varaible[%d]\"%s\" is UNKNOWN_AFTER",
+ i - 1, variables.get(i - 1).getName(),
+ i, variables.get(i).getName()));
+ }
+ last = v;
+ }
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ParallaxTarget.java b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxTarget.java
new file mode 100644
index 0000000..1fbd54e
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ParallaxTarget.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.view.animation.LinearInterpolator;
+
+import java.util.List;
+
+/**
+ * ParallaxTarget is reponsible for updating the target through the {@link #update(float)} method.
+ * {@link ParallaxEffect} transforms the values of {@link ParallaxSource}, which represents the
+ * current state of UI, into a float value between 0 and 1. That float value is passed into
+ * {@link #update(float)} method.
+ */
+public abstract class ParallaxTarget {
+
+ /**
+ * Implementation class is supposed to update target with the provided fraction
+ * (between 0 and 1). The fraction represents percentage of completed change (e.g. scroll) on
+ * target.
+ *
+ * @param fraction Fraction between 0 to 1.
+ */
+ public abstract void update(float fraction);
+
+ /**
+ * Returns the current fraction (between 0 and 1). The fraction represents percentage of
+ * completed change (e.g. scroll) on target.
+ *
+ * @return Current fraction value.
+ */
+ public abstract float getFraction();
+
+ /**
+ * PropertyValuesHolderTarget is an implementation of {@link ParallaxTarget} that uses
+ * {@link PropertyValuesHolder} to update the target object.
+ */
+ public static final class PropertyValuesHolderTarget extends ParallaxTarget {
+
+ /**
+ * We simulate a parallax effect on target object using an ObjectAnimator. PSEUDO_DURATION
+ * is used on the ObjectAnimator.
+ */
+ private static final long PSEUDO_DURATION = 1000000;
+
+ private final ObjectAnimator mAnimator;
+ private float mFraction;
+
+ public PropertyValuesHolderTarget(Object targetObject, PropertyValuesHolder values) {
+ mAnimator = ObjectAnimator.ofPropertyValuesHolder(targetObject, values);
+ mAnimator.setInterpolator(new LinearInterpolator());
+ mAnimator.setDuration(PSEUDO_DURATION);
+ }
+
+ @Override
+ public void update(float fraction) {
+ mFraction = fraction;
+ mAnimator.setCurrentPlayTime((long) (PSEUDO_DURATION * fraction));
+ }
+
+ @Override
+ public float getFraction() {
+ return mFraction;
+ }
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/RowHeaderPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/RowHeaderPresenter.java
index b7805cf..133adf5 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/RowHeaderPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/RowHeaderPresenter.java
@@ -72,10 +72,15 @@
float mSelectLevel;
int mOriginalTextColor;
float mUnselectAlpha;
+ RowHeaderView mTitleView;
+ TextView mDescriptionView;
public ViewHolder(View view) {
super(view);
+ mTitleView = (RowHeaderView)view.findViewById(R.id.row_header);
+ mDescriptionView = (TextView)view.findViewById(R.id.row_header_description);
}
+
public final float getSelectLevel() {
return mSelectLevel;
}
@@ -83,11 +88,12 @@
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
- RowHeaderView headerView = (RowHeaderView) LayoutInflater.from(parent.getContext())
+ View root = LayoutInflater.from(parent.getContext())
.inflate(mLayoutResourceId, parent, false);
- ViewHolder viewHolder = new ViewHolder(headerView);
- viewHolder.mOriginalTextColor = headerView.getCurrentTextColor();
+ ViewHolder viewHolder = new ViewHolder(root);
+ viewHolder.mOriginalTextColor = viewHolder.mTitleView.getCurrentTextColor();
+
viewHolder.mUnselectAlpha = parent.getResources().getFraction(
R.fraction.lb_browse_header_unselect_alpha, 1, 1);
if (mAnimateSelect) {
@@ -99,22 +105,43 @@
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
HeaderItem headerItem = item == null ? null : ((Row) item).getHeaderItem();
- if (headerItem == null) {
- ((RowHeaderView) viewHolder.view).setText(null);
+ RowHeaderPresenter.ViewHolder vh = (RowHeaderPresenter.ViewHolder)viewHolder;
+ if (vh == null) {
+ vh.mTitleView.setText(null);
+
+ if (vh.mDescriptionView != null) {
+ vh.mDescriptionView.setText(null);
+ }
+
viewHolder.view.setContentDescription(null);
if (mNullItemVisibilityGone) {
viewHolder.view.setVisibility(View.GONE);
}
} else {
viewHolder.view.setVisibility(View.VISIBLE);
- ((RowHeaderView) viewHolder.view).setText(headerItem.getName());
+ vh.mTitleView.setText(headerItem.getName());
+
+ if (vh.mDescriptionView != null) {
+ if (headerItem.getDescription() != null) {
+ vh.mDescriptionView.setText(headerItem.getDescription());
+ vh.mDescriptionView.setVisibility(View.VISIBLE);
+ } else {
+ vh.mDescriptionView.setVisibility(View.GONE);
+ }
+ }
viewHolder.view.setContentDescription(headerItem.getContentDescription());
}
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
- ((RowHeaderView) viewHolder.view).setText(null);
+ RowHeaderPresenter.ViewHolder vh = (ViewHolder)viewHolder;
+ vh.mTitleView.setText(null);
+
+ if (vh.mDescriptionView != null) {
+ vh.mDescriptionView.setText(null);
+ }
+
if (mAnimateSelect) {
setSelectLevel((ViewHolder) viewHolder, 0);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java b/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java
index 52666ac..0300c6f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java
@@ -82,9 +82,9 @@
mLastVisibleIndex = mFirstVisibleIndex = index;
} else {
if (mReversedFlow) {
- edge = mProvider.getEdge(index + 1) + mMargin + size;
+ edge = mProvider.getEdge(index + 1) + mSpacing + size;
} else {
- edge = mProvider.getEdge(index + 1) - mMargin - size;
+ edge = mProvider.getEdge(index + 1) - mSpacing - size;
}
mFirstVisibleIndex = index;
}
@@ -115,9 +115,9 @@
mLastVisibleIndex = mFirstVisibleIndex = index;
} else {
if (mReversedFlow) {
- edge = mProvider.getEdge(index - 1) - mProvider.getSize(index - 1) - mMargin;
+ edge = mProvider.getEdge(index - 1) - mProvider.getSize(index - 1) - mSpacing;
} else {
- edge = mProvider.getEdge(index - 1) + mProvider.getSize(index - 1) + mMargin;
+ edge = mProvider.getEdge(index - 1) + mProvider.getSize(index - 1) + mSpacing;
}
mLastVisibleIndex = index;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java
index 2fef48e..1d731db 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGrid.java
@@ -218,9 +218,9 @@
}
// Assuming the cachedIndex is next to item on the same row, so the
// sum of offset of [cachedIndex + 1, itemIndex] should be size of the
- // cached item plus margin.
- int offset = isReversedFlow() ? -getLocation(cachedIndex).size - mMargin:
- getLocation(cachedIndex).size + mMargin;
+ // cached item plus spacing.
+ int offset = isReversedFlow() ? -getLocation(cachedIndex).size - mSpacing:
+ getLocation(cachedIndex).size + mSpacing;
for (int i = cachedIndex + 1; i <= getLastIndex(); i++) {
offset -= getLocation(i).offset;
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java
index 975c43c..f4c0141 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java
@@ -289,13 +289,13 @@
if (rowIndex == 0) {
location = mReversedFlow ? getRowMin(mNumRows - 1) : getRowMax(mNumRows - 1);
if (location != Integer.MAX_VALUE && location != Integer.MIN_VALUE) {
- location = location + (mReversedFlow ? -mMargin : mMargin);
+ location = location + (mReversedFlow ? -mSpacing : mSpacing);
}
} else {
location = mReversedFlow ? getRowMax(rowIndex - 1) : getRowMin(rowIndex - 1);
}
} else {
- location = location + (mReversedFlow ? -mMargin : mMargin);
+ location = location + (mReversedFlow ? -mSpacing : mSpacing);
}
int size = appendVisibleItemToRow(itemIndex++, rowIndex, location);
filledOne = true;
@@ -307,7 +307,7 @@
if (itemIndex == count || (!oneColumnMode && checkAppendOverLimit(toLimit))) {
return filledOne;
}
- location = location + (mReversedFlow ? - size - mMargin : size + mMargin);
+ location = location + (mReversedFlow ? - size - mSpacing : size + mSpacing);
size = appendVisibleItemToRow(itemIndex++, rowIndex, location);
}
} else {
@@ -390,13 +390,13 @@
if (rowIndex == mNumRows - 1) {
location = mReversedFlow ? getRowMax(0) : getRowMin(0);
if (location != Integer.MAX_VALUE && location != Integer.MIN_VALUE) {
- location = location + (mReversedFlow ? mMargin : -mMargin);
+ location = location + (mReversedFlow ? mSpacing : -mSpacing);
}
} else {
location = mReversedFlow ? getRowMin(rowIndex + 1) : getRowMax(rowIndex + 1);
}
} else {
- location = location + (mReversedFlow ? mMargin : -mMargin);
+ location = location + (mReversedFlow ? mSpacing : -mSpacing);
}
int size = prependVisibleItemToRow(itemIndex--, rowIndex, location);
filledOne = true;
@@ -409,7 +409,7 @@
if (itemIndex < 0 || (!oneColumnMode && checkPrependOverLimit(toLimit))) {
return filledOne;
}
- location = location + (mReversedFlow ? size + mMargin : -size - mMargin);
+ location = location + (mReversedFlow ? size + mSpacing : -size - mSpacing);
size = prependVisibleItemToRow(itemIndex--, rowIndex, location);
}
} else {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
index c2048f6..8047364 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
@@ -479,8 +479,9 @@
private void updateColumnSize(VerticalGridView columnView) {
ViewGroup.LayoutParams lp = columnView.getLayoutParams();
- lp.height = (int) (getPickerItemHeightPixels() * (isActivated() ?
- getActivatedVisibleItemCount() : getVisibleItemCount()));
+ float itemCount = isActivated() ? getActivatedVisibleItemCount() : getVisibleItemCount();
+ lp.height = (int) (getPickerItemHeightPixels() * itemCount
+ + columnView.getVerticalSpacing() * (itemCount - 1));
columnView.setLayoutParams(lp);
}
diff --git a/v17/leanback/tests/generatev4.py b/v17/leanback/tests/generatev4.py
index 6d72c8b..647da5c 100755
--- a/v17/leanback/tests/generatev4.py
+++ b/v17/leanback/tests/generatev4.py
@@ -78,6 +78,33 @@
file.close()
outfile.close()
+print "copy ParallaxIntEffectTest to ParallaxFloatEffectTest"
+file = open('java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java', 'r')
+outfile = open('java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java', 'w')
+outfile.write("/* This file is auto-generated from ParallaxIntEffectTest.java. DO NOT MODIFY. */\n\n")
+for line in file:
+ line = line.replace('IntEffect', 'FloatEffect')
+ line = line.replace('IntVariable', 'FloatVariable')
+ line = line.replace('IntValue', 'FloatValue')
+ outfile.write(line)
+file.close()
+outfile.close()
+
+
+print "copy ParallaxIntSourceTest to ParallaxFloatSourceTest"
+file = open('java/android/support/v17/leanback/widget/ParallaxIntSourceTest.java', 'r')
+outfile = open('java/android/support/v17/leanback/widget/ParallaxFloatSourceTest.java', 'w')
+outfile.write("/* This file is auto-generated from ParallaxIntSourceTest.java. DO NOT MODIFY. */\n\n")
+for line in file:
+ line = line.replace('IntSource', 'FloatSource')
+ line = line.replace('IntVariable', 'FloatVariable')
+ line = line.replace('IntValue', 'FloatValue')
+ line = line.replace('assertEquals((int)', 'assertFloatEquals((float)')
+ outfile.write(line)
+file.close()
+outfile.close()
+
+
print "copy PlaybackControlGlueTest to PlaybackControlSupportGlueTest"
file = open('java/android/support/v17/leanback/app/PlaybackControlGlueTest.java', 'r')
outfile = open('java/android/support/v17/leanback/app/PlaybackControlSupportGlueTest.java', 'w')
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/graphics/ChildDrawableTest.java b/v17/leanback/tests/java/android/support/v17/leanback/graphics/ChildDrawableTest.java
new file mode 100644
index 0000000..86a89cb
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/graphics/ChildDrawableTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+package android.support.v17.leanback.graphics;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.runner.AndroidJUnit4;
+
+/**
+ * Unit test for {@link ChildDrawable}
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ChildDrawableTest {
+
+ private static final int HEIGHT = 800;
+ private static final int WIDTH = 600;
+ Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888);
+
+ @Test
+ public void updateBounds_noBoundsRule() {
+ CompositeDrawable parentDrawable = new CompositeDrawable();
+ FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
+ drawable.setBitmap(bitmap);
+ Rect bounds = new Rect(0, 0, WIDTH, HEIGHT);
+ parentDrawable.addChildDrawable(drawable);
+ parentDrawable.updateBounds(bounds);
+
+ Rect adjustedBounds = drawable.getBounds();
+ assertEquals(bounds, adjustedBounds);
+ }
+
+ @Test
+ public void updateBounds_withBoundsRule() {
+ CompositeDrawable parentDrawable = new CompositeDrawable();
+ float fraction = 0.5f;
+ FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
+ drawable.setBitmap(bitmap);
+ Rect bounds = new Rect(0, 0, WIDTH, HEIGHT);
+ assertEquals(HEIGHT, bounds.height());
+ assertEquals(WIDTH, bounds.width());
+
+ // inherit from parent
+ parentDrawable.addChildDrawable(drawable);
+ parentDrawable.getChildAt(0).getBoundsRule().mBottom = BoundsRule.inheritFromParent(fraction);
+ parentDrawable.updateBounds(bounds);
+
+ Rect adjustedBounds = drawable.getBounds();
+ Rect expectedBounds = new Rect(bounds);
+ expectedBounds.bottom = bounds.top + (int) (HEIGHT * fraction);
+ assertEquals(expectedBounds, adjustedBounds);
+
+ // absolute value
+ drawable.setBounds(bounds);
+ parentDrawable.getChildAt(0).getBoundsRule().mBottom = BoundsRule.absoluteValue(200);
+ parentDrawable.updateBounds(bounds);
+
+ adjustedBounds = drawable.getBounds();
+ expectedBounds = new Rect(bounds);
+ expectedBounds.bottom = 200;
+ assertEquals(expectedBounds, adjustedBounds);
+
+ // inherit with offset
+ parentDrawable.getChildAt(0).getBoundsRule().mBottom = BoundsRule.inheritFromParentWithOffset(fraction, 100);
+ parentDrawable.updateBounds(bounds);
+
+ adjustedBounds = drawable.getBounds();
+ expectedBounds = new Rect(bounds);
+ expectedBounds.bottom = bounds.top + (int) (HEIGHT * fraction + 100);
+ assertEquals(expectedBounds, adjustedBounds);
+
+ // inherit from parent 2
+ bounds = new Rect(100, 200, WIDTH, HEIGHT);
+ parentDrawable.getChildAt(0).getBoundsRule().mBottom = BoundsRule.inheritFromParent(fraction);
+ parentDrawable.updateBounds(bounds);
+
+ adjustedBounds = drawable.getBounds();
+ expectedBounds = new Rect(bounds);
+ expectedBounds.bottom = bounds.top + (int) ((HEIGHT-200) * fraction);
+ assertEquals(expectedBounds, adjustedBounds);
+ }
+
+ @Test
+ public void updateBounds_withOverride() {
+ CompositeDrawable parentDrawable = new CompositeDrawable();
+ float fraction = 0.5f;
+ FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
+ drawable.setBitmap(bitmap);
+ Rect bounds = new Rect(0, 0, WIDTH, HEIGHT);
+ drawable.setBounds(bounds);
+ assertEquals(HEIGHT, drawable.getBounds().height());
+ assertEquals(WIDTH, drawable.getBounds().width());
+
+ parentDrawable.addChildDrawable(drawable);
+
+ // inherit from parent
+ BoundsRule boundsRule = parentDrawable.getChildAt(0).getBoundsRule();
+ boundsRule.mTop = BoundsRule.absoluteValue(-200);
+ boundsRule.mBottom = BoundsRule.inheritFromParent(fraction);
+ parentDrawable.getChildAt(0).getBoundsRule().mTop.setAbsoluteValue(-100);
+
+ parentDrawable.updateBounds(bounds);
+
+ Rect adjustedBounds = drawable.getBounds();
+ Rect expectedBounds = new Rect(bounds);
+ expectedBounds.top = -100;
+ expectedBounds.bottom = bounds.top + (int) (HEIGHT * fraction);
+ assertEquals(expectedBounds, adjustedBounds);
+
+ // inherit from parent with offset
+ boundsRule.mBottom = BoundsRule.absoluteValue(HEIGHT);
+
+ parentDrawable.updateBounds(bounds);
+
+ adjustedBounds = drawable.getBounds();
+ expectedBounds = new Rect(bounds);
+ expectedBounds.top = -100;
+ expectedBounds.bottom = HEIGHT;
+ assertEquals(expectedBounds, adjustedBounds);
+ }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java b/v17/leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
new file mode 100644
index 0000000..3decbae
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+package android.support.v17.leanback.graphics;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+
+/**
+ * Unit test for {@link FitWidthBitmapDrawable}
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class FitWidthBitmapDrawableTest {
+ private final static int SCREEN_WIDTH = 1600;
+ private final static int SCREEN_HEIGHT = 1080;
+ private final static int WIDTH = 300;
+ private final static int HEIGHT = 600;
+ private Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888);
+
+ @Test
+ public void draw_withOffset() {
+ int offset = 600;
+ FitWidthBitmapDrawable drawable = new FitWidthBitmapDrawable();
+ drawable.setBitmap(bitmap);
+ drawable.setVerticalOffset(offset);
+ Rect bounds = new Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+ drawable.setBounds(bounds);
+
+ Canvas canvas = Mockito.mock(Canvas.class);
+ drawable.draw(canvas);
+
+ Rect expectedBounds = bounds;
+ verify(canvas).clipRect(expectedBounds);
+
+ Rect bitmapBounds = new Rect(0, 0, WIDTH, HEIGHT);
+ int nH = (int) (((float)SCREEN_WIDTH/WIDTH * HEIGHT) + offset);
+ Rect expectedDest = new Rect(0, offset, SCREEN_WIDTH, nH);
+ verify(canvas).drawBitmap(eq(bitmap), eq(bitmapBounds), eq(expectedDest), any(Paint.class));
+ }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
new file mode 100644
index 0000000..6a02c36
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
@@ -0,0 +1,262 @@
+/* This file is auto-generated from ParallaxIntEffectTest.java. DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package android.support.v17.leanback.widget;
+
+import android.support.test.runner.AndroidJUnitRunner;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.support.test.runner.AndroidJUnit4;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ParallaxFloatEffectTest {
+
+ List<ParallaxSource.FloatVariable> variables;
+ ParallaxSource.FloatVariable screenMax;
+ ParallaxSource<ParallaxSource.FloatVariable> source;
+ ParallaxEffect.FloatEffect effect;
+ @Mock ParallaxTarget target;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ source = new ParallaxSource<ParallaxSource.FloatVariable>() {
+ public List<ParallaxSource.FloatVariable> getVariables() {
+ return variables;
+ }
+
+ public void setListener(ParallaxSource.Listener listener) {
+ }
+
+ public ParallaxSource.FloatVariable getMaxParentVisibleSize() {
+ return screenMax;
+ }
+ };
+ variables = new ArrayList<ParallaxSource.FloatVariable>();
+ screenMax = new ParallaxSource.FloatVariable(source);
+ effect = new ParallaxEffect.FloatEffect();
+ }
+
+ @Test
+ public void testOneVariable() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ var1.setName("detail_banner_topEdge");
+
+ effect.setVariableRanges(var1.at(540), var1.at(0));
+ effect.target(target);
+
+ // start
+ var1.setFloatValue(540);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // 25% complete
+ var1.setFloatValue(405);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.25f);
+ Mockito.reset(target);
+
+ // middle
+ var1.setFloatValue(270);
+ effect.performMapping(source);
+ verify(target, times(1)).update(.5f);
+ Mockito.reset(target);
+
+ // 75% complete
+ var1.setFloatValue(135);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.75f);
+ Mockito.reset(target);
+
+ // end
+ var1.setFloatValue(0);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // after end
+ var1.setFloatValue(-1000);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // before start
+ var1.setFloatValue(1000);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_before
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_after
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testVerifyKeyValueOfSameVariableInDesendantOrder() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ var1.setName("detail_banner_topEdge");
+
+ effect.setVariableRanges(var1.at(540), var1.at(550));
+ effect.target(target);
+ var1.setFloatValue(0);
+ effect.performMapping(source);
+ }
+
+ @Test
+ public void testTwoVariable() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ var1.setName("row1_top");
+ ParallaxSource.FloatVariable var2 = new ParallaxSource.FloatVariable(source);
+ variables.add(var2);
+ var2.setName("row2_top");
+
+ effect.setVariableRanges(var1.at(540), var2.at(540));
+ effect.target(target);
+
+ // start
+ var1.setFloatValue(540);
+ var2.setFloatValue(840);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // middle
+ var1.setFloatValue(390);
+ var2.setFloatValue(690);
+ effect.performMapping(source);
+ verify(target, times(1)).update(.5f);
+ Mockito.reset(target);
+
+ // end
+ var1.setFloatValue(240);
+ var2.setFloatValue(540);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // after end
+ var1.setFloatValue(200);
+ var2.setFloatValue(500);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // before start
+ var1.setFloatValue(1000);
+ var2.setFloatValue(1300);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_before
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_before
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue(-1000);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_after
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+ var2.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_after
+ var1.setFloatValue(1000);
+ var2.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_before and less
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue(500);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_before and hit second
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue(540);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_before with estimation
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue(1080);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.5f);
+ Mockito.reset(target);
+
+ // unknown_after with estimation
+ var1.setFloatValue(0);
+ var2.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.5f);
+ Mockito.reset(target);
+ }
+
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatSourceTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatSourceTest.java
new file mode 100644
index 0000000..e119fa2
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatSourceTest.java
@@ -0,0 +1,177 @@
+/* This file is auto-generated from ParallaxIntSourceTest.java. DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import android.support.test.runner.AndroidJUnitRunner;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.support.test.runner.AndroidJUnit4;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ParallaxFloatSourceTest {
+
+ List<ParallaxSource.FloatVariable> variables;
+ ParallaxSource.FloatVariable screenMax;
+ ParallaxSource<ParallaxSource.FloatVariable> source;
+
+ static void assertFloatEquals(float expected, float actual) {
+ org.junit.Assert.assertEquals((double)expected, (double)actual, 0.0001d);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ source = new ParallaxSource<ParallaxSource.FloatVariable>() {
+ public List<ParallaxSource.FloatVariable> getVariables() {
+ return variables;
+ }
+
+ public void setListener(ParallaxSource.Listener listener) {
+ }
+
+ public ParallaxSource.FloatVariable getMaxParentVisibleSize() {
+ return screenMax;
+ }
+ };
+ variables = new ArrayList<ParallaxSource.FloatVariable>();
+ screenMax = new ParallaxSource.FloatVariable(source);
+ }
+
+ @Test
+ public void testVariable() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ var1.setFloatValue(54);
+ assertFloatEquals((float)54, var1.getFloatValue());
+ var1.setName("testname123");
+ assertEquals(var1.getName(), "testname123");
+ var1.setFloatValue(2000);
+ assertFloatEquals((float)2000, var1.getFloatValue());
+ }
+
+ @Test
+ public void testFixedKeyValue() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+
+ ParallaxSource.FloatVariableKeyValue keyValue = var1.at(1000);
+ assertSame(keyValue.getVariable(), var1);
+ assertFloatEquals((float)1000, keyValue.getFloatValue());
+ }
+
+ @Test
+ public void testFractionOfKeyValue() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+
+ ParallaxSource.FloatVariableKeyValue keyValue = var1.at(0, 0.5f);
+ assertSame(keyValue.getVariable(), var1);
+ assertFloatEquals((float)540, keyValue.getFloatValue());
+ }
+
+ @Test
+ public void testFixedKeyValueWithFraction() {
+ screenMax.setFloatValue(1080);
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+
+ ParallaxSource.FloatVariableKeyValue keyValue = var1.at(-100, 0.5f);
+ assertSame(keyValue.getVariable(), var1);
+ assertFloatEquals((float)440, keyValue.getFloatValue());
+
+ ParallaxSource.FloatVariableKeyValue keyValue2 = var1.at(100, 0.5f);
+ assertSame(keyValue2.getVariable(), var1);
+ assertFloatEquals((float)640, keyValue2.getFloatValue());
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testVerifyFloatVariables_wrongOrder() {
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ ParallaxSource.FloatVariable var2 = new ParallaxSource.FloatVariable(source);
+ variables.add(var2);
+
+ var1.setFloatValue((int)500);
+ var2.setFloatValue((int)499);
+
+ ParallaxSource.verifyFloatVariables(variables);
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testVerifyFloatVariablesWrong_combination() {
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ ParallaxSource.FloatVariable var2 = new ParallaxSource.FloatVariable(source);
+ variables.add(var2);
+
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+
+ ParallaxSource.verifyFloatVariables(variables);
+ }
+
+ @Test
+ public void testVerifyFloatVariables_success() {
+ ParallaxSource.FloatVariable var1 = new ParallaxSource.FloatVariable(source);
+ variables.add(var1);
+ ParallaxSource.FloatVariable var2 = new ParallaxSource.FloatVariable(source);
+ variables.add(var2);
+
+ var1.setFloatValue((int)499);
+ var2.setFloatValue((int)500);
+
+ ParallaxSource.verifyFloatVariables(variables);
+
+ var1.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_BEFORE);
+ var2.setFloatValue((int)500);
+
+ ParallaxSource.verifyFloatVariables(variables);
+
+ var1.setFloatValue((int)499);
+ var2.setFloatValue(ParallaxSource.FloatVariable.UNKNOWN_AFTER);
+
+ ParallaxSource.verifyFloatVariables(variables);
+ }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
new file mode 100644
index 0000000..76aeea5
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package android.support.v17.leanback.widget;
+
+import android.support.test.runner.AndroidJUnitRunner;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.support.test.runner.AndroidJUnit4;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ParallaxIntEffectTest {
+
+ List<ParallaxSource.IntVariable> variables;
+ ParallaxSource.IntVariable screenMax;
+ ParallaxSource<ParallaxSource.IntVariable> source;
+ ParallaxEffect.IntEffect effect;
+ @Mock ParallaxTarget target;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ source = new ParallaxSource<ParallaxSource.IntVariable>() {
+ public List<ParallaxSource.IntVariable> getVariables() {
+ return variables;
+ }
+
+ public void setListener(ParallaxSource.Listener listener) {
+ }
+
+ public ParallaxSource.IntVariable getMaxParentVisibleSize() {
+ return screenMax;
+ }
+ };
+ variables = new ArrayList<ParallaxSource.IntVariable>();
+ screenMax = new ParallaxSource.IntVariable(source);
+ effect = new ParallaxEffect.IntEffect();
+ }
+
+ @Test
+ public void testOneVariable() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ var1.setName("detail_banner_topEdge");
+
+ effect.setVariableRanges(var1.at(540), var1.at(0));
+ effect.target(target);
+
+ // start
+ var1.setIntValue(540);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // 25% complete
+ var1.setIntValue(405);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.25f);
+ Mockito.reset(target);
+
+ // middle
+ var1.setIntValue(270);
+ effect.performMapping(source);
+ verify(target, times(1)).update(.5f);
+ Mockito.reset(target);
+
+ // 75% complete
+ var1.setIntValue(135);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.75f);
+ Mockito.reset(target);
+
+ // end
+ var1.setIntValue(0);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // after end
+ var1.setIntValue(-1000);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // before start
+ var1.setIntValue(1000);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_before
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_after
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testVerifyKeyValueOfSameVariableInDesendantOrder() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ var1.setName("detail_banner_topEdge");
+
+ effect.setVariableRanges(var1.at(540), var1.at(550));
+ effect.target(target);
+ var1.setIntValue(0);
+ effect.performMapping(source);
+ }
+
+ @Test
+ public void testTwoVariable() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ var1.setName("row1_top");
+ ParallaxSource.IntVariable var2 = new ParallaxSource.IntVariable(source);
+ variables.add(var2);
+ var2.setName("row2_top");
+
+ effect.setVariableRanges(var1.at(540), var2.at(540));
+ effect.target(target);
+
+ // start
+ var1.setIntValue(540);
+ var2.setIntValue(840);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // middle
+ var1.setIntValue(390);
+ var2.setIntValue(690);
+ effect.performMapping(source);
+ verify(target, times(1)).update(.5f);
+ Mockito.reset(target);
+
+ // end
+ var1.setIntValue(240);
+ var2.setIntValue(540);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // after end
+ var1.setIntValue(200);
+ var2.setIntValue(500);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // before start
+ var1.setIntValue(1000);
+ var2.setIntValue(1300);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_before
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_before
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue(-1000);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_after
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+ var2.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_after
+ var1.setIntValue(1000);
+ var2.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0f);
+ Mockito.reset(target);
+
+ // unknown_before and less
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue(500);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_before and hit second
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue(540);
+ effect.performMapping(source);
+ verify(target, times(1)).update(1f);
+ Mockito.reset(target);
+
+ // unknown_before with estimation
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue(1080);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.5f);
+ Mockito.reset(target);
+
+ // unknown_after with estimation
+ var1.setIntValue(0);
+ var2.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+ effect.performMapping(source);
+ verify(target, times(1)).update(0.5f);
+ Mockito.reset(target);
+ }
+
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntSourceTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntSourceTest.java
new file mode 100644
index 0000000..2aaec03
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntSourceTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package android.support.v17.leanback.widget;
+
+import android.support.test.runner.AndroidJUnitRunner;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.support.test.runner.AndroidJUnit4;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ParallaxIntSourceTest {
+
+ List<ParallaxSource.IntVariable> variables;
+ ParallaxSource.IntVariable screenMax;
+ ParallaxSource<ParallaxSource.IntVariable> source;
+
+ static void assertFloatEquals(float expected, float actual) {
+ org.junit.Assert.assertEquals((double)expected, (double)actual, 0.0001d);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ source = new ParallaxSource<ParallaxSource.IntVariable>() {
+ public List<ParallaxSource.IntVariable> getVariables() {
+ return variables;
+ }
+
+ public void setListener(ParallaxSource.Listener listener) {
+ }
+
+ public ParallaxSource.IntVariable getMaxParentVisibleSize() {
+ return screenMax;
+ }
+ };
+ variables = new ArrayList<ParallaxSource.IntVariable>();
+ screenMax = new ParallaxSource.IntVariable(source);
+ }
+
+ @Test
+ public void testVariable() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ var1.setIntValue(54);
+ assertEquals((int)54, var1.getIntValue());
+ var1.setName("testname123");
+ assertEquals(var1.getName(), "testname123");
+ var1.setIntValue(2000);
+ assertEquals((int)2000, var1.getIntValue());
+ }
+
+ @Test
+ public void testFixedKeyValue() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+
+ ParallaxSource.IntVariableKeyValue keyValue = var1.at(1000);
+ assertSame(keyValue.getVariable(), var1);
+ assertEquals((int)1000, keyValue.getIntValue());
+ }
+
+ @Test
+ public void testFractionOfKeyValue() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+
+ ParallaxSource.IntVariableKeyValue keyValue = var1.at(0, 0.5f);
+ assertSame(keyValue.getVariable(), var1);
+ assertEquals((int)540, keyValue.getIntValue());
+ }
+
+ @Test
+ public void testFixedKeyValueWithFraction() {
+ screenMax.setIntValue(1080);
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+
+ ParallaxSource.IntVariableKeyValue keyValue = var1.at(-100, 0.5f);
+ assertSame(keyValue.getVariable(), var1);
+ assertEquals((int)440, keyValue.getIntValue());
+
+ ParallaxSource.IntVariableKeyValue keyValue2 = var1.at(100, 0.5f);
+ assertSame(keyValue2.getVariable(), var1);
+ assertEquals((int)640, keyValue2.getIntValue());
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testVerifyIntVariables_wrongOrder() {
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ ParallaxSource.IntVariable var2 = new ParallaxSource.IntVariable(source);
+ variables.add(var2);
+
+ var1.setIntValue((int)500);
+ var2.setIntValue((int)499);
+
+ ParallaxSource.verifyIntVariables(variables);
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void testVerifyIntVariablesWrong_combination() {
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ ParallaxSource.IntVariable var2 = new ParallaxSource.IntVariable(source);
+ variables.add(var2);
+
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+
+ ParallaxSource.verifyIntVariables(variables);
+ }
+
+ @Test
+ public void testVerifyIntVariables_success() {
+ ParallaxSource.IntVariable var1 = new ParallaxSource.IntVariable(source);
+ variables.add(var1);
+ ParallaxSource.IntVariable var2 = new ParallaxSource.IntVariable(source);
+ variables.add(var2);
+
+ var1.setIntValue((int)499);
+ var2.setIntValue((int)500);
+
+ ParallaxSource.verifyIntVariables(variables);
+
+ var1.setIntValue(ParallaxSource.IntVariable.UNKNOWN_BEFORE);
+ var2.setIntValue((int)500);
+
+ ParallaxSource.verifyIntVariables(variables);
+
+ var1.setIntValue((int)499);
+ var2.setIntValue(ParallaxSource.IntVariable.UNKNOWN_AFTER);
+
+ ParallaxSource.verifyIntVariables(variables);
+ }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
index 6b9b783..a1d66ae 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
@@ -41,7 +41,7 @@
mProvider = new Provider(new int[]{80, 80, 30, 100, 40, 10});
mSingleRow = new SingleRow();
- mSingleRow.setMargin(20);
+ mSingleRow.setSpacing(20);
mSingleRow.setProvider(mProvider);
mSingleRow.appendVisibleItems(200);
assertEquals(dump(mSingleRow) + " Should filled 2 items", 1, mSingleRow.mLastVisibleIndex);
@@ -85,7 +85,7 @@
mProvider = new Provider(new int[]{80, 80, 30, 100, 40, 10});
mSingleRow = new SingleRow();
- mSingleRow.setMargin(20);
+ mSingleRow.setSpacing(20);
mSingleRow.setProvider(mProvider);
mSingleRow.setReversedFlow(true);
mSingleRow.appendVisibleItems(-200);
@@ -127,7 +127,7 @@
mProvider = new Provider(new int[]{80, 80, 30, 100, 40, 10});
mSingleRow = new SingleRow();
- mSingleRow.setMargin(20);
+ mSingleRow.setSpacing(20);
mSingleRow.setProvider(mProvider);
mSingleRow.appendVisibleItems(200);
assertEquals(dump(mSingleRow) + " Should filled 2 items", 1, mSingleRow.mLastVisibleIndex);
@@ -149,7 +149,7 @@
mProvider = new Provider(new int[]{80, 80, 30, 100, 40, 10});
mSingleRow = new SingleRow();
- mSingleRow.setMargin(20);
+ mSingleRow.setSpacing(20);
mSingleRow.setProvider(mProvider);
mSingleRow.setReversedFlow(true);
mSingleRow.appendVisibleItems(-200);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
index 82b63bf..1a94068 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
@@ -44,7 +44,7 @@
// layout first 8 items then all items
mStaggeredGrid = new StaggeredGridDefault();
mStaggeredGrid.setNumRows(3);
- mStaggeredGrid.setMargin(20);
+ mStaggeredGrid.setSpacing(20);
mStaggeredGrid.setProvider(mProvider);
mStaggeredGrid.appendVisibleItems(210);
assertEquals(dump(mStaggeredGrid) + " Should fill 8 items",
@@ -60,7 +60,7 @@
// layout all items together
mStaggeredGrid = new StaggeredGridDefault();
mStaggeredGrid.setNumRows(3);
- mStaggeredGrid.setMargin(20);
+ mStaggeredGrid.setSpacing(20);
mStaggeredGrid.setProvider(mProvider);
mStaggeredGrid.appendVisibleItems(100000);
assertEquals(dump(mStaggeredGrid) + " should fill 9 items",
diff --git a/v17/leanback/tests/res/layout/horizontal_grid.xml b/v17/leanback/tests/res/layout/horizontal_grid.xml
index 6c4eaf1..0fbb52f 100644
--- a/v17/leanback/tests/res/layout/horizontal_grid.xml
+++ b/v17/leanback/tests/res/layout/horizontal_grid.xml
@@ -12,8 +12,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfRows="3"
lb:rowHeight="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml b/v17/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
index fdfc0ea..746a458 100644
--- a/v17/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
+++ b/v17/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
@@ -12,8 +12,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfRows="3"
lb:rowHeight="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/horizontal_linear.xml b/v17/leanback/tests/res/layout/horizontal_linear.xml
index 5e9da64..cca5781 100644
--- a/v17/leanback/tests/res/layout/horizontal_linear.xml
+++ b/v17/leanback/tests/res/layout/horizontal_linear.xml
@@ -13,8 +13,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1"
lb:columnWidth="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/vertical_grid.xml b/v17/leanback/tests/res/layout/vertical_grid.xml
index f4c0065..5aa5697 100644
--- a/v17/leanback/tests/res/layout/vertical_grid.xml
+++ b/v17/leanback/tests/res/layout/vertical_grid.xml
@@ -12,8 +12,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="3"
lb:columnWidth="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/vertical_grid_ltr.xml b/v17/leanback/tests/res/layout/vertical_grid_ltr.xml
index 6a390a3..762c5f7 100644
--- a/v17/leanback/tests/res/layout/vertical_grid_ltr.xml
+++ b/v17/leanback/tests/res/layout/vertical_grid_ltr.xml
@@ -20,8 +20,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1"
lb:columnWidth="150dip"
lb:focusOutSideStart="false"
diff --git a/v17/leanback/tests/res/layout/vertical_grid_rtl.xml b/v17/leanback/tests/res/layout/vertical_grid_rtl.xml
index 87b2054..b9a53e8 100644
--- a/v17/leanback/tests/res/layout/vertical_grid_rtl.xml
+++ b/v17/leanback/tests/res/layout/vertical_grid_rtl.xml
@@ -20,8 +20,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1"
lb:columnWidth="150dip"
lb:focusOutSideStart="false"
diff --git a/v17/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml b/v17/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
index bf056f8..d0fdeca 100644
--- a/v17/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
+++ b/v17/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
@@ -12,8 +12,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="3"
lb:columnWidth="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/vertical_linear.xml b/v17/leanback/tests/res/layout/vertical_linear.xml
index 0a1d00c..c76b26a 100644
--- a/v17/leanback/tests/res/layout/vertical_linear.xml
+++ b/v17/leanback/tests/res/layout/vertical_linear.xml
@@ -12,8 +12,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1"
lb:columnWidth="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml b/v17/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
index 012829d..ef82c19 100644
--- a/v17/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
+++ b/v17/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
@@ -16,8 +16,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1" />
</FrameLayout>
diff --git a/v17/leanback/tests/res/layout/vertical_linear_with_button.xml b/v17/leanback/tests/res/layout/vertical_linear_with_button.xml
index f37bdc3..067310d 100644
--- a/v17/leanback/tests/res/layout/vertical_linear_with_button.xml
+++ b/v17/leanback/tests/res/layout/vertical_linear_with_button.xml
@@ -20,8 +20,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1"
lb:columnWidth="150dip"
android:paddingBottom="12dip"
diff --git a/v17/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml b/v17/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
index 6305de6..02b027c 100644
--- a/v17/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
+++ b/v17/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
@@ -20,8 +20,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="4dip"
+ android_horizontalSpacing="12dip"
+ android:verticalSpacing="4dip"
lb:numberOfColumns="1"
android:paddingBottom="12dip"
android:paddingLeft="12dip"
diff --git a/v17/leanback/tests/res/layout/vertical_linear_wrap_content.xml b/v17/leanback/tests/res/layout/vertical_linear_wrap_content.xml
index 6770983..7803901 100644
--- a/v17/leanback/tests/res/layout/vertical_linear_wrap_content.xml
+++ b/v17/leanback/tests/res/layout/vertical_linear_wrap_content.xml
@@ -12,8 +12,8 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#00ffff"
- lb:horizontalMargin="12dip"
- lb:verticalMargin="24dip"
+ android:horizontalSpacing="12dip"
+ android:verticalSpacing="24dip"
lb:numberOfColumns="1"
lb:columnWidth="wrap_content"
android:paddingBottom="12dip"
diff --git a/v7/appcompat/res/values-my-rMM/strings.xml b/v7/appcompat/res/values-my-rMM/strings.xml
index 93f779d..0248c15 100644
--- a/v7/appcompat/res/values-my-rMM/strings.xml
+++ b/v7/appcompat/res/values-my-rMM/strings.xml
@@ -27,7 +27,7 @@
<string name="abc_search_hint" msgid="7723749260725869598">"ရှာဖွေပါ..."</string>
<string name="abc_searchview_description_query" msgid="2550479030709304392">"ရှာစရာ အချက်အလက်နေရာ"</string>
<string name="abc_searchview_description_clear" msgid="3691816814315814921">"ရှာစရာ အချက်အလက်များ ဖယ်ရှားရန်"</string>
- <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ရှာဖွေစရာ အချက်အလက်ကို အတည်ပြုရန်"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ရှာဖွေစရာ အချက်အလက်ကို ပေးပို့ရန်"</string>
<string name="abc_searchview_description_voice" msgid="893419373245838918">"အသံဖြင့် ရှာဖွေခြင်း"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"အက်ပ်တစ်ခုခုကို ရွေးချယ်ပါ"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"အားလုံးကို ကြည့်ရန်"</string>
diff --git a/v7/appcompat/src/android/support/v7/widget/Toolbar.java b/v7/appcompat/src/android/support/v7/widget/Toolbar.java
index a6e7434..3bafd6d 100644
--- a/v7/appcompat/src/android/support/v7/widget/Toolbar.java
+++ b/v7/appcompat/src/android/support/v7/widget/Toolbar.java
@@ -2184,7 +2184,7 @@
* <p>Toolbar.LayoutParams extends ActionBar.LayoutParams for compatibility with existing
* ActionBar API. See
* {@link android.support.v7.app.AppCompatActivity#setSupportActionBar(Toolbar)
- * ActionBarActivity.setActionBar}
+ * AppCompatActivity.setSupportActionBar}
* for more info on how to use a Toolbar as your Activity's ActionBar.</p>
*/
public static class LayoutParams extends ActionBar.LayoutParams {
diff --git a/v7/appcompat/tests/AndroidManifest.xml b/v7/appcompat/tests/AndroidManifest.xml
index 7288eb3..adb158f 100644
--- a/v7/appcompat/tests/AndroidManifest.xml
+++ b/v7/appcompat/tests/AndroidManifest.xml
@@ -34,9 +34,9 @@
android:name="android.support.v7.app.AppCompatActivity"/>
<activity
- android:name="android.support.v7.app.WindowDecorActionBarActivity"/>
+ android:name="android.support.v7.app.WindowDecorAppCompatActivity"/>
<activity
- android:name="android.support.v7.app.ToolbarActionBarActivity"
+ android:name="android.support.v7.app.ToolbarAppCompatActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"/>
<activity
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java b/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java
index f104f02..62954be 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java
@@ -21,9 +21,9 @@
import org.junit.Test;
-public class BasicsTestCaseWithToolbar extends BaseBasicsTestCase<ToolbarActionBarActivity> {
+public class BasicsTestCaseWithToolbar extends BaseBasicsTestCase<ToolbarAppCompatActivity> {
public BasicsTestCaseWithToolbar() {
- super(ToolbarActionBarActivity.class);
+ super(ToolbarAppCompatActivity.class);
}
@Test
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java b/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
index 27b5039..6cff38f 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
@@ -21,9 +21,9 @@
import org.junit.Test;
-public class BasicsTestCaseWithWindowDecor extends BaseBasicsTestCase<WindowDecorActionBarActivity> {
+public class BasicsTestCaseWithWindowDecor extends BaseBasicsTestCase<WindowDecorAppCompatActivity> {
public BasicsTestCaseWithWindowDecor() {
- super(WindowDecorActionBarActivity.class);
+ super(WindowDecorAppCompatActivity.class);
}
@Test
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java b/v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java
index 2381821..d5a45c8 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java
@@ -24,10 +24,10 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-public class DialogTestCase extends BaseInstrumentationTestCase<WindowDecorActionBarActivity> {
+public class DialogTestCase extends BaseInstrumentationTestCase<WindowDecorAppCompatActivity> {
public DialogTestCase() {
- super(WindowDecorActionBarActivity.class);
+ super(WindowDecorAppCompatActivity.class);
}
@Test
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java b/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
index 9caf551..cdaecc0 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
@@ -16,8 +16,8 @@
package android.support.v7.app;
-public class KeyEventsTestCaseWithToolbar extends BaseKeyEventsTestCase<ToolbarActionBarActivity> {
+public class KeyEventsTestCaseWithToolbar extends BaseKeyEventsTestCase<ToolbarAppCompatActivity> {
public KeyEventsTestCaseWithToolbar() {
- super(ToolbarActionBarActivity.class);
+ super(ToolbarAppCompatActivity.class);
}
}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java b/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
index 9707a4c..02296fe 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
@@ -16,8 +16,8 @@
package android.support.v7.app;
-public class KeyEventsTestCaseWithWindowDecor extends BaseKeyEventsTestCase<WindowDecorActionBarActivity> {
+public class KeyEventsTestCaseWithWindowDecor extends BaseKeyEventsTestCase<WindowDecorAppCompatActivity> {
public KeyEventsTestCaseWithWindowDecor() {
- super(WindowDecorActionBarActivity.class);
+ super(WindowDecorAppCompatActivity.class);
}
}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java b/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
index 16c37a2..3da153b 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
@@ -17,8 +17,8 @@
package android.support.v7.app;
public class KeyboardShortcutsTestCaseWithToolbar
- extends BaseKeyboardShortcutsTestCase<ToolbarActionBarActivity> {
+ extends BaseKeyboardShortcutsTestCase<ToolbarAppCompatActivity> {
public KeyboardShortcutsTestCaseWithToolbar() {
- super(ToolbarActionBarActivity.class);
+ super(ToolbarAppCompatActivity.class);
}
}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java b/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
index 4289143..eac1881 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
@@ -17,8 +17,8 @@
package android.support.v7.app;
public class KeyboardShortcutsTestCaseWithWindowDecor
- extends BaseKeyboardShortcutsTestCase<WindowDecorActionBarActivity> {
+ extends BaseKeyboardShortcutsTestCase<WindowDecorAppCompatActivity> {
public KeyboardShortcutsTestCaseWithWindowDecor() {
- super(WindowDecorActionBarActivity.class);
+ super(WindowDecorAppCompatActivity.class);
}
}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/ToolbarActionBarActivity.java b/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
similarity index 94%
rename from v7/appcompat/tests/src/android/support/v7/app/ToolbarActionBarActivity.java
rename to v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
index 4b07a2e..9042363 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/ToolbarActionBarActivity.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
@@ -20,7 +20,7 @@
import android.support.v7.testutils.BaseTestActivity;
import android.support.v7.widget.Toolbar;
-public class ToolbarActionBarActivity extends BaseTestActivity {
+public class ToolbarAppCompatActivity extends BaseTestActivity {
private Toolbar mToolbar;
diff --git a/v7/appcompat/tests/src/android/support/v7/app/WindowDecorActionBarActivity.java b/v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java
similarity index 92%
rename from v7/appcompat/tests/src/android/support/v7/app/WindowDecorActionBarActivity.java
rename to v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java
index 90366aa..6454b11 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/WindowDecorActionBarActivity.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java
@@ -19,7 +19,7 @@
import android.support.v7.appcompat.test.R;
import android.support.v7.testutils.BaseTestActivity;
-public class WindowDecorActionBarActivity extends BaseTestActivity {
+public class WindowDecorAppCompatActivity extends BaseTestActivity {
@Override
protected int getContentViewLayoutResId() {
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 9811194..444ffc2 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Stelsel"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Toestelle"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knoppie"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Uitsaai-knoppie. Ontkoppel"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Uitsaai-knoppie. Koppel tans"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Uitsaai-knoppie. Gekoppel"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Saai uit na"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Vind tans toestelle"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ontkoppel"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Vou uit"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Vou in"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumkunswerk"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volumeglyer"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media is gekies nie"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen inligting beskikbaar nie"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Saai tans skerm uit"</string>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 6f7931d..96a2c09 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"ስርዓት"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"መሣሪያዎች"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"የCast አዝራር"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast አዝራር። ግንኙነት ተቋርጧል"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast አዝራር በማገናኘት ላይ"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast አዝራር። ተገናኝቷል"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast አድርግ ወደ"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"መሣሪያዎችን በማግኘት ላይ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ግንኙነት አቋርጥ"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"አስፋ"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ሰብስብ"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"የአልበም ስነ-ጥበብ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ተንሸራታች የድምፅ መቆጣጠሪያ"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ምንም ማህደረመረጃ አልተመረጠም"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ምንም መረጃ አይገኝም"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"ማያ ገጽን በመውሰድ ላይ"</string>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index 29cab47..3caf4b6 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"النظام"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"الأجهزة"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"زر الإرسال"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"زر الإرسال. تم قطع الاتصال"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"زر الإرسال. جارٍ الاتصال"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"زر الإرسال. تم الاتصال"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"إرسال إلى"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"جارٍ البحث عن أجهزة"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع الاتصال"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"توسيع"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"صورة الألبوم"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"شريط تمرير مستوى الصوت"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أية وسائط"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أية معلومات"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
diff --git a/v7/mediarouter/res/values-az-rAZ/strings.xml b/v7/mediarouter/res/values-az-rAZ/strings.xml
index 765520e..31574c3 100644
--- a/v7/mediarouter/res/values-az-rAZ/strings.xml
+++ b/v7/mediarouter/res/values-az-rAZ/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Yayım düyməsi"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayım düyməsi. Bağlantı kəsildi"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayım düyməsi. Qoşulur"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayım düyməsi. Qoşuldu"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Bura yayımlayın"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar axtarılır"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantını kəsin"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişləndirin"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yığcamlaşdırın"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albom incəsənəti"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Səs hərmi diyircəyi"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Heç bir media seçilməyib"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Əlçatan məlumat yoxdur"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayımlanır"</string>
diff --git a/v7/mediarouter/res/values-b+sr+Latn/strings.xml b/v7/mediarouter/res/values-b+sr+Latn/strings.xml
index 6c32754..8075d2e 100644
--- a/v7/mediarouter/res/values-b+sr+Latn/strings.xml
+++ b/v7/mediarouter/res/values-b+sr+Latn/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Dugme Prebaci"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme Prebaci. Veza je prekinuta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme Prebaci. Povezuje se"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme Prebaci. Povezan je"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Pronalaženje uređaja"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za jačinu zvuka"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nema izabranih medija"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nisu dostupne nikakve informacije"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
diff --git a/v7/mediarouter/res/values-be-rBY/strings.xml b/v7/mediarouter/res/values-be-rBY/strings.xml
index de52c06..75c24d5 100644
--- a/v7/mediarouter/res/values-be-rBY/strings.xml
+++ b/v7/mediarouter/res/values-be-rBY/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Сістэма"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Прылады"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляцыі"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляцыі. Адключана"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляцыі. Ідзе падключэнне"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляцыі. Падключана"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Трансляваць на"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгарнуць"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згарнуць"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Вокладка альбома"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Паўзунок гучнасці"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медыяфайл не выбраны"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Інфармацыя адсутнічае"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экран трансляцыі"</string>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index 036b31f..d756d6c 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Бутон за предаване"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Бутон за предаване. Връзката е прекратена"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Бутон за предаване. Свързва се"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Бутон за предаване. Установена е връзка"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Предаване към"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Търсят се устройства"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекратяване на връзката"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгъване"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свиване"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка на албума"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Плъзгач за силата на звука"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Няма избрана мултимедия"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Няма налична информация"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранът се предава"</string>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index 0e3e491..b94b9af 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"সিস্টেম"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ডিভাইসগুলি"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"কাস্ট করার বোতাম"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"কাস্ট করার বোতাম৷ সংযোগ বিচ্ছিন্ন হয়েছে"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"কাস্ট করার বোতাম৷ সংযোগ করা হচ্ছে"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"কাস্ট করার বোতাম৷ সংযুক্ত হয়েছে"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"এতে কাস্ট করুন"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ডিভাইসগুলিকে খোঁজা হচ্ছে"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"সংযোগ বিচ্ছিন্ন করুন"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"প্রসারিত করুন"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"সঙ্কুচিত করুন"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"অ্যালবাম শৈলি"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ভলিউম স্লাইডার"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"কোনো মিডিয়া নির্বাচন করা হয়নি"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"কোনো তথ্য উপলব্ধ নেই"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"স্ক্রীন কাস্ট করা হচ্ছে"</string>
diff --git a/v7/mediarouter/res/values-bs-rBA/strings.xml b/v7/mediarouter/res/values-bs-rBA/strings.xml
index a6894f5..df4e3ef 100644
--- a/v7/mediarouter/res/values-bs-rBA/strings.xml
+++ b/v7/mediarouter/res/values-bs-rBA/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za prebacivanje"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za prebacivanje. Veza je prekinuta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za prebacivanje. Povezivanje"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za prebacivanje. Povezan"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za jačinu zvuka"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nijedan medij nije odabran"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nema dostupnih informacija"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index 7fc51f7..400d424 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositius"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botó d\'emetre"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botó Emet. Desconnectat."</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botó Emet. S\'està connectant."</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botó Emet. Connectat."</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Emet a"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"S\'estan cercant dispositius"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconnecta"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Desplega"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Imatge de l\'àlbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control lliscant de volum"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index f5a286e..5a29bac 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Zařízení"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Tlačítko odesílání"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tlačítko odesílání. Odpojeno"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačítko odesílání. Připojování"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačítko odesílání. Připojeno"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Odesílat do"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Hledání zařízení"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojit"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbalit"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sbalit"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Obal alba"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Posuvník hlasitosti"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nebyla vybrána žádná média"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nejsou k dispozici žádné informace"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Odesílání obsahu obrazovky"</string>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index 9e5f9a5..f33a4ee 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheder"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knap"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knap. Forbindelsen er afbrudt"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knap. Opretter forbindelse"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knap. Tilsluttet"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Finder enheder"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Afbryd"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Udvid"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafik"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Lydstyrkeskyder"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Der er ikke valgt nogen medier"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 91d764f..13686aa 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Geräte"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-Symbol"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Streaming-Schaltfläche. Nicht verbunden"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Streaming-Schaltfläche. Verbindung wird hergestellt"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Streaming-Schaltfläche. Verbunden"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Streamen auf"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Geräte werden gesucht."</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Verbindung trennen"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Maximieren"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minimieren"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumcover"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Schieberegler für die Lautstärke"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Keine Medien ausgewählt"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Keine Informationen verfügbar"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Bildschirm wird gestreamt."</string>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 0a1a62f..3f45621 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Σύστημα"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Συσκευές"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Κουμπί Cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Κουμπί μετάδοσης. Αποσυνδέθηκε"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Κουμπί μετάδοση. Σύνδεση σε εξέλιξη"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Κουμπί μετάδοσης. Συνδέθηκε"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Μετάδοση σε"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Εύρεση συσκευών"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Αποσύνδεση"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Ανάπτυξη"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Σύμπτυξη"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Εξώφυλλο άλμπουμ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ρυθμιστικό έντασης ήχου"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Δεν έχουν επιλεγεί μέσα"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Μετάδοση οθόνης"</string>
diff --git a/v7/mediarouter/res/values-en-rAU/strings.xml b/v7/mediarouter/res/values-en-rAU/strings.xml
index d60689e..9201c1f 100644
--- a/v7/mediarouter/res/values-en-rAU/strings.xml
+++ b/v7/mediarouter/res/values-en-rAU/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index d60689e..9201c1f 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index d60689e..9201c1f 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index 2318059..90aa823 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botón para transmitir"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón para transmitir (desconectado)"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón para transmitir (conectando)"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón para transmitir (conectado)"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmitir a"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Imagen del álbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control deslizante del volumen"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se seleccionó ningún contenido multimedia"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Sin información disponible"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitiendo pantalla"</string>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index 9f108fe..52a886f 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botón de enviar"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de enviar. Desconectado"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de enviar. Conectando"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de enviar. Conectado"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Enviar a"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Portada del álbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control deslizante de volumen"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se ha seleccionado ningún medio"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hay información disponible"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Enviando pantalla"</string>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index 3fab845..ce1847a 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Süsteem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Seadmed"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Ülekandenupp"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Ülekandenupp. Ühendus on katkestatud"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Ülekandenupp. Ühendamine"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Ülekandenupp. Ühendatud"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Ülekandmine seadmesse"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Seadmete otsimine"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkesta ühendus"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Laiendamine"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ahendamine"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumi kujundus"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Helitugevuse liugur"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Meediat pole valitud"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Teave puudub"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekraanikuva ülekandmine"</string>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index bae67ed..c03d73b 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Gailuak"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Igorri botoia"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Igortzeko botoia. Deskonektatuta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Igortzeko botoia. Konektatzen"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Igortzeko botoia. Konektatuta"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Zabaldu"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tolestu"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumaren azala"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Bolumenaren graduatzailea"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ez da hautatu multimedia-edukirik"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ez dago informaziorik"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Pantaila igortzen"</string>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index eb34931..7cc9fbc 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"سیستم"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"دستگاهها"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"دکمه ارسال محتوا"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"دکمه فرستادن. ارتباط قطع شد"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"دکمه فرستادن. درحال مرتبطسازی"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"دکمه فرستادن. مرتبط شد"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ارسال محتوا به"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"پیدا کردن دستگاهها"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع ارتباط"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"بزرگ کردن"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"کوچک کردن"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"عکس روی جلد آلبوم"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"لغزنده میزان صدا"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"رسانه انتخاب نشده است"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات در دسترس نیست"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"درحال فرستادن صفحه"</string>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index f37317a..2465802 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Järjestelmä"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Laitteet"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-painike"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-painike. Yhteys katkaistu"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-painike. Yhdistetään"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-painike. Yhdistetty"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Suoratoiston kohde"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Etsitään laitteita"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkaise yhteys"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Laajenna"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tiivistä"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumin kansikuva"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Äänenvoimakkuuden liukusäädin"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ei valittua mediaa."</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tietoja ei ole saatavilla"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Suoratoistetaan näyttöä"</string>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index 5719479..fd1ea8c 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Bouton Diffuser"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Bouton Diffuser. Déconnecté"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Bouton Diffuser. Connexion en cours…"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Bouton Diffuser. Connecté"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Se déconnecter"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Curseur de réglage du volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours"</string>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index 6ce8329..8c96485 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Icône Cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Icône Cast. Déconnecté"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Icône Cast. Connexion…"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Icône Cast. Connecté"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils en cours…"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Curseur de volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours…"</string>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index c922b68..83489ac 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botón de emitir"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de emitir. Desconectado"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de emitir. Conectando"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de emitir. Conectado"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Emitir en"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Ampliar"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Contraer"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Portada do álbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control desprazable do volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Non se seleccionaron recursos"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Non hai información dispoñible"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emisión de pantalla"</string>
diff --git a/v7/mediarouter/res/values-gu-rIN/strings.xml b/v7/mediarouter/res/values-gu-rIN/strings.xml
index e3be8fc..eb7a9b8 100644
--- a/v7/mediarouter/res/values-gu-rIN/strings.xml
+++ b/v7/mediarouter/res/values-gu-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"સિસ્ટમ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ઉપકરણો"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"કાસ્ટ કરો બટન"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"કાસ્ટ કરો બટન. ડિસ્કનેક્ટ કર્યું"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"કાસ્ટ કરો બટન. કનેક્ટ થઈ રહ્યું છે"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"કાસ્ટ કરો બટન. કનેક્ટ થયું"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"આના પર કાસ્ટ કરો"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ઉપકરણો શોધી રહ્યાં છીએ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ડિસ્કનેક્ટ કરો"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"વિસ્તૃત કરો"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"સંકુચિત કરો"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"આલ્બમ કલા"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"વૉલ્યુમ સ્લાઇડર"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"કોઈ મીડિયા પસંદ કરેલ નથી"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"કોઈ માહિતી ઉપલબ્ધ નથી"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"સ્ક્રીનને કાસ્ટ કરી રહ્યાં છે"</string>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index 9d0650b..e74967e 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"डिवाइस"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट करें बटन"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट करें बटन. डिस्कनेक्ट है"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट करें बटन. कनेक्ट हो रहा है"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट करें बटन. कनेक्ट है"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"इस पर कास्ट करें"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"डिवाइस ढूंढ रहा है"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करें"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करें"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त करें"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"वॉल्यूम स्लाइडर"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कोई मीडिया चयनित नहीं है"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोई जानकारी उपलब्ध नहीं"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट हो रही है"</string>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index 371088b..f50d748 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sustav"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za emitiranje"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Gumb za emitiranje. Veza prekinuta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Gumb za emitiranje. Povezivanje"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Gumb za emitiranje. Povezan"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširivanje"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sažimanje"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za glasnoću"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nije odabran nijedan medij"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacije nisu dostupne"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emitiranje zaslona"</string>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index a3d6990..6420985 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Rendszer"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Eszközök"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Átküldés gomb"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Átküldés gomb. Kapcsolat bontva"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Átküldés gomb. Csatlakozás"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Átküldés gomb. Csatlakoztatva"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Átküldés ide"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Eszközök keresése"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Leválasztás"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Kibontás"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Összecsukás"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Lemezborító"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Hangerőszabályzó"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nincs média kiválasztva"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nincs információ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Képernyőtartalom átküldése"</string>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index a8c1cf3..6e46af8 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Համակարգ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Սարքեր"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Հեռարձակման կոճակ"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Հեռարձակման կոճակ: Սարքն անջատված է"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Հեռարձակման կոճակ: Սարքը կապակցվում է"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Հեռարձակման կոճակ: Սարքը կապակցված է"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Ընտրեք սարքը"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Սարքերի որոնում"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Անջատել"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Ընդարձակել"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Կոծկել"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Ալբոմի շապիկ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ձայնի ուժգնության կարգավորիչ"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Մեդիա ֆայլեր չեն ընտրվել"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Տեղեկությունները հասանելի չեն"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Էկրանը հեռարձակվում է"</string>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index 4bc0852..43e0c62 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Perangkat"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Tombol transmisi"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol transmisi. Terputus"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol transmisi. Menghubungkan"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol transmisi. Terhubung"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmisikan ke"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Luaskan"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ciutkan"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Sampul album"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Bilah geser volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tidak ada media yang dipilih"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tidak ada info yang tersedia"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmisi layar"</string>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 08e41e6..53de253 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Kerfi"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Tæki"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Útsendingarhnappur"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Útsendingarhnappur. Aftengt"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Útsendingarhnappur. Tengist"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Útsendingarhnappur. Tengt"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Senda út í"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Leitað að tækjum"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Aftengjast"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Stækka"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minnka"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Plötuumslag"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Hljóðstyrkssleði"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Enginn miðill valinn"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Engar upplýsingar í boði"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skjár sendur út"</string>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index 87b570c..df6bbfe 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivi"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Pulsante Trasmetti"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Pulsante Trasmetti. Disconnesso"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Pulsante Trasmetti. Connessione in corso"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Pulsante Trasmetti. Connesso"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Trasmetti a"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Ricerca di dispositivi in corso"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Scollega"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Espandi"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Comprimi"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Copertina"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Dispositivo di scorrimento del volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nessun contenuto multimediale selezionato"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nessuna informazione disponibile"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Trasmissione dello schermo in corso"</string>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index 8b52adf..be705a6 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"מערכת"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"מכשירים"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"לחצן הפעלת Cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"לחצן הפעלת Cast. מנותק"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"לחצן הפעלת Cast. מתחבר"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"לחצן הפעלת Cast. מחובר"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"העבר אל"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"הרחב"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"כווץ"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"עטיפת אלבום"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"מחוון עוצמה"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"לא נבחרה מדיה"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"אין מידע זמין"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"העברת מסך מתבצעת"</string>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index b126965..75d75d6 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"システム"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"端末"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"キャストアイコン"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"キャスト アイコン。接続解除済み"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"キャスト アイコン。接続中"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"キャスト アイコン。接続済み"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"キャストするデバイス"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"端末を検索しています"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"接続を解除"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"折りたたむ"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"アルバムアート"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量スライダー"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"メディアが選択されていません"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"情報がありません"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"画面をキャストしています"</string>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index 046e361..3bcc513 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"სისტემა"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"მოწყობილობები"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ტრანსლირების ღილაკი"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ტრანსლირების ღილაკი. გათიშული"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირებული"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"მიმდინარეობს მოწყობილობების მოძიება"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"გაშლა"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ჩაკეცვა"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ალბომის გარეკანი"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ხმის სლაიდერი"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"მედია არჩეული არ არის"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"მიმდინარეობს ეკრანის გადაცემა"</string>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index 5cf4e5a..43e75b7 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Жүйе"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Құрылғылар"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Трансляциялау түймесі"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"\"Трансляциялау\" түймесі. Ажыратулы"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"\"Трансляциялау\" түймесі. Қосылуда"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"\"Трансляциялау\" түймесі. Қосылды"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Келесіге трансляциялау"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Құрылғыларды табу"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажырату"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Жаю"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жию"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом шебері"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Дыбыс деңгейінің жүгірткісі"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ешбір тасушы таңдалмаған"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Қол жетімді ақпарат жоқ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экранды трансляциялау"</string>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index fd05668..44d88f4 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"ប្រព័ន្ធ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ឧបករណ៍"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ប៊ូតុងខាស"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ខាសប៊ូតុង៖ បានកាត់ផ្តាច់"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ខាសប៊ូតុង៖ កំពុងភ្ជាប់"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ខាសប៊ូតុង៖ បានភ្ជាប់ហើយ"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ខាសទៅ"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ស្វែងរកឧបករណ៍"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"ពង្រីក"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"បង្រួម"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ស្នាដៃសិល្បៈអាល់ប៊ុម"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"របារកម្រិតសំឡេង"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"គ្មានការជ្រើសមេឌៀទេ"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"មិនមានព័ត៌មានទេ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"កំពុងខាសអេក្រង់"</string>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 9cae5be..193d449 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"ಸಿಸ್ಟಂ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ಸಾಧನಗಳು"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ಬಿತ್ತರಿಸು ಬಟನ್"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"ವಿಸ್ತರಿಸು"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ಸಂಕುಚಿಸು"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ಆಲ್ಬಮ್ ಕಲೆ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ವಾಲ್ಯೂಮ್ ಸ್ಲೈಡರ್"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index 7f53382..242560a 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"시스템"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"기기"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"전송 버튼"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"전송 버튼. 연결 해제됨"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"전송 버튼. 연결 중"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"전송 버튼. 연결됨"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"전송할 기기"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"기기를 찾는 중"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"연결 해제"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"펼치기"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"접기"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"앨범아트"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"볼륨 슬라이더"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"선택한 미디어 없음"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"정보가 없습니다."</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"화면 전송 중"</string>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index 99201dc..0898ade 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Тутум"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Тышкы экранга чыгаруу баскычы"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Тышкы экранга чыгаруу баскычы. Түзмөк ажырап турат."</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Тышкы экранга чыгаруу баскычы. Түзмөк туташууда"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Тышкы экранга чыгаруу баскычы. Түзмөк туташып турат"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Түзмөктөр изделүүдө"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажыратуу"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Жайып көрсөтүү"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жыйыштыруу"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом мукабасы"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Үндү катуулатуучу сыдырма"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Бир да медиа файл тандалган жок"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Эч маалымат жок"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Тышкы экранга чыгарылууда"</string>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index 2765364..65b3472 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"ລະບົບ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ອຸປະກອນ"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ປຸ່ມຄາສທ໌"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ຄາສທ໌ຫາ"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"ຂະຫຍາຍ"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ຫຍໍ້ລົງ"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ໜ້າປົກອະລະບໍ້າ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ຕົວປັບລະດັບສຽງ"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ບໍ່ໄດ້ເລືອກມີເດຍໃດໄວ້"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ບໍ່ມີຂໍ້ມູນ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"ການສົ່ງພາບໜ້າຈໍ"</string>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index 208752f..35931cf 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Įrenginiai"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Perdavimo mygtukas"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Perdavimo mygtukas. Atsijungta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Perdavimo mygtukas. Prisijungiama"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Perdavimo mygtukas. Prisijungta"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Perduoti į"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Randami įrenginiai"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Atjungti"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Išskleisti"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sutraukti"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumo viršelis"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Garsumo šliaužiklis"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nepasirinkta jokia medija"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacija nepasiekiama"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Perduodamas ekranas"</string>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index 832a3ba..c146174 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistēma"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Ierīces"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Apraides poga"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Apraides poga. Savienojums pārtraukts"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Apraides poga. Notiek savienojuma izveide"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Apraides poga. Savienojums izveidots"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Apraidīšana uz ierīci"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Notiek ierīču meklēšana"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Atvienot"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Izvērst"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sakļaut"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albuma vāciņš"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Skaļuma slīdnis"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nav atlasīti multivides faili"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nav pieejama informācija"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Notiek ekrāna apraide"</string>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index 726e285..6fd428f 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Уреди"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Копчето за Cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Копче за Cast. Исклучено"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Копче за Cast. Се поврзува"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Копче за Cast. Поврзано"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Наоѓање уреди"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Собери"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Корица на албум"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Лизгач за јачина на звук"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Не се избрани медиуми"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нема достапни информации"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранот се емитува"</string>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index b1d2cbe..63a37f8 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"സിസ്റ്റം"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ഉപകരണങ്ങൾ"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ടാപ്പുചെയ്യുക"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"കാസ്റ്റ് ബട്ടൺ. വിച്ഛേദിച്ചു"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"കാസ്റ്റ് ബട്ടൺ. കണക്റ്റുചെയ്യുന്നു"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"കാസ്റ്റ് ബട്ടൺ. കണക്റ്റുചെയ്തു"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ഇതിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"വികസിപ്പിക്കുക"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ചുരുക്കുക"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ആൽബം ആർട്ട്"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"വോളിയം സ്ലൈഡർ"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"സ്ക്രീൻ കാസ്റ്റുചെയ്യുന്നു"</string>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index d07d314..1197bfe 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Төхөөрөмжүүд"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Дамжуулах товчлуур"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Дамжуулах товчлуур. Салсан"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Дамжуулах товчлуур. Холбож байна"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Дамжуулах товчлуур. Холбогдсон"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Дамжуулах"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Төхөөрөмж хайж байна"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Салгах"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Дэлгэх"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Хураах"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Цомгийн зураг"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Дууны түвшин тааруулагч"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ямар ч медиа сонгоогүй"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Мэдээлэл байхгүй байна"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Дэлгэцийг дамжуулж байна"</string>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index 4e24aff..40d7d66 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट बटण"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट बटण. डिस्कनेक्ट केले"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट बटण. कनेक्ट करीत आहे"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट बटण. कनेक्ट केले"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करा"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करा"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"संकुचित करा"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"अल्बम कला"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"व्हॉल्यूम स्लायडर"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट करीत आहे"</string>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index 2a4cd1c..cc32b96 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Peranti"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Butang Hantar"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butang hantar. Sambungan diputuskan"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butang hantar. Menyambung"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butang hantar. Disambungkan"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Hantar ke"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari peranti"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Kembangkan"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Runtuhkan"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Seni album"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Peluncur kelantangan"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tiada media dipilih"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Maklumat tidak tersedia"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Menghantar skrin"</string>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index eca8835..e31cc92 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"စနစ်"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"စက်ပစ္စည်းများ"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ကာစ်တ်လုပ်ရန် ခလုတ်"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"သို့ ကာစ်တ်လုပ်ရန်"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"ဖြန့်ချရန်၃"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ခေါက်သိမ်းရန်..."</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"အယ်လ်ဘမ်ပုံ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"အသံအတိုးအကျယ်ချိန်သည့် ဆလိုက်ဒါ"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"မည်သည့်မီဒီမှ မရွေးချယ်ထားပါ"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"အချက်အလက် မရရှိနိုင်ပါ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"တည်းဖြတ်ရေး မျက်နှာပြင်"</string>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index 27f9f03..97ca73c 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-ikonet"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knappen. Frakoblet"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Kobler til"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Tilkoblet"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Finner enheter"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Utvid"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafikk"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Glidebryter for volum"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Du har ikke valgt noen medier"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ingen informasjon er tilgjengelig"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Caster skjermen"</string>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index 6abadbf..0e48b45 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"प्रणाली"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"उपकरणहरू"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast बटन"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast बटन। जडान विच्छेद भयो"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast बटन। जडान हुँदै"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast बटन। जडान भयो"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"यसमा Cast गर्नुहोस्"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"यन्त्रहरू पत्ता लगाउँदै"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"विच्छेद गर्नुहोस्"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार गर्नुहोस्"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त पार्नुहोस्"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"भोल्युमको स्लाइडर"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कुनै मिडिया चयन भएको छैन"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"जानकारी उपलब्ध छैन"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रिन cast गर्दै"</string>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index 4a9346d..5c899fd 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Systeem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Apparaten"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-icoon"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-icoon. Verbinding verbroken"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-icoon. Verbinding maken"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-icoon. Verbonden"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Casten naar"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Apparaten zoeken"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Loskoppelen"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Uitvouwen"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Samenvouwen"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albumhoes"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volumeschuifregelaar"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media geselecteerd"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen informatie beschikbaar"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Scherm casten"</string>
diff --git a/v7/mediarouter/res/values-pa-rIN/strings.xml b/v7/mediarouter/res/values-pa-rIN/strings.xml
index 842a8b4..258529d 100644
--- a/v7/mediarouter/res/values-pa-rIN/strings.xml
+++ b/v7/mediarouter/res/values-pa-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"ਸਿਸਟਮ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ਡਿਵਾਈਸਾਂ"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ਕਾਸਟ ਬਟਨ"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ਕਾਸਟ ਬਟਨ। ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"ਇਸ ਨਾਲ ਕਾਸਟ ਕਰੋ"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ਡਿਵਾਈਸਾਂ ਲੱਭ ਰਿਹਾ ਹੈ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ਬੰਦ ਕਰੋ"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ਐਲਬਮ ਆਰਟ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ਵੌਲਯੂਮ ਸਲਾਈਡਰ"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ਕੋਈ ਵੀ ਮੀਡੀਆ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ਕੋਈ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਨਹੀਂ"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"ਸਕ੍ਰੀਨ ਜੋੜ ਰਿਹਾ ਹੈ"</string>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index d66be1a..0320550 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Urządzenia"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Przycisk Cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Przycisk Prześlij ekran. Rozłączono"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Przycisk Prześlij ekran. Łączę"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Przycisk Prześlij ekran. Połączono"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Przesyłaj na"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Znajdowanie urządzeń"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Odłącz"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozwiń"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zwiń"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Okładka albumu"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Suwak głośności"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie wybrano multimediów"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Brak informacji"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Przesyłam ekran"</string>
diff --git a/v7/mediarouter/res/values-pt-rBR/strings.xml b/v7/mediarouter/res/values-pt-rBR/strings.xml
index 4d7e6cc..2fd84b1 100644
--- a/v7/mediarouter/res/values-pt-rBR/strings.xml
+++ b/v7/mediarouter/res/values-pt-rBR/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão \"Transmitir\". Desconectado"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão \"Transmitir\". Conectando"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão \"Transmitir\". Conectado"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controle deslizante de volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index 0c68b92..b62f363 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão Transmitir. Desligado"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão Transmitir. A ligar..."</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão Transmitir. Ligado"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"A localizar dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desassociar"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Reduzir"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Imagem do álbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controlo de deslize do volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhum suporte multimédia selecionado"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"A transmitir o ecrã"</string>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 4d7e6cc..2fd84b1 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão \"Transmitir\". Desconectado"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão \"Transmitir\". Conectando"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão \"Transmitir\". Conectado"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controle deslizante de volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index 9fe26a9..769a0ac 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispozitive"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Butonul de proiecție"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butonul de proiecție. Deconectat"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butonul de proiecție. Se conectează"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butonul de proiecție. Conectat"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Proiectați pe"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Se caută dispozitive"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Deconectați-vă"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Extindeți"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Restrângeți"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Grafica albumului"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Glisor pentru volum"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Niciun fișier media selectat"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nu sunt disponibile informații"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Se proiectează ecranul"</string>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index 4607a8c..9bd2170 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляции"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляции. Устройство отключено."</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляции. Устройство подключается."</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляции. Устройство подключено."</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Выберите устройство"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Поиск устройств…"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Отключить"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Развернуть"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свернуть"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Регулятор громкости"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медиафайл не выбран"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Данных нет"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Подключение к удаленному монитору"</string>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index 144a0d5..baeac3e 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"පද්ධතිය"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"උපාංග"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"විකාශ බොත්තම"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"විකාශ බොත්තම. විසන්ධි කරන ලදී"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"විකාශ බොත්තම සම්බන්ධ කරමින්"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"විකාශ බොත්තම සම්බන්ධ කරන ලදී"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"විකාශය"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"උපාංග සෙවීම"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"විසන්ධි කරන්න"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"දිග හරින්න"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"හකුළන්න"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ඇල්බම කලාව"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"හඬ පරිමා ස්ලයිඩරය"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"මාධ්යය තෝරා නැත"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"විකාශ තිරය"</string>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index b546bde..4a0f4bf 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Zariadenia"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Tlačidlo prenosu"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tlačidlo prenosu. Odpojené"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačidlo prenosu. Pripája sa"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačidlo prenosu. Pripojené"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Vyhľadávanie zariadení"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbaliť"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zbaliť"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Obrázok albumu"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Posúvač hlasitosti"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie sú vybrané žiadne médiá"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nie sú k dispozícii žiadne informácie"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prenáša sa obrazovka"</string>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 110c548..4ca2bdc 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Naprave"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za predvajanje"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Gumb za predvajanje. Povezava je prekinjena."</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Gumb za predvajanje. Vzpostavljanje povezave."</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Gumb za predvajanje. Povezava je vzpostavljena."</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Predvajanje prek:"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Iskanje naprav"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini povezavo"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Razširi"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Strni"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Drsnik za glasnost"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ni izbrane predstavnosti"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Podatki niso na voljo"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Predvajanje zaslona"</string>
diff --git a/v7/mediarouter/res/values-sq-rAL/strings.xml b/v7/mediarouter/res/values-sq-rAL/strings.xml
index 8ed93c3..45e3a34 100644
--- a/v7/mediarouter/res/values-sq-rAL/strings.xml
+++ b/v7/mediarouter/res/values-sq-rAL/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistemi"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Pajisjet"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Butoni i transmetimit"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butoni i transmetimit. Je i shkëputur"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butoni i transmetimit. Po lidhet"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butoni i transmetimit. Je i lidhur"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Gjetja e pajisjeve"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Zgjeroje"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Palose"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Kopertina e albumit"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Rrëshqitësi i volumit"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nuk u zgjodh asnjë media"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nuk jepet asnjë informacion"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Po transmeton ekranin"</string>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index 5a72bd4..bddc045 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Уређаји"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Дугме Пребаци"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Дугме Пребаци. Веза је прекинута"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Дугме Пребаци. Повезује се"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Дугме Пребаци. Повезан је"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Пребацујте на"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Проналажење уређаја"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекини везу"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Скупи"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Омот албума"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Клизач за јачину звука"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Нема изабраних медија"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нису доступне никакве информације"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Пребацује се екран"</string>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index 3724902..9597bf9 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knappen"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knappen. Frånkopplad"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Ansluter"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Ansluten"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Casta till"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Letar efter enheter"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Koppla från"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Utöka"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Komprimera"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Skivomslag"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volymreglage"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Inga media har valts"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Det finns ingen information"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skärmen castas"</string>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index f12fd5c..f7ae8f5 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Mfumo"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Vifaa"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Kitufe cha kutuma"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Kitufe cha kutuma. Kimeondolewa"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Kitufe cha kutuma. Kinaunganisha"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Kitufe cha kutuma. Kimeunganishwa"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Tuma kwenye"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Inatafuta vifaa"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ondoa"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Panua"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Kunja"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Sanaa ya albamu"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Kitelezi cha sauti"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Hakuna maudhui yaliyochaguliwa"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hakuna maelezo yaliyopatikana"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Inatuma skrini"</string>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index c314178..0ef3fc3 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"அமைப்பு"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"திரையிடு பட்டன்"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"அனுப்புதல் பொத்தான். துண்டிக்கப்பட்டது"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"அனுப்புதல் பொத்தான். இணைக்கிறது"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"அனுப்புதல் பொத்தான். இணைக்கப்பட்டது"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"இதில் திரையிடு"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"விரிவாக்கு"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"சுருக்கு"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ஆல்பம் ஆர்ட்"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ஒலியளவு ஸ்லைடர்"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"தகவல் எதுவுமில்லை"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"திரையை அனுப்புகிறீர்கள்"</string>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index 59a4f19..c7ae34f 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"సిస్టమ్"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"పరికరాలు"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ప్రసారం చేయి బటన్"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ప్రసార బటన్. డిస్కనెక్ట్ చేయబడింది"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ప్రసార బటన్. కనెక్ట్ చేస్తోంది"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ప్రసార బటన్. కనెక్ట్ చేయబడింది"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"దీనికి ప్రసారం చేయండి"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"పరికరాలను కనుగొంటోంది"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"డిస్కనెక్ట్ చేయి"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"విస్తరింపజేస్తుంది"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"కుదిస్తుంది"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ఆల్బమ్ ఆర్ట్"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"వాల్యూమ్ స్లయిడర్"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"మీడియా ఏదీ ఎంచుకోబడలేదు"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"సమాచారం అందుబాటులో లేదు"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"స్క్రీన్ను ప్రసారం చేస్తోంది"</string>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index 1bfd091..219374c 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"ระบบ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"อุปกรณ์"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"ปุ่ม \"แคสต์\""</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ปุ่ม \"แคสต์\" ยกเลิกการเชื่อมต่อ"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ปุ่ม \"แคสต์\" กำลังเชื่อมต่อ"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"ปุ่ม \"แคสต์\" เชื่อมต่อแล้ว"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"แคสต์ไปยัง"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"กำลังค้นหาอุปกรณ์"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ยกเลิกการเชื่อมต่อ"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"ขยาย"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"ยุบ"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"ปกอัลบั้ม"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"แถบเลื่อนปรับระดับเสียง"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ไม่ได้เลือกสื่อไว้"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"ไม่มีข้อมูล"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"กำลังแคสต์หน้าจอ"</string>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index 82396e1..e2bb7c7 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Mga Device"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Button na I-cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Button na I-cast. Nadiskonekta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Button na I-cast. Kumokonekta"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Button na I-cast. Nakakonekta"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"I-cast sa"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Naghahanap ng mga device"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Idiskonekta"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Palawakin"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"I-collapse"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Slider ng volume"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Walang piniling media"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Walang available na impormasyon"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Kina-cast ang screen"</string>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index e639963..187682f 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Yayın düğmesi"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayınla düğmesi. Bağlantı kesildi"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayınla düğmesi. Bağlanıyor"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayınla düğmesi. Bağlandı"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Şuraya yayınla:"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar bulunuyor"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantıyı kes"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişlet"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Daralt"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albüm kapağı"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ses düzeyi kaydırma çubuğu"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Medya seçilmedi"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Bilgi yok"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayınlanıyor"</string>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index a768e2c..8c2a16a 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Пристрої"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляції"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляції. Від’єднано"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляції. Під’єднання"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляції. Під’єднано"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Транслювати на"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук пристроїв"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Відключити"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Розгорнути"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згорнути"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Обкладинка альбому"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Повзунок гучності"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медіа-файл не вибрано"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Немає даних"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Трансляція екрана"</string>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index 5cb3b36..053373f 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"سسٹم"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"آلات"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"کاسٹ کرنے کا بٹن"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"کاسٹ کرنے کا بٹن۔ غیر منسلک ہے"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"کاسٹ کرنے کا بٹن۔ منسلک ہو رہا ہے"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"کاسٹ کرنے کا بٹن۔ منسلک ہے"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"اس میں کاسٹ کریں"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"آلات تلاش ہو رہے ہیں"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"غیر منسلک کریں"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"پھیلائیں"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"سکیڑیں"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"البم آرٹ"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"والیوم سلائیڈر"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"کوئی میڈیا منتخب نہیں ہے"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"کوئی معلومات دستیاب نہیں"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"سکرین کاسٹ ہو رہی ہے"</string>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index 9955cdfd..9d1e455 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Tizim"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Qurilmalar"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Translatsiya tugmasi"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Translatsiya tugmasi. Uzildi"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Translatsiya tugmasi. Ulanmoqda"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Translatsiya tugmasi. Ulandi"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Quyidagiga translatsiya qilish:"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Qurilmalarni topish"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ulanishni uzish"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albom muqovasi"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ovoz balandligi slayderi"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 0080e3e..488b9f0 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Hệ thống"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Thiết bị"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Nút truyền"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Nút truyền. Đã ngắt kết nối"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Nút truyền. Đang kết nối"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Nút truyền. Đã kết nối"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Tìm thiết bị"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Mở rộng"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Thu gọn"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Ảnh bìa album"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Thanh trượt âm lượng"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Không có phương tiện nào được chọn"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Không có thông tin nào"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Đang truyền màn hình"</string>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index aabe727..c22a91c 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"系统"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"设备"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"投射按钮"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投射按钮。已断开连接"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投射按钮。正在连接"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"投射按钮。已连接"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"投射到"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"正在查找设备"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"断开连接"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"展开"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"折叠"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"专辑封面"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑块"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未选择任何媒体"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"没有任何相关信息"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投射屏幕"</string>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index d01c823..d17469b 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投放按鈕。已解除連接"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投放按鈕。正在連接"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"投放按鈕。已連接"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"投放至"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑桿"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"尚未選擇媒體"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有詳細資料"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index 68347e5..1a71c84 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投放按鈕;已中斷連線"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投放按鈕;連線中"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"投放按鈕;已連線"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"投放到"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑桿"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未選取任何媒體"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有可用的資訊"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index e50acc8..860aa09 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -19,6 +19,9 @@
<string name="mr_system_route_name" msgid="5441529851481176817">"Isistimu"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Amadivayisi"</string>
<string name="mr_button_content_description" msgid="3698378085901466129">"Inkinobho ye-Cast"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Inkinobho yokusakaza. Kunqanyuliwe"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Inkinobho yokusakaza. Kuyaxhunywa"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Inkinobho yokusakaza. Kuxhunyiwe"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Sakaza ku-"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Ithola amadivayisi"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Nqamula"</string>
@@ -29,6 +32,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Nweba"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Goqa"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Ubuciko be-albhamu"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Isilayida sevolumu"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ayikho imidiya ekhethiwe"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Alukho ulwazi olutholakalayo"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Isikrini sokusakaza"</string>
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteActionProvider.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteActionProvider.java
index 79fad1f..4ed1e1a 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteActionProvider.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteActionProvider.java
@@ -69,7 +69,7 @@
* </pre><p>
* Then configure the menu and set the route selector for the chooser.
* </p><pre>
- * public class MyActivity extends ActionBarActivity {
+ * public class MyActivity extends AppCompatActivity {
* private MediaRouter mRouter;
* private MediaRouter.Callback mCallback;
* private MediaRouteSelector mSelector;
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 761405e..875c57c 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -7966,11 +7966,11 @@
int size = Math.max(0, parentSize - padding);
int resultSize = 0;
int resultMode = 0;
- if (childDimension >= 0) {
- resultSize = childDimension;
- resultMode = MeasureSpec.EXACTLY;
- } else if (canScroll) {
- if (childDimension == LayoutParams.MATCH_PARENT){
+ if (canScroll) {
+ if (childDimension >= 0) {
+ resultSize = childDimension;
+ resultMode = MeasureSpec.EXACTLY;
+ } else if (childDimension == LayoutParams.FILL_PARENT){
switch (parentMode) {
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
@@ -7987,7 +7987,10 @@
resultMode = MeasureSpec.UNSPECIFIED;
}
} else {
- if (childDimension == LayoutParams.MATCH_PARENT) {
+ if (childDimension >= 0) {
+ resultSize = childDimension;
+ resultMode = MeasureSpec.EXACTLY;
+ } else if (childDimension == LayoutParams.FILL_PARENT) {
resultSize = size;
resultMode = parentMode;
} else if (childDimension == LayoutParams.WRAP_CONTENT) {
diff --git a/v8/renderscript/Android.mk b/v8/renderscript/Android.mk
deleted file mode 100644
index 8815a0a..0000000
--- a/v8/renderscript/Android.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2012 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.
-#
-
-# Don't build the library in unbundled branches.
-ifeq (,$(TARGET_BUILD_APPS))
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_CFLAGS += -std=c++11
-
-LOCAL_MODULE := android-support-v8-renderscript
-LOCAL_SDK_VERSION := 23
-LOCAL_SRC_FILES := $(call all-java-files-under, java/src)
-LOCAL_SHARED_ANDROID_LIBRARIES := android-support-annotations
-
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# TODO: Build the tests as an APK here
-
-include $(call all-makefiles-under, $(LOCAL_PATH))
-
-endif
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java b/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
deleted file mode 100644
index 2384518..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
+++ /dev/null
@@ -1,3032 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.util.Log;
-import android.view.Surface;
-
-/**
- * <p> This class provides the primary method through which data is passed to
- * and from RenderScript kernels. An Allocation provides the backing store for
- * a given {@link android.support.v8.renderscript.Type}. </p>
- *
- * <p>An Allocation also contains a set of usage flags that denote how the
- * Allocation could be used. For example, an Allocation may have usage flags
- * specifying that it can be used from a script as well as input to a {@link
- * android.support.v8.renderscript.Sampler}. A developer must synchronize
- * across these different usages using
- * {@link android.support.v8.renderscript.Allocation#syncAll} in
- * order to ensure that different users of the Allocation have a consistent view
- * of memory. For example, in the case where an Allocation is used as the output
- * of one kernel and as Sampler input in a later kernel, a developer must call
- * {@link #syncAll syncAll(Allocation.USAGE_SCRIPT)} prior to launching the
- * second kernel to ensure correctness.
- *
- * <p>An Allocation can be populated with the {@link #copyFrom} routines. For
- * more complex Element types, the {@link #copyFromUnchecked} methods can be
- * used to copy from byte arrays or similar constructs.</p>
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about creating an application that uses
- * RenderScript, read the
- * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
- * developer guide.</p>
- * </div>
- **/
-public class Allocation extends BaseObj {
- Type mType;
- Bitmap mBitmap;
- int mUsage;
- int mSize;
- Allocation mAdaptedAllocation;
- ByteBuffer mByteBuffer = null;
- long mByteBufferStride = 0;
-
- boolean mConstrainedLOD;
- boolean mConstrainedFace;
- boolean mConstrainedY;
- boolean mConstrainedZ;
- boolean mReadAllowed = true;
- boolean mWriteAllowed = true;
- boolean mAutoPadding = false;
- int mSelectedY;
- int mSelectedZ;
- int mSelectedLOD;
- Type.CubemapFace mSelectedFace = Type.CubemapFace.POSITIVE_X;
-
- int mCurrentDimX;
- int mCurrentDimY;
- int mCurrentDimZ;
- int mCurrentCount;
-
- private Element.DataType validateObjectIsPrimitiveArray(Object d, boolean checkType) {
- final Class c = d.getClass();
- if (!c.isArray()) {
- throw new RSIllegalArgumentException("Object passed is not an array of primitives.");
- }
- final Class cmp = c.getComponentType();
- if (!cmp.isPrimitive()) {
- throw new RSIllegalArgumentException("Object passed is not an Array of primitives.");
- }
-
- if (cmp == Long.TYPE) {
- if (checkType) {
- validateIsInt64();
- return mType.mElement.mType;
- }
- return Element.DataType.SIGNED_64;
- }
-
- if (cmp == Integer.TYPE) {
- if (checkType) {
- validateIsInt32();
- return mType.mElement.mType;
- }
- return Element.DataType.SIGNED_32;
- }
-
- if (cmp == Short.TYPE) {
- if (checkType) {
- validateIsInt16();
- return mType.mElement.mType;
- }
- return Element.DataType.SIGNED_16;
- }
-
- if (cmp == Byte.TYPE) {
- if (checkType) {
- validateIsInt8();
- return mType.mElement.mType;
- }
- return Element.DataType.SIGNED_8;
- }
-
- if (cmp == Float.TYPE) {
- if (checkType) {
- validateIsFloat32();
- }
- return Element.DataType.FLOAT_32;
- }
-
- if (cmp == Double.TYPE) {
- if (checkType) {
- validateIsFloat64();
- }
- return Element.DataType.FLOAT_64;
- }
- return null;
- }
-
- /*
- * Hold reference to the shared allocation in compat context
- * for Incremental Support Lib.
- */
- long mIncCompatAllocation;
- boolean mIncAllocDestroyed;
- /**
- * The usage of the Allocation. These signal to RenderScript where to place
- * the Allocation in memory.
- *
- */
-
- /**
- * The Allocation will be bound to and accessed by scripts.
- */
- public static final int USAGE_SCRIPT = 0x0001;
-
- /**
- * The Allocation will be used as a texture source by one or more graphics
- * programs.
- *
- */
- public static final int USAGE_GRAPHICS_TEXTURE = 0x0002;
-
- /**
- * The Allocation will be used as a {@link android.graphics.SurfaceTexture}
- * consumer. This usage will cause the Allocation to be created as
- * read-only.
- *
- */
- public static final int USAGE_IO_INPUT = 0x0020;
-
- /**
- * The Allocation will be used as a {@link android.graphics.SurfaceTexture}
- * producer. The dimensions and format of the {@link
- * android.graphics.SurfaceTexture} will be forced to those of the
- * Allocation.
- *
- */
- public static final int USAGE_IO_OUTPUT = 0x0040;
-
- /**
- * The Allocation's backing store will be inherited from another object
- * (usually a {@link android.graphics.Bitmap}); copying to or from the
- * original source Bitmap will cause a synchronization rather than a full
- * copy. {@link #syncAll} may also be used to synchronize the Allocation
- * and the source Bitmap.
- *
- * <p>This is set by default for allocations created with {@link
- * #createFromBitmap} in API version 18 and higher.</p>
- *
- */
- public static final int USAGE_SHARED = 0x0080;
-
- /**
- * Controls mipmap behavior when using the bitmap creation and update
- * functions.
- */
- public enum MipmapControl {
- /**
- * No mipmaps will be generated and the type generated from the incoming
- * bitmap will not contain additional LODs.
- */
- MIPMAP_NONE(0),
-
- /**
- * A full mipmap chain will be created in script memory. The Type of
- * the Allocation will contain a full mipmap chain. On upload, the full
- * chain will be transferred.
- */
- MIPMAP_FULL(1),
-
- /**
- * The Type of the Allocation will be the same as MIPMAP_NONE. It will
- * not contain mipmaps. On upload, the allocation data will contain a
- * full mipmap chain generated from the top level in script memory.
- */
- MIPMAP_ON_SYNC_TO_TEXTURE(2);
-
- int mID;
- MipmapControl(int id) {
- mID = id;
- }
- }
-
- /**
- * Getter & Setter for the dummy allocation for Inc Support Lib.
- *
- */
- public long getIncAllocID() {
- return mIncCompatAllocation;
- }
- public void setIncAllocID(long id) {
- mIncCompatAllocation = id;
- }
-
- private long getIDSafe() {
- if (mAdaptedAllocation != null) {
- return mAdaptedAllocation.getID(mRS);
- }
- return getID(mRS);
- }
-
-
- /**
- * Get the {@link android.support.v8.renderscript.Element} of the {@link
- * android.support.v8.renderscript.Type} of the Allocation.
- *
- * @return Element
- *
- */
- public Element getElement() {
- return mType.getElement();
- }
-
- /**
- * Get the usage flags of the Allocation.
- *
- * @return usage this Allocation's set of the USAGE_* flags OR'd together
- *
- */
- public int getUsage() {
- return mUsage;
- }
-
- /**
- * Specifies the mapping between the Allocation's cells and an array's elements
- * when data is copied from the Allocation to the array, or vice-versa.
- *
- * Only applies to an Allocation whose Element is a vector of length 3 (such as
- * {@link Element#U8_3} or {@link Element#RGB_888}). Enabling this feature may make
- * copying data from the Allocation to an array or vice-versa less efficient.
- *
- * <p> Vec3 Element cells are stored in an Allocation as Vec4 Element cells with
- * the same {@link android.support.v8.renderscript.Element.DataType}, with the fourth vector
- * component treated as padding. When this feature is enabled, only the data components,
- * i.e. the first 3 vector components of each cell, will be mapped between the array
- * and the Allocation. When disabled, explicit mapping of the padding components
- * is required, as described in the following example.
- *
- * <p> For example, when copying an integer array to an Allocation of two {@link
- * Element#I32_3} cells using {@link #copyFrom(int[])}:
- * <p> When disabled:
- * The array must have at least 8 integers, with the first 4 integers copied
- * to the first cell of the Allocation, and the next 4 integers copied to
- * the second cell. The 4th and 8th integers are mapped as the padding components.
- *
- * <p> When enabled:
- * The array just needs to have at least 6 integers, with the first 3 integers
- * copied to the the first cell as data components, and the next 3 copied to
- * the second cell. There is no mapping for the padding components.
- *
- * <p> Similarly, when copying a byte array to an Allocation of two {@link
- * Element#I32_3} cells, using {@link #copyFromUnchecked(int[])}:
- * <p> When disabled:
- * The array must have at least 32 bytes, with the first 16 bytes copied
- * to the first cell of the Allocation, and the next 16 bytes copied to
- * the second cell. The 13th-16th and 29th-32nd bytes are mapped as padding
- * components.
- *
- * <p> When enabled:
- * The array just needs to have at least 24 bytes, with the first 12 bytes copied
- * to the first cell of the Allocation, and the next 12 bytes copied to
- * the second cell. There is no mapping for the padding components.
- *
- * <p> Similar to copying data to an Allocation from an array, when copying data from an
- * Allocation to an array, the padding components for Vec3 Element cells will not be
- * copied/mapped to the array if AutoPadding is enabled.
- *
- * <p> Default: Disabled.
- *
- * @param useAutoPadding True: enable AutoPadding; False: disable AutoPadding
- *
- */
- public void setAutoPadding(boolean useAutoPadding) {
- mAutoPadding = useAutoPadding;
- }
-
- /**
- * Get the size of the Allocation in bytes.
- *
- * @return size of the Allocation in bytes.
- *
- */
- public int getBytesSize() {
- if (mType.mDimYuv != 0) {
- return (int)Math.ceil(mType.getCount() * mType.getElement().getBytesSize() * 1.5);
- }
- return mType.getCount() * mType.getElement().getBytesSize();
- }
-
- private void updateCacheInfo(Type t) {
- mCurrentDimX = t.getX();
- mCurrentDimY = t.getY();
- mCurrentDimZ = t.getZ();
- mCurrentCount = mCurrentDimX;
- if (mCurrentDimY > 1) {
- mCurrentCount *= mCurrentDimY;
- }
- if (mCurrentDimZ > 1) {
- mCurrentCount *= mCurrentDimZ;
- }
- }
-
- private void setBitmap(Bitmap b) {
- mBitmap = b;
- }
-
- Allocation(long id, RenderScript rs, Type t, int usage) {
- super(id, rs);
- if ((usage & ~(USAGE_SCRIPT |
- USAGE_GRAPHICS_TEXTURE |
- USAGE_IO_INPUT |
- USAGE_IO_OUTPUT |
- USAGE_SHARED)) != 0) {
- throw new RSIllegalArgumentException("Unknown usage specified.");
- }
-
- if ((usage & USAGE_IO_INPUT) != 0) {
- mWriteAllowed = false;
-
- if ((usage & ~(USAGE_IO_INPUT |
- USAGE_GRAPHICS_TEXTURE |
- USAGE_SCRIPT)) != 0) {
- throw new RSIllegalArgumentException("Invalid usage combination.");
- }
- }
-
- mType = t;
- mUsage = usage;
- mIncCompatAllocation = 0;
- mIncAllocDestroyed = false;
-
- if (t != null) {
- // TODO: A3D doesn't have Type info during creation, so we can't
- // calculate the size ahead of time. We can possibly add a method
- // to update the size in the future if it seems reasonable.
- mSize = mType.getCount() * mType.getElement().getBytesSize();
- updateCacheInfo(t);
- }
- if (RenderScript.sUseGCHooks == true) {
- try {
- RenderScript.registerNativeAllocation.invoke(RenderScript.sRuntime, mSize);
- } catch (Exception e) {
- Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
- throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
- }
- }
- }
-
- protected void finalize() throws Throwable {
- if (RenderScript.sUseGCHooks == true) {
- RenderScript.registerNativeFree.invoke(RenderScript.sRuntime, mSize);
- }
- super.finalize();
- }
-
- private void validateIsInt64() {
- if ((mType.mElement.mType == Element.DataType.SIGNED_64) ||
- (mType.mElement.mType == Element.DataType.UNSIGNED_64)) {
- return;
- }
- throw new RSIllegalArgumentException(
- "64 bit integer source does not match allocation type " + mType.mElement.mType);
- }
-
- private void validateIsInt32() {
- if ((mType.mElement.mType == Element.DataType.SIGNED_32) ||
- (mType.mElement.mType == Element.DataType.UNSIGNED_32)) {
- return;
- }
- throw new RSIllegalArgumentException(
- "32 bit integer source does not match allocation type " + mType.mElement.mType);
- }
-
- private void validateIsInt16() {
- if ((mType.mElement.mType == Element.DataType.SIGNED_16) ||
- (mType.mElement.mType == Element.DataType.UNSIGNED_16)) {
- return;
- }
- throw new RSIllegalArgumentException(
- "16 bit integer source does not match allocation type " + mType.mElement.mType);
- }
-
- private void validateIsInt8() {
- if ((mType.mElement.mType == Element.DataType.SIGNED_8) ||
- (mType.mElement.mType == Element.DataType.UNSIGNED_8)) {
- return;
- }
- throw new RSIllegalArgumentException(
- "8 bit integer source does not match allocation type " + mType.mElement.mType);
- }
-
- private void validateIsFloat32() {
- if (mType.mElement.mType == Element.DataType.FLOAT_32) {
- return;
- }
- throw new RSIllegalArgumentException(
- "32 bit float source does not match allocation type " + mType.mElement.mType);
- }
-
- private void validateIsFloat64() {
- if (mType.mElement.mType == Element.DataType.FLOAT_64) {
- return;
- }
- throw new RSIllegalArgumentException(
- "64 bit float source does not match allocation type " + mType.mElement.mType);
- }
-
- private void validateIsObject() {
- if ((mType.mElement.mType == Element.DataType.RS_ELEMENT) ||
- (mType.mElement.mType == Element.DataType.RS_TYPE) ||
- (mType.mElement.mType == Element.DataType.RS_ALLOCATION) ||
- (mType.mElement.mType == Element.DataType.RS_SAMPLER) ||
- (mType.mElement.mType == Element.DataType.RS_SCRIPT)) {
- return;
- }
- throw new RSIllegalArgumentException(
- "Object source does not match allocation type " + mType.mElement.mType);
- }
-
- /**
- * Get the {@link android.support.v8.renderscript.Type} of the Allocation.
- *
- * @return Type
- *
- */
- public Type getType() {
- return mType;
- }
-
- /**
- * Propagate changes from one usage of the Allocation to the
- * other usages of the Allocation.
- *
- */
- public void syncAll(int srcLocation) {
- switch (srcLocation) {
- case USAGE_SCRIPT:
- case USAGE_GRAPHICS_TEXTURE:
- break;
- default:
- throw new RSIllegalArgumentException("Source must be exactly one usage type.");
- }
- mRS.validate();
- mRS.nAllocationSyncAll(getIDSafe(), srcLocation);
- }
-
- /**
- * Send a buffer to the output stream. The contents of the Allocation will
- * be undefined after this operation. This operation is only valid if {@link
- * #USAGE_IO_OUTPUT} is set on the Allocation.
- *
- *
- */
- public void ioSend() {
- if ((mUsage & USAGE_IO_OUTPUT) == 0) {
- throw new RSIllegalArgumentException(
- "Can only send buffer if IO_OUTPUT usage specified.");
- }
- mRS.validate();
- mRS.nAllocationIoSend(getID(mRS));
- }
-
- /**
- * Delete once code is updated.
- */
- public void ioSendOutput() {
- ioSend();
- }
- /**
- * Gets or creates a ByteBuffer that contains the raw data of the current Allocation.
- * <p> If the Allocation is created with USAGE_IO_INPUT, the returned ByteBuffer
- * would contain the up-to-date data as READ ONLY.
- * For a 2D or 3D Allocation, the raw data maybe padded so that each row of
- * the Allocation has certain alignment. The size of each row including padding,
- * called stride, can be queried using the {@link #getStride()} method.
- *
- * Note: Operating on the ByteBuffer of a destroyed Allocation will triger errors.
- * The ByteBuffer will be Read-Only for devices before Lollopop (API 21).
- *
- * @return ByteBuffer The ByteBuffer associated with raw data pointer of the Allocation.
- */
- public ByteBuffer getByteBuffer() {
- int xBytesSize = mType.getX() * mType.getElement().getBytesSize();
- // When running on devices before L, we need to construct the ByteBuffer
- // and explicitly copy the data from the allocation to it.
- if (mRS.getDispatchAPILevel() < 21) {
- byte[] data = null;
- if (mType.getZ() > 0) {
- // TODO: add support for 3D allocations.
- return null;
- } else if (mType.getY() > 0) {
- // 2D Allocation
- data = new byte[xBytesSize * mType.getY()];
- copy2DRangeToUnchecked(0, 0, mType.getX(), mType.getY(), data,
- Element.DataType.SIGNED_8, xBytesSize * mType.getY());
- } else {
- // 1D Allocation
- data = new byte[xBytesSize];
- copy1DRangeToUnchecked(0, mType.getX(), data);
- }
- ByteBuffer bBuffer = ByteBuffer.wrap(data).asReadOnlyBuffer();
- mByteBufferStride = xBytesSize;
- return bBuffer;
- }
- // Create a new ByteBuffer if it is not initialized or using IO_INPUT.
- if (mByteBuffer == null || (mUsage & USAGE_IO_INPUT) != 0) {
- mByteBuffer = mRS.nAllocationGetByteBuffer(getID(mRS), xBytesSize, mType.getY(), mType.getZ());
- }
- return mByteBuffer;
- }
-
- /**
- * Gets the stride of the Allocation.
- * For a 2D or 3D Allocation, the raw data maybe padded so that each row of
- * the Allocation has certain alignment. The size of each row including such
- * padding is called stride.
- *
- * @return the stride. For 1D Allocation, the stride will be the number of
- * bytes of this Allocation. For 2D and 3D Allocations, the stride
- * will be the stride in X dimension measuring in bytes.
- */
- public long getStride() {
- if (mByteBufferStride ==0) {
- if (mRS.getDispatchAPILevel() > 21) {
- mByteBufferStride = mRS.nAllocationGetStride(getID(mRS));
- } else {
- mByteBufferStride = mType.getX() * mType.getElement().getBytesSize();
- }
- }
- return mByteBufferStride;
- }
-
- /**
- * Receive the latest input into the Allocation. This operation
- * is only valid if {@link #USAGE_IO_INPUT} is set on the Allocation.
- *
- */
- public void ioReceive() {
- if ((mUsage & USAGE_IO_INPUT) == 0) {
- throw new RSIllegalArgumentException(
- "Can only receive if IO_INPUT usage specified.");
- }
- mRS.validate();
- mRS.nAllocationIoReceive(getID(mRS));
- }
-
- /**
- * Copy an array of RS objects to the Allocation.
- *
- * @param d Source array.
- */
- public void copyFrom(BaseObj[] d) {
- mRS.validate();
- validateIsObject();
- if (d.length != mCurrentCount) {
- throw new RSIllegalArgumentException("Array size mismatch, allocation sizeX = " +
- mCurrentCount + ", array length = " + d.length);
- }
-
- if (RenderScript.sPointerSize == 8) {
- long i[] = new long[d.length * 4];
- for (int ct=0; ct < d.length; ct++) {
- i[ct * 4] = d[ct].getID(mRS);
- }
- copy1DRangeFromUnchecked(0, mCurrentCount, i);
- } else {
- int i[] = new int[d.length];
- for (int ct=0; ct < d.length; ct++) {
- i[ct] = (int)d[ct].getID(mRS);
- }
- copy1DRangeFromUnchecked(0, mCurrentCount, i);
- }
- }
-
- private void validateBitmapFormat(Bitmap b) {
- Bitmap.Config bc = b.getConfig();
- if (bc == null) {
- throw new RSIllegalArgumentException("Bitmap has an unsupported format for this operation");
- }
- switch (bc) {
- case ALPHA_8:
- if (mType.getElement().mKind != Element.DataKind.PIXEL_A) {
- throw new RSIllegalArgumentException("Allocation kind is " +
- mType.getElement().mKind + ", type " +
- mType.getElement().mType +
- " of " + mType.getElement().getBytesSize() +
- " bytes, passed bitmap was " + bc);
- }
- break;
- case ARGB_8888:
- if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
- (mType.getElement().getBytesSize() != 4)) {
- throw new RSIllegalArgumentException("Allocation kind is " +
- mType.getElement().mKind + ", type " +
- mType.getElement().mType +
- " of " + mType.getElement().getBytesSize() +
- " bytes, passed bitmap was " + bc);
- }
- break;
- case RGB_565:
- if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGB) ||
- (mType.getElement().getBytesSize() != 2)) {
- throw new RSIllegalArgumentException("Allocation kind is " +
- mType.getElement().mKind + ", type " +
- mType.getElement().mType +
- " of " + mType.getElement().getBytesSize() +
- " bytes, passed bitmap was " + bc);
- }
- break;
- case ARGB_4444:
- if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
- (mType.getElement().getBytesSize() != 2)) {
- throw new RSIllegalArgumentException("Allocation kind is " +
- mType.getElement().mKind + ", type " +
- mType.getElement().mType +
- " of " + mType.getElement().getBytesSize() +
- " bytes, passed bitmap was " + bc);
- }
- break;
-
- }
- }
-
- private void validateBitmapSize(Bitmap b) {
- if((mCurrentDimX != b.getWidth()) || (mCurrentDimY != b.getHeight())) {
- throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
- }
- }
-
- private void copyFromUnchecked(Object array, Element.DataType dt, int arrayLen) {
- mRS.validate();
- if (mCurrentDimZ > 0) {
- copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, array, dt, arrayLen);
- } else if (mCurrentDimY > 0) {
- copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, array, dt, arrayLen);
- } else {
- copy1DRangeFromUnchecked(0, mCurrentCount, array, dt, arrayLen);
- }
- }
-
- /**
- * Copy into this Allocation from an array. This method does not guarantee
- * that the Allocation is compatible with the input buffer; it copies memory
- * without reinterpretation.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param array The source array
- */
- public void copyFromUnchecked(Object array) {
- copyFromUnchecked(array, validateObjectIsPrimitiveArray(array, false),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy into this Allocation from an array. This method does not guarantee
- * that the Allocation is compatible with the input buffer; it copies memory
- * without reinterpretation.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFromUnchecked(int[] d) {
- copyFromUnchecked(d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy into this Allocation from an array. This method does not guarantee
- * that the Allocation is compatible with the input buffer; it copies memory
- * without reinterpretation.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFromUnchecked(short[] d) {
- copyFromUnchecked(d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy into this Allocation from an array. This method does not guarantee
- * that the Allocation is compatible with the input buffer; it copies memory
- * without reinterpretation.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFromUnchecked(byte[] d) {
- copyFromUnchecked(d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy into this Allocation from an array. This method does not guarantee
- * that the Allocation is compatible with the input buffer; it copies memory
- * without reinterpretation.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFromUnchecked(float[] d) {
- copyFromUnchecked(d, Element.DataType.FLOAT_32, d.length);
- }
-
-
- /**
- * Copy into this Allocation from an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} does not match the array's
- * primitive type.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param array The source array
- */
- public void copyFrom(Object array) {
- copyFromUnchecked(array, validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy into this Allocation from an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not a 32 bit integer nor a vector of 32 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFrom(int[] d) {
- validateIsInt32();
- copyFromUnchecked(d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy into this Allocation from an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not a 16 bit integer nor a vector of 16 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFrom(short[] d) {
- validateIsInt16();
- copyFromUnchecked(d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy into this Allocation from an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not an 8 bit integer nor a vector of 8 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFrom(byte[] d) {
- validateIsInt8();
- copyFromUnchecked(d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy into this Allocation from an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 32 bit float nor a vector of
- * 32 bit floats {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d the source array
- */
- public void copyFrom(float[] d) {
- validateIsFloat32();
- copyFromUnchecked(d, Element.DataType.FLOAT_32, d.length);
- }
-
- /**
- * Copy into an Allocation from a {@link android.graphics.Bitmap}. The
- * height, width, and format of the bitmap must match the existing
- * allocation.
- *
- * <p>If the {@link android.graphics.Bitmap} is the same as the {@link
- * android.graphics.Bitmap} used to create the Allocation with {@link
- * #createFromBitmap} and {@link #USAGE_SHARED} is set on the Allocation,
- * this will synchronize the Allocation with the latest data from the {@link
- * android.graphics.Bitmap}, potentially avoiding the actual copy.</p>
- *
- * @param b the source bitmap
- */
- public void copyFrom(Bitmap b) {
- mRS.validate();
- if (b.getConfig() == null) {
- Bitmap newBitmap = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(newBitmap);
- c.drawBitmap(b, 0, 0, null);
- copyFrom(newBitmap);
- return;
- }
- validateBitmapSize(b);
- validateBitmapFormat(b);
- mRS.nAllocationCopyFromBitmap(getID(mRS), b);
- }
-
- /**
- * Copy an Allocation from an Allocation. The types of both allocations
- * must be identical.
- *
- * @param a the source allocation
- */
- public void copyFrom(Allocation a) {
- mRS.validate();
- if (!mType.equals(a.getType())) {
- throw new RSIllegalArgumentException("Types of allocations must match.");
- }
- copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, a, 0, 0);
- }
-
-
- /**
- * This is only intended to be used by auto-generated code reflected from
- * the RenderScript script files and should not be used by developers.
- *
- * @param xoff
- * @param fp
- */
- public void setFromFieldPacker(int xoff, FieldPacker fp) {
- mRS.validate();
- int eSize = mType.mElement.getBytesSize();
- final byte[] data = fp.getData();
- int data_length = fp.getPos();
-
- int count = data_length / eSize;
- if ((eSize * count) != data_length) {
- throw new RSIllegalArgumentException("Field packer length " + data_length +
- " not divisible by element size " + eSize + ".");
- }
- copy1DRangeFromUnchecked(xoff, count, data);
- }
-
- /**
- * This is only intended to be used by auto-generated code reflected from
- * the RenderScript script files.
- *
- * @param xoff
- * @param component_number
- * @param fp
- */
- public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
- mRS.validate();
- if (component_number >= mType.mElement.mElements.length) {
- throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
- }
- if(xoff < 0) {
- throw new RSIllegalArgumentException("Offset must be >= 0.");
- }
-
- final byte[] data = fp.getData();
- int data_length = fp.getPos();
- int eSize = mType.mElement.mElements[component_number].getBytesSize();
- eSize *= mType.mElement.mArraySizes[component_number];
-
- if (data_length != eSize) {
- throw new RSIllegalArgumentException("Field packer sizelength " + data_length +
- " does not match component size " + eSize + ".");
- }
-
- mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD,
- component_number, data, data_length);
- }
-
- /**
- * @hide
- * This is only intended to be used by auto-generated code reflected from
- * the RenderScript script files.
- *
- * @param xoff
- * @param yoff
- * @param zoff
- * @param component_number
- * @param fp
- */
- /*
- public void setFromFieldPacker(int xoff, int yoff, int zoff, int component_number, FieldPacker fp) {
- mRS.validate();
- if (component_number >= mType.mElement.mElements.length) {
- throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
- }
- if(xoff < 0) {
- throw new RSIllegalArgumentException("Offset x must be >= 0.");
- }
- if(yoff < 0) {
- throw new RSIllegalArgumentException("Offset y must be >= 0.");
- }
- if(zoff < 0) {
- throw new RSIllegalArgumentException("Offset z must be >= 0.");
- }
-
- final byte[] data = fp.getData();
- int data_length = fp.getPos();
- int eSize = mType.mElement.mElements[component_number].getBytesSize();
- eSize *= mType.mElement.mArraySizes[component_number];
-
- if (data_length != eSize) {
- throw new RSIllegalArgumentException("Field packer sizelength " + data_length +
- " does not match component size " + eSize + ".");
- }
-
- mRS.nAllocationElementData(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
- component_number, data, data_length);
- }
- */
-
- private void data1DChecks(int off, int count, int len, int dataSize, boolean usePadding) {
- mRS.validate();
- if(off < 0) {
- throw new RSIllegalArgumentException("Offset must be >= 0.");
- }
- if(count < 1) {
- throw new RSIllegalArgumentException("Count must be >= 1.");
- }
- if((off + count) > mCurrentCount) {
- throw new RSIllegalArgumentException("Overflow, Available count " + mCurrentCount +
- ", got " + count + " at offset " + off + ".");
- }
- if(usePadding) {
- if(len < dataSize / 4 * 3) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- } else {
- if(len < dataSize) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- }
- }
-
- /**
- * Generate a mipmap chain. This is only valid if the Type of the Allocation
- * includes mipmaps.
- *
- * <p>This function will generate a complete set of mipmaps from the top
- * level LOD and place them into the script memory space.</p>
- *
- * <p>If the Allocation is also using other memory spaces, a call to {@link
- * #syncAll syncAll(Allocation.USAGE_SCRIPT)} is required.</p>
- */
- public void generateMipmaps() {
- mRS.nAllocationGenerateMipmaps(getID(mRS));
- }
-
- private void copy1DRangeFromUnchecked(int off, int count, Object array,
- Element.DataType dt, int arrayLen) {
- final int dataSize = mType.mElement.getBytesSize() * count;
- // AutoPadding for Vec3 Element
- boolean usePadding = false;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- usePadding = true;
- }
- data1DChecks(off, count, arrayLen * dt.mSize, dataSize, usePadding);
- mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, array, dataSize, dt,
- mType.mElement.mType.mSize, usePadding);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param array The source array
- */
- public void copy1DRangeFromUnchecked(int off, int count, Object array) {
- copy1DRangeFromUnchecked(off, count, array,
- validateObjectIsPrimitiveArray(array, false),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFromUnchecked(int off, int count, int[] d) {
- copy1DRangeFromUnchecked(off, count, (Object)d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFromUnchecked(int off, int count, short[] d) {
- copy1DRangeFromUnchecked(off, count, (Object)d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFromUnchecked(int off, int count, byte[] d) {
- copy1DRangeFromUnchecked(off, count, (Object)d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFromUnchecked(int off, int count, float[] d) {
- copy1DRangeFromUnchecked(off, count, (Object)d, Element.DataType.FLOAT_32, d.length);
- }
-
-
- /**
- * Copy an array into a 1D region of this Allocation. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} does not match the component type
- * of the array passed in.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param array The source array.
- */
- public void copy1DRangeFrom(int off, int count, Object array) {
- copy1DRangeFromUnchecked(off, count, array,
- validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not an 32 bit integer nor a vector of 32 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFrom(int off, int count, int[] d) {
- validateIsInt32();
- copy1DRangeFromUnchecked(off, count, d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not an 16 bit integer nor a vector of 16 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFrom(int off, int count, short[] d) {
- validateIsInt16();
- copy1DRangeFromUnchecked(off, count, d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not an 8 bit integer nor a vector of 8 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeFrom(int off, int count, byte[] d) {
- validateIsInt8();
- copy1DRangeFromUnchecked(off, count, d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy an array into a 1D region of this Allocation. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 32 bit float nor a vector of
- * 32 bit floats {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array.
- */
- public void copy1DRangeFrom(int off, int count, float[] d) {
- validateIsFloat32();
- copy1DRangeFromUnchecked(off, count, d, Element.DataType.FLOAT_32, d.length);
- }
-
- /**
- * Copy part of an Allocation into this Allocation.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param data the source data allocation.
- * @param dataOff off The offset of the first element in data to
- * be copied.
- */
- public void copy1DRangeFrom(int off, int count, Allocation data, int dataOff) {
- mRS.nAllocationData2D(getIDSafe(), off, 0,
- mSelectedLOD, mSelectedFace.mID,
- count, 1, data.getID(mRS), dataOff, 0,
- data.mSelectedLOD, data.mSelectedFace.mID);
- }
-
- private void validate2DRange(int xoff, int yoff, int w, int h) {
- if (mAdaptedAllocation != null) {
-
- } else {
-
- if (xoff < 0 || yoff < 0) {
- throw new RSIllegalArgumentException("Offset cannot be negative.");
- }
- if (h < 0 || w < 0) {
- throw new RSIllegalArgumentException("Height or width cannot be negative.");
- }
- if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
- throw new RSIllegalArgumentException("Updated region larger than allocation.");
- }
- }
- }
-
- void copy2DRangeFromUnchecked(int xoff, int yoff, int w, int h, Object array,
- Element.DataType dt, int arrayLen) {
- mRS.validate();
- validate2DRange(xoff, yoff, w, h);
- final int dataSize = mType.mElement.getBytesSize() * w * h;
- // AutoPadding for Vec3 Element
- boolean usePadding = false;
- int sizeBytes = arrayLen * dt.mSize;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- if (dataSize / 4 * 3 > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- usePadding = true;
- sizeBytes = dataSize;
- } else {
- if (dataSize > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- }
- mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, w, h,
- array, sizeBytes, dt,
- mType.mElement.mType.mSize, usePadding);
- }
-
- /**
- * Copy from an array into a rectangular region in this Allocation. The
- * array is assumed to be tightly packed. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} does not match the input data type.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param w Width of the region to update
- * @param h Height of the region to update
- * @param array Data to be placed into the Allocation
- */
- public void copy2DRangeFrom(int xoff, int yoff, int w, int h, Object array) {
- copy2DRangeFromUnchecked(xoff, yoff, w, h, array,
- validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy from an array into a rectangular region in this Allocation. The
- * array is assumed to be tightly packed. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not an 8 bit integer nor a vector of 8 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param w Width of the region to update
- * @param h Height of the region to update
- * @param data to be placed into the Allocation
- */
- public void copy2DRangeFrom(int xoff, int yoff, int w, int h, byte[] data) {
- validateIsInt8();
- copy2DRangeFromUnchecked(xoff, yoff, w, h, data,
- Element.DataType.SIGNED_8, data.length);
- }
-
- /**
- * Copy from an array into a rectangular region in this Allocation. The
- * array is assumed to be tightly packed. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not a 16 bit integer nor a vector of 16 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param w Width of the region to update
- * @param h Height of the region to update
- * @param data to be placed into the Allocation
- */
- public void copy2DRangeFrom(int xoff, int yoff, int w, int h, short[] data) {
- validateIsInt16();
- copy2DRangeFromUnchecked(xoff, yoff, w, h, data,
- Element.DataType.SIGNED_16, data.length);
- }
-
- /**
- * Copy from an array into a rectangular region in this Allocation. The
- * array is assumed to be tightly packed. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not a 32 bit integer nor a vector of 32 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param w Width of the region to update
- * @param h Height of the region to update
- * @param data to be placed into the Allocation
- */
- public void copy2DRangeFrom(int xoff, int yoff, int w, int h, int[] data) {
- validateIsInt32();
- copy2DRangeFromUnchecked(xoff, yoff, w, h, data,
- Element.DataType.SIGNED_32, data.length);
- }
-
- /**
- * Copy from an array into a rectangular region in this Allocation. The
- * array is assumed to be tightly packed. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 32 bit float nor a vector of
- * 32 bit floats {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param w Width of the region to update
- * @param h Height of the region to update
- * @param data to be placed into the Allocation
- */
- public void copy2DRangeFrom(int xoff, int yoff, int w, int h, float[] data) {
- validateIsFloat32();
- copy2DRangeFromUnchecked(xoff, yoff, w, h, data,
- Element.DataType.FLOAT_32, data.length);
- }
-
- /**
- * Copy a rectangular region from an Allocation into a rectangular region in
- * this Allocation.
- *
- * @param xoff X offset of the region in this Allocation
- * @param yoff Y offset of the region in this Allocation
- * @param w Width of the region to update.
- * @param h Height of the region to update.
- * @param data source Allocation.
- * @param dataXoff X offset in source Allocation
- * @param dataYoff Y offset in source Allocation
- */
- public void copy2DRangeFrom(int xoff, int yoff, int w, int h,
- Allocation data, int dataXoff, int dataYoff) {
- mRS.validate();
- validate2DRange(xoff, yoff, w, h);
- mRS.nAllocationData2D(getIDSafe(), xoff, yoff,
- mSelectedLOD, mSelectedFace.mID,
- w, h, data.getID(mRS), dataXoff, dataYoff,
- data.mSelectedLOD, data.mSelectedFace.mID);
- }
-
- /**
- * Copy a {@link android.graphics.Bitmap} into an Allocation. The height
- * and width of the update will use the height and width of the {@link
- * android.graphics.Bitmap}.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param data the Bitmap to be copied
- */
- public void copy2DRangeFrom(int xoff, int yoff, Bitmap data) {
- mRS.validate();
- if (data.getConfig() == null) {
- Bitmap newBitmap = Bitmap.createBitmap(data.getWidth(), data.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(newBitmap);
- c.drawBitmap(data, 0, 0, null);
- copy2DRangeFrom(xoff, yoff, newBitmap);
- return;
- }
- validateBitmapFormat(data);
- validate2DRange(xoff, yoff, data.getWidth(), data.getHeight());
- mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, data);
- }
-
- private void validate3DRange(int xoff, int yoff, int zoff, int w, int h, int d) {
- if (mAdaptedAllocation != null) {
-
- } else {
-
- if (xoff < 0 || yoff < 0 || zoff < 0) {
- throw new RSIllegalArgumentException("Offset cannot be negative.");
- }
- if (h < 0 || w < 0 || d < 0) {
- throw new RSIllegalArgumentException("Height or width cannot be negative.");
- }
- if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY) || ((zoff + d) > mCurrentDimZ)) {
- throw new RSIllegalArgumentException("Updated region larger than allocation.");
- }
- }
- }
-
- /**
- * Copy a rectangular region from the array into the allocation.
- * The array is assumed to be tightly packed.
- *
- * The data type of the array is not required to be the same as
- * the element data type.
- */
- private void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d,
- Object array, Element.DataType dt, int arrayLen) {
- mRS.validate();
- validate3DRange(xoff, yoff, zoff, w, h, d);
- final int dataSize = mType.mElement.getBytesSize() * w * h * d;
- // AutoPadding for Vec3 Element
- boolean usePadding = false;
- int sizeBytes = arrayLen * dt.mSize;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- if (dataSize / 4 * 3 > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- usePadding = true;
- sizeBytes = dataSize;
- } else {
- if (dataSize > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- }
- mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD, w, h, d,
- array, sizeBytes, dt,
- mType.mElement.mType.mSize, usePadding);
- }
-
- /**
- * Copy from an array into a 3D region in this Allocation. The
- * array is assumed to be tightly packed. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} does not match the input data type.
- *
- * <p> The size of the region is: w * h * d * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param zoff Z offset of the region to update in this Allocation
- * @param w Width of the region to update
- * @param h Height of the region to update
- * @param d Depth of the region to update
- * @param array to be placed into the allocation
- */
- public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, Object array) {
- copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, array,
- validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy a rectangular region into the allocation from another
- * allocation.
- *
- * @param xoff X offset of the region to update in this Allocation
- * @param yoff Y offset of the region to update in this Allocation
- * @param zoff Z offset of the region to update in this Allocation
- * @param w Width of the region to update.
- * @param h Height of the region to update.
- * @param d Depth of the region to update.
- * @param data source allocation.
- * @param dataXoff X offset of the region in the source Allocation
- * @param dataYoff Y offset of the region in the source Allocation
- * @param dataZoff Z offset of the region in the source Allocation
- */
- public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d,
- Allocation data, int dataXoff, int dataYoff, int dataZoff) {
- mRS.validate();
- validate3DRange(xoff, yoff, zoff, w, h, d);
- mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
- w, h, d, data.getID(mRS), dataXoff, dataYoff, dataZoff,
- data.mSelectedLOD);
- }
-
-
- /**
- * Copy from the Allocation into a {@link android.graphics.Bitmap}. The
- * bitmap must match the dimensions of the Allocation.
- *
- * @param b The bitmap to be set from the Allocation.
- */
- public void copyTo(Bitmap b) {
- mRS.validate();
- validateBitmapFormat(b);
- validateBitmapSize(b);
- mRS.nAllocationCopyToBitmap(getID(mRS), b);
- }
-
- private void copyTo(Object array, Element.DataType dt, int arrayLen) {
- mRS.validate();
- boolean usePadding = false;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- usePadding = true;
- }
- if (usePadding) {
- if (dt.mSize * arrayLen < mSize / 4 * 3) {
- throw new RSIllegalArgumentException(
- "Size of output array cannot be smaller than size of allocation.");
- }
- } else {
- if (dt.mSize * arrayLen < mSize) {
- throw new RSIllegalArgumentException(
- "Size of output array cannot be smaller than size of allocation.");
- }
- }
- mRS.nAllocationRead(getID(mRS), array, dt, mType.mElement.mType.mSize, usePadding);
- }
-
- /**
- * Copy from the Allocation into an array. The method is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} does not match the input data type.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells will be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param array The array to be set from the Allocation.
- */
- public void copyTo(Object array) {
- copyTo(array, validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy from the Allocation into a byte array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither an 8 bit integer nor a vector of 8 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells will be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d The array to be set from the Allocation.
- */
- public void copyTo(byte[] d) {
- validateIsInt8();
- copyTo(d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy from the Allocation into a short array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not a 16 bit integer nor a vector of 16 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells will be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d The array to be set from the Allocation.
- */
- public void copyTo(short[] d) {
- validateIsInt16();
- copyTo(d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy from the Allocation into a int array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is not a 32 bit integer nor a vector of 32 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells will be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d The array to be set from the Allocation.
- */
- public void copyTo(int[] d) {
- validateIsInt32();
- copyTo(d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy from the Allocation into a float array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 32 bit float nor a vector of
- * 32 bit floats {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the Allocation {@link
- * #getBytesSize getBytesSize()}.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells will be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the Allocation {@link #getBytesSize getBytesSize()}. The padding bytes for
- * the cells must not be part of the array.
- *
- * @param d The array to be set from the Allocation.
- */
- public void copyTo(float[] d) {
- validateIsFloat32();
- copyTo(d, Element.DataType.FLOAT_32, d.length);
- }
-
- /**
- * @hide
- * This is only intended to be used by auto-generated code reflected from
- * the RenderScript script files and should not be used by developers.
- *
- * @param xoff
- * @param yoff
- * @param zoff
- * @param component_number
- * @param fp
- */
- /*
- public void copyToFieldPacker(int xoff, int yoff, int zoff, int component_number, FieldPacker fp) {
- mRS.validate();
- if (component_number >= mType.mElement.mElements.length) {
- throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
- }
- if(xoff < 0) {
- throw new RSIllegalArgumentException("Offset x must be >= 0.");
- }
- if(yoff < 0) {
- throw new RSIllegalArgumentException("Offset y must be >= 0.");
- }
- if(zoff < 0) {
- throw new RSIllegalArgumentException("Offset z must be >= 0.");
- }
-
- final byte[] data = fp.getData();
- int data_length = data.length;
- int eSize = mType.mElement.mElements[component_number].getBytesSize();
- eSize *= mType.mElement.mArraySizes[component_number];
-
- if (data_length != eSize) {
- throw new RSIllegalArgumentException("Field packer sizelength " + data_length +
- " does not match component size " + eSize + ".");
- }
-
- mRS.nAllocationElementRead(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
- component_number, data, data_length);
- }
- */
-
- private void copy1DRangeToUnchecked(int off, int count, Object array,
- Element.DataType dt, int arrayLen) {
- final int dataSize = mType.mElement.getBytesSize() * count;
- // AutoPadding for Vec3 Element
- boolean usePadding = false;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- usePadding = true;
- }
- data1DChecks(off, count, arrayLen * dt.mSize, dataSize, usePadding);
- mRS.nAllocationRead1D(getIDSafe(), off, mSelectedLOD, count, array, dataSize, dt,
- mType.mElement.mType.mSize, usePadding);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param array The dest array
- */
- public void copy1DRangeToUnchecked(int off, int count, Object array) {
- copy1DRangeToUnchecked(off, count, array,
- validateObjectIsPrimitiveArray(array, false),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeToUnchecked(int off, int count, int[] d) {
- copy1DRangeToUnchecked(off, count, (Object)d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeToUnchecked(int off, int count, short[] d) {
- copy1DRangeToUnchecked(off, count, (Object)d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeToUnchecked(int off, int count, byte[] d) {
- copy1DRangeToUnchecked(off, count, (Object)d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This method does not
- * guarantee that the Allocation is compatible with the input buffer.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeToUnchecked(int off, int count, float[] d) {
- copy1DRangeToUnchecked(off, count, (Object)d, Element.DataType.FLOAT_32, d.length);
- }
-
-
- /**
- * Copy a 1D region of this Allocation into an array. This method is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} does not match the component type
- * of the array passed in.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param array The source array.
- */
- public void copy1DRangeTo(int off, int count, Object array) {
- copy1DRangeToUnchecked(off, count, array,
- validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 32 bit integer nor a vector of 32 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeTo(int off, int count, int[] d) {
- validateIsInt32();
- copy1DRangeToUnchecked(off, count, d, Element.DataType.SIGNED_32, d.length);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 16 bit integer nor a vector of 16 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeTo(int off, int count, short[] d) {
- validateIsInt16();
- copy1DRangeToUnchecked(off, count, d, Element.DataType.SIGNED_16, d.length);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither an 8 bit integer nor a vector of 8 bit
- * integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array
- */
- public void copy1DRangeTo(int off, int count, byte[] d) {
- validateIsInt8();
- copy1DRangeToUnchecked(off, count, d, Element.DataType.SIGNED_8, d.length);
- }
-
- /**
- * Copy a 1D region of this Allocation into an array. This variant is type checked
- * and will generate exceptions if the Allocation's {@link
- * android.support.v8.renderscript.Element} is neither a 32 bit float nor a vector of
- * 32 bit floats {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: count * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param off The offset of the first element to be copied.
- * @param count The number of elements to be copied.
- * @param d the source array.
- */
- public void copy1DRangeTo(int off, int count, float[] d) {
- validateIsFloat32();
- copy1DRangeToUnchecked(off, count, d, Element.DataType.FLOAT_32, d.length);
- }
-
-
- void copy2DRangeToUnchecked(int xoff, int yoff, int w, int h, Object array,
- Element.DataType dt, int arrayLen) {
- mRS.validate();
- validate2DRange(xoff, yoff, w, h);
- final int dataSize = mType.mElement.getBytesSize() * w * h;
- // AutoPadding for Vec3 Element
- boolean usePadding = false;
- int sizeBytes = arrayLen * dt.mSize;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- if (dataSize / 4 * 3 > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- usePadding = true;
- sizeBytes = dataSize;
- } else {
- if (dataSize > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- }
- mRS.nAllocationRead2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, w, h,
- array, sizeBytes, dt, mType.mElement.mType.mSize, usePadding);
- }
-
- /**
- * Copy from a rectangular region in this Allocation into an array. This
- * method is type checked and will generate exceptions if the Allocation's
- * {@link android.support.v8.renderscript.Element} does not match the component type
- * of the array passed in.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to copy in this Allocation
- * @param yoff Y offset of the region to copy in this Allocation
- * @param w Width of the region to copy
- * @param h Height of the region to copy
- * @param array Dest Array to be copied into
- */
- public void copy2DRangeTo(int xoff, int yoff, int w, int h, Object array) {
- copy2DRangeToUnchecked(xoff, yoff, w, h, array,
- validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
-
- /**
- * Copy from a rectangular region in this Allocation into an array. This
- * variant is type checked and will generate exceptions if the Allocation's
- * {@link android.support.v8.renderscript.Element} is neither an 8 bit integer nor a vector
- * of 8 bit integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to copy in this Allocation
- * @param yoff Y offset of the region to copy in this Allocation
- * @param w Width of the region to copy
- * @param h Height of the region to copy
- * @param data Dest Array to be copied into
- */
- public void copy2DRangeTo(int xoff, int yoff, int w, int h, byte[] data) {
- validateIsInt8();
- copy2DRangeToUnchecked(xoff, yoff, w, h, data,
- Element.DataType.SIGNED_8, data.length);
- }
-
- /**
- * Copy from a rectangular region in this Allocation into an array. This
- * variant is type checked and will generate exceptions if the Allocation's
- * {@link android.support.v8.renderscript.Element} is neither a 16 bit integer nor a vector
- * of 16 bit integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to copy in this Allocation
- * @param yoff Y offset of the region to copy in this Allocation
- * @param w Width of the region to copy
- * @param h Height of the region to copy
- * @param data Dest Array to be copied into
- */
- public void copy2DRangeTo(int xoff, int yoff, int w, int h, short[] data) {
- validateIsInt16();
- copy2DRangeToUnchecked(xoff, yoff, w, h, data,
- Element.DataType.SIGNED_16, data.length);
- }
-
- /**
- * Copy from a rectangular region in this Allocation into an array. This
- * variant is type checked and will generate exceptions if the Allocation's
- * {@link android.support.v8.renderscript.Element} is neither a 32 bit integer nor a vector
- * of 32 bit integers {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to copy in this Allocation
- * @param yoff Y offset of the region to copy in this Allocation
- * @param w Width of the region to copy
- * @param h Height of the region to copy
- * @param data Dest Array to be copied into
- */
- public void copy2DRangeTo(int xoff, int yoff, int w, int h, int[] data) {
- validateIsInt32();
- copy2DRangeToUnchecked(xoff, yoff, w, h, data,
- Element.DataType.SIGNED_32, data.length);
- }
-
- /**
- * Copy from a rectangular region in this Allocation into an array. This
- * variant is type checked and will generate exceptions if the Allocation's
- * {@link android.support.v8.renderscript.Element} is neither a 32 bit float nor a vector
- * of 32 bit floats {@link android.support.v8.renderscript.Element.DataType}.
- *
- * <p> The size of the region is: w * h * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to copy in this Allocation
- * @param yoff Y offset of the region to copy in this Allocation
- * @param w Width of the region to copy
- * @param h Height of the region to copy
- * @param data Dest Array to be copied into
- */
- public void copy2DRangeTo(int xoff, int yoff, int w, int h, float[] data) {
- validateIsFloat32();
- copy2DRangeToUnchecked(xoff, yoff, w, h, data,
- Element.DataType.FLOAT_32, data.length);
- }
-
-
- /**
- * Copy from a 3D region in this Allocation into an array. This method does
- * not guarantee that the Allocation is compatible with the input buffer.
- * The array is assumed to be tightly packed.
- *
- * The data type of the array is not required to be the same as
- * the element data type.
- */
- /*
- private void copy3DRangeToUnchecked(int xoff, int yoff, int zoff, int w, int h, int d,
- Object array, Element.DataType dt, int arrayLen) {
- mRS.validate();
- validate3DRange(xoff, yoff, zoff, w, h, d);
- final int dataSize = mType.mElement.getBytesSize() * w * h * d;
- // AutoPadding for Vec3 Element
- boolean usePadding = false;
- int sizeBytes = arrayLen * dt.mSize;
- if (mAutoPadding && (mType.getElement().getVectorSize() == 3)) {
- if (dataSize / 4 * 3 > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- usePadding = true;
- sizeBytes = dataSize;
- } else {
- if (dataSize > sizeBytes) {
- throw new RSIllegalArgumentException("Array too small for allocation type.");
- }
- }
- mRS.nAllocationRead3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD, w, h, d,
- array, sizeBytes, dt, mType.mElement.mType.mSize, usePadding);
- }
- */
-
- /**
- * @hide
- * Copy from a 3D region in this Allocation into an array. This
- * method is type checked and will generate exceptions if the Allocation's
- * {@link android.support.v8.renderscript.Element} does not match the component type
- * of the array passed in.
- *
- * <p> The size of the region is: w * h * d * {@link #getElement}.{@link
- * Element#getBytesSize}.
- *
- * <p> If the Allocation does not have Vec3 Elements, then the size of the
- * array in bytes must be at least the size of the region.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is disabled, then the size of the array in bytes must be at least the size
- * of the region. The padding bytes for the cells must be part of the array.
- *
- * <p> If the Allocation has Vec3 Elements and {@link #setAutoPadding AutoPadding}
- * is enabled, then the size of the array in bytes must be at least 3/4 the size
- * of the region. The padding bytes for the cells must not be part of the array.
- *
- * @param xoff X offset of the region to copy in this Allocation
- * @param yoff Y offset of the region to copy in this Allocation
- * @param zoff Z offset of the region to copy in this Allocation
- * @param w Width of the region to copy
- * @param h Height of the region to copy
- * @param d Depth of the region to copy
- * @param array Dest Array to be copied into
- */
- /*
- public void copy3DRangeTo(int xoff, int yoff, int zoff, int w, int h, int d, Object array) {
- copy3DRangeToUnchecked(xoff, yoff, zoff, w, h, d, array,
- validateObjectIsPrimitiveArray(array, true),
- java.lang.reflect.Array.getLength(array));
- }
- */
-
- // creation
-
- static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
- static {
- mBitmapOptions.inScaled = false;
- }
-
- /**
- * Creates a new Allocation with the given {@link
- * android.support.v8.renderscript.Type}, mipmap flag, and usage flags.
- *
- * @param type RenderScript type describing data layout
- * @param mips specifies desired mipmap behaviour for the
- * allocation
- * @param usage bit field specifying how the Allocation is
- * utilized
- */
- static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips, int usage) {
- rs.validate();
- if (type.getID(rs) == 0) {
- throw new RSInvalidStateException("Bad Type");
- }
-
- if(!rs.usingIO() && (usage & (USAGE_IO_INPUT | USAGE_IO_INPUT)) != 0) {
- throw new RSRuntimeException("USAGE_IO not supported, Allocation creation failed.");
- }
-
- long id = rs.nAllocationCreateTyped(type.getID(rs), mips.mID, usage, 0);
- if (id == 0) {
- throw new RSRuntimeException("Allocation creation failed.");
- }
- return new Allocation(id, rs, type, usage);
- }
-
- /**
- * Creates an Allocation with the size specified by the type and no mipmaps
- * generated by default
- *
- * @param rs Context to which the allocation will belong.
- * @param type renderscript type describing data layout
- * @param usage bit field specifying how the allocation is
- * utilized
- *
- * @return allocation
- */
- static public Allocation createTyped(RenderScript rs, Type type, int usage) {
- return createTyped(rs, type, MipmapControl.MIPMAP_NONE, usage);
- }
-
- /**
- * Creates an Allocation for use by scripts with a given {@link
- * android.support.v8.renderscript.Type} and no mipmaps
- *
- * @param rs Context to which the Allocation will belong.
- * @param type RenderScript Type describing data layout
- *
- * @return allocation
- */
- static public Allocation createTyped(RenderScript rs, Type type) {
- return createTyped(rs, type, MipmapControl.MIPMAP_NONE, USAGE_SCRIPT);
- }
-
- /**
- * Creates an Allocation with a specified number of given elements
- *
- * @param rs Context to which the Allocation will belong.
- * @param e Element to use in the Allocation
- * @param count the number of Elements in the Allocation
- * @param usage bit field specifying how the Allocation is
- * utilized
- *
- * @return allocation
- */
- static public Allocation createSized(RenderScript rs, Element e,
- int count, int usage) {
- rs.validate();
- Type.Builder b = new Type.Builder(rs, e);
- b.setX(count);
- Type t = b.create();
-
- long id = rs.nAllocationCreateTyped(t.getID(rs), MipmapControl.MIPMAP_NONE.mID, usage, 0);
- if (id == 0) {
- throw new RSRuntimeException("Allocation creation failed.");
- }
- return new Allocation(id, rs, t, usage);
- }
-
- /**
- * Creates an Allocation with a specified number of given elements
- *
- * @param rs Context to which the Allocation will belong.
- * @param e Element to use in the Allocation
- * @param count the number of Elements in the Allocation
- *
- * @return allocation
- */
- static public Allocation createSized(RenderScript rs, Element e, int count) {
- return createSized(rs, e, count, USAGE_SCRIPT);
- }
-
- static Element elementFromBitmap(RenderScript rs, Bitmap b) {
- final Bitmap.Config bc = b.getConfig();
- if (bc == Bitmap.Config.ALPHA_8) {
- return Element.A_8(rs);
- }
- if (bc == Bitmap.Config.ARGB_4444) {
- return Element.RGBA_4444(rs);
- }
- if (bc == Bitmap.Config.ARGB_8888) {
- return Element.RGBA_8888(rs);
- }
- if (bc == Bitmap.Config.RGB_565) {
- return Element.RGB_565(rs);
- }
- throw new RSInvalidStateException("Bad bitmap type: " + bc);
- }
-
- static Type typeFromBitmap(RenderScript rs, Bitmap b,
- MipmapControl mip) {
- Element e = elementFromBitmap(rs, b);
- Type.Builder tb = new Type.Builder(rs, e);
- tb.setX(b.getWidth());
- tb.setY(b.getHeight());
- tb.setMipmaps(mip == MipmapControl.MIPMAP_FULL);
- return tb.create();
- }
-
- /**
- * Creates an Allocation from a {@link android.graphics.Bitmap}.
- *
- * @param rs Context to which the allocation will belong.
- * @param b Bitmap source for the allocation data
- * @param mips specifies desired mipmap behaviour for the
- * allocation
- * @param usage bit field specifying how the allocation is
- * utilized
- *
- * @return Allocation containing bitmap data
- *
- */
- static public Allocation createFromBitmap(RenderScript rs, Bitmap b,
- MipmapControl mips,
- int usage) {
- rs.validate();
-
- // WAR undocumented color formats
- if (b.getConfig() == null) {
- if ((usage & USAGE_SHARED) != 0) {
- throw new RSIllegalArgumentException("USAGE_SHARED cannot be used with a Bitmap that has a null config.");
- }
- Bitmap newBitmap = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(newBitmap);
- c.drawBitmap(b, 0, 0, null);
- return createFromBitmap(rs, newBitmap, mips, usage);
- }
-
- Type t = typeFromBitmap(rs, b, mips);
-
- // enable optimized bitmap path only with no mipmap and script-only usage
- if (mips == MipmapControl.MIPMAP_NONE &&
- t.getElement().isCompatible(Element.RGBA_8888(rs)) &&
- usage == (USAGE_SHARED | USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE)) {
- long id = rs.nAllocationCreateBitmapBackedAllocation(t.getID(rs), mips.mID, b, usage);
- if (id == 0) {
- throw new RSRuntimeException("Load failed.");
- }
-
- // keep a reference to the Bitmap around to prevent GC
- Allocation alloc = new Allocation(id, rs, t, usage);
- alloc.setBitmap(b);
- return alloc;
- }
-
-
- long id = rs.nAllocationCreateFromBitmap(t.getID(rs), mips.mID, b, usage);
- if (id == 0) {
- throw new RSRuntimeException("Load failed.");
- }
- return new Allocation(id, rs, t, usage);
- }
-
- /**
- * Associate a {@link android.view.Surface} with this Allocation. This
- * operation is only valid for Allocations with {@link #USAGE_IO_OUTPUT}.
- *
- * @param sur Surface to associate with allocation
- */
- public void setSurface(Surface sur) {
- mRS.validate();
- if ((mUsage & USAGE_IO_OUTPUT) == 0) {
- throw new RSInvalidStateException("Allocation is not USAGE_IO_OUTPUT.");
- }
-
- mRS.nAllocationSetSurface(getID(mRS), sur);
- }
-
- /**
- * Creates an Allocation from a {@link android.graphics.Bitmap}.
- *
- * <p>This Allocation will be created with {@link #USAGE_SHARED}, and
- * {@link #USAGE_SCRIPT}.</p>
- *
- * @param rs Context to which the allocation will belong.
- * @param b bitmap source for the allocation data
- *
- * @return Allocation containing bitmap data
- *
- */
- static public Allocation createFromBitmap(RenderScript rs, Bitmap b) {
- return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
- USAGE_SHARED | USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE);
- }
-
- /**
- * Creates a cubemap Allocation from a {@link android.graphics.Bitmap}
- * containing the horizontal list of cube faces. Each face must be a square,
- * have the same size as all other faces, and have a width that is a power
- * of 2.
- *
- * @param rs Context to which the allocation will belong.
- * @param b Bitmap with cubemap faces layed out in the following
- * format: right, left, top, bottom, front, back
- * @param mips specifies desired mipmap behaviour for the cubemap
- * @param usage bit field specifying how the cubemap is utilized
- *
- * @return allocation containing cubemap data
- *
- */
- static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b,
- MipmapControl mips,
- int usage) {
- rs.validate();
-
- int height = b.getHeight();
- int width = b.getWidth();
-
- if (width % 6 != 0) {
- throw new RSIllegalArgumentException("Cubemap height must be multiple of 6");
- }
- if (width / 6 != height) {
- throw new RSIllegalArgumentException("Only square cube map faces supported");
- }
- boolean isPow2 = (height & (height - 1)) == 0;
- if (!isPow2) {
- throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
- }
-
- Element e = elementFromBitmap(rs, b);
- Type.Builder tb = new Type.Builder(rs, e);
- tb.setX(height);
- tb.setY(height);
- tb.setFaces(true);
- tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
- Type t = tb.create();
-
- long id = rs.nAllocationCubeCreateFromBitmap(t.getID(rs), mips.mID, b, usage);
- if(id == 0) {
- throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
- }
- return new Allocation(id, rs, t, usage);
- }
-
- /**
- * Creates a non-mipmapped cubemap Allocation for use as a graphics texture
- * from a {@link android.graphics.Bitmap} containing the horizontal list of
- * cube faces. Each face must be a square, have the same size as all other
- * faces, and have a width that is a power of 2.
- *
- * @param rs Context to which the allocation will belong.
- * @param b bitmap with cubemap faces layed out in the following
- * format: right, left, top, bottom, front, back
- *
- * @return allocation containing cubemap data
- *
- */
- static public Allocation createCubemapFromBitmap(RenderScript rs,
- Bitmap b) {
- return createCubemapFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
- USAGE_GRAPHICS_TEXTURE);
- }
-
- /**
- * Creates a cubemap Allocation from 6 {@link android.graphics.Bitmap}
- * objects containing the cube faces. Each face must be a square, have the
- * same size as all other faces, and have a width that is a power of 2.
- *
- * @param rs Context to which the allocation will belong.
- * @param xpos cubemap face in the positive x direction
- * @param xneg cubemap face in the negative x direction
- * @param ypos cubemap face in the positive y direction
- * @param yneg cubemap face in the negative y direction
- * @param zpos cubemap face in the positive z direction
- * @param zneg cubemap face in the negative z direction
- * @param mips specifies desired mipmap behaviour for the cubemap
- * @param usage bit field specifying how the cubemap is utilized
- *
- * @return allocation containing cubemap data
- *
- */
- static public Allocation createCubemapFromCubeFaces(RenderScript rs,
- Bitmap xpos,
- Bitmap xneg,
- Bitmap ypos,
- Bitmap yneg,
- Bitmap zpos,
- Bitmap zneg,
- MipmapControl mips,
- int usage) {
- /*
- int height = xpos.getHeight();
- if (xpos.getWidth() != height ||
- xneg.getWidth() != height || xneg.getHeight() != height ||
- ypos.getWidth() != height || ypos.getHeight() != height ||
- yneg.getWidth() != height || yneg.getHeight() != height ||
- zpos.getWidth() != height || zpos.getHeight() != height ||
- zneg.getWidth() != height || zneg.getHeight() != height) {
- throw new RSIllegalArgumentException("Only square cube map faces supported");
- }
- boolean isPow2 = (height & (height - 1)) == 0;
- if (!isPow2) {
- throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
- }
-
- Element e = elementFromBitmap(rs, xpos);
- Type.Builder tb = new Type.Builder(rs, e);
- tb.setX(height);
- tb.setY(height);
- tb.setFaces(true);
- tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
- Type t = tb.create();
- Allocation cubemap = Allocation.createTyped(rs, t, mips, usage);
-
- AllocationAdapter adapter = AllocationAdapter.create2D(rs, cubemap);
- adapter.setFace(Type.CubemapFace.POSITIVE_X);
- adapter.copyFrom(xpos);
- adapter.setFace(Type.CubemapFace.NEGATIVE_X);
- adapter.copyFrom(xneg);
- adapter.setFace(Type.CubemapFace.POSITIVE_Y);
- adapter.copyFrom(ypos);
- adapter.setFace(Type.CubemapFace.NEGATIVE_Y);
- adapter.copyFrom(yneg);
- adapter.setFace(Type.CubemapFace.POSITIVE_Z);
- adapter.copyFrom(zpos);
- adapter.setFace(Type.CubemapFace.NEGATIVE_Z);
- adapter.copyFrom(zneg);
-
- return cubemap;
- */
- return null;
- }
-
- /**
- * Creates a non-mipmapped cubemap Allocation for use as a sampler input
- * from 6 {@link android.graphics.Bitmap} objects containing the cube
- * faces. Each face must be a square, have the same size as all other faces,
- * and have a width that is a power of 2.
- *
- * @param rs Context to which the allocation will belong.
- * @param xpos cubemap face in the positive x direction
- * @param xneg cubemap face in the negative x direction
- * @param ypos cubemap face in the positive y direction
- * @param yneg cubemap face in the negative y direction
- * @param zpos cubemap face in the positive z direction
- * @param zneg cubemap face in the negative z direction
- *
- * @return allocation containing cubemap data
- *
- */
- static public Allocation createCubemapFromCubeFaces(RenderScript rs,
- Bitmap xpos,
- Bitmap xneg,
- Bitmap ypos,
- Bitmap yneg,
- Bitmap zpos,
- Bitmap zneg) {
- return createCubemapFromCubeFaces(rs, xpos, xneg, ypos, yneg,
- zpos, zneg, MipmapControl.MIPMAP_NONE,
- USAGE_GRAPHICS_TEXTURE);
- }
-
- /**
- * Creates an Allocation from the Bitmap referenced
- * by resource ID.
- *
- * @param rs Context to which the allocation will belong.
- * @param res application resources
- * @param id resource id to load the data from
- * @param mips specifies desired mipmap behaviour for the
- * allocation
- * @param usage bit field specifying how the allocation is
- * utilized
- *
- * @return Allocation containing resource data
- *
- */
- static public Allocation createFromBitmapResource(RenderScript rs,
- Resources res,
- int id,
- MipmapControl mips,
- int usage) {
-
- rs.validate();
- if ((usage & (USAGE_SHARED | USAGE_IO_INPUT | USAGE_IO_OUTPUT)) != 0) {
- throw new RSIllegalArgumentException("Unsupported usage specified.");
- }
- Bitmap b = BitmapFactory.decodeResource(res, id);
- Allocation alloc = createFromBitmap(rs, b, mips, usage);
- b.recycle();
- return alloc;
- }
-
- /**
- * Creates a non-mipmapped Allocation to use as a graphics texture from the
- * {@link android.graphics.Bitmap} referenced by resource ID.
- *
- * <p>This allocation will be created with {@link #USAGE_SCRIPT} and
- * {@link #USAGE_GRAPHICS_TEXTURE}.</p>
- *
- * @param rs Context to which the allocation will belong.
- * @param res application resources
- * @param id resource id to load the data from
- *
- * @return Allocation containing resource data
- *
- */
- static public Allocation createFromBitmapResource(RenderScript rs,
- Resources res,
- int id) {
- return createFromBitmapResource(rs, res, id,
- MipmapControl.MIPMAP_NONE,
- USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE);
- }
-
- /**
- * Creates an Allocation containing string data encoded in UTF-8 format.
- *
- * @param rs Context to which the allocation will belong.
- * @param str string to create the allocation from
- * @param usage bit field specifying how the allocaiton is
- * utilized
- *
- */
- static public Allocation createFromString(RenderScript rs,
- String str,
- int usage) {
- rs.validate();
- byte[] allocArray = null;
- try {
- allocArray = str.getBytes("UTF-8");
- Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage);
- alloc.copyFrom(allocArray);
- return alloc;
- }
- catch (Exception e) {
- throw new RSRuntimeException("Could not convert string to utf-8.");
- }
- }
-
- /**
- * Frees any native resources associated with this object. The
- * primary use is to force immediate cleanup of resources when it is
- * believed the GC will not respond quickly enough.
- * For USAGE_IO_OUTPUT, destroy() implies setSurface(null).
- */
- @Override
- public void destroy() {
- if (mIncCompatAllocation != 0) {
- boolean shouldDestroy = false;
- synchronized(this) {
- if (!mIncAllocDestroyed) {
- shouldDestroy = true;
- mIncAllocDestroyed = true;
- }
- }
-
- if (shouldDestroy) {
- // must include nObjDestroy in the critical section
- ReentrantReadWriteLock.ReadLock rlock = mRS.mRWLock.readLock();
- rlock.lock();
- if(mRS.isAlive()) {
- mRS.nIncObjDestroy(mIncCompatAllocation);
- }
- rlock.unlock();
- mIncCompatAllocation = 0;
- }
- }
- if ((mUsage & (USAGE_IO_INPUT | USAGE_IO_OUTPUT)) != 0) {
- setSurface(null);
- }
- super.destroy();
- }
-
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/BaseObj.java b/v8/renderscript/java/src/android/support/v8/renderscript/BaseObj.java
deleted file mode 100644
index bb49600..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/BaseObj.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-/**
- * BaseObj is the base class for all RenderScript objects owned by a RS context.
- * It is responsible for lifetime management and resource tracking. This class
- * should not be used by a user application.
- *
- **/
-public class BaseObj {
- BaseObj(long id, RenderScript rs) {
- rs.validate();
- mRS = rs;
- mID = id;
- mDestroyed = false;
- }
-
- void setID(long id) {
- if (mID != 0) {
- throw new RSRuntimeException("Internal Error, reset of object ID.");
- }
- mID = id;
- }
-
- /**
- * Lookup the native object ID for this object. Primarily used by the
- * generated reflected code.
- *
- * @param rs Context to verify against internal context for
- * match.
- *
- * @return long
- */
- long getID(RenderScript rs) {
- mRS.validate();
- if (mDestroyed) {
- throw new RSInvalidStateException("using a destroyed object.");
- }
- if (mID == 0) {
- throw new RSRuntimeException("Internal error: Object id 0.");
- }
- if ((rs != null) && (rs != mRS)) {
- throw new RSInvalidStateException("using object with mismatched context.");
- }
- return mID;
- }
-
- android.renderscript.BaseObj getNObj() {
- return null;
- }
-
- void checkValid() {
- if ((mID == 0) && (getNObj() == null)) {
- throw new RSIllegalArgumentException("Invalid object.");
- }
- }
-
- private long mID;
- private boolean mDestroyed;
- RenderScript mRS;
-
- private void helpDestroy() {
- boolean shouldDestroy = false;
- synchronized(this) {
- if (!mDestroyed) {
- shouldDestroy = true;
- mDestroyed = true;
- }
- }
-
- if (shouldDestroy) {
- // must include nObjDestroy in the critical section
- ReentrantReadWriteLock.ReadLock rlock = mRS.mRWLock.readLock();
- rlock.lock();
- if(mRS.isAlive()) {
- mRS.nObjDestroy(mID);
- }
- rlock.unlock();
- mRS = null;
- mID = 0;
- }
- }
-
-
- protected void finalize() throws Throwable {
- helpDestroy();
- super.finalize();
- }
-
- /**
- * Frees any native resources associated with this object. The
- * primary use is to force immediate cleanup of resources when it is
- * believed the GC will not respond quickly enough.
- */
- public void destroy() {
- if(mDestroyed) {
- throw new RSInvalidStateException("Object already destroyed.");
- }
- helpDestroy();
- }
-
- /**
- * Calculates the hash code value for a BaseObj.
- *
- * @return int
- */
- @Override
- public int hashCode() {
- return (int)((mID & 0xfffffff) ^ (mID >> 32));
- }
-
- /**
- * Compare the current BaseObj with another BaseObj for equality.
- *
- * @param obj The object to check equality with.
- *
- * @return boolean
- */
- @Override
- public boolean equals(Object obj) {
- // Early-out check to see if both BaseObjs are actually the same
- if (this == obj)
- return true;
-
- if (obj == null) {
- return false;
- }
-
- if (getClass() != obj.getClass()) {
- return false;
- }
-
- BaseObj b = (BaseObj) obj;
- return mID == b.mID;
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Byte2.java b/v8/renderscript/java/src/android/support/v8/renderscript/Byte2.java
deleted file mode 100644
index 2371077..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Byte2.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript byte2 type back to the Android system.
- *
- **/
-public class Byte2 {
- public Byte2() {
- }
-
- public Byte2(byte initX, byte initY) {
- x = initX;
- y = initY;
- }
-
- public byte x;
- public byte y;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Byte3.java b/v8/renderscript/java/src/android/support/v8/renderscript/Byte3.java
deleted file mode 100644
index 4ed6af6..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Byte3.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript byte3 type back to the Android system.
- *
- **/
-public class Byte3 {
- public Byte3() {
- }
-
- public Byte3(byte initX, byte initY, byte initZ) {
- x = initX;
- y = initY;
- z = initZ;
- }
-
- public byte x;
- public byte y;
- public byte z;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Byte4.java b/v8/renderscript/java/src/android/support/v8/renderscript/Byte4.java
deleted file mode 100644
index 715a718..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Byte4.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript byte4 type back to the Android system.
- *
- **/
-public class Byte4 {
- public Byte4() {
- }
-
- public Byte4(byte initX, byte initY, byte initZ, byte initW) {
- x = initX;
- y = initY;
- z = initZ;
- w = initW;
- }
-
- public byte x;
- public byte y;
- public byte z;
- public byte w;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Double2.java b/v8/renderscript/java/src/android/support/v8/renderscript/Double2.java
deleted file mode 100644
index cd73363..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Double2.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript double2 type back
- * to the Android system.
- *
- **/
-public class Double2 {
- public Double2() {
- }
-
- public Double2(double initX, double initY) {
- x = initX;
- y = initY;
- }
-
- public double x;
- public double y;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Double3.java b/v8/renderscript/java/src/android/support/v8/renderscript/Double3.java
deleted file mode 100644
index 38a46a6..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Double3.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript double3 type back
- * to the Android system.
- *
- **/
-public class Double3 {
- public Double3() {
- }
-
- public Double3(double initX, double initY, double initZ) {
- x = initX;
- y = initY;
- z = initZ;
- }
-
- public double x;
- public double y;
- public double z;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Double4.java b/v8/renderscript/java/src/android/support/v8/renderscript/Double4.java
deleted file mode 100644
index 6de0fa8..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Double4.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript double4 type back
- * to the Android system.
- *
- **/
-public class Double4 {
- public Double4() {
- }
-
- public Double4(double initX, double initY, double initZ, double initW) {
- x = initX;
- y = initY;
- z = initZ;
- w = initW;
- }
-
- public double x;
- public double y;
- public double z;
- public double w;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Element.java b/v8/renderscript/java/src/android/support/v8/renderscript/Element.java
deleted file mode 100644
index 135d854..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Element.java
+++ /dev/null
@@ -1,1020 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.reflect.Field;
-
-import android.util.Log;
-
-/**
- * <p>An Element represents one item within an {@link
- * android.support.v8.renderscript.Allocation}. An Element is roughly
- * equivalent to a C type in a RenderScript kernel. Elements may be basic or
- * complex. Some basic elements are</p> <ul> <li>A single float value
- * (equivalent to a float in a kernel)</li> <li>A four-element float vector
- * (equivalent to a float4 in a kernel)</li> <li>An unsigned 32-bit integer
- * (equivalent to an unsigned int in a kernel)</li> <li>A single signed 8-bit
- * integer (equivalent to a char in a kernel)</li> </ul> <p>A complex element is
- * roughly equivalent to a C struct and contains a number of basic or complex
- * Elements. From Java code, a complex element contains a list of sub-elements
- * and names that represents a particular data structure. Structs used in RS
- * scripts are available to Java code by using the
- * {@code ScriptField_structname} class that is reflected from a particular
- * script.</p>
- *
- * <p>Basic Elements are comprised of a {@link
- * android.support.v8.renderscript.Element.DataType} and a {@link
- * android.support.v8.renderscript.Element.DataKind}. The DataType encodes C
- * type information of an Element, while the DataKind encodes how that Element
- * should be interpreted by a {@link android.support.v8.renderscript.Sampler}.
- * Note that {@link android.support.v8.renderscript.Allocation} objects with
- * DataKind {@link android.support.v8.renderscript.Element.DataKind#USER} cannot
- * be used as input for a {@link android.support.v8.renderscript.Sampler}. In
- * general, {@link android.support.v8.renderscript.Allocation} objects that are
- * intended for use with a {@link android.support.v8.renderscript.Sampler}
- * should use bitmap-derived Elements such as
- * {@link android.support.v8.renderscript.Element#RGBA_8888} or {@link
- * android.support.v8.renderscript#Element.A_8}.</p>
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about creating an application that uses RenderScript,
- * read the
- * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
- * developer guide.</p>
- * </div>
- **/
-public class Element extends BaseObj {
- int mSize;
- Element[] mElements;
- String[] mElementNames;
- int[] mArraySizes;
- int[] mOffsetInBytes;
- int[] mVisibleElementMap;
-
- DataType mType;
- DataKind mKind;
- boolean mNormalized;
- int mVectorSize;
-
- private void updateVisibleSubElements() {
- if (mElements == null) {
- return;
- }
-
- int noPaddingFieldCount = 0;
- int fieldCount = mElementNames.length;
- // Find out how many elements are not padding
- for (int ct = 0; ct < fieldCount; ct ++) {
- if (mElementNames[ct].charAt(0) != '#') {
- noPaddingFieldCount ++;
- }
- }
- mVisibleElementMap = new int[noPaddingFieldCount];
-
- // Make a map that points us at non-padding elements
- for (int ct = 0, ctNoPadding = 0; ct < fieldCount; ct ++) {
- if (mElementNames[ct].charAt(0) != '#') {
- mVisibleElementMap[ctNoPadding ++] = ct;
- }
- }
- }
-
- /**
- * @return element size in bytes
- */
- public int getBytesSize() {
- return mSize;
- }
-
- /**
- * Returns the number of vector components. 2 for float2, 4 for
- * float4, etc.
- * @return element vector size
- */
- public int getVectorSize() {
- return mVectorSize;
- }
-
-
- /**
- * DataType represents the basic type information for a basic element. The
- * naming convention follows. For numeric types it is FLOAT,
- * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
- * size of the data. BOOLEAN is a true / false (1,0)
- * represented in an 8 bit container. The UNSIGNED variants
- * with multiple bit definitions are for packed graphical data
- * formats and represent vectors with per vector member sizes
- * which are treated as a single unit for packing and alignment
- * purposes.
- *
- * MATRIX the three matrix types contain FLOAT_32 elements and are treated
- * as 32 bits for alignment purposes.
- *
- * RS_* objects. 32 bit opaque handles.
- */
- public enum DataType {
- NONE (0, 0),
- //FLOAT_16 (1, 2),
- FLOAT_32 (2, 4),
- FLOAT_64 (3, 8),
- SIGNED_8 (4, 1),
- SIGNED_16 (5, 2),
- SIGNED_32 (6, 4),
- SIGNED_64 (7, 8),
- UNSIGNED_8 (8, 1),
- UNSIGNED_16 (9, 2),
- UNSIGNED_32 (10, 4),
- UNSIGNED_64 (11, 8),
-
- BOOLEAN(12, 1),
-
- UNSIGNED_5_6_5 (13, 2),
- UNSIGNED_5_5_5_1 (14, 2),
- UNSIGNED_4_4_4_4 (15, 2),
-
- MATRIX_4X4 (16, 64),
- MATRIX_3X3 (17, 36),
- MATRIX_2X2 (18, 16),
-
- RS_ELEMENT (1000),
- RS_TYPE (1001),
- RS_ALLOCATION (1002),
- RS_SAMPLER (1003),
- RS_SCRIPT (1004);
-
- int mID;
- int mSize;
- DataType(int id, int size) {
- mID = id;
- mSize = size;
- }
-
- DataType(int id) {
- mID = id;
- mSize = 4;
- if (RenderScript.sPointerSize == 8) {
- mSize = 32;
- }
- }
- }
-
- /**
- * The special interpretation of the data if required. This is primarly
- * useful for graphical data. USER indicates no special interpretation is
- * expected. PIXEL is used in conjunction with the standard data types for
- * representing texture formats.
- */
- public enum DataKind {
- USER (0),
-
- PIXEL_L (7),
- PIXEL_A (8),
- PIXEL_LA (9),
- PIXEL_RGB (10),
- PIXEL_RGBA (11),
- PIXEL_DEPTH (12),
- PIXEL_YUV(13);
-
- int mID;
- DataKind(int id) {
- mID = id;
- }
- }
-
- /**
- * Return if a element is too complex for use as a data source for a Mesh or
- * a Program.
- *
- * @return boolean
- */
- public boolean isComplex() {
- if (mElements == null) {
- return false;
- }
- for (int ct=0; ct < mElements.length; ct++) {
- if (mElements[ct].mElements != null) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Elements could be simple, such as an int or a float, or a
- * structure with multiple sub elements, such as a collection of
- * floats, float2, float4. This function returns zero for simple
- * elements or the number of sub-elements otherwise.
- * @return number of sub-elements in this element
- */
- public int getSubElementCount() {
- if (mVisibleElementMap == null) {
- return 0;
- }
- return mVisibleElementMap.length;
- }
-
- /**
- * For complex elements, this function will return the
- * sub-element at index
- * @param index index of the sub-element to return
- * @return sub-element in this element at given index
- */
- public Element getSubElement(int index) {
- if (mVisibleElementMap == null) {
- throw new RSIllegalArgumentException("Element contains no sub-elements");
- }
- if (index < 0 || index >= mVisibleElementMap.length) {
- throw new RSIllegalArgumentException("Illegal sub-element index");
- }
- return mElements[mVisibleElementMap[index]];
- }
-
- /**
- * For complex elements, this function will return the
- * sub-element name at index
- * @param index index of the sub-element
- * @return sub-element in this element at given index
- */
- public String getSubElementName(int index) {
- if (mVisibleElementMap == null) {
- throw new RSIllegalArgumentException("Element contains no sub-elements");
- }
- if (index < 0 || index >= mVisibleElementMap.length) {
- throw new RSIllegalArgumentException("Illegal sub-element index");
- }
- return mElementNames[mVisibleElementMap[index]];
- }
-
- /**
- * For complex elements, some sub-elements could be statically
- * sized arrays. This function will return the array size for
- * sub-element at index
- * @param index index of the sub-element
- * @return array size of sub-element in this element at given index
- */
- public int getSubElementArraySize(int index) {
- if (mVisibleElementMap == null) {
- throw new RSIllegalArgumentException("Element contains no sub-elements");
- }
- if (index < 0 || index >= mVisibleElementMap.length) {
- throw new RSIllegalArgumentException("Illegal sub-element index");
- }
- return mArraySizes[mVisibleElementMap[index]];
- }
-
- /**
- * This function specifies the location of a sub-element within
- * the element
- * @param index index of the sub-element
- * @return offset in bytes of sub-element in this element at given index
- */
- public int getSubElementOffsetBytes(int index) {
- if (mVisibleElementMap == null) {
- throw new RSIllegalArgumentException("Element contains no sub-elements");
- }
- if (index < 0 || index >= mVisibleElementMap.length) {
- throw new RSIllegalArgumentException("Illegal sub-element index");
- }
- return mOffsetInBytes[mVisibleElementMap[index]];
- }
-
- /**
- * @return element data type
- */
- public DataType getDataType() {
- return mType;
- }
-
- /**
- * @return element data kind
- */
- public DataKind getDataKind() {
- return mKind;
- }
-
- /**
- * Utility function for returning an Element containing a single Boolean.
- *
- * @param rs Context to which the element will belong.
- *
- * @return Element
- */
- public static Element BOOLEAN(RenderScript rs) {
- if(rs.mElement_BOOLEAN == null) {
- rs.mElement_BOOLEAN = createUser(rs, DataType.BOOLEAN);
- }
- return rs.mElement_BOOLEAN;
- }
-
- /**
- * Utility function for returning an Element containing a single UNSIGNED_8.
- *
- * @param rs Context to which the element will belong.
- *
- * @return Element
- */
- public static Element U8(RenderScript rs) {
- if(rs.mElement_U8 == null) {
- rs.mElement_U8 = createUser(rs, DataType.UNSIGNED_8);
- }
- return rs.mElement_U8;
- }
-
- /**
- * Utility function for returning an Element containing a single SIGNED_8.
- *
- * @param rs Context to which the element will belong.
- *
- * @return Element
- */
- public static Element I8(RenderScript rs) {
- if(rs.mElement_I8 == null) {
- rs.mElement_I8 = createUser(rs, DataType.SIGNED_8);
- }
- return rs.mElement_I8;
- }
-
- public static Element U16(RenderScript rs) {
- if(rs.mElement_U16 == null) {
- rs.mElement_U16 = createUser(rs, DataType.UNSIGNED_16);
- }
- return rs.mElement_U16;
- }
-
- public static Element I16(RenderScript rs) {
- if(rs.mElement_I16 == null) {
- rs.mElement_I16 = createUser(rs, DataType.SIGNED_16);
- }
- return rs.mElement_I16;
- }
-
- public static Element U32(RenderScript rs) {
- if(rs.mElement_U32 == null) {
- rs.mElement_U32 = createUser(rs, DataType.UNSIGNED_32);
- }
- return rs.mElement_U32;
- }
-
- public static Element I32(RenderScript rs) {
- if(rs.mElement_I32 == null) {
- rs.mElement_I32 = createUser(rs, DataType.SIGNED_32);
- }
- return rs.mElement_I32;
- }
-
- public static Element U64(RenderScript rs) {
- if(rs.mElement_U64 == null) {
- rs.mElement_U64 = createUser(rs, DataType.UNSIGNED_64);
- }
- return rs.mElement_U64;
- }
-
- public static Element I64(RenderScript rs) {
- if(rs.mElement_I64 == null) {
- rs.mElement_I64 = createUser(rs, DataType.SIGNED_64);
- }
- return rs.mElement_I64;
- }
-
- public static Element F32(RenderScript rs) {
- if(rs.mElement_F32 == null) {
- rs.mElement_F32 = createUser(rs, DataType.FLOAT_32);
- }
- return rs.mElement_F32;
- }
-
- public static Element F64(RenderScript rs) {
- if(rs.mElement_F64 == null) {
- rs.mElement_F64 = createUser(rs, DataType.FLOAT_64);
- }
- return rs.mElement_F64;
- }
-
- public static Element ELEMENT(RenderScript rs) {
- if(rs.mElement_ELEMENT == null) {
- rs.mElement_ELEMENT = createUser(rs, DataType.RS_ELEMENT);
- }
- return rs.mElement_ELEMENT;
- }
-
- public static Element TYPE(RenderScript rs) {
- if(rs.mElement_TYPE == null) {
- rs.mElement_TYPE = createUser(rs, DataType.RS_TYPE);
- }
- return rs.mElement_TYPE;
- }
-
- public static Element ALLOCATION(RenderScript rs) {
- if(rs.mElement_ALLOCATION == null) {
- rs.mElement_ALLOCATION = createUser(rs, DataType.RS_ALLOCATION);
- }
- return rs.mElement_ALLOCATION;
- }
-
- public static Element SAMPLER(RenderScript rs) {
- if(rs.mElement_SAMPLER == null) {
- rs.mElement_SAMPLER = createUser(rs, DataType.RS_SAMPLER);
- }
- return rs.mElement_SAMPLER;
- }
-
- public static Element SCRIPT(RenderScript rs) {
- if(rs.mElement_SCRIPT == null) {
- rs.mElement_SCRIPT = createUser(rs, DataType.RS_SCRIPT);
- }
- return rs.mElement_SCRIPT;
- }
-
-
- public static Element A_8(RenderScript rs) {
- if(rs.mElement_A_8 == null) {
- rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
- }
- return rs.mElement_A_8;
- }
-
- public static Element RGB_565(RenderScript rs) {
- if(rs.mElement_RGB_565 == null) {
- rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
- }
- return rs.mElement_RGB_565;
- }
-
- public static Element RGB_888(RenderScript rs) {
- if(rs.mElement_RGB_888 == null) {
- rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
- }
- return rs.mElement_RGB_888;
- }
-
- public static Element RGBA_5551(RenderScript rs) {
- if(rs.mElement_RGBA_5551 == null) {
- rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
- }
- return rs.mElement_RGBA_5551;
- }
-
- public static Element RGBA_4444(RenderScript rs) {
- if(rs.mElement_RGBA_4444 == null) {
- rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
- }
- return rs.mElement_RGBA_4444;
- }
-
- public static Element RGBA_8888(RenderScript rs) {
- if(rs.mElement_RGBA_8888 == null) {
- rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
- }
- return rs.mElement_RGBA_8888;
- }
-
- public static Element F32_2(RenderScript rs) {
- if(rs.mElement_FLOAT_2 == null) {
- rs.mElement_FLOAT_2 = createVector(rs, DataType.FLOAT_32, 2);
- }
- return rs.mElement_FLOAT_2;
- }
-
- public static Element F32_3(RenderScript rs) {
- if(rs.mElement_FLOAT_3 == null) {
- rs.mElement_FLOAT_3 = createVector(rs, DataType.FLOAT_32, 3);
- }
- return rs.mElement_FLOAT_3;
- }
-
- public static Element F32_4(RenderScript rs) {
- if(rs.mElement_FLOAT_4 == null) {
- rs.mElement_FLOAT_4 = createVector(rs, DataType.FLOAT_32, 4);
- }
- return rs.mElement_FLOAT_4;
- }
-
- public static Element F64_2(RenderScript rs) {
- if(rs.mElement_DOUBLE_2 == null) {
- rs.mElement_DOUBLE_2 = createVector(rs, DataType.FLOAT_64, 2);
- }
- return rs.mElement_DOUBLE_2;
- }
-
- public static Element F64_3(RenderScript rs) {
- if(rs.mElement_DOUBLE_3 == null) {
- rs.mElement_DOUBLE_3 = createVector(rs, DataType.FLOAT_64, 3);
- }
- return rs.mElement_DOUBLE_3;
- }
-
- public static Element F64_4(RenderScript rs) {
- if(rs.mElement_DOUBLE_4 == null) {
- rs.mElement_DOUBLE_4 = createVector(rs, DataType.FLOAT_64, 4);
- }
- return rs.mElement_DOUBLE_4;
- }
-
- public static Element U8_2(RenderScript rs) {
- if(rs.mElement_UCHAR_2 == null) {
- rs.mElement_UCHAR_2 = createVector(rs, DataType.UNSIGNED_8, 2);
- }
- return rs.mElement_UCHAR_2;
- }
-
- public static Element U8_3(RenderScript rs) {
- if(rs.mElement_UCHAR_3 == null) {
- rs.mElement_UCHAR_3 = createVector(rs, DataType.UNSIGNED_8, 3);
- }
- return rs.mElement_UCHAR_3;
- }
-
- public static Element U8_4(RenderScript rs) {
- if(rs.mElement_UCHAR_4 == null) {
- rs.mElement_UCHAR_4 = createVector(rs, DataType.UNSIGNED_8, 4);
- }
- return rs.mElement_UCHAR_4;
- }
-
- public static Element I8_2(RenderScript rs) {
- if(rs.mElement_CHAR_2 == null) {
- rs.mElement_CHAR_2 = createVector(rs, DataType.SIGNED_8, 2);
- }
- return rs.mElement_CHAR_2;
- }
-
- public static Element I8_3(RenderScript rs) {
- if(rs.mElement_CHAR_3 == null) {
- rs.mElement_CHAR_3 = createVector(rs, DataType.SIGNED_8, 3);
- }
- return rs.mElement_CHAR_3;
- }
-
- public static Element I8_4(RenderScript rs) {
- if(rs.mElement_CHAR_4 == null) {
- rs.mElement_CHAR_4 = createVector(rs, DataType.SIGNED_8, 4);
- }
- return rs.mElement_CHAR_4;
- }
-
- public static Element U16_2(RenderScript rs) {
- if(rs.mElement_USHORT_2 == null) {
- rs.mElement_USHORT_2 = createVector(rs, DataType.UNSIGNED_16, 2);
- }
- return rs.mElement_USHORT_2;
- }
-
- public static Element U16_3(RenderScript rs) {
- if(rs.mElement_USHORT_3 == null) {
- rs.mElement_USHORT_3 = createVector(rs, DataType.UNSIGNED_16, 3);
- }
- return rs.mElement_USHORT_3;
- }
-
- public static Element U16_4(RenderScript rs) {
- if(rs.mElement_USHORT_4 == null) {
- rs.mElement_USHORT_4 = createVector(rs, DataType.UNSIGNED_16, 4);
- }
- return rs.mElement_USHORT_4;
- }
-
- public static Element I16_2(RenderScript rs) {
- if(rs.mElement_SHORT_2 == null) {
- rs.mElement_SHORT_2 = createVector(rs, DataType.SIGNED_16, 2);
- }
- return rs.mElement_SHORT_2;
- }
-
- public static Element I16_3(RenderScript rs) {
- if(rs.mElement_SHORT_3 == null) {
- rs.mElement_SHORT_3 = createVector(rs, DataType.SIGNED_16, 3);
- }
- return rs.mElement_SHORT_3;
- }
-
- public static Element I16_4(RenderScript rs) {
- if(rs.mElement_SHORT_4 == null) {
- rs.mElement_SHORT_4 = createVector(rs, DataType.SIGNED_16, 4);
- }
- return rs.mElement_SHORT_4;
- }
-
- public static Element U32_2(RenderScript rs) {
- if(rs.mElement_UINT_2 == null) {
- rs.mElement_UINT_2 = createVector(rs, DataType.UNSIGNED_32, 2);
- }
- return rs.mElement_UINT_2;
- }
-
- public static Element U32_3(RenderScript rs) {
- if(rs.mElement_UINT_3 == null) {
- rs.mElement_UINT_3 = createVector(rs, DataType.UNSIGNED_32, 3);
- }
- return rs.mElement_UINT_3;
- }
-
- public static Element U32_4(RenderScript rs) {
- if(rs.mElement_UINT_4 == null) {
- rs.mElement_UINT_4 = createVector(rs, DataType.UNSIGNED_32, 4);
- }
- return rs.mElement_UINT_4;
- }
-
- public static Element I32_2(RenderScript rs) {
- if(rs.mElement_INT_2 == null) {
- rs.mElement_INT_2 = createVector(rs, DataType.SIGNED_32, 2);
- }
- return rs.mElement_INT_2;
- }
-
- public static Element I32_3(RenderScript rs) {
- if(rs.mElement_INT_3 == null) {
- rs.mElement_INT_3 = createVector(rs, DataType.SIGNED_32, 3);
- }
- return rs.mElement_INT_3;
- }
-
- public static Element I32_4(RenderScript rs) {
- if(rs.mElement_INT_4 == null) {
- rs.mElement_INT_4 = createVector(rs, DataType.SIGNED_32, 4);
- }
- return rs.mElement_INT_4;
- }
-
- public static Element U64_2(RenderScript rs) {
- if(rs.mElement_ULONG_2 == null) {
- rs.mElement_ULONG_2 = createVector(rs, DataType.UNSIGNED_64, 2);
- }
- return rs.mElement_ULONG_2;
- }
-
- public static Element U64_3(RenderScript rs) {
- if(rs.mElement_ULONG_3 == null) {
- rs.mElement_ULONG_3 = createVector(rs, DataType.UNSIGNED_64, 3);
- }
- return rs.mElement_ULONG_3;
- }
-
- public static Element U64_4(RenderScript rs) {
- if(rs.mElement_ULONG_4 == null) {
- rs.mElement_ULONG_4 = createVector(rs, DataType.UNSIGNED_64, 4);
- }
- return rs.mElement_ULONG_4;
- }
-
- public static Element I64_2(RenderScript rs) {
- if(rs.mElement_LONG_2 == null) {
- rs.mElement_LONG_2 = createVector(rs, DataType.SIGNED_64, 2);
- }
- return rs.mElement_LONG_2;
- }
-
- public static Element I64_3(RenderScript rs) {
- if(rs.mElement_LONG_3 == null) {
- rs.mElement_LONG_3 = createVector(rs, DataType.SIGNED_64, 3);
- }
- return rs.mElement_LONG_3;
- }
-
- public static Element I64_4(RenderScript rs) {
- if(rs.mElement_LONG_4 == null) {
- rs.mElement_LONG_4 = createVector(rs, DataType.SIGNED_64, 4);
- }
- return rs.mElement_LONG_4;
- }
-
- public static Element MATRIX_4X4(RenderScript rs) {
- if(rs.mElement_MATRIX_4X4 == null) {
- rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
- }
- return rs.mElement_MATRIX_4X4;
- }
-
- public static Element MATRIX_3X3(RenderScript rs) {
- if(rs.mElement_MATRIX_3X3 == null) {
- rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
- }
- return rs.mElement_MATRIX_3X3;
- }
-
- public static Element MATRIX_2X2(RenderScript rs) {
- if(rs.mElement_MATRIX_2X2 == null) {
- rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
- }
- return rs.mElement_MATRIX_2X2;
- }
-
- Element(long id, RenderScript rs, Element[] e, String[] n, int[] as) {
- super(id, rs);
- mSize = 0;
- mVectorSize = 1;
- mElements = e;
- mElementNames = n;
- mArraySizes = as;
- mType = DataType.NONE;
- mKind = DataKind.USER;
- mOffsetInBytes = new int[mElements.length];
- for (int ct = 0; ct < mElements.length; ct++ ) {
- mOffsetInBytes[ct] = mSize;
- mSize += mElements[ct].mSize * mArraySizes[ct];
- }
- updateVisibleSubElements();
- }
-
- Element(long id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
- super(id, rs);
- if ((dt != DataType.UNSIGNED_5_6_5) &&
- (dt != DataType.UNSIGNED_4_4_4_4) &&
- (dt != DataType.UNSIGNED_5_5_5_1)) {
- if (size == 3) {
- mSize = dt.mSize * 4;
- } else {
- mSize = dt.mSize * size;
- }
- } else {
- mSize = dt.mSize;
- }
- mType = dt;
- mKind = dk;
- mNormalized = norm;
- mVectorSize = size;
- }
-
- Element(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /*
- * Get an identical dummy Element for Compat Context
- *
- */
- public long getDummyElement(RenderScript mRS) {
- return mRS.nIncElementCreate(mType.mID, mKind.mID, mNormalized, mVectorSize);
- }
- /**
- * Create a custom Element of the specified DataType. The DataKind will be
- * set to USER and the vector size to 1 indicating non-vector.
- *
- * @param rs The context associated with the new Element.
- * @param dt The DataType for the new element.
- * @return Element
- */
- static Element createUser(RenderScript rs, DataType dt) {
- DataKind dk = DataKind.USER;
- boolean norm = false;
- int vecSize = 1;
- long id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
- return new Element(id, rs, dt, dk, norm, vecSize);
- }
-
- /**
- * Create a custom vector element of the specified DataType and vector size.
- * DataKind will be set to USER. Only primitive types (FLOAT_32, FLOAT_64,
- * SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, UNSIGNED_8, UNSIGNED_16,
- * UNSIGNED_32, UNSIGNED_64, BOOLEAN) are supported.
- *
- * @param rs The context associated with the new Element.
- * @param dt The DataType for the new Element.
- * @param size Vector size for the new Element. Range 2-4 inclusive
- * supported.
- *
- * @return Element
- */
- public static Element createVector(RenderScript rs, DataType dt, int size) {
- if (size < 2 || size > 4) {
- throw new RSIllegalArgumentException("Vector size out of range 2-4.");
- }
-
- switch (dt) {
- // Support only primitive integer/float/boolean types as vectors.
- case FLOAT_32:
- case FLOAT_64:
- case SIGNED_8:
- case SIGNED_16:
- case SIGNED_32:
- case SIGNED_64:
- case UNSIGNED_8:
- case UNSIGNED_16:
- case UNSIGNED_32:
- case UNSIGNED_64:
- case BOOLEAN: {
- DataKind dk = DataKind.USER;
- boolean norm = false;
- long id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
- return new Element(id, rs, dt, dk, norm, size);
- }
-
- default: {
- throw new RSIllegalArgumentException("Cannot create vector of " +
- "non-primitive type.");
- }
- }
- }
-
- /**
- * Create a new pixel Element type. A matching DataType and DataKind must
- * be provided. The DataType and DataKind must contain the same number of
- * components. Vector size will be set to 1.
- *
- * @param rs The context associated with the new Element.
- * @param dt The DataType for the new element.
- * @param dk The DataKind to specify the mapping of each component in the
- * DataType.
- *
- * @return Element
- */
- public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
- if (!(dk == DataKind.PIXEL_L ||
- dk == DataKind.PIXEL_A ||
- dk == DataKind.PIXEL_LA ||
- dk == DataKind.PIXEL_RGB ||
- dk == DataKind.PIXEL_RGBA ||
- dk == DataKind.PIXEL_DEPTH ||
- dk == DataKind.PIXEL_YUV)) {
- throw new RSIllegalArgumentException("Unsupported DataKind");
- }
- if (!(dt == DataType.UNSIGNED_8 ||
- dt == DataType.UNSIGNED_16 ||
- dt == DataType.UNSIGNED_5_6_5 ||
- dt == DataType.UNSIGNED_4_4_4_4 ||
- dt == DataType.UNSIGNED_5_5_5_1)) {
- throw new RSIllegalArgumentException("Unsupported DataType");
- }
- if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
- throw new RSIllegalArgumentException("Bad kind and type combo");
- }
- if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
- throw new RSIllegalArgumentException("Bad kind and type combo");
- }
- if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
- throw new RSIllegalArgumentException("Bad kind and type combo");
- }
- if (dt == DataType.UNSIGNED_16 &&
- dk != DataKind.PIXEL_DEPTH) {
- throw new RSIllegalArgumentException("Bad kind and type combo");
- }
-
- int size = 1;
- switch (dk) {
- case PIXEL_LA:
- size = 2;
- break;
- case PIXEL_RGB:
- size = 3;
- break;
- case PIXEL_RGBA:
- size = 4;
- break;
- }
-
- boolean norm = true;
- long id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
- return new Element(id, rs, dt, dk, norm, size);
- }
-
- /**
- * Check if the current Element is compatible with another Element.
- * Primitive Elements are compatible if they share the same underlying
- * size and type (i.e. U8 is compatible with A_8). User-defined Elements
- * must be equal in order to be compatible. This requires strict name
- * equivalence for all sub-Elements (in addition to structural equivalence).
- *
- * @param e The Element to check compatibility with.
- *
- * @return boolean true if the Elements are compatible, otherwise false.
- */
- public boolean isCompatible(Element e) {
- // Try strict BaseObj equality to start with.
- if (this.equals(e)) {
- return true;
- }
-
- // Ignore mKind because it is allowed to be different (user vs. pixel).
- // We also ignore mNormalized because it can be different. The mType
- // field must not be NONE since we require name equivalence for
- // all user-created Elements.
- return ((mSize == e.mSize) &&
- (mType != DataType.NONE) &&
- (mType == e.mType) &&
- (mVectorSize == e.mVectorSize));
- }
-
- /**
- * Builder class for producing complex elements with matching field and name
- * pairs. The builder starts empty. The order in which elements are added
- * is retained for the layout in memory.
- *
- */
- public static class Builder {
-
- RenderScript mRS;
- Element[] mElements;
- String[] mElementNames;
- int[] mArraySizes;
- int mCount;
- int mSkipPadding;
-
- /**
- * Create a builder object.
- *
- * @param rs
- */
- public Builder(RenderScript rs) {
- mRS = rs;
- mCount = 0;
- mElements = new Element[8];
- mElementNames = new String[8];
- mArraySizes = new int[8];
- }
-
- /**
- * Add an array of elements to this element.
- *
- * @param element
- * @param name
- * @param arraySize
- */
- public Builder add(Element element, String name, int arraySize) {
- if (arraySize < 1) {
- throw new RSIllegalArgumentException("Array size cannot be less than 1.");
- }
-
- // Skip padding fields after a vector 3 type.
- if (mSkipPadding != 0) {
- if (name.startsWith("#padding_")) {
- mSkipPadding = 0;
- return this;
- }
- }
-
- if (element.mVectorSize == 3) {
- mSkipPadding = 1;
- } else {
- mSkipPadding = 0;
- }
-
- if(mCount == mElements.length) {
- Element[] e = new Element[mCount + 8];
- String[] s = new String[mCount + 8];
- int[] as = new int[mCount + 8];
- System.arraycopy(mElements, 0, e, 0, mCount);
- System.arraycopy(mElementNames, 0, s, 0, mCount);
- System.arraycopy(mArraySizes, 0, as, 0, mCount);
- mElements = e;
- mElementNames = s;
- mArraySizes = as;
- }
- mElements[mCount] = element;
- mElementNames[mCount] = name;
- mArraySizes[mCount] = arraySize;
- mCount++;
-
- return this;
- }
-
- /**
- * Add a single element to this Element.
- *
- * @param element
- * @param name
- */
- public Builder add(Element element, String name) {
- return add(element, name, 1);
- }
-
- /**
- * Create the element from this builder.
- *
- *
- * @return Element
- */
- public Element create() {
- mRS.validate();
- Element[] ein = new Element[mCount];
- String[] sin = new String[mCount];
- int[] asin = new int[mCount];
- java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
- java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
- java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
-
- long[] ids = new long[ein.length];
- for (int ct = 0; ct < ein.length; ct++ ) {
- ids[ct] = ein[ct].getID(mRS);
- }
-
- long id = mRS.nElementCreate2(ids, sin, asin);
- return new Element(id, mRS, ein, sin, asin);
- }
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
deleted file mode 100644
index 5f61920..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.support.v8.renderscript.RenderScript;
-import java.util.BitSet;
-
-/**
- * Utility class for packing arguments and structures from Android system objects to
- * RenderScript objects.
- *
- * This class is only intended to be used to support the
- * reflected code generated by the RS tool chain. It should not
- * be called directly.
- *
- **/
-public class FieldPacker {
- public FieldPacker(int len) {
- mPos = 0;
- mLen = len;
- mData = new byte[len];
- mAlignment = new BitSet();
- }
-
- public FieldPacker(byte[] data) {
- // Advance mPos to the end of the buffer, since we are copying in the
- // full data input.
- mPos = data.length;
- mLen = data.length;
- mData = data;
- mAlignment = new BitSet();
- // TODO: We should either have an actual FieldPacker copy constructor
- // or drop support for computing alignment like this. As it stands,
- // subAlign() can never work correctly for copied FieldPacker objects.
- }
-
- static FieldPacker createFromArray(Object[] args) {
- FieldPacker fp = new FieldPacker(RenderScript.sPointerSize * 8);
- for (Object arg : args) {
- fp.addSafely(arg);
- }
- fp.resize(fp.mPos);
- return fp;
- }
-
- public void align(int v) {
- if ((v <= 0) || ((v & (v - 1)) != 0)) {
- throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
- }
-
- while ((mPos & (v - 1)) != 0) {
- mAlignment.flip(mPos);
- mData[mPos++] = 0;
- }
- }
-
- public void subalign(int v) {
- if ((v & (v - 1)) != 0) {
- throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
- }
-
- while ((mPos & (v - 1)) != 0) {
- mPos--;
- }
-
- if (mPos > 0) {
- while (mAlignment.get(mPos - 1) == true) {
- mPos--;
- mAlignment.flip(mPos);
- }
- }
-
- }
-
- public void reset() {
- mPos = 0;
- }
- public void reset(int i) {
- if ((i < 0) || (i > mLen)) {
- throw new RSIllegalArgumentException("out of range argument: " + i);
- }
- mPos = i;
- }
-
- public void skip(int i) {
- int res = mPos + i;
- if ((res < 0) || (res > mLen)) {
- throw new RSIllegalArgumentException("out of range argument: " + i);
- }
- mPos = res;
- }
-
- public void addI8(byte v) {
- mData[mPos++] = v;
- }
-
- public byte subI8() {
- subalign(1);
- return mData[--mPos];
- }
-
- public void addI16(short v) {
- align(2);
- mData[mPos++] = (byte)(v & 0xff);
- mData[mPos++] = (byte)(v >> 8);
- }
-
- public short subI16() {
- subalign(2);
- short v = 0;
- v = (short)((mData[--mPos] & 0xff) << 8);
- v = (short)(v | (short)(mData[--mPos] & 0xff));
- return v;
- }
-
-
- public void addI32(int v) {
- align(4);
- mData[mPos++] = (byte)(v & 0xff);
- mData[mPos++] = (byte)((v >> 8) & 0xff);
- mData[mPos++] = (byte)((v >> 16) & 0xff);
- mData[mPos++] = (byte)((v >> 24) & 0xff);
- }
-
- public int subI32() {
- subalign(4);
- int v = 0;
- v = ((mData[--mPos] & 0xff) << 24);
- v = v | ((mData[--mPos] & 0xff) << 16);
- v = v | ((mData[--mPos] & 0xff) << 8);
- v = v | ((mData[--mPos] & 0xff));
- return v;
- }
-
-
- public void addI64(long v) {
- align(8);
- mData[mPos++] = (byte)(v & 0xff);
- mData[mPos++] = (byte)((v >> 8) & 0xff);
- mData[mPos++] = (byte)((v >> 16) & 0xff);
- mData[mPos++] = (byte)((v >> 24) & 0xff);
- mData[mPos++] = (byte)((v >> 32) & 0xff);
- mData[mPos++] = (byte)((v >> 40) & 0xff);
- mData[mPos++] = (byte)((v >> 48) & 0xff);
- mData[mPos++] = (byte)((v >> 56) & 0xff);
- }
-
- public long subI64() {
- subalign(8);
- long v = 0;
- byte x = 0;
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 56l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 48l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 40l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 32l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 24l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 16l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff) << 8l);
- x = ((mData[--mPos]));
- v = (long)(v | (((long)x) & 0xff));
- return v;
- }
-
- public void addU8(short v) {
- if ((v < 0) || (v > 0xff)) {
- android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
- throw new IllegalArgumentException("Saving value out of range for type");
- }
- mData[mPos++] = (byte)v;
- }
-
- public void addU16(int v) {
- if ((v < 0) || (v > 0xffff)) {
- android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
- throw new IllegalArgumentException("Saving value out of range for type");
- }
- align(2);
- mData[mPos++] = (byte)(v & 0xff);
- mData[mPos++] = (byte)(v >> 8);
- }
-
- public void addU32(long v) {
- if ((v < 0) || (v > 0xffffffffL)) {
- android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
- throw new IllegalArgumentException("Saving value out of range for type");
- }
- align(4);
- mData[mPos++] = (byte)(v & 0xff);
- mData[mPos++] = (byte)((v >> 8) & 0xff);
- mData[mPos++] = (byte)((v >> 16) & 0xff);
- mData[mPos++] = (byte)((v >> 24) & 0xff);
- }
-
- public void addU64(long v) {
- if (v < 0) {
- android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
- throw new IllegalArgumentException("Saving value out of range for type");
- }
- align(8);
- mData[mPos++] = (byte)(v & 0xff);
- mData[mPos++] = (byte)((v >> 8) & 0xff);
- mData[mPos++] = (byte)((v >> 16) & 0xff);
- mData[mPos++] = (byte)((v >> 24) & 0xff);
- mData[mPos++] = (byte)((v >> 32) & 0xff);
- mData[mPos++] = (byte)((v >> 40) & 0xff);
- mData[mPos++] = (byte)((v >> 48) & 0xff);
- mData[mPos++] = (byte)((v >> 56) & 0xff);
- }
-
- public void addF32(float v) {
- addI32(Float.floatToRawIntBits(v));
- }
-
- public float subF32() {
- return Float.intBitsToFloat(subI32());
- }
-
- public void addF64(double v) {
- addI64(Double.doubleToRawLongBits(v));
- }
-
- public double subF64() {
- return Double.longBitsToDouble(subI64());
- }
-
- public void addObj(BaseObj obj) {
- if (obj != null) {
- if (RenderScript.sPointerSize == 8) {
- addI64(obj.getID(null));
- addI64(0);
- addI64(0);
- addI64(0);
- } else {
- addI32((int)obj.getID(null));
- }
- } else {
- if (RenderScript.sPointerSize == 8) {
- addI64(0);
- addI64(0);
- addI64(0);
- addI64(0);
- } else {
- addI32(0);
- }
- }
- }
-
- public void addF32(Float2 v) {
- addF32(v.x);
- addF32(v.y);
- }
- public void addF32(Float3 v) {
- addF32(v.x);
- addF32(v.y);
- addF32(v.z);
- }
- public void addF32(Float4 v) {
- addF32(v.x);
- addF32(v.y);
- addF32(v.z);
- addF32(v.w);
- }
-
- public void addF64(Double2 v) {
- addF64(v.x);
- addF64(v.y);
- }
- public void addF64(Double3 v) {
- addF64(v.x);
- addF64(v.y);
- addF64(v.z);
- }
- public void addF64(Double4 v) {
- addF64(v.x);
- addF64(v.y);
- addF64(v.z);
- addF64(v.w);
- }
-
- public void addI8(Byte2 v) {
- addI8(v.x);
- addI8(v.y);
- }
- public void addI8(Byte3 v) {
- addI8(v.x);
- addI8(v.y);
- addI8(v.z);
- }
- public void addI8(Byte4 v) {
- addI8(v.x);
- addI8(v.y);
- addI8(v.z);
- addI8(v.w);
- }
-
- public void addU8(Short2 v) {
- addU8(v.x);
- addU8(v.y);
- }
- public void addU8(Short3 v) {
- addU8(v.x);
- addU8(v.y);
- addU8(v.z);
- }
- public void addU8(Short4 v) {
- addU8(v.x);
- addU8(v.y);
- addU8(v.z);
- addU8(v.w);
- }
-
- public void addI16(Short2 v) {
- addI16(v.x);
- addI16(v.y);
- }
- public void addI16(Short3 v) {
- addI16(v.x);
- addI16(v.y);
- addI16(v.z);
- }
- public void addI16(Short4 v) {
- addI16(v.x);
- addI16(v.y);
- addI16(v.z);
- addI16(v.w);
- }
-
- public void addU16(Int2 v) {
- addU16(v.x);
- addU16(v.y);
- }
- public void addU16(Int3 v) {
- addU16(v.x);
- addU16(v.y);
- addU16(v.z);
- }
- public void addU16(Int4 v) {
- addU16(v.x);
- addU16(v.y);
- addU16(v.z);
- addU16(v.w);
- }
-
- public void addI32(Int2 v) {
- addI32(v.x);
- addI32(v.y);
- }
- public void addI32(Int3 v) {
- addI32(v.x);
- addI32(v.y);
- addI32(v.z);
- }
- public void addI32(Int4 v) {
- addI32(v.x);
- addI32(v.y);
- addI32(v.z);
- addI32(v.w);
- }
-
- public void addU32(Long2 v) {
- addU32(v.x);
- addU32(v.y);
- }
- public void addU32(Long3 v) {
- addU32(v.x);
- addU32(v.y);
- addU32(v.z);
- }
- public void addU32(Long4 v) {
- addU32(v.x);
- addU32(v.y);
- addU32(v.z);
- addU32(v.w);
- }
-
- public void addI64(Long2 v) {
- addI64(v.x);
- addI64(v.y);
- }
- public void addI64(Long3 v) {
- addI64(v.x);
- addI64(v.y);
- addI64(v.z);
- }
- public void addI64(Long4 v) {
- addI64(v.x);
- addI64(v.y);
- addI64(v.z);
- addI64(v.w);
- }
-
- public void addU64(Long2 v) {
- addU64(v.x);
- addU64(v.y);
- }
- public void addU64(Long3 v) {
- addU64(v.x);
- addU64(v.y);
- addU64(v.z);
- }
- public void addU64(Long4 v) {
- addU64(v.x);
- addU64(v.y);
- addU64(v.z);
- addU64(v.w);
- }
-
-
- public Float2 subFloat2() {
- Float2 v = new Float2();
- v.y = subF32();
- v.x = subF32();
- return v;
- }
- public Float3 subFloat3() {
- Float3 v = new Float3();
- v.z = subF32();
- v.y = subF32();
- v.x = subF32();
- return v;
- }
- public Float4 subFloat4() {
- Float4 v = new Float4();
- v.w = subF32();
- v.z = subF32();
- v.y = subF32();
- v.x = subF32();
- return v;
- }
-
- public Double2 subDouble2() {
- Double2 v = new Double2();
- v.y = subF64();
- v.x = subF64();
- return v;
- }
- public Double3 subDouble3() {
- Double3 v = new Double3();
- v.z = subF64();
- v.y = subF64();
- v.x = subF64();
- return v;
- }
- public Double4 subDouble4() {
- Double4 v = new Double4();
- v.w = subF64();
- v.z = subF64();
- v.y = subF64();
- v.x = subF64();
- return v;
- }
-
- public Byte2 subByte2() {
- Byte2 v = new Byte2();
- v.y = subI8();
- v.x = subI8();
- return v;
- }
- public Byte3 subByte3() {
- Byte3 v = new Byte3();
- v.z = subI8();
- v.y = subI8();
- v.x = subI8();
- return v;
- }
- public Byte4 subByte4() {
- Byte4 v = new Byte4();
- v.w = subI8();
- v.z = subI8();
- v.y = subI8();
- v.x = subI8();
- return v;
- }
-
- public Short2 subShort2() {
- Short2 v = new Short2();
- v.y = subI16();
- v.x = subI16();
- return v;
- }
- public Short3 subShort3() {
- Short3 v = new Short3();
- v.z = subI16();
- v.y = subI16();
- v.x = subI16();
- return v;
- }
- public Short4 subShort4() {
- Short4 v = new Short4();
- v.w = subI16();
- v.z = subI16();
- v.y = subI16();
- v.x = subI16();
- return v;
- }
-
- public Int2 subInt2() {
- Int2 v = new Int2();
- v.y = subI32();
- v.x = subI32();
- return v;
- }
- public Int3 subInt3() {
- Int3 v = new Int3();
- v.z = subI32();
- v.y = subI32();
- v.x = subI32();
- return v;
- }
- public Int4 subInt4() {
- Int4 v = new Int4();
- v.w = subI32();
- v.z = subI32();
- v.y = subI32();
- v.x = subI32();
- return v;
- }
-
- public Long2 subLong2() {
- Long2 v = new Long2();
- v.y = subI64();
- v.x = subI64();
- return v;
- }
- public Long3 subLong3() {
- Long3 v = new Long3();
- v.z = subI64();
- v.y = subI64();
- v.x = subI64();
- return v;
- }
- public Long4 subLong4() {
- Long4 v = new Long4();
- v.w = subI64();
- v.z = subI64();
- v.y = subI64();
- v.x = subI64();
- return v;
- }
-
-
-
- public void addMatrix(Matrix4f v) {
- for (int i=0; i < v.mMat.length; i++) {
- addF32(v.mMat[i]);
- }
- }
-
- public Matrix4f subMatrix4f() {
- Matrix4f v = new Matrix4f();
- for (int i = v.mMat.length - 1; i >= 0; i--) {
- v.mMat[i] = subF32();
- }
- return v;
- }
-
- public void addMatrix(Matrix3f v) {
- for (int i=0; i < v.mMat.length; i++) {
- addF32(v.mMat[i]);
- }
- }
-
- public Matrix3f subMatrix3f() {
- Matrix3f v = new Matrix3f();
- for (int i = v.mMat.length - 1; i >= 0; i--) {
- v.mMat[i] = subF32();
- }
- return v;
- }
-
- public void addMatrix(Matrix2f v) {
- for (int i=0; i < v.mMat.length; i++) {
- addF32(v.mMat[i]);
- }
- }
-
- public Matrix2f subMatrix2f() {
- Matrix2f v = new Matrix2f();
- for (int i = v.mMat.length - 1; i >= 0; i--) {
- v.mMat[i] = subF32();
- }
- return v;
- }
-
- public void addBoolean(boolean v) {
- addI8((byte)(v ? 1 : 0));
- }
-
- public boolean subBoolean() {
- byte v = subI8();
- if (v == 1) {
- return true;
- }
- return false;
- }
-
- public final byte[] getData() {
- return mData;
- }
-
- /**
- * Get the actual length used for the FieldPacker.
- *
- * @hide
- */
- public int getPos() {
- return mPos;
- }
-
- private static void addToPack(FieldPacker fp, Object obj) {
- if (obj instanceof Boolean) {
- fp.addBoolean(((Boolean)obj).booleanValue());
- return;
- }
-
- if (obj instanceof Byte) {
- fp.addI8(((Byte)obj).byteValue());
- return;
- }
-
- if (obj instanceof Short) {
- fp.addI16(((Short)obj).shortValue());
- return;
- }
-
- if (obj instanceof Integer) {
- fp.addI32(((Integer)obj).intValue());
- return;
- }
-
- if (obj instanceof Long) {
- fp.addI64(((Long)obj).longValue());
- return;
- }
-
- if (obj instanceof Float) {
- fp.addF32(((Float)obj).floatValue());
- return;
- }
-
- if (obj instanceof Double) {
- fp.addF64(((Double)obj).doubleValue());
- return;
- }
-
- if (obj instanceof Byte2) {
- fp.addI8((Byte2)obj);
- return;
- }
-
- if (obj instanceof Byte3) {
- fp.addI8((Byte3)obj);
- return;
- }
-
- if (obj instanceof Byte4) {
- fp.addI8((Byte4)obj);
- return;
- }
-
- if (obj instanceof Short2) {
- fp.addI16((Short2)obj);
- return;
- }
-
- if (obj instanceof Short3) {
- fp.addI16((Short3)obj);
- return;
- }
-
- if (obj instanceof Short4) {
- fp.addI16((Short4)obj);
- return;
- }
-
- if (obj instanceof Int2) {
- fp.addI32((Int2)obj);
- return;
- }
-
- if (obj instanceof Int3) {
- fp.addI32((Int3)obj);
- return;
- }
-
- if (obj instanceof Int4) {
- fp.addI32((Int4)obj);
- return;
- }
-
- if (obj instanceof Long2) {
- fp.addI64((Long2)obj);
- return;
- }
-
- if (obj instanceof Long3) {
- fp.addI64((Long3)obj);
- return;
- }
-
- if (obj instanceof Long4) {
- fp.addI64((Long4)obj);
- return;
- }
-
- if (obj instanceof Float2) {
- fp.addF32((Float2)obj);
- return;
- }
-
- if (obj instanceof Float3) {
- fp.addF32((Float3)obj);
- return;
- }
-
- if (obj instanceof Float4) {
- fp.addF32((Float4)obj);
- return;
- }
-
- if (obj instanceof Double2) {
- fp.addF64((Double2)obj);
- return;
- }
-
- if (obj instanceof Double3) {
- fp.addF64((Double3)obj);
- return;
- }
-
- if (obj instanceof Double4) {
- fp.addF64((Double4)obj);
- return;
- }
-
- if (obj instanceof Matrix2f) {
- fp.addMatrix((Matrix2f)obj);
- return;
- }
-
- if (obj instanceof Matrix3f) {
- fp.addMatrix((Matrix3f)obj);
- return;
- }
-
- if (obj instanceof Matrix4f) {
- fp.addMatrix((Matrix4f)obj);
- return;
- }
-
- if (obj instanceof BaseObj) {
- fp.addObj((BaseObj)obj);
- return;
- }
- }
-
- private static int getPackedSize(Object obj) {
- if (obj instanceof Boolean) {
- return 1;
- }
-
- if (obj instanceof Byte) {
- return 1;
- }
-
- if (obj instanceof Short) {
- return 2;
- }
-
- if (obj instanceof Integer) {
- return 4;
- }
-
- if (obj instanceof Long) {
- return 8;
- }
-
- if (obj instanceof Float) {
- return 4;
- }
-
- if (obj instanceof Double) {
- return 8;
- }
-
- if (obj instanceof Byte2) {
- return 2;
- }
-
- if (obj instanceof Byte3) {
- return 3;
- }
-
- if (obj instanceof Byte4) {
- return 4;
- }
-
- if (obj instanceof Short2) {
- return 4;
- }
-
- if (obj instanceof Short3) {
- return 6;
- }
-
- if (obj instanceof Short4) {
- return 8;
- }
-
- if (obj instanceof Int2) {
- return 8;
- }
-
- if (obj instanceof Int3) {
- return 12;
- }
-
- if (obj instanceof Int4) {
- return 16;
- }
-
- if (obj instanceof Long2) {
- return 16;
- }
-
- if (obj instanceof Long3) {
- return 24;
- }
-
- if (obj instanceof Long4) {
- return 32;
- }
-
- if (obj instanceof Float2) {
- return 8;
- }
-
- if (obj instanceof Float3) {
- return 12;
- }
-
- if (obj instanceof Float4) {
- return 16;
- }
-
- if (obj instanceof Double2) {
- return 16;
- }
-
- if (obj instanceof Double3) {
- return 24;
- }
-
- if (obj instanceof Double4) {
- return 32;
- }
-
- if (obj instanceof Matrix2f) {
- return 16;
- }
-
- if (obj instanceof Matrix3f) {
- return 36;
- }
-
- if (obj instanceof Matrix4f) {
- return 64;
- }
-
- if (obj instanceof BaseObj) {
- if (RenderScript.sPointerSize == 8) {
- return 32;
- } else {
- return 4;
- }
- }
-
- return 0;
- }
-
- static FieldPacker createFieldPack(Object[] args) {
- int len = 0;
- for (Object arg : args) {
- len += getPackedSize(arg);
- }
- FieldPacker fp = new FieldPacker(len);
- for (Object arg : args) {
- addToPack(fp, arg);
- }
- return fp;
- }
-
-
- private boolean resize(int newSize) {
- if (newSize == mLen) {
- return false;
- }
-
- byte[] newData = new byte[newSize];
- System.arraycopy(mData, 0, newData, 0, mPos);
- mData = newData;
- mLen = newSize;
- return true;
- }
-
- private void addSafely(Object obj) {
- boolean retry;
- final int oldPos = mPos;
- do {
- retry = false;
- try {
- addToPack(this, obj);
- } catch (ArrayIndexOutOfBoundsException e) {
- mPos = oldPos;
- resize(mLen * 2);
- retry = true;
- }
- } while (retry);
- }
-
- private byte mData[];
- private int mPos;
- private int mLen;
- private BitSet mAlignment;
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Float2.java b/v8/renderscript/java/src/android/support/v8/renderscript/Float2.java
deleted file mode 100644
index edbc5aa..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Float2.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript float2 type back to the Android system.
- *
- **/
-public class Float2 {
- public Float2() {
- }
-
- public Float2(float initX, float initY) {
- x = initX;
- y = initY;
- }
-
- public float x;
- public float y;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Float3.java b/v8/renderscript/java/src/android/support/v8/renderscript/Float3.java
deleted file mode 100644
index 90162a1..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Float3.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript float2 type back to the Android system.
- *
- **/
-public class Float3 {
- public Float3() {
- }
- public Float3(float initX, float initY, float initZ) {
- x = initX;
- y = initY;
- z = initZ;
- }
-
- public float x;
- public float y;
- public float z;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Float4.java b/v8/renderscript/java/src/android/support/v8/renderscript/Float4.java
deleted file mode 100644
index d0dc568..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Float4.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript float2 type back to the Android system.
- *
- **/
-public class Float4 {
- public Float4() {
- }
-
- public Float4(float initX, float initY, float initZ, float initW) {
- x = initX;
- y = initY;
- z = initZ;
- w = initW;
- }
-
- public float x;
- public float y;
- public float z;
- public float w;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Int2.java b/v8/renderscript/java/src/android/support/v8/renderscript/Int2.java
deleted file mode 100644
index e5d04b8..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Int2.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript int2 type back to the Android system.
- *
- **/
-public class Int2 {
- public Int2() {
- }
-
- public Int2(int initX, int initY) {
- x = initX;
- y = initY;
- }
-
- public int x;
- public int y;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Int3.java b/v8/renderscript/java/src/android/support/v8/renderscript/Int3.java
deleted file mode 100644
index 12f59e8..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Int3.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript int3 type back to the Android system.
- *
- **/
-public class Int3 {
- public Int3() {
- }
-
- public Int3(int initX, int initY, int initZ) {
- x = initX;
- y = initY;
- z = initZ;
- }
-
- public int x;
- public int y;
- public int z;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Int4.java b/v8/renderscript/java/src/android/support/v8/renderscript/Int4.java
deleted file mode 100644
index bb49fb1..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Int4.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript int4 type back to the Android system.
- *
- **/
-public class Int4 {
- public Int4() {
- }
-
- public Int4(int initX, int initY, int initZ, int initW) {
- x = initX;
- y = initY;
- z = initZ;
- w = initW;
- }
-
- public int x;
- public int y;
- public int z;
- public int w;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Long2.java b/v8/renderscript/java/src/android/support/v8/renderscript/Long2.java
deleted file mode 100644
index b3c95f2..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Long2.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript long2 type back to the Android system.
- **/
-public class Long2 {
- public Long2() {
- }
-
- public Long2(long initX, long initY) {
- x = initX;
- y = initY;
- }
-
- public long x;
- public long y;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Long3.java b/v8/renderscript/java/src/android/support/v8/renderscript/Long3.java
deleted file mode 100644
index 6ce0f83..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Long3.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript long3 type back to the Android system.
- **/
-public class Long3 {
- public Long3() {
- }
-
- public Long3(long initX, long initY, long initZ) {
- x = initX;
- y = initY;
- z = initZ;
- }
-
- public long x;
- public long y;
- public long z;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Long4.java b/v8/renderscript/java/src/android/support/v8/renderscript/Long4.java
deleted file mode 100644
index d44a321..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Long4.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript long4 type back to the Android system.
- **/
-public class Long4 {
- public Long4() {
- }
-
- public Long4(long initX, long initY, long initZ, long initW) {
- x = initX;
- y = initY;
- z = initZ;
- w = initW;
- }
-
- public long x;
- public long y;
- public long z;
- public long w;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Matrix2f.java b/v8/renderscript/java/src/android/support/v8/renderscript/Matrix2f.java
deleted file mode 100644
index 9a8b5bf..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Matrix2f.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript rs_matrix2x2 type back to the Android system.
- *
- **/
-public class Matrix2f {
-
- /**
- * Creates a new identity 2x2 matrix
- */
- public Matrix2f() {
- mMat = new float[4];
- loadIdentity();
- }
-
- /**
- * Creates a new matrix and sets its values from the given
- * parameter
- *
- * @param dataArray values to set the matrix to, must be 4
- * floats long
- */
- public Matrix2f(float[] dataArray) {
- mMat = new float[4];
- System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
- }
-
- /**
- * Return a reference to the internal array representing matrix
- * values. Modifying this array will also change the matrix
- *
- * @return internal array representing the matrix
- */
- public float[] getArray() {
- return mMat;
- }
-
- /**
- * Returns the value for a given row and column
- *
- * @param x column of the value to return
- * @param y row of the value to return
- *
- * @return value in the yth row and xth column
- */
- public float get(int x, int y) {
- return mMat[x*2 + y];
- }
-
- /**
- * Sets the value for a given row and column
- *
- * @param x column of the value to set
- * @param y row of the value to set
- */
- public void set(int x, int y, float v) {
- mMat[x*2 + y] = v;
- }
-
- /**
- * Sets the matrix values to identity
- */
- public void loadIdentity() {
- mMat[0] = 1;
- mMat[1] = 0;
-
- mMat[2] = 0;
- mMat[3] = 1;
- }
-
- /**
- * Sets the values of the matrix to those of the parameter
- *
- * @param src matrix to load the values from
- */
- public void load(Matrix2f src) {
- System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
- }
-
- /**
- * Sets current values to be a rotation matrix of given angle
- *
- * @param rot rotation angle
- */
- public void loadRotate(float rot) {
- float c, s;
- rot *= (float)(java.lang.Math.PI / 180.0f);
- c = (float)java.lang.Math.cos(rot);
- s = (float)java.lang.Math.sin(rot);
- mMat[0] = c;
- mMat[1] = -s;
- mMat[2] = s;
- mMat[3] = c;
- }
-
- /**
- * Sets current values to be a scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- */
- public void loadScale(float x, float y) {
- loadIdentity();
- mMat[0] = x;
- mMat[3] = y;
- }
-
- /**
- * Sets current values to be the result of multiplying two given
- * matrices
- *
- * @param lhs left hand side matrix
- * @param rhs right hand side matrix
- */
- public void loadMultiply(Matrix2f lhs, Matrix2f rhs) {
- for (int i=0 ; i<2 ; i++) {
- float ri0 = 0;
- float ri1 = 0;
- for (int j=0 ; j<2 ; j++) {
- float rhs_ij = rhs.get(i,j);
- ri0 += lhs.get(j,0) * rhs_ij;
- ri1 += lhs.get(j,1) * rhs_ij;
- }
- set(i,0, ri0);
- set(i,1, ri1);
- }
- }
-
- /**
- * Post-multiplies the current matrix by a given parameter
- *
- * @param rhs right hand side to multiply by
- */
- public void multiply(Matrix2f rhs) {
- Matrix2f tmp = new Matrix2f();
- tmp.loadMultiply(this, rhs);
- load(tmp);
- }
- /**
- * Modifies the current matrix by post-multiplying it with a
- * rotation matrix of given angle
- *
- * @param rot angle of rotation
- */
- public void rotate(float rot) {
- Matrix2f tmp = new Matrix2f();
- tmp.loadRotate(rot);
- multiply(tmp);
- }
- /**
- * Modifies the current matrix by post-multiplying it with a
- * scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- */
- public void scale(float x, float y) {
- Matrix2f tmp = new Matrix2f();
- tmp.loadScale(x, y);
- multiply(tmp);
- }
- /**
- * Sets the current matrix to its transpose
- */
- public void transpose() {
- float temp = mMat[1];
- mMat[1] = mMat[2];
- mMat[2] = temp;
- }
-
- final float[] mMat;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Matrix3f.java b/v8/renderscript/java/src/android/support/v8/renderscript/Matrix3f.java
deleted file mode 100644
index 4528543..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Matrix3f.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript rs_matrix3x3 type back to the Android system.
- *
- **/
-public class Matrix3f {
-
- /**
- * Creates a new identity 3x3 matrix
- */
- public Matrix3f() {
- mMat = new float[9];
- loadIdentity();
- }
-
- /**
- * Creates a new matrix and sets its values from the given
- * parameter
- *
- * @param dataArray values to set the matrix to, must be 9
- * floats long
- */
- public Matrix3f(float[] dataArray) {
- mMat = new float[9];
- System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
- }
-
- /**
- * Return a reference to the internal array representing matrix
- * values. Modifying this array will also change the matrix
- *
- * @return internal array representing the matrix
- */
- public float[] getArray() {
- return mMat;
- }
-
- /**
- * Returns the value for a given row and column
- *
- * @param x column of the value to return
- * @param y row of the value to return
- *
- * @return value in the yth row and xth column
- */
- public float get(int x, int y) {
- return mMat[x*3 + y];
- }
-
- /**
- * Sets the value for a given row and column
- *
- * @param x column of the value to set
- * @param y row of the value to set
- */
- public void set(int x, int y, float v) {
- mMat[x*3 + y] = v;
- }
-
- /**
- * Sets the matrix values to identity
- */
- public void loadIdentity() {
- mMat[0] = 1;
- mMat[1] = 0;
- mMat[2] = 0;
-
- mMat[3] = 0;
- mMat[4] = 1;
- mMat[5] = 0;
-
- mMat[6] = 0;
- mMat[7] = 0;
- mMat[8] = 1;
- }
-
- /**
- * Sets the values of the matrix to those of the parameter
- *
- * @param src matrix to load the values from
- */
- public void load(Matrix3f src) {
- System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
- }
-
- /**
- * Sets current values to be a rotation matrix of certain angle
- * about a given axis
- *
- * @param rot angle of rotation
- * @param x rotation axis x
- * @param y rotation axis y
- * @param z rotation axis z
- */
- public void loadRotate(float rot, float x, float y, float z) {
- float c, s;
- rot *= (float)(java.lang.Math.PI / 180.0f);
- c = (float)java.lang.Math.cos(rot);
- s = (float)java.lang.Math.sin(rot);
-
- float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z);
- if (!(len != 1)) {
- float recipLen = 1.f / len;
- x *= recipLen;
- y *= recipLen;
- z *= recipLen;
- }
- float nc = 1.0f - c;
- float xy = x * y;
- float yz = y * z;
- float zx = z * x;
- float xs = x * s;
- float ys = y * s;
- float zs = z * s;
- mMat[0] = x*x*nc + c;
- mMat[3] = xy*nc - zs;
- mMat[6] = zx*nc + ys;
- mMat[1] = xy*nc + zs;
- mMat[4] = y*y*nc + c;
- mMat[7] = yz*nc - xs;
- mMat[2] = zx*nc - ys;
- mMat[5] = yz*nc + xs;
- mMat[8] = z*z*nc + c;
- }
-
- /**
- * Makes the upper 2x2 a rotation matrix of the given angle
- *
- * @param rot rotation angle
- */
- public void loadRotate(float rot) {
- loadIdentity();
- float c, s;
- rot *= (float)(java.lang.Math.PI / 180.0f);
- c = (float)java.lang.Math.cos(rot);
- s = (float)java.lang.Math.sin(rot);
- mMat[0] = c;
- mMat[1] = -s;
- mMat[3] = s;
- mMat[4] = c;
- }
-
- /**
- * Makes the upper 2x2 a scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- */
- public void loadScale(float x, float y) {
- loadIdentity();
- mMat[0] = x;
- mMat[4] = y;
- }
-
- /**
- * Sets current values to be a scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- * @param z scale component z
- */
- public void loadScale(float x, float y, float z) {
- loadIdentity();
- mMat[0] = x;
- mMat[4] = y;
- mMat[8] = z;
- }
-
- /**
- * Sets current values to be a translation matrix of given
- * dimensions
- *
- * @param x translation component x
- * @param y translation component y
- */
- public void loadTranslate(float x, float y) {
- loadIdentity();
- mMat[6] = x;
- mMat[7] = y;
- }
-
- /**
- * Sets current values to be the result of multiplying two given
- * matrices
- *
- * @param lhs left hand side matrix
- * @param rhs right hand side matrix
- */
- public void loadMultiply(Matrix3f lhs, Matrix3f rhs) {
- for (int i=0 ; i<3 ; i++) {
- float ri0 = 0;
- float ri1 = 0;
- float ri2 = 0;
- for (int j=0 ; j<3 ; j++) {
- float rhs_ij = rhs.get(i,j);
- ri0 += lhs.get(j,0) * rhs_ij;
- ri1 += lhs.get(j,1) * rhs_ij;
- ri2 += lhs.get(j,2) * rhs_ij;
- }
- set(i,0, ri0);
- set(i,1, ri1);
- set(i,2, ri2);
- }
- }
-
- /**
- * Post-multiplies the current matrix by a given parameter
- *
- * @param rhs right hand side to multiply by
- */
- public void multiply(Matrix3f rhs) {
- Matrix3f tmp = new Matrix3f();
- tmp.loadMultiply(this, rhs);
- load(tmp);
- }
-
- /**
- * Modifies the current matrix by post-multiplying it with a
- * rotation matrix of certain angle about a given axis
- *
- * @param rot angle of rotation
- * @param x rotation axis x
- * @param y rotation axis y
- * @param z rotation axis z
- */
- public void rotate(float rot, float x, float y, float z) {
- Matrix3f tmp = new Matrix3f();
- tmp.loadRotate(rot, x, y, z);
- multiply(tmp);
- }
-
- /**
- * Modifies the upper 2x2 of the current matrix by
- * post-multiplying it with a rotation matrix of given angle
- *
- * @param rot angle of rotation
- */
- public void rotate(float rot) {
- Matrix3f tmp = new Matrix3f();
- tmp.loadRotate(rot);
- multiply(tmp);
- }
-
- /**
- * Modifies the upper 2x2 of the current matrix by
- * post-multiplying it with a scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- */
- public void scale(float x, float y) {
- Matrix3f tmp = new Matrix3f();
- tmp.loadScale(x, y);
- multiply(tmp);
- }
-
- /**
- * Modifies the current matrix by post-multiplying it with a
- * scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- * @param z scale component z
- */
- public void scale(float x, float y, float z) {
- Matrix3f tmp = new Matrix3f();
- tmp.loadScale(x, y, z);
- multiply(tmp);
- }
-
- /**
- * Modifies the current matrix by post-multiplying it with a
- * translation matrix of given dimensions
- *
- * @param x translation component x
- * @param y translation component y
- */
- public void translate(float x, float y) {
- Matrix3f tmp = new Matrix3f();
- tmp.loadTranslate(x, y);
- multiply(tmp);
- }
-
- /**
- * Sets the current matrix to its transpose
- */
- public void transpose() {
- for(int i = 0; i < 2; ++i) {
- for(int j = i + 1; j < 3; ++j) {
- float temp = mMat[i*3 + j];
- mMat[i*3 + j] = mMat[j*3 + i];
- mMat[j*3 + i] = temp;
- }
- }
- }
-
- final float[] mMat;
-}
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Matrix4f.java b/v8/renderscript/java/src/android/support/v8/renderscript/Matrix4f.java
deleted file mode 100644
index b9e5636..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Matrix4f.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript rs_matrix4x4 type back to the Android system.
- *
- **/
-public class Matrix4f {
-
- /**
- * Creates a new identity 4x4 matrix
- */
- public Matrix4f() {
- mMat = new float[16];
- loadIdentity();
- }
-
- /**
- * Creates a new matrix and sets its values from the given
- * parameter
- *
- * @param dataArray values to set the matrix to, must be 16
- * floats long
- */
- public Matrix4f(float[] dataArray) {
- mMat = new float[16];
- System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
- }
-
- /**
- * Return a reference to the internal array representing matrix
- * values. Modifying this array will also change the matrix
- *
- * @return internal array representing the matrix
- */
- public float[] getArray() {
- return mMat;
- }
-
- /**
- * Returns the value for a given row and column
- *
- * @param x column of the value to return
- * @param y row of the value to return
- *
- * @return value in the yth row and xth column
- */
- public float get(int x, int y) {
- return mMat[x*4 + y];
- }
-
- /**
- * Sets the value for a given row and column
- *
- * @param x column of the value to set
- * @param y row of the value to set
- */
- public void set(int x, int y, float v) {
- mMat[x*4 + y] = v;
- }
-
- /**
- * Sets the matrix values to identity
- */
- public void loadIdentity() {
- mMat[0] = 1;
- mMat[1] = 0;
- mMat[2] = 0;
- mMat[3] = 0;
-
- mMat[4] = 0;
- mMat[5] = 1;
- mMat[6] = 0;
- mMat[7] = 0;
-
- mMat[8] = 0;
- mMat[9] = 0;
- mMat[10] = 1;
- mMat[11] = 0;
-
- mMat[12] = 0;
- mMat[13] = 0;
- mMat[14] = 0;
- mMat[15] = 1;
- }
-
- /**
- * Sets the values of the matrix to those of the parameter
- *
- * @param src matrix to load the values from
- */
- public void load(Matrix4f src) {
- System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
- }
-
- /**
- * Sets the values of the matrix to those of the parameter
- *
- * @param src matrix to load the values from
- * @hide
- */
- public void load(Matrix3f src) {
- mMat[0] = src.mMat[0];
- mMat[1] = src.mMat[1];
- mMat[2] = src.mMat[2];
- mMat[3] = 0;
-
- mMat[4] = src.mMat[3];
- mMat[5] = src.mMat[4];
- mMat[6] = src.mMat[5];
- mMat[7] = 0;
-
- mMat[8] = src.mMat[6];
- mMat[9] = src.mMat[7];
- mMat[10] = src.mMat[8];
- mMat[11] = 0;
-
- mMat[12] = 0;
- mMat[13] = 0;
- mMat[14] = 0;
- mMat[15] = 1;
- }
-
- /**
- * Sets current values to be a rotation matrix of certain angle
- * about a given axis
- *
- * @param rot angle of rotation
- * @param x rotation axis x
- * @param y rotation axis y
- * @param z rotation axis z
- */
- public void loadRotate(float rot, float x, float y, float z) {
- float c, s;
- mMat[3] = 0;
- mMat[7] = 0;
- mMat[11]= 0;
- mMat[12]= 0;
- mMat[13]= 0;
- mMat[14]= 0;
- mMat[15]= 1;
- rot *= (float)(java.lang.Math.PI / 180.0f);
- c = (float)java.lang.Math.cos(rot);
- s = (float)java.lang.Math.sin(rot);
-
- float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z);
- if (!(len != 1)) {
- float recipLen = 1.f / len;
- x *= recipLen;
- y *= recipLen;
- z *= recipLen;
- }
- float nc = 1.0f - c;
- float xy = x * y;
- float yz = y * z;
- float zx = z * x;
- float xs = x * s;
- float ys = y * s;
- float zs = z * s;
- mMat[ 0] = x*x*nc + c;
- mMat[ 4] = xy*nc - zs;
- mMat[ 8] = zx*nc + ys;
- mMat[ 1] = xy*nc + zs;
- mMat[ 5] = y*y*nc + c;
- mMat[ 9] = yz*nc - xs;
- mMat[ 2] = zx*nc - ys;
- mMat[ 6] = yz*nc + xs;
- mMat[10] = z*z*nc + c;
- }
-
- /**
- * Sets current values to be a scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- * @param z scale component z
- */
- public void loadScale(float x, float y, float z) {
- loadIdentity();
- mMat[0] = x;
- mMat[5] = y;
- mMat[10] = z;
- }
-
- /**
- * Sets current values to be a translation matrix of given
- * dimensions
- *
- * @param x translation component x
- * @param y translation component y
- * @param z translation component z
- */
- public void loadTranslate(float x, float y, float z) {
- loadIdentity();
- mMat[12] = x;
- mMat[13] = y;
- mMat[14] = z;
- }
-
- /**
- * Sets current values to be the result of multiplying two given
- * matrices
- *
- * @param lhs left hand side matrix
- * @param rhs right hand side matrix
- */
- public void loadMultiply(Matrix4f lhs, Matrix4f rhs) {
- for (int i=0 ; i<4 ; i++) {
- float ri0 = 0;
- float ri1 = 0;
- float ri2 = 0;
- float ri3 = 0;
- for (int j=0 ; j<4 ; j++) {
- float rhs_ij = rhs.get(i,j);
- ri0 += lhs.get(j,0) * rhs_ij;
- ri1 += lhs.get(j,1) * rhs_ij;
- ri2 += lhs.get(j,2) * rhs_ij;
- ri3 += lhs.get(j,3) * rhs_ij;
- }
- set(i,0, ri0);
- set(i,1, ri1);
- set(i,2, ri2);
- set(i,3, ri3);
- }
- }
-
- /**
- * Set current values to be an orthographic projection matrix
- *
- * @param l location of the left vertical clipping plane
- * @param r location of the right vertical clipping plane
- * @param b location of the bottom horizontal clipping plane
- * @param t location of the top horizontal clipping plane
- * @param n location of the near clipping plane
- * @param f location of the far clipping plane
- */
- public void loadOrtho(float l, float r, float b, float t, float n, float f) {
- loadIdentity();
- mMat[0] = 2 / (r - l);
- mMat[5] = 2 / (t - b);
- mMat[10]= -2 / (f - n);
- mMat[12]= -(r + l) / (r - l);
- mMat[13]= -(t + b) / (t - b);
- mMat[14]= -(f + n) / (f - n);
- }
-
- /**
- * Set current values to be an orthographic projection matrix
- * with the right and bottom clipping planes set to the given
- * values. Left and top clipping planes are set to 0. Near and
- * far are set to -1, 1 respectively
- *
- * @param w location of the right vertical clipping plane
- * @param h location of the bottom horizontal clipping plane
- *
- */
- public void loadOrthoWindow(int w, int h) {
- loadOrtho(0,w, h,0, -1,1);
- }
-
- /**
- * Sets current values to be a perspective projection matrix
- *
- * @param l location of the left vertical clipping plane
- * @param r location of the right vertical clipping plane
- * @param b location of the bottom horizontal clipping plane
- * @param t location of the top horizontal clipping plane
- * @param n location of the near clipping plane, must be positive
- * @param f location of the far clipping plane, must be positive
- *
- */
- public void loadFrustum(float l, float r, float b, float t, float n, float f) {
- loadIdentity();
- mMat[0] = 2 * n / (r - l);
- mMat[5] = 2 * n / (t - b);
- mMat[8] = (r + l) / (r - l);
- mMat[9] = (t + b) / (t - b);
- mMat[10]= -(f + n) / (f - n);
- mMat[11]= -1;
- mMat[14]= -2*f*n / (f - n);
- mMat[15]= 0;
- }
-
- /**
- * Sets current values to be a perspective projection matrix
- *
- * @param fovy vertical field of view angle in degrees
- * @param aspect aspect ratio of the screen
- * @param near near cliping plane, must be positive
- * @param far far clipping plane, must be positive
- */
- public void loadPerspective(float fovy, float aspect, float near, float far) {
- float top = near * (float)Math.tan((float) (fovy * Math.PI / 360.0f));
- float bottom = -top;
- float left = bottom * aspect;
- float right = top * aspect;
- loadFrustum(left, right, bottom, top, near, far);
- }
-
- /**
- * Helper function to set the current values to a perspective
- * projection matrix with aspect ratio defined by the parameters
- * and (near, far), (bottom, top) mapping to (-1, 1) at z = 0
- *
- * @param w screen width
- * @param h screen height
- */
- public void loadProjectionNormalized(int w, int h) {
- // range -1,1 in the narrow axis at z = 0.
- Matrix4f m1 = new Matrix4f();
- Matrix4f m2 = new Matrix4f();
-
- if(w > h) {
- float aspect = ((float)w) / h;
- m1.loadFrustum(-aspect,aspect, -1,1, 1,100);
- } else {
- float aspect = ((float)h) / w;
- m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
- }
-
- m2.loadRotate(180, 0, 1, 0);
- m1.loadMultiply(m1, m2);
-
- m2.loadScale(-2, 2, 1);
- m1.loadMultiply(m1, m2);
-
- m2.loadTranslate(0, 0, 2);
- m1.loadMultiply(m1, m2);
-
- load(m1);
- }
-
- /**
- * Post-multiplies the current matrix by a given parameter
- *
- * @param rhs right hand side to multiply by
- */
- public void multiply(Matrix4f rhs) {
- Matrix4f tmp = new Matrix4f();
- tmp.loadMultiply(this, rhs);
- load(tmp);
- }
- /**
- * Modifies the current matrix by post-multiplying it with a
- * rotation matrix of certain angle about a given axis
- *
- * @param rot angle of rotation
- * @param x rotation axis x
- * @param y rotation axis y
- * @param z rotation axis z
- */
- public void rotate(float rot, float x, float y, float z) {
- Matrix4f tmp = new Matrix4f();
- tmp.loadRotate(rot, x, y, z);
- multiply(tmp);
- }
-
- /**
- * Modifies the current matrix by post-multiplying it with a
- * scale matrix of given dimensions
- *
- * @param x scale component x
- * @param y scale component y
- * @param z scale component z
- */
- public void scale(float x, float y, float z) {
- Matrix4f tmp = new Matrix4f();
- tmp.loadScale(x, y, z);
- multiply(tmp);
- }
-
- /**
- * Modifies the current matrix by post-multiplying it with a
- * translation matrix of given dimensions
- *
- * @param x translation component x
- * @param y translation component y
- * @param z translation component z
- */
- public void translate(float x, float y, float z) {
- Matrix4f tmp = new Matrix4f();
- tmp.loadTranslate(x, y, z);
- multiply(tmp);
- }
- private float computeCofactor(int i, int j) {
- int c0 = (i+1) % 4;
- int c1 = (i+2) % 4;
- int c2 = (i+3) % 4;
- int r0 = (j+1) % 4;
- int r1 = (j+2) % 4;
- int r2 = (j+3) % 4;
-
- float minor = (mMat[c0 + 4*r0] * (mMat[c1 + 4*r1] * mMat[c2 + 4*r2] -
- mMat[c1 + 4*r2] * mMat[c2 + 4*r1]))
- - (mMat[c0 + 4*r1] * (mMat[c1 + 4*r0] * mMat[c2 + 4*r2] -
- mMat[c1 + 4*r2] * mMat[c2 + 4*r0]))
- + (mMat[c0 + 4*r2] * (mMat[c1 + 4*r0] * mMat[c2 + 4*r1] -
- mMat[c1 + 4*r1] * mMat[c2 + 4*r0]));
-
- float cofactor = ((i+j) & 1) != 0 ? -minor : minor;
- return cofactor;
- }
-
- /**
- * Sets the current matrix to its inverse
- */
- public boolean inverse() {
-
- Matrix4f result = new Matrix4f();
-
- for (int i = 0; i < 4; ++i) {
- for (int j = 0; j < 4; ++j) {
- result.mMat[4*i + j] = computeCofactor(i, j);
- }
- }
-
- // Dot product of 0th column of source and 0th row of result
- float det = mMat[0]*result.mMat[0] + mMat[4]*result.mMat[1] +
- mMat[8]*result.mMat[2] + mMat[12]*result.mMat[3];
-
- if (Math.abs(det) < 1e-6) {
- return false;
- }
-
- det = 1.0f / det;
- for (int i = 0; i < 16; ++i) {
- mMat[i] = result.mMat[i] * det;
- }
-
- return true;
- }
-
- /**
- * Sets the current matrix to its inverse transpose
- */
- public boolean inverseTranspose() {
-
- Matrix4f result = new Matrix4f();
-
- for (int i = 0; i < 4; ++i) {
- for (int j = 0; j < 4; ++j) {
- result.mMat[4*j + i] = computeCofactor(i, j);
- }
- }
-
- float det = mMat[0]*result.mMat[0] + mMat[4]*result.mMat[4] +
- mMat[8]*result.mMat[8] + mMat[12]*result.mMat[12];
-
- if (Math.abs(det) < 1e-6) {
- return false;
- }
-
- det = 1.0f / det;
- for (int i = 0; i < 16; ++i) {
- mMat[i] = result.mMat[i] * det;
- }
-
- return true;
- }
-
- /**
- * Sets the current matrix to its transpose
- */
- public void transpose() {
- for(int i = 0; i < 3; ++i) {
- for(int j = i + 1; j < 4; ++j) {
- float temp = mMat[i*4 + j];
- mMat[i*4 + j] = mMat[j*4 + i];
- mMat[j*4 + i] = temp;
- }
- }
- }
-
- final float[] mMat;
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/RSDriverException.java b/v8/renderscript/java/src/android/support/v8/renderscript/RSDriverException.java
deleted file mode 100644
index d4ae341..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/RSDriverException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package android.support.v8.renderscript;
-
-
-/**
- * Base class for all exceptions thrown by the Android
- * RenderScript
- */
-public class RSDriverException extends RSRuntimeException {
- public RSDriverException(String string) {
- super(string);
- }
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/RSIllegalArgumentException.java b/v8/renderscript/java/src/android/support/v8/renderscript/RSIllegalArgumentException.java
deleted file mode 100644
index 378a49c..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/RSIllegalArgumentException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package android.support.v8.renderscript;
-
-
-/**
- * Base class for all exceptions thrown by the Android
- * RenderScript
- */
-public class RSIllegalArgumentException extends RSRuntimeException {
- public RSIllegalArgumentException(String string) {
- super(string);
- }
-}
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/RSInvalidStateException.java b/v8/renderscript/java/src/android/support/v8/renderscript/RSInvalidStateException.java
deleted file mode 100644
index a5676a3..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/RSInvalidStateException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package android.support.v8.renderscript;
-
-
-/**
- * Base class for all exceptions thrown by the Android
- * RenderScript
- */
-public class RSInvalidStateException extends RSRuntimeException {
- public RSInvalidStateException(String string) {
- super(string);
- }
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/RSRuntimeException.java b/v8/renderscript/java/src/android/support/v8/renderscript/RSRuntimeException.java
deleted file mode 100644
index ec83365..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/RSRuntimeException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package android.support.v8.renderscript;
-
-
-/**
- * Base class for all exceptions thrown by the Android
- * RenderScript
- */
-public class RSRuntimeException
- extends java.lang.RuntimeException {
- public RSRuntimeException(String string) {
- super(string);
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java b/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java
deleted file mode 100644
index a5c6f93..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java
+++ /dev/null
@@ -1,1721 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.io.File;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.ArrayList;
-import java.nio.ByteBuffer;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Process;
-import android.util.Log;
-import android.view.Surface;
-
-/**
- * This class provides access to a RenderScript context, which controls RenderScript
- * initialization, resource management, and teardown. An instance of the RenderScript
- * class must be created before any other RS objects can be created.
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about creating an application that uses RenderScript, read the
- * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
- * </div>
- **/
-public class RenderScript {
- static final String LOG_TAG = "RenderScript_jni";
- static final boolean DEBUG = false;
- @SuppressWarnings({"UnusedDeclaration", "deprecation"})
- static final boolean LOG_ENABLED = false;
- static final int SUPPORT_LIB_API = 23;
- static final int SUPPORT_LIB_VERSION = 2301;
-
- static private ArrayList<RenderScript> mProcessContextList = new ArrayList<RenderScript>();
- private boolean mIsProcessContext = false;
- private boolean mEnableMultiInput = false;
- private int mDispatchAPILevel = 0;
-
- private int mContextFlags = 0;
- private int mContextSdkVersion = 0;
-
- private Context mApplicationContext;
- private String mNativeLibDir;
-
- static private String mBlackList = "";
- /**
- * Sets the blackList of Models to only use support lib runtime.
- * Should be used before context create.
- *
- * @param blackList User provided black list string.
- *
- * Format: "(MANUFACTURER1:PRODUCT1:MODEL1), (MANUFACTURER2:PRODUCT2:MODEL2)..."
- * e.g. : To Blacklist Nexus 7(2013) and Nexus 5.
- * mBlackList = "(asus:razor:Nexus 7), (LGE:hammerhead:Nexus 5)";
- */
- static public void setBlackList(String blackList) {
- if (blackList != null) {
- mBlackList = blackList;
- }
- }
- /**
- * Force using support lib runtime.
- * Should be used before context create.
- *
- */
- static public void forceCompat() {
- sNative = 0;
- }
- /*
- * We use a class initializer to allow the native code to cache some
- * field offsets.
- */
- @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
- static boolean sInitialized;
- static boolean sUseGCHooks;
- static Object sRuntime;
- static Method registerNativeAllocation;
- static Method registerNativeFree;
-
- static Object lock = new Object();
-
- // Non-threadsafe functions.
- native boolean nLoadSO(boolean useNative, int deviceApi, String libPath);
- native boolean nLoadIOSO();
- native long nDeviceCreate();
- native void nDeviceDestroy(long dev);
- native void nDeviceSetConfig(long dev, int param, int value);
- native int nContextGetUserMessage(long con, int[] data);
- native String nContextGetErrorMessage(long con);
- native int nContextPeekMessage(long con, int[] subID);
- native void nContextInitToClient(long con);
- native void nContextDeinitToClient(long con);
-
- static private int sNative = -1;
- static private int sSdkVersion = -1;
- static private boolean useIOlib = false;
- static private boolean useNative;
-
- /*
- * Context creation flag that specifies a normal context.
- * RenderScript Support lib only support normal context.
- */
- public static final int CREATE_FLAG_NONE = 0x0000;
-
- int getDispatchAPILevel() {
- return mDispatchAPILevel;
- }
-
- boolean isUseNative() {
- return useNative;
- }
- /*
- * Detect the bitness of the VM to allow FieldPacker to do the right thing.
- */
- static native int rsnSystemGetPointerSize();
- static int sPointerSize;
-
- /**
- * Determines whether or not we should be thunking into the native
- * RenderScript layer or actually using the compatibility library.
- */
- static private boolean setupNative(int sdkVersion, Context ctx) {
- // if targetSdkVersion is higher than the device api version, always use compat mode.
- // Workaround for KK
- if (android.os.Build.VERSION.SDK_INT < sdkVersion &&
- android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
- sNative = 0;
- }
-
- if (sNative == -1) {
-
- // get the value of the debug.rs.forcecompat property
- int forcecompat = 0;
- try {
- Class<?> sysprop = Class.forName("android.os.SystemProperties");
- Class[] signature = {String.class, Integer.TYPE};
- Method getint = sysprop.getDeclaredMethod("getInt", signature);
- Object[] args = {"debug.rs.forcecompat", new Integer(0)};
- forcecompat = ((java.lang.Integer)getint.invoke(null, args)).intValue();
- } catch (Exception e) {
-
- }
-
- if ((android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
- && forcecompat == 0) {
- sNative = 1;
- } else {
- sNative = 0;
- }
-
-
- if (sNative == 1) {
- // Workarounds that may disable thunking go here
- ApplicationInfo info;
- try {
- info = ctx.getPackageManager().getApplicationInfo(ctx.getPackageName(),
- PackageManager.GET_META_DATA);
- } catch (PackageManager.NameNotFoundException e) {
- // assume no workarounds needed
- return true;
- }
- long minorVersion = 0;
-
- // load minorID from reflection
- try {
- Class<?> javaRS = Class.forName("android.renderscript.RenderScript");
- Method getMinorID = javaRS.getDeclaredMethod("getMinorID");
- minorVersion = ((java.lang.Long)getMinorID.invoke(null)).longValue();
- } catch (Exception e) {
- // minor version remains 0 on devices with no possible WARs
- }
-
- if (info.metaData != null) {
- // asynchronous teardown: minor version 1+
- if (info.metaData.getBoolean("com.android.support.v8.renderscript.EnableAsyncTeardown") == true) {
- if (minorVersion == 0) {
- sNative = 0;
- }
- }
-
- // blur issues on some drivers with 4.4
- if (info.metaData.getBoolean("com.android.support.v8.renderscript.EnableBlurWorkaround") == true) {
- if (android.os.Build.VERSION.SDK_INT <= 19) {
- //android.util.Log.e("rs", "war on");
- sNative = 0;
- }
- }
- }
- // end of workarounds
- }
- }
-
- if (sNative == 1) {
- // check against the blacklist
- if (mBlackList.length() > 0) {
- String deviceInfo = '(' +
- android.os.Build.MANUFACTURER +
- ':' +
- android.os.Build.PRODUCT +
- ':' +
- android.os.Build.MODEL +
- ')';
- if (mBlackList.contains(deviceInfo)) {
- sNative = 0;
- return false;
- }
- }
- return true;
- }
- return false;
- }
-
- /**
- * Name of the file that holds the object cache.
- */
- private static final String CACHE_PATH = "com.android.renderscript.cache";
- static String mCachePath;
-
- /**
- * Sets the directory to use as a persistent storage for the
- * renderscript object file cache.
- *
- * @hide
- * @param cacheDir A directory the current process can write to
- */
- public static void setupDiskCache(File cacheDir) {
- File f = new File(cacheDir, CACHE_PATH);
- mCachePath = f.getAbsolutePath();
- f.mkdirs();
- }
-
- /**
- * ContextType specifies the specific type of context to be created.
- *
- */
- public enum ContextType {
- /**
- * NORMAL context, this is the default and what shipping apps should
- * use.
- */
- NORMAL (0),
-
- /**
- * DEBUG context, perform extra runtime checks to validate the
- * kernels and APIs are being used as intended. Get and SetElementAt
- * will be bounds checked in this mode.
- */
- DEBUG (1),
-
- /**
- * PROFILE context, Intended to be used once the first time an
- * application is run on a new device. This mode allows the runtime to
- * do additional testing and performance tuning.
- */
- PROFILE (2);
-
- int mID;
- ContextType(int id) {
- mID = id;
- }
- }
-
- ContextType mContextType;
- // Methods below are wrapped to protect the non-threadsafe
- // lockless fifo.
-
- native long rsnContextCreate(long dev, int ver, int sdkVer, int contextType, String nativeLibDir);
- synchronized long nContextCreate(long dev, int ver, int sdkVer, int contextType, String nativeLibDir) {
- return rsnContextCreate(dev, ver, sdkVer, contextType, nativeLibDir);
- }
- native void rsnContextDestroy(long con);
- synchronized void nContextDestroy() {
- validate();
-
- // take teardown lock
- // teardown lock can only be taken when no objects are being destroyed
- ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
- wlock.lock();
-
- long curCon = mContext;
- // context is considered dead as of this point
- mContext = 0;
-
- wlock.unlock();
- rsnContextDestroy(curCon);
- }
- native void rsnContextSetPriority(long con, int p);
- synchronized void nContextSetPriority(int p) {
- validate();
- rsnContextSetPriority(mContext, p);
- }
- native void rsnContextDump(long con, int bits);
- synchronized void nContextDump(int bits) {
- validate();
- rsnContextDump(mContext, bits);
- }
- native void rsnContextFinish(long con);
- synchronized void nContextFinish() {
- validate();
- rsnContextFinish(mContext);
- }
-
- native void rsnContextSendMessage(long con, int id, int[] data);
- synchronized void nContextSendMessage(int id, int[] data) {
- validate();
- rsnContextSendMessage(mContext, id, data);
- }
-
- // nObjDestroy is explicitly _not_ synchronous to prevent crashes in finalizers
- native void rsnObjDestroy(long con, long id);
- void nObjDestroy(long id) {
- // There is a race condition here. The calling code may be run
- // by the gc while teardown is occuring. This protects againts
- // deleting dead objects.
- if (mContext != 0) {
- rsnObjDestroy(mContext, id);
- }
- }
-
- native long rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize);
- synchronized long nElementCreate(long type, int kind, boolean norm, int vecSize) {
- validate();
- return rsnElementCreate(mContext, type, kind, norm, vecSize);
- }
- native long rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes);
- synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) {
- validate();
- return rsnElementCreate2(mContext, elements, names, arraySizes);
- }
- native void rsnElementGetNativeData(long con, long id, int[] elementData);
- synchronized void nElementGetNativeData(long id, int[] elementData) {
- validate();
- rsnElementGetNativeData(mContext, id, elementData);
- }
- native void rsnElementGetSubElements(long con, long id,
- long[] IDs, String[] names, int[] arraySizes);
- synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) {
- validate();
- rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
- }
-
- native long rsnTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
- synchronized long nTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
- validate();
- return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
- }
-
- native void rsnTypeGetNativeData(long con, long id, long[] typeData);
- synchronized void nTypeGetNativeData(long id, long[] typeData) {
- validate();
- rsnTypeGetNativeData(mContext, id, typeData);
- }
-
- native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer);
- synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) {
- validate();
- return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
- }
- native long rsnAllocationCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
- synchronized long nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
- validate();
- return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
- }
-
- native long rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, Bitmap bmp, int usage);
- synchronized long nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp, int usage) {
- validate();
- return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
- }
-
-
- native long rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
- synchronized long nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
- validate();
- return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
- }
- native long rsnAllocationCreateBitmapRef(long con, long type, Bitmap bmp);
- synchronized long nAllocationCreateBitmapRef(long type, Bitmap bmp) {
- validate();
- return rsnAllocationCreateBitmapRef(mContext, type, bmp);
- }
- native long rsnAllocationCreateFromAssetStream(long con, int mips, int assetStream, int usage);
- synchronized long nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
- validate();
- return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
- }
-
- native void rsnAllocationCopyToBitmap(long con, long alloc, Bitmap bmp);
- synchronized void nAllocationCopyToBitmap(long alloc, Bitmap bmp) {
- validate();
- rsnAllocationCopyToBitmap(mContext, alloc, bmp);
- }
-
-
- native void rsnAllocationSyncAll(long con, long alloc, int src);
- synchronized void nAllocationSyncAll(long alloc, int src) {
- validate();
- rsnAllocationSyncAll(mContext, alloc, src);
- }
-
- native void rsnAllocationSetSurface(long con, long alloc, Surface sur);
- synchronized void nAllocationSetSurface(long alloc, Surface sur) {
- validate();
- rsnAllocationSetSurface(mContext, alloc, sur);
- }
-
- native void rsnAllocationIoSend(long con, long alloc);
- synchronized void nAllocationIoSend(long alloc) {
- validate();
- rsnAllocationIoSend(mContext, alloc);
- }
- native void rsnAllocationIoReceive(long con, long alloc);
- synchronized void nAllocationIoReceive(long alloc) {
- validate();
- rsnAllocationIoReceive(mContext, alloc);
- }
- native ByteBuffer rsnAllocationGetByteBuffer(long con, long alloc, int xBytesSize, int dimY, int dimZ);
- synchronized ByteBuffer nAllocationGetByteBuffer(long alloc, int xBytesSize, int dimY, int dimZ) {
- validate();
- return rsnAllocationGetByteBuffer(mContext, alloc, xBytesSize, dimY, dimZ);
- }
- native long rsnAllocationGetStride(long con, long alloc);
- synchronized long nAllocationGetStride(long alloc) {
- validate();
- return rsnAllocationGetStride(mContext, alloc);
- }
-
- native void rsnAllocationGenerateMipmaps(long con, long alloc);
- synchronized void nAllocationGenerateMipmaps(long alloc) {
- validate();
- rsnAllocationGenerateMipmaps(mContext, alloc);
- }
- native void rsnAllocationCopyFromBitmap(long con, long alloc, Bitmap bmp);
- synchronized void nAllocationCopyFromBitmap(long alloc, Bitmap bmp) {
- validate();
- rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
- }
-
-
- native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt,
- int mSize, boolean usePadding);
- synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt,
- int mSize, boolean usePadding) {
- validate();
- rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
- }
-
- native void rsnAllocationElementData1D(long con,long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
- synchronized void nAllocationElementData1D(long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
- validate();
- rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
- }
- /*
- native void rsnAllocationElementData(long con,long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes);
- synchronized void nAllocationElementData(long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes) {
- validate();
- rsnAllocationElementData(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
- }
- */
-
- native void rsnAllocationData2D(long con,
- long dstAlloc, int dstXoff, int dstYoff,
- int dstMip, int dstFace,
- int width, int height,
- long srcAlloc, int srcXoff, int srcYoff,
- int srcMip, int srcFace);
- synchronized void nAllocationData2D(long dstAlloc, int dstXoff, int dstYoff,
- int dstMip, int dstFace,
- int width, int height,
- long srcAlloc, int srcXoff, int srcYoff,
- int srcMip, int srcFace) {
- validate();
- rsnAllocationData2D(mContext,
- dstAlloc, dstXoff, dstYoff,
- dstMip, dstFace,
- width, height,
- srcAlloc, srcXoff, srcYoff,
- srcMip, srcFace);
- }
-
- native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face,
- int w, int h, Object d, int sizeBytes, int dt,
- int mSize, boolean usePadding);
- synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face,
- int w, int h, Object d, int sizeBytes, Element.DataType dt,
- int mSize, boolean usePadding) {
- validate();
- rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
- }
-
- native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b);
- synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, Bitmap b) {
- validate();
- rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
- }
-
- native void rsnAllocationData3D(long con,
- long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
- int dstMip,
- int width, int height, int depth,
- long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
- int srcMip);
- synchronized void nAllocationData3D(long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
- int dstMip,
- int width, int height, int depth,
- long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
- int srcMip) {
- validate();
- rsnAllocationData3D(mContext,
- dstAlloc, dstXoff, dstYoff, dstZoff,
- dstMip, width, height, depth,
- srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
- }
-
-
- native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip,
- int w, int h, int depth, Object d, int sizeBytes, int dt,
- int mSize, boolean usePadding);
- synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip,
- int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
- int mSize, boolean usePadding) {
- validate();
- rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes,
- dt.mID, mSize, usePadding);
- }
-
- native void rsnAllocationRead(long con, long id, Object d, int dt, int mSize, boolean usePadding);
- synchronized void nAllocationRead(long id, Object d, Element.DataType dt, int mSize, boolean usePadding) {
- validate();
- rsnAllocationRead(mContext, id, d, dt.mID, mSize, usePadding);
- }
-
- native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d,
- int sizeBytes, int dt, int mSize, boolean usePadding);
- synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d,
- int sizeBytes, Element.DataType dt, int mSize, boolean usePadding) {
- validate();
- rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
- }
-
- /*
- native void rsnAllocationElementRead(long con,long id, int xoff, int yoff, int zoff,
- int mip, int compIdx, byte[] d, int sizeBytes);
- synchronized void nAllocationElementRead(long id, int xoff, int yoff, int zoff,
- int mip, int compIdx, byte[] d, int sizeBytes) {
- validate();
- rsnAllocationElementRead(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
- }
- */
-
- native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face,
- int w, int h, Object d, int sizeBytes, int dt,
- int mSize, boolean usePadding);
- synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face,
- int w, int h, Object d, int sizeBytes, Element.DataType dt,
- int mSize, boolean usePadding) {
- validate();
- rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
- }
-
- /*
- native void rsnAllocationRead3D(long con, long id, int xoff, int yoff, int zoff, int mip,
- int w, int h, int depth, Object d, int sizeBytes, int dt,
- int mSize, boolean usePadding);
- synchronized void nAllocationRead3D(long id, int xoff, int yoff, int zoff, int mip,
- int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
- int mSize, boolean usePadding) {
- validate();
- rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID, mSize, usePadding);
- }
- */
-
- native long rsnAllocationGetType(long con, long id);
- synchronized long nAllocationGetType(long id) {
- validate();
- return rsnAllocationGetType(mContext, id);
- }
-
- native void rsnAllocationResize1D(long con, long id, int dimX);
- synchronized void nAllocationResize1D(long id, int dimX) {
- validate();
- rsnAllocationResize1D(mContext, id, dimX);
- }
- native void rsnAllocationResize2D(long con, long id, int dimX, int dimY);
- synchronized void nAllocationResize2D(long id, int dimX, int dimY) {
- validate();
- rsnAllocationResize2D(mContext, id, dimX, dimY);
- }
-
- native void rsnScriptBindAllocation(long con, long script, long alloc, int slot, boolean mUseInc);
- synchronized void nScriptBindAllocation(long script, long alloc, int slot, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptBindAllocation(curCon, script, alloc, slot, mUseInc);
- }
- native void rsnScriptSetTimeZone(long con, long script, byte[] timeZone, boolean mUseInc);
- synchronized void nScriptSetTimeZone(long script, byte[] timeZone, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetTimeZone(curCon, script, timeZone, mUseInc);
- }
- native void rsnScriptInvoke(long con, long id, int slot, boolean mUseInc);
- synchronized void nScriptInvoke(long id, int slot, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptInvoke(curCon, id, slot, mUseInc);
- }
- native void rsnScriptForEach(long con, long incCon, long id, int slot, long ain, long aout, byte[] params, boolean mUseInc);
- native void rsnScriptForEach(long con, long incCon, long id, int slot, long ain, long aout, boolean mUseInc);
- native void rsnScriptForEachClipped(long con, long incCon, long id, int slot, long ain, long aout, byte[] params,
- int xstart, int xend, int ystart, int yend, int zstart, int zend, boolean mUseInc);
- native void rsnScriptForEachClipped(long con, long incCon, long id, int slot, long ain, long aout,
- int xstart, int xend, int ystart, int yend, int zstart, int zend, boolean mUseInc);
- synchronized void nScriptForEach(long id, int slot, long ain, long aout, byte[] params, boolean mUseInc) {
- validate();
- if (params == null) {
- rsnScriptForEach(mContext, mIncCon, id, slot, ain, aout, mUseInc);
- } else {
- rsnScriptForEach(mContext, mIncCon, id, slot, ain, aout, params, mUseInc);
- }
- }
-
- synchronized void nScriptForEachClipped(long id, int slot, long ain, long aout, byte[] params,
- int xstart, int xend, int ystart, int yend, int zstart, int zend, boolean mUseInc) {
- validate();
- if (params == null) {
- rsnScriptForEachClipped(mContext, mIncCon, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend, mUseInc);
- } else {
- rsnScriptForEachClipped(mContext, mIncCon, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend, mUseInc);
- }
- }
-
- native void rsnScriptForEach(long con, long id, int slot, long[] ains,
- long aout, byte[] params, int[] limits);
-
- synchronized void nScriptForEach(long id, int slot, long[] ains, long aout,
- byte[] params, int[] limits) {
- if (!mEnableMultiInput) {
- Log.e(LOG_TAG, "Multi-input kernels are not supported, please change targetSdkVersion to >= 23");
- throw new RSRuntimeException("Multi-input kernels are not supported before API 23)");
- }
- validate();
- rsnScriptForEach(mContext, id, slot, ains, aout, params, limits);
- }
-
- native void rsnScriptReduce(long con, long id, int slot, long[] ains,
- long aout, int[] limits);
- synchronized void nScriptReduce(long id, int slot, long ains[], long aout,
- int[] limits) {
- validate();
- rsnScriptReduce(mContext, id, slot, ains, aout, limits);
- }
-
- native void rsnScriptInvokeV(long con, long id, int slot, byte[] params, boolean mUseInc);
- synchronized void nScriptInvokeV(long id, int slot, byte[] params, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptInvokeV(curCon, id, slot, params, mUseInc);
- }
- native void rsnScriptSetVarI(long con, long id, int slot, int val, boolean mUseInc);
- synchronized void nScriptSetVarI(long id, int slot, int val, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarI(curCon, id, slot, val, mUseInc);
- }
- native void rsnScriptSetVarJ(long con, long id, int slot, long val, boolean mUseInc);
- synchronized void nScriptSetVarJ(long id, int slot, long val, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarJ(curCon, id, slot, val, mUseInc);
- }
- native void rsnScriptSetVarF(long con, long id, int slot, float val, boolean mUseInc);
- synchronized void nScriptSetVarF(long id, int slot, float val, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarF(curCon, id, slot, val, mUseInc);
- }
- native void rsnScriptSetVarD(long con, long id, int slot, double val, boolean mUseInc);
- synchronized void nScriptSetVarD(long id, int slot, double val, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarD(curCon, id, slot, val, mUseInc);
- }
- native void rsnScriptSetVarV(long con, long id, int slot, byte[] val, boolean mUseInc);
- synchronized void nScriptSetVarV(long id, int slot, byte[] val, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarV(curCon, id, slot, val, mUseInc);
- }
- native void rsnScriptSetVarVE(long con, long id, int slot, byte[] val,
- long e, int[] dims, boolean mUseInc);
- synchronized void nScriptSetVarVE(long id, int slot, byte[] val,
- long e, int[] dims, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarVE(curCon, id, slot, val, e, dims, mUseInc);
- }
- native void rsnScriptSetVarObj(long con, long id, int slot, long val, boolean mUseInc);
- synchronized void nScriptSetVarObj(long id, int slot, long val, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- rsnScriptSetVarObj(curCon, id, slot, val, mUseInc);
- }
-
- native long rsnScriptCCreate(long con, String resName, String cacheDir,
- byte[] script, int length);
- synchronized long nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
- validate();
- return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
- }
-
- native long rsnScriptIntrinsicCreate(long con, int id, long eid, boolean mUseInc);
- synchronized long nScriptIntrinsicCreate(int id, long eid, boolean mUseInc) {
- validate();
- if (mUseInc) {
- if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
- Log.e(LOG_TAG, "Incremental Intrinsics are not supported, please change targetSdkVersion to >= 21");
- throw new RSRuntimeException("Incremental Intrinsics are not supported before Lollipop (API 21)");
- }
-
- if (!mIncLoaded) {
- try {
- System.loadLibrary("RSSupport");
- } catch (UnsatisfiedLinkError e) {
- Log.e(LOG_TAG, "Error loading RS Compat library for Incremental Intrinsic Support: " + e);
- throw new RSRuntimeException("Error loading RS Compat library for Incremental Intrinsic Support: " + e);
- }
- if (!nIncLoadSO(SUPPORT_LIB_API, mNativeLibDir + "/libRSSupport.so")) {
- throw new RSRuntimeException("Error loading libRSSupport library for Incremental Intrinsic Support");
- }
- mIncLoaded = true;
- }
- if (mIncCon == 0) {
- //Create a dummy compat context (synchronous).
- long device = nIncDeviceCreate();
- mIncCon = nIncContextCreate(device, 0, 0, 0);
- }
- return rsnScriptIntrinsicCreate(mIncCon, id, eid, mUseInc);
- } else {
- return rsnScriptIntrinsicCreate(mContext, id, eid, mUseInc);
- }
- }
-
- native long rsnScriptKernelIDCreate(long con, long sid, int slot, int sig, boolean mUseInc);
- synchronized long nScriptKernelIDCreate(long sid, int slot, int sig, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- return rsnScriptKernelIDCreate(curCon, sid, slot, sig, mUseInc);
- }
-
- native long rsnScriptInvokeIDCreate(long con, long sid, int slot);
- synchronized long nScriptInvokeIDCreate(long sid, int slot) {
- validate();
- return rsnScriptInvokeIDCreate(mContext, sid, slot);
- }
-
- native long rsnScriptFieldIDCreate(long con, long sid, int slot, boolean mUseInc);
- synchronized long nScriptFieldIDCreate(long sid, int slot, boolean mUseInc) {
- validate();
- long curCon = mContext;
- if (mUseInc) {
- curCon = mIncCon;
- }
- return rsnScriptFieldIDCreate(curCon, sid, slot, mUseInc);
- }
-
- native long rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types);
- synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) {
- validate();
- return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
- }
-
- native void rsnScriptGroupSetInput(long con, long group, long kernel, long alloc);
- synchronized void nScriptGroupSetInput(long group, long kernel, long alloc) {
- validate();
- rsnScriptGroupSetInput(mContext, group, kernel, alloc);
- }
-
- native void rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc);
- synchronized void nScriptGroupSetOutput(long group, long kernel, long alloc) {
- validate();
- rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
- }
-
- native void rsnScriptGroupExecute(long con, long group);
- synchronized void nScriptGroupExecute(long group) {
- validate();
- rsnScriptGroupExecute(mContext, group);
- }
-
- native long rsnSamplerCreate(long con, int magFilter, int minFilter,
- int wrapS, int wrapT, int wrapR, float aniso);
- synchronized long nSamplerCreate(int magFilter, int minFilter,
- int wrapS, int wrapT, int wrapR, float aniso) {
- validate();
- return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
- }
-
-// entry points for ScriptGroup2
- native long rsnClosureCreate(long con, long kernelID, long returnValue,
- long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
- long[] depFieldIDs);
- synchronized long nClosureCreate(long kernelID, long returnValue,
- long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
- long[] depFieldIDs) {
- validate();
- long c = rsnClosureCreate(mContext, kernelID, returnValue, fieldIDs, values,
- sizes, depClosures, depFieldIDs);
- if (c == 0) {
- throw new RSRuntimeException("Failed creating closure.");
- }
- return c;
- }
-
- native long rsnInvokeClosureCreate(long con, long invokeID, byte[] params,
- long[] fieldIDs, long[] values, int[] sizes);
- synchronized long nInvokeClosureCreate(long invokeID, byte[] params,
- long[] fieldIDs, long[] values, int[] sizes) {
- validate();
- long c = rsnInvokeClosureCreate(mContext, invokeID, params, fieldIDs,
- values, sizes);
- if (c == 0) {
- throw new RSRuntimeException("Failed creating closure.");
- }
- return c;
- }
-
- native void rsnClosureSetArg(long con, long closureID, int index,
- long value, int size);
- synchronized void nClosureSetArg(long closureID, int index, long value,
- int size) {
- validate();
- rsnClosureSetArg(mContext, closureID, index, value, size);
- }
-
- native void rsnClosureSetGlobal(long con, long closureID, long fieldID,
- long value, int size);
- // Does this have to be synchronized?
- synchronized void nClosureSetGlobal(long closureID, long fieldID,
- long value, int size) {
- validate(); // TODO: is this necessary?
- rsnClosureSetGlobal(mContext, closureID, fieldID, value, size);
- }
-
- native long rsnScriptGroup2Create(long con, String name, String cachePath,
- long[] closures);
- synchronized long nScriptGroup2Create(String name, String cachePath,
- long[] closures) {
- validate();
- return rsnScriptGroup2Create(mContext, name, cachePath, closures);
- }
-
- native void rsnScriptGroup2Execute(long con, long groupID);
- synchronized void nScriptGroup2Execute(long groupID) {
- validate();
- rsnScriptGroup2Execute(mContext, groupID);
- }
-
- native void rsnScriptIntrinsicBLAS_Single(long con, long incCon, long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- float alpha, long A, long B, float beta, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc);
- synchronized void nScriptIntrinsicBLAS_Single(long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- float alpha, long A, long B, float beta, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc) {
- validate();
- rsnScriptIntrinsicBLAS_Single(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU, mUseInc);
- }
-
- native void rsnScriptIntrinsicBLAS_Double(long con, long incCon, long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- double alpha, long A, long B, double beta, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc);
- synchronized void nScriptIntrinsicBLAS_Double(long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- double alpha, long A, long B, double beta, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc) {
- validate();
- rsnScriptIntrinsicBLAS_Double(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU, mUseInc);
- }
-
- native void rsnScriptIntrinsicBLAS_Complex(long con, long incCon, long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc);
- synchronized void nScriptIntrinsicBLAS_Complex(long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc) {
- validate();
- rsnScriptIntrinsicBLAS_Complex(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU, mUseInc);
- }
-
- native void rsnScriptIntrinsicBLAS_Z(long con, long incCon, long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc);
- synchronized void nScriptIntrinsicBLAS_Z(long id, int func, int TransA,
- int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
- double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
- int KL, int KU, boolean mUseInc) {
- validate();
- rsnScriptIntrinsicBLAS_Z(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU, mUseInc);
- }
-
- native void rsnScriptIntrinsicBLAS_BNNM(long con, long incCon, long id, int M, int N, int K,
- long A, int a_offset, long B, int b_offset, long C, int c_offset,
- int c_mult_int, boolean mUseInc);
- synchronized void nScriptIntrinsicBLAS_BNNM(long id, int M, int N, int K,
- long A, int a_offset, long B, int b_offset, long C, int c_offset,
- int c_mult_int, boolean mUseInc) {
- validate();
- rsnScriptIntrinsicBLAS_BNNM(mContext, mIncCon, id, M, N, K, A, a_offset, B, b_offset, C, c_offset, c_mult_int, mUseInc);
- }
-
-// Additional Entry points For inc libRSSupport
-
- native boolean nIncLoadSO(int deviceApi, String libPath);
- native long nIncDeviceCreate();
- native void nIncDeviceDestroy(long dev);
- // Methods below are wrapped to protect the non-threadsafe
- // lockless fifo.
- native long rsnIncContextCreate(long dev, int ver, int sdkVer, int contextType);
- synchronized long nIncContextCreate(long dev, int ver, int sdkVer, int contextType) {
- return rsnIncContextCreate(dev, ver, sdkVer, contextType);
- }
- native void rsnIncContextDestroy(long con);
- synchronized void nIncContextDestroy() {
- validate();
-
- // take teardown lock
- // teardown lock can only be taken when no objects are being destroyed
- ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
- wlock.lock();
-
- long curCon = mIncCon;
- // context is considered dead as of this point
- mIncCon = 0;
-
- wlock.unlock();
- rsnIncContextDestroy(curCon);
- }
-
- native void rsnIncContextFinish(long con);
- synchronized void nIncContextFinish() {
- validate();
- rsnIncContextFinish(mIncCon);
- }
-
- native void rsnIncObjDestroy(long con, long id);
- void nIncObjDestroy(long id) {
- // There is a race condition here. The calling code may be run
- // by the gc while teardown is occuring. This protects againts
- // deleting dead objects.
- if (mIncCon != 0) {
- rsnIncObjDestroy(mIncCon, id);
- }
- }
- native long rsnIncElementCreate(long con, long type, int kind, boolean norm, int vecSize);
- synchronized long nIncElementCreate(long type, int kind, boolean norm, int vecSize) {
- validate();
- return rsnIncElementCreate(mIncCon, type, kind, norm, vecSize);
- }
- native long rsnIncTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
- synchronized long nIncTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
- validate();
- return rsnIncTypeCreate(mIncCon, eid, x, y, z, mips, faces, yuv);
- }
- native long rsnIncAllocationCreateTyped(long con, long incCon, long alloc, long type, int xBytesSize);
- synchronized long nIncAllocationCreateTyped(long alloc, long type, int xBytesSize) {
- validate();
- return rsnIncAllocationCreateTyped(mContext, mIncCon, alloc, type, xBytesSize);
- }
-
- long mContext;
- private boolean mDestroyed = false;
- //Dummy device & context for Inc Support Lib
- long mIncCon;
- //indicator of whether inc support lib has been loaded or not.
- boolean mIncLoaded;
- ReentrantReadWriteLock mRWLock;
- @SuppressWarnings({"FieldCanBeLocal"})
- MessageThread mMessageThread;
-
- Element mElement_U8;
- Element mElement_I8;
- Element mElement_U16;
- Element mElement_I16;
- Element mElement_U32;
- Element mElement_I32;
- Element mElement_U64;
- Element mElement_I64;
- Element mElement_F32;
- Element mElement_F64;
- Element mElement_BOOLEAN;
-
- Element mElement_ELEMENT;
- Element mElement_TYPE;
- Element mElement_ALLOCATION;
- Element mElement_SAMPLER;
- Element mElement_SCRIPT;
-
- Element mElement_A_8;
- Element mElement_RGB_565;
- Element mElement_RGB_888;
- Element mElement_RGBA_5551;
- Element mElement_RGBA_4444;
- Element mElement_RGBA_8888;
-
- Element mElement_FLOAT_2;
- Element mElement_FLOAT_3;
- Element mElement_FLOAT_4;
-
- Element mElement_DOUBLE_2;
- Element mElement_DOUBLE_3;
- Element mElement_DOUBLE_4;
-
- Element mElement_UCHAR_2;
- Element mElement_UCHAR_3;
- Element mElement_UCHAR_4;
-
- Element mElement_CHAR_2;
- Element mElement_CHAR_3;
- Element mElement_CHAR_4;
-
- Element mElement_USHORT_2;
- Element mElement_USHORT_3;
- Element mElement_USHORT_4;
-
- Element mElement_SHORT_2;
- Element mElement_SHORT_3;
- Element mElement_SHORT_4;
-
- Element mElement_UINT_2;
- Element mElement_UINT_3;
- Element mElement_UINT_4;
-
- Element mElement_INT_2;
- Element mElement_INT_3;
- Element mElement_INT_4;
-
- Element mElement_ULONG_2;
- Element mElement_ULONG_3;
- Element mElement_ULONG_4;
-
- Element mElement_LONG_2;
- Element mElement_LONG_3;
- Element mElement_LONG_4;
-
- Element mElement_MATRIX_4X4;
- Element mElement_MATRIX_3X3;
- Element mElement_MATRIX_2X2;
-
- Sampler mSampler_CLAMP_NEAREST;
- Sampler mSampler_CLAMP_LINEAR;
- Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
- Sampler mSampler_WRAP_NEAREST;
- Sampler mSampler_WRAP_LINEAR;
- Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
- Sampler mSampler_MIRRORED_REPEAT_NEAREST;
- Sampler mSampler_MIRRORED_REPEAT_LINEAR;
- Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
-
-
- ///////////////////////////////////////////////////////////////////////////////////
- //
-
- /**
- * The base class from which an application should derive in order
- * to receive RS messages from scripts. When a script calls {@code
- * rsSendToClient}, the data fields will be filled, and the run
- * method will be called on a separate thread. This will occur
- * some time after {@code rsSendToClient} completes in the script,
- * as {@code rsSendToClient} is asynchronous. Message handlers are
- * not guaranteed to have completed when {@link
- * android.support.v8.renderscript.RenderScript#finish} returns.
- *
- */
- public static class RSMessageHandler implements Runnable {
- protected int[] mData;
- protected int mID;
- protected int mLength;
- public void run() {
- }
- }
- /**
- * If an application is expecting messages, it should set this
- * field to an instance of {@link RSMessageHandler}. This
- * instance will receive all the user messages sent from {@code
- * sendToClient} by scripts from this context.
- *
- */
- RSMessageHandler mMessageCallback = null;
-
- public void setMessageHandler(RSMessageHandler msg) {
- mMessageCallback = msg;
- }
- public RSMessageHandler getMessageHandler() {
- return mMessageCallback;
- }
-
- /**
- * Place a message into the message queue to be sent back to the message
- * handler once all previous commands have been executed.
- *
- * @param id
- * @param data
- */
- public void sendMessage(int id, int[] data) {
- nContextSendMessage(id, data);
- }
-
- /**
- * The runtime error handler base class. An application should derive from this class
- * if it wishes to install an error handler. When errors occur at runtime,
- * the fields in this class will be filled, and the run method will be called.
- *
- */
- public static class RSErrorHandler implements Runnable {
- protected String mErrorMessage;
- protected int mErrorNum;
- public void run() {
- }
- }
-
- /**
- * Application Error handler. All runtime errors will be dispatched to the
- * instance of RSAsyncError set here. If this field is null a
- * {@link RSRuntimeException} will instead be thrown with details about the error.
- * This will cause program termaination.
- *
- */
- RSErrorHandler mErrorCallback = null;
-
- public void setErrorHandler(RSErrorHandler msg) {
- mErrorCallback = msg;
- }
- public RSErrorHandler getErrorHandler() {
- return mErrorCallback;
- }
-
- /**
- * RenderScript worker thread priority enumeration. The default value is
- * NORMAL. Applications wishing to do background processing should set
- * their priority to LOW to avoid starving forground processes.
- */
- public enum Priority {
- LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
- NORMAL (Process.THREAD_PRIORITY_DISPLAY);
-
- int mID;
- Priority(int id) {
- mID = id;
- }
- }
-
- void validateObject(BaseObj o) {
- if (o != null) {
- if (o.mRS != this) {
- throw new RSIllegalArgumentException("Attempting to use an object across contexts.");
- }
- }
- }
-
- void validate() {
- if (mContext == 0) {
- throw new RSInvalidStateException("Calling RS with no Context active.");
- }
- }
-
- /**
- * check if IO support lib is available.
- */
- boolean usingIO() {
- return useIOlib;
- }
- /**
- * Change the priority of the worker threads for this context.
- *
- * @param p New priority to be set.
- */
- public void setPriority(Priority p) {
- validate();
- nContextSetPriority(p.mID);
- }
-
- static class MessageThread extends Thread {
- RenderScript mRS;
- boolean mRun = true;
- int[] mAuxData = new int[2];
-
- static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
- static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
- static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
- static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
-
- static final int RS_MESSAGE_TO_CLIENT_USER = 4;
- static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
-
- MessageThread(RenderScript rs) {
- super("RSMessageThread");
- mRS = rs;
-
- }
-
- public void run() {
- // This function is a temporary solution. The final solution will
- // used typed allocations where the message id is the type indicator.
- int[] rbuf = new int[16];
- mRS.nContextInitToClient(mRS.mContext);
- while(mRun) {
- rbuf[0] = 0;
- int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
- int size = mAuxData[1];
- int subID = mAuxData[0];
-
- if (msg == RS_MESSAGE_TO_CLIENT_USER) {
- if ((size>>2) >= rbuf.length) {
- rbuf = new int[(size + 3) >> 2];
- }
- if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
- RS_MESSAGE_TO_CLIENT_USER) {
- throw new RSDriverException("Error processing message from RenderScript.");
- }
-
- if(mRS.mMessageCallback != null) {
- mRS.mMessageCallback.mData = rbuf;
- mRS.mMessageCallback.mID = subID;
- mRS.mMessageCallback.mLength = size;
- mRS.mMessageCallback.run();
- } else {
- throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
- }
- continue;
- }
-
- if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
- String e = mRS.nContextGetErrorMessage(mRS.mContext);
-
- if (subID >= RS_ERROR_FATAL_UNKNOWN) {
- throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
- }
-
- if(mRS.mErrorCallback != null) {
- mRS.mErrorCallback.mErrorMessage = e;
- mRS.mErrorCallback.mErrorNum = subID;
- mRS.mErrorCallback.run();
- } else {
- android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
- // Do not throw here. In these cases, we do not have
- // a fatal error.
- }
- continue;
- }
-
- // 2: teardown.
- // But we want to avoid starving other threads during
- // teardown by yielding until the next line in the destructor
- // can execute to set mRun = false
- try {
- sleep(1, 0);
- } catch(InterruptedException e) {
- }
- }
- //Log.d(LOG_TAG, "MessageThread exiting.");
- }
- }
-
- RenderScript(Context ctx) {
- mContextType = ContextType.NORMAL;
- if (ctx != null) {
- mApplicationContext = ctx.getApplicationContext();
- // Only set mNativeLibDir for API 9+.
- mNativeLibDir = mApplicationContext.getApplicationInfo().nativeLibraryDir;
- }
- mIncCon = 0;
- mIncLoaded = false;
- mRWLock = new ReentrantReadWriteLock();
- }
-
- /**
- * Gets the application context associated with the RenderScript context.
- *
- * @return The application context.
- */
- public final Context getApplicationContext() {
- return mApplicationContext;
- }
-
- /**
- * Create a RenderScript context.
- *
- * @param ctx The context.
- * @return RenderScript
- */
- private static RenderScript internalCreate(Context ctx, int sdkVersion, ContextType ct, int flags) {
- RenderScript rs = new RenderScript(ctx);
-
- if (sSdkVersion == -1) {
- sSdkVersion = sdkVersion;
- } else if (sSdkVersion != sdkVersion) {
- throw new RSRuntimeException("Can't have two contexts with different SDK versions in support lib");
- }
- useNative = setupNative(sSdkVersion, ctx);
- synchronized(lock) {
- if (sInitialized == false) {
- try {
- Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
- Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
- sRuntime = get_runtime.invoke(null);
- registerNativeAllocation = vm_runtime.getDeclaredMethod("registerNativeAllocation", Integer.TYPE);
- registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Integer.TYPE);
- sUseGCHooks = true;
- } catch (Exception e) {
- Log.e(LOG_TAG, "No GC methods");
- sUseGCHooks = false;
- }
- try {
- // For API 9 - 22, always use the absolute path of librsjni.so
- // http://b/25226912
- if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M &&
- rs.mNativeLibDir != null) {
- System.load(rs.mNativeLibDir + "/librsjni.so");
- } else {
- System.loadLibrary("rsjni");
- }
- sInitialized = true;
- sPointerSize = rsnSystemGetPointerSize();
- } catch (UnsatisfiedLinkError e) {
- Log.e(LOG_TAG, "Error loading RS jni library: " + e);
- throw new RSRuntimeException("Error loading RS jni library: " + e + " Support lib API: " + SUPPORT_LIB_VERSION);
- }
- }
- }
-
- if (useNative) {
- android.util.Log.v(LOG_TAG, "RS native mode");
- } else {
- android.util.Log.v(LOG_TAG, "RS compat mode");
- }
-
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- useIOlib = true;
- }
-
- // The target API level used to init dispatchTable.
- int dispatchAPI = sdkVersion;
- if (sdkVersion < android.os.Build.VERSION.SDK_INT) {
- // If the device API is higher than target API level, init dispatch table based on device API.
- dispatchAPI = android.os.Build.VERSION.SDK_INT;
- }
-
- String rssupportPath = null;
- // For API 9 - 22, always use the absolute path of libRSSupport.so
- // http://b/25226912
- if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M &&
- rs.mNativeLibDir != null) {
- rssupportPath = rs.mNativeLibDir + "/libRSSupport.so";
- }
- if (!rs.nLoadSO(useNative, dispatchAPI, rssupportPath)) {
- if (useNative) {
- android.util.Log.v(LOG_TAG, "Unable to load libRS.so, falling back to compat mode");
- useNative = false;
- }
- try {
- if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M &&
- rs.mNativeLibDir != null) {
- System.load(rssupportPath);
- } else {
- System.loadLibrary("RSSupport");
- }
- } catch (UnsatisfiedLinkError e) {
- Log.e(LOG_TAG, "Error loading RS Compat library: " + e + " Support lib version: " + SUPPORT_LIB_VERSION);
- throw new RSRuntimeException("Error loading RS Compat library: " + e + " Support lib version: " + SUPPORT_LIB_VERSION);
- }
- if (!rs.nLoadSO(false, dispatchAPI, rssupportPath)) {
- Log.e(LOG_TAG, "Error loading RS Compat library: nLoadSO() failed; Support lib version: " + SUPPORT_LIB_VERSION);
- throw new RSRuntimeException("Error loading libRSSupport library, Support lib version: " + SUPPORT_LIB_VERSION);
- }
- }
-
- if (useIOlib) {
- try {
- System.loadLibrary("RSSupportIO");
- } catch (UnsatisfiedLinkError e) {
- useIOlib = false;
- }
- if (!useIOlib || !rs.nLoadIOSO()) {
- android.util.Log.v(LOG_TAG, "Unable to load libRSSupportIO.so, USAGE_IO not supported");
- useIOlib = false;
- }
- }
-
- // For old APIs with dlopen bug, need to load blas lib in Java first.
- // Only try load to blasV8 when the desired API level includes IntrinsicBLAS.
- if (dispatchAPI >= 23) {
- // Enable multi-input kernels only when diapatchAPI is M+.
- rs.mEnableMultiInput = true;
- try {
- System.loadLibrary("blasV8");
- } catch (UnsatisfiedLinkError e) {
- Log.v(LOG_TAG, "Unable to load BLAS lib, ONLY BNNM will be supported: " + e);
- }
- }
-
- long device = rs.nDeviceCreate();
- rs.mContext = rs.nContextCreate(device, 0, sdkVersion, ct.mID, rs.mNativeLibDir);
- rs.mContextType = ct;
- rs.mContextFlags = flags;
- rs.mContextSdkVersion = sdkVersion;
- rs.mDispatchAPILevel = dispatchAPI;
- if (rs.mContext == 0) {
- throw new RSDriverException("Failed to create RS context.");
- }
- rs.mMessageThread = new MessageThread(rs);
- rs.mMessageThread.start();
- return rs;
- }
-
- /**
- * Create a RenderScript context.
- *
- * See documentation for @create for details
- *
- * @param ctx The context.
- * @return RenderScript
- */
- public static RenderScript create(Context ctx) {
- return create(ctx, ContextType.NORMAL);
- }
-
- /**
- * calls create(ctx, ct, CREATE_FLAG_NONE)
- *
- * See documentation for @create for details
- *
- * @param ctx The context.
- * @param ct The type of context to be created.
- * @return RenderScript
- */
- public static RenderScript create(Context ctx, ContextType ct) {
- return create(ctx, ct, CREATE_FLAG_NONE);
- }
-
- /**
- * Gets or creates a RenderScript context of the specified type.
- *
- * The returned context will be cached for future reuse within
- * the process. When an application is finished using
- * RenderScript it should call releaseAllContexts()
- *
- * A process context is a context designed for easy creation and
- * lifecycle management. Multiple calls to this function will
- * return the same object provided they are called with the same
- * options. This allows it to be used any time a RenderScript
- * context is needed.
- *
- *
- * @param ctx The context.
- * @param ct The type of context to be created.
- * @param flags The OR of the CREATE_FLAG_* options desired
- * @return RenderScript
- */
- public static RenderScript create(Context ctx, ContextType ct, int flags) {
- int v = ctx.getApplicationInfo().targetSdkVersion;
- return create(ctx, v, ct, flags);
- }
-
- /**
- * calls create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE)
- *
- * Used by the RenderScriptThunker to maintain backward compatibility.
- *
- * @hide
- * @param ctx The context.
- * @param sdkVersion The target SDK Version.
- * @return RenderScript
- */
- public static RenderScript create(Context ctx, int sdkVersion) {
- return create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE);
- }
-
-
- /**
- * calls create(ctx, sdkVersion, ct, CREATE_FLAG_NONE)
- * Create a RenderScript context.
- *
- * @hide
- * @param ctx The context.
- * @return RenderScript
- */
- public static RenderScript create(Context ctx, int sdkVersion, ContextType ct) {
- return create(ctx, sdkVersion, ct, CREATE_FLAG_NONE);
- }
-
- /**
- * Gets or creates a RenderScript context of the specified type.
- *
- * @param ctx The context.
- * @param ct The type of context to be created.
- * @param sdkVersion The target SDK Version.
- * @param flags The OR of the CREATE_FLAG_* options desired
- * @return RenderScript
- */
- public static RenderScript create(Context ctx, int sdkVersion, ContextType ct, int flags) {
- synchronized (mProcessContextList) {
- for (RenderScript prs : mProcessContextList) {
- if ((prs.mContextType == ct) &&
- (prs.mContextFlags == flags) &&
- (prs.mContextSdkVersion == sdkVersion)) {
-
- return prs;
- }
- }
-
- RenderScript prs = internalCreate(ctx, sdkVersion, ct, flags);
- prs.mIsProcessContext = true;
- mProcessContextList.add(prs);
- return prs;
- }
- }
-
- /**
- *
- * Releases all the process contexts. This is the same as
- * calling .destroy() on each unique context retreived with
- * create(...). If no contexts have been created this
- * function does nothing.
- *
- * Typically you call this when your application is losing focus
- * and will not be using a context for some time.
- *
- * This has no effect on a context created with
- * createMultiContext()
- */
- public static void releaseAllContexts() {
- ArrayList<RenderScript> oldList;
- synchronized (mProcessContextList) {
- oldList = mProcessContextList;
- mProcessContextList = new ArrayList<RenderScript>();
- }
-
- for (RenderScript prs : oldList) {
- prs.mIsProcessContext = false;
- prs.destroy();
- }
- oldList.clear();
- }
-
-
-
- /**
- * Create a RenderScript context.
- *
- * This is an advanced function intended for applications which
- * need to create more than one RenderScript context to be used
- * at the same time.
- *
- * If you need a single context please use create()
- *
- * @param ctx The context.
- * @return RenderScript
- */
- public static RenderScript createMultiContext(Context ctx, ContextType ct, int flags, int API_number) {
- return internalCreate(ctx, API_number, ct, flags);
- }
-
- /**
- * Print the currently available debugging information about the state of
- * the RS context to the log.
- *
- */
- public void contextDump() {
- validate();
- nContextDump(0);
- }
-
- /**
- * Wait for any pending asynchronous opeations (such as copies to a RS
- * allocation or RS script executions) to complete.
- *
- */
- public void finish() {
- nContextFinish();
- }
-
- private void helpDestroy() {
- boolean shouldDestroy = false;
- synchronized(this) {
- if (!mDestroyed) {
- shouldDestroy = true;
- mDestroyed = true;
- }
- }
-
- if (shouldDestroy) {
- nContextFinish();
- if (mIncCon != 0) {
- nIncContextFinish();
- nIncContextDestroy();
- mIncCon = 0;
- }
- nContextDeinitToClient(mContext);
- mMessageThread.mRun = false;
- // Interrupt mMessageThread so it gets to see immediately that mRun is false
- // and exit rightaway.
- mMessageThread.interrupt();
-
- // Wait for mMessageThread to join. Try in a loop, in case this thread gets interrupted
- // during the wait. If interrupted, set the "interrupted" status of the current thread.
- boolean hasJoined = false, interrupted = false;
- while (!hasJoined) {
- try {
- mMessageThread.join();
- hasJoined = true;
- } catch (InterruptedException e) {
- interrupted = true;
- }
- }
- if (interrupted) {
- Log.v(LOG_TAG, "Interrupted during wait for MessageThread to join");
- Thread.currentThread().interrupt();
- }
-
- nContextDestroy();
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- helpDestroy();
- super.finalize();
- }
-
- /**
- * Destroys this RenderScript context. Once this function is called,
- * using this context or any objects belonging to this context is
- * illegal.
- *
- * This function is a NOP if the context was created
- * with create(). Please use releaseAllContexts() to clean up
- * contexts created with the create function.
- */
- public void destroy() {
- if (mIsProcessContext) {
- // users cannot destroy a process context
- return;
- }
- validate();
- helpDestroy();
- }
-
- boolean isAlive() {
- return mContext != 0;
- }
-
- long safeID(BaseObj o) {
- if(o != null) {
- return o.getID(this);
- }
- return 0;
- }
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Sampler.java b/v8/renderscript/java/src/android/support/v8/renderscript/Sampler.java
deleted file mode 100644
index 7119e8c..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Sampler.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.util.Log;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-
-/**
- * Sampler object that defines how Allocations can be read as textures within a
- * kernel. Samplers are used in conjunction with the {@code rsSample} runtime
- * function to return values from normalized coordinates.
- *
- * Any Allocation used with a Sampler must have been created with {@link
- * android.support.v8.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE}; using a
- * Sampler on an {@link android.support.v8.renderscript.Allocation} that was not
- * created with
- * {@link android.support.v8.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE} is
- * undefined.
- **/
-public class Sampler extends BaseObj {
- public enum Value {
- NEAREST (0),
- LINEAR (1),
- LINEAR_MIP_LINEAR (2),
- LINEAR_MIP_NEAREST (5),
- WRAP (3),
- CLAMP (4),
- MIRRORED_REPEAT (6);
-
- int mID;
- Value(int id) {
- mID = id;
- }
- }
-
- Value mMin;
- Value mMag;
- Value mWrapS;
- Value mWrapT;
- Value mWrapR;
- float mAniso;
-
- Sampler(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * @return minification setting for the sampler
- */
- public Value getMinification() {
- return mMin;
- }
-
- /**
- * @return magnification setting for the sampler
- */
- public Value getMagnification() {
- return mMag;
- }
-
- /**
- * @return S wrapping mode for the sampler
- */
- public Value getWrapS() {
- return mWrapS;
- }
-
- /**
- * @return T wrapping mode for the sampler
- */
- public Value getWrapT() {
- return mWrapT;
- }
-
- /**
- * @return anisotropy setting for the sampler
- */
- public float getAnisotropy() {
- return mAniso;
- }
-
- /**
- * Retrieve a sampler with min and mag set to nearest and wrap modes set to
- * clamp.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler CLAMP_NEAREST(RenderScript rs) {
- if(rs.mSampler_CLAMP_NEAREST == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.NEAREST);
- b.setMagnification(Value.NEAREST);
- b.setWrapS(Value.CLAMP);
- b.setWrapT(Value.CLAMP);
- rs.mSampler_CLAMP_NEAREST = b.create();
- }
- return rs.mSampler_CLAMP_NEAREST;
- }
-
- /**
- * Retrieve a sampler with min and mag set to linear and wrap modes set to
- * clamp.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler CLAMP_LINEAR(RenderScript rs) {
- if(rs.mSampler_CLAMP_LINEAR == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.LINEAR);
- b.setMagnification(Value.LINEAR);
- b.setWrapS(Value.CLAMP);
- b.setWrapT(Value.CLAMP);
- rs.mSampler_CLAMP_LINEAR = b.create();
- }
- return rs.mSampler_CLAMP_LINEAR;
- }
-
- /**
- * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
- * wrap modes set to clamp.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
- if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.LINEAR_MIP_LINEAR);
- b.setMagnification(Value.LINEAR);
- b.setWrapS(Value.CLAMP);
- b.setWrapT(Value.CLAMP);
- rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
- }
- return rs.mSampler_CLAMP_LINEAR_MIP_LINEAR;
- }
-
- /**
- * Retrieve a sampler with min and mag set to nearest and wrap modes set to
- * wrap.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler WRAP_NEAREST(RenderScript rs) {
- if(rs.mSampler_WRAP_NEAREST == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.NEAREST);
- b.setMagnification(Value.NEAREST);
- b.setWrapS(Value.WRAP);
- b.setWrapT(Value.WRAP);
- rs.mSampler_WRAP_NEAREST = b.create();
- }
- return rs.mSampler_WRAP_NEAREST;
- }
-
- /**
- * Retrieve a sampler with min and mag set to linear and wrap modes set to
- * wrap.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler WRAP_LINEAR(RenderScript rs) {
- if(rs.mSampler_WRAP_LINEAR == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.LINEAR);
- b.setMagnification(Value.LINEAR);
- b.setWrapS(Value.WRAP);
- b.setWrapT(Value.WRAP);
- rs.mSampler_WRAP_LINEAR = b.create();
- }
- return rs.mSampler_WRAP_LINEAR;
- }
-
- /**
- * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
- * wrap modes set to wrap.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
- if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.LINEAR_MIP_LINEAR);
- b.setMagnification(Value.LINEAR);
- b.setWrapS(Value.WRAP);
- b.setWrapT(Value.WRAP);
- rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
- }
- return rs.mSampler_WRAP_LINEAR_MIP_LINEAR;
- }
-
- /**
- * Retrieve a sampler with min and mag set to nearest and wrap modes set to
- * mirrored repeat.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler MIRRORED_REPEAT_NEAREST(RenderScript rs) {
- if(rs.mSampler_MIRRORED_REPEAT_NEAREST == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.NEAREST);
- b.setMagnification(Value.NEAREST);
- b.setWrapS(Value.MIRRORED_REPEAT);
- b.setWrapT(Value.MIRRORED_REPEAT);
- rs.mSampler_MIRRORED_REPEAT_NEAREST = b.create();
- }
- return rs.mSampler_MIRRORED_REPEAT_NEAREST;
- }
-
- /**
- * Retrieve a sampler with min and mag set to linear and wrap modes set to
- * mirrored repeat.
- *
- * @param rs Context to which the sampler will belong.
- *
- * @return Sampler
- */
- public static Sampler MIRRORED_REPEAT_LINEAR(RenderScript rs) {
- if(rs.mSampler_MIRRORED_REPEAT_LINEAR == null) {
- Builder b = new Builder(rs);
- b.setMinification(Value.LINEAR);
- b.setMagnification(Value.LINEAR);
- b.setWrapS(Value.MIRRORED_REPEAT);
- b.setWrapT(Value.MIRRORED_REPEAT);
- rs.mSampler_MIRRORED_REPEAT_LINEAR = b.create();
- }
- return rs.mSampler_MIRRORED_REPEAT_LINEAR;
- }
-
- /**
- * Builder for creating non-standard samplers. This is only necessary if
- * a Sampler with different min and mag modes is desired.
- */
- public static class Builder {
- RenderScript mRS;
- Value mMin;
- Value mMag;
- Value mWrapS;
- Value mWrapT;
- Value mWrapR;
- float mAniso;
-
- public Builder(RenderScript rs) {
- mRS = rs;
- mMin = Value.NEAREST;
- mMag = Value.NEAREST;
- mWrapS = Value.WRAP;
- mWrapT = Value.WRAP;
- mWrapR = Value.WRAP;
- mAniso = 1.0f;
- }
-
- public void setMinification(Value v) {
- if (v == Value.NEAREST ||
- v == Value.LINEAR ||
- v == Value.LINEAR_MIP_LINEAR ||
- v == Value.LINEAR_MIP_NEAREST) {
- mMin = v;
- } else {
- throw new IllegalArgumentException("Invalid value");
- }
- }
-
- public void setMagnification(Value v) {
- if (v == Value.NEAREST || v == Value.LINEAR) {
- mMag = v;
- } else {
- throw new IllegalArgumentException("Invalid value");
- }
- }
-
- public void setWrapS(Value v) {
- if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
- mWrapS = v;
- } else {
- throw new IllegalArgumentException("Invalid value");
- }
- }
-
- public void setWrapT(Value v) {
- if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
- mWrapT = v;
- } else {
- throw new IllegalArgumentException("Invalid value");
- }
- }
-
- public void setAnisotropy(float v) {
- if(v >= 0.0f) {
- mAniso = v;
- } else {
- throw new IllegalArgumentException("Invalid value");
- }
- }
-
- public Sampler create() {
- mRS.validate();
- long id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
- mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
- Sampler sampler = new Sampler(id, mRS);
- sampler.mMin = mMin;
- sampler.mMag = mMag;
- sampler.mWrapS = mWrapS;
- sampler.mWrapT = mWrapT;
- sampler.mWrapR = mWrapR;
- sampler.mAniso = mAniso;
- return sampler;
- }
- }
-
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Script.java b/v8/renderscript/java/src/android/support/v8/renderscript/Script.java
deleted file mode 100644
index ec3a7a9..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Script.java
+++ /dev/null
@@ -1,701 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.SparseArray;
-
-/**
- * The parent class for all executable scripts. This should not be used by
- * applications.
- **/
-public class Script extends BaseObj {
- /**
- * Determine if Incremental Intrinsic Support is needed
- *
- */
- private boolean mUseIncSupp;
- protected void setIncSupp(boolean useInc) {
- mUseIncSupp = useInc;
- }
- protected boolean isIncSupp() {
- return mUseIncSupp;
- }
- /**
- * An allocation for the compat context will be created when needed
- * e.g. foreach(ain, aout), setVar(ain);
- *
- */
- long getDummyAlloc(Allocation ain) {
- long dInElement = 0;
- long dInType = 0;
- long dummyAlloc = 0;
- if (ain != null) {
- Type inType = ain.getType();
- dInElement = inType.getElement().getDummyElement(mRS);
- dInType = inType.getDummyType(mRS, dInElement);
- int xBytesSize = inType.getX() * inType.getElement().getBytesSize();
- dummyAlloc = mRS.nIncAllocationCreateTyped(ain.getID(mRS), dInType, xBytesSize);
- ain.setIncAllocID(dummyAlloc);
- }
-
- return dummyAlloc;
- }
- /**
- * KernelID is an identifier for a Script + root function pair. It is used
- * as an identifier for ScriptGroup creation.
- *
- * This class should not be directly created. Instead use the method in the
- * reflected or intrinsic code "getKernelID_funcname()".
- *
- */
- public static final class KernelID extends BaseObj {
- android.renderscript.Script.KernelID mN;
- Script mScript;
- int mSlot;
- int mSig;
- KernelID(long id, RenderScript rs, Script s, int slot, int sig) {
- super(id, rs);
- mScript = s;
- mSlot = slot;
- mSig = sig;
- }
- }
-
- private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
- /**
- * Only to be used by generated reflected classes.
- *
- *
- * @param slot
- * @param sig
- * @param ein
- * @param eout
- *
- * @return KernelID
- */
- protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
- KernelID k = mKIDs.get(slot);
- if (k != null) {
- return k;
- }
-
- long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig, mUseIncSupp);
- if (id == 0) {
- throw new RSDriverException("Failed to create KernelID");
- }
-
- k = new KernelID(id, mRS, this, slot, sig);
-
- mKIDs.put(slot, k);
- return k;
- }
-
- /**
- * InvokeID is an identifier for a invoke function. It is used
- * as an identifier for ScriptGroup creation.
- *
- * This class should not be directly created. Instead use the method in the
- * reflected or intrinsic code "getInvokeID_funcname()".
- *
- */
- public static final class InvokeID extends BaseObj {
- Script mScript;
- int mSlot;
- InvokeID(long id, RenderScript rs, Script s, int slot) {
- super(id, rs);
- mScript = s;
- mSlot = slot;
- }
- }
-
- private final SparseArray<InvokeID> mIIDs = new SparseArray<InvokeID>();
- /**
- * Only to be used by generated reflected classes.
- */
- protected InvokeID createInvokeID(int slot) {
- InvokeID i = mIIDs.get(slot);
- if (i != null) {
- return i;
- }
-
- long id = mRS.nScriptInvokeIDCreate(getID(mRS), slot);
- if (id == 0) {
- throw new RSDriverException("Failed to create KernelID");
- }
-
- i = new InvokeID(id, mRS, this, slot);
- mIIDs.put(slot, i);
- return i;
- }
-
- /**
- * FieldID is an identifier for a Script + exported field pair. It is used
- * as an identifier for ScriptGroup creation.
- *
- * This class should not be directly created. Instead use the method in the
- * reflected or intrinsic code "getFieldID_funcname()".
- *
- */
- public static final class FieldID extends BaseObj {
- android.renderscript.Script.FieldID mN;
- Script mScript;
- int mSlot;
- FieldID(long id, RenderScript rs, Script s, int slot) {
- super(id, rs);
- mScript = s;
- mSlot = slot;
- }
- }
-
- private final SparseArray<FieldID> mFIDs = new SparseArray();
- /**
- * Only to be used by generated reflected classes.
- *
- * @param slot
- * @param e
- *
- * @return FieldID
- */
- protected FieldID createFieldID(int slot, Element e) {
- FieldID f = mFIDs.get(slot);
- if (f != null) {
- return f;
- }
-
- long id = mRS.nScriptFieldIDCreate(getID(mRS), slot, mUseIncSupp);
- if (id == 0) {
- throw new RSDriverException("Failed to create FieldID");
- }
-
- f = new FieldID(id, mRS, this, slot);
- mFIDs.put(slot, f);
- return f;
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param slot
- */
- protected void invoke(int slot) {
- mRS.nScriptInvoke(getID(mRS), slot, mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param slot
- * @param v
- */
- protected void invoke(int slot, FieldPacker v) {
- if (v != null) {
- mRS.nScriptInvokeV(getID(mRS), slot, v.getData(), mUseIncSupp);
- } else {
- mRS.nScriptInvoke(getID(mRS), slot, mUseIncSupp);
- }
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param va
- * @param slot
- */
- public void bindAllocation(Allocation va, int slot) {
- mRS.validate();
- if (va != null) {
- mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot, mUseIncSupp);
- } else {
- mRS.nScriptBindAllocation(getID(mRS), 0, slot, mUseIncSupp);
- }
- }
-
- public void setTimeZone(String timeZone) {
- mRS.validate();
- try {
- mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"), mUseIncSupp);
- } catch (java.io.UnsupportedEncodingException e) {
- throw new RuntimeException(e);
- }
- }
-
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param slot
- * @param ain
- * @param aout
- * @param v
- */
- protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
- if (ain == null && aout == null) {
- throw new RSIllegalArgumentException(
- "At least one of ain or aout is required to be non-null.");
- }
- long in_id = 0;
- long out_id = 0;
- if (ain != null) {
- in_id = ain.getID(mRS);
- }
- if (aout != null) {
- out_id = aout.getID(mRS);
- }
-
- byte[] params = null;
- if (v != null) {
- params = v.getData();
- }
-
- if (mUseIncSupp) {
- long ainInc = getDummyAlloc(ain);
- long aoutInc = getDummyAlloc(aout);
- mRS.nScriptForEach(getID(mRS), slot, ainInc, aoutInc, params, mUseIncSupp);
- } else {
- mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params, mUseIncSupp);
- }
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param slot
- * @param ain
- * @param aout
- * @param v
- * @param sc
- */
- protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
- if (ain == null && aout == null) {
- throw new RSIllegalArgumentException(
- "At least one of ain or aout is required to be non-null.");
- }
-
- if (sc == null) {
- forEach(slot, ain, aout, v);
- return;
- }
- long in_id = 0;
- long out_id = 0;
- if (ain != null) {
- in_id = ain.getID(mRS);
- }
- if (aout != null) {
- out_id = aout.getID(mRS);
- }
-
- byte[] params = null;
- if (v != null) {
- params = v.getData();
- }
- if (mUseIncSupp) {
- long ainInc = getDummyAlloc(ain);
- long aoutInc = getDummyAlloc(aout);
- mRS.nScriptForEachClipped(getID(mRS), slot, ainInc, aoutInc, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend, mUseIncSupp);
- } else {
- mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend, mUseIncSupp);
- }
- }
-
- Script(long id, RenderScript rs) {
- super(id, rs);
- mUseIncSupp = false;
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @hide
- */
- protected void forEach(int slot, Allocation[] ains, Allocation aout,
- FieldPacker v) {
- forEach(slot, ains, aout, v, null);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @hide
- */
- protected void forEach(int slot, Allocation[] ains, Allocation aout,
- FieldPacker v, LaunchOptions sc) {
- // TODO: Is this necessary if nScriptForEach calls validate as well?
- mRS.validate();
- if (ains != null) {
- for (Allocation ain : ains) {
- mRS.validateObject(ain);
- }
- }
- mRS.validateObject(aout);
-
- if (ains == null && aout == null) {
- throw new RSIllegalArgumentException(
- "At least one of ain or aout is required to be non-null.");
- }
-
- long[] in_ids;
- if (ains != null) {
- in_ids = new long[ains.length];
- for (int index = 0; index < ains.length; ++index) {
- in_ids[index] = ains[index].getID(mRS);
- }
- } else {
- in_ids = null;
- }
-
- long out_id = 0;
- if (aout != null) {
- out_id = aout.getID(mRS);
- }
-
- byte[] params = null;
- if (v != null) {
- params = v.getData();
- }
-
- int[] limits = null;
- if (sc != null) {
- limits = new int[6];
-
- limits[0] = sc.xstart;
- limits[1] = sc.xend;
- limits[2] = sc.ystart;
- limits[3] = sc.yend;
- limits[4] = sc.zstart;
- limits[5] = sc.zend;
- }
-
- mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
- }
-
- /**
- * Only intended for use by generated reflected code. (General reduction)
- *
- * @hide
- */
- protected void reduce(int slot, Allocation[] ains, Allocation aout, LaunchOptions sc) {
- mRS.validate();
- if (ains == null || ains.length < 1) {
- throw new RSIllegalArgumentException(
- "At least one input is required.");
- }
- if (aout == null) {
- throw new RSIllegalArgumentException(
- "aout is required to be non-null.");
- }
- for (Allocation ain : ains) {
- mRS.validateObject(ain);
- }
-
- long[] in_ids = new long[ains.length];
- for (int index = 0; index < ains.length; ++index) {
- in_ids[index] = ains[index].getID(mRS);
- }
- long out_id = aout.getID(mRS);
-
- int[] limits = null;
- if (sc != null) {
- limits = new int[6];
-
- limits[0] = sc.xstart;
- limits[1] = sc.xend;
- limits[2] = sc.ystart;
- limits[3] = sc.yend;
- limits[4] = sc.zstart;
- limits[5] = sc.zend;
- }
-
- mRS.nScriptReduce(getID(mRS), slot, in_ids, out_id, limits);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- */
- public void setVar(int index, float v) {
- mRS.nScriptSetVarF(getID(mRS), index, v, mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- */
- public void setVar(int index, double v) {
- mRS.nScriptSetVarD(getID(mRS), index, v, mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- */
- public void setVar(int index, int v) {
- mRS.nScriptSetVarI(getID(mRS), index, v, mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- */
- public void setVar(int index, long v) {
- mRS.nScriptSetVarJ(getID(mRS), index, v, mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- */
- public void setVar(int index, boolean v) {
- mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0, mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param o
- */
- public void setVar(int index, BaseObj o) {
- if (mUseIncSupp) {
- long oInc = getDummyAlloc((Allocation)o);
- mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : oInc, mUseIncSupp);
- } else {
- mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS), mUseIncSupp);
- }
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- */
- public void setVar(int index, FieldPacker v) {
- mRS.nScriptSetVarV(getID(mRS), index, v.getData(), mUseIncSupp);
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- * @param index
- * @param v
- * @param e
- * @param dims
- */
- public void setVar(int index, FieldPacker v, Element e, int[] dims) {
- if (mUseIncSupp) {
- long dElement = e.getDummyElement(mRS);
- mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), dElement, dims, mUseIncSupp);
- } else {
- mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims, mUseIncSupp);
- }
- }
-
- /**
- * Only intended for use by generated reflected code.
- *
- */
- public static class Builder {
- RenderScript mRS;
-
- Builder(RenderScript rs) {
- mRS = rs;
- }
- }
-
-
- /**
- * Only intended for use by generated reflected code.
- *
- */
- public static class FieldBase {
- protected Element mElement;
- protected Allocation mAllocation;
-
- protected void init(RenderScript rs, int dimx) {
- mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
- }
-
- protected void init(RenderScript rs, int dimx, int usages) {
- mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
- }
-
- protected FieldBase() {
- }
-
- public Element getElement() {
- return mElement;
- }
-
- public Type getType() {
- return mAllocation.getType();
- }
-
- public Allocation getAllocation() {
- return mAllocation;
- }
-
- //@Override
- public void updateAllocation() {
- }
- }
-
-
- /**
- * Class for specifying the specifics about how a kernel will be
- * launched.
- *
- * This class can specify a potential range of cells on which to
- * run a kernel. If no set is called for a dimension then this
- * class will have no impact on that dimension when the kernel
- * is executed.
- *
- * The forEach kernel launch will operate over the intersection of
- * the dimensions.
- *
- * Example:
- * LaunchOptions with setX(5, 15)
- * Allocation with dimension X=10, Y=10
- * The resulting forEach run would execute over:
- * x = 5 to 9 (inclusive) and
- * y = 0 to 9 (inclusive).
- *
- */
- public static final class LaunchOptions {
- private int xstart = 0;
- private int ystart = 0;
- private int xend = 0;
- private int yend = 0;
- private int zstart = 0;
- private int zend = 0;
- private int strategy;
-
- /**
- * Set the X range. xstartArg is the lowest coordinate of the range,
- * and xendArg-1 is the highest coordinate of the range.
- *
- * @param xstartArg Must be >= 0
- * @param xendArg Must be > xstartArg
- *
- * @return LaunchOptions
- */
- public LaunchOptions setX(int xstartArg, int xendArg) {
- if (xstartArg < 0 || xendArg <= xstartArg) {
- throw new RSIllegalArgumentException("Invalid dimensions");
- }
- xstart = xstartArg;
- xend = xendArg;
- return this;
- }
-
- /**
- * Set the Y range. ystartArg is the lowest coordinate of the range,
- * and yendArg-1 is the highest coordinate of the range.
- *
- * @param ystartArg Must be >= 0
- * @param yendArg Must be > ystartArg
- *
- * @return LaunchOptions
- */
- public LaunchOptions setY(int ystartArg, int yendArg) {
- if (ystartArg < 0 || yendArg <= ystartArg) {
- throw new RSIllegalArgumentException("Invalid dimensions");
- }
- ystart = ystartArg;
- yend = yendArg;
- return this;
- }
-
- /**
- * Set the Z range. zstartArg is the lowest coordinate of the range,
- * and zendArg-1 is the highest coordinate of the range.
- *
- * @param zstartArg Must be >= 0
- * @param zendArg Must be > zstartArg
- *
- * @return LaunchOptions
- */
- public LaunchOptions setZ(int zstartArg, int zendArg) {
- if (zstartArg < 0 || zendArg <= zstartArg) {
- throw new RSIllegalArgumentException("Invalid dimensions");
- }
- zstart = zstartArg;
- zend = zendArg;
- return this;
- }
-
-
- /**
- * Returns the current X start
- *
- * @return int current value
- */
- public int getXStart() {
- return xstart;
- }
- /**
- * Returns the current X end
- *
- * @return int current value
- */
- public int getXEnd() {
- return xend;
- }
- /**
- * Returns the current Y start
- *
- * @return int current value
- */
- public int getYStart() {
- return ystart;
- }
- /**
- * Returns the current Y end
- *
- * @return int current value
- */
- public int getYEnd() {
- return yend;
- }
- /**
- * Returns the current Z start
- *
- * @return int current value
- */
- public int getZStart() {
- return zstart;
- }
- /**
- * Returns the current Z end
- *
- * @return int current value
- */
- public int getZEnd() {
- return zend;
- }
-
- }
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptC.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptC.java
deleted file mode 100644
index 28e9613..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptC.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.util.Log;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map.Entry;
-import java.util.HashMap;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-/**
- * The superclass for all user-defined scripts. This is only
- * intended to be used by the generated derived classes.
- **/
-public class ScriptC extends Script {
- private static final String TAG = "ScriptC";
-
- /**
- * Only intended for use by the generated derived classes.
- *
- * @param id
- * @param rs
- */
- protected ScriptC(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Only intended for use by the generated derived classes.
- *
- *
- * @param rs
- * @param resources
- * @param resourceID
- */
- protected ScriptC(RenderScript rs, Resources resources, int resourceID) {
- super(0, rs);
- long id = internalCreate(rs, resources, resourceID);
- if (id == 0) {
- throw new RSRuntimeException("Loading of ScriptC script failed.");
- }
- setID(id);
- }
-
- /**
- * Only intended for use by the generated derived classes.
- *
- * @param rs
- * @param resName
- * @param bitcode32
- * @param bitcode64
- */
- protected ScriptC(RenderScript rs, String resName, byte[] bitcode32, byte[] bitcode64) {
- super(0, rs);
- long id = 0;
- if (RenderScript.sPointerSize == 4) {
- id = internalStringCreate(rs, resName, bitcode32);
- } else {
- id = internalStringCreate(rs, resName, bitcode64);
- }
- if (id == 0) {
- throw new RSRuntimeException("Loading of ScriptC script failed.");
- }
- setID(id);
- }
-
- private static synchronized long internalCreate(RenderScript rs, Resources resources, int resourceID) {
- byte[] pgm;
- int pgmLength;
- InputStream is = resources.openRawResource(resourceID);
- try {
- try {
- pgm = new byte[1024];
- pgmLength = 0;
- while(true) {
- int bytesLeft = pgm.length - pgmLength;
- if (bytesLeft == 0) {
- byte[] buf2 = new byte[pgm.length * 2];
- System.arraycopy(pgm, 0, buf2, 0, pgm.length);
- pgm = buf2;
- bytesLeft = pgm.length - pgmLength;
- }
- int bytesRead = is.read(pgm, pgmLength, bytesLeft);
- if (bytesRead <= 0) {
- break;
- }
- pgmLength += bytesRead;
- }
- } finally {
- is.close();
- }
- } catch(IOException e) {
- throw new Resources.NotFoundException();
- }
-
- String resName = resources.getResourceEntryName(resourceID);
- String cachePath = rs.getApplicationContext().getCacheDir().toString();
-
- // Log.v(TAG, "Create script for resource = " + resName + ", " + pgmLength + ", " + pgm);
- //Log.v(TAG, " path = " + cachePath);
- return rs.nScriptCCreate(resName, cachePath, pgm, pgmLength);
- }
-
- private static synchronized long internalStringCreate(RenderScript rs, String resName, byte[] bitcode) {
- // Log.v(TAG, "Create script for resource = " + resName);
- String cachePath = rs.getApplicationContext().getCacheDir().toString();
- return rs.nScriptCCreate(resName, cachePath, bitcode, bitcode.length);
- }
-
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptGroup.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptGroup.java
deleted file mode 100644
index 139fde2..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptGroup.java
+++ /dev/null
@@ -1,1180 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-import android.util.Pair;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A group of kernels that are executed
- * together with one execution call as if they were a single kernel
- * <p>
- * In addition to kernels, a script group may contain invocable functions as well.
- * A script group may take inputs and generate outputs, which are consumed and
- * produced by its member kernels.
- * Inside a script group, outputs from one kernel can be passed to another kernel as inputs.
- * The API disallows cyclic dependencies among kernels in a script group,
- * effectively making it a directed acyclic graph (DAG) of kernels.
- * <p>
- * Grouping kernels together allows for more efficient execution. For example,
- * runtime and compiler optimization can be applied to reduce computation and
- * communication overhead, and to make better use of the CPU and the GPU.
- **/
-public final class ScriptGroup extends BaseObj {
- //FIXME: Change 23 to the codename when that is decided.
- private static final int MIN_API_VERSION = 23;
- private static final String TAG = "ScriptGroup";
- IO mOutputs[];
- IO mInputs[];
- private boolean mUseIncSupp = false;
- private ArrayList<Node> mNodes = new ArrayList<Node>();
-
- static class IO {
- Script.KernelID mKID;
- Allocation mAllocation;
-
- IO(Script.KernelID s) {
- mKID = s;
- }
- }
-
- static class ConnectLine {
- ConnectLine(Type t, Script.KernelID from, Script.KernelID to) {
- mFrom = from;
- mToK = to;
- mAllocationType = t;
- }
-
- ConnectLine(Type t, Script.KernelID from, Script.FieldID to) {
- mFrom = from;
- mToF = to;
- mAllocationType = t;
- }
-
- Script.FieldID mToF;
- Script.KernelID mToK;
- Script.KernelID mFrom;
- Type mAllocationType;
- Allocation mAllocation;
- }
-
- static class Node {
- Script mScript;
- ArrayList<Script.KernelID> mKernels = new ArrayList<Script.KernelID>();
- ArrayList<ConnectLine> mInputs = new ArrayList<ConnectLine>();
- ArrayList<ConnectLine> mOutputs = new ArrayList<ConnectLine>();
- int dagNumber;
- boolean mSeen;
- int mOrder;
-
- Node mNext;
-
- Node(Script s) {
- mScript = s;
- }
- }
-
- /**
- * An opaque class for closures
- * <p>
- * A closure represents a function call to a kernel or invocable function,
- * combined with arguments and values for global variables. A closure is
- * created using the {@link Builder2#addKernel} or
- * {@link Builder2#addInvoke}
- * method.
- */
-
- public static final class Closure extends BaseObj {
- private Object[] mArgs;
- private Allocation mReturnValue;
- private Map<Script.FieldID, Object> mBindings;
-
- private Future mReturnFuture;
- private Map<Script.FieldID, Future> mGlobalFuture;
-
- private FieldPacker mFP;
-
- private static final String TAG = "Closure";
-
- Closure(long id, RenderScript rs) {
- super(id, rs);
- }
-
- Closure(RenderScript rs, Script.KernelID kernelID, Type returnType,
- Object[] args, Map<Script.FieldID, Object> globals) {
- super(0, rs);
-
- if (android.os.Build.VERSION.SDK_INT < MIN_API_VERSION && rs.isUseNative()) {
- throw new RSRuntimeException("ScriptGroup2 not supported in this API level");
- }
-
- mArgs = args;
- mReturnValue = Allocation.createTyped(rs, returnType);
- mBindings = globals;
- mGlobalFuture = new HashMap<Script.FieldID, Future>();
-
- int numValues = args.length + globals.size();
-
- long[] fieldIDs = new long[numValues];
- long[] values = new long[numValues];
- int[] sizes = new int[numValues];
- long[] depClosures = new long[numValues];
- long[] depFieldIDs = new long[numValues];
-
- int i;
- for (i = 0; i < args.length; i++) {
- fieldIDs[i] = 0;
- retrieveValueAndDependenceInfo(rs, i, null, args[i],
- values, sizes, depClosures, depFieldIDs);
- }
- for (Map.Entry<Script.FieldID, Object> entry : globals.entrySet()) {
- Object obj = entry.getValue();
- Script.FieldID fieldID = entry.getKey();
- fieldIDs[i] = fieldID.getID(rs);
- retrieveValueAndDependenceInfo(rs, i, fieldID, obj,
- values, sizes, depClosures, depFieldIDs);
- i++;
- }
-
- long id = rs.nClosureCreate(kernelID.getID(rs), mReturnValue.getID(rs),
- fieldIDs, values, sizes, depClosures, depFieldIDs);
-
- setID(id);
- }
-
- Closure(RenderScript rs, Script.InvokeID invokeID,
- Object[] args, Map<Script.FieldID, Object> globals) {
- super(0, rs);
-
- if (android.os.Build.VERSION.SDK_INT < MIN_API_VERSION && rs.isUseNative()) {
- throw new RSRuntimeException("ScriptGroup2 not supported in this API level");
- }
-
- mFP = FieldPacker.createFromArray(args);
-
- mArgs = args;
- mBindings = globals;
- mGlobalFuture = new HashMap<Script.FieldID, Future>();
-
- int numValues = globals.size();
-
- long[] fieldIDs = new long[numValues];
- long[] values = new long[numValues];
- int[] sizes = new int[numValues];
- long[] depClosures = new long[numValues];
- long[] depFieldIDs = new long[numValues];
-
- int i = 0;
- for (Map.Entry<Script.FieldID, Object> entry : globals.entrySet()) {
- Object obj = entry.getValue();
- Script.FieldID fieldID = entry.getKey();
- fieldIDs[i] = fieldID.getID(rs);
- retrieveValueAndDependenceInfo(rs, i, fieldID, obj, values,
- sizes, depClosures, depFieldIDs);
- i++;
- }
-
- long id = rs.nInvokeClosureCreate(invokeID.getID(rs), mFP.getData(), fieldIDs,
- values, sizes);
-
- setID(id);
- }
-
- private void retrieveValueAndDependenceInfo(RenderScript rs,
- int index, Script.FieldID fid, Object obj,
- long[] values, int[] sizes,
- long[] depClosures,
- long[] depFieldIDs) {
-
- if (obj instanceof Future) {
- Future f = (Future)obj;
- obj = f.getValue();
- depClosures[index] = f.getClosure().getID(rs);
- Script.FieldID fieldID = f.getFieldID();
- depFieldIDs[index] = fieldID != null ? fieldID.getID(rs) : 0;
- } else {
- depClosures[index] = 0;
- depFieldIDs[index] = 0;
- }
-
- if (obj instanceof Input) {
- Input unbound = (Input)obj;
- if (index < mArgs.length) {
- unbound.addReference(this, index);
- } else {
- unbound.addReference(this, fid);
- }
- values[index] = 0;
- sizes[index] = 0;
- } else {
- ValueAndSize vs = new ValueAndSize(rs, obj);
- values[index] = vs.value;
- sizes[index] = vs.size;
- }
- }
-
- /**
- * Returns the future for the return value
- *
- * @return a future
- */
-
- public Future getReturn() {
- if (mReturnFuture == null) {
- mReturnFuture = new Future(this, null, mReturnValue);
- }
-
- return mReturnFuture;
- }
-
- /**
- * Returns the future for a global variable
- *
- * @param field the field ID for the global variable
- * @return a future
- */
-
- public Future getGlobal(Script.FieldID field) {
- Future f = mGlobalFuture.get(field);
-
- if (f == null) {
- // If the field is not bound to this closure, this will return a future
- // without an associated value (reference). So this is not working for
- // cross-module (cross-script) linking in this case where a field not
- // explicitly bound.
- Object obj = mBindings.get(field);
- if (obj instanceof Future) {
- obj = ((Future)obj).getValue();
- }
- f = new Future(this, field, obj);
- mGlobalFuture.put(field, f);
- }
-
- return f;
- }
-
- void setArg(int index, Object obj) {
- if (obj instanceof Future) {
- obj = ((Future)obj).getValue();
- }
- mArgs[index] = obj;
- ValueAndSize vs = new ValueAndSize(mRS, obj);
- mRS.nClosureSetArg(getID(mRS), index, vs.value, vs.size);
- }
-
- void setGlobal(Script.FieldID fieldID, Object obj) {
- if (obj instanceof Future) {
- obj = ((Future)obj).getValue();
- }
- mBindings.put(fieldID, obj);
- ValueAndSize vs = new ValueAndSize(mRS, obj);
- mRS.nClosureSetGlobal(getID(mRS), fieldID.getID(mRS), vs.value, vs.size);
- }
-
- private static final class ValueAndSize {
- public ValueAndSize(RenderScript rs, Object obj) {
- if (obj instanceof Allocation) {
- value = ((Allocation)obj).getID(rs);
- size = -1;
- } else if (obj instanceof Boolean) {
- value = ((Boolean)obj).booleanValue() ? 1 : 0;
- size = 4;
- } else if (obj instanceof Integer) {
- value = ((Integer)obj).longValue();
- size = 4;
- } else if (obj instanceof Long) {
- value = ((Long)obj).longValue();
- size = 8;
- } else if (obj instanceof Float) {
- value = Float.floatToRawIntBits(((Float)obj).floatValue());
- size = 4;
- } else if (obj instanceof Double) {
- value = Double.doubleToRawLongBits(((Double)obj).doubleValue());
- size = 8;
- }
- }
- public long value;
- public int size;
- }
- }
-
- /**
- * An opaque class for futures
- * <p>
- * A future represents an output of a closure, either the return value of
- * the function, or the value of a global variable written by the function.
- * A future is created by calling the {@link Closure#getReturn} or
- * {@link Closure#getGlobal} method.
- */
-
- public static final class Future {
- Closure mClosure;
- Script.FieldID mFieldID;
- Object mValue;
-
- Future(Closure closure, Script.FieldID fieldID, Object value) {
- mClosure = closure;
- mFieldID = fieldID;
- mValue = value;
- }
-
- Closure getClosure() { return mClosure; }
- Script.FieldID getFieldID() { return mFieldID; }
- Object getValue() { return mValue; }
- }
-
- /**
- * An opaque class for unbound values (used for script group inputs)
- * <p>
- * Created by calling the {@link Builder2#addInput} method. The value
- * is assigned in {@link ScriptGroup#execute(Object...)} method as
- * one of its arguments. Arguments to the execute method should be in
- * the same order as intputs are added using the addInput method.
- */
-
- public static final class Input {
- // Either mFieldID or mArgIndex should be set but not both.
- List<Pair<Closure, Script.FieldID>> mFieldID;
- // -1 means unset. Legal values are 0 .. n-1, where n is the number of
- // arguments for the referencing closure.
- List<Pair<Closure, Integer>> mArgIndex;
- Object mValue;
-
- Input() {
- mFieldID = new ArrayList<Pair<Closure, Script.FieldID>>();
- mArgIndex = new ArrayList<Pair<Closure, Integer>>();
- }
-
- void addReference(Closure closure, int index) {
- mArgIndex.add(Pair.create(closure, Integer.valueOf(index)));
- }
-
- void addReference(Closure closure, Script.FieldID fieldID) {
- mFieldID.add(Pair.create(closure, fieldID));
- }
-
- void set(Object value) {
- mValue = value;
- for (Pair<Closure, Integer> p : mArgIndex) {
- Closure closure = p.first;
- int index = p.second.intValue();
- closure.setArg(index, value);
- }
- for (Pair<Closure, Script.FieldID> p : mFieldID) {
- Closure closure = p.first;
- Script.FieldID fieldID = p.second;
- closure.setGlobal(fieldID, value);
- }
- }
-
- Object get() { return mValue; }
- }
-
- private String mName;
- private List<Closure> mClosures;
- private List<Input> mInputs2;
- private Future[] mOutputs2;
-
- ScriptGroup(long id, RenderScript rs) {
- super(id, rs);
- }
-
- ScriptGroup(RenderScript rs, String name, List<Closure> closures,
- List<Input> inputs, Future[] outputs) {
- super(0, rs);
-
- if (android.os.Build.VERSION.SDK_INT < MIN_API_VERSION && rs.isUseNative()) {
- throw new RSRuntimeException("ScriptGroup2 not supported in this API level");
- }
- mName = name;
- mClosures = closures;
- mInputs2 = inputs;
- mOutputs2 = outputs;
-
- long[] closureIDs = new long[closures.size()];
- for (int i = 0; i < closureIDs.length; i++) {
- closureIDs[i] = closures.get(i).getID(rs);
- }
- String cachePath = rs.getApplicationContext().getCacheDir().toString();
- long id = rs.nScriptGroup2Create(name, cachePath, closureIDs);
- setID(id);
- }
-
- /**
- * Executes a script group
- *
- * @param inputs inputs to the script group
- * @return outputs of the script group as an array of objects
- */
-
- public Object[] execute(Object... inputs) {
- if (inputs.length < mInputs2.size()) {
- Log.e(TAG, this.toString() + " receives " + inputs.length + " inputs, " +
- "less than expected " + mInputs2.size());
- return null;
- }
-
- if (inputs.length > mInputs2.size()) {
- Log.i(TAG, this.toString() + " receives " + inputs.length + " inputs, " +
- "more than expected " + mInputs2.size());
- }
-
- for (int i = 0; i < mInputs2.size(); i++) {
- Object obj = inputs[i];
- if (obj instanceof Future || obj instanceof Input) {
- Log.e(TAG, this.toString() + ": input " + i +
- " is a future or unbound value");
- return null;
- }
- Input unbound = mInputs2.get(i);
- unbound.set(obj);
- }
-
- mRS.nScriptGroup2Execute(getID(mRS));
-
- Object[] outputObjs = new Object[mOutputs2.length];
- int i = 0;
- for (Future f : mOutputs2) {
- Object output = f.getValue();
- if (output instanceof Input) {
- output = ((Input)output).get();
- }
- outputObjs[i++] = output;
- }
- return outputObjs;
- }
-
- /**
- * Sets an input of the ScriptGroup. This specifies an
- * Allocation to be used for kernels that require an input
- * Allocation provided from outside of the ScriptGroup.
- *
- * @deprecated Set arguments to {@link #execute(Object...)} instead.
- *
- * @param s The ID of the kernel where the allocation should be
- * connected.
- * @param a The allocation to connect.
- */
- @Deprecated
- public void setInput(Script.KernelID s, Allocation a) {
- for (int ct=0; ct < mInputs.length; ct++) {
- if (mInputs[ct].mKID == s) {
- mInputs[ct].mAllocation = a;
- if (!mUseIncSupp) {
- mRS.nScriptGroupSetInput(getID(mRS), s.getID(mRS), mRS.safeID(a));
- }
- return;
- }
- }
- throw new RSIllegalArgumentException("Script not found");
- }
-
- /**
- * Sets an output of the ScriptGroup. This specifies an
- * Allocation to be used for the kernels that require an output
- * Allocation visible after the ScriptGroup is executed.
- *
- * @deprecated Use return value of {@link #execute(Object...)} instead.
- *
- * @param s The ID of the kernel where the allocation should be
- * connected.
- * @param a The allocation to connect.
- */
- @Deprecated
- public void setOutput(Script.KernelID s, Allocation a) {
- for (int ct=0; ct < mOutputs.length; ct++) {
- if (mOutputs[ct].mKID == s) {
- mOutputs[ct].mAllocation = a;
- if (!mUseIncSupp) {
- mRS.nScriptGroupSetOutput(getID(mRS), s.getID(mRS), mRS.safeID(a));
- }
- return;
- }
- }
- throw new RSIllegalArgumentException("Script not found");
- }
-
- /**
- * Execute the ScriptGroup. This will run all the kernels in
- * the ScriptGroup. No internal connection results will be visible
- * after execution of the ScriptGroup.
- *
- * If Incremental Support for intrinsics is needed, the execution
- * will take the naive path: execute kernels one by one in the
- * correct order.
- *
- * @deprecated Use {@link #execute} instead.
- */
- @Deprecated
- public void execute() {
- if (!mUseIncSupp) {
- mRS.nScriptGroupExecute(getID(mRS));
- } else {
- // setup the allocations.
- for (int ct=0; ct < mNodes.size(); ct++) {
- Node n = mNodes.get(ct);
- for (int ct2=0; ct2 < n.mOutputs.size(); ct2++) {
- ConnectLine l = n.mOutputs.get(ct2);
- if (l.mAllocation !=null) {
- continue;
- }
-
- //create allocation here
- Allocation alloc = Allocation.createTyped(mRS, l.mAllocationType,
- Allocation.MipmapControl.MIPMAP_NONE,
- Allocation.USAGE_SCRIPT);
-
- l.mAllocation = alloc;
- for (int ct3=ct2+1; ct3 < n.mOutputs.size(); ct3++) {
- if (n.mOutputs.get(ct3).mFrom == l.mFrom) {
- n.mOutputs.get(ct3).mAllocation = alloc;
- }
- }
- }
- }
- for (Node node : mNodes) {
- for (Script.KernelID kernel : node.mKernels) {
- Allocation ain = null;
- Allocation aout = null;
-
- for (ConnectLine nodeInput : node.mInputs) {
- if (nodeInput.mToK == kernel) {
- ain = nodeInput.mAllocation;
- }
- }
-
- for (IO sgInput : mInputs) {
- if (sgInput.mKID == kernel) {
- ain = sgInput.mAllocation;
- }
- }
-
- for (ConnectLine nodeOutput : node.mOutputs) {
- if (nodeOutput.mFrom == kernel) {
- aout = nodeOutput.mAllocation;
- }
- }
-
- for (IO sgOutput : mOutputs) {
- if (sgOutput.mKID == kernel) {
- aout = sgOutput.mAllocation;
- }
- }
-
- kernel.mScript.forEach(kernel.mSlot, ain, aout, null);
- }
- }
- }
- }
-
-
- /**
- * Helper class to build a ScriptGroup. A ScriptGroup is
- * created in two steps.
- * <p>
- * First, all kernels to be used by the ScriptGroup should be added.
- * <p>
- * Second, add connections between kernels. There are two types
- * of connections: kernel to kernel and kernel to field.
- * Kernel to kernel allows a kernel's output to be passed to
- * another kernel as input. Kernel to field allows the output of
- * one kernel to be bound as a script global. Kernel to kernel is
- * higher performance and should be used where possible.
- * <p>
- * A ScriptGroup must contain a single directed acyclic graph (DAG); it
- * cannot contain cycles. Currently, all kernels used in a ScriptGroup
- * must come from different Script objects. Additionally, all kernels
- * in a ScriptGroup must have at least one input, output, or internal
- * connection.
- * <p>
- * Once all connections are made, a call to {@link #create} will
- * return the ScriptGroup object.
- *
- * @deprecated Use {@link Builder2} instead.
- *
- */
- @Deprecated
- public static final class Builder {
- private RenderScript mRS;
- private ArrayList<Node> mNodes = new ArrayList<Node>();
- private ArrayList<ConnectLine> mLines = new ArrayList<ConnectLine>();
- private int mKernelCount;
- private boolean mUseIncSupp = false;
-
- /**
- * Create a Builder for generating a ScriptGroup.
- *
- *
- * @param rs The RenderScript context.
- */
- public Builder(RenderScript rs) {
- mRS = rs;
- }
-
- // do a DFS from original node, looking for original node
- // any cycle that could be created must contain original node
- private void validateCycle(Node target, Node original) {
- for (int ct = 0; ct < target.mOutputs.size(); ct++) {
- final ConnectLine cl = target.mOutputs.get(ct);
- if (cl.mToK != null) {
- Node tn = findNode(cl.mToK.mScript);
- if (tn.equals(original)) {
- throw new RSInvalidStateException("Loops in group not allowed.");
- }
- validateCycle(tn, original);
- }
- if (cl.mToF != null) {
- Node tn = findNode(cl.mToF.mScript);
- if (tn.equals(original)) {
- throw new RSInvalidStateException("Loops in group not allowed.");
- }
- validateCycle(tn, original);
- }
- }
- }
-
- private void mergeDAGs(int valueUsed, int valueKilled) {
- for (int ct=0; ct < mNodes.size(); ct++) {
- if (mNodes.get(ct).dagNumber == valueKilled)
- mNodes.get(ct).dagNumber = valueUsed;
- }
- }
-
- private void validateDAGRecurse(Node n, int dagNumber) {
- // combine DAGs if this node has been seen already
- if (n.dagNumber != 0 && n.dagNumber != dagNumber) {
- mergeDAGs(n.dagNumber, dagNumber);
- return;
- }
-
- n.dagNumber = dagNumber;
- for (int ct=0; ct < n.mOutputs.size(); ct++) {
- final ConnectLine cl = n.mOutputs.get(ct);
- if (cl.mToK != null) {
- Node tn = findNode(cl.mToK.mScript);
- validateDAGRecurse(tn, dagNumber);
- }
- if (cl.mToF != null) {
- Node tn = findNode(cl.mToF.mScript);
- validateDAGRecurse(tn, dagNumber);
- }
- }
- }
-
- private void validateDAG() {
- for (int ct=0; ct < mNodes.size(); ct++) {
- Node n = mNodes.get(ct);
- if (n.mInputs.size() == 0) {
- if (n.mOutputs.size() == 0 && mNodes.size() > 1) {
- String msg = "Groups cannot contain unconnected scripts";
- throw new RSInvalidStateException(msg);
- }
- validateDAGRecurse(n, ct+1);
- }
- }
- int dagNumber = mNodes.get(0).dagNumber;
- for (int ct=0; ct < mNodes.size(); ct++) {
- if (mNodes.get(ct).dagNumber != dagNumber) {
- throw new RSInvalidStateException("Multiple DAGs in group not allowed.");
- }
- }
- }
-
- private Node findNode(Script s) {
- for (int ct=0; ct < mNodes.size(); ct++) {
- if (s == mNodes.get(ct).mScript) {
- return mNodes.get(ct);
- }
- }
- return null;
- }
-
- private Node findNode(Script.KernelID k) {
- for (int ct=0; ct < mNodes.size(); ct++) {
- Node n = mNodes.get(ct);
- for (int ct2=0; ct2 < n.mKernels.size(); ct2++) {
- if (k == n.mKernels.get(ct2)) {
- return n;
- }
- }
- }
- return null;
- }
-
- /**
- * Adds a Kernel to the group.
- *
- *
- * @param k The kernel to add.
- *
- * @return Builder Returns this.
- */
- public Builder addKernel(Script.KernelID k) {
- if (mLines.size() != 0) {
- throw new RSInvalidStateException(
- "Kernels may not be added once connections exist.");
- }
- if (k.mScript.isIncSupp()) {
- mUseIncSupp = true;
- }
- //android.util.Log.v("RSR", "addKernel 1 k=" + k);
- if (findNode(k) != null) {
- return this;
- }
- //android.util.Log.v("RSR", "addKernel 2 ");
- mKernelCount++;
- Node n = findNode(k.mScript);
- if (n == null) {
- //android.util.Log.v("RSR", "addKernel 3 ");
- n = new Node(k.mScript);
- mNodes.add(n);
- }
- n.mKernels.add(k);
- return this;
- }
-
- /**
- * Adds a connection to the group.
- *
- *
- * @param t The type of the connection. This is used to
- * determine the kernel launch sizes on the source side
- * of this connection.
- * @param from The source for the connection.
- * @param to The destination of the connection.
- *
- * @return Builder Returns this
- */
- public Builder addConnection(Type t, Script.KernelID from, Script.FieldID to) {
- //android.util.Log.v("RSR", "addConnection " + t +", " + from + ", " + to);
- Node nf = findNode(from);
- if (nf == null) {
- throw new RSInvalidStateException("From script not found.");
- }
-
- Node nt = findNode(to.mScript);
- if (nt == null) {
- throw new RSInvalidStateException("To script not found.");
- }
-
- ConnectLine cl = new ConnectLine(t, from, to);
- mLines.add(new ConnectLine(t, from, to));
-
- nf.mOutputs.add(cl);
- nt.mInputs.add(cl);
-
- validateCycle(nf, nf);
- return this;
- }
-
- /**
- * Adds a connection to the group.
- *
- *
- * @param t The type of the connection. This is used to
- * determine the kernel launch sizes for both sides of
- * this connection.
- * @param from The source for the connection.
- * @param to The destination of the connection.
- *
- * @return Builder Returns this
- */
- public Builder addConnection(Type t, Script.KernelID from, Script.KernelID to) {
- //android.util.Log.v("RSR", "addConnection " + t +", " + from + ", " + to);
- Node nf = findNode(from);
- if (nf == null) {
- throw new RSInvalidStateException("From script not found.");
- }
-
- Node nt = findNode(to);
- if (nt == null) {
- throw new RSInvalidStateException("To script not found.");
- }
-
- ConnectLine cl = new ConnectLine(t, from, to);
- mLines.add(new ConnectLine(t, from, to));
-
- nf.mOutputs.add(cl);
- nt.mInputs.add(cl);
-
- validateCycle(nf, nf);
- return this;
- }
-
- /**
- * Calculate the order of each node.
- *
- *
- * @return Success or Fail
- */
- private boolean calcOrderRecurse(Node node0, int depth) {
- node0.mSeen = true;
- if (node0.mOrder < depth) {
- node0.mOrder = depth;
- }
- boolean ret = true;
-
- for (ConnectLine link : node0.mOutputs) {
- Node node1 = null;
- if (link.mToF != null) {
- node1 = findNode(link.mToF.mScript);
- } else {
- node1 = findNode(link.mToK.mScript);
- }
- if (node1.mSeen) {
- return false;
- }
- ret &= calcOrderRecurse(node1, node0.mOrder + 1);
- }
-
- return ret;
- }
-
- private boolean calcOrder() {
- boolean ret = true;
- for (Node n0 : mNodes) {
- if (n0.mInputs.size() == 0) {
- for (Node n1 : mNodes) {
- n1.mSeen = false;
- }
- ret &= calcOrderRecurse(n0, 1);
- }
- }
-
- Collections.sort(mNodes, new Comparator<Node>() {
- public int compare(Node n1, Node n2) {
- return n1.mOrder - n2.mOrder;
- }
- });
-
- return ret;
- }
-
- /**
- * Creates the Script group.
- *
- *
- * @return ScriptGroup The new ScriptGroup
- */
- public ScriptGroup create() {
-
- if (mNodes.size() == 0) {
- throw new RSInvalidStateException("Empty script groups are not allowed");
- }
-
- // reset DAG numbers in case we're building a second group
- for (int ct=0; ct < mNodes.size(); ct++) {
- mNodes.get(ct).dagNumber = 0;
- }
- validateDAG();
-
- ArrayList<IO> inputs = new ArrayList<IO>();
- ArrayList<IO> outputs = new ArrayList<IO>();
-
- long[] kernels = new long[mKernelCount];
- int idx = 0;
- for (int ct=0; ct < mNodes.size(); ct++) {
- Node n = mNodes.get(ct);
- for (int ct2=0; ct2 < n.mKernels.size(); ct2++) {
- final Script.KernelID kid = n.mKernels.get(ct2);
- kernels[idx++] = kid.getID(mRS);
-
- boolean hasInput = false;
- boolean hasOutput = false;
- for (int ct3=0; ct3 < n.mInputs.size(); ct3++) {
- if (n.mInputs.get(ct3).mToK == kid) {
- hasInput = true;
- }
- }
- for (int ct3=0; ct3 < n.mOutputs.size(); ct3++) {
- if (n.mOutputs.get(ct3).mFrom == kid) {
- hasOutput = true;
- }
- }
- if (!hasInput) {
- inputs.add(new IO(kid));
- }
- if (!hasOutput) {
- outputs.add(new IO(kid));
- }
- }
- }
- if (idx != mKernelCount) {
- throw new RSRuntimeException("Count mismatch, should not happen.");
- }
-
- long id = 0;
- if (!mUseIncSupp) {
- long[] src = new long[mLines.size()];
- long[] dstk = new long[mLines.size()];
- long[] dstf = new long[mLines.size()];
- long[] types = new long[mLines.size()];
-
- for (int ct=0; ct < mLines.size(); ct++) {
- ConnectLine cl = mLines.get(ct);
- src[ct] = cl.mFrom.getID(mRS);
- if (cl.mToK != null) {
- dstk[ct] = cl.mToK.getID(mRS);
- }
- if (cl.mToF != null) {
- dstf[ct] = cl.mToF.getID(mRS);
- }
- types[ct] = cl.mAllocationType.getID(mRS);
- }
- id = mRS.nScriptGroupCreate(kernels, src, dstk, dstf, types);
- if (id == 0) {
- throw new RSRuntimeException("Object creation error, should not happen.");
- }
- } else {
- //Calculate the order of the DAG so that script can run one after another.
- calcOrder();
- }
-
- ScriptGroup sg = new ScriptGroup(id, mRS);
- sg.mOutputs = new IO[outputs.size()];
- for (int ct=0; ct < outputs.size(); ct++) {
- sg.mOutputs[ct] = outputs.get(ct);
- }
-
- sg.mInputs = new IO[inputs.size()];
- for (int ct=0; ct < inputs.size(); ct++) {
- sg.mInputs[ct] = inputs.get(ct);
- }
- sg.mNodes = mNodes;
- sg.mUseIncSupp = mUseIncSupp;
- return sg;
- }
-
- }
-
- /**
- * Represents a binding of a value to a global variable in a
- * kernel or invocable function. Used in closure creation.
- */
-
- public static final class Binding {
- private final Script.FieldID mField;
- private final Object mValue;
-
- /**
- * Returns a Binding object that binds value to field
- *
- * @param field the Script.FieldID of the global variable
- * @param value the value
- */
-
- public Binding(Script.FieldID field, Object value) {
- mField = field;
- mValue = value;
- }
-
- /**
- * Returns the field ID
- */
-
- public Script.FieldID getField() { return mField; }
-
- /**
- * Returns the value
- */
-
- public Object getValue() { return mValue; }
- }
-
- /**
- * The builder class for creating script groups
- * <p>
- * A script group is created using closures (see class {@link Closure}).
- * A closure is a function call to a kernel or
- * invocable function. Each function argument or global variable accessed inside
- * the function is bound to 1) a known value, 2) a script group input
- * (see class {@link Input}), or 3) a
- * future (see class {@link Future}).
- * A future is the output of a closure, either the return value of the
- * function or a global variable written by that function.
- * <p>
- * Closures are created using the {@link #addKernel} or {@link #addInvoke}
- * methods.
- * When a closure is created, futures from previously created closures
- * can be used as its inputs.
- * External script group inputs can be used as inputs to individual closures as well.
- * An external script group input is created using the {@link #addInput} method.
- * A script group is created by a call to the {@link #create} method, which
- * accepts an array of futures as the outputs for the script group.
- * <p>
- * Closures in a script group can be evaluated in any order as long as the
- * following conditions are met:
- * 1) a closure must be evaluated before any other closures that take its
- * futures as inputs;
- * 2) all closures added before an invoke closure must be evaluated
- * before it;
- * and 3) all closures added after an invoke closure must be evaluated after
- * it.
- * As a special case, the order that the closures are added is a legal
- * evaluation order. However, other evaluation orders are possible, including
- * concurrently evaluating independent closures.
- */
-
- public static final class Builder2 {
- RenderScript mRS;
- List<Closure> mClosures;
- List<Input> mInputs;
- private static final String TAG = "ScriptGroup.Builder2";
-
- /**
- * Returns a Builder object
- *
- * @param rs the RenderScript context
- */
- public Builder2(RenderScript rs) {
- mRS = rs;
- mClosures = new ArrayList<Closure>();
- mInputs = new ArrayList<Input>();
- }
-
- /**
- * Adds a closure for a kernel
- *
- * @param k Kernel ID for the kernel function
- * @param returnType Allocation type for the return value
- * @param args arguments to the kernel function
- * @param globalBindings bindings for global variables
- * @return a closure
- */
-
- private Closure addKernelInternal(Script.KernelID k, Type returnType, Object[] args,
- Map<Script.FieldID, Object> globalBindings) {
- Closure c = new Closure(mRS, k, returnType, args, globalBindings);
- mClosures.add(c);
- return c;
- }
-
- /**
- * Adds a closure for an invocable function
- *
- * @param invoke Invoke ID for the invocable function
- * @param args arguments to the invocable function
- * @param globalBindings bindings for global variables
- * @return a closure
- */
-
- private Closure addInvokeInternal(Script.InvokeID invoke, Object[] args,
- Map<Script.FieldID, Object> globalBindings) {
- Closure c = new Closure(mRS, invoke, args, globalBindings);
- mClosures.add(c);
- return c;
- }
-
- /**
- * Adds a script group input
- *
- * @return a script group input, which can be used as an argument or a value to
- * a global variable for creating closures
- */
-
- public Input addInput() {
- Input unbound = new Input();
- mInputs.add(unbound);
- return unbound;
- }
-
- /**
- * Adds a closure for a kernel
- *
- * @param k Kernel ID for the kernel function
- * @param argsAndBindings arguments followed by bindings for global variables
- * @return a closure
- */
-
- public Closure addKernel(Script.KernelID k, Type returnType, Object... argsAndBindings) {
- ArrayList<Object> args = new ArrayList<Object>();
- Map<Script.FieldID, Object> bindingMap = new HashMap<Script.FieldID, Object>();
- if (!seperateArgsAndBindings(argsAndBindings, args, bindingMap)) {
- return null;
- }
- return addKernelInternal(k, returnType, args.toArray(), bindingMap);
- }
-
- /**
- * Adds a closure for an invocable function
- *
- * @param invoke Invoke ID for the invocable function
- * @param argsAndBindings arguments followed by bindings for global variables
- * @return a closure
- */
-
- public Closure addInvoke(Script.InvokeID invoke, Object... argsAndBindings) {
- ArrayList<Object> args = new ArrayList<Object>();
- Map<Script.FieldID, Object> bindingMap = new HashMap<Script.FieldID, Object>();
- if (!seperateArgsAndBindings(argsAndBindings, args, bindingMap)) {
- return null;
- }
- return addInvokeInternal(invoke, args.toArray(), bindingMap);
- }
-
- /**
- * Creates a script group
- *
- * @param name name for the script group. Legal names can only contain letters, digits,
- * '-', or '_'. The name can be no longer than 100 characters.
- * @param outputs futures intended as outputs of the script group
- * @return a script group
- */
-
- public ScriptGroup create(String name, Future... outputs) {
- if (name == null || name.isEmpty() || name.length() > 100 ||
- !name.equals(name.replaceAll("[^a-zA-Z0-9-]", "_"))) {
- throw new RSIllegalArgumentException("invalid script group name");
- }
- ScriptGroup ret = new ScriptGroup(mRS, name, mClosures, mInputs, outputs);
- return ret;
- }
-
- private boolean seperateArgsAndBindings(Object[] argsAndBindings,
- ArrayList<Object> args,
- Map<Script.FieldID, Object> bindingMap) {
- int i;
- for (i = 0; i < argsAndBindings.length; i++) {
- if (argsAndBindings[i] instanceof Binding) {
- break;
- }
- args.add(argsAndBindings[i]);
- }
-
- for (; i < argsAndBindings.length; i++) {
- if (!(argsAndBindings[i] instanceof Binding)) {
- return false;
- }
- Binding b = (Binding)argsAndBindings[i];
- bindingMap.put(b.getField(), b.getValue());
- }
-
- return true;
- }
-
- }
-
-}
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsic.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsic.java
deleted file mode 100644
index e59cf6d..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsic.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-/**
- * Base class for all Intrinsic scripts. An intrinsic a script
- * which implements a pre-defined function. Intrinsics are
- * provided to provide effecient implemtations of common
- * operations.
- *
- * Not intended for direct use.
- **/
-public abstract class ScriptIntrinsic extends Script {
- ScriptIntrinsic(long id, RenderScript rs) {
- super(id, rs);
- if (id == 0) {
- throw new RSRuntimeException("Loading of ScriptIntrinsic failed.");
- }
- }
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsic3DLUT.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsic3DLUT.java
deleted file mode 100644
index 7fc71f3..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsic3DLUT.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- *
- * Intrinsic for converting RGB to RGBA by using a 3D lookup table. The
- * incoming r,g,b values are use as normalized x,y,z coordinates into a 3D
- * allocation. The 8 nearest values are sampled and linearly interpolated. The
- * result is placed in the output.
- *
- **/
-public class ScriptIntrinsic3DLUT extends ScriptIntrinsic {
- private Allocation mLUT;
- private Element mElement;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- protected ScriptIntrinsic3DLUT(long id, RenderScript rs, Element e) {
- super(id, rs);
- mElement = e;
- }
-
- /**
- * Supported elements types are {@link Element#U8_4}
- *
- * The defaults tables are identity.
- *
- * @param rs The RenderScript context
- * @param e Element type for intputs and outputs
- *
- * @return ScriptIntrinsic3DLUT
- */
- public static ScriptIntrinsic3DLUT create(RenderScript rs, Element e) {
- if (!e.isCompatible(Element.U8_4(rs))) {
- throw new RSIllegalArgumentException("Element must be compatible with uchar4.");
- }
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(8, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsic3DLUT si = new ScriptIntrinsic3DLUT(id, rs, e);
- si.setIncSupp(mUseIncSupp);
- return si;
- }
-
- /**
- * Sets the {@link android.support.v8.renderscript.Allocation} to be used as
- * the lookup table.
- *
- * The lookup table must use the same
- * {@link android.support.v8.renderscript.Element} as the intrinsic.
- *
- */
-
- public void setLUT(Allocation lut) {
- final Type t = lut.getType();
-
- if (t.getZ() == 0) {
- throw new RSIllegalArgumentException("LUT must be 3d.");
- }
-
- if (!t.getElement().isCompatible(mElement)) {
- throw new RSIllegalArgumentException("LUT element type must match.");
- }
-
- mLUT = lut;
- setVar(0, mLUT);
- }
-
-
- /**
- * Invoke the kernel and apply the lookup to each cell of ain
- * and copy to aout.
- *
- * @param ain Input allocation
- * @param aout Output allocation
- */
- public void forEach(Allocation ain, Allocation aout) {
- forEach(0, ain, aout, null);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 3, null, null);
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBLAS.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBLAS.java
deleted file mode 100644
index fe32989..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBLAS.java
+++ /dev/null
@@ -1,4190 +0,0 @@
-/*
- * Copyright (C) 2015 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.support.annotation.IntDef;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- *
- * ScriptIntrinsicBLAS class provides high performance RenderScript APIs to BLAS.
- *
- * The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard
- * building blocks for performing basic vector and matrix operations.
- *
- * For detailed description of BLAS, please refer to http://www.netlib.org/blas/
- *
- **/
-public final class ScriptIntrinsicBLAS extends ScriptIntrinsic {
- private Allocation mLUT;
- private static final int INTRINSIC_API_LEVEL = 23;
-
- private ScriptIntrinsicBLAS(long id, RenderScript rs) {
- super(id, rs);
- }
-
- private static final int RsBlas_sdsdot = 1;
- private static final int RsBlas_dsdot = 2;
- private static final int RsBlas_sdot = 3;
- private static final int RsBlas_ddot = 4;
- private static final int RsBlas_cdotu_sub = 5;
- private static final int RsBlas_cdotc_sub = 6;
- private static final int RsBlas_zdotu_sub = 7;
- private static final int RsBlas_zdotc_sub = 8;
- private static final int RsBlas_snrm2 = 9;
- private static final int RsBlas_sasum = 10;
- private static final int RsBlas_dnrm2 = 11;
- private static final int RsBlas_dasum = 12;
- private static final int RsBlas_scnrm2 = 13;
- private static final int RsBlas_scasum = 14;
- private static final int RsBlas_dznrm2 = 15;
- private static final int RsBlas_dzasum = 16;
- private static final int RsBlas_isamax = 17;
- private static final int RsBlas_idamax = 18;
- private static final int RsBlas_icamax = 19;
- private static final int RsBlas_izamax = 20;
- private static final int RsBlas_sswap = 21;
- private static final int RsBlas_scopy = 22;
- private static final int RsBlas_saxpy = 23;
- private static final int RsBlas_dswap = 24;
- private static final int RsBlas_dcopy = 25;
- private static final int RsBlas_daxpy = 26;
- private static final int RsBlas_cswap = 27;
- private static final int RsBlas_ccopy = 28;
- private static final int RsBlas_caxpy = 29;
- private static final int RsBlas_zswap = 30;
- private static final int RsBlas_zcopy = 31;
- private static final int RsBlas_zaxpy = 32;
- private static final int RsBlas_srotg = 33;
- private static final int RsBlas_srotmg = 34;
- private static final int RsBlas_srot = 35;
- private static final int RsBlas_srotm = 36;
- private static final int RsBlas_drotg = 37;
- private static final int RsBlas_drotmg = 38;
- private static final int RsBlas_drot = 39;
- private static final int RsBlas_drotm = 40;
- private static final int RsBlas_sscal = 41;
- private static final int RsBlas_dscal = 42;
- private static final int RsBlas_cscal = 43;
- private static final int RsBlas_zscal = 44;
- private static final int RsBlas_csscal = 45;
- private static final int RsBlas_zdscal = 46;
- private static final int RsBlas_sgemv = 47;
- private static final int RsBlas_sgbmv = 48;
- private static final int RsBlas_strmv = 49;
- private static final int RsBlas_stbmv = 50;
- private static final int RsBlas_stpmv = 51;
- private static final int RsBlas_strsv = 52;
- private static final int RsBlas_stbsv = 53;
- private static final int RsBlas_stpsv = 54;
- private static final int RsBlas_dgemv = 55;
- private static final int RsBlas_dgbmv = 56;
- private static final int RsBlas_dtrmv = 57;
- private static final int RsBlas_dtbmv = 58;
- private static final int RsBlas_dtpmv = 59;
- private static final int RsBlas_dtrsv = 60;
- private static final int RsBlas_dtbsv = 61;
- private static final int RsBlas_dtpsv = 62;
- private static final int RsBlas_cgemv = 63;
- private static final int RsBlas_cgbmv = 64;
- private static final int RsBlas_ctrmv = 65;
- private static final int RsBlas_ctbmv = 66;
- private static final int RsBlas_ctpmv = 67;
- private static final int RsBlas_ctrsv = 68;
- private static final int RsBlas_ctbsv = 69;
- private static final int RsBlas_ctpsv = 70;
- private static final int RsBlas_zgemv = 71;
- private static final int RsBlas_zgbmv = 72;
- private static final int RsBlas_ztrmv = 73;
- private static final int RsBlas_ztbmv = 74;
- private static final int RsBlas_ztpmv = 75;
- private static final int RsBlas_ztrsv = 76;
- private static final int RsBlas_ztbsv = 77;
- private static final int RsBlas_ztpsv = 78;
- private static final int RsBlas_ssymv = 79;
- private static final int RsBlas_ssbmv = 80;
- private static final int RsBlas_sspmv = 81;
- private static final int RsBlas_sger = 82;
- private static final int RsBlas_ssyr = 83;
- private static final int RsBlas_sspr = 84;
- private static final int RsBlas_ssyr2 = 85;
- private static final int RsBlas_sspr2 = 86;
- private static final int RsBlas_dsymv = 87;
- private static final int RsBlas_dsbmv = 88;
- private static final int RsBlas_dspmv = 89;
- private static final int RsBlas_dger = 90;
- private static final int RsBlas_dsyr = 91;
- private static final int RsBlas_dspr = 92;
- private static final int RsBlas_dsyr2 = 93;
- private static final int RsBlas_dspr2 = 94;
- private static final int RsBlas_chemv = 95;
- private static final int RsBlas_chbmv = 96;
- private static final int RsBlas_chpmv = 97;
- private static final int RsBlas_cgeru = 98;
- private static final int RsBlas_cgerc = 99;
- private static final int RsBlas_cher = 100;
- private static final int RsBlas_chpr = 101;
- private static final int RsBlas_cher2 = 102;
- private static final int RsBlas_chpr2 = 103;
- private static final int RsBlas_zhemv = 104;
- private static final int RsBlas_zhbmv = 105;
- private static final int RsBlas_zhpmv = 106;
- private static final int RsBlas_zgeru = 107;
- private static final int RsBlas_zgerc = 108;
- private static final int RsBlas_zher = 109;
- private static final int RsBlas_zhpr = 110;
- private static final int RsBlas_zher2 = 111;
- private static final int RsBlas_zhpr2 = 112;
- private static final int RsBlas_sgemm = 113;
- private static final int RsBlas_ssymm = 114;
- private static final int RsBlas_ssyrk = 115;
- private static final int RsBlas_ssyr2k = 116;
- private static final int RsBlas_strmm = 117;
- private static final int RsBlas_strsm = 118;
- private static final int RsBlas_dgemm = 119;
- private static final int RsBlas_dsymm = 120;
- private static final int RsBlas_dsyrk = 121;
- private static final int RsBlas_dsyr2k = 122;
- private static final int RsBlas_dtrmm = 123;
- private static final int RsBlas_dtrsm = 124;
- private static final int RsBlas_cgemm = 125;
- private static final int RsBlas_csymm = 126;
- private static final int RsBlas_csyrk = 127;
- private static final int RsBlas_csyr2k = 128;
- private static final int RsBlas_ctrmm = 129;
- private static final int RsBlas_ctrsm = 130;
- private static final int RsBlas_zgemm = 131;
- private static final int RsBlas_zsymm = 132;
- private static final int RsBlas_zsyrk = 133;
- private static final int RsBlas_zsyr2k = 134;
- private static final int RsBlas_ztrmm = 135;
- private static final int RsBlas_ztrsm = 136;
- private static final int RsBlas_chemm = 137;
- private static final int RsBlas_cherk = 138;
- private static final int RsBlas_cher2k = 139;
- private static final int RsBlas_zhemm = 140;
- private static final int RsBlas_zherk = 141;
- private static final int RsBlas_zher2k = 142;
-
- // BLAS extensions start here
- private static final int RsBlas_bnnm = 1000;
-
- /**
- * Create an intrinsic to access BLAS subroutines.
- *
- * @param rs The RenderScript context
- * @return ScriptIntrinsicBLAS
- */
- public static ScriptIntrinsicBLAS create(RenderScript rs) {
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(13, Element.U32(rs).getID(rs), mUseIncSupp);
- ScriptIntrinsicBLAS si = new ScriptIntrinsicBLAS(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
- }
-
- /**
- * @hide
- */
- @IntDef({NO_TRANSPOSE, TRANSPOSE, CONJ_TRANSPOSE})
- @Retention(RetentionPolicy.SOURCE)
- public @interface Transpose {}
-
- /**
- * @hide
- */
- @IntDef({UPPER, LOWER})
- @Retention(RetentionPolicy.SOURCE)
- public @interface Uplo {}
-
- /**
- * @hide
- */
- @IntDef({NON_UNIT, UNIT})
- @Retention(RetentionPolicy.SOURCE)
- public @interface Diag {}
-
- /**
- * @hide
- */
- @IntDef({LEFT, RIGHT})
- @Retention(RetentionPolicy.SOURCE)
- public @interface Side {}
-
- public static final int NO_TRANSPOSE = 111;
- public static final int TRANSPOSE = 112;
- public static final int CONJ_TRANSPOSE = 113;
-
- public static final int UPPER = 121;
- public static final int LOWER = 122;
-
- public static final int NON_UNIT = 131;
- public static final int UNIT = 132;
-
- public static final int LEFT = 141;
- public static final int RIGHT = 142;
-
- static void validateSide(@Side int Side) {
- if (Side != LEFT && Side != RIGHT) {
- throw new RSRuntimeException("Invalid side passed to BLAS");
- }
- }
-
- static void validateTranspose(@Transpose int Trans) {
- if (Trans != NO_TRANSPOSE && Trans != TRANSPOSE &&
- Trans != CONJ_TRANSPOSE) {
- throw new RSRuntimeException("Invalid transpose passed to BLAS");
- }
- }
-
- static void validateConjTranspose(@Transpose int Trans) {
- if (Trans != NO_TRANSPOSE &&
- Trans != CONJ_TRANSPOSE) {
- throw new RSRuntimeException("Invalid transpose passed to BLAS");
- }
- }
-
- static void validateDiag(@Diag int Diag) {
- if (Diag != NON_UNIT && Diag != UNIT) {
- throw new RSRuntimeException("Invalid diag passed to BLAS");
- }
- }
-
- static void validateUplo(@Uplo int Uplo) {
- if (Uplo != UPPER && Uplo != LOWER) {
- throw new RSRuntimeException("Invalid uplo passed to BLAS");
- }
- }
-
-
- /**
- * Level 2 BLAS
- */
-
- static void validateGEMV(Element e, int TransA, Allocation A, Allocation X, int incX, Allocation Y, int incY) {
- validateTranspose(TransA);
- int M = A.getType().getY();
- int N = A.getType().getX();
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = -1, expectedYDim = -1;
- if (TransA == NO_TRANSPOSE) {
- expectedXDim = 1 + (N - 1) * incX;
- expectedYDim = 1 + (M - 1) * incY;
- } else {
- expectedXDim = 1 + (M - 1) * incX;
- expectedYDim = 1 + (N - 1) * incY;
- }
- if (X.getType().getX() != expectedXDim ||
- Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for GEMV");
- }
- }
-
- /**
- * SGEMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d58/sgemv_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void SGEMV(@Transpose int TransA, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) {
- validateGEMV(Element.F32(mRS), TransA, A, X, incX, Y, incY);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha, aID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DGEMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/dc/da8/dgemv_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void DGEMV(@Transpose int TransA, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) {
- validateGEMV(Element.F64(mRS), TransA, A, X, incX, Y, incY);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha, aID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CGEMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/d8a/cgemv_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void CGEMV(@Transpose int TransA, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) {
- validateGEMV(Element.F32_2(mRS), TransA, A, X, incX, Y, incY);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZGEMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d40/zgemv_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void ZGEMV(@Transpose int TransA, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) {
- validateGEMV(Element.F64_2(mRS), TransA, A, X, incX, Y, incY);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgemv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * SGBMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/d46/sgbmv_8f.html
- *
- * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N),
- * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an
- * example showing how to convert the original matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, m):
- * for j in range(max(0, i-kl), min(i+ku+1, n)):
- * b[i, j-i+kl] = a[i, j]
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param KL The number of sub-diagonals of the matrix A.
- * @param KU The number of super-diagonals of the matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void SGBMV(@Transpose int TransA, int KL, int KU, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) {
- // GBMV has the same validation requirements as GEMV + KL and KU >= 0
- validateGEMV(Element.F32(mRS), TransA, A, X, incX, Y, incY);
- if (KL < 0 || KU < 0) {
- throw new RSRuntimeException("KL and KU must be greater than or equal to 0");
- }
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha, aID, xID, beta, yID, incX, incY, KL, KU, mUseIncSupp);
- }
-
- /**
- * DGBMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d2/d3f/dgbmv_8f.html
- *
- * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N),
- * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an
- * example showing how to convert the original matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, m):
- * for j in range(max(0, i-kl), min(i+ku+1, n)):
- * b[i, j-i+kl] = a[i, j]
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param KL The number of sub-diagonals of the matrix A.
- * @param KU The number of super-diagonals of the matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void DGBMV(@Transpose int TransA, int KL, int KU, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) {
- // GBMV has the same validation requirements as GEMV + KL and KU >= 0
- validateGEMV(Element.F64(mRS), TransA, A, X, incX, Y, incY);
- if (KL < 0 || KU < 0) {
- throw new RSRuntimeException("KL and KU must be greater than or equal to 0");
- }
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha, aID, xID, beta, yID, incX, incY, KL, KU, mUseIncSupp);
- }
-
- /**
- * CGBMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/d75/cgbmv_8f.html
- *
- * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N),
- * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an
- * example showing how to convert the original matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, m):
- * for j in range(max(0, i-kl), min(i+ku+1, n)):
- * b[i, j-i+kl] = a[i, j]
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param KL The number of sub-diagonals of the matrix A.
- * @param KU The number of super-diagonals of the matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void CGBMV(@Transpose int TransA, int KL, int KU, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) {
- // GBMV has the same validation requirements as GEMV + KL and KU >= 0
- validateGEMV(Element.F32_2(mRS), TransA, A, X, incX, Y, incY);
- if (KL < 0 || KU < 0) {
- throw new RSRuntimeException("KL and KU must be greater than or equal to 0");
- }
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, KL, KU, mUseIncSupp);
- }
-
- /**
- * ZGBMV performs one of the matrix-vector operations
- * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d9/d46/zgbmv_8f.html
- *
- * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N),
- * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an
- * example showing how to convert the original matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, m):
- * for j in range(max(0, i-kl), min(i+ku+1, n)):
- * b[i, j-i+kl] = a[i, j]
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param KL The number of sub-diagonals of the matrix A.
- * @param KU The number of super-diagonals of the matrix A.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains the band matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void ZGBMV(@Transpose int TransA, int KL, int KU, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) {
- // GBMV has the same validation requirements as GEMV + KL and KU >= 0
- validateGEMV(Element.F64_2(mRS), TransA, A, X, incX, Y, incY);
- if (KL < 0 || KU < 0) {
- throw new RSRuntimeException("KL and KU must be greater than or equal to 0");
- }
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgbmv, TransA, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, KL, KU, mUseIncSupp);
- }
-
- static void validateTRMV(Element e, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- validateTranspose(TransA);
- validateUplo(Uplo);
- validateDiag(Diag);
- int N = A.getType().getY();
- if (A.getType().getX() != N) {
- throw new RSRuntimeException("A must be a square matrix for TRMV");
- }
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (incX <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for TRMV");
- }
- }
-
- static int validateTPMV(Element e, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- validateTranspose(TransA);
- validateUplo(Uplo);
- validateDiag(Diag);
- if (!Ap.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (Ap.getType().getY() > 1) {
- throw new RSRuntimeException("Ap must have a Y dimension of 0 or 1");
- }
-
- int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
- //is it really doing anything?
- if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
- throw new RSRuntimeException("Invalid dimension for Ap");
- }
- if (incX <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for TPMV");
- }
-
- return N;
- }
-
- /**
- * STRMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/d45/strmv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void STRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTRMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/dc/d7e/dtrmv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void DTRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTRMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x or x := A**H*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/df/d78/ctrmv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void CTRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTRMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x or x := A**H*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/dd1/ztrmv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void ZTRMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztrmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * STBMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/d7d/stbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void STBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBMV has the same requirements as TRMV + K >= 0
- if (K < 0) {
- throw new RSRuntimeException("K must be greater than or equal to 0");
- }
- validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTBMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/df/d29/dtbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void DTBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBMV has the same requirements as TRMV + K >= 0
- if (K < 0) {
- throw new RSRuntimeException("K must be greater than or equal to 0");
- }
- validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTBMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x or x := A**H*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/dcd/ctbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void CTBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBMV has the same requirements as TRMV + K >= 0
- if (K < 0) {
- throw new RSRuntimeException("K must be greater than or equal to 0");
- }
- validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTBMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x or x := A**H*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/d39/ztbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void ZTBMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBMV has the same requirements as TRMV + K >= 0
- if (K < 0) {
- throw new RSRuntimeException("K must be greater than or equal to 0");
- }
- validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztbmv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * STPMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/db1/stpmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void STPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- int N = validateTPMV(Element.F32(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, apID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTPMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/dc/dcd/dtpmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void DTPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- int N = validateTPMV(Element.F64(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, apID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTPMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x or x := A**H*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/dbb/ctpmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void CTPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- int N = validateTPMV(Element.F32_2(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, apID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTPMV performs one of the matrix-vector operations
- * x := A*x or x := A**T*x or x := A**H*x
- *
- * Details: http://www.netlib.org/lapack/explore-html/d2/d9e/ztpmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void ZTPMV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- int N = validateTPMV(Element.F64_2(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztpmv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, apID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * STRSV solves one of the systems of equations
- * A*x = b or A**T*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/d2a/strsv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void STRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- // TRSV is the same as TRMV
- validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
-
- }
-
- /**
- * DTRSV solves one of the systems of equations
- * A*x = b or A**T*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/d96/dtrsv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void DTRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- // TRSV is the same as TRMV
- validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
-
- }
-
- /**
- * CTRSV solves one of the systems of equations
- * A*x = b or A**T*x = b or A**H*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/dc8/ctrsv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void CTRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- // TRSV is the same as TRMV
- validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
-
- }
-
- /**
- * ZTRSV solves one of the systems of equations
- * A*x = b or A**T*x = b or A**H*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d1/d2f/ztrsv_8f.html
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void ZTRSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation A, Allocation X, int incX) {
- // TRSV is the same as TRMV
- validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztrsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
-
- }
-
- /**
- * STBSV solves one of the systems of equations
- * A*x = b or A**T*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/d1f/stbsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void STBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBSV is the same as TRMV + K >= 0
- validateTRMV(Element.F32(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
- if (K < 0) {
- throw new RSRuntimeException("Number of diagonals must be positive");
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTBSV solves one of the systems of equations
- * A*x = b or A**T*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/dcf/dtbsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void DTBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBSV is the same as TRMV + K >= 0
- validateTRMV(Element.F64(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
- if (K < 0) {
- throw new RSRuntimeException("Number of diagonals must be positive");
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, aID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTBSV solves one of the systems of equations
- * A*x = b or A**T*x = b or A**H*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d9/d5f/ctbsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void CTBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBSV is the same as TRMV + K >= 0
- validateTRMV(Element.F32_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
- if (K < 0) {
- throw new RSRuntimeException("Number of diagonals must be positive");
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTBSV solves one of the systems of equations
- * A*x = b or A**T*x = b or A**H*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/d5a/ztbsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param K The number of off-diagonals of the matrix A
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void ZTBSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, int K, Allocation A, Allocation X, int incX) {
- // TBSV is the same as TRMV + K >= 0
- validateTRMV(Element.F64_2(mRS), Uplo, TransA, Diag, A, X, incX);
- int N = A.getType().getY();
- if (K < 0) {
- throw new RSRuntimeException("Number of diagonals must be positive");
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztbsv, TransA, 0, 0, Uplo, Diag, 0, N, K, 0, 0, aID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * STPSV solves one of the systems of equations
- * A*x = b or A**T*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/d7c/stpsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void STPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- // TPSV is same as TPMV
- int N = validateTPMV(Element.F32(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_stpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, apID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTPSV solves one of the systems of equations
- * A*x = b or A**T*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d9/d84/dtpsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void DTPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- // TPSV is same as TPMV
- int N = validateTPMV(Element.F64(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, apID, xID, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTPSV solves one of the systems of equations
- * A*x = b or A**T*x = b or A**H*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/d56/ctpsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void CTPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- // TPSV is same as TPMV
- int N = validateTPMV(Element.F32_2(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, apID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTPSV solves one of the systems of equations
- * A*x = b or A**T*x = b or A**H*x = b
- *
- * Details: http://www.netlib.org/lapack/explore-html/da/d57/ztpsv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param Ap The input allocation contains packed matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- */
- public void ZTPSV(@Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Allocation Ap, Allocation X, int incX) {
- // TPSV is same as TPMV
- int N = validateTPMV(Element.F64_2(mRS), Uplo, TransA, Diag, Ap, X, incX);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztpsv, TransA, 0, 0, Uplo, Diag, 0, N, 0, 0, 0, apID, xID, 0, 0, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * Level 2, S and D only
- */
- static int validateSYMV(Element e, @Uplo int Uplo, Allocation A, Allocation X, Allocation Y, int incX, int incY) {
- validateUplo(Uplo);
- int N = A.getType().getY();
- if (A.getType().getX() != N) {
- throw new RSRuntimeException("A must be a square matrix for SYMV");
- }
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e) ) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SYMV");
- }
- int expectedYDim = 1 + (N - 1) * incY;
- if (Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SYMV");
- }
- return N;
- }
- static int validateSPMV(Element e, @Uplo int Uplo, Allocation Ap, Allocation X, int incX, Allocation Y, int incY) {
- validateUplo(Uplo);
- if (!Ap.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (Ap.getType().getY() > 1) {
- throw new RSRuntimeException("Ap must have a Y dimension of 0 or 1");
- }
-
- int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
- if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
- throw new RSRuntimeException("Invalid dimension for Ap");
- }
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SPMV");
- }
- int expectedYDim = 1 + (N - 1) * incY;
- if (Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SPMV");
- }
-
- return N;
- }
- static void validateGER(Element e, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e) ) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
-
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- if (N < 1 || M < 1) {
- throw new RSRuntimeException("M and N must be 1 or greater for GER");
- }
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (M - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for GER");
- }
- int expectedYDim = 1 + (N - 1) * incY;
- if (Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for GER");
- }
-
-
- }
- static int validateSYR(Element e, @Uplo int Uplo, Allocation X, int incX, Allocation A) {
- validateUplo(Uplo);
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
-
- int N = A.getType().getX();
-
- if (X.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
- if (N != A.getType().getY()) {
- throw new RSRuntimeException("A must be a symmetric matrix");
- }
- if (incX <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SYR");
- }
- return N;
- }
- static int validateSPR(Element e, @Uplo int Uplo, Allocation X, int incX, Allocation Ap) {
- validateUplo(Uplo);
- if (!Ap.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (Ap.getType().getY() > 1) {
- throw new RSRuntimeException("Ap must have a Y dimension of 0 or 1");
- }
-
- int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
- if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
- throw new RSRuntimeException("Invalid dimension for Ap");
- }
- if (incX <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SPR");
- }
-
- return N;
- }
-
- static int validateSYR2(Element e, @Uplo int Uplo, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- validateUplo(Uplo);
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
-
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- int N = A.getType().getX();
-
- if (N != A.getType().getY()) {
- throw new RSRuntimeException("A must be a symmetric matrix");
- }
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- int expectedYDim = 1 + (N - 1) * incY;
- if (X.getType().getX() != expectedXDim || Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SYR");
- }
- return N;
-
- }
- static int validateSPR2(Element e, @Uplo int Uplo, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
- validateUplo(Uplo);
- if (!Ap.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- if (Ap.getType().getY() > 1) {
- throw new RSRuntimeException("Ap must have a Y dimension of 0 or 1");
- }
-
- int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
- if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
- throw new RSRuntimeException("Invalid dimension for Ap");
- }
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (N - 1) * incX;
- int expectedYDim = 1 + (N - 1) * incY;
- if (X.getType().getX() != expectedXDim || Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for SPR2");
- }
-
- return N;
- }
-
- /**
- * SSYMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d2/d94/ssymv_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void SSYMV(@Uplo int Uplo, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) {
- int N = validateSYMV(Element.F32(mRS), Uplo, A, X, Y, incX, incY);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssymv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, aID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSBMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/da1/ssbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied.
- * @param K The number of off-diagonals of the matrix A
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void SSBMV(@Uplo int Uplo, int K, float alpha, Allocation A, Allocation X, int incX, float beta, Allocation Y, int incY) {
- // SBMV is the same as SYMV + K >= 0
- if (K < 0) {
- throw new RSRuntimeException("K must be greater than or equal to 0");
- }
- int N = validateSYMV(Element.F32(mRS), Uplo, A, X, Y, incX, incY);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha, aID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSPMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/d68/sspmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form.
- * @param alpha The scalar alpha.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void SSPMV(@Uplo int Uplo, float alpha, Allocation Ap, Allocation X, int incX, float beta, Allocation Y, int incY) {
- int N = validateSPMV(Element.F32(mRS), Uplo, Ap, X, incX, Y, incY);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sspmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, apID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * SGER performs the rank 1 operation
- * A := alpha*x*y**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d5c/sger_8f.html
- *
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- */
- public void SGER(float alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- int M = A.getType().getY();
- int N = A.getType().getX();
- validateGER(Element.F32(mRS), X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sger, 0, 0, 0, 0, 0, M, N, 0, alpha, xID, yID, 0.f, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSYR performs the rank 1 operation
- * A := alpha*x*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/dac/ssyr_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- */
- public void SSYR(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation A) {
- int N = validateSYR(Element.F32(mRS), Uplo, X, incX, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, aID, 0.f, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSPR performs the rank 1 operation
- * A := alpha*x*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d2/d9b/sspr_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32}.
- */
- public void SSPR(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Ap) {
- int N = validateSPR(Element.F32(mRS), Uplo, X, incX, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sspr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, apID, 0.f, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSYR2 performs the symmetric rank 2 operation
- * A := alpha*x*y**T + alpha*y*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d99/ssyr2_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- */
- public void SSYR2(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- int N = validateSYR2(Element.F32(mRS), Uplo, X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, yID, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSPR2 performs the symmetric rank 2 operation
- * A := alpha*x*y**T + alpha*y*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d3e/sspr2_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32}.
- */
- public void SSPR2(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
- int N = validateSPR2(Element.F32(mRS), Uplo, X, incX, Y, incY, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sspr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, yID, 0, apID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSYMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/dbe/dsymv_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void DSYMV(@Uplo int Uplo, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) {
- int N = validateSYMV(Element.F64(mRS), Uplo, A, X, Y, incX, incY);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsymv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, aID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSBMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/d1e/dsbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied.
- * @param K The number of off-diagonals of the matrix A
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void DSBMV(@Uplo int Uplo, int K, double alpha, Allocation A, Allocation X, int incX, double beta, Allocation Y, int incY) {
- // SBMV is the same as SYMV + K >= 0
- if (K < 0) {
- throw new RSRuntimeException("K must be greater than or equal to 0");
- }
- int N = validateSYMV(Element.F64(mRS), Uplo, A, X, Y, incX, incY);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha, aID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSPMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/d85/dspmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form.
- * @param alpha The scalar alpha.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void DSPMV(@Uplo int Uplo, double alpha, Allocation Ap, Allocation X, int incX, double beta, Allocation Y, int incY) {
- int N = validateSPMV(Element.F64(mRS), Uplo, Ap, X, incX, Y, incY);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dspmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, apID, xID, beta, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DGER performs the rank 1 operation
- * A := alpha*x*y**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/dc/da8/dger_8f.html
- *
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- */
- public void DGER(double alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- int M = A.getType().getY();
- int N = A.getType().getX();
- validateGER(Element.F64(mRS), X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dger, 0, 0, 0, 0, 0, M, N, 0, alpha, xID, yID, 0.f, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSYR performs the rank 1 operation
- * A := alpha*x*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/d60/dsyr_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- */
- public void DSYR(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation A) {
- int N = validateSYR(Element.F64(mRS), Uplo, X, incX, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, aID, 0.f, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSPR performs the rank 1 operation
- * A := alpha*x*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/dd/dba/dspr_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64}.
- */
- public void DSPR(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Ap) {
- int N = validateSPR(Element.F64(mRS), Uplo, X, incX, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dspr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, apID, 0.f, 0, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSYR2 performs the symmetric rank 2 operation
- * A := alpha*x*y**T + alpha*y*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/d41/dsyr2_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- */
- public void DSYR2(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- int N = validateSYR2(Element.F64(mRS), Uplo, X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, yID, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSPR2 performs the symmetric rank 2 operation
- * A := alpha*x*y**T + alpha*y*x**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/dd/d9e/dspr2_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64}.
- */
- public void DSPR2(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
- int N = validateSPR2(Element.F64(mRS), Uplo, X, incX, Y, incY, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dspr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, xID, yID, 0, apID, incX, incY, 0, 0, mUseIncSupp);
- }
-
-
- /**
- * Level 2, C and Z only
- */
-
- static void validateGERU(Element e, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- if (!A.getType().getElement().isCompatible(e) ||
- !X.getType().getElement().isCompatible(e) ||
- !Y.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
- throw new RSRuntimeException("BLAS vectors must have Y dimension of 0 or 1");
- }
-
- int M = A.getType().getY();
- int N = A.getType().getX();
- if (incX <= 0 || incY <= 0) {
- throw new RSRuntimeException("Vector increments must be greater than 0");
- }
- int expectedXDim = 1 + (M - 1) * incX;
- if (X.getType().getX() != expectedXDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for GERU");
- }
- int expectedYDim = 1 + (N - 1) * incY;
- if (Y.getType().getX() != expectedYDim) {
- throw new RSRuntimeException("Incorrect vector dimensions for GERU");
- }
-
- }
-
- /**
- * CHEMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d7/d51/chemv_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void CHEMV(@Uplo int Uplo, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) {
- // HEMV is the same as SYR2 validation-wise
- int N = validateSYR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chemv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CHBMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/dc2/chbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied.
- * @param K The number of off-diagonals of the matrix A
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void CHBMV(@Uplo int Uplo, int K, Float2 alpha, Allocation A, Allocation X, int incX, Float2 beta, Allocation Y, int incY) {
- // HBMV is the same as SYR2 validation-wise
- int N = validateSYR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, A);
- if (K < 0) {
- throw new RSRuntimeException("K must be 0 or greater for HBMV");
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CHPMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d2/d06/chpmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form.
- * @param alpha The scalar alpha.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void CHPMV(@Uplo int Uplo, Float2 alpha, Allocation Ap, Allocation X, int incX, Float2 beta, Allocation Y, int incY) {
- // HPMV is the same as SPR2
- int N = validateSPR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chpmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, apID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CGERU performs the rank 1 operation
- * A := alpha*x*y**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d5f/cgeru_8f.html
- *
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- */
- public void CGERU(Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- validateGERU(Element.F32_2(mRS), X, incX, Y, incY, A);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgeru, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CGERC performs the rank 1 operation
- * A := alpha*x*y**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/dd/d84/cgerc_8f.html
- *
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- */
- public void CGERC(Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- // same as GERU
- validateGERU(Element.F32_2(mRS), X, incX, Y, incY, A);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgerc, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CHER performs the rank 1 operation
- * A := alpha*x*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/d6d/cher_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- */
- public void CHER(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation A) {
- // same as SYR
- int N = validateSYR(Element.F32_2(mRS), Uplo, X, incX, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cher, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, xID, 0, 0, 0, aID, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CHPR performs the rank 1 operation
- * A := alpha*x*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/dcd/chpr_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- */
- public void CHPR(@Uplo int Uplo, float alpha, Allocation X, int incX, Allocation Ap) {
- // equivalent to SPR for validation
- int N = validateSPR(Element.F32_2(mRS), Uplo, X, incX, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chpr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, xID, 0, 0, 0, apID, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CHER2 performs the symmetric rank 2 operation
- * A := alpha*x*y**H + alpha*y*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d87/cher2_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- */
- public void CHER2(@Uplo int Uplo, Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- // same as SYR2
- int N = validateSYR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cher2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * CHPR2 performs the symmetric rank 2 operation
- * A := alpha*x*y**H + alpha*y*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/d44/chpr2_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F32_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F32_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- */
- public void CHPR2(@Uplo int Uplo, Float2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
- // same as SPR2
- int N = validateSPR2(Element.F32_2(mRS), Uplo, X, incX, Y, incY, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chpr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, apID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHEMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/ddd/zhemv_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void ZHEMV(@Uplo int Uplo, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) {
- // HEMV is the same as SYR2 validation-wise
- int N = validateSYR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhemv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHBMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/d1a/zhbmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N),
- * but only the region N*(K+1) will be referenced. The following subroutine can is an
- * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'.
- * for i in range(0, n):
- * for j in range(i, min(i+k+1, n)):
- * b[i, j-i] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied.
- * @param K The number of off-diagonals of the matrix A
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void ZHBMV(@Uplo int Uplo, int K, Double2 alpha, Allocation A, Allocation X, int incX, Double2 beta, Allocation Y, int incY) {
- // HBMV is the same as SYR2 validation-wise
- int N = validateSYR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, A);
- if (K < 0) {
- throw new RSRuntimeException("K must be 0 or greater for HBMV");
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhbmv, 0, 0, 0, Uplo, 0, 0, N, K, alpha.x, alpha.y, aID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHPMV performs the matrix-vector operation
- * y := alpha*A*x + beta*y
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/d60/zhpmv_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form.
- * @param alpha The scalar alpha.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param beta The scalar beta.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- */
- public void ZHPMV(@Uplo int Uplo, Double2 alpha, Allocation Ap, Allocation X, int incX, Double2 beta, Allocation Y, int incY) {
- // HPMV is the same as SPR2
- int N = validateSPR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhpmv, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, apID, xID, beta.x, beta.y, yID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZGERU performs the rank 1 operation
- * A := alpha*x*y**T + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d7/d12/zgeru_8f.html
- *
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- */
- public void ZGERU(Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- validateGERU(Element.F64_2(mRS), X, incX, Y, incY, A);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgeru, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZGERC performs the rank 1 operation
- * A := alpha*x*y**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/dad/zgerc_8f.html
- *
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- */
- public void ZGERC(Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- // same as GERU
- validateGERU(Element.F64_2(mRS), X, incX, Y, incY, A);
- int M = A.getType().getY();
- int N = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgerc, 0, 0, 0, 0, 0, M, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHER performs the rank 1 operation
- * A := alpha*x*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/d0e/zher_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- */
- public void ZHER(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation A) {
- // same as SYR
- int N = validateSYR(Element.F64_2(mRS), Uplo, X, incX, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zher, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, xID, 0, 0, 0, aID, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHPR performs the rank 1 operation
- * A := alpha*x*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/de1/zhpr_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- */
- public void ZHPR(@Uplo int Uplo, double alpha, Allocation X, int incX, Allocation Ap) {
- // equivalent to SPR for validation
- int N = validateSPR(Element.F64_2(mRS), Uplo, X, incX, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhpr, 0, 0, 0, Uplo, 0, 0, N, 0, alpha, 0, xID, 0, 0, 0, apID, incX, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHER2 performs the symmetric rank 2 operation
- * A := alpha*x*y**H + alpha*y*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/da/d8a/zher2_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- */
- public void ZHER2(@Uplo int Uplo, Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
- // same as SYR2
- int N = validateSYR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, A);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zher2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, aID, incX, incY, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHPR2 performs the symmetric rank 2 operation
- * A := alpha*x*y**H + alpha*y*x**H + A
- *
- * Details: http://www.netlib.org/lapack/explore-html/d5/d52/zhpr2_8f.html
- *
- * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2,
- * The following subroutine can is an example showing how to convert a UPPER trianglar matrix
- * 'a' to packed matrix 'b'.
- * k = 0
- * for i in range(0, n):
- * for j in range(i, n):
- * b[k++] = a[i, j]
- *
- * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form.
- * @param alpha The scalar alpha.
- * @param X The input allocation contains vector x, supported elements type {@link Element#F64_2}.
- * @param incX The increment for the elements of vector x, must be larger than zero.
- * @param Y The input allocation contains vector y, supported elements type {@link Element#F64_2}.
- * @param incY The increment for the elements of vector y, must be larger than zero.
- * @param Ap The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- */
- public void ZHPR2(@Uplo int Uplo, Double2 alpha, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
- // same as SPR2
- int N = validateSPR2(Element.F64_2(mRS), Uplo, X, incX, Y, incY, Ap);
-
- boolean mUseIncSupp = isIncSupp();
- long apID = Ap.getID(mRS);
- long xID = X.getID(mRS);
- long yID = Y.getID(mRS);
- if (mUseIncSupp) {
- apID = getDummyAlloc(Ap);
- xID = getDummyAlloc(X);
- yID = getDummyAlloc(Y);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhpr2, 0, 0, 0, Uplo, 0, 0, N, 0, alpha.x, alpha.y, xID, yID, 0, 0, apID, incX, incY, 0, 0, mUseIncSupp);
- }
-
-
- /**
- * Level 3 BLAS
- */
-
- static void validateL3(Element e, int TransA, int TransB, int Side, Allocation A, Allocation B, Allocation C) {
- int aM = -1, aN = -1, bM = -1, bN = -1, cM = -1, cN = -1;
- if ((A != null && !A.getType().getElement().isCompatible(e)) ||
- (B != null && !B.getType().getElement().isCompatible(e)) ||
- (C != null && !C.getType().getElement().isCompatible(e))) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- if (C == null) {
- //since matrix C is used to store the result, it cannot be null.
- throw new RSRuntimeException("Allocation C cannot be null");
- }
- cM = C.getType().getY();
- cN = C.getType().getX();
-
- if (Side == RIGHT) {
- if ((A == null && B != null) || (A != null && B == null)) {
- throw new RSRuntimeException("Provided Matrix A without Matrix B, or vice versa");
- }
- if (B != null) {
- bM = A.getType().getY();
- bN = A.getType().getX();
- }
- if (A != null) {
- aM = B.getType().getY();
- aN = B.getType().getX();
- }
- } else {
- if (A != null) {
- if (TransA == TRANSPOSE || TransA == CONJ_TRANSPOSE) {
- aN = A.getType().getY();
- aM = A.getType().getX();
- } else {
- aM = A.getType().getY();
- aN = A.getType().getX();
- }
- }
- if (B != null) {
- if (TransB == TRANSPOSE || TransB == CONJ_TRANSPOSE) {
- bN = B.getType().getY();
- bM = B.getType().getX();
- } else {
- bM = B.getType().getY();
- bN = B.getType().getX();
- }
- }
- }
- if (A != null && B != null && C != null) {
- if (aN != bM || aM != cM || bN != cN) {
- throw new RSRuntimeException("Called BLAS with invalid dimensions");
- }
- } else if (A != null && C != null) {
- // A and C only, for SYRK
- if (cM != cN) {
- throw new RSRuntimeException("Matrix C is not symmetric");
- }
- if (aM != cM) {
- throw new RSRuntimeException("Called BLAS with invalid dimensions");
- }
- } else if (A != null && B != null) {
- // A and B only
- if (aN != bM) {
- throw new RSRuntimeException("Called BLAS with invalid dimensions");
- }
- }
-
- }
-
- /**
- * SGEMM performs one of the matrix-matrix operations
- * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/de2/sgemm_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param TransB The type of transpose applied to matrix B.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}.
- */
- public void SGEMM(@Transpose int TransA, @Transpose int TransB, float alpha, Allocation A,
- Allocation B, float beta, Allocation C) {
- validateTranspose(TransA);
- validateTranspose(TransB);
- validateL3(Element.F32(mRS), TransA, TransB, 0, A, B, C);
-
- int M = -1, N = -1, K = -1;
- if (TransA != NO_TRANSPOSE) {
- M = A.getType().getX();
- K = A.getType().getY();
- } else {
- M = A.getType().getY();
- K = A.getType().getX();
- }
- if (TransB != NO_TRANSPOSE) {
- N = B.getType().getY();
- } else {
- N = B.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_sgemm, TransA, TransB, 0, 0, 0, M, N, K, alpha, aID, bID,
- beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DGEMM performs one of the matrix-matrix operations
- * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T
- *
- * Details: http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param TransB The type of transpose applied to matrix B.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}.
- */
- public void DGEMM(@Transpose int TransA, @Transpose int TransB, double alpha, Allocation A,
- Allocation B, double beta, Allocation C) {
- validateTranspose(TransA);
- validateTranspose(TransB);
- validateL3(Element.F64(mRS), TransA, TransB, 0, A, B, C);
- int M = -1, N = -1, K = -1;
- if (TransA != NO_TRANSPOSE) {
- M = A.getType().getX();
- K = A.getType().getY();
- } else {
- M = A.getType().getY();
- K = A.getType().getX();
- }
- if (TransB != NO_TRANSPOSE) {
- N = B.getType().getY();
- } else {
- N = B.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dgemm, TransA, TransB, 0, 0, 0, M, N, K, alpha, aID, bID,
- beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CGEMM performs one of the matrix-matrix operations
- * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T or op(X) = X**H
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/d5b/cgemm_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param TransB The type of transpose applied to matrix B.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CGEMM(@Transpose int TransA, @Transpose int TransB, Float2 alpha, Allocation A,
- Allocation B, Float2 beta, Allocation C) {
- validateTranspose(TransA);
- validateTranspose(TransB);
- validateL3(Element.F32_2(mRS), TransA, TransB, 0, A, B, C);
- int M = -1, N = -1, K = -1;
- if (TransA != NO_TRANSPOSE) {
- M = A.getType().getX();
- K = A.getType().getY();
- } else {
- M = A.getType().getY();
- K = A.getType().getX();
- }
- if (TransB != NO_TRANSPOSE) {
- N = B.getType().getY();
- } else {
- N = B.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cgemm, TransA, TransB, 0, 0, 0, M, N, K, alpha.x, alpha.y, aID, bID,
- beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZGEMM performs one of the matrix-matrix operations
- * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T or op(X) = X**H
- *
- * Details: http://www.netlib.org/lapack/explore-html/d7/d76/zgemm_8f.html
- *
- * @param TransA The type of transpose applied to matrix A.
- * @param TransB The type of transpose applied to matrix B.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2
- */
- public void ZGEMM(@Transpose int TransA, @Transpose int TransB, Double2 alpha, Allocation A,
- Allocation B, Double2 beta, Allocation C) {
- validateTranspose(TransA);
- validateTranspose(TransB);
- validateL3(Element.F64_2(mRS), TransA, TransB, 0, A, B, C);
- int M = -1, N = -1, K = -1;
- if (TransA != NO_TRANSPOSE) {
- M = A.getType().getX();
- K = A.getType().getY();
- } else {
- M = A.getType().getY();
- K = A.getType().getX();
- }
- if (TransB != NO_TRANSPOSE) {
- N = B.getType().getY();
- } else {
- N = B.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zgemm, TransA, TransB, 0, 0, 0, M, N, K, alpha.x, alpha.y, aID, bID,
- beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSYMM performs one of the matrix-matrix operations
- * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d7/d42/ssymm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}.
- */
- public void SSYMM(@Side int Side, @Uplo int Uplo, float alpha, Allocation A,
- Allocation B, float beta, Allocation C) {
- validateSide(Side);
- validateUplo(Uplo);
- //For SYMM, Matrix A should be symmetric
- if (A.getType().getX() != A.getType().getY()) {
- throw new RSRuntimeException("Matrix A is not symmetric");
- }
- validateL3(Element.F32(mRS), 0, 0, Side, A, B, C);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha, aID, bID,
- beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSYMM performs one of the matrix-matrix operations
- * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/db0/dsymm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}.
- */
- public void DSYMM(@Side int Side, @Uplo int Uplo, double alpha, Allocation A,
- Allocation B, double beta, Allocation C) {
- validateSide(Side);
- validateUplo(Uplo);
- if (A.getType().getX() != A.getType().getY()) {
- throw new RSRuntimeException("Matrix A is not symmetric");
- }
- validateL3(Element.F64(mRS), 0, 0, Side, A, B, C);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha, aID, bID,
- beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CSYMM performs one of the matrix-matrix operations
- * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/db/d59/csymm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CSYMM(@Side int Side, @Uplo int Uplo, Float2 alpha, Allocation A,
- Allocation B, Float2 beta, Allocation C) {
- validateSide(Side);
- validateUplo(Uplo);
- if (A.getType().getX() != A.getType().getY()) {
- throw new RSRuntimeException("Matrix A is not symmetric");
- }
- validateL3(Element.F32_2(mRS), 0, 0, Side, A, B, C);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_csymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha.x, alpha.y, aID, bID,
- beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZSYMM performs one of the matrix-matrix operations
- * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/df/d51/zsymm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}.
- */
- public void ZSYMM(@Side int Side, @Uplo int Uplo, Double2 alpha, Allocation A,
- Allocation B, Double2 beta, Allocation C) {
- validateSide(Side);
- validateUplo(Uplo);
- if (A.getType().getX() != A.getType().getY()) {
- throw new RSRuntimeException("Matrix A is not symmetric");
- }
- validateL3(Element.F64_2(mRS), 0, 0, Side, A, B, C);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zsymm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0, alpha.x, alpha.y, aID, bID,
- beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * SSYRK performs one of the symmetric rank k operations
- * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d0/d40/ssyrk_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}.
- */
- public void SSYRK(@Uplo int Uplo, @Transpose int Trans, float alpha, Allocation A, float beta, Allocation C) {
- validateTranspose(Trans);
- validateUplo(Uplo);
- validateL3(Element.F32(mRS), Trans, 0, 0, A, null, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, aID, 0, beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSYRK performs one of the symmetric rank k operations
- * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/dc/d05/dsyrk_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}.
- */
- public void DSYRK(@Uplo int Uplo, @Transpose int Trans, double alpha, Allocation A, double beta, Allocation C) {
- validateTranspose(Trans);
- validateUplo(Uplo);
- validateL3(Element.F64(mRS), Trans, 0, 0, A, null, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, aID, 0, beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CSYRK performs one of the symmetric rank k operations
- * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/d6a/csyrk_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CSYRK(@Uplo int Uplo, @Transpose int Trans, Float2 alpha, Allocation A, Float2 beta, Allocation C) {
- validateTranspose(Trans);
- validateUplo(Uplo);
- validateL3(Element.F32_2(mRS), Trans, 0, 0, A, null, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_csyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha.x, alpha.y, aID, 0, beta.x, beta.y,
- C.getID(mRS), 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZSYRK performs one of the symmetric rank k operations
- * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/d54/zsyrk_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}.
- */
- public void ZSYRK(@Uplo int Uplo, @Transpose int Trans, Double2 alpha, Allocation A, Double2 beta, Allocation C) {
- validateTranspose(Trans);
- validateUplo(Uplo);
- validateL3(Element.F64_2(mRS), Trans, 0, 0, A, null, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zsyrk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha.x, alpha.y, aID, 0, beta.x, beta.y,
- C.getID(mRS), 0, 0, 0, 0, mUseIncSupp);
- }
-
- static void validateSYR2K(Element e, @Transpose int Trans, Allocation A, Allocation B, Allocation C) {
- validateTranspose(Trans);
- if (!A.getType().getElement().isCompatible(e) ||
- !B.getType().getElement().isCompatible(e) ||
- !C.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- int Cdim = -1;
- // A is n x k if no transpose, k x n if transpose
- // C is n x n
- if (Trans == TRANSPOSE) {
- // check columns versus C
- Cdim = A.getType().getX();
- } else {
- // check rows versus C
- Cdim = A.getType().getY();
- }
- if (C.getType().getX() != Cdim || C.getType().getY() != Cdim) {
- throw new RSRuntimeException("Invalid symmetric matrix in SYR2K");
- }
- // A dims == B dims
- if (A.getType().getX() != B.getType().getX() || A.getType().getY() != B.getType().getY()) {
- throw new RSRuntimeException("Invalid A and B in SYR2K");
- }
- }
-
- /**
- * SSYR2K performs one of the symmetric rank 2k operations
- * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/df/d3d/ssyr2k_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32}.
- */
- public void SSYR2K(@Uplo int Uplo, @Transpose int Trans, float alpha, Allocation A, Allocation B, float beta, Allocation C) {
- validateUplo(Uplo);
- validateSYR2K(Element.F32(mRS), Trans, A, B, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_ssyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, aID, bID, beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DSYR2K performs one of the symmetric rank 2k operations
- * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d1/dec/dsyr2k_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64}.
- */
- public void DSYR2K(@Uplo int Uplo, @Transpose int Trans, double alpha, Allocation A, Allocation B, double beta, Allocation C) {
- validateUplo(Uplo);
- validateSYR2K(Element.F64(mRS), Trans, A, B, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dsyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha, aID, bID, beta, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CSYR2K performs one of the symmetric rank 2k operations
- * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/d7e/csyr2k_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CSYR2K(@Uplo int Uplo, @Transpose int Trans, Float2 alpha, Allocation A, Allocation B, Float2 beta, Allocation C) {
- validateUplo(Uplo);
- validateSYR2K(Element.F32_2(mRS), Trans, A, B, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_csyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha.x, alpha.y, aID, bID, beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZSYR2K performs one of the symmetric rank 2k operations
- * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/df/d20/zsyr2k_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}.
- */
- public void ZSYR2K(@Uplo int Uplo, @Transpose int Trans, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) {
- validateUplo(Uplo);
- validateSYR2K(Element.F64_2(mRS), Trans, A, B, C);
- int K = -1;
- if (Trans != NO_TRANSPOSE) {
- K = A.getType().getY();
- } else {
- K = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zsyr2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), K, alpha.x, alpha.y, aID, bID, beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- static void validateTRMM(Element e, @Side int Side, @Transpose int TransA, Allocation A, Allocation B) {
- validateSide(Side);
- validateTranspose(TransA);
- int aM = -1, aN = -1, bM = -1, bN = -1;
- if (!A.getType().getElement().isCompatible(e) ||
- !B.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
-
- aM = A.getType().getY();
- aN = A.getType().getX();
- if (aM != aN) {
- throw new RSRuntimeException("Called TRMM with a non-symmetric matrix A");
- }
-
- bM = B.getType().getY();
- bN = B.getType().getX();
- if (Side == LEFT) {
- if (aN != bM) {
- throw new RSRuntimeException("Called TRMM with invalid matrices");
- }
- } else {
- if (bN != aM) {
- throw new RSRuntimeException("Called TRMM with invalid matrices");
- }
- }
- }
-
- /**
- * STRMM performs one of the matrix-matrix operations
- * B := alpha*op(A)*B or B := alpha*B*op(A)
- * op(A) is one of op(A) = A or op(A) = A**T
- *
- * Details: http://www.netlib.org/lapack/explore-html/df/d01/strmm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}.
- */
- public void STRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, float alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRMM(Element.F32(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha, aID, bID, 0.f, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTRMM performs one of the matrix-matrix operations
- * B := alpha*op(A)*B or B := alpha*B*op(A)
- * op(A) is one of op(A) = A or op(A) = A**T
- *
- * Details: http://www.netlib.org/lapack/explore-html/dd/d19/dtrmm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}.
- */
- public void DTRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, double alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRMM(Element.F64(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha, aID, bID, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTRMM performs one of the matrix-matrix operations
- * B := alpha*op(A)*B or B := alpha*B*op(A)
- * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H
- *
- * Details: http://www.netlib.org/lapack/explore-html/d4/d9b/ctrmm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- */
- public void CTRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Float2 alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRMM(Element.F32_2(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha.x, alpha.y, aID, bID, 0, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTRMM performs one of the matrix-matrix operations
- * B := alpha*op(A)*B or B := alpha*B*op(A)
- * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/de1/ztrmm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}.
- */
- public void ZTRMM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Double2 alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRMM(Element.F64_2(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztrmm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha.x, alpha.y, aID, bID, 0, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- static void validateTRSM(Element e, @Side int Side, @Transpose int TransA, Allocation A, Allocation B) {
- int adim = -1, bM = -1, bN = -1;
- validateSide(Side);
- validateTranspose(TransA);
- if (!A.getType().getElement().isCompatible(e) ||
- !B.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- adim = A.getType().getX();
- if (adim != A.getType().getY()) {
- // this may be unnecessary, the restriction could potentially be relaxed
- // A needs to contain at least that symmetric matrix but could theoretically be larger
- // for now we assume adapters are sufficient, will reevaluate in the future
- throw new RSRuntimeException("Called TRSM with a non-symmetric matrix A");
- }
- bM = B.getType().getY();
- bN = B.getType().getX();
- if (Side == LEFT) {
- // A is M*M
- if (adim != bM) {
- throw new RSRuntimeException("Called TRSM with invalid matrix dimensions");
- }
- } else {
- // A is N*N
- if (adim != bN) {
- throw new RSRuntimeException("Called TRSM with invalid matrix dimensions");
- }
- }
- }
-
- /**
- * STRSM solves one of the matrix equations
- * op(A)*X := alpha*B or X*op(A) := alpha*B
- * op(A) is one of op(A) = A or op(A) = A**T
- *
- * Details: http://www.netlib.org/lapack/explore-html/d2/d8b/strsm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32}.
- */
- public void STRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, float alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRSM(Element.F32(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Single(getID(mRS), RsBlas_strsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha, aID, bID, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * DTRSM solves one of the matrix equations
- * op(A)*X := alpha*B or X*op(A) := alpha*B
- * op(A) is one of op(A) = A or op(A) = A**T
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/da7/dtrsm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64}.
- */
- public void DTRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, double alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRSM(Element.F64(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Double(getID(mRS), RsBlas_dtrsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha, aID, bID, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * CTRSM solves one of the matrix equations
- * op(A)*X := alpha*B or X*op(A) := alpha*B
- * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H
- *
- * Details: http://www.netlib.org/lapack/explore-html/de/d30/ctrsm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- */
- public void CTRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Float2 alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRSM(Element.F32_2(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_ctrsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha.x, alpha.y, aID, bID, 0, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZTRSM solves one of the matrix equations
- * op(A)*X := alpha*B or X*op(A) := alpha*B
- * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H
- *
- * Details: http://www.netlib.org/lapack/explore-html/d1/d39/ztrsm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether matrix A is upper or lower triangular.
- * @param TransA The type of transpose applied to matrix A.
- * @param Diag Specifies whether or not A is unit triangular.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}.
- */
- public void ZTRSM(@Side int Side, @Uplo int Uplo, @Transpose int TransA, @Diag int Diag, Double2 alpha, Allocation A, Allocation B) {
- validateUplo(Uplo);
- validateDiag(Diag);
- validateTRSM(Element.F64_2(mRS), Side, TransA, A, B);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_ztrsm, TransA, 0, Side, Uplo, Diag, B.getType().getY(), B.getType().getX(), 0,
- alpha.x, alpha.y, aID, bID, 0, 0, 0, 0, 0, 0, 0, mUseIncSupp);
- }
-
- static void validateHEMM(Element e, @Side int Side, Allocation A, Allocation B, Allocation C) {
- validateSide(Side);
-
- if (!A.getType().getElement().isCompatible(e) ||
- !B.getType().getElement().isCompatible(e) ||
- !C.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
-
- // A must be square; can potentially be relaxed similar to TRSM
- int adim = A.getType().getX();
- if (adim != A.getType().getY()) {
- throw new RSRuntimeException("Called HEMM with non-square A");
- }
- if ((Side == LEFT && adim != B.getType().getY()) ||
- (Side == RIGHT && adim != B.getType().getX())) {
- throw new RSRuntimeException("Called HEMM with invalid B");
- }
- if (B.getType().getX() != C.getType().getX() ||
- B.getType().getY() != C.getType().getY()) {
- throw new RSRuntimeException("Called HEMM with mismatched B and C");
- }
- }
-
- /**
- * CHEMM performs one of the matrix-matrix operations
- * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d3/d66/chemm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CHEMM(@Side int Side, @Uplo int Uplo, Float2 alpha, Allocation A, Allocation B, Float2 beta, Allocation C) {
- validateUplo(Uplo);
- validateHEMM(Element.F32_2(mRS), Side, A, B, C);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_chemm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0,
- alpha.x, alpha.y, aID, bID, beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHEMM performs one of the matrix-matrix operations
- * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d6/d3e/zhemm_8f.html
- *
- * @param Side Specifies whether the symmetric matrix A appears on the left or right.
- * @param Uplo Specifies whether the upper or lower triangular part is to be referenced.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}.
- */
- public void ZHEMM(@Side int Side, @Uplo int Uplo, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) {
- validateUplo(Uplo);
- validateHEMM(Element.F64_2(mRS), Side, A, B, C);
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zhemm, 0, 0, Side, Uplo, 0, C.getType().getY(), C.getType().getX(), 0,
- alpha.x, alpha.y, aID, bID, beta.x, beta.y, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- static void validateHERK(Element e, @Transpose int Trans, Allocation A, Allocation C) {
- if (!A.getType().getElement().isCompatible(e) ||
- !C.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- validateConjTranspose(Trans);
- int cdim = C.getType().getX();
- if (cdim != C.getType().getY()) {
- throw new RSRuntimeException("Called HERK with non-square C");
- }
- if (Trans == NO_TRANSPOSE) {
- if (cdim != A.getType().getY()) {
- throw new RSRuntimeException("Called HERK with invalid A");
- }
- } else {
- if (cdim != A.getType().getX()) {
- throw new RSRuntimeException("Called HERK with invalid A");
- }
- }
- }
-
- /**
- * CHERK performs one of the hermitian rank k operations
- * C := alpha*A*A**H + beta*C or C := alpha*A**H*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d8/d52/cherk_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CHERK(@Uplo int Uplo, @Transpose int Trans, float alpha, Allocation A, float beta, Allocation C) {
- validateUplo(Uplo);
- validateHERK(Element.F32_2(mRS), Trans, A, C);
- int k = 0;
- if (Trans == CONJ_TRANSPOSE) {
- k = A.getType().getY();
- } else {
- k = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cherk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), k,
- alpha, 0, aID, 0, beta, 0, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHERK performs one of the hermitian rank k operations
- * C := alpha*A*A**H + beta*C or C := alpha*A**H*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d1/db1/zherk_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}.
- */
- public void ZHERK(@Uplo int Uplo, @Transpose int Trans, double alpha, Allocation A, double beta, Allocation C) {
- validateUplo(Uplo);
- validateHERK(Element.F64_2(mRS), Trans, A, C);
- int k = 0;
- if (Trans == CONJ_TRANSPOSE) {
- k = A.getType().getY();
- } else {
- k = A.getType().getX();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zherk, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), k,
- alpha, 0, aID, 0, beta, 0, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- static void validateHER2K(Element e, @Transpose int Trans, Allocation A, Allocation B, Allocation C) {
- if (!A.getType().getElement().isCompatible(e) ||
- !B.getType().getElement().isCompatible(e) ||
- !C.getType().getElement().isCompatible(e)) {
- throw new RSRuntimeException("Called BLAS with wrong Element type");
- }
- validateConjTranspose(Trans);
- int cdim = C.getType().getX();
- if (cdim != C.getType().getY()) {
- throw new RSRuntimeException("Called HER2K with non-square C");
- }
- if (Trans == NO_TRANSPOSE) {
- if (A.getType().getY() != cdim) {
- throw new RSRuntimeException("Called HER2K with invalid matrices");
- }
- } else {
- if (A.getType().getX() != cdim) {
- throw new RSRuntimeException("Called HER2K with invalid matrices");
- }
- }
- if (A.getType().getX() != B.getType().getX() || A.getType().getY() != B.getType().getY()) {
- throw new RSRuntimeException("Called HER2K with invalid A and B matrices");
- }
- }
-
- /**
- * CHER2K performs one of the hermitian rank 2k operations
- * C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C or C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d1/d82/cher2k_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F32_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F32_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F32_2}.
- */
- public void CHER2K(@Uplo int Uplo, @Transpose int Trans, Float2 alpha, Allocation A, Allocation B, float beta, Allocation C) {
- validateUplo(Uplo);
- validateHER2K(Element.F32_2(mRS), Trans, A, B, C);
- int k = 0;
- if (Trans == NO_TRANSPOSE) {
- k = A.getType().getX();
- } else {
- k = A.getType().getY();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Complex(getID(mRS), RsBlas_cher2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), k, alpha.x, alpha.y,
- A.getID(mRS), bID, beta, 0, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
- /**
- * ZHER2K performs one of the hermitian rank 2k operations
- * C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C or C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C
- *
- * Details: http://www.netlib.org/lapack/explore-html/d7/dfa/zher2k_8f.html
- *
- * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced.
- * @param Trans The type of transpose applied to the operation.
- * @param alpha The scalar alpha.
- * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}.
- * @param beta The scalar beta.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}.
- */
- public void ZHER2K(@Uplo int Uplo, @Transpose int Trans, Double2 alpha, Allocation A, Allocation B, double beta, Allocation C) {
- validateUplo(Uplo);
- validateHER2K(Element.F64_2(mRS), Trans, A, B, C);
- int k = 0;
- if (Trans == NO_TRANSPOSE) {
- k = A.getType().getX();
- } else {
- k = A.getType().getY();
- }
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_Z(getID(mRS), RsBlas_zher2k, Trans, 0, 0, Uplo, 0, 0, C.getType().getX(), k, alpha.x, alpha.y,
- A.getID(mRS), bID, beta, 0, cID, 0, 0, 0, 0, mUseIncSupp);
- }
-
-
- /**
- * 8-bit GEMM-like operation for neural networks: C = A * Transpose(B)
- * Calculations are done in 1.10.21 fixed-point format for the final output,
- * just before there's a shift down to drop the fractional parts. The output
- * values are gated to 0 to 255 to fit in a byte, but the 10-bit format
- * gives some headroom to avoid wrapping around on small overflows.
- *
- * @param A The input allocation contains matrix A, supported elements type {@link Element#U8}.
- * @param a_offset The offset for all values in matrix A, e.g A[i,j] = A[i,j] - a_offset. Value should be from 0 to 255.
- * @param B The input allocation contains matrix B, supported elements type {@link Element#U8}.
- * @param b_offset The offset for all values in matrix B, e.g B[i,j] = B[i,j] - b_offset. Value should be from 0 to 255.
- * @param C The input allocation contains matrix C, supported elements type {@link Element#U8}.
- * @param c_offset The offset for all values in matrix C.
- * @param c_mult The multiplier for all values in matrix C, e.g C[i,j] = (C[i,j] + c_offset) * c_mult.
- **/
- public void BNNM(Allocation A, int a_offset, Allocation B, int b_offset, Allocation C, int c_offset, int c_mult) {
- validateL3(Element.U8(mRS), NO_TRANSPOSE, TRANSPOSE, 0, A, B, C);
-
- if (a_offset < 0 || a_offset > 255) {
- throw new RSRuntimeException("Invalid a_offset passed to BNNM");
- }
- if (b_offset < 0 || b_offset > 255) {
- throw new RSRuntimeException("Invalid b_offset passed to BNNM");
- }
- int M = -1, N = -1, K = -1;
- M = A.getType().getY();
- N = B.getType().getY();
- K = A.getType().getX();
-
- boolean mUseIncSupp = isIncSupp();
- long aID = A.getID(mRS);
- long bID = B.getID(mRS);
- long cID = C.getID(mRS);
- if (mUseIncSupp) {
- aID = getDummyAlloc(A);
- bID = getDummyAlloc(B);
- cID = getDummyAlloc(C);
- }
- mRS.nScriptIntrinsicBLAS_BNNM(getID(mRS), M, N, K, aID, a_offset, bID, b_offset, cID, c_offset, c_mult, mUseIncSupp);
-
- }
-
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBlend.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBlend.java
deleted file mode 100644
index eef581e..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBlend.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-
-/**
- * Intrinsic kernels for blending two
- * {@link android.support.v8.renderscript.Allocation} objects.
- **/
-public class ScriptIntrinsicBlend extends ScriptIntrinsic {
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- ScriptIntrinsicBlend(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Supported elements types are {@link Element#U8_4}
- *
- * @param rs The RenderScript context
- * @param e Element type for inputs and outputs
- *
- * @return ScriptIntrinsicBlend
- */
- public static ScriptIntrinsicBlend create(RenderScript rs, Element e) {
- // 7 comes from RS_SCRIPT_INTRINSIC_ID_BLEND in rsDefines.h
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(7, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicBlend si = new ScriptIntrinsicBlend(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
-
- }
-
- private void blend(int id, Allocation ain, Allocation aout) {
- if (!ain.getElement().isCompatible(Element.U8_4(mRS))) {
- throw new RSIllegalArgumentException("Input is not of expected format.");
- }
- if (!aout.getElement().isCompatible(Element.U8_4(mRS))) {
- throw new RSIllegalArgumentException("Output is not of expected format.");
- }
- forEach(id, ain, aout, null);
- }
-
- /**
- * Sets dst = {0, 0, 0, 0}
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachClear(Allocation ain, Allocation aout) {
- blend(0, ain, aout);
- }
-
- /**
- * Get a KernelID for the Clear kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDClear() {
- return createKernelID(0, 3, null, null);
- }
-
-
- /**
- * Sets dst = src
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachSrc(Allocation ain, Allocation aout) {
- blend(1, ain, aout);
- }
-
- /**
- * Get a KernelID for the Src kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDSrc() {
- return createKernelID(1, 3, null, null);
- }
-
- /**
- * Sets dst = dst
- *
- * This is a NOP.
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachDst(Allocation ain, Allocation aout) {
- // NOP
- }
-
- /**
- * Get a KernelID for the Dst kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDDst() {
- return createKernelID(2, 3, null, null);
- }
-
- /**
- * Sets dst = src + dst * (1.0 - src.a)
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachSrcOver(Allocation ain, Allocation aout) {
- blend(3, ain, aout);
- }
-
- /**
- * Get a KernelID for the SrcOver kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDSrcOver() {
- return createKernelID(3, 3, null, null);
- }
-
- /**
- * Sets dst = dst + src * (1.0 - dst.a)
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachDstOver(Allocation ain, Allocation aout) {
- blend(4, ain, aout);
- }
-
- /**
- * Get a KernelID for the DstOver kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDDstOver() {
- return createKernelID(4, 3, null, null);
- }
-
- /**
- * Sets dst = src * dst.a
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachSrcIn(Allocation ain, Allocation aout) {
- blend(5, ain, aout);
- }
-
- /**
- * Get a KernelID for the SrcIn kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDSrcIn() {
- return createKernelID(5, 3, null, null);
- }
-
- /**
- * Sets dst = dst * src.a
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachDstIn(Allocation ain, Allocation aout) {
- blend(6, ain, aout);
- }
-
- /**
- * Get a KernelID for the DstIn kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDDstIn() {
- return createKernelID(6, 3, null, null);
- }
-
- /**
- * Sets dst = src * (1.0 - dst.a)
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachSrcOut(Allocation ain, Allocation aout) {
- blend(7, ain, aout);
- }
-
- /**
- * Get a KernelID for the SrcOut kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDSrcOut() {
- return createKernelID(7, 3, null, null);
- }
-
- /**
- * Sets dst = dst * (1.0 - src.a)
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachDstOut(Allocation ain, Allocation aout) {
- blend(8, ain, aout);
- }
-
- /**
- * Get a KernelID for the DstOut kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDDstOut() {
- return createKernelID(8, 3, null, null);
- }
-
- /**
- * dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb
- * dst.a = dst.a
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachSrcAtop(Allocation ain, Allocation aout) {
- blend(9, ain, aout);
- }
-
- /**
- * Get a KernelID for the SrcAtop kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDSrcAtop() {
- return createKernelID(9, 3, null, null);
- }
-
- /**
- * dst = dst.rgb * src.a + (1.0 - dst.a) * src.rgb
- * dst.a = src.a
- * Note: Before API 23, the alpha channel was not correctly set.
- * Please use with caution when targeting older APIs.
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachDstAtop(Allocation ain, Allocation aout) {
- blend(10, ain, aout);
- }
-
- /**
- * Get a KernelID for the DstAtop kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDDstAtop() {
- return createKernelID(10, 3, null, null);
- }
-
- /**
- * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a}
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachXor(Allocation ain, Allocation aout) {
- blend(11, ain, aout);
- }
-
- /**
- * Get a KernelID for the Xor kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDXor() {
- return createKernelID(11, 3, null, null);
- }
-
- ////////
-/*
- public void forEachNormal(Allocation ain, Allocation aout) {
- blend(12, ain, aout);
- }
-
- public void forEachAverage(Allocation ain, Allocation aout) {
- blend(13, ain, aout);
- }
-*/
- /**
- * Sets dst = src * dst
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachMultiply(Allocation ain, Allocation aout) {
- blend(14, ain, aout);
- }
-
- /**
- * Get a KernelID for the Multiply kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDMultiply() {
- return createKernelID(14, 3, null, null);
- }
-
-/*
- public void forEachScreen(Allocation ain, Allocation aout) {
- blend(15, ain, aout);
- }
-
- public void forEachDarken(Allocation ain, Allocation aout) {
- blend(16, ain, aout);
- }
-
- public void forEachLighten(Allocation ain, Allocation aout) {
- blend(17, ain, aout);
- }
-
- public void forEachOverlay(Allocation ain, Allocation aout) {
- blend(18, ain, aout);
- }
-
- public void forEachHardlight(Allocation ain, Allocation aout) {
- blend(19, ain, aout);
- }
-
- public void forEachSoftlight(Allocation ain, Allocation aout) {
- blend(20, ain, aout);
- }
-
- public void forEachDifference(Allocation ain, Allocation aout) {
- blend(21, ain, aout);
- }
-
- public void forEachNegation(Allocation ain, Allocation aout) {
- blend(22, ain, aout);
- }
-
- public void forEachExclusion(Allocation ain, Allocation aout) {
- blend(23, ain, aout);
- }
-
- public void forEachColorDodge(Allocation ain, Allocation aout) {
- blend(24, ain, aout);
- }
-
- public void forEachInverseColorDodge(Allocation ain, Allocation aout) {
- blend(25, ain, aout);
- }
-
- public void forEachSoftDodge(Allocation ain, Allocation aout) {
- blend(26, ain, aout);
- }
-
- public void forEachColorBurn(Allocation ain, Allocation aout) {
- blend(27, ain, aout);
- }
-
- public void forEachInverseColorBurn(Allocation ain, Allocation aout) {
- blend(28, ain, aout);
- }
-
- public void forEachSoftBurn(Allocation ain, Allocation aout) {
- blend(29, ain, aout);
- }
-
- public void forEachReflect(Allocation ain, Allocation aout) {
- blend(30, ain, aout);
- }
-
- public void forEachGlow(Allocation ain, Allocation aout) {
- blend(31, ain, aout);
- }
-
- public void forEachFreeze(Allocation ain, Allocation aout) {
- blend(32, ain, aout);
- }
-
- public void forEachHeat(Allocation ain, Allocation aout) {
- blend(33, ain, aout);
- }
-*/
- /**
- * Sets dst = min(src + dst, 1.0)
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachAdd(Allocation ain, Allocation aout) {
- blend(34, ain, aout);
- }
-
- /**
- * Get a KernelID for the Add kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDAdd() {
- return createKernelID(34, 3, null, null);
- }
-
- /**
- * Sets dst = max(dst - src, 0.0)
- *
- * @param ain The source buffer
- * @param aout The destination buffer
- */
- public void forEachSubtract(Allocation ain, Allocation aout) {
- blend(35, ain, aout);
- }
-
- /**
- * Get a KernelID for the Subtract kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelIDSubtract() {
- return createKernelID(35, 3, null, null);
- }
-
-/*
- public void forEachStamp(Allocation ain, Allocation aout) {
- blend(36, ain, aout);
- }
-
- public void forEachRed(Allocation ain, Allocation aout) {
- blend(37, ain, aout);
- }
-
- public void forEachGreen(Allocation ain, Allocation aout) {
- blend(38, ain, aout);
- }
-
- public void forEachBlue(Allocation ain, Allocation aout) {
- blend(39, ain, aout);
- }
-
- public void forEachHue(Allocation ain, Allocation aout) {
- blend(40, ain, aout);
- }
-
- public void forEachSaturation(Allocation ain, Allocation aout) {
- blend(41, ain, aout);
- }
-
- public void forEachColor(Allocation ain, Allocation aout) {
- blend(42, ain, aout);
- }
-
- public void forEachLuminosity(Allocation ain, Allocation aout) {
- blend(43, ain, aout);
- }
-*/
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBlur.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBlur.java
deleted file mode 100644
index e1a134a..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicBlur.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.util.Log;
-
-/**
- * Intrinsic Gausian blur filter. Applies a gaussian blur of the
- * specified radius to all elements of an allocation.
- *
- *
- **/
-public class ScriptIntrinsicBlur extends ScriptIntrinsic {
- private final float[] mValues = new float[9];
- private Allocation mInput;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- protected ScriptIntrinsicBlur(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Create an intrinsic for applying a blur to an allocation. The
- * default radius is 5.0.
- *
- * Supported elements types are {@link Element#U8},
- * {@link Element#U8_4}.
- *
- * @param rs The RenderScript context
- * @param e Element type for inputs and outputs
- *
- * @return ScriptIntrinsicBlur
- */
- public static ScriptIntrinsicBlur create(RenderScript rs, Element e) {
- if ((!e.isCompatible(Element.U8_4(rs))) && (!e.isCompatible(Element.U8(rs)))) {
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(5, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicBlur si = new ScriptIntrinsicBlur(id, rs);
- si.setIncSupp(mUseIncSupp);
- si.setRadius(5.f);
-
- return si;
- }
-
- /**
- * Set the input of the blur.
- * Must match the element type supplied during create.
- *
- * @param ain The input allocation
- */
- public void setInput(Allocation ain) {
- mInput = ain;
- setVar(1, ain);
- }
-
- /**
- * Set the radius of the Blur.
- *
- * Supported range 0 < radius <= 25
- *
- * @param radius The radius of the blur
- */
- public void setRadius(float radius) {
- if (radius <= 0 || radius > 25) {
- throw new RSIllegalArgumentException("Radius out of range (0 < r <= 25).");
- }
- setVar(0, radius);
- }
-
- /**
- * Apply the filter to the input and save to the specified
- * allocation.
- *
- * @param aout Output allocation. Must match creation element
- * type.
- */
- public void forEach(Allocation aout) {
- forEach(0, (Allocation) null, aout, null);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 2, null, null);
- }
-
- /**
- * Get a FieldID for the input field of this intrinsic.
- *
- * @return Script.FieldID The FieldID object.
- */
- public Script.FieldID getFieldID_Input() {
- return createFieldID(1, null);
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicColorMatrix.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicColorMatrix.java
deleted file mode 100644
index f03526e..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicColorMatrix.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- * Intrinsic for applying a color matrix to allocations.
- *
- * This has the same effect as loading each element and
- * converting it to a {@link Element#F32_4}, multiplying the
- * result by the 4x4 color matrix as performed by
- * rsMatrixMultiply() and writing it to the output after
- * conversion back to {@link Element#U8_4}.
- **/
-public class ScriptIntrinsicColorMatrix extends ScriptIntrinsic {
- private final Matrix4f mMatrix = new Matrix4f();
- private final Float4 mAdd = new Float4();
- private Allocation mInput;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- protected ScriptIntrinsicColorMatrix(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Create an intrinsic for applying a color matrix to an
- * allocation.
- *
- * Supported elements types are {@link Element#U8_4}
- *
- * @param rs The RenderScript context
- * @param e Element type for intputs and outputs
- *
- * @return ScriptIntrinsicColorMatrix
- */
- public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) {
- if (!e.isCompatible(Element.U8_4(rs))) {
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(2, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicColorMatrix si = new ScriptIntrinsicColorMatrix(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
-
- }
-
- private void setMatrix() {
- FieldPacker fp = new FieldPacker(16*4);
- fp.addMatrix(mMatrix);
- setVar(0, fp);
- }
-
- /**
- * Set the color matrix which will be applied to each cell of
- * the image.
- *
- * @param m The 4x4 matrix to set.
- */
- public void setColorMatrix(Matrix4f m) {
- mMatrix.load(m);
- setMatrix();
- }
-
- /**
- * Set the color matrix which will be applied to each cell of the image.
- * This will set the alpha channel to be a copy.
- *
- * @param m The 3x3 matrix to set.
- */
- public void setColorMatrix(Matrix3f m) {
- mMatrix.load(m);
- setMatrix();
- }
-
- /**
- * Set the value to be added after the color matrix has been
- * applied. The default value is {0, 0, 0, 0}
- *
- * @param f The float4 value to be added.
- */
- public void setAdd(Float4 f) {
- mAdd.x = f.x;
- mAdd.y = f.y;
- mAdd.z = f.z;
- mAdd.w = f.w;
-
- FieldPacker fp = new FieldPacker(4*4);
- fp.addF32(f.x);
- fp.addF32(f.y);
- fp.addF32(f.z);
- fp.addF32(f.w);
- setVar(1, fp);
- }
-
- /**
- * Set the value to be added after the color matrix has been
- * applied. The default value is {0, 0, 0, 0}
- *
- * @param r The red add value.
- * @param g The green add value.
- * @param b The blue add value.
- * @param a The alpha add value.
- */
- public void setAdd(float r, float g, float b, float a) {
- mAdd.x = r;
- mAdd.y = g;
- mAdd.z = b;
- mAdd.w = a;
-
- FieldPacker fp = new FieldPacker(4*4);
- fp.addF32(mAdd.x);
- fp.addF32(mAdd.y);
- fp.addF32(mAdd.z);
- fp.addF32(mAdd.w);
- setVar(1, fp);
- }
-
- /**
- * Set a color matrix to convert from RGB to luminance. The alpha channel
- * will be a copy.
- *
- */
- public void setGreyscale() {
- mMatrix.loadIdentity();
- mMatrix.set(0, 0, 0.299f);
- mMatrix.set(1, 0, 0.587f);
- mMatrix.set(2, 0, 0.114f);
- mMatrix.set(0, 1, 0.299f);
- mMatrix.set(1, 1, 0.587f);
- mMatrix.set(2, 1, 0.114f);
- mMatrix.set(0, 2, 0.299f);
- mMatrix.set(1, 2, 0.587f);
- mMatrix.set(2, 2, 0.114f);
- setMatrix();
- }
-
- /**
- * Set the matrix to convert from YUV to RGB with a direct copy of the 4th
- * channel.
- *
- */
- public void setYUVtoRGB() {
- mMatrix.loadIdentity();
- mMatrix.set(0, 0, 1.f);
- mMatrix.set(1, 0, 0.f);
- mMatrix.set(2, 0, 1.13983f);
- mMatrix.set(0, 1, 1.f);
- mMatrix.set(1, 1, -0.39465f);
- mMatrix.set(2, 1, -0.5806f);
- mMatrix.set(0, 2, 1.f);
- mMatrix.set(1, 2, 2.03211f);
- mMatrix.set(2, 2, 0.f);
- setMatrix();
- }
-
- /**
- * Set the matrix to convert from RGB to YUV with a direct copy of the 4th
- * channel.
- *
- */
- public void setRGBtoYUV() {
- mMatrix.loadIdentity();
- mMatrix.set(0, 0, 0.299f);
- mMatrix.set(1, 0, 0.587f);
- mMatrix.set(2, 0, 0.114f);
- mMatrix.set(0, 1, -0.14713f);
- mMatrix.set(1, 1, -0.28886f);
- mMatrix.set(2, 1, 0.436f);
- mMatrix.set(0, 2, 0.615f);
- mMatrix.set(1, 2, -0.51499f);
- mMatrix.set(2, 2, -0.10001f);
- setMatrix();
- }
-
-
- /**
- * Invoke the kernel and apply the matrix to each cell of ain and copy to
- * aout.
- *
- * @param ain Input allocation
- * @param aout Output allocation
- */
- public void forEach(Allocation ain, Allocation aout) {
- forEach(0, ain, aout, null);
- }
-
- /**
- * Invoke the kernel and apply the matrix to each cell of input
- * {@link Allocation} and copy to the output {@link Allocation}.
- *
- * If the vector size of the input is less than four, the
- * remaining components are treated as zero for the matrix
- * multiply.
- *
- * If the output vector size is less than four, the unused
- * vector components are discarded.
- *
- *
- * @param ain Input allocation
- * @param aout Output allocation
- * @param opt LaunchOptions for clipping
- */
- public void forEach(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
- if (!ain.getElement().isCompatible(Element.U8(mRS)) &&
- !ain.getElement().isCompatible(Element.U8_2(mRS)) &&
- !ain.getElement().isCompatible(Element.U8_3(mRS)) &&
- !ain.getElement().isCompatible(Element.U8_4(mRS)) &&
- !ain.getElement().isCompatible(Element.F32(mRS)) &&
- !ain.getElement().isCompatible(Element.F32_2(mRS)) &&
- !ain.getElement().isCompatible(Element.F32_3(mRS)) &&
- !ain.getElement().isCompatible(Element.F32_4(mRS))) {
-
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
-
- if (!aout.getElement().isCompatible(Element.U8(mRS)) &&
- !aout.getElement().isCompatible(Element.U8_2(mRS)) &&
- !aout.getElement().isCompatible(Element.U8_3(mRS)) &&
- !aout.getElement().isCompatible(Element.U8_4(mRS)) &&
- !aout.getElement().isCompatible(Element.F32(mRS)) &&
- !aout.getElement().isCompatible(Element.F32_2(mRS)) &&
- !aout.getElement().isCompatible(Element.F32_3(mRS)) &&
- !aout.getElement().isCompatible(Element.F32_4(mRS))) {
-
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
-
- forEach(0, ain, aout, null, opt);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 3, null, null);
- }
-
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicConvolve3x3.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicConvolve3x3.java
deleted file mode 100644
index 17889aa..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicConvolve3x3.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- * Intrinsic for applying a 3x3 convolve to an allocation.
- *
- **/
-public class ScriptIntrinsicConvolve3x3 extends ScriptIntrinsic {
- private final float[] mValues = new float[9];
- private Allocation mInput;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- ScriptIntrinsicConvolve3x3(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Supported elements types are {@link Element#U8}, {@link
- * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4},
- * {@link Element#F32}, {@link Element#F32_2}, {@link
- * Element#F32_3}, and {@link Element#F32_4}.
- *
- * <p> The default coefficients are:
- * <code>
- * <p> [ 0, 0, 0 ]
- * <p> [ 0, 1, 0 ]
- * <p> [ 0, 0, 0 ]
- * </code>
- *
- * @param rs The RenderScript context
- * @param e Element type for intputs and outputs
- *
- * @return ScriptIntrinsicConvolve3x3
- */
- public static ScriptIntrinsicConvolve3x3 create(RenderScript rs, Element e) {
- float f[] = { 0, 0, 0, 0, 1, 0, 0, 0, 0};
- if (!e.isCompatible(Element.U8(rs)) &&
- !e.isCompatible(Element.U8_2(rs)) &&
- !e.isCompatible(Element.U8_3(rs)) &&
- !e.isCompatible(Element.U8_4(rs)) &&
- !e.isCompatible(Element.F32(rs)) &&
- !e.isCompatible(Element.F32_2(rs)) &&
- !e.isCompatible(Element.F32_3(rs)) &&
- !e.isCompatible(Element.F32_4(rs))) {
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(1, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicConvolve3x3 si = new ScriptIntrinsicConvolve3x3(id, rs);
- si.setIncSupp(mUseIncSupp);
- si.setCoefficients(f);
- return si;
- }
-
- /**
- * Set the input of the 3x3 convolve.
- * Must match the element type supplied during create.
- *
- * @param ain The input allocation.
- */
- public void setInput(Allocation ain) {
- mInput = ain;
- setVar(1, ain);
- }
-
- /**
- * Set the coefficients for the convolve.
- *
- * <p> The convolve layout is:
- * <code>
- * <p> [ 0, 1, 2 ]
- * <p> [ 3, 4, 5 ]
- * <p> [ 6, 7, 8 ]
- * </code>
- *
- * @param v The array of coefficients to set
- */
- public void setCoefficients(float v[]) {
- FieldPacker fp = new FieldPacker(9*4);
- for (int ct=0; ct < mValues.length; ct++) {
- mValues[ct] = v[ct];
- fp.addF32(mValues[ct]);
- }
- setVar(0, fp);
- }
-
- /**
- * Apply the filter to the input and save to the specified
- * allocation.
- *
- * @param aout Output allocation. Must match creation element
- * type.
- */
- public void forEach(Allocation aout) {
- forEach(0, (Allocation) null, aout, null);
- }
-
- /**
- * Apply the filter to the input and save to the specified
- * allocation.
- *
- * @param aout Output allocation. Must match creation element
- * type.
- * @param opt LaunchOptions for clipping
- */
- public void forEach(Allocation aout, Script.LaunchOptions opt) {
- forEach(0, (Allocation) null, aout, null, opt);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 2, null, null);
- }
-
- /**
- * Get a FieldID for the input field of this intrinsic.
- *
- * @return Script.FieldID The FieldID object.
- */
- public Script.FieldID getFieldID_Input() {
- return createFieldID(1, null);
- }
-
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicConvolve5x5.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicConvolve5x5.java
deleted file mode 100644
index 2c591ba..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicConvolve5x5.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- * Intrinsic for applying a 5x5 convolve to an allocation.
- *
- **/
-public class ScriptIntrinsicConvolve5x5 extends ScriptIntrinsic {
- private final float[] mValues = new float[25];
- private Allocation mInput;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- ScriptIntrinsicConvolve5x5(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Supported elements types are {@link Element#U8}, {@link
- * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4},
- * {@link Element#F32}, {@link Element#F32_2}, {@link
- * Element#F32_3}, and {@link Element#F32_4}.
- *
- * <p> The default coefficients are:
- * <code>
- * <p> [ 0, 0, 0, 0, 0 ]
- * <p> [ 0, 0, 0, 0, 0 ]
- * <p> [ 0, 0, 1, 0, 0 ]
- * <p> [ 0, 0, 0, 0, 0 ]
- * <p> [ 0, 0, 0, 0, 0 ]
- * </code>
- *
- * @param rs The RenderScript context
- * @param e Element type for intputs and outputs
- *
- * @return ScriptIntrinsicConvolve5x5
- */
- public static ScriptIntrinsicConvolve5x5 create(RenderScript rs, Element e) {
- if (!e.isCompatible(Element.U8(rs)) &&
- !e.isCompatible(Element.U8_2(rs)) &&
- !e.isCompatible(Element.U8_3(rs)) &&
- !e.isCompatible(Element.U8_4(rs)) &&
- !e.isCompatible(Element.F32(rs)) &&
- !e.isCompatible(Element.F32_2(rs)) &&
- !e.isCompatible(Element.F32_3(rs)) &&
- !e.isCompatible(Element.F32_4(rs))) {
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(4, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicConvolve5x5 si = new ScriptIntrinsicConvolve5x5(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
-
- }
-
- /**
- * Set the input of the 5x5 convolve.
- * Must match the element type supplied during create.
- *
- * @param ain The input allocation.
- */
- public void setInput(Allocation ain) {
- mInput = ain;
- setVar(1, ain);
- }
-
- /**
- * Set the coefficients for the convolve.
- *
- * <p> The convolve layout is:
- * <code>
- * <p> [ 0, 1, 2, 3, 4 ]
- * <p> [ 5, 6, 7, 8, 9 ]
- * <p> [ 10, 11, 12, 13, 14 ]
- * <p> [ 15, 16, 17, 18, 19 ]
- * <p> [ 20, 21, 22, 23, 24 ]
- * </code>
- *
- * @param v The array of coefficients to set
- */
- public void setCoefficients(float v[]) {
- FieldPacker fp = new FieldPacker(25*4);
- for (int ct=0; ct < mValues.length; ct++) {
- mValues[ct] = v[ct];
- fp.addF32(mValues[ct]);
- }
- setVar(0, fp);
- }
-
- /**
- * Apply the filter to the input and save to the specified
- * allocation.
- *
- * @param aout Output allocation. Must match creation element
- * type.
- */
- public void forEach(Allocation aout) {
- forEach(0, (Allocation) null, aout, null);
- }
-
- /**
- * Apply the filter to the input and save to the specified
- * allocation.
- *
- * @param aout Output allocation. Must match creation element
- * type.
- * @param opt LaunchOptions for clipping
- */
- public void forEach(Allocation aout, Script.LaunchOptions opt) {
- forEach(0, (Allocation) null, aout, null, opt);
- }
-
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 2, null, null);
- }
-
- /**
- * Get a FieldID for the input field of this intrinsic.
- *
- * @return Script.FieldID The FieldID object.
- */
- public Script.FieldID getFieldID_Input() {
- return createFieldID(1, null);
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicHistogram.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicHistogram.java
deleted file mode 100644
index e3e6406..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicHistogram.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2015 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- * Intrinsic Histogram filter.
- *
- *
- **/
-public class ScriptIntrinsicHistogram extends ScriptIntrinsic {
- private Allocation mOut;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- protected ScriptIntrinsicHistogram(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Create an intrinsic for calculating the histogram of an uchar
- * or uchar4 image.
- *
- * Supported elements types are
- * {@link Element#U8_4}, {@link Element#U8_3},
- * {@link Element#U8_2}, {@link Element#U8}
- *
- * @param rs The RenderScript context
- * @param e Element type for inputs
- *
- * @return ScriptIntrinsicHistogram
- */
- public static ScriptIntrinsicHistogram create(RenderScript rs, Element e) {
- if ((!e.isCompatible(Element.U8_4(rs))) &&
- (!e.isCompatible(Element.U8_3(rs))) &&
- (!e.isCompatible(Element.U8_2(rs))) &&
- (!e.isCompatible(Element.U8(rs)))) {
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(9, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicHistogram si = new ScriptIntrinsicHistogram(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
- }
-
- /**
- * Process an input buffer and place the histogram into the
- * output allocation. The output allocation may be a narrower
- * vector size than the input. In this case the vector size of
- * the output is used to determine how many of the input
- * channels are used in the computation. This is useful if you
- * have an RGBA input buffer but only want the histogram for
- * RGB.
- *
- * 1D and 2D input allocations are supported.
- *
- * @param ain The input image
- */
- public void forEach(Allocation ain) {
- forEach(ain, null);
- }
-
- /**
- * Process an input buffer and place the histogram into the
- * output allocation. The output allocation may be a narrower
- * vector size than the input. In this case the vector size of
- * the output is used to determine how many of the input
- * channels are used in the computation. This is useful if you
- * have an RGBA input buffer but only want the histogram for
- * RGB.
- *
- * 1D and 2D input allocations are supported.
- *
- * @param ain The input image
- * @param opt LaunchOptions for clipping
- */
- public void forEach(Allocation ain, Script.LaunchOptions opt) {
- if (ain.getType().getElement().getVectorSize() <
- mOut.getType().getElement().getVectorSize()) {
-
- throw new RSIllegalArgumentException(
- "Input vector size must be >= output vector size.");
- }
- if (!ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
- !ain.getType().getElement().isCompatible(Element.U8_2(mRS)) &&
- !ain.getType().getElement().isCompatible(Element.U8_3(mRS)) &&
- !ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
- throw new RSIllegalArgumentException("Input type must be U8, U8_1, U8_2 or U8_4.");
- }
-
- forEach(0, ain, null, null, opt);
- }
-
-
-
- /**
- * Set the coefficients used for the RGBA to Luminocity
- * calculation. The default is {0.299f, 0.587f, 0.114f, 0.f}.
- *
- * Coefficients must be >= 0 and sum to 1.0 or less.
- *
- * @param r Red coefficient
- * @param g Green coefficient
- * @param b Blue coefficient
- * @param a Alpha coefficient
- */
- public void setDotCoefficients(float r, float g, float b, float a) {
- if ((r < 0.f) || (g < 0.f) || (b < 0.f) || (a < 0.f)) {
- throw new RSIllegalArgumentException("Coefficient may not be negative.");
- }
- if ((r + g + b + a) > 1.f) {
- throw new RSIllegalArgumentException("Sum of coefficients must be 1.0 or less.");
- }
-
- FieldPacker fp = new FieldPacker(16);
- fp.addF32(r);
- fp.addF32(g);
- fp.addF32(b);
- fp.addF32(a);
- setVar(0, fp);
- }
-
- /**
- * Set the output of the histogram. 32 bit integer types are
- * supported.
- *
- * @param aout The output allocation
- */
- public void setOutput(Allocation aout) {
- mOut = aout;
- if (mOut.getType().getElement() != Element.U32(mRS) &&
- mOut.getType().getElement() != Element.U32_2(mRS) &&
- mOut.getType().getElement() != Element.U32_3(mRS) &&
- mOut.getType().getElement() != Element.U32_4(mRS) &&
- mOut.getType().getElement() != Element.I32(mRS) &&
- mOut.getType().getElement() != Element.I32_2(mRS) &&
- mOut.getType().getElement() != Element.I32_3(mRS) &&
- mOut.getType().getElement() != Element.I32_4(mRS)) {
-
- throw new RSIllegalArgumentException("Output type must be U32 or I32.");
- }
- if ((mOut.getType().getX() != 256) ||
- (mOut.getType().getY() != 0) ||
- mOut.getType().hasMipmaps() ||
- (mOut.getType().getYuv() != 0)) {
-
- throw new RSIllegalArgumentException("Output must be 1D, 256 elements.");
- }
- setVar(1, aout);
- }
-
-
- /**
- * Process an input buffer and place the histogram into the
- * output allocation. The dot product of the input channel and
- * the coefficients from 'setDotCoefficients' are used to
- * calculate the output values.
- *
- * 1D and 2D input allocations are supported.
- *
- * @param ain The input image
- */
- public void forEach_Dot(Allocation ain) {
- forEach_Dot(ain, null);
- }
-
- /**
- * Process an input buffer and place the histogram into the
- * output allocation. The dot product of the input channel and
- * the coefficients from 'setDotCoefficients' are used to
- * calculate the output values.
- *
- * 1D and 2D input allocations are supported.
- *
- * @param ain The input image
- * @param opt LaunchOptions for clipping
- */
- public void forEach_Dot(Allocation ain, Script.LaunchOptions opt) {
- if (mOut.getType().getElement().getVectorSize() != 1) {
- throw new RSIllegalArgumentException("Output vector size must be one.");
- }
- if (!ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
- !ain.getType().getElement().isCompatible(Element.U8_2(mRS)) &&
- !ain.getType().getElement().isCompatible(Element.U8_3(mRS)) &&
- !ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
- throw new RSIllegalArgumentException("Input type must be U8, U8_1, U8_2 or U8_4.");
- }
-
- forEach(1, ain, null, null, opt);
- }
-
-
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID_Separate() {
- return createKernelID(0, 3, null, null);
- }
-
- /**
- * Get a FieldID for the input field of this intrinsic.
- *
- * @return Script.FieldID The FieldID object.
- */
- public Script.FieldID getFieldID_Input() {
- return createFieldID(1, null);
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicLUT.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicLUT.java
deleted file mode 100644
index 0b905ba..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicLUT.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- * Intrinsic for applying a per-channel lookup table. Each
- * channel of the input has an independant lookup table. The
- * tables are 256 entries in size and can cover the full value
- * range of {@link Element#U8_4}.
- **/
-public class ScriptIntrinsicLUT extends ScriptIntrinsic {
- private final Matrix4f mMatrix = new Matrix4f();
- private Allocation mTables;
- private final byte mCache[] = new byte[1024];
- private boolean mDirty = true;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- protected ScriptIntrinsicLUT(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Supported elements types are {@link Element#U8_4}
- *
- * The defaults tables are identity.
- *
- * @param rs The RenderScript context
- * @param e Element type for intputs and outputs
- *
- * @return ScriptIntrinsicLUT
- */
- public static ScriptIntrinsicLUT create(RenderScript rs, Element e) {
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(3, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicLUT si = new ScriptIntrinsicLUT(id, rs);
- si.setIncSupp(mUseIncSupp);
- si.mTables = Allocation.createSized(rs, Element.U8(rs), 1024);
- for (int ct=0; ct < 256; ct++) {
- si.mCache[ct] = (byte)ct;
- si.mCache[ct + 256] = (byte)ct;
- si.mCache[ct + 512] = (byte)ct;
- si.mCache[ct + 768] = (byte)ct;
- }
- si.setVar(0, si.mTables);
- return si;
- }
-
-
- private void validate(int index, int value) {
- if (index < 0 || index > 255) {
- throw new RSIllegalArgumentException("Index out of range (0-255).");
- }
- if (value < 0 || value > 255) {
- throw new RSIllegalArgumentException("Value out of range (0-255).");
- }
- }
-
- /**
- * Set an entry in the red channel lookup table
- *
- * @param index Must be 0-255
- * @param value Must be 0-255
- */
- public void setRed(int index, int value) {
- validate(index, value);
- mCache[index] = (byte)value;
- mDirty = true;
- }
-
- /**
- * Set an entry in the green channel lookup table
- *
- * @param index Must be 0-255
- * @param value Must be 0-255
- */
- public void setGreen(int index, int value) {
- validate(index, value);
- mCache[index+256] = (byte)value;
- mDirty = true;
- }
-
- /**
- * Set an entry in the blue channel lookup table
- *
- * @param index Must be 0-255
- * @param value Must be 0-255
- */
- public void setBlue(int index, int value) {
- validate(index, value);
- mCache[index+512] = (byte)value;
- mDirty = true;
- }
-
- /**
- * Set an entry in the alpha channel lookup table
- *
- * @param index Must be 0-255
- * @param value Must be 0-255
- */
- public void setAlpha(int index, int value) {
- validate(index, value);
- mCache[index+768] = (byte)value;
- mDirty = true;
- }
-
-
- /**
- * Invoke the kernel and apply the lookup to each cell of ain
- * and copy to aout.
- *
- * @param ain Input allocation
- * @param aout Output allocation
- */
- public void forEach(Allocation ain, Allocation aout) {
- if (mDirty) {
- mDirty = false;
- mTables.copyFromUnchecked(mCache);
- }
- forEach(0, ain, aout, null);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 3, null, null);
- }
-}
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicResize.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicResize.java
deleted file mode 100644
index 61c169c..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicResize.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2015 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.
- */
-
-package android.support.v8.renderscript;
-
-import android.util.Log;
-
-/**
- * Intrinsic for performing a resize of a 2D allocation.
- */
-public class ScriptIntrinsicResize extends ScriptIntrinsic {
- private Allocation mInput;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 21;
-
- protected ScriptIntrinsicResize(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Supported elements types are {@link Element#U8}, {@link
- * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4}
- * {@link Element#F32}, {@link Element#F32_2}, {@link
- * Element#F32_3}, {@link Element#F32_4}
- *
- * @param rs The RenderScript context
- *
- * @return ScriptIntrinsicResize
- */
- public static ScriptIntrinsicResize create(RenderScript rs) {
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(12, 0, mUseIncSupp);
-
- ScriptIntrinsicResize si = new ScriptIntrinsicResize(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
-
- }
-
- /**
- * Set the input of the resize.
- * Must match the element type supplied during create.
- *
- * @param ain The input allocation.
- */
- public void setInput(Allocation ain) {
- Element e = ain.getElement();
- if (!e.isCompatible(Element.U8(mRS)) &&
- !e.isCompatible(Element.U8_2(mRS)) &&
- !e.isCompatible(Element.U8_3(mRS)) &&
- !e.isCompatible(Element.U8_4(mRS)) &&
- !e.isCompatible(Element.F32(mRS)) &&
- !e.isCompatible(Element.F32_2(mRS)) &&
- !e.isCompatible(Element.F32_3(mRS)) &&
- !e.isCompatible(Element.F32_4(mRS))) {
- throw new RSIllegalArgumentException("Unsupported element type.");
- }
-
- mInput = ain;
- setVar(0, ain);
- }
-
- /**
- * Get a FieldID for the input field of this intrinsic.
- *
- * @return Script.FieldID The FieldID object.
- */
- public Script.FieldID getFieldID_Input() {
- return createFieldID(0, null);
- }
-
-
- /**
- * Resize copy the input allocation to the output specified. The
- * Allocation is rescaled if necessary using bi-cubic
- * interpolation.
- *
- * @param aout Output allocation. Element type must match
- * current input. Must not be same as input.
- */
- public void forEach_bicubic(Allocation aout) {
- if (aout == mInput) {
- throw new RSIllegalArgumentException("Output cannot be same as Input.");
- }
- forEach_bicubic(aout, null);
- }
-
- /**
- * Resize copy the input allocation to the output specified. The
- * Allocation is rescaled if necessary using bi-cubic
- * interpolation.
- *
- * @param aout Output allocation. Element type must match
- * current input.
- * @param opt LaunchOptions for clipping
- */
- public void forEach_bicubic(Allocation aout, Script.LaunchOptions opt) {
- forEach(0, (Allocation) null, aout, null, opt);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID_bicubic() {
- return createKernelID(0, 2, null, null);
- }
-
-
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicYuvToRGB.java b/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicYuvToRGB.java
deleted file mode 100644
index 6c84020..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/ScriptIntrinsicYuvToRGB.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-package android.support.v8.renderscript;
-
-
-/**
- * Intrinsic for converting an Android YUV buffer to RGB.
- *
- * The input allocation is supplied in NV21 format as a U8
- * element type. The output is RGBA, the alpha channel will be
- * set to 255.
- */
-public class ScriptIntrinsicYuvToRGB extends ScriptIntrinsic {
- private Allocation mInput;
- // API level for the intrinsic
- private static final int INTRINSIC_API_LEVEL = 19;
-
- ScriptIntrinsicYuvToRGB(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /**
- * Create an intrinsic for converting YUV to RGB.
- *
- * Supported elements types are {@link Element#U8_4}
- *
- * @param rs The RenderScript context
- * @param e Element type for output
- *
- * @return ScriptIntrinsicYuvToRGB
- */
- public static ScriptIntrinsicYuvToRGB create(RenderScript rs, Element e) {
- // 6 comes from RS_SCRIPT_INTRINSIC_YUV_TO_RGB in rsDefines.h
- long id;
- boolean mUseIncSupp = rs.isUseNative() &&
- android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
-
- id = rs.nScriptIntrinsicCreate(6, e.getID(rs), mUseIncSupp);
-
- ScriptIntrinsicYuvToRGB si = new ScriptIntrinsicYuvToRGB(id, rs);
- si.setIncSupp(mUseIncSupp);
- return si;
- }
-
-
- /**
- * Set the input yuv allocation, must be {@link Element#U8}.
- *
- * @param ain The input allocation.
- */
- public void setInput(Allocation ain) {
- mInput = ain;
- setVar(0, ain);
- }
-
- /**
- * Convert the image to RGB.
- *
- * @param aout Output allocation. Must match creation element
- * type.
- */
- public void forEach(Allocation aout) {
- forEach(0, (Allocation) null, aout, null);
- }
-
- /**
- * Get a KernelID for this intrinsic kernel.
- *
- * @return Script.KernelID The KernelID object.
- */
- public Script.KernelID getKernelID() {
- return createKernelID(0, 2, null, null);
- }
-
- /**
- * Get a FieldID for the input field of this intrinsic.
- *
- * @return Script.FieldID The FieldID object.
- */
- public Script.FieldID getFieldID_Input() {
- return createFieldID(0, null);
- }
-}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Short2.java b/v8/renderscript/java/src/android/support/v8/renderscript/Short2.java
deleted file mode 100644
index 365b319..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Short2.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript Short2 type back to the Android system.
- *
- **/
-public class Short2 {
- public Short2() {
- }
-
- public Short2(short initX, short initY) {
- x = initX;
- y = initY;
- }
-
- public short x;
- public short y;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Short3.java b/v8/renderscript/java/src/android/support/v8/renderscript/Short3.java
deleted file mode 100644
index abf8196..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Short3.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript short3 type back to the Android system.
- *
- **/
-public class Short3 {
- public Short3() {
- }
-
- public Short3(short initX, short initY, short initZ) {
- x = initX;
- y = initY;
- z = initZ;
- }
-
- public short x;
- public short y;
- public short z;
-}
-
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Short4.java b/v8/renderscript/java/src/android/support/v8/renderscript/Short4.java
deleted file mode 100644
index d2108e4..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Short4.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.
- */
-
-package android.support.v8.renderscript;
-
-import java.lang.Math;
-import android.util.Log;
-
-
-/**
- * Class for exposing the native RenderScript short4 type back to the Android system.
- *
- **/
-public class Short4 {
- public Short4() {
- }
-
- public Short4(short initX, short initY, short initZ, short initW) {
- x = initX;
- y = initY;
- z = initZ;
- w = initW;
- }
-
- public short x;
- public short y;
- public short z;
- public short w;
-}
-
-
-
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Type.java b/v8/renderscript/java/src/android/support/v8/renderscript/Type.java
deleted file mode 100644
index 6aeb9ea..0000000
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Type.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package android.support.v8.renderscript;
-
-
-import java.lang.reflect.Field;
-
-import android.graphics.ImageFormat;
-import android.util.Log;
-
-/**
- * <p>A Type describes the {@link android.support.v8.renderscript.Element} and
- * dimensions used for an {@link android.support.v8.renderscript.Allocation} or
- * a parallel operation. Types are created through
- * {@link android.support.v8.renderscript.Type.Builder}.</p>
- *
- * <p>A Type always includes an {@link android.support.v8.renderscript.Element}
- * and an X dimension. A Type may be multidimensional, up to three dimensions.
- * A nonzero value in the Y or Z dimensions indicates that the dimension is
- * present. Note that a Type with only a given X dimension and a Type with the
- * same X dimension but Y = 1 are not equivalent.</p>
- *
- * <p>A Type also supports inclusion of level of detail (LOD) or cube map
- * faces. LOD and cube map faces are booleans to indicate present or not
- * present. </p>
- *
- * <p>A Type also supports YUV format information to support an {@link
- * android.support.v8.renderscript.Allocation} in a YUV format. The YUV formats
- * supported are {@link android.graphics.ImageFormat#YV12} and {@link
- * android.graphics.ImageFormat#NV21}.</p>
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about creating an application that uses RenderScript,
- * read the
- * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
- * developer guide.</p>
- * </div>
- **/
-public class Type extends BaseObj {
- int mDimX;
- int mDimY;
- int mDimZ;
- boolean mDimMipmaps;
- boolean mDimFaces;
- int mDimYuv;
- int mElementCount;
- Element mElement;
-
- public enum CubemapFace {
- POSITIVE_X (0),
- NEGATIVE_X (1),
- POSITIVE_Y (2),
- NEGATIVE_Y (3),
- POSITIVE_Z (4),
- NEGATIVE_Z (5);
-
- int mID;
- CubemapFace(int id) {
- mID = id;
- }
- }
-
- /**
- * Return the element associated with this Type.
- *
- * @return Element
- */
- public Element getElement() {
- return mElement;
- }
-
- /**
- * Return the value of the X dimension.
- *
- * @return int
- */
- public int getX() {
- return mDimX;
- }
-
- /**
- * Return the value of the Y dimension or 0 for a 1D allocation.
- *
- * @return int
- */
- public int getY() {
- return mDimY;
- }
-
- /**
- * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
- *
- * @return int
- */
- public int getZ() {
- return mDimZ;
- }
-
- /**
- * Get the YUV format
- *
- * @return int
- */
- public int getYuv() {
- return mDimYuv;
- }
-
- /**
- * Return if the Type has a mipmap chain.
- *
- * @return boolean
- */
- public boolean hasMipmaps() {
- return mDimMipmaps;
- }
-
- /**
- * Return if the Type is a cube map.
- *
- * @return boolean
- */
- public boolean hasFaces() {
- return mDimFaces;
- }
-
- /**
- * Return the total number of accessable cells in the Type.
- *
- * @return int
- */
- public int getCount() {
- return mElementCount;
- }
-
- void calcElementCount() {
- boolean hasLod = hasMipmaps();
- int x = getX();
- int y = getY();
- int z = getZ();
- int faces = 1;
- if (hasFaces()) {
- faces = 6;
- }
- if (x == 0) {
- x = 1;
- }
- if (y == 0) {
- y = 1;
- }
- if (z == 0) {
- z = 1;
- }
-
- int count = x * y * z * faces;
-
- while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
- if(x > 1) {
- x >>= 1;
- }
- if(y > 1) {
- y >>= 1;
- }
- if(z > 1) {
- z >>= 1;
- }
-
- count += x * y * z * faces;
- }
- mElementCount = count;
- }
-
-
- Type(long id, RenderScript rs) {
- super(id, rs);
- }
-
- /*
- * Get an identical dummy Type for Compat Context
- *
- */
- public long getDummyType(RenderScript mRS, long eid) {
- return mRS.nIncTypeCreate(eid, mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mDimYuv);
- }
-
- /**
- * Utility function for creating basic 1D types. The type is
- * created without mipmaps enabled.
- *
- * @param rs The RenderScript context
- * @param e The Element for the Type
- * @param dimX The X dimension, must be > 0
- *
- * @return Type
- */
- static public Type createX(RenderScript rs, Element e, int dimX) {
- if (dimX < 1) {
- throw new RSInvalidStateException("Dimension must be >= 1.");
- }
-
- long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0);
- Type t = new Type(id, rs);
- t.mElement = e;
- t.mDimX = dimX;
- t.calcElementCount();
- return t;
- }
-
- /**
- * Utility function for creating basic 2D types. The type is
- * created without mipmaps or cubemaps.
- *
- * @param rs The RenderScript context
- * @param e The Element for the Type
- * @param dimX The X dimension, must be > 0
- * @param dimY The Y dimension, must be > 0
- *
- * @return Type
- */
- static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) {
- if ((dimX < 1) || (dimY < 1)) {
- throw new RSInvalidStateException("Dimension must be >= 1.");
- }
-
- long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0);
- Type t = new Type(id, rs);
- t.mElement = e;
- t.mDimX = dimX;
- t.mDimY = dimY;
- t.calcElementCount();
- return t;
- }
-
- /**
- * Utility function for creating basic 3D types. The type is
- * created without mipmaps.
- *
- * @param rs The RenderScript context
- * @param e The Element for the Type
- * @param dimX The X dimension, must be > 0
- * @param dimY The Y dimension, must be > 0
- * @param dimZ The Z dimension, must be > 0
- *
- * @return Type
- */
- static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) {
- if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) {
- throw new RSInvalidStateException("Dimension must be >= 1.");
- }
-
- long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0);
- Type t = new Type(id, rs);
- t.mElement = e;
- t.mDimX = dimX;
- t.mDimY = dimY;
- t.mDimZ = dimZ;
- t.calcElementCount();
- return t;
- }
-
- /**
- * Builder class for Type.
- *
- */
- public static class Builder {
- RenderScript mRS;
- int mDimX = 1;
- int mDimY;
- int mDimZ;
- boolean mDimMipmaps;
- boolean mDimFaces;
- int mYuv;
-
- Element mElement;
-
- /**
- * Create a new builder object.
- *
- * @param rs
- * @param e The element for the type to be created.
- */
- public Builder(RenderScript rs, Element e) {
- e.checkValid();
- mRS = rs;
- mElement = e;
- }
-
- /**
- * Add a dimension to the Type.
- *
- *
- * @param value
- */
- public Builder setX(int value) {
- if(value < 1) {
- throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
- }
- mDimX = value;
- return this;
- }
-
- public Builder setY(int value) {
- if(value < 1) {
- throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
- }
- mDimY = value;
- return this;
- }
-
- public Builder setZ(int value) {
- if(value < 1) {
- throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid.");
- }
- mDimZ = value;
- return this;
- }
-
- public Builder setMipmaps(boolean value) {
- mDimMipmaps = value;
- return this;
- }
-
- public Builder setFaces(boolean value) {
- mDimFaces = value;
- return this;
- }
-
- /**
- * Set the YUV layout for a Type.
- *
- * @param yuvFormat {@link android.graphics.ImageFormat#YV12} or {@link android.graphics.ImageFormat#NV21}
- */
- public Builder setYuvFormat(int yuvFormat) {
- switch (yuvFormat) {
- case android.graphics.ImageFormat.NV21:
- case android.graphics.ImageFormat.YV12:
- break;
-
- default:
- throw new RSIllegalArgumentException("Only NV21 and YV12 are supported..");
- }
-
- mYuv = yuvFormat;
- return this;
- }
-
-
- /**
- * Validate structure and create a new Type.
- *
- * @return Type
- */
- public Type create() {
- if (mDimZ > 0) {
- if ((mDimX < 1) || (mDimY < 1)) {
- throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
- }
- if (mDimFaces) {
- throw new RSInvalidStateException("Cube maps not supported with 3D types.");
- }
- }
- if (mDimY > 0) {
- if (mDimX < 1) {
- throw new RSInvalidStateException("X dimension required when Y is present.");
- }
- }
- if (mDimFaces) {
- if (mDimY < 1) {
- throw new RSInvalidStateException("Cube maps require 2D Types.");
- }
- }
-
- if (mYuv != 0) {
- if ((mDimZ != 0) || mDimFaces || mDimMipmaps) {
- throw new RSInvalidStateException("YUV only supports basic 2D.");
- }
- }
-
- Type t;
- long id = mRS.nTypeCreate(mElement.getID(mRS),
- mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);
- t = new Type(id, mRS);
-
- t.mElement = mElement;
- t.mDimX = mDimX;
- t.mDimY = mDimY;
- t.mDimZ = mDimZ;
- t.mDimMipmaps = mDimMipmaps;
- t.mDimFaces = mDimFaces;
- t.mDimYuv = mYuv;
-
- t.calcElementCount();
- return t;
- }
- }
-
-}
diff --git a/v8/renderscript/jni/Android.mk b/v8/renderscript/jni/Android.mk
deleted file mode 100644
index d6a800d..0000000
--- a/v8/renderscript/jni/Android.mk
+++ /dev/null
@@ -1,56 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_CLANG := true
-LOCAL_SDK_VERSION := 14
-
-LOCAL_SRC_FILES:= \
- android_rscompat_usage_io.cpp \
- android_rscompat_usage_io_driver.cpp
-
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE) \
- frameworks/rs \
- frameworks/rs/cpp \
- frameworks/rs/driver
-
-LOCAL_CFLAGS += -Wno-unused-parameter -Werror
-LOCAL_CFLAGS += -DRS_COMPATIBILITY_LIB -std=c++11
-
-LOCAL_MODULE:= libRSSupportIO
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_LDLIBS += -landroid
-LOCAL_LDFLAGS += -ldl -Wl,--exclude-libs,libc++_static.a
-LOCAL_NDK_STL_VARIANT := c++_static
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_CLANG := true
-LOCAL_SDK_VERSION := 9
-
-LOCAL_SRC_FILES:= \
- android_renderscript_RenderScript.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libjnigraphics
-
-LOCAL_STATIC_LIBRARIES := \
- libRSDispatch
-
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE) \
- frameworks/rs \
- frameworks/rs/cpp
-
-LOCAL_CFLAGS += -Wno-unused-parameter -Werror -std=c++11
-
-LOCAL_MODULE:= librsjni
-LOCAL_MODULE_TAGS := optional
-LOCAL_REQUIRED_MODULES := libRSSupport
-
-LOCAL_LDFLAGS += -ldl -llog -Wl,--exclude-libs,libc++_static.a
-LOCAL_NDK_STL_VARIANT := c++_static
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/v8/renderscript/jni/android_renderscript_RenderScript.cpp b/v8/renderscript/jni/android_renderscript_RenderScript.cpp
deleted file mode 100644
index 5642835..0000000
--- a/v8/renderscript/jni/android_renderscript_RenderScript.cpp
+++ /dev/null
@@ -1,2431 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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.
- */
-
-#define LOG_TAG "libRS_jni"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <math.h>
-#include <android/bitmap.h>
-#include <android/log.h>
-
-#include <rsEnv.h>
-#include "rsDispatch.h"
-#include <dlfcn.h>
-
-//#define LOG_API ALOG
-#define LOG_API(...)
-#define LOG_ERR(...) __android_log_print(ANDROID_LOG_ERROR, "RenderScript JNI", __VA_ARGS__);
-#define RS_JNI_VERSION 2301
-
-#define NELEM(m) (sizeof(m) / sizeof((m)[0]))
-
-template <typename... T>
-void UNUSED(T... t) {}
-#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) { \
- jint len = 0; \
- void *ptr = nullptr; \
- void *srcPtr = nullptr; \
- size_t typeBytes = 0; \
- jint relFlag = 0; \
- if (readonly) { \
- /* The on-release mode should only be JNI_ABORT for read-only accesses. */ \
- /* readonly = true, also indicates we are copying to the allocation . */ \
- relFlag = JNI_ABORT; \
- } \
- switch(dataType) { \
- case RS_TYPE_FLOAT_32: \
- len = _env->GetArrayLength((jfloatArray)data); \
- ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \
- typeBytes = 4; \
- if (usePadding) { \
- srcPtr = ptr; \
- len = len / 3 * 4; \
- if (count == 0) { \
- count = len / 4; \
- } \
- ptr = malloc (len * typeBytes); \
- if (readonly) { \
- copyWithPadding(ptr, srcPtr, mSize, count); \
- fnc(__VA_ARGS__); \
- } else { \
- fnc(__VA_ARGS__); \
- copyWithUnPadding(srcPtr, ptr, mSize, count); \
- } \
- free(ptr); \
- ptr = srcPtr; \
- } else { \
- fnc(__VA_ARGS__); \
- } \
- _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag); \
- return; \
- case RS_TYPE_FLOAT_64: \
- len = _env->GetArrayLength((jdoubleArray)data); \
- ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \
- typeBytes = 8; \
- if (usePadding) { \
- srcPtr = ptr; \
- len = len / 3 * 4; \
- if (count == 0) { \
- count = len / 4; \
- } \
- ptr = malloc (len * typeBytes); \
- if (readonly) { \
- copyWithPadding(ptr, srcPtr, mSize, count); \
- fnc(__VA_ARGS__); \
- } else { \
- fnc(__VA_ARGS__); \
- copyWithUnPadding(srcPtr, ptr, mSize, count); \
- } \
- free(ptr); \
- ptr = srcPtr; \
- } else { \
- fnc(__VA_ARGS__); \
- } \
- _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag); \
- return; \
- case RS_TYPE_SIGNED_8: \
- case RS_TYPE_UNSIGNED_8: \
- len = _env->GetArrayLength((jbyteArray)data); \
- ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \
- typeBytes = 1; \
- if (usePadding) { \
- srcPtr = ptr; \
- len = len / 3 * 4; \
- if (count == 0) { \
- count = len / 4; \
- } \
- ptr = malloc (len * typeBytes); \
- if (readonly) { \
- copyWithPadding(ptr, srcPtr, mSize, count); \
- fnc(__VA_ARGS__); \
- } else { \
- fnc(__VA_ARGS__); \
- copyWithUnPadding(srcPtr, ptr, mSize, count); \
- } \
- free(ptr); \
- ptr = srcPtr; \
- } else { \
- fnc(__VA_ARGS__); \
- } \
- _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag); \
- return; \
- case RS_TYPE_SIGNED_16: \
- case RS_TYPE_UNSIGNED_16: \
- len = _env->GetArrayLength((jshortArray)data); \
- ptr = _env->GetShortArrayElements((jshortArray)data, flag); \
- typeBytes = 2; \
- if (usePadding) { \
- srcPtr = ptr; \
- len = len / 3 * 4; \
- if (count == 0) { \
- count = len / 4; \
- } \
- ptr = malloc (len * typeBytes); \
- if (readonly) { \
- copyWithPadding(ptr, srcPtr, mSize, count); \
- fnc(__VA_ARGS__); \
- } else { \
- fnc(__VA_ARGS__); \
- copyWithUnPadding(srcPtr, ptr, mSize, count); \
- } \
- free(ptr); \
- ptr = srcPtr; \
- } else { \
- fnc(__VA_ARGS__); \
- } \
- _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag); \
- return; \
- case RS_TYPE_SIGNED_32: \
- case RS_TYPE_UNSIGNED_32: \
- len = _env->GetArrayLength((jintArray)data); \
- ptr = _env->GetIntArrayElements((jintArray)data, flag); \
- typeBytes = 4; \
- if (usePadding) { \
- srcPtr = ptr; \
- len = len / 3 * 4; \
- if (count == 0) { \
- count = len / 4; \
- } \
- ptr = malloc (len * typeBytes); \
- if (readonly) { \
- copyWithPadding(ptr, srcPtr, mSize, count); \
- fnc(__VA_ARGS__); \
- } else { \
- fnc(__VA_ARGS__); \
- copyWithUnPadding(srcPtr, ptr, mSize, count); \
- } \
- free(ptr); \
- ptr = srcPtr; \
- } else { \
- fnc(__VA_ARGS__); \
- } \
- _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag); \
- return; \
- case RS_TYPE_SIGNED_64: \
- case RS_TYPE_UNSIGNED_64: \
- len = _env->GetArrayLength((jlongArray)data); \
- ptr = _env->GetLongArrayElements((jlongArray)data, flag); \
- typeBytes = 8; \
- if (usePadding) { \
- srcPtr = ptr; \
- len = len / 3 * 4; \
- if (count == 0) { \
- count = len / 4; \
- } \
- ptr = malloc (len * typeBytes); \
- if (readonly) { \
- copyWithPadding(ptr, srcPtr, mSize, count); \
- fnc(__VA_ARGS__); \
- } else { \
- fnc(__VA_ARGS__); \
- copyWithUnPadding(srcPtr, ptr, mSize, count); \
- } \
- free(ptr); \
- ptr = srcPtr; \
- } else { \
- fnc(__VA_ARGS__); \
- } \
- _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag); \
- return; \
- default: \
- break; \
- } \
- UNUSED(len, ptr, srcPtr, typeBytes, relFlag); \
-}
-
-
-class AutoJavaStringToUTF8 {
-public:
- AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
- fCStr = env->GetStringUTFChars(str, NULL);
- fLength = env->GetStringUTFLength(str);
- }
- ~AutoJavaStringToUTF8() {
- fEnv->ReleaseStringUTFChars(fJStr, fCStr);
- }
- const char* c_str() const { return fCStr; }
- jsize length() const { return fLength; }
-
-private:
- JNIEnv* fEnv;
- jstring fJStr;
- const char* fCStr;
- jsize fLength;
-};
-
-class AutoJavaStringArrayToUTF8 {
-public:
- AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
- : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
- mCStrings = NULL;
- mSizeArray = NULL;
- if (stringsLength > 0) {
- mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
- mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
- for (jsize ct = 0; ct < stringsLength; ct ++) {
- jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
- mCStrings[ct] = mEnv->GetStringUTFChars(s, NULL);
- mSizeArray[ct] = mEnv->GetStringUTFLength(s);
- }
- }
- }
- ~AutoJavaStringArrayToUTF8() {
- for (jsize ct=0; ct < mStringsLength; ct++) {
- jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
- mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
- }
- free(mCStrings);
- free(mSizeArray);
- }
- const char **c_str() const { return mCStrings; }
- size_t *c_str_len() const { return mSizeArray; }
- jsize length() const { return mStringsLength; }
-
-private:
- JNIEnv *mEnv;
- jobjectArray mStrings;
- const char **mCStrings;
- size_t *mSizeArray;
- jsize mStringsLength;
-};
-
-
-// ---------------------------------------------------------------------------
-static dispatchTable dispatchTab;
-// Incremental Support lib
-static dispatchTable dispatchTabInc;
-
-static jboolean nLoadSO(JNIEnv *_env, jobject _this, jboolean useNative, jint targetApi, jstring libPath) {
- void* handle = NULL;
- if (useNative) {
- handle = dlopen("libRS.so", RTLD_LAZY | RTLD_LOCAL);
- } else {
- // For API 9+, dlopen the full path of libRSSupport.
- if (libPath != NULL) {
- const char * libPathJni = _env->GetStringUTFChars(libPath, JNI_FALSE);
- handle = dlopen(libPathJni, RTLD_LAZY | RTLD_LOCAL);
- _env->ReleaseStringUTFChars(libPath, libPathJni);
- } else {
- handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
- }
- }
- if (handle == NULL) {
- LOG_ERR("couldn't dlopen %s; librsjni version: %d", dlerror(), RS_JNI_VERSION);
- return false;
- }
-
- if (loadSymbols(handle, dispatchTab, targetApi) == false) {
- LOG_ERR("Dispatch table init failed! librsjni version: %d", RS_JNI_VERSION);
- dlclose(handle);
- return false;
- }
- LOG_API("Successfully loaded runtime");
- return true;
-}
-
-static ioSuppDT ioDispatch;
-static jboolean nLoadIOSO(JNIEnv *_env, jobject _this) {
- void* handleIO = NULL;
- handleIO = dlopen("libRSSupportIO.so", RTLD_LAZY | RTLD_LOCAL);
- if (handleIO == NULL) {
- LOG_ERR("Couldn't load libRSSupportIO.so, librsjni version: %d", RS_JNI_VERSION);
- return false;
- }
- if (loadIOSuppSyms(handleIO, ioDispatch) == false) {
- LOG_ERR("libRSSupportIO init failed! librsjni version: %d", RS_JNI_VERSION);
- return false;
- }
- return true;
-}
-
-// ---------------------------------------------------------------------------
-
-static void copyWithPadding(void* ptr, void* srcPtr, int mSize, int count) {
- int sizeBytesPad = mSize * 4;
- int sizeBytes = mSize * 3;
- uint8_t *dst = static_cast<uint8_t *>(ptr);
- uint8_t *src = static_cast<uint8_t *>(srcPtr);
- for (int i = 0; i < count; i++) {
- memcpy(dst, src, sizeBytes);
- dst += sizeBytesPad;
- src += sizeBytes;
- }
-}
-
-static void copyWithUnPadding(void* ptr, void* srcPtr, int mSize, int count) {
- int sizeBytesPad = mSize * 4;
- int sizeBytes = mSize * 3;
- uint8_t *dst = static_cast<uint8_t *>(ptr);
- uint8_t *src = static_cast<uint8_t *>(srcPtr);
- for (int i = 0; i < count; i++) {
- memcpy(dst, src, sizeBytes);
- dst += sizeBytes;
- src += sizeBytesPad;
- }
-}
-
-
-// ---------------------------------------------------------------------------
-
-static void
-nContextFinish(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextFinish, con(%p)", (RsContext)con);
- dispatchTab.ContextFinish((RsContext)con);
-}
-
-static jlong
-nClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
- jlong returnValue, jlongArray fieldIDArray,
- jlongArray valueArray, jintArray sizeArray,
- jlongArray depClosureArray, jlongArray depFieldIDArray) {
- jlong ret = 0;
-
- jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
- jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
- jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
- jsize values_length = _env->GetArrayLength(valueArray);
- jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
- jsize sizes_length = _env->GetArrayLength(sizeArray);
- jlong* jDepClosures =
- _env->GetLongArrayElements(depClosureArray, nullptr);
- jsize depClosures_length = _env->GetArrayLength(depClosureArray);
- jlong* jDepFieldIDs =
- _env->GetLongArrayElements(depFieldIDArray, nullptr);
- jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
-
- size_t numValues, numDependencies;
- RsScriptFieldID* fieldIDs;
- RsClosure* depClosures;
- RsScriptFieldID* depFieldIDs;
-
- if (fieldIDs_length != values_length || values_length != sizes_length) {
- LOG_ERR("Unmatched field IDs, values, and sizes in closure creation.");
- goto exit;
- }
-
- numValues = (size_t)fieldIDs_length;
-
- if (depClosures_length != depFieldIDs_length) {
- LOG_ERR("Unmatched closures and field IDs for dependencies in closure creation.");
- goto exit;
- }
-
- numDependencies = (size_t)depClosures_length;
-
- if (numDependencies > numValues) {
- LOG_ERR("Unexpected number of dependencies in closure creation");
- goto exit;
- }
-
- if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
- LOG_ERR("Too many arguments or globals in closure creation");
- goto exit;
- }
-
- if (numValues > 0) {
- fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
- if (fieldIDs == nullptr) {
- goto exit;
- }
- } else {
- // numValues == 0
- // alloca(0) implementation is platform dependent
- fieldIDs = nullptr;
- }
-
- for (size_t i = 0; i < numValues; i++) {
- fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
- }
-
- if (numDependencies > 0) {
- depClosures = (RsClosure*)alloca(sizeof(RsClosure) * numDependencies);
- if (depClosures == nullptr) {
- goto exit;
- }
-
- for (size_t i = 0; i < numDependencies; i++) {
- depClosures[i] = (RsClosure)jDepClosures[i];
- }
-
- depFieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numDependencies);
- if (depFieldIDs == nullptr) {
- goto exit;
- }
-
- for (size_t i = 0; i < numDependencies; i++) {
- depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
- }
- } else {
- // numDependencies == 0
- // alloca(0) implementation is platform dependent
- depClosures = nullptr;
- depFieldIDs = nullptr;
- }
-
- ret = (jlong)(uintptr_t)dispatchTab.ClosureCreate(
- (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
- fieldIDs, numValues, jValues, numValues,
- (int*)jSizes, numValues,
- depClosures, numDependencies,
- depFieldIDs, numDependencies);
-
-exit:
-
- _env->ReleaseLongArrayElements(depFieldIDArray, jDepFieldIDs, JNI_ABORT);
- _env->ReleaseLongArrayElements(depClosureArray, jDepClosures, JNI_ABORT);
- _env->ReleaseIntArrayElements (sizeArray, jSizes, JNI_ABORT);
- _env->ReleaseLongArrayElements(valueArray, jValues, JNI_ABORT);
- _env->ReleaseLongArrayElements(fieldIDArray, jFieldIDs, JNI_ABORT);
-
- return ret;
-}
-
-static jlong
-nInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
- jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
- jintArray sizeArray) {
- jlong ret = 0;
-
- jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
- jsize jParamLength = _env->GetArrayLength(paramArray);
- jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
- jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
- jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
- jsize values_length = _env->GetArrayLength(valueArray);
- jint* jSizes = _env->GetIntArrayElements(sizeArray, nullptr);
- jsize sizes_length = _env->GetArrayLength(sizeArray);
-
- size_t numValues;
- RsScriptFieldID* fieldIDs;
-
- if (fieldIDs_length != values_length || values_length != sizes_length) {
- LOG_ERR("Unmatched field IDs, values, and sizes in closure creation.");
- goto exit;
- }
-
- numValues = (size_t) fieldIDs_length;
-
- if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) {
- LOG_ERR("Too many arguments or globals in closure creation");
- goto exit;
- }
-
- fieldIDs = (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * numValues);
- if (fieldIDs == nullptr) {
- goto exit;
- }
-
- for (size_t i = 0; i < numValues; i++) {
- fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
- }
-
- ret = (jlong)(uintptr_t)dispatchTab.InvokeClosureCreate(
- (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
- fieldIDs, numValues, jValues, numValues,
- (int*)jSizes, numValues);
-
-exit:
-
- _env->ReleaseIntArrayElements (sizeArray, jSizes, JNI_ABORT);
- _env->ReleaseLongArrayElements(valueArray, jValues, JNI_ABORT);
- _env->ReleaseLongArrayElements(fieldIDArray, jFieldIDs, JNI_ABORT);
- _env->ReleaseByteArrayElements(paramArray, jParams, JNI_ABORT);
-
- return ret;
-}
-
-static void
-nClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
- jint index, jlong value, jint size) {
- // Size is signed with -1 indicating the values is an Allocation
- dispatchTab.ClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
- (uintptr_t)value, size);
-}
-
-static void
-nClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
- jlong fieldID, jlong value, jint size) {
- // Size is signed with -1 indicating the values is an Allocation
- dispatchTab.ClosureSetGlobal((RsContext)con, (RsClosure)closureID,
- (RsScriptFieldID)fieldID, (int64_t)value, size);
-}
-
-static long
-nScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name,
- jstring cacheDir, jlongArray closureArray) {
- jlong ret = 0;
-
- AutoJavaStringToUTF8 nameUTF(_env, name);
- AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
-
- jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
- jsize numClosures = _env->GetArrayLength(closureArray);
-
- RsClosure* closures;
-
- if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) {
- LOG_ERR("Too many closures in script group");
- goto exit;
- }
-
- closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
- if (closures == nullptr) {
- goto exit;
- }
-
- for (int i = 0; i < numClosures; i++) {
- closures[i] = (RsClosure)jClosures[i];
- }
-
- ret = (jlong)(uintptr_t)dispatchTab.ScriptGroup2Create(
- (RsContext)con, nameUTF.c_str(), nameUTF.length(),
- cacheDirUTF.c_str(), cacheDirUTF.length(),
- closures, numClosures);
-
-exit:
-
- _env->ReleaseLongArrayElements(closureArray, jClosures, JNI_ABORT);
-
- return ret;
-}
-
-static void
-nScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
- dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
-}
-
-static void
-nObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
-{
- LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
- dispatchTab.ObjDestroy((RsContext)con, (void *)obj);
-}
-
-
-static void
-nScriptIntrinsicBLAS_Single(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
- jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
- jfloat alpha, jlong A, jlong B, jfloat beta, jlong C, jint incX, jint incY,
- jint KL, jint KU, jboolean mUseInc) {
- RsBlasCall call;
- memset(&call, 0, sizeof(call));
- call.func = (RsBlasFunction)func;
- call.transA = (RsBlasTranspose)TransA;
- call.transB = (RsBlasTranspose)TransB;
- call.side = (RsBlasSide)Side;
- call.uplo = (RsBlasUplo)Uplo;
- call.diag = (RsBlasDiag)Diag;
- call.M = M;
- call.N = N;
- call.K = K;
- call.alpha.f = alpha;
- call.beta.f = beta;
- call.incX = incX;
- call.incY = incY;
- call.KL = KL;
- call.KU = KU;
-
- RsAllocation in_allocs[3];
- in_allocs[0] = (RsAllocation)A;
- in_allocs[1] = (RsAllocation)B;
- in_allocs[2] = (RsAllocation)C;
-
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- } else {
- dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- }
-}
-
-static void
-nScriptIntrinsicBLAS_Double(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
- jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
- jdouble alpha, jlong A, jlong B, jdouble beta, jlong C, jint incX, jint incY,
- jint KL, jint KU, jboolean mUseInc) {
- RsBlasCall call;
- memset(&call, 0, sizeof(call));
- call.func = (RsBlasFunction)func;
- call.transA = (RsBlasTranspose)TransA;
- call.transB = (RsBlasTranspose)TransB;
- call.side = (RsBlasSide)Side;
- call.uplo = (RsBlasUplo)Uplo;
- call.diag = (RsBlasDiag)Diag;
- call.M = M;
- call.N = N;
- call.K = K;
- call.alpha.d = alpha;
- call.beta.d = beta;
- call.incX = incX;
- call.incY = incY;
- call.KL = KL;
- call.KU = KU;
-
- RsAllocation in_allocs[3];
- in_allocs[0] = (RsAllocation)A;
- in_allocs[1] = (RsAllocation)B;
- in_allocs[2] = (RsAllocation)C;
-
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- } else {
- dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- }
-}
-
-static void
-nScriptIntrinsicBLAS_Complex(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
- jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
- jfloat alphaX, jfloat alphaY, jlong A, jlong B, jfloat betaX,
- jfloat betaY, jlong C, jint incX, jint incY, jint KL, jint KU, jboolean mUseInc) {
- RsBlasCall call;
- memset(&call, 0, sizeof(call));
- call.func = (RsBlasFunction)func;
- call.transA = (RsBlasTranspose)TransA;
- call.transB = (RsBlasTranspose)TransB;
- call.side = (RsBlasSide)Side;
- call.uplo = (RsBlasUplo)Uplo;
- call.diag = (RsBlasDiag)Diag;
- call.M = M;
- call.N = N;
- call.K = K;
- call.alpha.c.r = alphaX;
- call.alpha.c.i = alphaY;
- call.beta.c.r = betaX;
- call.beta.c.i = betaY;
- call.incX = incX;
- call.incY = incY;
- call.KL = KL;
- call.KU = KU;
-
- RsAllocation in_allocs[3];
- in_allocs[0] = (RsAllocation)A;
- in_allocs[1] = (RsAllocation)B;
- in_allocs[2] = (RsAllocation)C;
-
-
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- } else {
- dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- }
-}
-
-static void
-nScriptIntrinsicBLAS_Z(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint func, jint TransA,
- jint TransB, jint Side, jint Uplo, jint Diag, jint M, jint N, jint K,
- jdouble alphaX, jdouble alphaY, jlong A, jlong B, jdouble betaX,
- jdouble betaY, jlong C, jint incX, jint incY, jint KL, jint KU, jboolean mUseInc) {
- RsBlasCall call;
- memset(&call, 0, sizeof(call));
- call.func = (RsBlasFunction)func;
- call.transA = (RsBlasTranspose)TransA;
- call.transB = (RsBlasTranspose)TransB;
- call.side = (RsBlasSide)Side;
- call.uplo = (RsBlasUplo)Uplo;
- call.diag = (RsBlasDiag)Diag;
- call.M = M;
- call.N = N;
- call.K = K;
- call.alpha.z.r = alphaX;
- call.alpha.z.i = alphaY;
- call.beta.z.r = betaX;
- call.beta.z.i = betaY;
- call.incX = incX;
- call.incY = incY;
- call.KL = KL;
- call.KU = KU;
-
- RsAllocation in_allocs[3];
- in_allocs[0] = (RsAllocation)A;
- in_allocs[1] = (RsAllocation)B;
- in_allocs[2] = (RsAllocation)C;
-
-
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- } else {
- dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- }
-}
-
-
-static void
-nScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong id, jint M, jint N, jint K,
- jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
- jint c_mult_int, jboolean mUseInc) {
- RsBlasCall call;
- memset(&call, 0, sizeof(call));
- call.func = RsBlas_bnnm;
- call.M = M;
- call.N = N;
- call.K = K;
- call.a_offset = a_offset & 0xFF;
- call.b_offset = b_offset & 0xFF;
- call.c_offset = c_offset;
- call.c_mult_int = c_mult_int;
-
- RsAllocation in_allocs[3];
- in_allocs[0] = (RsAllocation)A;
- in_allocs[1] = (RsAllocation)B;
- in_allocs[2] = (RsAllocation)C;
-
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- } else {
- dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
- in_allocs, NELEM(in_allocs), nullptr,
- &call, sizeof(call), nullptr, 0);
- }
-}
-// ---------------------------------------------------------------------------
-static jlong
-nDeviceCreate(JNIEnv *_env, jobject _this)
-{
- LOG_API("nDeviceCreate");
- return (jlong)(uintptr_t)dispatchTab.DeviceCreate();
-}
-
-static void
-nDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
-{
- LOG_API("nDeviceDestroy");
- return dispatchTab.DeviceDestroy((RsDevice)dev);
-}
-
-static void
-nDeviceSetConfig(JNIEnv *_env, jobject _this, jlong dev, jint p, jint value)
-{
- LOG_API("nDeviceSetConfig dev(%p), param(%i), value(%i)", (void *)dev, p, value);
- return dispatchTab.DeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
-}
-
-static jlong
-nContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer,
- jint ct, jstring nativeLibDirJava)
-{
- LOG_API("nContextCreate");
- // Access the NativeLibDir in the Java Context.
- const char * nativeLibDir = _env->GetStringUTFChars(nativeLibDirJava, JNI_FALSE);
- size_t length = (size_t)_env->GetStringUTFLength(nativeLibDirJava);
-
- jlong id = (jlong)(uintptr_t)dispatchTab.ContextCreate((RsDevice)dev, ver,
- sdkVer,
- (RsContextType)ct, 0);
- if (dispatchTab.SetNativeLibDir) {
- dispatchTab.SetNativeLibDir((RsContext)id, nativeLibDir, length);
- }
-
- _env->ReleaseStringUTFChars(nativeLibDirJava, nativeLibDir);
- return id;
-}
-
-
-static void
-nContextSetPriority(JNIEnv *_env, jobject _this, jlong con, jint p)
-{
- LOG_API("ContextSetPriority, con(%p), priority(%i)", (RsContext)con, p);
- dispatchTab.ContextSetPriority((RsContext)con, p);
-}
-
-
-
-static void
-nContextDestroy(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextDestroy, con(%p)", (RsContext)con);
- dispatchTab.ContextDestroy((RsContext)con);
-}
-
-static void
-nContextDump(JNIEnv *_env, jobject _this, jlong con, jint bits)
-{
- LOG_API("nContextDump, con(%p) bits(%i)", (RsContext)con, bits);
- dispatchTab.ContextDump((RsContext)con, bits);
-}
-
-
-static jstring
-nContextGetErrorMessage(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextGetErrorMessage, con(%p)", (RsContext)con);
- char buf[1024];
-
- size_t receiveLen;
- uint32_t subID;
- int id = dispatchTab.ContextGetMessage((RsContext)con,
- buf, sizeof(buf),
- &receiveLen, sizeof(receiveLen),
- &subID, sizeof(subID));
- if (!id && receiveLen) {
- // __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
- // "message receive buffer too small. %zu", receiveLen);
- }
- return _env->NewStringUTF(buf);
-}
-
-static jint
-nContextGetUserMessage(JNIEnv *_env, jobject _this, jlong con, jintArray data)
-{
- jint len = _env->GetArrayLength(data);
- LOG_API("nContextGetMessage, con(%p), len(%i)", (RsContext)con, len);
- jint *ptr = _env->GetIntArrayElements(data, NULL);
- size_t receiveLen;
- uint32_t subID;
- int id = dispatchTab.ContextGetMessage((RsContext)con,
- ptr, len * 4,
- &receiveLen, sizeof(receiveLen),
- &subID, sizeof(subID));
- if (!id && receiveLen) {
- // __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,
- // "message receive buffer too small. %zu", receiveLen);
- }
- _env->ReleaseIntArrayElements(data, ptr, 0);
- return (jint)id;
-}
-
-static jint
-nContextPeekMessage(JNIEnv *_env, jobject _this, jlong con, jintArray auxData)
-{
- LOG_API("nContextPeekMessage, con(%p)", (RsContext)con);
- jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
- size_t receiveLen;
- uint32_t subID;
- int id = dispatchTab.ContextPeekMessage((RsContext)con, &receiveLen, sizeof(receiveLen),
- &subID, sizeof(subID));
- auxDataPtr[0] = (jint)subID;
- auxDataPtr[1] = (jint)receiveLen;
- _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
- return (jint)id;
-}
-
-static void nContextInitToClient(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextInitToClient, con(%p)", (RsContext)con);
- dispatchTab.ContextInitToClient((RsContext)con);
-}
-
-static void nContextDeinitToClient(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextDeinitToClient, con(%p)", (RsContext)con);
- dispatchTab.ContextDeinitToClient((RsContext)con);
-}
-
-static void
-nContextSendMessage(JNIEnv *_env, jobject _this, jlong con, jint id, jintArray data)
-{
- jint *ptr = NULL;
- jint len = 0;
- if (data) {
- len = _env->GetArrayLength(data);
- ptr = _env->GetIntArrayElements(data, NULL);
- }
- LOG_API("nContextSendMessage, con(%p), id(%i), len(%i)", (RsContext)con, id, len);
- dispatchTab.ContextSendMessage((RsContext)con, id, (const uint8_t *)ptr, len * sizeof(int));
- if (data) {
- _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
- }
-}
-
-
-
-static jlong
-nElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind,
- jboolean norm, jint size)
-{
- LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
- type, kind, norm, size);
- return (jlong)(uintptr_t)dispatchTab.ElementCreate((RsContext)con,
- (RsDataType)type,
- (RsDataKind)kind,
- norm, size);
-}
-
-static jlong
-nElementCreate2(JNIEnv *_env, jobject _this, jlong con,
- jlongArray _ids, jobjectArray _names, jintArray _arraySizes)
-{
- int fieldCount = _env->GetArrayLength(_ids);
- LOG_API("nElementCreate2, con(%p)", (RsContext)con);
-
- jlong *jIds = _env->GetLongArrayElements(_ids, NULL);
- jint *jArraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
-
- RsElement *ids = (RsElement*)malloc(fieldCount * sizeof(RsElement));
- uint32_t *arraySizes = (uint32_t *)malloc(fieldCount * sizeof(uint32_t));
-
- for(int i = 0; i < fieldCount; i ++) {
- ids[i] = (RsElement)jIds[i];
- arraySizes[i] = (uint32_t)jArraySizes[i];
- }
-
- AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
-
- const char **nameArray = names.c_str();
- size_t *sizeArray = names.c_str_len();
-
- jlong id = (jlong)(uintptr_t)dispatchTab.ElementCreate2((RsContext)con, (RsElement *)ids,
- fieldCount, nameArray,
- fieldCount * sizeof(size_t), sizeArray,
- (const uint32_t *)arraySizes, fieldCount);
-
- free(ids);
- free(arraySizes);
- _env->ReleaseLongArrayElements(_ids, jIds, JNI_ABORT);
- _env->ReleaseIntArrayElements(_arraySizes, jArraySizes, JNI_ABORT);
- return id;
-}
-
-
-
-
-static void
-nElementGetSubElements(JNIEnv *_env, jobject _this, jlong con, jlong id,
- jlongArray _IDs,
- jobjectArray _names,
- jintArray _arraySizes)
-{
- uint32_t dataSize = _env->GetArrayLength(_IDs);
- LOG_API("nElementGetSubElements, con(%p)", (RsContext)con);
-
- uintptr_t *ids = (uintptr_t *)malloc(dataSize * sizeof(uintptr_t));
- const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
- uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
-
- dispatchTab.ElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
- (uint32_t)dataSize);
-
- for(uint32_t i = 0; i < dataSize; i++) {
- const jlong id = (jlong)(uintptr_t)ids[i];
- const jint arraySize = (jint)arraySizes[i];
- _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
- _env->SetLongArrayRegion(_IDs, i, 1, &id);
- _env->SetIntArrayRegion(_arraySizes, i, 1, &arraySize);
- }
-
- free(ids);
- free(names);
- free(arraySizes);
-}
-
-// -----------------------------------
-
-static jlong
-nTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
- jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
-{
- LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
- (RsContext)con, eid, dimx, dimy, dimz, mips, faces, yuv);
-
- return (jlong)(uintptr_t)dispatchTab.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
- dimz, mips, faces, yuv);
-}
-
-// -----------------------------------
-
-static jlong
-nAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mips, jint usage,
- jlong pointer)
-{
- LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
- (RsContext)con, (RsElement)type, mips, usage, (void *)pointer);
- return (jlong)(uintptr_t) dispatchTab.AllocationCreateTyped((RsContext)con, (RsType)type,
- (RsAllocationMipmapControl)mips,
- (uint32_t)usage, (uintptr_t)pointer);
-}
-
-static void
-nAllocationSyncAll(JNIEnv *_env, jobject _this, jlong con, jlong a, jint bits)
-{
- LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", (RsContext)con, (RsAllocation)a, bits);
- dispatchTab.AllocationSyncAll((RsContext)con, (RsAllocation)a, (RsAllocationUsageType)bits);
-}
-
-static void
-nAllocationSetSurface(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject sur)
-{
- ioDispatch.sAllocationSetSurface(_env, _this, (RsContext)con, (RsAllocation)alloc, sur, dispatchTab);
-}
-
-static void
-nAllocationIoSend(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
-{
- dispatchTab.AllocationIoSend((RsContext)con, (RsAllocation)alloc);
-}
-
-static void
-nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
-{
- LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", (RsContext)con, (RsAllocation)alloc);
- dispatchTab.AllocationGenerateMipmaps((RsContext)con, (RsAllocation)alloc);
-}
-
-static size_t GetBitmapSize(JNIEnv *env, jobject jbitmap) {
- AndroidBitmapInfo info;
- memset(&info, 0, sizeof(info));
- AndroidBitmap_getInfo(env, jbitmap, &info);
- size_t s = info.width * info.height;
- switch (info.format) {
- case ANDROID_BITMAP_FORMAT_RGBA_8888: s *= 4; break;
- case ANDROID_BITMAP_FORMAT_RGB_565: s *= 2; break;
- case ANDROID_BITMAP_FORMAT_RGBA_4444: s *= 2; break;
- }
- return s;
-}
-
-static jlong
-nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,
- jobject jbitmap, jint usage)
-{
- jlong id = 0;
- void *pixels = NULL;
- AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
-
- if (pixels != NULL) {
- id = (jlong)(uintptr_t)dispatchTab.AllocationCreateFromBitmap((RsContext)con,
- (RsType)type,
- (RsAllocationMipmapControl)mip,
- pixels,
- GetBitmapSize(_env, jbitmap),
- usage);
- AndroidBitmap_unlockPixels(_env, jbitmap);
- }
- return id;
-}
-
-static jlong
-nAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,
- jint mip, jobject jbitmap, jint usage)
-{
- jlong id = 0;
- void *pixels = NULL;
- AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
-
- if (pixels != NULL) {
- id = (jlong)(uintptr_t)dispatchTab.AllocationCreateTyped((RsContext)con,
- (RsType)type,
- (RsAllocationMipmapControl)mip,
- (uint32_t)usage,
- (uintptr_t)pixels);
- AndroidBitmap_unlockPixels(_env, jbitmap);
- }
- return id;
-}
-
-static jlong
-nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type,
- jint mip, jobject jbitmap, jint usage)
-{
- void *pixels = NULL;
- AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
-
- jlong id = 0;
- if (pixels != NULL) {
- id = (jlong)(uintptr_t)dispatchTab.AllocationCubeCreateFromBitmap((RsContext)con,
- (RsType)type,
- (RsAllocationMipmapControl)mip,
- pixels,
- GetBitmapSize(_env, jbitmap),
- usage);
- AndroidBitmap_unlockPixels(_env, jbitmap);
- }
- return id;
-}
-
-static void
-nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
-{
- AndroidBitmapInfo info;
- memset(&info, 0, sizeof(info));
- AndroidBitmap_getInfo(_env, jbitmap, &info);
-
- void *pixels = NULL;
- AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
-
- if (pixels != NULL) {
- dispatchTab.Allocation2DData((RsContext)con, (RsAllocation)alloc, 0, 0, 0,
- RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, info.width,
- info.height, pixels, GetBitmapSize(_env, jbitmap), 0);
- AndroidBitmap_unlockPixels(_env, jbitmap);
- }
-}
-
-static void
-nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)
-{
- AndroidBitmapInfo info;
- memset(&info, 0, sizeof(info));
- AndroidBitmap_getInfo(_env, jbitmap, &info);
-
- void *pixels = NULL;
- AndroidBitmap_lockPixels(_env, jbitmap, &pixels);
-
- if (pixels != NULL) {
- dispatchTab.AllocationCopyToBitmap((RsContext)con, (RsAllocation)alloc, pixels,
- GetBitmapSize(_env, jbitmap));
- AndroidBitmap_unlockPixels(_env, jbitmap);
- }
- //bitmap.notifyPixelsChanged();
-}
-
-// Copies from the Java object data into the Allocation pointed to by _alloc.
-static void
-nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
- jint count, jobject data, jint sizeBytes, jint dataType, jint mSize,
- jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
- "dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes,
- dataType);
- PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation1DData, true,
- (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
-}
-
-
-static void
-nAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xoff,
- jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
-{
- LOG_API("nAllocationElementData1D, con(%p), alloc(%p), xoff(%i), comp(%i), len(%i), "
- "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, compIdx,
- _env->GetArrayLength(data),
- sizeBytes);
- jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
- dispatchTab.Allocation1DElementData((RsContext)con, (RsAllocation)alloc, xoff,
- lod, ptr, sizeBytes, compIdx);
- _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
-}
-
-/*
-static void
-nAllocationElementData(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
- jint xoff, jint yoff, jint zoff,
- jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
-{
- jint len = _env->GetArrayLength(data);
- LOG_API("nAllocationElementData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
- "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
- sizeBytes);
- jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
- dispatchTab.AllocationElementData((RsContext)con, (RsAllocation)alloc,
- xoff, yoff, zoff,
- lod, ptr, sizeBytes, compIdx);
- _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
-}
-*/
-
-// Copies from the Java object data into the Allocation pointed to by _alloc.
-static void
-nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
- jint w, jint h, jobject data, jint sizeBytes, jint dataType, jint mSize,
- jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
- LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
- "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
- int count = w * h;
- PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation2DData, true,
- (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
-}
-
-static void
-nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
- jlong dstAlloc, jint dstXoff, jint dstYoff,
- jint dstMip, jint dstFace,
- jint width, jint height,
- jlong srcAlloc, jint srcXoff, jint srcYoff,
- jint srcMip, jint srcFace)
-{
- LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
- " dstMip(%i), dstFace(%i), width(%i), height(%i),"
- " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
- (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
- width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
-
- dispatchTab.AllocationCopy2DRange((RsContext)con,
- (RsAllocation)dstAlloc,
- dstXoff, dstYoff,
- dstMip, dstFace,
- width, height,
- (RsAllocation)srcAlloc,
- srcXoff, srcYoff,
- srcMip, srcFace);
-}
-
-// Copies from the Java object data into the Allocation pointed to by _alloc.
-static void
-nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
- jint w, jint h, jint d, jobject data, jint sizeBytes, jint dataType,
- jint mSize, jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
- " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
- lod, w, h, d, sizeBytes);
- int count = w * h * d;
- PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DData, true,
- (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
-}
-
-static void
-nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
- jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
- jint dstMip,
- jint width, jint height, jint depth,
- jlong srcAlloc, jint srcXoff, jint srcYoff, jint srcZoff,
- jint srcMip)
-{
- LOG_API("nAllocationData3D_alloc, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
- " dstMip(%i), width(%i), height(%i),"
- " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i)",
- (RsContext)con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
- width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
-
- dispatchTab.AllocationCopy3DRange((RsContext)con,
- (RsAllocation)dstAlloc,
- dstXoff, dstYoff, dstZoff, dstMip,
- width, height, depth,
- (RsAllocation)srcAlloc,
- srcXoff, srcYoff, srcZoff, srcMip);
-}
-
-// Copies from the Allocation pointed to by _alloc into the Java object data.
-static void
-nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, jint dataType,
- jint mSize, jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
- int count = 0;
- PER_ARRAY_TYPE(0, dispatchTab.AllocationRead, false,
- (RsContext)con, alloc, ptr, len * typeBytes);
-}
-
-// Copies from the Allocation pointed to by _alloc into the Java object data.
-static void
-nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
- jint count, jobject data, jint sizeBytes, jint dataType,
- jint mSize, jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), "
- "dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType);
- PER_ARRAY_TYPE(0, dispatchTab.Allocation1DRead, false,
- (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
-}
-
-// Copies from the Element in the Allocation pointed to by _alloc into the Java array data.
-/*
-static void
-nAllocationElementRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc,
- jint xoff, jint yoff, jint zoff,
- jint lod, jint compIdx, jobject data, jint sizeBytes)
-{
- jint len = _env->GetArrayLength(data);
- LOG_API("nAllocationElementRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), comp(%i), len(%i), "
- "sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, compIdx, len,
- sizeBytes);
- jbyte *ptr = _env->GetByteArrayElements(data, nullptr);
- dispatchTab.AllocationElementRead((RsContext)con, (RsAllocation)alloc,
- xoff, yoff, zoff,
- lod, ptr, sizeBytes, compIdx);
- _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
-}
-*/
-
-// Copies from the Allocation pointed to by _alloc into the Java object data.
-static void
-nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
- jint w, jint h, jobject data, jint sizeBytes, jint dataType,
- jint mSize, jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
- LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) "
- "type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
- int count = w * h;
- PER_ARRAY_TYPE(0, dispatchTab.Allocation2DRead, false,
- (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
-}
-
-// Copies from the Allocation pointed to by _alloc into the Java object data.
-/*
-static void
-nAllocationRead3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
- jint w, jint h, jint d, jobject data, int sizeBytes, int dataType,
- jint mSize, jboolean usePadding)
-{
- RsAllocation *alloc = (RsAllocation *)_alloc;
- LOG_API("nAllocation3DRead, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i),"
- " h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff,
- lod, w, h, d, sizeBytes);
- int count = w * h * d;
- PER_ARRAY_TYPE(nullptr, dispatchTab.Allocation3DRead, false,
- (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
-}
-*/
-
-static jlong
-nAllocationGetType(JNIEnv *_env, jobject _this, jlong con, jlong a)
-{
- LOG_API("nAllocationGetType, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
- return (jlong)(uintptr_t) dispatchTab.AllocationGetType((RsContext)con, (RsAllocation)a);
-}
-
-static void
-nAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint dimX)
-{
- LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", (RsContext)con,
- (RsAllocation)alloc, dimX);
- dispatchTab.AllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);
-}
-
-// -----------------------------------
-
-static void
-nScriptBindAllocation(JNIEnv *_env, jobject _this, jlong con, jlong script, jlong alloc, jint slot, jboolean mUseInc)
-{
- LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)",
- (RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
- if (mUseInc) {
- dispatchTabInc.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
- } else {
- dispatchTab.ScriptBindAllocation((RsContext)con, (RsScript)script, (RsAllocation)alloc, slot);
- }
-}
-
-static void
-nScriptSetVarI(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint val, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
- (void *)script, slot, val);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
- } else {
- dispatchTab.ScriptSetVarI((RsContext)con, (RsScript)script, slot, val);
- }
-}
-
-static void
-nScriptSetVarObj(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", (RsContext)con,
- (void *)script, slot, val);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
- } else {
- dispatchTab.ScriptSetVarObj((RsContext)con, (RsScript)script, slot, (RsObjectBase)val);
- }
-}
-
-static void
-nScriptSetVarJ(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jlong val, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", (RsContext)con,
- (void *)script, slot, val);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
- } else {
- dispatchTab.ScriptSetVarJ((RsContext)con, (RsScript)script, slot, val);
- }
-}
-
-static void
-nScriptSetVarF(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, float val, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", (RsContext)con,
- (void *)script, slot, val);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
- } else {
- dispatchTab.ScriptSetVarF((RsContext)con, (RsScript)script, slot, val);
- }
-}
-
-static void
-nScriptSetVarD(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, double val, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", (RsContext)con,
- (void *)script, slot, val);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
- } else {
- dispatchTab.ScriptSetVarD((RsContext)con, (RsScript)script, slot, val);
- }
-}
-
-static void
-nScriptSetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- jint len = _env->GetArrayLength(data);
- jbyte *ptr = _env->GetByteArrayElements(data, NULL);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
- } else {
- dispatchTab.ScriptSetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
- }
- _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
-}
-
-static void
-nScriptSetVarVE(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data,
- jlong elem, jintArray dims, jboolean mUseInc)
-{
- LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- jint len = _env->GetArrayLength(data);
- jbyte *ptr = _env->GetByteArrayElements(data, NULL);
- jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
- jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
- if (mUseInc) {
- dispatchTabInc.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
- (const uint32_t *)dimsPtr, dimsLen);
- } else {
- dispatchTab.ScriptSetVarVE((RsContext)con, (RsScript)script, slot, ptr, len, (RsElement)elem,
- (const uint32_t *)dimsPtr, dimsLen);
- }
- _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
- _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
-}
-
-
-static void
-nScriptSetTimeZone(JNIEnv *_env, jobject _this, jlong con, jlong script, jbyteArray timeZone, jboolean mUseInc)
-{
- LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", (RsContext)con,
- (void *)script, (const char *)timeZone);
-
- jint length = _env->GetArrayLength(timeZone);
- jbyte* timeZone_ptr;
- timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
- if (mUseInc) {
- dispatchTabInc.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
- } else {
- dispatchTab.ScriptSetTimeZone((RsContext)con, (RsScript)script, (const char *)timeZone_ptr, length);
- }
-
- if (timeZone_ptr) {
- _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
- }
-}
-
-static void
-nScriptInvoke(JNIEnv *_env, jobject _this, jlong con, jlong obj, jint slot, jboolean mUseInc)
-{
- LOG_API("nScriptInvoke, con(%p), script(%p)", (RsContext)con, (void *)obj);
- if (mUseInc) {
- dispatchTabInc.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
- } else {
- dispatchTab.ScriptInvoke((RsContext)con, (RsScript)obj, slot);
- }
-}
-
-static void
-nScriptInvokeV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jbyteArray data, jboolean mUseInc)
-{
- LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- jint len = _env->GetArrayLength(data);
- jbyte *ptr = _env->GetByteArrayElements(data, NULL);
- if (mUseInc) {
- dispatchTabInc.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
- } else {
- dispatchTab.ScriptInvokeV((RsContext)con, (RsScript)script, slot, ptr, len);
- }
- _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
-}
-
-static void
-nScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
- jlong script, jint slot, jlong ain, jlong aout, jboolean mUseInc)
-{
- LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- NULL, 0, NULL, 0);
- } else {
- dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- NULL, 0, NULL, 0);
- }
-}
-
-static void
-nScriptForEachV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
- jlong script, jint slot, jlong ain, jlong aout, jbyteArray params, jboolean mUseInc)
-{
- LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- jint len = _env->GetArrayLength(params);
- jbyte *ptr = _env->GetByteArrayElements(params, NULL);
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- ptr, len, NULL, 0);
- } else {
- dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- ptr, len, NULL, 0);
- }
- _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
-}
-
-static void
-nScriptForEachClipped(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
- jlong script, jint slot, jlong ain, jlong aout,
- jint xstart, jint xend,
- jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
-{
- LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- RsScriptCall sc;
- sc.xStart = xstart;
- sc.xEnd = xend;
- sc.yStart = ystart;
- sc.yEnd = yend;
- sc.zStart = zstart;
- sc.zEnd = zend;
- sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
- sc.arrayStart = 0;
- sc.arrayEnd = 0;
- sc.array2Start = 0;
- sc.array2End = 0;
- sc.array3Start = 0;
- sc.array3End = 0;
- sc.array4Start = 0;
- sc.array4End = 0;
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- NULL, 0, &sc, sizeof(sc));
- } else {
- dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- NULL, 0, &sc, sizeof(sc));
- }
-}
-
-static void
-nScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, jlong incCon,
- jlong script, jint slot, jlong ain, jlong aout,
- jbyteArray params, jint xstart, jint xend,
- jint ystart, jint yend, jint zstart, jint zend, jboolean mUseInc)
-{
- LOG_API("nScriptForEachClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot);
- jint len = _env->GetArrayLength(params);
- jbyte *ptr = _env->GetByteArrayElements(params, NULL);
- RsScriptCall sc;
- sc.xStart = xstart;
- sc.xEnd = xend;
- sc.yStart = ystart;
- sc.yEnd = yend;
- sc.zStart = zstart;
- sc.zEnd = zend;
- sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
- sc.arrayStart = 0;
- sc.arrayEnd = 0;
- sc.array2Start = 0;
- sc.array2End = 0;
- sc.array3Start = 0;
- sc.array3End = 0;
- sc.array4Start = 0;
- sc.array4End = 0;
- if (mUseInc) {
- dispatchTab.ContextFinish((RsContext)con);
- dispatchTabInc.ScriptForEach((RsContext)incCon, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- ptr, len, &sc, sizeof(sc));
- } else {
- dispatchTab.ScriptForEach((RsContext)con, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- ptr, len, &sc, sizeof(sc));
- }
- _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
-}
-
-static void
-nScriptForEachMulti(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
- jlongArray ains, jlong aout, jbyteArray params,
- jintArray limits)
-{
- LOG_API("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
-
- jint in_len = 0;
- jlong *in_ptr = nullptr;
-
- RsAllocation *in_allocs = nullptr;
-
- if (ains != nullptr) {
- in_len = _env->GetArrayLength(ains);
- if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
- LOG_ERR("Too many arguments in kernel launch.");
- // TODO (b/20758983): Report back to Java and throw an exception
- return;
- }
-
- // TODO (b/20760800): Check in_ptr is not null
- in_ptr = _env->GetLongArrayElements(ains, nullptr);
- if (sizeof(RsAllocation) == sizeof(jlong)) {
- in_allocs = (RsAllocation*)in_ptr;
-
- } else {
- // Convert from 64-bit jlong types to the native pointer type.
-
- in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
- if (in_allocs == nullptr) {
- LOG_ERR("Failed launching kernel for lack of memory.");
- _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
- return;
- }
-
- for (int index = in_len; --index >= 0;) {
- in_allocs[index] = (RsAllocation)in_ptr[index];
- }
- }
- }
-
- jint param_len = 0;
- jbyte *param_ptr = nullptr;
-
- if (params != nullptr) {
- param_len = _env->GetArrayLength(params);
- param_ptr = _env->GetByteArrayElements(params, nullptr);
- }
-
- RsScriptCall sc, *sca = nullptr;
- uint32_t sc_size = 0;
-
- jint limit_len = 0;
- jint *limit_ptr = nullptr;
-
- if (limits != nullptr) {
- limit_len = _env->GetArrayLength(limits);
- limit_ptr = _env->GetIntArrayElements(limits, nullptr);
-
- if (limit_len != 6) {
- LOG_ERR("LaunchOptions cannot be recognized.");
- goto exit;
- }
-
- sc.xStart = limit_ptr[0];
- sc.xEnd = limit_ptr[1];
- sc.yStart = limit_ptr[2];
- sc.yEnd = limit_ptr[3];
- sc.zStart = limit_ptr[4];
- sc.zEnd = limit_ptr[5];
- sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
- sc.arrayStart = 0;
- sc.arrayEnd = 0;
- sc.array2Start = 0;
- sc.array2End = 0;
- sc.array3Start = 0;
- sc.array3End = 0;
- sc.array4Start = 0;
- sc.array4End = 0;
-
- sca = ≻
- }
-
- dispatchTabInc.ScriptForEachMulti((RsContext)con, (RsScript)script, slot,
- in_allocs, in_len, (RsAllocation)aout,
- param_ptr, param_len, sca, sc_size);
-
-exit:
-
- if (ains != nullptr) {
- _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
- }
-
- if (params != nullptr) {
- _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT);
- }
-
- if (limits != nullptr) {
- _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
- }
-}
-
-static void
-nScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
- jlongArray ains, jlong aout, jintArray limits)
-{
- LOG_API("nScriptReduce, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
-
- if (ains == nullptr) {
- LOG_ERR("At least one input required.");
- // TODO (b/20758983): Report back to Java and throw an exception
- return;
- }
- jint in_len = _env->GetArrayLength(ains);
- if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) {
- LOG_ERR("Too many arguments in kernel launch.");
- // TODO (b/20758983): Report back to Java and throw an exception
- return;
- }
-
- jlong *in_ptr = _env->GetLongArrayElements(ains, nullptr);
- if (in_ptr == nullptr) {
- LOG_ERR("Failed to get Java array elements");
- // TODO (b/20758983): Report back to Java and throw an exception
- return;
- }
-
- RsAllocation *in_allocs = nullptr;
- if (sizeof(RsAllocation) == sizeof(jlong)) {
- in_allocs = (RsAllocation*)in_ptr;
- } else {
- // Convert from 64-bit jlong types to the native pointer type.
-
- in_allocs = (RsAllocation*)alloca(in_len * sizeof(RsAllocation));
- if (in_allocs == nullptr) {
- LOG_ERR("Failed launching kernel for lack of memory.");
- // TODO (b/20758983): Report back to Java and throw an exception
- _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
- return;
- }
-
- for (int index = in_len; --index >= 0;) {
- in_allocs[index] = (RsAllocation)in_ptr[index];
- }
- }
-
- RsScriptCall sc, *sca = nullptr;
- uint32_t sc_size = 0;
-
- jint limit_len = 0;
- jint *limit_ptr = nullptr;
-
- if (limits != nullptr) {
- limit_len = _env->GetArrayLength(limits);
- limit_ptr = _env->GetIntArrayElements(limits, nullptr);
- if (limit_ptr == nullptr) {
- LOG_ERR("Failed to get Java array elements");
- // TODO (b/20758983): Report back to Java and throw an exception
- _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
- return;
- }
-
- if (limit_len != 6) {
- LOG_ERR("LaunchOptions cannot be recognized");
- // TODO (b/20758983): Report back to Java and throw an exception
- _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
- return;
- }
-
- sc.xStart = limit_ptr[0];
- sc.xEnd = limit_ptr[1];
- sc.yStart = limit_ptr[2];
- sc.yEnd = limit_ptr[3];
- sc.zStart = limit_ptr[4];
- sc.zEnd = limit_ptr[5];
- sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
- sc.arrayStart = 0;
- sc.arrayEnd = 0;
- sc.array2Start = 0;
- sc.array2End = 0;
- sc.array3Start = 0;
- sc.array3End = 0;
- sc.array4Start = 0;
- sc.array4End = 0;
-
- sca = ≻
- sc_size = sizeof(sc);
- }
-
- dispatchTab.ScriptReduce((RsContext)con, (RsScript)script, slot,
- in_allocs, in_len, (RsAllocation)aout,
- sca, sc_size);
-
- _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
-
- if (limits != nullptr) {
- _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
- }
-}
-
-// -----------------------------------
-
-static jlong
-nScriptCCreate(JNIEnv *_env, jobject _this, jlong con,
- jstring resName, jstring cacheDir,
- jbyteArray scriptRef, jint length)
-{
- LOG_API("nScriptCCreate, con(%p)", (RsContext)con);
-
- AutoJavaStringToUTF8 resNameUTF(_env, resName);
- AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
- jlong ret = 0;
- jbyte* script_ptr = NULL;
- jint _exception = 0;
- jint remaining;
- if (!scriptRef) {
- _exception = 1;
- //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
- goto exit;
- }
- if (length < 0) {
- _exception = 1;
- //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
- goto exit;
- }
- remaining = _env->GetArrayLength(scriptRef);
- if (remaining < length) {
- _exception = 1;
- //jniThrowException(_env, "java/lang/IllegalArgumentException",
- // "length > script.length - offset");
- goto exit;
- }
- script_ptr = (jbyte *)
- _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
-
- //rsScriptCSetText(con, (const char *)script_ptr, length);
-
- ret = (jlong)(uintptr_t)dispatchTab.ScriptCCreate((RsContext)con,
- resNameUTF.c_str(), resNameUTF.length(),
- cacheDirUTF.c_str(), cacheDirUTF.length(),
- (const char *)script_ptr, length);
-
-exit:
- if (script_ptr) {
- _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
- _exception ? JNI_ABORT: 0);
- }
-
- return (jlong)(uintptr_t)ret;
-}
-
-static jlong
-nScriptIntrinsicCreate(JNIEnv *_env, jobject _this, jlong con, jint id, jlong eid, jboolean mUseInc)
-{
- LOG_API("nScriptIntrinsicCreate, con(%p) id(%i) element(%p)", (RsContext)con, id, (void *)eid);
- if (mUseInc) {
- return (jlong)(uintptr_t)dispatchTabInc.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
- } else {
- return (jlong)(uintptr_t)dispatchTab.ScriptIntrinsicCreate((RsContext)con, id, (RsElement)eid);
- }
-}
-
-static jlong
-nScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jint sig, jboolean mUseInc)
-{
- LOG_API("nScriptKernelIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
- (void *)sid, slot, sig);
- if (mUseInc) {
- return (jlong)(uintptr_t)dispatchTabInc.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
- slot, sig);
- } else {
- return (jlong)(uintptr_t)dispatchTab.ScriptKernelIDCreate((RsContext)con, (RsScript)sid,
- slot, sig);
- }
-}
-
-static jlong
-nScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
-{
- LOG_API("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", con,
- (void *)sid, slot);
- return (jlong)dispatchTab.ScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
-}
-
-static jlong
-nScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot, jboolean mUseInc)
-{
- LOG_API("nScriptFieldIDCreate, con(%p) script(%p), slot(%i)", (RsContext)con, (void *)sid, slot);
- if (mUseInc) {
- return (jlong)(uintptr_t)dispatchTabInc.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
- } else {
- return (jlong)(uintptr_t)dispatchTab.ScriptFieldIDCreate((RsContext)con, (RsScript)sid, slot);
- }
-}
-
-static jlong
-nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels, jlongArray _src,
- jlongArray _dstk, jlongArray _dstf, jlongArray _types)
-{
- LOG_API("nScriptGroupCreate, con(%p)", (RsContext)con);
-
- jlong id = 0;
-
- RsScriptKernelID* kernelsPtr;
- jint kernelsLen = _env->GetArrayLength(_kernels);
- jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
-
- RsScriptKernelID* srcPtr;
- jint srcLen = _env->GetArrayLength(_src);
- jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
-
- RsScriptKernelID* dstkPtr;
- jint dstkLen = _env->GetArrayLength(_dstk);
- jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
-
- RsScriptKernelID* dstfPtr;
- jint dstfLen = _env->GetArrayLength(_dstf);
- jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
-
- RsType* typesPtr;
- jint typesLen = _env->GetArrayLength(_types);
- jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
-
- if (jKernelsPtr == nullptr) {
- LOG_ERR("Failed to get Java array elements: kernels");
- goto cleanup;
- }
- if (jSrcPtr == nullptr) {
- LOG_ERR("Failed to get Java array elements: src");
- goto cleanup;
- }
- if (jDstkPtr == nullptr) {
- LOG_ERR("Failed to get Java array elements: dstk");
- goto cleanup;
- }
- if (jDstfPtr == nullptr) {
- LOG_ERR("Failed to get Java array elements: dstf");
- goto cleanup;
- }
- if (jTypesPtr == nullptr) {
- LOG_ERR("Failed to get Java array elements: types");
- goto cleanup;
- }
-
- kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
- for(int i = 0; i < kernelsLen; ++i) {
- kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
- }
-
- srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
- for(int i = 0; i < srcLen; ++i) {
- srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
- }
-
- dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
- for(int i = 0; i < dstkLen; ++i) {
- dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
- }
-
- dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
- for(int i = 0; i < dstfLen; ++i) {
- dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
- }
-
- typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
- for(int i = 0; i < typesLen; ++i) {
- typesPtr[i] = (RsType)jTypesPtr[i];
- }
-
- id = (jlong)(uintptr_t) dispatchTab.ScriptGroupCreate((RsContext)con,
- (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
- (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
- (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
- (RsScriptFieldID *)dstfPtr, dstfLen * sizeof(RsScriptKernelID),
- (RsType *)typesPtr, typesLen * sizeof(RsType));
-
- free(kernelsPtr);
- free(srcPtr);
- free(dstkPtr);
- free(dstfPtr);
- free(typesPtr);
-
-cleanup:
- if (jKernelsPtr != nullptr) {
- _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
- }
- if (jSrcPtr != nullptr) {
- _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
- }
- if (jDstkPtr != nullptr) {
- _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
- }
- if (jDstfPtr != nullptr) {
- _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
- }
- if (jTypesPtr != nullptr) {
- _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
- }
-
- return id;
-}
-
-static void
-nScriptGroupSetInput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
-{
- LOG_API("nScriptGroupSetInput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
- (void *)gid, (void *)kid, (void *)alloc);
- dispatchTab.ScriptGroupSetInput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
- (RsAllocation)alloc);
-}
-
-static void
-nScriptGroupSetOutput(JNIEnv *_env, jobject _this, jlong con, jlong gid, jlong kid, jlong alloc)
-{
- LOG_API("nScriptGroupSetOutput, con(%p) group(%p), kernelId(%p), alloc(%p)", (RsContext)con,
- (void *)gid, (void *)kid, (void *)alloc);
- dispatchTab.ScriptGroupSetOutput((RsContext)con, (RsScriptGroup)gid, (RsScriptKernelID)kid,
- (RsAllocation)alloc);
-}
-
-static void
-nScriptGroupExecute(JNIEnv *_env, jobject _this, jlong con, jlong gid)
-{
- LOG_API("nScriptGroupSetOutput, con(%p) group(%p)", (RsContext)con, (void *)gid);
- dispatchTab.ScriptGroupExecute((RsContext)con, (RsScriptGroup)gid);
-}
-
-// ---------------------------------------------------------------------------
-
-static jlong
-nSamplerCreate(JNIEnv *_env, jobject _this, jlong con, jint magFilter, jint minFilter,
- jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
-{
- LOG_API("nSamplerCreate, con(%p)", (RsContext)con);
- return (jlong)(uintptr_t)dispatchTab.SamplerCreate((RsContext)con,
- (RsSamplerValue)magFilter,
- (RsSamplerValue)minFilter,
- (RsSamplerValue)wrapS,
- (RsSamplerValue)wrapT,
- (RsSamplerValue)wrapR,
- aniso);
-}
-
-static jint
-nSystemGetPointerSize(JNIEnv *_env, jobject _this) {
- return (jint)sizeof(void*);
-}
-
-// ---------------------------------------------------------------------------
-// For Incremental Intrinsic Support
-static jboolean nIncLoadSO(JNIEnv *_env, jobject _this, jint deviceApi, jstring libPath) {
- void* handle = NULL;
- // For API 9+, dlopen the full path of libRSSupport.
- if (libPath != NULL) {
- const char * libPathJni = _env->GetStringUTFChars(libPath, JNI_FALSE);
- handle = dlopen(libPathJni, RTLD_LAZY | RTLD_LOCAL);
- _env->ReleaseStringUTFChars(libPath, libPathJni);
- } else {
- handle = dlopen("libRSSupport.so", RTLD_LAZY | RTLD_LOCAL);
- }
-
- if (handle == NULL) {
- LOG_ERR("couldn't dlopen %s; librsjni version: %d", dlerror(), RS_JNI_VERSION);
- return false;
- }
-
- if (loadSymbols(handle, dispatchTabInc, deviceApi) == false) {
- LOG_ERR("Dispatch Table init failed! librsjni version: %d", RS_JNI_VERSION);
- dlclose(handle);
- return false;
- }
- dispatchTabInc.AllocationCreateStrided = (AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided");
- if (dispatchTabInc.AllocationCreateStrided == NULL) {
- LOG_ERR("Couldn't initialize dispatchTabInc.AllocationCreateStrided");
- dlclose(handle);
- return false;
- }
- LOG_API("Successfully loaded compat runtime");
- return true;
-}
-
-// -----------------------------------
-// To create/destroy a dummy context
-static void
-nIncObjDestroy(JNIEnv *_env, jobject _this, jlong con, jlong obj)
-{
- LOG_API("nObjDestroy, con(%p) obj(%p)", (RsContext)con, (void *)obj);
- dispatchTabInc.ObjDestroy((RsContext)con, (void *)obj);
-}
-
-
-static jlong
-nIncDeviceCreate(JNIEnv *_env, jobject _this)
-{
- LOG_API("nDeviceCreate");
- return (jlong)(uintptr_t)dispatchTabInc.DeviceCreate();
-}
-
-static void
-nIncDeviceDestroy(JNIEnv *_env, jobject _this, jlong dev)
-{
- LOG_API("nDeviceDestroy");
- return dispatchTabInc.DeviceDestroy((RsDevice)dev);
-}
-
-static jlong
-nIncContextCreate(JNIEnv *_env, jobject _this, jlong dev, jint ver, jint sdkVer, jint ct)
-{
- LOG_API("nContextCreate");
- //The compat context for incremental support will be synchronous.
- return (jlong)(uintptr_t)dispatchTabInc.ContextCreate((RsDevice)dev, ver, sdkVer,
- (RsContextType)ct,
- RS_CONTEXT_SYNCHRONOUS);
-}
-
-static void
-nIncContextFinish(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextFinish, con(%p)", (RsContext)con);
- dispatchTabInc.ContextFinish((RsContext)con);
-}
-
-static void
-nIncContextDestroy(JNIEnv *_env, jobject _this, jlong con)
-{
- LOG_API("nContextDestroy, con(%p)", (RsContext)con);
- dispatchTabInc.ContextDestroy((RsContext)con);
-}
-
-// -----------------------------------
-// Create dummy Element
-static jlong
-nIncElementCreate(JNIEnv *_env, jobject _this, jlong con, jlong type, jint kind, jboolean norm, jint size)
-{
- LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", (RsContext)con,
- type, kind, norm, size);
- return (jlong)(uintptr_t)dispatchTabInc.ElementCreate((RsContext)con, (RsDataType)type,
- (RsDataKind)kind, norm, size);
-}
-// -----------------------------------
-// Create dummy Type
-static jlong
-nIncTypeCreate(JNIEnv *_env, jobject _this, jlong con, jlong eid,
- jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces, jint yuv)
-{
- LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i), yuv(%i)",
- incCon, eid, dimx, dimy, dimz, mips, faces, yuv);
-
- return (jlong)(uintptr_t)dispatchTabInc.TypeCreate((RsContext)con, (RsElement)eid, dimx, dimy,
- dimz, mips, faces, yuv);
-}
-
-// -----------------------------------
-// Create Allocation from pointer
-static jlong
-nIncAllocationCreateTyped(JNIEnv *_env, jobject _this, jlong con, jlong incCon, jlong alloc, jlong type, jint xBytesSize)
-{
- LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)",
- incCon, (RsElement)type, mips, usage, (void *)pointer);
- size_t strideIn;
- void* pIn = NULL;
- RsAllocation ainI = NULL;
- if (alloc != 0) {
- pIn = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
- RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
- &strideIn, sizeof(size_t));
- /*
- * By definition stride is a roundup of xBytesSize with requiredAlignment, so requiredAlignment must
- * be strictly larger than the difference of (stride - xBytesSize).
- *
- * We can prove that as long as requiredAlignment satisfies the following two conditions, the
- * memory layout will be identical :
- * 1. Smaller or equal than stride;
- * 2. Larger than minRequiredAlignment.
- *
- * In this case we can simply choose the first power of 2 that satisfies both conditions.
- */
- size_t requiredAlignment = 16;
- size_t minRequiredAlignment = strideIn - xBytesSize;
- while (requiredAlignment <= minRequiredAlignment) {
- requiredAlignment <<= 1;
- }
- ainI = dispatchTabInc.AllocationCreateStrided((RsContext)incCon, (RsType)type,
- RS_ALLOCATION_MIPMAP_NONE,
- RS_ALLOCATION_USAGE_INCREMENTAL_SUPPORT | RS_ALLOCATION_USAGE_SHARED,
- (uintptr_t)pIn, requiredAlignment);
- }
- return (jlong)(uintptr_t) ainI;
-}
-
-static jobject
-nAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint xBytesSize, jint dimY, jint dimZ)
-{
- LOG_API("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
- size_t strideIn = xBytesSize;
- void* ptr = NULL;
- if (alloc != 0 && dispatchTab.AllocationGetPointer != nullptr) {
- ptr = dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
- RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, dimZ, 0,
- &strideIn, sizeof(size_t));
- }
- if (ptr != NULL) {
- size_t bufferSize = strideIn;
- if (dimY > 0) {
- bufferSize *= dimY;
- }
- if (dimZ > 0) {
- bufferSize *= dimZ;
- }
- jobject byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
- return byteBuffer;
- } else {
- return NULL;
- }
-}
-
-static jlong
-nAllocationGetStride(JNIEnv *_env, jobject _this, jlong con, jlong alloc)
-{
- LOG_API("nAllocationGetStride, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
- size_t strideIn = 0;
- if (alloc != 0 && dispatchTab.AllocationGetPointer != nullptr) {
- dispatchTab.AllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
- RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
- &strideIn, sizeof(size_t));
- }
- return (jlong)strideIn;
-}
-
-// ---------------------------------------------------------------------------
-
-
-static const char *classPathName = "android/support/v8/renderscript/RenderScript";
-
-static JNINativeMethod methods[] = {
-{"nLoadSO", "(ZILjava/lang/String;)Z", (bool*)nLoadSO },
-{"nLoadIOSO", "()Z", (bool*)nLoadIOSO },
-{"nDeviceCreate", "()J", (void*)nDeviceCreate },
-{"nDeviceDestroy", "(J)V", (void*)nDeviceDestroy },
-{"nDeviceSetConfig", "(JII)V", (void*)nDeviceSetConfig },
-{"nContextGetUserMessage", "(J[I)I", (void*)nContextGetUserMessage },
-{"nContextGetErrorMessage", "(J)Ljava/lang/String;", (void*)nContextGetErrorMessage },
-{"nContextPeekMessage", "(J[I)I", (void*)nContextPeekMessage },
-{"nContextInitToClient", "(J)V", (void*)nContextInitToClient },
-{"nContextDeinitToClient", "(J)V", (void*)nContextDeinitToClient },
-
-
-// All methods below are thread protected in java.
-{"rsnContextCreate", "(JIIILjava/lang/String;)J", (void*)nContextCreate },
-{"rsnContextFinish", "(J)V", (void*)nContextFinish },
-{"rsnContextSetPriority", "(JI)V", (void*)nContextSetPriority },
-{"rsnContextDestroy", "(J)V", (void*)nContextDestroy },
-{"rsnContextDump", "(JI)V", (void*)nContextDump },
-{"rsnContextSendMessage", "(JI[I)V", (void*)nContextSendMessage },
-{"rsnClosureCreate", "(JJJ[J[J[I[J[J)J", (void*)nClosureCreate },
-{"rsnInvokeClosureCreate", "(JJ[B[J[J[I)J", (void*)nInvokeClosureCreate },
-{"rsnClosureSetArg", "(JJIJI)V", (void*)nClosureSetArg },
-{"rsnClosureSetGlobal", "(JJJJI)V", (void*)nClosureSetGlobal },
-{"rsnObjDestroy", "(JJ)V", (void*)nObjDestroy },
-
-{"rsnElementCreate", "(JJIZI)J", (void*)nElementCreate },
-{"rsnElementCreate2", "(J[J[Ljava/lang/String;[I)J", (void*)nElementCreate2 },
-{"rsnElementGetSubElements", "(JJ[J[Ljava/lang/String;[I)V", (void*)nElementGetSubElements },
-
-{"rsnTypeCreate", "(JJIIIZZI)J", (void*)nTypeCreate },
-
-{"rsnAllocationCreateTyped", "(JJIIJ)J", (void*)nAllocationCreateTyped },
-{"rsnAllocationCreateFromBitmap", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateFromBitmap },
-{"rsnAllocationCreateBitmapBackedAllocation", "(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCreateBitmapBackedAllocation },
-{"rsnAllocationCubeCreateFromBitmap","(JJILandroid/graphics/Bitmap;I)J", (void*)nAllocationCubeCreateFromBitmap },
-
-{"rsnAllocationCopyFromBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyFromBitmap },
-{"rsnAllocationCopyToBitmap", "(JJLandroid/graphics/Bitmap;)V", (void*)nAllocationCopyToBitmap },
-
-{"rsnAllocationSyncAll", "(JJI)V", (void*)nAllocationSyncAll },
-{"rsnAllocationSetSurface", "(JJLandroid/view/Surface;)V", (void*)nAllocationSetSurface },
-{"rsnAllocationIoSend", "(JJ)V", (void*)nAllocationIoSend },
-{"rsnAllocationData1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData1D },
-{"rsnAllocationElementData1D", "(JJIII[BI)V", (void*)nAllocationElementData1D },
-//{"rsnAllocationElementData", "(JJIIIII[BI)V", (void*)nAllocationElementData },
-{"rsnAllocationData2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData2D },
-{"rsnAllocationData2D", "(JJIIIIIIJIIII)V", (void*)nAllocationData2D_alloc },
-{"rsnAllocationData3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationData3D },
-{"rsnAllocationData3D", "(JJIIIIIIIJIIII)V", (void*)nAllocationData3D_alloc },
-{"rsnAllocationRead", "(JJLjava/lang/Object;IIZ)V", (void*)nAllocationRead },
-{"rsnAllocationRead1D", "(JJIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead1D },
-//{"rsnAllocationElementRead", "(JJIIIII[BI)V", (void*)nAllocationElementRead },
-{"rsnAllocationRead2D", "(JJIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead2D },
-//{"rsnAllocationRead3D", "(JJIIIIIIILjava/lang/Object;IIIZ)V", (void*)nAllocationRead3D },
-{"rsnAllocationGetType", "(JJ)J", (void*)nAllocationGetType},
-{"rsnAllocationResize1D", "(JJI)V", (void*)nAllocationResize1D },
-{"rsnAllocationGenerateMipmaps", "(JJ)V", (void*)nAllocationGenerateMipmaps },
-
-{"rsnScriptBindAllocation", "(JJJIZ)V", (void*)nScriptBindAllocation },
-{"rsnScriptSetTimeZone", "(JJ[BZ)V", (void*)nScriptSetTimeZone },
-{"rsnScriptInvoke", "(JJIZ)V", (void*)nScriptInvoke },
-{"rsnScriptInvokeV", "(JJI[BZ)V", (void*)nScriptInvokeV },
-{"rsnScriptForEach", "(JJJIJJZ)V", (void*)nScriptForEach },
-{"rsnScriptForEach", "(JJJIJJ[BZ)V", (void*)nScriptForEachV },
-{"rsnScriptForEach", "(JJI[JJ[B[I)V", (void*)nScriptForEachMulti },
-{"rsnScriptForEachClipped", "(JJJIJJIIIIIIZ)V", (void*)nScriptForEachClipped },
-{"rsnScriptForEachClipped", "(JJJIJJ[BIIIIIIZ)V", (void*)nScriptForEachClippedV },
-{"rsnScriptReduce", "(JJI[JJ[I)V", (void*)nScriptReduce },
-{"rsnScriptSetVarI", "(JJIIZ)V", (void*)nScriptSetVarI },
-{"rsnScriptSetVarJ", "(JJIJZ)V", (void*)nScriptSetVarJ },
-{"rsnScriptSetVarF", "(JJIFZ)V", (void*)nScriptSetVarF },
-{"rsnScriptSetVarD", "(JJIDZ)V", (void*)nScriptSetVarD },
-{"rsnScriptSetVarV", "(JJI[BZ)V", (void*)nScriptSetVarV },
-{"rsnScriptSetVarVE", "(JJI[BJ[IZ)V", (void*)nScriptSetVarVE },
-{"rsnScriptSetVarObj", "(JJIJZ)V", (void*)nScriptSetVarObj },
-
-{"rsnScriptCCreate", "(JLjava/lang/String;Ljava/lang/String;[BI)J", (void*)nScriptCCreate },
-{"rsnScriptIntrinsicCreate", "(JIJZ)J", (void*)nScriptIntrinsicCreate },
-{"rsnScriptKernelIDCreate", "(JJIIZ)J", (void*)nScriptKernelIDCreate },
-{"rsnScriptInvokeIDCreate", "(JJI)J", (void*)nScriptInvokeIDCreate },
-{"rsnScriptFieldIDCreate", "(JJIZ)J", (void*)nScriptFieldIDCreate },
-{"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate },
-{"rsnScriptGroup2Create", "(JLjava/lang/String;Ljava/lang/String;[J)J", (void*)nScriptGroup2Create },
-{"rsnScriptGroupSetInput", "(JJJJ)V", (void*)nScriptGroupSetInput },
-{"rsnScriptGroupSetOutput", "(JJJJ)V", (void*)nScriptGroupSetOutput },
-{"rsnScriptGroupExecute", "(JJ)V", (void*)nScriptGroupExecute },
-{"rsnScriptGroup2Execute", "(JJ)V", (void*)nScriptGroup2Execute },
-
-{"rsnScriptIntrinsicBLAS_Single", "(JJJIIIIIIIIIFJJFJIIIIZ)V", (void*)nScriptIntrinsicBLAS_Single },
-{"rsnScriptIntrinsicBLAS_Double", "(JJJIIIIIIIIIDJJDJIIIIZ)V", (void*)nScriptIntrinsicBLAS_Double },
-{"rsnScriptIntrinsicBLAS_Complex", "(JJJIIIIIIIIIFFJJFFJIIIIZ)V", (void*)nScriptIntrinsicBLAS_Complex },
-{"rsnScriptIntrinsicBLAS_Z", "(JJJIIIIIIIIIDDJJDDJIIIIZ)V", (void*)nScriptIntrinsicBLAS_Z },
-
-{"rsnScriptIntrinsicBLAS_BNNM", "(JJJIIIJIJIJIIZ)V", (void*)nScriptIntrinsicBLAS_BNNM },
-
-{"rsnSamplerCreate", "(JIIIIIF)J", (void*)nSamplerCreate },
-
-{"rsnSystemGetPointerSize", "()I", (void*)nSystemGetPointerSize },
-
-// Entry points for Inc libRSSupport
-{"nIncLoadSO", "(ILjava/lang/String;)Z", (bool*)nIncLoadSO },
-{"nIncDeviceCreate", "()J", (void*)nIncDeviceCreate },
-{"nIncDeviceDestroy", "(J)V", (void*)nIncDeviceDestroy },
-{"rsnIncContextCreate", "(JIII)J", (void*)nIncContextCreate },
-{"rsnIncContextFinish", "(J)V", (void*)nIncContextFinish },
-{"rsnIncContextDestroy", "(J)V", (void*)nIncContextDestroy },
-{"rsnIncObjDestroy", "(JJ)V", (void*)nIncObjDestroy },
-{"rsnIncElementCreate", "(JJIZI)J", (void*)nIncElementCreate },
-{"rsnIncTypeCreate", "(JJIIIZZI)J", (void*)nIncTypeCreate },
-{"rsnIncAllocationCreateTyped", "(JJJJI)J", (void*)nIncAllocationCreateTyped },
-{"rsnAllocationGetByteBuffer", "(JJIII)Ljava/nio/ByteBuffer;", (void*)nAllocationGetByteBuffer },
-{"rsnAllocationGetStride", "(JJ)J", (void*)nAllocationGetStride },
-};
-
-// ---------------------------------------------------------------------------
-
-jint JNI_OnLoad(JavaVM* vm, void* reserved)
-{
- JNIEnv* env = NULL;
- jclass clazz = NULL;
- jint result = -1;
-
- if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
- // __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
- // "ERROR: GetEnv failed\n");
- goto bail;
- }
- if (env == NULL) {
- // __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: env == NULL");
- goto bail;
- }
-
- clazz = env->FindClass(classPathName);
- if (clazz == NULL) {
- goto bail;
- }
-
- if (env->RegisterNatives(clazz, methods, NELEM(methods)) < 0) {
- // __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
- // "ERROR: MediaPlayer native registration failed\n");
- goto bail;
- }
-
- /* success -- return valid version number */
- result = JNI_VERSION_1_4;
-
-bail:
- return result;
-}
diff --git a/v8/renderscript/jni/android_rscompat_usage_io.cpp b/v8/renderscript/jni/android_rscompat_usage_io.cpp
deleted file mode 100644
index e29be1a..0000000
--- a/v8/renderscript/jni/android_rscompat_usage_io.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <android/log.h>
-#include <android/native_window.h>
-#include <android/native_window_jni.h>
-
-#include <rsEnv.h>
-#include "rsDispatch.h"
-#define LOG_API(...)
-
-extern "C" void AllocationSetSurface(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc, jobject sur, dispatchTable dispatchTab)
-{
- LOG_API("nAllocationSetSurface, con(%p), alloc(%p), surface(%p)",
- con, alloc, sur);
-
- ANativeWindow* s = NULL;
- if (sur != 0) {
- s = ANativeWindow_fromSurface(_env, sur);
- }
- dispatchTab.AllocationSetSurface(con, alloc, s);
-}
-
diff --git a/v8/renderscript/jni/android_rscompat_usage_io_driver.cpp b/v8/renderscript/jni/android_rscompat_usage_io_driver.cpp
deleted file mode 100644
index 96eb19a..0000000
--- a/v8/renderscript/jni/android_rscompat_usage_io_driver.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#include <android/native_window.h>
-#include <android/log.h>
-
-#include "rsCompatibilityLib.h"
-
-#include "rsdCore.h"
-#include "rsdAllocation.h"
-#include "rsAllocation.h"
-
-#define LOG_API(...)
-
-using namespace android;
-using namespace android::renderscript;
-
-static bool IoGetBuffer(const Context *rsc, Allocation *alloc, ANativeWindow *nw) {
- DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
- // Must lock the whole surface
- if(drv->wndBuffer == NULL) {
- drv->wndBuffer = new ANativeWindow_Buffer;
- }
- int32_t r = ANativeWindow_lock(nw, drv->wndBuffer, NULL);
- if (r) {
- LOG_API("Error Locking IO output buffer.");
- return false;
- }
-
- void *dst = drv->wndBuffer->bits;
- alloc->mHal.drvState.lod[0].mallocPtr = dst;
- alloc->mHal.drvState.lod[0].stride = drv->wndBuffer->stride * alloc->mHal.state.elementSizeBytes;
- return true;
-}
-
-extern "C" void rscAllocationSetSurface(RsContext rscR, RsAllocation allocR, ANativeWindow *nw) {
- Context *rsc = (Context *)rscR;
- Allocation *alloc = (Allocation *)allocR;
- DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
- // Cleanup old surface if there is one.
- if (drv->wndSurface) {
- ANativeWindow *old = drv->wndSurface;
- ANativeWindow_unlockAndPost(old);
- drv->wndSurface = NULL;
- ANativeWindow_release(old);
- old = NULL;
- }
-
- if (nw != NULL) {
- int32_t r;
- r = ANativeWindow_setBuffersGeometry(nw, alloc->mHal.drvState.lod[0].dimX,
- alloc->mHal.drvState.lod[0].dimY,
- WINDOW_FORMAT_RGBA_8888);
- if (r) {
- LOG_API("Error setting IO output buffer geometry.");
- goto errorcmp;
- }
-
- IoGetBuffer(rsc, alloc, nw);
- drv->wndSurface = nw;
- }
-
- return;
-
- errorcmp:
-
- if (nw) {
- nw = NULL;
- }
-
-}
-
-extern "C" void rscAllocationDestroy(const Context *rsc, Allocation *alloc) {
- DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
- if (alloc->mHal.drvState.lod[0].mallocPtr) {
- // don't free user-allocated ptrs or IO_OUTPUT buffers
- if (!(drv->useUserProvidedPtr) &&
- !(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_INPUT) &&
- !(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT)) {
- free(alloc->mHal.drvState.lod[0].mallocPtr);
- }
- alloc->mHal.drvState.lod[0].mallocPtr = NULL;
- }
-
- if ((alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT) &&
- (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT)) {
- ANativeWindow *nw = drv->wndSurface;
- if (nw) {
- //If we have an attached surface, need to release it.
- ANativeWindow_unlockAndPost(nw);
- drv->wndSurface = NULL;
- ANativeWindow_release(nw);
- nw = NULL;
- }
- }
-}
-
-extern "C" void rscAllocationIoSend(const Context *rsc, Allocation *alloc) {
- DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
- ANativeWindow *nw = drv->wndSurface;
- if (nw) {
- if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) {
- int32_t r = ANativeWindow_unlockAndPost(nw);
- if (r) {
- LOG_API("Error sending IO output buffer.");
- return;
- }
- IoGetBuffer(rsc, alloc, nw);
- }
- } else {
- LOG_API("Sent IO buffer with no attached surface.");
- return;
- }
-}
-
diff --git a/v8/renderscript/rs_support/Android.mk b/v8/renderscript/rs_support/Android.mk
deleted file mode 100644
index de8fae0..0000000
--- a/v8/renderscript/rs_support/Android.mk
+++ /dev/null
@@ -1,189 +0,0 @@
-
-LOCAL_PATH:=frameworks/rs
-rs_base_CFLAGS := -Werror -Wall -Wno-unused-parameter -Wno-unused-variable \
- -Wno-overloaded-virtual -DRS_COMPATIBILITY_LIB -std=c++11
-
-ifeq ($(ARCH_ARM_HAVE_NEON),true)
-rs_base_CFLAGS += -DARCH_ARM_HAVE_NEON
-endif
-
-ifeq ($(TARGET_BUILD_PDK), true)
- rs_base_CFLAGS += -D__RS_PDK__
-endif
-
-# Build rsg-generator ====================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := rsg-generator_support
-
-# These symbols are normally defined by BUILD_XXX, but we need to define them
-# here so that local-intermediates-dir works.
-
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-intermediates := $(local-intermediates-dir)
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES:= \
- spec.l \
- rsg_generator.c
-
-LOCAL_CXX_STL := none
-LOCAL_SANITIZE := never
-
-include $(BUILD_HOST_EXECUTABLE)
-
-# TODO: This should go into build/core/config.mk
-RSG_GENERATOR_SUPPORT:=$(LOCAL_BUILT_MODULE)
-
-include $(CLEAR_VARS)
-LOCAL_CLANG := true
-LOCAL_MODULE := libRSSupport
-LOCAL_SDK_VERSION := 9
-
-
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-generated_sources_dir := $(call local-generated-sources-dir)
-
-# Generate custom headers
-
-GEN := $(addprefix $(generated_sources_dir)/, \
- rsgApiStructs.h \
- rsgApiFuncDecl.h \
- )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rs_compat.spec | $(RSG_GENERATOR_SUPPORT) $< $@
-$(GEN) : $(RSG_GENERATOR_SUPPORT) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rs_compat.spec
-$(GEN): $(generated_sources_dir)/%.h : $(LOCAL_PATH)/%.h.rsg
- $(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-# Generate custom source files
-
-GEN := $(addprefix $(generated_sources_dir)/, \
- rsgApi.cpp \
- rsgApiReplay.cpp \
- )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rs_compat.spec | $(RSG_GENERATOR_SUPPORT) $< $@
-$(GEN) : $(RSG_GENERATOR_SUPPORT) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rs_compat.spec
-$(GEN): $(generated_sources_dir)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg
- $(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-LOCAL_SRC_FILES:= \
- rsAllocation.cpp \
- rsApiAllocation.cpp \
- rsApiContext.cpp \
- rsApiDevice.cpp \
- rsApiElement.cpp \
- rsApiType.cpp \
- rsClosure.cpp \
- rsCompatibilityLib.cpp \
- rsComponent.cpp \
- rsContext.cpp \
- rsCppUtils.cpp \
- rsDevice.cpp \
- rsDriverLoader.cpp \
- rsElement.cpp \
- rsFifoSocket.cpp \
- rsObjectBase.cpp \
- rsMatrix2x2.cpp \
- rsMatrix3x3.cpp \
- rsMatrix4x4.cpp \
- rsMutex.cpp \
- rsSampler.cpp \
- rsScript.cpp \
- rsScriptC.cpp \
- rsScriptC_Lib.cpp \
- rsScriptGroup.cpp \
- rsScriptGroup2.cpp \
- rsScriptIntrinsic.cpp \
- rsSignal.cpp \
- rsStream.cpp \
- rsThreadIO.cpp \
- rsType.cpp \
- driver/rsdAllocation.cpp \
- driver/rsdBcc.cpp \
- driver/rsdCore.cpp \
- driver/rsdElement.cpp \
- driver/rsdRuntimeStubs.cpp \
- driver/rsdSampler.cpp \
- driver/rsdScriptGroup.cpp \
- driver/rsdType.cpp \
- cpu_ref/rsCpuCore.cpp \
- cpu_ref/rsCpuExecutable.cpp \
- cpu_ref/rsCpuScript.cpp \
- cpu_ref/rsCpuRuntimeMath.cpp \
- cpu_ref/rsCpuScriptGroup.cpp \
- cpu_ref/rsCpuScriptGroup2.cpp \
- cpu_ref/rsCpuIntrinsic.cpp \
- cpu_ref/rsCpuIntrinsic3DLUT.cpp \
- cpu_ref/rsCpuIntrinsicBlend.cpp \
- cpu_ref/rsCpuIntrinsicBlur.cpp \
- cpu_ref/rsCpuIntrinsicBLAS.cpp \
- cpu_ref/rsCpuIntrinsicColorMatrix.cpp \
- cpu_ref/rsCpuIntrinsicConvolve3x3.cpp \
- cpu_ref/rsCpuIntrinsicConvolve5x5.cpp \
- cpu_ref/rsCpuIntrinsicHistogram.cpp \
- cpu_ref/rsCpuIntrinsicLUT.cpp \
- cpu_ref/rsCpuIntrinsicResize.cpp \
- cpu_ref/rsCpuIntrinsicYuvToRGB.cpp
-
-ifeq ($(ARCH_ARM_HAVE_ARMV7A),true)
-LOCAL_CFLAGS_arm := -DARCH_ARM_HAVE_VFP -DARCH_ARM_USE_INTRINSICS
-LOCAL_ASFLAGS_arm := -mfpu=neon
-LOCAL_SRC_FILES_arm := \
- cpu_ref/rsCpuIntrinsics_neon_3DLUT.S \
- cpu_ref/rsCpuIntrinsics_neon_Blend.S \
- cpu_ref/rsCpuIntrinsics_neon_Blur.S \
- cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S \
- cpu_ref/rsCpuIntrinsics_neon_Convolve.S \
- cpu_ref/rsCpuIntrinsics_neon_Resize.S \
- cpu_ref/rsCpuIntrinsics_neon_YuvToRGB.S
-endif
-
-LOCAL_CFLAGS_arm64 += \
- -DARCH_ARM_USE_INTRINSICS \
- -DARCH_ARM64_USE_INTRINSICS \
- -DARCH_ARM64_HAVE_NEON
-LOCAL_SRC_FILES_arm64 += \
- cpu_ref/rsCpuIntrinsics_advsimd_3DLUT.S \
- cpu_ref/rsCpuIntrinsics_advsimd_Blend.S \
- cpu_ref/rsCpuIntrinsics_advsimd_Blur.S \
- cpu_ref/rsCpuIntrinsics_advsimd_ColorMatrix.S \
- cpu_ref/rsCpuIntrinsics_advsimd_Convolve.S \
- cpu_ref/rsCpuIntrinsics_advsimd_Resize.S \
- cpu_ref/rsCpuIntrinsics_advsimd_YuvToRGB.S
-
-LOCAL_CFLAGS_x86 += -DARCH_X86_HAVE_SSSE3
-LOCAL_SRC_FILES_x86 += cpu_ref/rsCpuIntrinsics_x86.cpp
-LOCAL_CFLAGS_x86_64 += -DARCH_X86_HAVE_SSSE3
-LOCAL_SRC_FILES_x86_64 += cpu_ref/rsCpuIntrinsics_x86.cpp
-
-LOCAL_REQUIRED_MODULES := libblasV8
-LOCAL_STATIC_LIBRARIES := libbnnmlowpV8
-LOCAL_LDFLAGS += -llog -ldl -Wl,--exclude-libs,libc++_static.a
-LOCAL_NDK_STL_VARIANT := c++_static
-
-LOCAL_C_INCLUDES += external/cblas/include
-LOCAL_C_INCLUDES += external/gemmlowp/eight_bit_int_gemm
-
-LOCAL_CFLAGS += $(rs_base_CFLAGS) -DGEMMLOWP_USE_STLPORT
-
-LOCAL_MODULE:= libRSSupport
-LOCAL_MODULE_TAGS := optional
-
-# TODO: why isn't this picked up from the host GLOBAL_CFLAGS?
-LOCAL_CFLAGS += -D__STDC_FORMAT_MACROS
-
-include $(BUILD_SHARED_LIBRARY)