From ba6480d101f77d9ac46b7b7cebfb56eca1ec74b6 Mon Sep 17 00:00:00 2001 From: serso Date: Wed, 2 Mar 2016 00:06:09 +0100 Subject: [PATCH] Remove dependencies --- app/build.gradle | 29 +- app/proguard-debug.cfg | 1 + app/proguard.cfg | 3 +- app/src/main/AndroidManifest.xml | 9 - .../android/calculator/ActivityLauncher.java | 3 +- .../org/solovyev/android/calculator/App.java | 129 +++++- .../android/calculator/AppModule.java | 40 +- .../android/calculator/BaseActivity.java | 18 +- .../calculator/CalculatorApplication.java | 13 +- .../android/calculator/FragmentTab.java | 4 - .../solovyev/android/calculator/Notifier.java | 3 +- .../android/calculator/Preferences.java | 27 +- .../calculator/PreferredPreferences.java | 20 +- .../android/calculator/StartupHelper.java | 10 +- .../errors/FixableErrorsActivity.java | 12 +- .../floating/FloatingCalculatorService.java | 3 +- .../functions/EditFunctionFragment.java | 3 +- .../calculator/keyboard/BaseKeyboardUi.java | 22 +- .../matrix/CalculatorMatrixActivity.java | 44 -- .../calculator/matrix/EditMatrixFragment.java | 111 ----- .../plot/AbstractGraphCalculator.java | 128 ------ .../plot/AndroidCalculatorPlotter.java | 202 --------- .../calculator/plot/AndroidPlotLineStyle.java | 86 ---- .../plot/CalculatorGraph3dView.java | 423 ------------------ .../calculator/plot/CalculatorPlotter.java | 98 ---- .../calculator/plot/FunctionEvaluator.java | 38 -- .../android/calculator/plot/GLText.java | 418 ----------------- .../android/calculator/plot/GLView.java | 242 ---------- .../calculator/plot/Graph2dDimensions.java | 265 ----------- .../android/calculator/plot/Graph3d.java | 378 ---------------- .../calculator/plot/GraphCalculator.java | 40 -- .../calculator/plot/GraphCalculatorImpl.java | 123 ----- .../android/calculator/plot/GraphData.java | 187 -------- .../android/calculator/plot/GraphView.java | 65 --- .../calculator/plot/GraphViewHelper.java | 81 ---- .../android/calculator/plot/GraphsData.java | 110 ----- .../plot/MapPlotResourceManager.java | 140 ------ .../calculator/plot/PlotBoundaries.java | 124 ----- .../android/calculator/plot/PlotData.java | 73 --- .../android/calculator/plot/PlotFunction.java | 139 ------ .../calculator/plot/PlotLineColor.java | 68 --- .../calculator/plot/PlotLineColorType.java | 34 -- .../android/calculator/plot/PlotLineDef.java | 186 -------- .../calculator/plot/PlotLineStyle.java | 38 -- .../calculator/plot/PlotResourceManager.java | 42 -- .../android/calculator/plot/PlotUtils.java | 101 ----- .../android/calculator/plot/PlotViewDef.java | 99 ---- .../android/calculator/plot/SpriteBatch.java | 143 ------ .../calculator/plot/TexampleRenderer.java | 111 ----- .../calculator/plot/TextureRegion.java | 42 -- .../android/calculator/plot/TouchHandler.java | 118 ----- .../android/calculator/plot/Vertices.java | 282 ------------ .../android/calculator/plot/XyFunction.java | 247 ---------- .../android/calculator/plot/ZoomTracker.java | 77 ---- .../calculator/release/ReleaseNotes.java | 13 +- .../variables/EditVariableFragment.java | 3 +- .../variables/GreekFloatingKeyboard.java | 4 +- .../calculator/widget/CalculatorWidget.java | 3 +- .../wizard/ChooseThemeWizardStep.java | 7 +- .../main/res/layout/matrix_edit_fragment.xml | 84 ---- .../main/res/values/text_non_translatable.xml | 19 + .../main/res/xml/preferences_calculations.xml | 11 +- jscl/build.gradle | 1 - 63 files changed, 223 insertions(+), 5374 deletions(-) delete mode 100644 app/src/main/java/org/solovyev/android/calculator/matrix/CalculatorMatrixActivity.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/matrix/EditMatrixFragment.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/AbstractGraphCalculator.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/AndroidCalculatorPlotter.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/AndroidPlotLineStyle.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/CalculatorGraph3dView.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotter.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/FunctionEvaluator.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/GLText.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/GLView.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/Graph2dDimensions.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/Graph3d.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculator.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculatorImpl.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/GraphData.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/GraphView.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/GraphViewHelper.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/GraphsData.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/MapPlotResourceManager.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotBoundaries.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotData.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotFunction.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColor.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColorType.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotLineDef.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotLineStyle.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotResourceManager.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/PlotViewDef.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/SpriteBatch.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/TexampleRenderer.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/TextureRegion.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/TouchHandler.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/Vertices.java delete mode 100644 app/src/main/java/org/solovyev/android/calculator/plot/XyFunction.java delete mode 100755 app/src/main/java/org/solovyev/android/calculator/plot/ZoomTracker.java delete mode 100644 app/src/main/res/layout/matrix_edit_fragment.xml diff --git a/app/build.gradle b/app/build.gradle index 4c5e95e6..cef86cb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,14 +60,11 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'org.solovyev:common-core:1.0.7' - compile 'org.solovyev:common-text:1.0.7' - compile 'org.solovyev:common-security:1.0.7' compile 'org.solovyev:common-msg:1.0.7' - compile 'com.android.support:support-v4:23.1.1' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:cardview-v7:23.1.1' - compile 'com.android.support:design:23.1.1' + compile 'com.android.support:support-v4:23.2.0' + compile 'com.android.support:appcompat-v7:23.2.0' + compile 'com.android.support:cardview-v7:23.2.0' + compile 'com.android.support:design:23.2.0' compile('ch.acra:acra:4.7.0') { exclude group: 'org.json' } @@ -76,11 +73,6 @@ dependencies { compile ':square-otto:1.3.9-SNAPSHOT' apt ':square-otto-compiler:1.3.9-SNAPSHOT' apt 'com.squareup:javapoet:1.5.1' - compile 'org.solovyev.android:android-common-lists:1.1.18@aar' - compile 'org.solovyev.android:android-common-core:1.1.18@aar' - compile 'org.solovyev.android:android-common-other:1.1.18@aar' - compile 'org.solovyev.android:android-common-views:1.1.18@aar' - compile 'org.solovyev.android:android-common-menus:1.1.18@aar' compile(project(':jscl')) { exclude(module: 'xercesImpl') } @@ -99,7 +91,6 @@ dependencies { exclude(module: 'stax-api') exclude(module: 'xpp3') } - compile 'commons-cli:commons-cli:1.2' compile 'com.jakewharton:butterknife:7.0.1' compile 'org.solovyev.android.views:linear-layout-manager:0.5@aar' @@ -115,7 +106,7 @@ dependencies { testCompile 'org.skyscreamer:jsonassert:1.2.3' testCompile(name: 'org.apache.http.legacy', ext: 'jar') - androidTestCompile 'com.android.support:support-annotations:23.1.1' + androidTestCompile 'com.android.support:support-annotations:23.2.0' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' androidTestCompile 'org.hamcrest:hamcrest-library:1.3' @@ -167,7 +158,7 @@ signing { } gradle.taskGraph.afterTask { Task task -> - if (task.project.name == 'android-app') { + if (task.project.name == 'app') { if (task.name == 'mergeReleaseResources') { cleanGoogleServicesResources('release') } else if (task.name == 'mergeDebugResources') { @@ -178,13 +169,7 @@ gradle.taskGraph.afterTask { Task task -> private void cleanGoogleServicesResources(buildType) { ant.delete(includeEmptyDirs: 'true') { - fileset(dir: file('./build/intermediates/res/merged/' + buildType), includes: '**/common_signin*') - } - ant.delete(includeEmptyDirs: 'true') { - fileset(dir: file('./build/intermediates/res/merged/' + buildType), includes: '**/ic_plusone*') - } - ant.delete(includeEmptyDirs: 'true') { - fileset(dir: file('./build/intermediates/res/merged/' + buildType), includes: '**/powered_by_google*') + fileset(dir: file('./build/intermediates/res/merged/' + buildType), includes: '**/common_*') } } diff --git a/app/proguard-debug.cfg b/app/proguard-debug.cfg index 29b24703..f1ad0f9c 100644 --- a/app/proguard-debug.cfg +++ b/app/proguard-debug.cfg @@ -65,6 +65,7 @@ -dontwarn com.actionbarsherlock.BuildConfig -dontwarn com.google.android.gms.internal.** -dontwarn com.google.android.gms.common.internal.** +-dontwarn com.google.android.gms.common.GooglePlayServicesUtil -keep class com.squareup.leakcanary.** { *; } -dontwarn com.squareup.leakcanary.** diff --git a/app/proguard.cfg b/app/proguard.cfg index dc2ca4e3..ac517745 100644 --- a/app/proguard.cfg +++ b/app/proguard.cfg @@ -66,6 +66,7 @@ -dontwarn com.actionbarsherlock.BuildConfig -dontwarn com.google.android.gms.internal.** -dontwarn com.google.android.gms.common.internal.** +-dontwarn com.google.android.gms.common.GooglePlayServicesUtil -keep class com.squareup.leakcanary.** { *; } -dontwarn com.squareup.leakcanary.** @@ -95,7 +96,7 @@ ## ASSERTIONS -assumenosideeffects class org.solovyev.android.Check { - *; + public static *; } ## ACRA diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index be302e2e..16385277 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -139,15 +139,6 @@ android:label="@string/cpp_purchase_title" android:theme="@style/Cpp.Theme.Translucent" /> - - - - - - - = size; + } + + public static void restartActivity(@Nonnull Activity activity) { + final Intent intent = activity.getIntent(); + activity.finish(); + activity.startActivity(intent); + } + + /** + * Method runs through view and all it's children recursively and process them via viewProcessor + * + * @param view parent view to be processed, if view is ViewGroup then all it's children will be processed + * @param viewProcessor object which processes views + */ + public static void processViews(@Nonnull View view, @Nonnull ViewProcessor viewProcessor) { + processViewsOfType0(view, null, viewProcessor); + } + + static void processViewsOfType0(@Nonnull View view, @Nullable Class viewClass, @Nonnull ViewProcessor viewProcessor) { + if (view instanceof ViewGroup) { + final ViewGroup viewGroup = (ViewGroup) view; + + if (viewClass == null || viewClass.isAssignableFrom(ViewGroup.class)) { + //noinspection unchecked + viewProcessor.process((T) viewGroup); + } + + for (int index = 0; index < viewGroup.getChildCount(); index++) { + processViewsOfType0(viewGroup.getChildAt(index), viewClass, viewProcessor); + } + } else if (viewClass == null || viewClass.isAssignableFrom(view.getClass())) { + //noinspection unchecked + viewProcessor.process((T) view); + } + } + + public static void processViewsOfType(@Nonnull View view, @Nonnull Class viewClass, @Nonnull ViewProcessor viewProcessor) { + processViewsOfType0(view, viewClass, viewProcessor); + } + + public interface ViewProcessor { + void process(@Nonnull V view); + } + + @SuppressWarnings("deprecation") + public static int getScreenOrientation(@Nonnull Activity activity) { + final android.view.Display display = activity.getWindowManager().getDefaultDisplay(); + if (display.getWidth() <= display.getHeight()) { + return Configuration.ORIENTATION_PORTRAIT; + } else { + return Configuration.ORIENTATION_LANDSCAPE; + } + } + + public static void addIntentFlags(@Nonnull Intent intent, boolean detached, @Nonnull Context context) { + int flags = 0; + if (!(context instanceof Activity)) { + flags = flags | Intent.FLAG_ACTIVITY_NEW_TASK; + } + if (detached) { + flags = flags | Intent.FLAG_ACTIVITY_NO_HISTORY; + } + intent.setFlags(flags); + } + + public static void enableComponent(@Nonnull Context context, + @Nonnull Class componentClass, + boolean enable) { + final PackageManager pm = context.getPackageManager(); + + final int componentState; + if (enable) { + componentState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; + } else { + componentState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED; + } + + pm.setComponentEnabledSetting(new ComponentName(context, componentClass), componentState, PackageManager.DONT_KILL_APP); + } + + public static boolean isComponentEnabled(@Nonnull Context context, + @Nonnull Class componentClass) { + final PackageManager pm = context.getPackageManager(); + + int componentEnabledSetting = pm.getComponentEnabledSetting(new ComponentName(context, componentClass)); + return componentEnabledSetting == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || componentEnabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + } + + public static int toPixels(@Nonnull DisplayMetrics dm, float dps) { + final float scale = dm.density; + return (int) (dps * scale + 0.5f); + } } \ No newline at end of file diff --git a/app/src/main/java/org/solovyev/android/calculator/AppModule.java b/app/src/main/java/org/solovyev/android/calculator/AppModule.java index 811111a7..d157cdfb 100644 --- a/app/src/main/java/org/solovyev/android/calculator/AppModule.java +++ b/app/src/main/java/org/solovyev/android/calculator/AppModule.java @@ -9,22 +9,20 @@ import android.os.Looper; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.util.Log; - import com.squareup.otto.Bus; import com.squareup.otto.GeneratedHandlerFinder; - -import org.solovyev.android.UiThreadExecutor; +import dagger.Module; +import dagger.Provides; +import jscl.JsclMathEngine; import org.solovyev.android.calculator.language.Languages; -import org.solovyev.android.checkout.Billing; -import org.solovyev.android.checkout.Checkout; -import org.solovyev.android.checkout.Inventory; -import org.solovyev.android.checkout.ProductTypes; -import org.solovyev.android.checkout.Products; -import org.solovyev.android.checkout.RobotmediaDatabase; -import org.solovyev.android.checkout.RobotmediaInventory; +import org.solovyev.android.checkout.*; import org.solovyev.android.plotter.Plot; import org.solovyev.android.plotter.Plotter; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.inject.Named; +import javax.inject.Singleton; import java.io.File; import java.util.Collections; import java.util.concurrent.Executor; @@ -32,15 +30,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.inject.Named; -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import jscl.JsclMathEngine; - @Module public class AppModule { @@ -151,8 +140,17 @@ public class AppModule { @Provides @Singleton @Named(THREAD_UI) - Executor provideUiThread() { - return new UiThreadExecutor(); + Executor provideUiThread(@NonNull final Handler handler) { + return new Executor() { + @Override + public void execute(@NonNull Runnable command) { + if (App.isUiThread()) { + command.run(); + } else { + handler.post(command); + } + } + }; } @Provides diff --git a/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java b/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java index 3a40aaed..d0c1f205 100644 --- a/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java +++ b/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java @@ -18,10 +18,9 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; - -import org.solovyev.android.Activities; +import butterknife.Bind; +import butterknife.ButterKnife; import org.solovyev.android.Check; -import org.solovyev.android.Views; import org.solovyev.android.calculator.history.History; import org.solovyev.android.calculator.language.Language; import org.solovyev.android.calculator.language.Languages; @@ -31,9 +30,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Inject; -import butterknife.Bind; -import butterknife.ButterKnife; - import static org.solovyev.android.calculator.App.cast; public class BaseActivity extends AppCompatActivity { @@ -101,7 +97,7 @@ public class BaseActivity extends AppCompatActivity { public boolean restartIfLayoutChanged() { final Preferences.Gui.Layout newLayout = Preferences.Gui.layout.getPreference(preferences); if (newLayout != layout) { - Activities.restartActivity(this); + App.restartActivity(this); return true; } return false; @@ -112,7 +108,7 @@ public class BaseActivity extends AppCompatActivity { final int themeId = theme.getThemeFor(this); final int newThemeId = newTheme.getThemeFor(this); if (themeId != newThemeId) { - Activities.restartActivity(this); + App.restartActivity(this); return true; } return false; @@ -121,7 +117,7 @@ public class BaseActivity extends AppCompatActivity { public boolean restartIfLanguageChanged() { final Language current = languages.getCurrent(); if (!current.equals(language)) { - Activities.restartActivity(this); + App.restartActivity(this); return true; } return false; @@ -255,11 +251,13 @@ public class BaseActivity extends AppCompatActivity { protected void fixFonts(@Nonnull View root) { // some devices ship own fonts which causes issues with rendering. Let's use our own font for all text views - Views.processViewsOfType(root, TextView.class, new Views.ViewProcessor() { + App.processViewsOfType(root, TextView.class, new App.ViewProcessor() { @Override public void process(@Nonnull TextView view) { setFont(view, typeface); } }); } + + } diff --git a/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java b/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java index e152624f..50ebc520 100644 --- a/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java +++ b/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java @@ -28,27 +28,22 @@ import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.util.Log; import android.util.TimingLogger; - import com.squareup.otto.Bus; - +import jscl.MathEngine; import org.acra.ACRA; import org.acra.ACRAConfiguration; import org.acra.sender.HttpSender; -import org.solovyev.android.Android; import org.solovyev.android.calculator.floating.FloatingCalculatorActivity; import org.solovyev.android.calculator.history.History; import org.solovyev.android.calculator.language.Language; import org.solovyev.android.calculator.language.Languages; import org.solovyev.common.msg.MessageType; -import java.util.Locale; -import java.util.concurrent.Executor; - import javax.annotation.Nonnull; import javax.inject.Inject; import javax.inject.Named; - -import jscl.MathEngine; +import java.util.Locale; +import java.util.concurrent.Executor; public class CalculatorApplication extends android.app.Application implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -192,7 +187,7 @@ public class CalculatorApplication extends android.app.Application implements Sh public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (Preferences.Onscreen.showAppIcon.getKey().equals(key)) { boolean showAppIcon = Preferences.Onscreen.showAppIcon.getPreference(prefs); - Android.enableComponent(this, FloatingCalculatorActivity.class, showAppIcon); + App.enableComponent(this, FloatingCalculatorActivity.class, showAppIcon); notifier.showMessage(R.string.cpp_this_change_may_require_reboot, MessageType.info); } } diff --git a/app/src/main/java/org/solovyev/android/calculator/FragmentTab.java b/app/src/main/java/org/solovyev/android/calculator/FragmentTab.java index e712d37b..d7bc887e 100644 --- a/app/src/main/java/org/solovyev/android/calculator/FragmentTab.java +++ b/app/src/main/java/org/solovyev/android/calculator/FragmentTab.java @@ -29,7 +29,6 @@ import org.solovyev.android.calculator.about.ReleaseNotesFragment; import org.solovyev.android.calculator.functions.FunctionsFragment; import org.solovyev.android.calculator.history.RecentHistoryFragment; import org.solovyev.android.calculator.history.SavedHistoryFragment; -import org.solovyev.android.calculator.matrix.EditMatrixFragment; import org.solovyev.android.calculator.operators.OperatorsFragment; import org.solovyev.android.calculator.variables.VariablesFragment; @@ -43,9 +42,6 @@ public enum FragmentTab { functions(FunctionsFragment.class, R.string.c_functions), operators(OperatorsFragment.class, R.string.c_operators), about(AboutFragment.class, R.string.cpp_about), - - // todo serso: strings - matrix_edit(EditMatrixFragment.class, R.string.c_release_notes), release_notes(ReleaseNotesFragment.class, R.string.c_release_notes); @Nonnull diff --git a/app/src/main/java/org/solovyev/android/calculator/Notifier.java b/app/src/main/java/org/solovyev/android/calculator/Notifier.java index 5f7f7802..0fc4d6d2 100644 --- a/app/src/main/java/org/solovyev/android/calculator/Notifier.java +++ b/app/src/main/java/org/solovyev/android/calculator/Notifier.java @@ -26,7 +26,6 @@ import android.app.Application; import android.os.Handler; import android.support.annotation.StringRes; import android.widget.Toast; -import org.solovyev.android.Threads; import org.solovyev.common.msg.Message; import javax.annotation.Nonnull; @@ -57,7 +56,7 @@ public class Notifier { } public void showMessage(@Nonnull final String message) { - if (Threads.isUiThread()) { + if (App.isUiThread()) { Toast.makeText(application, message, Toast.LENGTH_SHORT).show(); return; } diff --git a/app/src/main/java/org/solovyev/android/calculator/Preferences.java b/app/src/main/java/org/solovyev/android/calculator/Preferences.java index 2227c7b9..bd1f35c9 100644 --- a/app/src/main/java/org/solovyev/android/calculator/Preferences.java +++ b/app/src/main/java/org/solovyev/android/calculator/Preferences.java @@ -35,7 +35,8 @@ import android.support.annotation.NonNull; import android.support.annotation.StyleRes; import android.support.v7.view.ContextThemeWrapper; import android.util.SparseArray; - +import jscl.AngleUnit; +import jscl.NumeralBase; import org.solovyev.android.Check; import org.solovyev.android.calculator.about.AboutActivity; import org.solovyev.android.calculator.functions.FunctionsActivity; @@ -46,26 +47,15 @@ import org.solovyev.android.calculator.operators.OperatorsActivity; import org.solovyev.android.calculator.preferences.PreferencesActivity; import org.solovyev.android.calculator.variables.VariablesActivity; import org.solovyev.android.calculator.wizard.WizardActivity; -import org.solovyev.android.prefs.BooleanPreference; -import org.solovyev.android.prefs.IntegerPreference; -import org.solovyev.android.prefs.NumberToStringPreference; -import org.solovyev.android.prefs.Preference; -import org.solovyev.android.prefs.StringPreference; +import org.solovyev.android.prefs.*; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.text.DecimalFormatSymbols; import java.util.EnumMap; import java.util.Locale; import java.util.Map; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import jscl.AngleUnit; -import jscl.NumeralBase; - -import static org.solovyev.android.Android.isPhoneModel; -import static org.solovyev.android.DeviceModel.samsung_galaxy_s; -import static org.solovyev.android.DeviceModel.samsung_galaxy_s_2; import static org.solovyev.android.prefs.IntegerPreference.DEF_VALUE; public final class Preferences { @@ -143,13 +133,6 @@ public final class Preferences { Engine.Preferences.angleUnit.tryPutDefault(preferences, editor); Engine.Preferences.numeralBase.tryPutDefault(preferences, editor); - if (!Engine.Preferences.multiplicationSign.isSet(preferences)) { - if (isPhoneModel(samsung_galaxy_s) || isPhoneModel(samsung_galaxy_s_2)) { - // workaround ofr samsung galaxy s phones - Engine.Preferences.multiplicationSign.putPreference(editor, "*"); - } - } - Gui.theme.tryPutDefault(preferences, editor); Gui.layout.tryPutDefault(preferences, editor); Gui.showReleaseNotes.tryPutDefault(preferences, editor); diff --git a/app/src/main/java/org/solovyev/android/calculator/PreferredPreferences.java b/app/src/main/java/org/solovyev/android/calculator/PreferredPreferences.java index 76e362ca..c9fbfed5 100644 --- a/app/src/main/java/org/solovyev/android/calculator/PreferredPreferences.java +++ b/app/src/main/java/org/solovyev/android/calculator/PreferredPreferences.java @@ -25,22 +25,18 @@ package org.solovyev.android.calculator; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; - +import jscl.AngleUnit; +import jscl.NumeralBase; import org.solovyev.android.calculator.errors.FixableError; import org.solovyev.android.calculator.errors.FixableErrorType; import org.solovyev.android.calculator.errors.FixableErrorsActivity; -import org.solovyev.android.msg.AndroidMessage; import org.solovyev.common.msg.MessageType; -import jscl.AngleUnit; -import jscl.NumeralBase; - -import java.util.ArrayList; -import java.util.concurrent.TimeUnit; - import javax.annotation.Nonnull; import javax.inject.Inject; import javax.inject.Singleton; +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; @Singleton public class PreferredPreferences { @@ -103,9 +99,7 @@ public class PreferredPreferences { public void setAngleUnits(@Nonnull AngleUnit angleUnit) { Engine.Preferences.angleUnit.putPreference(preferences, angleUnit); - notifier.showMessage( - new AndroidMessage(R.string.c_angle_units_changed_to, MessageType.info, application, - angleUnit.name())); + notifier.showMessage(R.string.c_angle_units_changed_to, angleUnit.name()); } public void setPreferredNumeralBase() { @@ -114,9 +108,7 @@ public class PreferredPreferences { public void setNumeralBase(@Nonnull NumeralBase numeralBase) { Engine.Preferences.numeralBase.putPreference(preferences, numeralBase); - notifier.showMessage( - new AndroidMessage(R.string.c_numeral_base_changed_to, MessageType.info, - application, numeralBase.name())); + notifier.showMessage(R.string.c_numeral_base_changed_to, numeralBase.name()); } public boolean isShowWarningDialog() { diff --git a/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java b/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java index d70197c8..6c12e545 100644 --- a/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java +++ b/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java @@ -9,8 +9,6 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; - -import org.solovyev.android.Android; import org.solovyev.android.calculator.wizard.CalculatorWizards; import org.solovyev.android.wizard.Wizard; import org.solovyev.android.wizard.Wizards; @@ -20,9 +18,7 @@ import javax.inject.Named; import javax.inject.Singleton; import static org.solovyev.android.calculator.release.ReleaseNotes.hasReleaseNotes; -import static org.solovyev.android.wizard.WizardUi.continueWizard; -import static org.solovyev.android.wizard.WizardUi.createLaunchIntent; -import static org.solovyev.android.wizard.WizardUi.startWizard; +import static org.solovyev.android.wizard.WizardUi.*; @Singleton public class StartupHelper { @@ -45,12 +41,12 @@ public class StartupHelper { if (!App.isMonkeyRunner(activity)) { handleOnMainActivityOpened(activity, editor, opened == null ? 0 : opened); } - UiPreferences.appVersion.putPreference(editor, Android.getAppVersionCode(activity)); + UiPreferences.appVersion.putPreference(editor, App.getAppVersionCode(activity)); editor.apply(); } private void handleOnMainActivityOpened(@NonNull final AppCompatActivity activity, @NonNull SharedPreferences.Editor editor, int opened) { - final int currentVersion = Android.getAppVersionCode(activity); + final int currentVersion = App.getAppVersionCode(activity); final Wizards wizards = App.getWizards(); final Wizard wizard = wizards.getWizard(CalculatorWizards.FIRST_TIME_WIZARD); if (wizard.isStarted() && !wizard.isFinished()) { diff --git a/app/src/main/java/org/solovyev/android/calculator/errors/FixableErrorsActivity.java b/app/src/main/java/org/solovyev/android/calculator/errors/FixableErrorsActivity.java index f99a0de9..ea5cd7cb 100644 --- a/app/src/main/java/org/solovyev/android/calculator/errors/FixableErrorsActivity.java +++ b/app/src/main/java/org/solovyev/android/calculator/errors/FixableErrorsActivity.java @@ -22,24 +22,22 @@ package org.solovyev.android.calculator.errors; -import static org.solovyev.android.calculator.App.cast; - import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; - -import org.solovyev.android.Activities; +import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.PreferredPreferences; import org.solovyev.common.msg.Message; +import javax.annotation.Nonnull; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nonnull; -import javax.inject.Inject; +import static org.solovyev.android.calculator.App.cast; public class FixableErrorsActivity extends AppCompatActivity { @@ -62,7 +60,7 @@ public class FixableErrorsActivity extends AppCompatActivity { public static void show(@Nonnull Context context, @Nonnull ArrayList errors) { final Intent intent = new Intent(context, FixableErrorsActivity.class); intent.putExtra(EXTRA_ERRORS, errors); - Activities.addIntentFlags(intent, false, context); + App.addIntentFlags(intent, false, context); context.startActivity(intent); } diff --git a/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java b/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java index 0f3d7280..d19bd611 100644 --- a/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java +++ b/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java @@ -37,7 +37,6 @@ import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import org.solovyev.android.Check; -import org.solovyev.android.Views; import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.Display; import org.solovyev.android.calculator.Editor; @@ -99,7 +98,7 @@ public class FloatingCalculatorService extends Service implements FloatingViewLi //noinspection deprecation final int maxWidth = 2 * Math.min(dd.getWidth(), dd.getHeight()) / 3; - final int desiredWidth = Views.toPixels(dm, 300); + final int desiredWidth = App.toPixels(dm, 300); final int width = Math.min(maxWidth, desiredWidth); final int height = getHeight(width); diff --git a/app/src/main/java/org/solovyev/android/calculator/functions/EditFunctionFragment.java b/app/src/main/java/org/solovyev/android/calculator/functions/EditFunctionFragment.java index f6f82b07..173c7b51 100644 --- a/app/src/main/java/org/solovyev/android/calculator/functions/EditFunctionFragment.java +++ b/app/src/main/java/org/solovyev/android/calculator/functions/EditFunctionFragment.java @@ -9,7 +9,6 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import jscl.math.function.Function; -import org.solovyev.android.Activities; import org.solovyev.android.Check; import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.Engine; @@ -32,7 +31,7 @@ public class EditFunctionFragment extends BaseFunctionFragment { public static void show(@Nullable CppFunction function, @Nonnull Context context) { if (!(context instanceof FunctionsActivity)) { final Intent intent = new Intent(context, FunctionsActivity.getClass(context)); - Activities.addIntentFlags(intent, false, context); + App.addIntentFlags(intent, false, context); intent.putExtra(FunctionsActivity.EXTRA_FUNCTION, function); context.startActivity(intent); } else { diff --git a/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java b/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java index d85f3136..f8ea7496 100644 --- a/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java +++ b/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java @@ -12,16 +12,7 @@ import android.util.TypedValue; import android.view.View; import android.widget.ImageView; import android.widget.TextView; - -import org.solovyev.android.Views; -import org.solovyev.android.calculator.ActivityLauncher; -import org.solovyev.android.calculator.App; -import org.solovyev.android.calculator.BaseActivity; -import org.solovyev.android.calculator.Calculator; -import org.solovyev.android.calculator.Editor; -import org.solovyev.android.calculator.Keyboard; -import org.solovyev.android.calculator.Preferences; -import org.solovyev.android.calculator.PreferredPreferences; +import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.buttons.CppSpecialButton; import org.solovyev.android.calculator.view.ScreenMetrics; import org.solovyev.android.views.Adjuster; @@ -30,15 +21,12 @@ import org.solovyev.android.views.dragbutton.DragButton; import org.solovyev.android.views.dragbutton.DragDirection; import org.solovyev.android.views.dragbutton.SimpleDragListener; +import javax.annotation.Nonnull; +import javax.inject.Inject; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nonnull; -import javax.inject.Inject; - -import static android.view.HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING; -import static android.view.HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING; -import static android.view.HapticFeedbackConstants.KEYBOARD_TAP; +import static android.view.HapticFeedbackConstants.*; import static org.solovyev.android.calculator.App.cast; import static org.solovyev.android.calculator.App.getScreenMetrics; import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple; @@ -93,7 +81,7 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer cast(activity.getApplication()).getComponent().inject(this); preferences.registerOnSharedPreferenceChangeListener(this); - orientation = Views.getScreenOrientation(activity); + orientation = App.getScreenOrientation(activity); layout = Preferences.Gui.layout.getPreferenceNoError(preferences); textSize = calculateTextSize(); } diff --git a/app/src/main/java/org/solovyev/android/calculator/matrix/CalculatorMatrixActivity.java b/app/src/main/java/org/solovyev/android/calculator/matrix/CalculatorMatrixActivity.java deleted file mode 100644 index 60447160..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/matrix/CalculatorMatrixActivity.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.matrix; - -import org.solovyev.android.calculator.BaseActivity; -import org.solovyev.android.calculator.FragmentTab; -import org.solovyev.android.calculator.R; -import org.solovyev.android.calculator.view.Tabs; - -import javax.annotation.Nonnull; - -public class CalculatorMatrixActivity extends BaseActivity { - - public CalculatorMatrixActivity() { - super(R.string.c_plot_graph); - // FIXME: 2016-03-01 string - } - - @Override - protected void populateTabs(@Nonnull Tabs tabs) { - super.populateTabs(tabs); - tabs.addTab(FragmentTab.matrix_edit); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/matrix/EditMatrixFragment.java b/app/src/main/java/org/solovyev/android/calculator/matrix/EditMatrixFragment.java deleted file mode 100644 index 9cc8386b..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/matrix/EditMatrixFragment.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.matrix; - -import android.os.Bundle; -import android.view.View; -import org.solovyev.android.calculator.BaseFragment; -import org.solovyev.android.calculator.R; -import org.solovyev.android.view.IntegerRange; -import org.solovyev.android.view.Picker; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class EditMatrixFragment extends BaseFragment implements Picker.OnChangedListener { - private static final int MAX_COUNT = 10; - private static final int MIN_COUNT = 2; - private static final int DEFAULT_ROWS = 2; - private static final int DEFAULT_COLS = 2; - - private static final String MATRIX = "matrix"; - - public EditMatrixFragment() { - super(R.layout.matrix_edit_fragment); - setRetainInstance(true); - } - - @Override - public void onViewCreated(View root, @Nullable Bundle in) { - super.onViewCreated(root, in); - - final Picker matrixRowsCountPicker = (Picker) root.findViewById(R.id.matrix_rows_count_picker); - initPicker(matrixRowsCountPicker); - final Picker matrixColsCountPicker = (Picker) root.findViewById(R.id.matrix_cols_count_picker); - initPicker(matrixColsCountPicker); - - MatrixUi matrix = null; - if (in != null) { - final Object matrixObject = in.getSerializable(MATRIX); - if (matrixObject instanceof MatrixUi) { - matrix = (MatrixUi) matrixObject; - } - } - - final MatrixView matrixView = getMatrixView(root); - if (matrix == null) { - matrixView.setMatrixDimensions(DEFAULT_ROWS, DEFAULT_COLS); - } else { - matrixView.setMatrix(matrix.getBakingArray()); - } - matrixRowsCountPicker.setCurrent(matrixView.getRows()); - matrixColsCountPicker.setCurrent(matrixView.getCols()); - } - - @Override - public void onSaveInstanceState(@Nonnull Bundle out) { - super.onSaveInstanceState(out); - - out.putSerializable(MATRIX, new MatrixUi(getMatrixView(getView()).toMatrix())); - } - - @Nonnull - private MatrixView getMatrixView(@Nonnull View root) { - return (MatrixView) root.findViewById(R.id.matrix_layout); - } - - private void initPicker(@Nonnull Picker picker) { - picker.setRange(new IntegerRange(MIN_COUNT, MAX_COUNT, 1, 0, null)); - picker.setOnChangeListener(this); - } - - @Override - public void onChanged(@Nonnull Picker picker, @Nonnull Integer value) { - switch (picker.getId()) { - case R.id.matrix_rows_count_picker: - onRowsCountChange(value); - break; - case R.id.matrix_cols_count_picker: - onColsCountChange(value); - break; - } - } - - private void onColsCountChange(@Nonnull Integer newCols) { - getMatrixView(getView()).setMatrixCols(newCols); - } - - private void onRowsCountChange(@Nonnull Integer newRows) { - getMatrixView(getView()).setMatrixRows(newRows); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/AbstractGraphCalculator.java b/app/src/main/java/org/solovyev/android/calculator/plot/AbstractGraphCalculator.java deleted file mode 100644 index a003d10c..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/AbstractGraphCalculator.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/18/13 - * Time: 9:03 PM - */ -public abstract class AbstractGraphCalculator implements GraphCalculator { - - @Nonnull - protected final GraphData next = GraphData.newEmptyInstance(); - - @Nonnull - private final GraphData endGraph = GraphData.newEmptyInstance(); - - @Nonnull - private final GraphData startGraph = GraphData.newEmptyInstance(); - - @Override - public final void computeGraph(@Nonnull XyFunction f, - float xMin, - float xMax, - @Nonnull GraphData graph, - @Nonnull GraphsData graphsData, - @Nonnull Graph2dDimensions dimensions) { - if (f.getArity() == 0) { - final float v = (float) f.eval(); - graph.clear(); - graph.push(xMin, v); - graph.push(xMax, v); - return; - } - - float yMin = graphsData.getLastYMin(); - float yMax = graphsData.getLastYMax(); - - // prepare graph - if (!graph.empty()) { - if (xMin >= graphsData.getLastXMin()) { - // |------[---erased---|------data----|---erased--]------ old data - // |-------------------[------data----]------------------ new data - // xMin xMax - // - // OR - // - // |------[---erased---|------data----]----------- old data - // |-------------------[------data----<---->]----- new data - // xMin xMax - graph.eraseBefore(xMin); - if (xMax <= graphsData.getLastXMax()) { - graph.eraseAfter(xMax); - // nothing to compute - } else { - xMin = graph.getLastX(); - compute(f, xMin, xMax, yMin, yMax, endGraph, dimensions); - } - } else { - // |--------------------[-----data----|---erased----]-- old data - // |------[<------------>-----data----]---------------- new data - // xMin xMax - // - // OR - // - // |--------------------[------data--]----|----------- old data - // |-------[<----------->------data--<--->]-----------new data - // xMin xMax - - if (xMax <= graphsData.getLastXMax()) { - graph.eraseAfter(xMax); - xMax = graph.getFirstX(); - compute(f, xMin, xMax, yMin, yMax, startGraph, dimensions); - } else { - compute(f, xMin, graph.getFirstX(), yMin, yMax, startGraph, dimensions); - compute(f, graph.getLastX(), xMax, yMin, yMax, endGraph, dimensions); - } - } - } else { - compute(f, xMin, xMax, yMin, yMax, graph, dimensions); - } - - if (!endGraph.empty()) { - // first add ending because it's fast - graph.append(endGraph); - } - - if (!startGraph.empty()) { - startGraph.append(graph); - graph.swap(startGraph); - } - - - next.clear(); - endGraph.clear(); - startGraph.clear(); - } - - protected abstract void compute(@Nonnull XyFunction f, - float xMin, - float xMax, - float yMin, - float yMax, - @Nonnull GraphData graph, - @Nonnull Graph2dDimensions dimensions); -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/AndroidCalculatorPlotter.java b/app/src/main/java/org/solovyev/android/calculator/plot/AndroidCalculatorPlotter.java deleted file mode 100644 index 03eec578..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/AndroidCalculatorPlotter.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -import org.solovyev.android.calculator.Preferences; - -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import jscl.math.Generic; - -/** - * User: serso - * Date: 1/12/13 - * Time: 11:03 PM - */ -public class AndroidCalculatorPlotter implements CalculatorPlotter, SharedPreferences.OnSharedPreferenceChangeListener { - - @Nonnull - private final CalculatorPlotter plotter; - - public AndroidCalculatorPlotter(@Nonnull Context context, - @Nonnull CalculatorPlotter plotter) { - this.plotter = plotter; - - final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); - preferences.registerOnSharedPreferenceChangeListener(this); - - onSharedPreferenceChanged(preferences, Preferences.Graph.plotImag.getKey()); - } - - @Override - @Nonnull - public PlotData getPlotData() { - return plotter.getPlotData(); - } - - @Override - public boolean addFunction(@Nonnull Generic expression) { - return plotter.addFunction(expression); - } - - @Override - public boolean addFunction(@Nonnull PlotFunction plotFunction) { - return plotter.addFunction(plotFunction); - } - - @Override - public boolean addFunction(@Nonnull XyFunction xyFunction) { - return plotter.addFunction(xyFunction); - } - - @Override - public boolean addFunction(@Nonnull XyFunction xyFunction, @Nonnull PlotLineDef functionLineDef) { - return plotter.addFunction(xyFunction, functionLineDef); - } - - @Override - public boolean updateFunction(@Nonnull PlotFunction newFunction) { - return plotter.updateFunction(newFunction); - } - - @Override - public boolean updateFunction(@Nonnull XyFunction xyFunction, @Nonnull PlotLineDef functionLineDef) { - return plotter.updateFunction(xyFunction, functionLineDef); - } - - @Override - public boolean removeFunction(@Nonnull PlotFunction plotFunction) { - return plotter.removeFunction(plotFunction); - } - - @Override - public boolean removeFunction(@Nonnull XyFunction xyFunction) { - return plotter.removeFunction(xyFunction); - } - - @Nonnull - @Override - public PlotFunction pin(@Nonnull PlotFunction plotFunction) { - return plotter.pin(plotFunction); - } - - @Nonnull - @Override - public PlotFunction unpin(@Nonnull PlotFunction plotFunction) { - return plotter.unpin(plotFunction); - } - - @Nonnull - @Override - public PlotFunction show(@Nonnull PlotFunction plotFunction) { - return plotter.show(plotFunction); - } - - @Nonnull - @Override - public PlotFunction hide(@Nonnull PlotFunction plotFunction) { - return plotter.hide(plotFunction); - } - - @Override - public void clearAllFunctions() { - plotter.clearAllFunctions(); - } - - @Nullable - @Override - public PlotFunction getFunctionById(@Nonnull String functionId) { - return plotter.getFunctionById(functionId); - } - - @Override - @Nonnull - public List getFunctions() { - return plotter.getFunctions(); - } - - @Override - @Nonnull - public List getVisibleFunctions() { - return plotter.getVisibleFunctions(); - } - - @Override - public void plot() { - plotter.plot(); - } - - @Override - public void plot(@Nonnull Generic expression) { - plotter.plot(expression); - } - - @Override - public boolean is2dPlotPossible() { - return plotter.is2dPlotPossible(); - } - - @Override - public boolean isPlotPossibleFor(@Nonnull Generic expression) { - return plotter.isPlotPossibleFor(expression); - } - - @Override - public void setPlot3d(boolean plot3d) { - plotter.setPlot3d(plot3d); - } - - @Override - public void removeAllUnpinned() { - plotter.removeAllUnpinned(); - } - - @Override - public void setPlotImag(boolean plotImag) { - plotter.setPlotImag(plotImag); - } - - @Override - public void savePlotBoundaries(@Nonnull PlotBoundaries plotBoundaries) { - plotter.savePlotBoundaries(plotBoundaries); - } - - @Override - public void setPlotBoundaries(@Nonnull PlotBoundaries plotBoundaries) { - plotter.setPlotBoundaries(plotBoundaries); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { - if (Preferences.Graph.plotImag.getKey().equals(key)) { - setPlotImag(Preferences.Graph.plotImag.getPreference(preferences)); - } - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/AndroidPlotLineStyle.java b/app/src/main/java/org/solovyev/android/calculator/plot/AndroidPlotLineStyle.java deleted file mode 100644 index 5a537ff8..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/AndroidPlotLineStyle.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.graphics.DashPathEffect; -import android.graphics.Paint; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * User: serso - * Date: 1/5/13 - * Time: 7:37 PM - */ -public enum AndroidPlotLineStyle { - - solid(PlotLineStyle.solid) { - @Override - public void applyToPaint(@Nonnull Paint paint) { - paint.setPathEffect(null); - } - }, - - dashed(PlotLineStyle.dashed) { - @Override - public void applyToPaint(@Nonnull Paint paint) { - paint.setPathEffect(new DashPathEffect(new float[]{10, 20}, 0)); - } - }, - - dotted(PlotLineStyle.dotted) { - @Override - public void applyToPaint(@Nonnull Paint paint) { - paint.setPathEffect(new DashPathEffect(new float[]{5, 1}, 0)); - } - }, - - dash_dotted(PlotLineStyle.dash_dotted) { - @Override - public void applyToPaint(@Nonnull Paint paint) { - paint.setPathEffect(new DashPathEffect(new float[]{10, 20, 5, 1}, 0)); - } - }; - - @Nonnull - private final PlotLineStyle plotLineStyle; - - AndroidPlotLineStyle(@Nonnull PlotLineStyle plotLineStyle) { - this.plotLineStyle = plotLineStyle; - } - - @Nullable - public static AndroidPlotLineStyle valueOf(@Nonnull PlotLineStyle plotLineStyle) { - for (AndroidPlotLineStyle androidPlotLineStyle : values()) { - if (androidPlotLineStyle.plotLineStyle == plotLineStyle) { - return androidPlotLineStyle; - } - } - - return null; - } - - public abstract void applyToPaint(@Nonnull Paint paint); - -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/CalculatorGraph3dView.java b/app/src/main/java/org/solovyev/android/calculator/plot/CalculatorGraph3dView.java deleted file mode 100755 index 189338bf..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/CalculatorGraph3dView.java +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.content.Context; -import android.graphics.Color; -import android.opengl.Matrix; -import android.os.Build; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.ZoomButtonsController; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.microedition.khronos.opengles.GL10; -import javax.microedition.khronos.opengles.GL11; - -public class CalculatorGraph3dView extends GLView implements GraphView { - - /* - ********************************************************************** - * - * CONSTANTS - * - ********************************************************************** - */ - - /* - ********************************************************************** - * - * FIELDS - * - ********************************************************************** - */ - - private static final float DISTANCE = 15f; - private boolean useHighQuality3d = Build.VERSION.SDK_INT >= 5; - private float lastTouchX, lastTouchY; - private TouchHandler touchHandler; - private ZoomButtonsController zoomController = new ZoomButtonsController(this); - private float zoomLevel = 1; - private float zoomTarget; - private float zoomStep = 0; - private float currentZoom; - @Nonnull - private List graphs = new ArrayList(); - @Nonnull - private GraphViewHelper graphViewHelper = GraphViewHelper.newDefaultInstance(); - - /* - ********************************************************************** - * - * CONSTRUCTORS - * - ********************************************************************** - */ - @Nonnull - private Graph2dDimensions dimensions = new Graph2dDimensions(this); - private float[] matrix1 = new float[16], matrix2 = new float[16], matrix3 = new float[16]; - private float angleX, angleY; - - /* - ********************************************************************** - * - * METHODS - * - ********************************************************************** - */ - private boolean dirty; - - public CalculatorGraph3dView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public CalculatorGraph3dView(Context context) { - super(context); - touchHandler = new TouchHandler(this); - init(); - } - - // ---- - - private void init() { - startLooping(); - zoomController.setOnZoomListener(this); - - Matrix.setIdentityM(matrix1, 0); - Matrix.rotateM(matrix1, 0, -75, 1, 0, 0); - } - - protected void onSizeChanged(int w, int h, int ow, int oh) { - dimensions.setViewDimensions(w, h); - } - - @Override - protected void glDraw() { - - if (zoomStep < 0 && zoomLevel > zoomTarget) { - zoomLevel += zoomStep; - } else if (zoomStep > 0 && zoomLevel < zoomTarget) { - zoomLevel += zoomStep; - } else if (zoomStep != 0) { - zoomStep = 0; - zoomLevel = zoomTarget; - dirty = true; - if (!shouldRotate()) { - stopLooping(); - } - } - - super.glDraw(); - } - - @Override - public void onDetachedFromWindow() { - zoomController.setVisible(false); - super.onDetachedFromWindow(); - } - - void setRotation(float x, float y) { - angleX = x; - angleY = y; - } - - boolean shouldRotate() { - final float limit = .5f; - return angleX < -limit || angleX > limit || angleY < -limit || angleY > limit; - } - - @Override - public void init(@Nonnull PlotViewDef plotViewDef) { - this.graphViewHelper = GraphViewHelper.newInstance(plotViewDef, Collections.emptyList()); - } - - @Nonnull - @Override - public List getPlotFunctions() { - return this.graphViewHelper.getPlotFunctions(); - } - - @Override - public void setPlotFunctions(@Nonnull List plotFunctions) { - for (PlotFunction plotFunction : plotFunctions) { - final int arity = plotFunction.getXyFunction().getArity(); - if (arity != 0 && arity != 1 && arity != 2) { - throw new IllegalArgumentException("Function must have arity 0 or 1 or 2 for 3d plot!"); - } - } - - this.graphViewHelper = this.graphViewHelper.copy(plotFunctions); - zoomLevel = 1; - dirty = true; - } - - @Override - public void onDestroy() { - onPause(); - } - - @Override - public void setXRange(float xMin, float xMax) { - dimensions.setXRange(PlotBoundaries.DEFAULT_MIN_NUMBER, PlotBoundaries.DEFAULT_MAX_NUMBER); - dimensions.setXY(dimensions.getX0(), 0); - - zoomLevel = 1; - dirty = true; - } - - @Override - public void setYRange(float yMin, float yMax) { - } - - @Override - public float getXMin() { - return dimensions.getXMin(); - } - - @Override - public float getXMax() { - return dimensions.getXMax(); - } - - @Override - public float getYMin() { - return dimensions.getYMin(); - } - - @Override - public float getYMax() { - return dimensions.getYMax(); - } - - @Override - public void invalidateGraphs() { - //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public void setAdjustYAxis(boolean adjustYAxis) { - // not supported - } - - @Override - public void onSurfaceCreated(GL10 gl, int width, int height) { - gl.glDisable(GL10.GL_DITHER); - gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); - - final int backgroundColor = graphViewHelper.getPlotViewDef().getBackgroundColor(); - gl.glClearColor(Color.red(backgroundColor) / 255f, Color.green(backgroundColor) / 255f, Color.blue(backgroundColor) / 255f, Color.alpha(backgroundColor) / 255f); - - gl.glShadeModel(useHighQuality3d ? GL10.GL_SMOOTH : GL10.GL_FLAT); - gl.glDisable(GL10.GL_LIGHTING); - ensureGraphsSize((GL11) gl); - dirty = true; - angleX = .5f; - angleY = 0; - - gl.glViewport(0, 0, width, height); - initFrustum(gl, DISTANCE * zoomLevel); - currentZoom = zoomLevel; - } - - @Override - public void onDrawFrame(GL10 gl10) { - GL11 gl = (GL11) gl10; - if (currentZoom != zoomLevel) { - initFrustum(gl, DISTANCE * zoomLevel); - currentZoom = zoomLevel; - } - if (dirty) { - ensureGraphsSize(gl); - - final Graph2dDimensions dimensionsCopy = dimensions.copy(); - dimensionsCopy.setGraphDimensions(dimensions.getGWidth() * zoomLevel / 4, dimensions.getGHeight() * zoomLevel / 4); - - for (int i = 0; i < graphViewHelper.getPlotFunctions().size(); i++) { - graphs.get(i).update(gl, graphViewHelper.getPlotFunctions().get(i), dimensionsCopy); - - } - dirty = false; - } - - /*if (fps.incFrame()) { - Calculator.log("f/s " + fps.getValue()); - }*/ - - gl.glClear(GL10.GL_COLOR_BUFFER_BIT); - gl.glMatrixMode(GL10.GL_MODELVIEW); - gl.glLoadIdentity(); - - gl.glTranslatef(0, 0, -DISTANCE * zoomLevel); - - Matrix.setIdentityM(matrix2, 0); - float ax = Math.abs(angleX); - float ay = Math.abs(angleY); - if (ay * 3 < ax) { - Matrix.rotateM(matrix2, 0, angleX, 0, 1, 0); - } else if (ax * 3 < ay) { - Matrix.rotateM(matrix2, 0, angleY, 1, 0, 0); - } else { - if (ax > ay) { - Matrix.rotateM(matrix2, 0, angleX, 0, 1, 0); - Matrix.rotateM(matrix2, 0, angleY, 1, 0, 0); - } else { - Matrix.rotateM(matrix2, 0, angleY, 1, 0, 0); - Matrix.rotateM(matrix2, 0, angleX, 0, 1, 0); - } - } - Matrix.multiplyMM(matrix3, 0, matrix2, 0, matrix1, 0); - gl.glMultMatrixf(matrix3, 0); - System.arraycopy(matrix3, 0, matrix1, 0, 16); - for (Graph3d graph : graphs) { - graph.draw(gl); - } - - } - - private void ensureGraphsSize(@Nonnull GL11 gl) { - while (graphViewHelper.getPlotFunctions().size() > graphs.size()) { - graphs.add(new Graph3d(gl, useHighQuality3d)); - } - } - - private void initFrustum(GL10 gl, float distance) { - gl.glMatrixMode(GL10.GL_PROJECTION); - gl.glLoadIdentity(); - float near = distance * (1 / 3f); - float far = distance * 3f; - float dimen = near / 5f; - float h = dimen * height / width; - gl.glFrustumf(-dimen, dimen, -h, h, near, far); - gl.glMatrixMode(GL10.GL_MODELVIEW); - gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); - gl.glEnableClientState(GL10.GL_COLOR_ARRAY); - } - - private void printMatrix(float[] m, String name) { - StringBuilder b = new StringBuilder(); - for (int i = 0; i < 16; ++i) { - b.append(m[i]).append(' '); - } - //Calculator.log(name + ' ' + b.toString()); - } - - - /* - ********************************************************************** - * - * ZOOM - * - ********************************************************************** - */ - - public void onVisibilityChanged(boolean visible) { - } - - public void onZoom(boolean zoomIn) { - boolean changed = false; - if (zoomIn) { - if (canZoomIn(zoomLevel)) { - zoomTarget = zoomLevel * .625f; - zoomStep = -zoomLevel / 40; - changed = true; - } - } else { - if (canZoomOut(zoomLevel)) { - zoomTarget = zoomLevel * 1.6f; - zoomStep = zoomLevel / 20; - changed = true; - } - } - - if (changed) { - zoomController.setZoomInEnabled(canZoomIn(zoomTarget)); - zoomController.setZoomOutEnabled(canZoomOut(zoomTarget)); - if (!shouldRotate()) { - setRotation(0, 0); - } - startLooping(); - } - } - - private boolean canZoomIn(float zoom) { - return true; - } - - private boolean canZoomOut(float zoom) { - return true; - } - - /* - ********************************************************************** - * - * TOUCH - * - ********************************************************************** - */ - - public void onTouchDown(float x, float y) { - zoomController.setVisible(true); - stopLooping(); - lastTouchX = x; - lastTouchY = y; - } - - public void onTouchMove(float x, float y) { - float deltaX = x - lastTouchX; - float deltaY = y - lastTouchY; - if (deltaX > 1 || deltaX < -1 || deltaY > 1 || deltaY < -1) { - setRotation(deltaX, deltaY); - glDraw(); - lastTouchX = x; - lastTouchY = y; - } - } - - public void onTouchUp(float x, float y) { - float vx = touchHandler.getXVelocity(); - float vy = touchHandler.getYVelocity(); - // Calculator.log("velocity " + vx + ' ' + vy); - setRotation(vx / 100, vy / 100); - if (shouldRotate()) { - startLooping(); - } - } - - public void onTouchZoomDown(float x1, float y1, float x2, float y2) { - - } - - public void onTouchZoomMove(float x1, float y1, float x2, float y2) { - - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - return touchHandler != null ? touchHandler.handleTouchEvent(event) : super.onTouchEvent(event); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotter.java b/app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotter.java deleted file mode 100644 index 582f4de4..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/CalculatorPlotter.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import jscl.math.Generic; - -/** - * User: serso - * Date: 1/12/13 - * Time: 8:23 PM - */ -public interface CalculatorPlotter { - - @Nonnull - PlotData getPlotData(); - - boolean addFunction(@Nonnull Generic expression); - - boolean addFunction(@Nonnull PlotFunction plotFunction); - - boolean addFunction(@Nonnull XyFunction xyFunction); - - boolean addFunction(@Nonnull XyFunction xyFunction, @Nonnull PlotLineDef functionLineDef); - - boolean updateFunction(@Nonnull PlotFunction newFunction); - - boolean updateFunction(@Nonnull XyFunction xyFunction, @Nonnull PlotLineDef functionLineDef); - - boolean removeFunction(@Nonnull PlotFunction plotFunction); - - boolean removeFunction(@Nonnull XyFunction xyFunction); - - @Nonnull - PlotFunction pin(@Nonnull PlotFunction plotFunction); - - @Nonnull - PlotFunction unpin(@Nonnull PlotFunction plotFunction); - - @Nonnull - PlotFunction show(@Nonnull PlotFunction plotFunction); - - @Nonnull - PlotFunction hide(@Nonnull PlotFunction plotFunction); - - void clearAllFunctions(); - - @Nullable - PlotFunction getFunctionById(@Nonnull String functionId); - - @Nonnull - List getFunctions(); - - @Nonnull - List getVisibleFunctions(); - - void plot(); - - void plot(@Nonnull Generic expression); - - boolean is2dPlotPossible(); - - boolean isPlotPossibleFor(@Nonnull Generic expression); - - void setPlot3d(boolean plot3d); - - void removeAllUnpinned(); - - void setPlotImag(boolean plotImag); - - void savePlotBoundaries(@Nonnull PlotBoundaries plotBoundaries); - - void setPlotBoundaries(@Nonnull PlotBoundaries plotBoundaries); -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/FunctionEvaluator.java b/app/src/main/java/org/solovyev/android/calculator/plot/FunctionEvaluator.java deleted file mode 100644 index 6dd18f4e..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/FunctionEvaluator.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -/** - * User: serso - * Date: 1/18/13 - * Time: 7:44 PM - */ -interface FunctionEvaluator { - int getArity(); - - double eval(); - - double eval(double x); - - double eval(double x, double y); -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GLText.java b/app/src/main/java/org/solovyev/android/calculator/plot/GLText.java deleted file mode 100644 index 0c18e9e0..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GLText.java +++ /dev/null @@ -1,418 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -// This is a OpenGL ES 1.0 dynamic font rendering system. It loads actual font -// files, generates a font map (texture) from them, and allows rendering of -// text strings. -// -// NOTE: the rendering portions of this class uses a sprite batcher in order -// provide decent speed rendering. Also, rendering assumes a BOTTOM-LEFT -// origin, and the (x,y) positions are relative to that, as well as the -// bottom-left of the string to render. - -package org.solovyev.android.calculator.plot; - -import android.content.res.AssetManager; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Typeface; -import android.opengl.GLUtils; - -import javax.microedition.khronos.opengles.GL10; - -public class GLText { - - //--Constants--// - public final static int CHAR_START = 32; // First Character (ASCII Code) - public final static int CHAR_END = 126; // Last Character (ASCII Code) - public final static int CHAR_CNT = (((CHAR_END - CHAR_START) + 1) + 1); // Character Count (Including Character to use for Unknown) - - public final static int CHAR_NONE = 32; // Character to Use for Unknown (ASCII Code) - public final static int CHAR_UNKNOWN = (CHAR_CNT - 1); // Index of the Unknown Character - - public final static int FONT_SIZE_MIN = 6; // Minumum Font Size (Pixels) - public final static int FONT_SIZE_MAX = 180; // Maximum Font Size (Pixels) - - public final static int CHAR_BATCH_SIZE = 100; // Number of Characters to Render Per Batch - final float[] charWidths; // Width of Each Character (Actual; Pixels) - //--Members--// - GL10 gl; // GL10 Instance - AssetManager assets; // Asset Manager - SpriteBatch batch; // Batch Renderer - int fontPadX, fontPadY; // Font Padding (Pixels; On Each Side, ie. Doubled on Both X+Y Axis) - float fontHeight; // Font Height (Actual; Pixels) - float fontAscent; // Font Ascent (Above Baseline; Pixels) - float fontDescent; // Font Descent (Below Baseline; Pixels) - int textureId; // Font Texture ID [NOTE: Public for Testing Purposes Only!] - int textureSize; // Texture Size for Font (Square) [NOTE: Public for Testing Purposes Only!] - TextureRegion textureRgn; // Full Texture Region - float charWidthMax; // Character Width (Maximum; Pixels) - float charHeight; // Character Height (Maximum; Pixels) - TextureRegion[] charRgn; // Region of Each Character (Texture Coordinates) - int cellWidth, cellHeight; // Character Cell Width/Height - int rowCnt, colCnt; // Number of Rows/Columns - - float scaleX, scaleY; // Font Scale (X,Y Axis) - float spaceX; // Additional (X,Y Axis) Spacing (Unscaled) - - - //--Constructor--// - // D: save GL instance + asset manager, create arrays, and initialize the members - // A: gl - OpenGL ES 10 Instance - public GLText(GL10 gl, AssetManager assets) { - this.gl = gl; // Save the GL10 Instance - this.assets = assets; // Save the Asset Manager Instance - - batch = new SpriteBatch(gl, CHAR_BATCH_SIZE); // Create Sprite Batch (with Defined Size) - - charWidths = new float[CHAR_CNT]; // Create the Array of Character Widths - charRgn = new TextureRegion[CHAR_CNT]; // Create the Array of Character Regions - - // initialize remaining members - fontPadX = 0; - fontPadY = 0; - - fontHeight = 0.0f; - fontAscent = 0.0f; - fontDescent = 0.0f; - - textureId = -1; - textureSize = 0; - - charWidthMax = 0; - charHeight = 0; - - cellWidth = 0; - cellHeight = 0; - rowCnt = 0; - colCnt = 0; - - scaleX = 1.0f; // Default Scale = 1 (Unscaled) - scaleY = 1.0f; // Default Scale = 1 (Unscaled) - spaceX = 0.0f; - } - - //--Load Font--// - // description - // this will load the specified font file, create a texture for the defined - // character range, and setup all required values used to render with it. - // arguments: - // file - Filename of the font (.ttf, .otf) to use. In 'Assets' folder. - // size - Requested pixel size of font (height) - // padX, padY - Extra padding per character (X+Y Axis); to prevent overlapping characters. - public boolean load(String file, int size, int padX, int padY) { - - // setup requested values - fontPadX = padX; // Set Requested X Axis Padding - fontPadY = padY; // Set Requested Y Axis Padding - - // load the font and setup paint instance for drawing - Typeface tf = Typeface.createFromAsset(assets, file); // Create the Typeface from Font File - Paint paint = new Paint(); // Create Android Paint Instance - paint.setAntiAlias(true); // Enable Anti Alias - paint.setTextSize(size); // Set Text Size - paint.setColor(0xffffffff); // Set ARGB (White, Opaque) - paint.setTypeface(tf); // Set Typeface - - // get font metrics - Paint.FontMetrics fm = paint.getFontMetrics(); // Get Font Metrics - fontHeight = (float) Math.ceil(Math.abs(fm.bottom) + Math.abs(fm.top)); // Calculate Font Height - fontAscent = (float) Math.ceil(Math.abs(fm.ascent)); // Save Font Ascent - fontDescent = (float) Math.ceil(Math.abs(fm.descent)); // Save Font Descent - - // determine the width of each character (including unknown character) - // also determine the maximum character width - char[] s = new char[2]; // Create Character Array - charWidthMax = charHeight = 0; // Reset Character Width/Height Maximums - float[] w = new float[2]; // Working Width Value - int cnt = 0; // Array Counter - for (char c = CHAR_START; c <= CHAR_END; c++) { // FOR Each Character - s[0] = c; // Set Character - paint.getTextWidths(s, 0, 1, w); // Get Character Bounds - charWidths[cnt] = w[0]; // Get Width - if (charWidths[cnt] > charWidthMax) // IF Width Larger Than Max Width - charWidthMax = charWidths[cnt]; // Save New Max Width - cnt++; // Advance Array Counter - } - s[0] = CHAR_NONE; // Set Unknown Character - paint.getTextWidths(s, 0, 1, w); // Get Character Bounds - charWidths[cnt] = w[0]; // Get Width - if (charWidths[cnt] > charWidthMax) // IF Width Larger Than Max Width - charWidthMax = charWidths[cnt]; // Save New Max Width - cnt++; // Advance Array Counter - - // set character height to font height - charHeight = fontHeight; // Set Character Height - - // find the maximum size, validate, and setup cell sizes - cellWidth = (int) charWidthMax + (2 * fontPadX); // Set Cell Width - cellHeight = (int) charHeight + (2 * fontPadY); // Set Cell Height - int maxSize = cellWidth > cellHeight ? cellWidth : cellHeight; // Save Max Size (Width/Height) - if (maxSize < FONT_SIZE_MIN || maxSize > FONT_SIZE_MAX) // IF Maximum Size Outside Valid Bounds - return false; // Return Error - - // set texture size based on max font size (width or height) - // NOTE: these values are fixed, based on the defined characters. when - // changing start/end characters (CHAR_START/CHAR_END) this will need adjustment too! - if (maxSize <= 24) // IF Max Size is 18 or Less - textureSize = 256; // Set 256 Texture Size - else if (maxSize <= 40) // ELSE IF Max Size is 40 or Less - textureSize = 512; // Set 512 Texture Size - else if (maxSize <= 80) // ELSE IF Max Size is 80 or Less - textureSize = 1024; // Set 1024 Texture Size - else // ELSE IF Max Size is Larger Than 80 (and Less than FONT_SIZE_MAX) - textureSize = 2048; // Set 2048 Texture Size - - // create an empty bitmap (alpha only) - Bitmap bitmap = Bitmap.createBitmap(textureSize, textureSize, Bitmap.Config.ALPHA_8); // Create Bitmap - Canvas canvas = new Canvas(bitmap); // Create Canvas for Rendering to Bitmap - bitmap.eraseColor(0x00000000); // Set Transparent Background (ARGB) - - // calculate rows/columns - // NOTE: while not required for anything, these may be useful to have :) - colCnt = textureSize / cellWidth; // Calculate Number of Columns - rowCnt = (int) Math.ceil((float) CHAR_CNT / (float) colCnt); // Calculate Number of Rows - - // render each of the characters to the canvas (ie. build the font map) - float x = fontPadX; // Set Start Position (X) - float y = (cellHeight - 1) - fontDescent - fontPadY; // Set Start Position (Y) - for (char c = CHAR_START; c <= CHAR_END; c++) { // FOR Each Character - s[0] = c; // Set Character to Draw - canvas.drawText(s, 0, 1, x, y, paint); // Draw Character - x += cellWidth; // Move to Next Character - if ((x + cellWidth - fontPadX) > textureSize) { // IF End of Line Reached - x = fontPadX; // Set X for New Row - y += cellHeight; // Move Down a Row - } - } - s[0] = CHAR_NONE; // Set Character to Use for NONE - canvas.drawText(s, 0, 1, x, y, paint); // Draw Character - - // generate a new texture - int[] textureIds = new int[1]; // Array to Get Texture Id - gl.glGenTextures(1, textureIds, 0); // Generate New Texture - textureId = textureIds[0]; // Save Texture Id - - // setup filters for texture - gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); // Bind Texture - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); // Set Minification Filter - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); // Set Magnification Filter - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); // Set U Wrapping - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); // Set V Wrapping - - // load the generated bitmap onto the texture - GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); // Load Bitmap to Texture - gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); // Unbind Texture - - // release the bitmap - bitmap.recycle(); // Release the Bitmap - - // setup the array of character texture regions - x = 0; // Initialize X - y = 0; // Initialize Y - for (int c = 0; c < CHAR_CNT; c++) { // FOR Each Character (On Texture) - charRgn[c] = new TextureRegion(textureSize, textureSize, x, y, cellWidth - 1, cellHeight - 1); // Create Region for Character - x += cellWidth; // Move to Next Char (Cell) - if (x + cellWidth > textureSize) { - x = 0; // Reset X Position to Start - y += cellHeight; // Move to Next Row (Cell) - } - } - - // create full texture region - textureRgn = new TextureRegion(textureSize, textureSize, 0, 0, textureSize, textureSize); // Create Full Texture Region - - // return success - return true; // Return Success - } - - //--Begin/End Text Drawing--// - // D: call these methods before/after (respectively all draw() calls using a text instance - // NOTE: color is set on a per-batch basis, and fonts should be 8-bit alpha only!!! - // A: red, green, blue - RGB values for font (default = 1.0) - // alpha - optional alpha value for font (default = 1.0) - // R: [none] - public void begin() { - begin(1.0f, 1.0f, 1.0f, 1.0f); // Begin with White Opaque - } - - public void begin(float alpha) { - begin(1.0f, 1.0f, 1.0f, alpha); // Begin with White (Explicit Alpha) - } - - public void begin(float red, float green, float blue, float alpha) { - gl.glColor4f(red, green, blue, alpha); // Set Color+Alpha - gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); // Bind the Texture - batch.beginBatch(); // Begin Batch - } - - public void end() { - batch.endBatch(); // End Batch - gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Restore Default Color/Alpha - } - - //--Draw Text--// - // D: draw text at the specified x,y position - // A: text - the string to draw - // x, y - the x,y position to draw text at (bottom left of text; including descent) - // R: [none] - public void draw(String text, float x, float y) { - float chrHeight = cellHeight * scaleY; // Calculate Scaled Character Height - float chrWidth = cellWidth * scaleX; // Calculate Scaled Character Width - int len = text.length(); // Get String Length - x += (chrWidth / 2.0f) - (fontPadX * scaleX); // Adjust Start X - y += (chrHeight / 2.0f) - (fontPadY * scaleY); // Adjust Start Y - for (int i = 0; i < len; i++) { // FOR Each Character in String - int c = (int) text.charAt(i) - CHAR_START; // Calculate Character Index (Offset by First Char in Font) - if (c < 0 || c >= CHAR_CNT) // IF Character Not In Font - c = CHAR_UNKNOWN; // Set to Unknown Character Index - batch.drawSprite(x, y, chrWidth, chrHeight, charRgn[c]); // Draw the Character - x += (charWidths[c] + spaceX) * scaleX; // Advance X Position by Scaled Character Width - } - } - - //--Draw Text Centered--// - // D: draw text CENTERED at the specified x,y position - // A: text - the string to draw - // x, y - the x,y position to draw text at (bottom left of text) - // R: the total width of the text that was drawn - public float drawC(String text, float x, float y) { - float len = getLength(text); // Get Text Length - draw(text, x - (len / 2.0f), y - (getCharHeight() / 2.0f)); // Draw Text Centered - return len; // Return Length - } - - public float drawCX(String text, float x, float y) { - float len = getLength(text); // Get Text Length - draw(text, x - (len / 2.0f), y); // Draw Text Centered (X-Axis Only) - return len; // Return Length - } - - public void drawCY(String text, float x, float y) { - draw(text, x, y - (getCharHeight() / 2.0f)); // Draw Text Centered (Y-Axis Only) - } - - //--Set Scale--// - // D: set the scaling to use for the font - // A: scale - uniform scale for both x and y axis scaling - // sx, sy - separate x and y axis scaling factors - // R: [none] - public void setScale(float scale) { - scaleX = scaleY = scale; // Set Uniform Scale - } - - public void setScale(float sx, float sy) { - scaleX = sx; // Set X Scale - scaleY = sy; // Set Y Scale - } - - //--Get Scale--// - // D: get the current scaling used for the font - // A: [none] - // R: the x/y scale currently used for scale - public float getScaleX() { - return scaleX; // Return X Scale - } - - public float getScaleY() { - return scaleY; // Return Y Scale - } - - //--Get Space--// - // D: get the current spacing used for the font - // A: [none] - // R: the x/y space currently used for scale - public float getSpace() { - return spaceX; // Return X Space - } - - //--Set Space--// - // D: set the spacing (unscaled; ie. pixel size) to use for the font - // A: space - space for x axis spacing - // R: [none] - public void setSpace(float space) { - spaceX = space; // Set Space - } - - //--Get Length of a String--// - // D: return the length of the specified string if rendered using current settings - // A: text - the string to get length for - // R: the length of the specified string (pixels) - public float getLength(String text) { - float len = 0.0f; // Working Length - int strLen = text.length(); // Get String Length (Characters) - for (int i = 0; i < strLen; i++) { // For Each Character in String (Except Last - int c = (int) text.charAt(i) - CHAR_START; // Calculate Character Index (Offset by First Char in Font) - len += (charWidths[c] * scaleX); // Add Scaled Character Width to Total Length - } - len += (strLen > 1 ? ((strLen - 1) * spaceX) * scaleX : 0); // Add Space Length - return len; // Return Total Length - } - - //--Get Width/Height of Character--// - // D: return the scaled width/height of a character, or max character width - // NOTE: since all characters are the same height, no character index is required! - // NOTE: excludes spacing!! - // A: chr - the character to get width for - // R: the requested character size (scaled) - public float getCharWidth(char chr) { - int c = chr - CHAR_START; // Calculate Character Index (Offset by First Char in Font) - return (charWidths[c] * scaleX); // Return Scaled Character Width - } - - public float getCharWidthMax() { - return (charWidthMax * scaleX); // Return Scaled Max Character Width - } - - public float getCharHeight() { - return (charHeight * scaleY); // Return Scaled Character Height - } - - //--Get Font Metrics--// - // D: return the specified (scaled) font metric - // A: [none] - // R: the requested font metric (scaled) - public float getAscent() { - return (fontAscent * scaleY); // Return Font Ascent - } - - public float getDescent() { - return (fontDescent * scaleY); // Return Font Descent - } - - public float getHeight() { - return (fontHeight * scaleY); // Return Font Height (Actual) - } - - //--Draw Font Texture--// - // D: draw the entire font texture (NOTE: for testing purposes only) - // A: width, height - the width and height of the area to draw to. this is used - // to draw the texture to the top-left corner. - public void drawTexture(int width, int height) { - batch.beginBatch(textureId); // Begin Batch (Bind Texture) - batch.drawSprite(textureSize / 2, height - (textureSize / 2), textureSize, textureSize, textureRgn); // Draw - batch.endBatch(); // End Batch - } - - -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GLView.java b/app/src/main/java/org/solovyev/android/calculator/plot/GLView.java deleted file mode 100755 index 3dfa67cb..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GLView.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.content.Context; -import android.graphics.Bitmap; -import android.os.Handler; -import android.os.Message; -import android.util.AttributeSet; -import android.util.Log; -import android.view.SurfaceHolder; -import android.view.SurfaceView; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.ShortBuffer; - -import javax.annotation.Nonnull; -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGL11; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; -import javax.microedition.khronos.egl.EGLSurface; -import javax.microedition.khronos.opengles.GL10; -import javax.microedition.khronos.opengles.GL11; - -abstract class GLView extends SurfaceView implements SurfaceHolder.Callback { - protected int width, height; - private boolean hasSurface; - private boolean paused; - private EGL10 egl; - private EGLDisplay display; - private EGLConfig config; - private EGLSurface surface; - private EGLContext eglContext; - private GL11 gl; - private volatile boolean looping; - @Nonnull - private final Handler uiHandler = new Handler() { - public void handleMessage(Message msg) { - switch (msg.what) { - case 1: - glDraw(); - break; - default: - Log.e("GLView", "Incorrect message id: " + msg.what); - } - } - }; - - public GLView(Context context) { - super(context); - init(); - } - - public GLView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - private static Bitmap getRawPixels(GL10 gl, int width, int height) { - int size = width * height; - ByteBuffer buf = ByteBuffer.allocateDirect(size * 4); - buf.order(ByteOrder.nativeOrder()); - gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buf); - int data[] = new int[size]; - buf.asIntBuffer().get(data); - buf = null; - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); - bitmap.setPixels(data, size - width, -width, 0, 0, width, height); - return bitmap; - } - - static void bitmapBGRtoRGB(Bitmap bitmap, int width, int height) { - int size = width * height; - short data[] = new short[size]; - ShortBuffer buf = ShortBuffer.wrap(data); - bitmap.copyPixelsToBuffer(buf); - for (int i = 0; i < size; ++i) { - //BGR-565 to RGB-565 - short v = data[i]; - data[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11)); - } - buf.rewind(); - bitmap.copyPixelsFromBuffer(buf); - } - - abstract void onDrawFrame(GL10 gl); - - abstract void onSurfaceCreated(GL10 gl, int width, int height); - - @Nonnull - public Bitmap captureScreenshot() { - if (gl != null) { - final Bitmap result = getRawPixels(gl, width, height); - bitmapBGRtoRGB(result, width, height); - return result; - } else { - return Bitmap.createBitmap(width == 0 ? 1 : width, height == 0 ? 1 : height, Bitmap.Config.RGB_565); - } - } - - private void init() { - final SurfaceHolder holder = getHolder(); - holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); - holder.addCallback(this); - } - - public void onResume() { - paused = false; - if (hasSurface) { - initGL(); - } - } - - public void onPause() { - deinitGL(); - } - - private void initGL() { - egl = (EGL10) EGLContext.getEGL(); - display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - int[] ver = new int[2]; - egl.eglInitialize(display, ver); - - int[] configSpec = {EGL10.EGL_NONE}; - EGLConfig[] configOut = new EGLConfig[1]; - int[] nConfig = new int[1]; - egl.eglChooseConfig(display, configSpec, configOut, 1, nConfig); - config = configOut[0]; - eglContext = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, null); - surface = egl.eglCreateWindowSurface(display, config, getHolder(), null); - egl.eglMakeCurrent(display, surface, surface, eglContext); - gl = (GL11) eglContext.getGL(); - onSurfaceCreated(gl, width, height); - requestDraw(); - } - - private void deinitGL() { - paused = true; - if (display != null) { - egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); - egl.eglDestroySurface(display, surface); - egl.eglDestroyContext(display, eglContext); - egl.eglTerminate(display); - - egl = null; - config = null; - eglContext = null; - surface = null; - display = null; - gl = null; - } - } - - protected void glDraw() { - if (hasSurface && !paused) { - onDrawFrame(gl); - if (!egl.eglSwapBuffers(display, surface)) { - paused = true; - } - if (egl.eglGetError() == EGL11.EGL_CONTEXT_LOST) { - paused = true; - } - if (paused) { - reinitGL(); - } - if (looping) { - requestDraw(); - } - } - } - - public void surfaceCreated(SurfaceHolder holder) { - } - - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - this.width = width; - this.height = height; - final boolean hadSurface = hasSurface; - boolean doInit = !hadSurface && !paused; - hasSurface = true; - if (doInit) { - initGL(); - } else if (hadSurface) { - reinitGL(); - } - } - - private void reinitGL() { - deinitGL(); - paused = false; - initGL(); - } - - public void surfaceDestroyed(SurfaceHolder holder) { - hasSurface = false; - deinitGL(); - } - - public void startLooping() { - if (!looping) { - looping = true; - glDraw(); - } - } - - public void stopLooping() { - if (looping) { - looping = false; - } - } - - public boolean isLooping() { - return looping; - } - - public void requestDraw() { - uiHandler.sendEmptyMessage(1); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/Graph2dDimensions.java b/app/src/main/java/org/solovyev/android/calculator/plot/Graph2dDimensions.java deleted file mode 100644 index 114596c7..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/Graph2dDimensions.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.view.View; - -import org.solovyev.common.math.Point2d; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/18/13 - * Time: 7:59 PM - */ -public class Graph2dDimensions { - - // |<--------------gWidth-------------->| - // xMin xMax - // -------------------|------------------------------------|-------------------- - // |<-------------vWidthPxs------------>| - // - /* - * - * - * yMax ------0------------------------------------|--> xPxs - * ^ | - * | | - * v | y - * H | ^ - * e | | - * i | | - * g | | - * h |------------------0-----------------|--> x - * t | | - * | | | - * | | | - * v | | - * yMin ------- - - * | | - * v - * yPxs - * - * */ - - - @Nonnull - private GraphView graphView; - - // view width and height in pixels - private int vWidthPxs; - private int vHeightPxs; - - // current position of camera in graph coordinates - private float x0; - private float y0; - - // graph width and height in function units (NOT screen pixels) - private float gWidth = 20; - private float gHeight = 20; - - public Graph2dDimensions(@Nonnull GraphView graphView) { - this.graphView = graphView; - } - - /* - ********************************************************************** - * - * METHODS - * - ********************************************************************** - */ - - @Nonnull - Point2d toGraphCoordinates(float xPxs, float yPxs) { - return new Point2d(scaleXPxs(xPxs) + getXMin(), (getGHeight() - scaleYPxs(yPxs)) + getYMin()); - } - - private float scaleXPxs(float pxs) { - return pxs * getXGraphToViewScale(); - } - - private float scaleYPxs(float pxs) { - return pxs * getYGraphToViewScale(); - } - - // X - - public float getXMin() { - return x0 - gWidth / 2; - } - - float getXMax(float minX) { - return minX + gWidth; - } - - public float getXMax() { - return getXMax(getXMin()); - } - - // Y - - public float getYMin() { - return y0 - gHeight / 2; - } - - public float getYMax() { - return getYMax(getYMin()); - } - - public float getYMax(float yMin) { - return yMin + gHeight; - } - - float getXGraphToViewScale() { - if (vWidthPxs != 0) { - return gWidth / ((float) vWidthPxs); - } else { - return 0f; - } - } - - float getYGraphToViewScale() { - if (vHeightPxs != 0) { - return gHeight / ((float) vHeightPxs); - } else { - return 0f; - } - } - - private float getViewAspectRatio() { - if (vWidthPxs != 0) { - return ((float) vHeightPxs) / vWidthPxs; - } else { - return 0f; - } - } - - public int getVWidthPxs() { - return vWidthPxs; - } - - public int getVHeightPxs() { - return vHeightPxs; - } - - public float getX0() { - return x0; - } - - public float getY0() { - return y0; - } - - public float getGWidth() { - return gWidth; - } - - float getGHeight() { - return gHeight; - } - - /* - ********************************************************************** - * - * SETTERS - * - ********************************************************************** - */ - - public void setXRange(float xMin, float xMax) { - setXRange0(xMin, xMax); - - this.graphView.invalidateGraphs(); - } - - private void setXRange0(float xMin, float xMax) { - this.gWidth = xMax - xMin; - this.x0 = xMin + gWidth / 2; - } - - public void setYRange(float yMin, float yMax) { - setYRange0(yMin, yMax); - - this.graphView.invalidateGraphs(); - } - - private void setYRange0(float yMin, float yMax) { - this.gHeight = yMax - yMin; - this.y0 = yMin + gHeight / 2; - } - - public void setRanges(float xMin, float xMax, float yMin, float yMax) { - setXRange0(xMin, xMax); - setYRange0(yMin, yMax); - - this.graphView.invalidateGraphs(); - } - - public void setViewDimensions(@Nonnull View view) { - this.vWidthPxs = view.getWidth(); - this.vHeightPxs = view.getHeight(); - - this.graphView.invalidateGraphs(); - } - - - public void setGraphDimensions(float gWidth, float gHeight) { - this.gWidth = gWidth; - this.gHeight = gHeight; - - this.graphView.invalidateGraphs(); - } - - public void setViewDimensions(int vWidthPxs, int vHeightPxs) { - this.vWidthPxs = vWidthPxs; - this.vHeightPxs = vHeightPxs; - - this.graphView.invalidateGraphs(); - } - - void setXY(float x0, float y0) { - this.x0 = x0; - this.y0 = y0; - } - - public void increaseXY(float dx, float dy) { - this.x0 += dx; - this.y0 += dy; - } - - @Nonnull - public Graph2dDimensions copy() { - final Graph2dDimensions copy = new Graph2dDimensions(this.graphView); - - copy.vWidthPxs = this.vWidthPxs; - copy.vHeightPxs = this.vHeightPxs; - copy.x0 = this.x0; - copy.y0 = this.y0; - copy.gWidth = this.gWidth; - copy.gHeight = this.gHeight; - - return copy; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/Graph3d.java b/app/src/main/java/org/solovyev/android/calculator/plot/Graph3d.java deleted file mode 100755 index f2046389..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/Graph3d.java +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.graphics.Color; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.FloatBuffer; -import java.nio.ShortBuffer; - -import javax.annotation.Nonnull; -import javax.microedition.khronos.opengles.GL10; -import javax.microedition.khronos.opengles.GL11; - -class Graph3d { - - // vertices count per polygon (triangle = 3) - public static final int VERTICES_COUNT = 3; - - // color components count per color - public static final int COLOR_COMPONENTS_COUNT = 4; - - // linear polygons count - private final int n; - - private final boolean useHighQuality3d; - private ShortBuffer verticeIdx; - private FloatBuffer vertexBuf; - private ByteBuffer colorBuf; - private int vertexVbo, colorVbo, vertexElementVbo; - private boolean useVBO; - private int polygonsⁿ; - - Graph3d(GL11 gl, boolean useHighQuality3d) { - this.useHighQuality3d = useHighQuality3d; - this.n = useHighQuality3d ? 36 : 24; - - short[] b = new short[n * n]; - int p = 0; - for (int i = 0; i < n; i++) { - short v = 0; - for (int j = 0; j < n; v += n + n, j += 2) { - b[p++] = (short) (v + i); - b[p++] = (short) (v + n + n - 1 - i); - } - v = (short) (n * (n - 2)); - i++; - for (int j = n - 1; j >= 0; v -= n + n, j -= 2) { - b[p++] = (short) (v + n + n - 1 - i); - b[p++] = (short) (v + i); - } - } - verticeIdx = buildBuffer(b); - - String extensions = gl.glGetString(GL10.GL_EXTENSIONS); - useVBO = extensions.indexOf("vertex_buffer_object") != -1; - //Calculator.log("VBOs support: " + useVBO + " version " + gl.glGetString(GL10.GL_VERSION)); - - if (useVBO) { - int[] out = new int[3]; - gl.glGenBuffers(3, out, 0); - vertexVbo = out[0]; - colorVbo = out[1]; - vertexElementVbo = out[2]; - } - } - - private static FloatBuffer buildBuffer(float[] b) { - ByteBuffer bb = ByteBuffer.allocateDirect(b.length << 2); - bb.order(ByteOrder.nativeOrder()); - FloatBuffer sb = bb.asFloatBuffer(); - sb.put(b); - sb.position(0); - return sb; - } - - private static ShortBuffer buildBuffer(short[] b) { - ByteBuffer bb = ByteBuffer.allocateDirect(b.length << 1); - bb.order(ByteOrder.nativeOrder()); - ShortBuffer sb = bb.asShortBuffer(); - sb.put(b); - sb.position(0); - return sb; - } - - private static ByteBuffer buildBuffer(byte[] b) { - ByteBuffer bb = ByteBuffer.allocateDirect(b.length << 1); - bb.order(ByteOrder.nativeOrder()); - bb.put(b); - bb.position(0); - return bb; - } - - public void update(@Nonnull GL11 gl, @Nonnull PlotFunction fpd, @Nonnull Graph2dDimensions dimensions) { - final XyFunction function = fpd.getXyFunction(); - final PlotLineDef lineDef = fpd.getPlotLineDef(); - final int NTICK = useHighQuality3d ? 5 : 0; - - //Calculator.log("update VBOs " + vertexVbo + ' ' + colorVbo + ' ' + vertexElementVbo); - polygonsⁿ = n * n + 6 + 8 + NTICK * 6; - - // triangle polygon => 3 vertices per polygon - final float vertices[] = new float[polygonsⁿ * VERTICES_COUNT]; - - float maxAbsZ = fillFunctionPolygonVertices(function, dimensions, vertices); - final byte[] colors = prepareFunctionPolygonColors(lineDef, vertices, maxAbsZ); - - - int base = n * n * 3; - int colorBase = n * n * 4; - final int baseSize = 2; - - fillBasePolygonVectors(vertices, colors, base, colorBase, baseSize); - - base += 8 * 3; - colorBase += 8 * 4; - - fillAxisPolygonVectors(vertices, colors, base, colorBase); - - base += 6 * 3; - colorBase += 6 * 4; - - fillAxisGridPolygonVectors(NTICK, vertices, colors, base, colorBase); - - vertexBuf = buildBuffer(vertices); - colorBuf = buildBuffer(colors); - - if (useVBO) { - gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexVbo); - gl.glBufferData(GL11.GL_ARRAY_BUFFER, vertexBuf.capacity() * 4, vertexBuf, GL11.GL_STATIC_DRAW); - vertexBuf = null; - - gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, colorVbo); - gl.glBufferData(GL11.GL_ARRAY_BUFFER, colorBuf.capacity(), colorBuf, GL11.GL_STATIC_DRAW); - gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); - colorBuf = null; - - gl.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, vertexElementVbo); - gl.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, verticeIdx.capacity() * 2, verticeIdx, GL11.GL_STATIC_DRAW); - gl.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0); - } - } - - private void fillAxisGridPolygonVectors(int NTICK, float[] vertices, byte[] colors, int base, int colorBase) { - int p = base; - final float tick = .03f; - final float offset = .01f; - for (int i = 1; i <= NTICK; ++i) { - vertices[p] = i - tick; - vertices[p + 1] = -offset; - vertices[p + 2] = -offset; - - vertices[p + 3] = i + tick; - vertices[p + 4] = offset; - vertices[p + 5] = offset; - p += 6; - - vertices[p] = -offset; - vertices[p + 1] = i - tick; - vertices[p + 2] = -offset; - - vertices[p + 3] = offset; - vertices[p + 4] = i + tick; - vertices[p + 5] = offset; - p += 6; - - vertices[p] = -offset; - vertices[p + 1] = -offset; - vertices[p + 2] = i - tick; - - vertices[p + 3] = offset; - vertices[p + 4] = offset; - vertices[p + 5] = i + tick; - p += 6; - - } - for (int i = colorBase + NTICK * 6 * 4 - 1; i >= colorBase; --i) { - colors[i] = (byte) 255; - } - } - - private void fillAxisPolygonVectors(float[] vertices, byte[] colors, int base, int colorBase) { - final float unit = 2; - final float axis[] = { - 0, 0, 0, - unit, 0, 0, - 0, 0, 0, - 0, unit, 0, - 0, 0, 0, - 0, 0, unit, - }; - System.arraycopy(axis, 0, vertices, base, 6 * 3); - for (int i = colorBase; i < colorBase + 6 * 4; i += 4) { - colors[i] = (byte) 255; - colors[i + 1] = (byte) 255; - colors[i + 2] = (byte) 255; - colors[i + 3] = (byte) 255; - } - } - - private void fillBasePolygonVectors(float[] vertices, byte[] colors, int base, int colorBase, int baseSize) { - int p = base; - for (int i = -baseSize; i <= baseSize; i += 2 * baseSize) { - vertices[p] = i; - vertices[p + 1] = -baseSize; - vertices[p + 2] = 0; - p += 3; - vertices[p] = i; - vertices[p + 1] = baseSize; - vertices[p + 2] = 0; - p += 3; - vertices[p] = -baseSize; - vertices[p + 1] = i; - vertices[p + 2] = 0; - p += 3; - vertices[p] = baseSize; - vertices[p + 1] = i; - vertices[p + 2] = 0; - p += 3; - } - - for (int i = colorBase; i < colorBase + 8 * 4; i += 4) { - colors[i] = (byte) 255; - colors[i + 1] = (byte) 255; - colors[i + 2] = (byte) 255; - colors[i + 3] = (byte) 255; - } - } - - private float fillFunctionPolygonVertices(XyFunction function, @Nonnull Graph2dDimensions dimensions, float[] vertices) { - final int arity = function.getArity(); - - final float xMin = dimensions.getXMin(); - final float xMax = dimensions.getXMax(); - - final float yMin = dimensions.getXMin(); - final float yMax = dimensions.getXMax(); - - float Δx = (xMax - xMin) / (n - 1); - float Δy = (yMax - yMin) / (n - 1); - - float y = yMin; - float x = xMin - Δx; - - float maxAbsZ = 0; - - float z = 0; - if (arity == 0) { - z = (float) function.eval(); - } - - int k = 0; - for (int i = 0; i < n; i++, y += Δy) { - float xinc = (i & 1) == 0 ? Δx : -Δx; - - x += xinc; - - if (arity == 1) { - z = (float) function.eval(y); - } - - for (int j = 0; j < n; j++, x += xinc, k += VERTICES_COUNT) { - - if (arity == 2) { - z = (float) function.eval(y, x); - } - - vertices[k] = x; - vertices[k + 1] = y; - vertices[k + 2] = z; - - if (!Float.isNaN(z)) { - final float absZ = Math.abs(z); - if (absZ > maxAbsZ) { - maxAbsZ = absZ; - } - } else { - vertices[k + 2] = 0; - } - } - } - - return maxAbsZ; - } - - private byte[] prepareFunctionPolygonColors(PlotLineDef lineDef, float[] vertices, float maxAbsZ) { - // 4 color components per polygon (color[i] = red, color[i+1] = green, color[i+2] = blue, color[i+3] = alpha ) - final byte colors[] = new byte[polygonsⁿ * COLOR_COMPONENTS_COUNT]; - - final int lineColor = lineDef.getLineColor(); - final int colorComponentsCount = n * n * COLOR_COMPONENTS_COUNT; - for (int i = 0, j = VERTICES_COUNT - 1; i < colorComponentsCount; i += COLOR_COMPONENTS_COUNT, j += VERTICES_COUNT) { - final float z = vertices[j]; - - if (!Float.isNaN(z)) { - if (lineDef.getLineColorType() == PlotLineColorType.color_map) { - final float color = z / maxAbsZ; - final float abs = Math.abs(color); - colors[i] = floatToByte(color); - colors[i + 1] = floatToByte(1 - abs * .3f); - colors[i + 2] = floatToByte(-color); - } else { - colors[i] = (byte) Color.red(lineColor); - colors[i + 1] = (byte) Color.green(lineColor); - colors[i + 2] = (byte) Color.blue(lineColor); - } - colors[i + 3] = (byte) 255; - } else { - colors[i] = 0; - colors[i + 1] = 0; - colors[i + 2] = 0; - colors[i + 3] = 0; - } - } - return colors; - } - - private byte floatToByte(float v) { - if (v <= 0) { - return (byte) 0; - } else { - if (v >= 1) { - return (byte) 255; - } else { - return (byte) (v * 255); - } - } - } - - public void draw(GL11 gl) { - if (useVBO) { - gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexVbo); - gl.glVertexPointer(3, GL10.GL_FLOAT, 0, 0); - - gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, colorVbo); - gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, 0); - - gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); - // gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, N*N); - - gl.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, vertexElementVbo); - gl.glDrawElements(GL10.GL_LINE_STRIP, n * n, GL10.GL_UNSIGNED_SHORT, 0); - gl.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0); - } else { - gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuf); - gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colorBuf); - gl.glDrawElements(GL10.GL_LINE_STRIP, n * n, GL10.GL_UNSIGNED_SHORT, verticeIdx); - } - final int N2 = n * n; - gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, N2); - gl.glDrawArrays(GL10.GL_LINES, N2, polygonsⁿ - N2); - } - - public boolean isUseHighQuality3d() { - return useHighQuality3d; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculator.java b/app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculator.java deleted file mode 100644 index da92fa28..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculator.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/18/13 - * Time: 8:58 PM - */ -public interface GraphCalculator { - - void computeGraph(@Nonnull XyFunction f, - float xMin, - float xMax, - @Nonnull GraphData graph, - @Nonnull GraphsData graphsData, - @Nonnull Graph2dDimensions dimensions); -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculatorImpl.java b/app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculatorImpl.java deleted file mode 100644 index 9a8fe991..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GraphCalculatorImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/18/13 - * Time: 8:58 PM - */ -public class GraphCalculatorImpl extends AbstractGraphCalculator { - - @Override - protected void compute(@Nonnull XyFunction f, - float xMin, - float xMax, - float yMin, - float yMax, - @Nonnull GraphData graph, - @Nonnull Graph2dDimensions dimensions) { - graph.push(xMin, (float) f.eval(xMin)); - - final float xScale = dimensions.getXGraphToViewScale(); - final float yScale = dimensions.getYGraphToViewScale(); - final float maxStep = 15.8976f * xScale; - final float minStep = .05f * xScale; - - float yTheta = yScale; - yTheta = yTheta * yTheta; - - - float leftX; - float leftY; - - float rightX = graph.getLastX(); - float rightY = graph.getLastY(); - - while (true) { - leftX = rightX; - leftY = rightY; - - if (leftX > xMax) { - break; - } - - if (next.empty()) { - float x = leftX + maxStep; - next.push(x, (float) f.eval(x)); - } - - rightX = next.getLastX(); - rightY = next.getLastY(); - next.pop(); - - if (Float.isNaN(leftY) || Float.isNaN(rightY)) { - continue; - } - - float dx = rightX - leftX; - float middleX = (leftX + rightX) / 2; - float middleY = (float) f.eval(middleX); - - boolean middleIsOutside = (middleY < leftY && middleY < rightY) || (leftY < middleY && rightY < middleY); - - if (dx < minStep) { - // Calculator.log("minStep"); - if (middleIsOutside) { - graph.push(rightX, Float.NaN); - } - graph.push(rightX, rightY); - continue; - } - - if (middleIsOutside && ((leftY < yMin && rightY > yMax) || (leftY > yMax && rightY < yMin))) { - graph.push(rightX, Float.NaN); - graph.push(rightX, rightY); - // Calculator.log("+-inf"); - continue; - } - - if (!middleIsOutside) { - if (distance2(leftX, leftY, rightX, rightY, middleY) < yTheta) { - graph.push(rightX, rightY); - continue; - } - } - - next.push(rightX, rightY); - next.push(middleX, middleY); - rightX = leftX; - rightY = leftY; - } - } - - // distance as above when x==(x1+x2)/2. - private float distance2(float x1, float y1, float x2, float y2, float y) { - final float dx = x2 - x1; - final float dy = y2 - y1; - final float up = dx * (y1 + y2 - y - y); - return up * up / (dx * dx + dy * dy); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GraphData.java b/app/src/main/java/org/solovyev/android/calculator/plot/GraphData.java deleted file mode 100755 index 6c2192cc..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GraphData.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -class GraphData { - - private int size = 0; - - private int allocatedSize = 4; - private float[] xs = new float[allocatedSize]; - private float[] ys = new float[allocatedSize]; - - private GraphData() { - } - - @Nonnull - static GraphData newEmptyInstance() { - return new GraphData(); - } - - void swap(@Nonnull GraphData that) { - float savedXs[] = that.xs; - float savedYs[] = that.ys; - int savedSize = that.size; - int savedAllocatedSize = that.allocatedSize; - - that.xs = this.xs; - that.ys = this.ys; - that.size = this.size; - that.allocatedSize = this.allocatedSize; - - this.xs = savedXs; - this.ys = savedYs; - this.size = savedSize; - this.allocatedSize = savedAllocatedSize; - } - - void push(float x, float y) { - if (size >= allocatedSize) { - makeSpaceAtTheEnd(size + 1); - } - - xs[size] = x; - ys[size] = y; - ++size; - } - - private void makeSpaceAtTheEnd(int newSize) { - int oldAllocatedSize = allocatedSize; - while (newSize > allocatedSize) { - allocatedSize += allocatedSize; - } - - if (oldAllocatedSize != allocatedSize) { - float[] a = new float[allocatedSize]; - System.arraycopy(xs, 0, a, 0, this.size); - xs = a; - a = new float[allocatedSize]; - System.arraycopy(ys, 0, a, 0, this.size); - ys = a; - } - } - - - float getLastX() { - return xs[size - 1]; - } - - float getLastY() { - return ys[size - 1]; - } - - float getFirstX() { - return xs[0]; - } - - float getFirstY() { - return ys[0]; - } - - void pop() { - --size; - } - - boolean empty() { - return size == 0; - } - - void clear() { - size = 0; - } - - void eraseBefore(float x) { - int i = 0; - while (i < size && xs[i] < x) { - ++i; - } - // step back as xs[i] >= x and xs[i-1] < x - --i; - - if (i > 0) { - size -= i; - System.arraycopy(xs, i, xs, 0, size); - System.arraycopy(ys, i, ys, 0, size); - } - } - - void eraseAfter(float x) { - int i = size - 1; - while (i >= 0 && x < xs[i]) { - --i; - } - - // step next as xs[i] > x and xs[i+1] <= x - ++i; - - if (i < size - 1) { - size = i + 1; - } - } - - int findPositionAfter(float x, float y) { - int i = 0; - while (i < size && xs[i] <= x) { - ++i; - } - - if (Float.isNaN(y)) { - while (i < size && Float.isNaN(ys[i])) { - ++i; - } - } - - return i; - } - - void append(GraphData that) { - makeSpaceAtTheEnd(size + that.size); - int position = that.findPositionAfter(xs[size - 1], ys[size - 1]); - System.arraycopy(that.xs, position, xs, size, that.size - position); - System.arraycopy(that.ys, position, ys, size, that.size - position); - size += that.size - position; - } - - public String toString() { - StringBuilder b = new StringBuilder(); - b.append(size).append(": "); - for (int i = 0; i < size; ++i) { - b.append(xs[i]).append(", "); - } - return b.toString(); - } - - public float[] getXs() { - return xs; - } - - public float[] getYs() { - return ys; - } - - public int getSize() { - return size; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GraphView.java b/app/src/main/java/org/solovyev/android/calculator/plot/GraphView.java deleted file mode 100755 index a809d554..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GraphView.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.graphics.Bitmap; -import android.widget.ZoomButtonsController; - -import java.util.List; - -import javax.annotation.Nonnull; - -public interface GraphView extends ZoomButtonsController.OnZoomListener, TouchHandler.TouchHandlerListener { - - void init(@Nonnull PlotViewDef plotViewDef); - - @Nonnull - List getPlotFunctions(); - - void setPlotFunctions(@Nonnull List plotFunctions); - - void onDestroy(); - - void onPause(); - - void onResume(); - - @Nonnull - Bitmap captureScreenshot(); - - void setXRange(float xMin, float xMax); - - void setYRange(float yMin, float yMax); - - float getXMin(); - - float getXMax(); - - float getYMin(); - - float getYMax(); - - void invalidateGraphs(); - - void setAdjustYAxis(boolean adjustYAxis); -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GraphViewHelper.java b/app/src/main/java/org/solovyev/android/calculator/plot/GraphViewHelper.java deleted file mode 100644 index 721473d3..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GraphViewHelper.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/5/13 - * Time: 8:06 PM - */ -public class GraphViewHelper { - - @Nonnull - private PlotViewDef plotViewDef = PlotViewDef.newDefaultInstance(); - - @Nonnull - private List plotFunctions = Collections.emptyList(); - - private GraphViewHelper() { - } - - @Nonnull - public static GraphViewHelper newDefaultInstance() { - return new GraphViewHelper(); - } - - @Nonnull - public static GraphViewHelper newInstance(@Nonnull PlotViewDef plotViewDef, - @Nonnull List plotFunctions) { - final GraphViewHelper result = new GraphViewHelper(); - - result.plotViewDef = plotViewDef; - result.plotFunctions = Collections.unmodifiableList(plotFunctions); - - return result; - } - - @Nonnull - public GraphViewHelper copy(@Nonnull List plotFunctions) { - final GraphViewHelper result = new GraphViewHelper(); - - result.plotViewDef = plotViewDef; - result.plotFunctions = Collections.unmodifiableList(plotFunctions); - - return result; - } - - @Nonnull - public List getPlotFunctions() { - return plotFunctions; - } - - @Nonnull - public PlotViewDef getPlotViewDef() { - return plotViewDef; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/GraphsData.java b/app/src/main/java/org/solovyev/android/calculator/plot/GraphsData.java deleted file mode 100644 index d463338c..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/GraphsData.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/18/13 - * Time: 8:32 PM - */ -public class GraphsData { - - @Nonnull - private final GraphView graphView; - - @Nonnull - private List graphs; - - private float lastXMin; - private float lastXMax; - - private float lastYMin; - - private float lastYMax; - - public GraphsData(@Nonnull GraphView graphView) { - this.graphView = graphView; - graphs = new ArrayList(graphView.getPlotFunctions().size()); - } - - public void clear() { - for (GraphData graph : graphs) { - graph.clear(); - } - - while (graphView.getPlotFunctions().size() > graphs.size()) { - graphs.add(GraphData.newEmptyInstance()); - } - - lastYMin = 0; - lastYMax = 0; - } - - @Nonnull - public List getGraphs() { - return graphs; - } - - public float getLastXMin() { - return lastXMin; - } - - public void setLastXMin(float lastXMin) { - this.lastXMin = lastXMin; - } - - public float getLastXMax() { - return lastXMax; - } - - public void setLastXMax(float lastXMax) { - this.lastXMax = lastXMax; - } - - public float getLastYMin() { - return lastYMin; - } - - public float getLastYMax() { - return lastYMax; - } - - void checkBoundaries(float graphHeight, float yMin, float yMax) { - if (yMin < lastYMin || yMax > lastYMax) { - float halfGraphHeight = graphHeight / 2; - clear(); - lastYMin = yMin - halfGraphHeight; - lastYMax = yMax + halfGraphHeight; - } - } - - @Nonnull - public GraphData get(int i) { - return this.graphs.get(i); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/MapPlotResourceManager.java b/app/src/main/java/org/solovyev/android/calculator/plot/MapPlotResourceManager.java deleted file mode 100644 index e40c929f..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/MapPlotResourceManager.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * User: serso - * Date: 1/19/13 - * Time: 12:48 AM - */ -public class MapPlotResourceManager implements PlotResourceManager { - - @Nonnull - private final List preparedLineDefs = new ArrayList(PlotLineStyle.values().length * PlotLineColor.values().length); - @Nonnull - private Map> registeredLineDefsMap = new HashMap>(); - - public MapPlotResourceManager() { - for (PlotLineStyle plotLineStyle : PlotLineStyle.values()) { - for (PlotLineColor plotLineColor : PlotLineColor.values()) { - preparedLineDefs.add(PlotLineDef.newInstance(plotLineColor.getColor(), plotLineStyle)); - } - } - } - - @Nonnull - @Override - public PlotLineDef generateAndRegister() { - synchronized (this) { - for (PlotLineDef lineDef : preparedLineDefs) { - final List registeredLineDefs = registeredLineDefsMap.get(lineDef); - if (registeredLineDefs == null || registeredLineDefs.isEmpty()) { - register(lineDef); - return lineDef; - } - } - - return preparedLineDefs.get(0); - } - } - - private void addLineDef(@Nonnull final PlotLineDef toBeAdded) { - if (!Thread.holdsLock(this)) throw new AssertionError(); - - List registeredLineDefs = registeredLineDefsMap.get(toBeAdded); - if (registeredLineDefs == null) { - registeredLineDefs = new ArrayList(); - registeredLineDefsMap.put(toBeAdded, registeredLineDefs); - } - - try { - Iterables.find(registeredLineDefs, new Predicate() { - @Override - public boolean apply(@Nullable PlotLineDef lineDef) { - return lineDef == toBeAdded; - } - }); - - // already added - - } catch (NoSuchElementException e) { - registeredLineDefs.add(toBeAdded); - } - - } - - private void removeLineDef(@Nonnull final PlotLineDef toBeRemoved) { - if (!Thread.holdsLock(this)) throw new AssertionError(); - - List registeredLineDefs = registeredLineDefsMap.get(toBeRemoved); - - if (registeredLineDefs != null) { - Iterables.removeIf(registeredLineDefs, new Predicate() { - @Override - public boolean apply(@Nullable PlotLineDef lineDef) { - return lineDef == toBeRemoved; - } - }); - - if (registeredLineDefs.isEmpty()) { - registeredLineDefsMap.remove(toBeRemoved); - } - - } else { - registeredLineDefsMap.remove(toBeRemoved); - } - } - - @Override - public void register(@Nonnull PlotLineDef lineDef) { - synchronized (this) { - addLineDef(lineDef); - } - } - - @Override - public void unregister(@Nonnull PlotLineDef lineDef) { - synchronized (this) { - removeLineDef(lineDef); - } - } - - @Override - public void unregisterAll() { - synchronized (this) { - registeredLineDefsMap.clear(); - } - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotBoundaries.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotBoundaries.java deleted file mode 100644 index 4092821b..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotBoundaries.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import java.io.Serializable; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/19/13 - * Time: 4:51 PM - */ -public final class PlotBoundaries implements Serializable { - - public static final float DEFAULT_MIN_NUMBER = -10f; - - public static final float DEFAULT_MAX_NUMBER = 10f; - - - private float xMin; - private float xMax; - private float yMin; - private float yMax; - - public PlotBoundaries() { - } - - PlotBoundaries(float xMin, float xMax, float yMin, float yMax) { - this.xMin = Math.min(xMin, xMax); - this.xMax = Math.max(xMin, xMax); - this.yMin = Math.min(yMin, yMax); - this.yMax = Math.max(yMin, yMax); - } - - @Nonnull - public static PlotBoundaries newInstance(float xMin, float xMax, float yMin, float yMax) { - return new PlotBoundaries(xMin, xMax, yMin, yMax); - } - - @Nonnull - public static PlotBoundaries newInstance(float xMin, float xMax) { - return newInstance(xMin, xMax, DEFAULT_MIN_NUMBER, DEFAULT_MAX_NUMBER); - } - - @Nonnull - public static PlotBoundaries newDefaultInstance() { - PlotBoundaries plotBoundaries = new PlotBoundaries(); - plotBoundaries.xMin = DEFAULT_MIN_NUMBER; - plotBoundaries.yMin = DEFAULT_MIN_NUMBER; - plotBoundaries.xMax = DEFAULT_MAX_NUMBER; - plotBoundaries.yMax = DEFAULT_MAX_NUMBER; - return plotBoundaries; - } - - public float getXMin() { - return xMin; - } - - public float getXMax() { - return xMax; - } - - public float getYMin() { - return yMin; - } - - public float getYMax() { - return yMax; - } - - @Override - public String toString() { - return "PlotBoundaries{" + - "yMax=" + yMax + - ", yMin=" + yMin + - ", xMax=" + xMax + - ", xMin=" + xMin + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PlotBoundaries)) return false; - - PlotBoundaries that = (PlotBoundaries) o; - - if (Float.compare(that.xMax, xMax) != 0) return false; - if (Float.compare(that.xMin, xMin) != 0) return false; - if (Float.compare(that.yMax, yMax) != 0) return false; - return Float.compare(that.yMin, yMin) == 0; - - } - - @Override - public int hashCode() { - int result = (xMin != +0.0f ? Float.floatToIntBits(xMin) : 0); - result = 31 * result + (xMax != +0.0f ? Float.floatToIntBits(xMax) : 0); - result = 31 * result + (yMin != +0.0f ? Float.floatToIntBits(yMin) : 0); - result = 31 * result + (yMax != +0.0f ? Float.floatToIntBits(yMax) : 0); - return result; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotData.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotData.java deleted file mode 100644 index 955ddd9a..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotData.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import java.util.List; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/12/13 - * Time: 10:01 PM - */ -public class PlotData { - - @Nonnull - private final List functions; - - private final boolean plot3d; - - private final boolean adjustYAxis; - - @Nonnull - private final PlotBoundaries boundaries; - - public PlotData(@Nonnull List functions, - boolean plot3d, - boolean adjustYAxis, - @Nonnull PlotBoundaries boundaries) { - this.functions = functions; - this.plot3d = plot3d; - this.adjustYAxis = adjustYAxis; - this.boundaries = boundaries; - } - - @Nonnull - public List getFunctions() { - return functions; - } - - public boolean isPlot3d() { - return plot3d; - } - - @Nonnull - public PlotBoundaries getBoundaries() { - return boundaries; - } - - public boolean isAdjustYAxis() { - return adjustYAxis; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotFunction.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotFunction.java deleted file mode 100644 index a526fba3..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotFunction.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/12/13 - * Time: 8:45 PM - */ -public class PlotFunction { - - @Nonnull - private XyFunction xyFunction; - - @Nonnull - private PlotLineDef plotLineDef; - - private boolean pinned = false; - - private boolean visible = true; - - public PlotFunction(@Nonnull XyFunction xyFunction) { - this.xyFunction = xyFunction; - this.plotLineDef = PlotLineDef.newDefaultInstance(); - } - - public PlotFunction(@Nonnull XyFunction xyFunction, - @Nonnull PlotLineDef plotLineDef) { - this.xyFunction = xyFunction; - this.plotLineDef = plotLineDef; - } - - @Nonnull - public static PlotFunction changePlotLineDef(@Nonnull PlotFunction that, @Nonnull PlotLineDef newPlotLineDef) { - final PlotFunction copy = that.copy(); - copy.plotLineDef = newPlotLineDef; - return copy; - } - - @Nonnull - public static PlotFunction pin(@Nonnull PlotFunction that) { - return togglePinned(that, true); - } - - @Nonnull - public static PlotFunction togglePinned(@Nonnull PlotFunction that, boolean pinned) { - final PlotFunction copy = that.copy(); - copy.pinned = pinned; - return copy; - } - - @Nonnull - public static PlotFunction unpin(@Nonnull PlotFunction that) { - return togglePinned(that, false); - } - - @Nonnull - public static PlotFunction visible(@Nonnull PlotFunction that) { - return toggleVisible(that, true); - } - - @Nonnull - public static PlotFunction toggleVisible(@Nonnull PlotFunction that, boolean visible) { - final PlotFunction copy = that.copy(); - copy.visible = visible; - return copy; - } - - @Nonnull - public static PlotFunction invisible(@Nonnull PlotFunction that) { - return toggleVisible(that, false); - } - - @Nonnull - private PlotFunction copy() { - final PlotFunction copy = new PlotFunction(this.xyFunction, this.plotLineDef); - - copy.pinned = this.pinned; - copy.visible = this.visible; - - return copy; - } - - @Nonnull - public XyFunction getXyFunction() { - return xyFunction; - } - - @Nonnull - public PlotLineDef getPlotLineDef() { - return plotLineDef; - } - - public boolean isPinned() { - return pinned; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PlotFunction)) return false; - - PlotFunction that = (PlotFunction) o; - - return xyFunction.equals(that.xyFunction); - - } - - @Override - public int hashCode() { - return xyFunction.hashCode(); - } - - public boolean isVisible() { - return visible; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColor.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColor.java deleted file mode 100644 index 400f5d44..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColor.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 10/4/12 - * Time: 10:08 PM - */ -public enum PlotLineColor { - - // Color.WHITE - white(0xFFBBBBBB), - - blue(0xFF10648C), - - // Color.RED - red(0xFFFF0000), - - // Color.GREEN - green(0xFF00FF00), - - // Color.GRAY - grey(0xFF888888); - - private final int color; - - PlotLineColor(int color) { - this.color = color; - } - - @Nonnull - public static PlotLineColor valueOf(int color) { - for (PlotLineColor plotLineColor : PlotLineColor.values()) { - if (plotLineColor.color == color) { - return plotLineColor; - } - } - - return PlotLineColor.white; - } - - public int getColor() { - return this.color; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColorType.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColorType.java deleted file mode 100644 index 68e6d7f9..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineColorType.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -/** - * User: serso - * Date: 1/5/13 - * Time: 10:45 PM - */ -public enum PlotLineColorType { - - monochrome, - color_map -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineDef.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineDef.java deleted file mode 100644 index 161eee9d..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineDef.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/5/13 - * Time: 7:41 PM - */ -public class PlotLineDef { - - /* - ********************************************************************** - * - * CONSTANTS - * - ********************************************************************** - */ - - @Nonnull - private static final Float DEFAULT_LINE_WIDTH = 2f; - - private static final int WHITE = 0xFFFFFFFF; - - - /* - ********************************************************************** - * - * FIELDS - * - ********************************************************************** - */ - - @Nonnull - private PlotLineColorType lineColorType = PlotLineColorType.monochrome; - - private int lineColor = WHITE; - - @Nonnull - private PlotLineStyle lineStyle = PlotLineStyle.solid; - - private float lineWidth = DEFAULT_LINE_WIDTH; - - private PlotLineDef() { - } - - @Nonnull - public static PlotLineDef newInstance(int lineColor, @Nonnull PlotLineStyle lineStyle) { - final PlotLineDef result = new PlotLineDef(); - result.lineColor = lineColor; - result.lineStyle = lineStyle; - return result; - } - - @Nonnull - public static PlotLineDef newInstance(int lineColor, @Nonnull PlotLineStyle lineStyle, float lineWidth) { - final PlotLineDef result = new PlotLineDef(); - result.lineColor = lineColor; - result.lineStyle = lineStyle; - result.lineWidth = lineWidth; - return result; - } - - @Nonnull - public static PlotLineDef newInstance(int lineColor, @Nonnull PlotLineStyle lineStyle, float lineWidth, @Nonnull PlotLineColorType lineColorType) { - final PlotLineDef result = new PlotLineDef(); - result.lineColor = lineColor; - result.lineColorType = lineColorType; - result.lineStyle = lineStyle; - result.lineWidth = lineWidth; - return result; - } - - @Nonnull - public static PlotLineDef changeLineColor(@Nonnull PlotLineDef plotLineDef, int newLineColor) { - final PlotLineDef result = plotLineDef.copy(); - result.lineColor = newLineColor; - return result; - } - - @Nonnull - public static PlotLineDef changeLineWidth(@Nonnull PlotLineDef plotLineDef, int newLineWidth) { - final PlotLineDef result = plotLineDef.copy(); - result.lineWidth = newLineWidth; - return result; - } - - @Nonnull - public static PlotLineDef changeLineColorType(@Nonnull PlotLineDef plotLineDef, @Nonnull PlotLineColorType newPlotLineColorType) { - final PlotLineDef result = plotLineDef.copy(); - result.lineColorType = newPlotLineColorType; - return result; - } - - @Nonnull - public static PlotLineDef changeLineStyle(@Nonnull PlotLineDef plotLineDef, @Nonnull PlotLineStyle newPlotLineStyle) { - final PlotLineDef result = plotLineDef.copy(); - result.lineStyle = newPlotLineStyle; - return result; - } - - @Nonnull - public static PlotLineDef changeColor(@Nonnull PlotLineDef plotLineDef, int newLineColor) { - final PlotLineDef result = plotLineDef.copy(); - result.lineColor = newLineColor; - return result; - } - - @Nonnull - public static PlotLineDef newDefaultInstance() { - return new PlotLineDef(); - } - - @Nonnull - private PlotLineDef copy() { - final PlotLineDef copy = new PlotLineDef(); - copy.lineColor = lineColor; - copy.lineColorType = lineColorType; - copy.lineStyle = lineStyle; - copy.lineWidth = lineWidth; - return copy; - } - - public int getLineColor() { - return lineColor; - } - - @Nonnull - public PlotLineStyle getLineStyle() { - return lineStyle; - } - - public float getLineWidth() { - return lineWidth; - } - - @Nonnull - public PlotLineColorType getLineColorType() { - return lineColorType; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PlotLineDef)) return false; - - PlotLineDef that = (PlotLineDef) o; - - if (lineColor != that.lineColor) return false; - if (Float.compare(that.lineWidth, lineWidth) != 0) return false; - if (lineColorType != that.lineColorType) return false; - return lineStyle == that.lineStyle; - - } - - @Override - public int hashCode() { - int result = lineColorType.hashCode(); - result = 31 * result + lineColor; - result = 31 * result + lineStyle.hashCode(); - result = 31 * result + (lineWidth != +0.0f ? Float.floatToIntBits(lineWidth) : 0); - return result; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineStyle.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineStyle.java deleted file mode 100644 index 238bb41d..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotLineStyle.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - - -/** - * User: serso - * Date: 1/5/13 - * Time: 7:37 PM - */ -public enum PlotLineStyle { - - solid, - dashed, - dotted, - dash_dotted - -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotResourceManager.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotResourceManager.java deleted file mode 100644 index 16eb2c6b..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotResourceManager.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/13/13 - * Time: 8:19 PM - */ -interface PlotResourceManager { - - @Nonnull - PlotLineDef generateAndRegister(); - - void register(@Nonnull PlotLineDef lineDef); - - void unregister(@Nonnull PlotLineDef lineDef); - - void unregisterAll(); -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java deleted file mode 100644 index 8a7b1612..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotUtils.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import jscl.math.Expression; -import jscl.math.Generic; -import jscl.math.JsclInteger; -import jscl.math.NumericWrapper; -import jscl.math.function.Constant; -import jscl.math.numeric.Complex; -import jscl.math.numeric.Numeric; -import jscl.math.numeric.Real; - -/** - * User: serso - * Date: 12/5/11 - * Time: 8:58 PM - */ -public final class PlotUtils { - - private static final Complex NaN = Complex.valueOf(Double.NaN, 0d); - - // not intended for instantiation - private PlotUtils() { - throw new AssertionError(); - } - - @Nonnull - public static Complex calculatorExpression(@Nonnull Generic expression) { - try { - return unwrap(expression.numeric()); - } catch (RuntimeException e) { - return NaN; - } - } - - @Nonnull - public static Complex calculatorExpression(@Nonnull Generic expression, @Nonnull Constant xVar, double x) { - try { - return unwrap(expression.substitute(xVar, Expression.valueOf(x)).numeric()); - } catch (RuntimeException e) { - return NaN; - } - } - - @Nonnull - public static Complex calculatorExpression(@Nonnull Generic expression, @Nonnull Constant xVar, double x, @Nonnull Constant yVar, double y) { - try { - Generic tmp = expression.substitute(xVar, Expression.valueOf(x)); - tmp = tmp.substitute(yVar, Expression.valueOf(y)); - return unwrap(tmp.numeric()); - } catch (RuntimeException e) { - return NaN; - } - } - - @Nonnull - public static Complex unwrap(@Nullable Generic numeric) { - if (numeric instanceof JsclInteger) { - return Complex.valueOf(((JsclInteger) numeric).intValue(), 0d); - } else if (numeric instanceof NumericWrapper) { - return unwrap(((NumericWrapper) numeric).content()); - } else { - return NaN; - } - } - - @Nonnull - public static Complex unwrap(@Nullable Numeric content) { - if (content instanceof Real) { - return Complex.valueOf(((Real) content).doubleValue(), 0d); - } else if (content instanceof Complex) { - return ((Complex) content); - } else { - throw new ArithmeticException(); - } - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/PlotViewDef.java b/app/src/main/java/org/solovyev/android/calculator/plot/PlotViewDef.java deleted file mode 100644 index cb90c07a..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/PlotViewDef.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.graphics.Color; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 1/5/13 - * Time: 9:11 PM - */ -public class PlotViewDef { - - /* - ********************************************************************** - * - * CONSTANTS - * - ********************************************************************** - */ - - private static final int DEFAULT_AXIS_COLOR = 0xff00a000; - private static final int DEFAULT_GRID_COLOR = 0xff004000; - private static final int DEFAULT_BACKGROUND_COLOR = Color.BLACK; - - /* - ********************************************************************** - * - * FIELDS - * - ********************************************************************** - */ - - private int axisColor = DEFAULT_AXIS_COLOR; - - private int axisLabelsColor = DEFAULT_AXIS_COLOR; - - private int gridColor = DEFAULT_GRID_COLOR; - - private int backgroundColor = DEFAULT_BACKGROUND_COLOR; - - private PlotViewDef() { - } - - private PlotViewDef(int axisColor, int axisLabelColor, int gridColor, int backgroundColor) { - this.axisColor = axisColor; - this.axisLabelsColor = axisLabelColor; - this.gridColor = gridColor; - this.backgroundColor = backgroundColor; - } - - @Nonnull - public static PlotViewDef newDefaultInstance() { - return new PlotViewDef(); - } - - @Nonnull - public static PlotViewDef newInstance(int axisColor, int axisLabelColor, int gridColor, int backgroundColor) { - return new PlotViewDef(axisColor, axisLabelColor, gridColor, backgroundColor); - } - - public int getAxisColor() { - return axisColor; - } - - public int getAxisLabelsColor() { - return axisLabelsColor; - } - - public int getGridColor() { - return gridColor; - } - - public int getBackgroundColor() { - return backgroundColor; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/SpriteBatch.java b/app/src/main/java/org/solovyev/android/calculator/plot/SpriteBatch.java deleted file mode 100644 index 0ed82eb0..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/SpriteBatch.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import javax.microedition.khronos.opengles.GL10; - -public class SpriteBatch { - - //--Constants--// - final static int VERTEX_SIZE = 4; // Vertex Size (in Components) ie. (X,Y,U,V) - final static int VERTICES_PER_SPRITE = 4; // Vertices Per Sprite - final static int INDICES_PER_SPRITE = 6; // Indices Per Sprite - - //--Members--// - GL10 gl; // GL Instance - Vertices vertices; // Vertices Instance Used for Rendering - float[] vertexBuffer; // Vertex Buffer - int bufferIndex; // Vertex Buffer Start Index - int maxSprites; // Maximum Sprites Allowed in Buffer - int numSprites; // Number of Sprites Currently in Buffer - - //--Constructor--// - // D: prepare the sprite batcher for specified maximum number of sprites - // A: gl - the gl instance to use for rendering - // maxSprites - the maximum allowed sprites per batch - public SpriteBatch(GL10 gl, int maxSprites) { - this.gl = gl; // Save GL Instance - this.vertexBuffer = new float[maxSprites * VERTICES_PER_SPRITE * VERTEX_SIZE]; // Create Vertex Buffer - this.vertices = new Vertices(gl, maxSprites * VERTICES_PER_SPRITE, maxSprites * INDICES_PER_SPRITE, false, true, false); // Create Rendering Vertices - this.bufferIndex = 0; // Reset Buffer Index - this.maxSprites = maxSprites; // Save Maximum Sprites - this.numSprites = 0; // Clear Sprite Counter - - short[] indices = new short[maxSprites * INDICES_PER_SPRITE]; // Create Temp Index Buffer - int len = indices.length; // Get Index Buffer Length - short j = 0; // Counter - for (int i = 0; i < len; i += INDICES_PER_SPRITE, j += VERTICES_PER_SPRITE) { // FOR Each Index Set (Per Sprite) - indices[i + 0] = (short) (j + 0); // Calculate Index 0 - indices[i + 1] = (short) (j + 1); // Calculate Index 1 - indices[i + 2] = (short) (j + 2); // Calculate Index 2 - indices[i + 3] = (short) (j + 2); // Calculate Index 3 - indices[i + 4] = (short) (j + 3); // Calculate Index 4 - indices[i + 5] = (short) (j + 0); // Calculate Index 5 - } - vertices.setIndices(indices, 0, len); // Set Index Buffer for Rendering - } - - //--Begin Batch--// - // D: signal the start of a batch. set the texture and clear buffer - // NOTE: the overloaded (non-texture) version assumes that the texture is already bound! - // A: textureId - the ID of the texture to use for the batch - // R: [none] - public void beginBatch(int textureId) { - gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); // Bind the Texture - numSprites = 0; // Empty Sprite Counter - bufferIndex = 0; // Reset Buffer Index (Empty) - } - - public void beginBatch() { - numSprites = 0; // Empty Sprite Counter - bufferIndex = 0; // Reset Buffer Index (Empty) - } - - //--End Batch--// - // D: signal the end of a batch. render the batched sprites - // A: [none] - // R: [none] - public void endBatch() { - if (numSprites > 0) { // IF Any Sprites to Render - vertices.setVertices(vertexBuffer, 0, bufferIndex); // Set Vertices from Buffer - vertices.bind(); // Bind Vertices - vertices.draw(GL10.GL_TRIANGLES, 0, numSprites * INDICES_PER_SPRITE); // Render Batched Sprites - vertices.unbind(); // Unbind Vertices - } - } - - //--Draw Sprite to Batch--// - // D: batch specified sprite to batch. adds vertices for sprite to vertex buffer - // NOTE: MUST be called after beginBatch(), and before endBatch()! - // NOTE: if the batch overflows, this will render the current batch, restart it, - // and then batch this sprite. - // A: x, y - the x,y position of the sprite (center) - // width, height - the width and height of the sprite - // region - the texture region to use for sprite - // R: [none] - public void drawSprite(float x, float y, float width, float height, TextureRegion region) { - if (numSprites == maxSprites) { // IF Sprite Buffer is Full - endBatch(); // End Batch - // NOTE: leave current texture bound!! - numSprites = 0; // Empty Sprite Counter - bufferIndex = 0; // Reset Buffer Index (Empty) - } - - float halfWidth = width / 2.0f; // Calculate Half Width - float halfHeight = height / 2.0f; // Calculate Half Height - float x1 = x - halfWidth; // Calculate Left X - float y1 = y - halfHeight; // Calculate Bottom Y - float x2 = x + halfWidth; // Calculate Right X - float y2 = y + halfHeight; // Calculate Top Y - - vertexBuffer[bufferIndex++] = x1; // Add X for Vertex 0 - vertexBuffer[bufferIndex++] = y1; // Add Y for Vertex 0 - vertexBuffer[bufferIndex++] = region.u1; // Add U for Vertex 0 - vertexBuffer[bufferIndex++] = region.v2; // Add V for Vertex 0 - - vertexBuffer[bufferIndex++] = x2; // Add X for Vertex 1 - vertexBuffer[bufferIndex++] = y1; // Add Y for Vertex 1 - vertexBuffer[bufferIndex++] = region.u2; // Add U for Vertex 1 - vertexBuffer[bufferIndex++] = region.v2; // Add V for Vertex 1 - - vertexBuffer[bufferIndex++] = x2; // Add X for Vertex 2 - vertexBuffer[bufferIndex++] = y2; // Add Y for Vertex 2 - vertexBuffer[bufferIndex++] = region.u2; // Add U for Vertex 2 - vertexBuffer[bufferIndex++] = region.v1; // Add V for Vertex 2 - - vertexBuffer[bufferIndex++] = x1; // Add X for Vertex 3 - vertexBuffer[bufferIndex++] = y2; // Add Y for Vertex 3 - vertexBuffer[bufferIndex++] = region.u1; // Add U for Vertex 3 - vertexBuffer[bufferIndex++] = region.v1; // Add V for Vertex 3 - - numSprites++; // Increment Sprite Count - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/TexampleRenderer.java b/app/src/main/java/org/solovyev/android/calculator/plot/TexampleRenderer.java deleted file mode 100644 index 692c658f..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/TexampleRenderer.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -// This is based on the OpenGL ES 1.0 sample application from the Android Developer website: -// http://developer.android.com/resources/tutorials/opengl/opengl-es10.html - -package org.solovyev.android.calculator.plot; - -import android.content.Context; -import android.opengl.GLSurfaceView; - -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; - -public class TexampleRenderer implements GLSurfaceView.Renderer { - - private GLText glText; // A GLText Instance - private Context context; // Context (from Activity) - - private int width = 100; // Updated to the Current Width + Height in onSurfaceChanged() - private int height = 100; - - public TexampleRenderer(Context context) { - super(); - this.context = context; // Save Specified Context - } - - public void onSurfaceCreated(GL10 gl, EGLConfig config) { - // Set the background frame color - gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); - - // Create the GLText - glText = new GLText(gl, context.getAssets()); - - // Load the font from file (set size + padding), creates the texture - // NOTE: after a successful call to this the font is ready for rendering! - glText.load("Roboto-Regular.ttf", 14, 2, 2); // Create Font (Height: 14 Pixels / X+Y Padding 2 Pixels) - } - - public void onDrawFrame(GL10 gl) { - // Redraw background color - gl.glClear(GL10.GL_COLOR_BUFFER_BIT); - - // Set to ModelView mode - gl.glMatrixMode(GL10.GL_MODELVIEW); // Activate Model View Matrix - gl.glLoadIdentity(); // Load Identity Matrix - - // enable texture + alpha blending - // NOTE: this is required for text rendering! we could incorporate it into - // the GLText class, but then it would be called multiple times (which impacts performance). - gl.glEnable(GL10.GL_TEXTURE_2D); // Enable Texture Mapping - gl.glEnable(GL10.GL_BLEND); // Enable Alpha Blend - gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); // Set Alpha Blend Function - - // TEST: render the entire font texture - gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Set Color to Use - glText.drawTexture(width, height); // Draw the Entire Texture - - // TEST: render some strings with the font - glText.begin(1.0f, 1.0f, 1.0f, 1.0f); // Begin Text Rendering (Set Color WHITE) - glText.draw("Test String :)", 0, 0); // Draw Test String - glText.draw("Line 1", 50, 50); // Draw Test String - glText.draw("Line 2", 100, 100); // Draw Test String - glText.end(); // End Text Rendering - - glText.begin(0.0f, 0.0f, 1.0f, 1.0f); // Begin Text Rendering (Set Color BLUE) - glText.draw("More Lines...", 50, 150); // Draw Test String - glText.draw("The End.", 50, 150 + glText.getCharHeight()); // Draw Test String - glText.end(); // End Text Rendering - - // disable texture + alpha - gl.glDisable(GL10.GL_BLEND); // Disable Alpha Blend - gl.glDisable(GL10.GL_TEXTURE_2D); // Disable Texture Mapping - } - - public void onSurfaceChanged(GL10 gl, int width, int height) { - gl.glViewport(0, 0, width, height); - - // Setup orthographic projection - gl.glMatrixMode(GL10.GL_PROJECTION); // Activate Projection Matrix - gl.glLoadIdentity(); // Load Identity Matrix - gl.glOrthof( // Set Ortho Projection (Left,Right,Bottom,Top,Front,Back) - 0, width, - 0, height, - 1.0f, -1.0f - ); - - // Save width and height - this.width = width; // Save Current Width - this.height = height; // Save Current Height - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/TextureRegion.java b/app/src/main/java/org/solovyev/android/calculator/plot/TextureRegion.java deleted file mode 100644 index 2e6ce49e..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/TextureRegion.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -class TextureRegion { - - //--Members--// - public float u1, v1; // Top/Left U,V Coordinates - public float u2, v2; // Bottom/Right U,V Coordinates - - //--Constructor--// - // D: calculate U,V coordinates from specified texture coordinates - // A: texWidth, texHeight - the width and height of the texture the region is for - // x, y - the top/left (x,y) of the region on the texture (in pixels) - // width, height - the width and height of the region on the texture (in pixels) - public TextureRegion(float texWidth, float texHeight, float x, float y, float width, float height) { - this.u1 = x / texWidth; // Calculate U1 - this.v1 = y / texHeight; // Calculate V1 - this.u2 = this.u1 + (width / texWidth); // Calculate U2 - this.v2 = this.v1 + (height / texHeight); // Calculate V2 - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/TouchHandler.java b/app/src/main/java/org/solovyev/android/calculator/plot/TouchHandler.java deleted file mode 100755 index ba4e8896..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/TouchHandler.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import android.view.MotionEvent; -import android.view.VelocityTracker; - -import org.solovyev.android.Views; - -import javax.annotation.Nonnull; - -class TouchHandler { - - @Nonnull - private final VelocityTracker velocityTracker = VelocityTracker.obtain(); - private boolean afterZoom; - @Nonnull - private TouchHandlerListener listener; - - TouchHandler(@Nonnull TouchHandlerListener listener) { - this.listener = listener; - } - - public boolean handleTouchEvent(@Nonnull MotionEvent event) { - // Calculator.log("touch " + event + ' ' + event.getPointerCount() + event.getPointerId(0)); - - final int fullAction = event.getAction(); - final int action = fullAction & MotionEvent.ACTION_MASK; - final int pointer = (fullAction & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; - - float x = event.getX(); - float y = event.getY(); - - int pointerCount = Views.getPointerCountFromMotionEvent(event); - - switch (action) { - case MotionEvent.ACTION_DOWN: - afterZoom = false; - velocityTracker.clear(); - velocityTracker.addMovement(event); - listener.onTouchDown(x, y); - break; - - case MotionEvent.ACTION_MOVE: - if (pointerCount == 1) { - if (afterZoom) { - velocityTracker.clear(); - listener.onTouchDown(x, y); - afterZoom = false; - } - velocityTracker.addMovement(event); - listener.onTouchMove(x, y); - } else if (pointerCount == 2) { - listener.onTouchZoomMove(x, y, Views.getXFromMotionEvent(event, 1), Views.getYFromMotionEvent(event, 1)); - } - break; - - case MotionEvent.ACTION_UP: - velocityTracker.addMovement(event); - velocityTracker.computeCurrentVelocity(1000); - listener.onTouchUp(x, y); - break; - - case MotionEvent.ACTION_POINTER_DOWN: - if (pointerCount == 2) { - listener.onTouchZoomDown(x, y, Views.getXFromMotionEvent(event, 1), Views.getYFromMotionEvent(event, 1)); - } - break; - - case MotionEvent.ACTION_POINTER_UP: - if (pointerCount == 2) { - afterZoom = true; - } - break; - } - return true; - } - - public float getXVelocity() { - return velocityTracker.getXVelocity(); - } - - public float getYVelocity() { - return velocityTracker.getYVelocity(); - } - - interface TouchHandlerListener { - void onTouchDown(float x, float y); - - void onTouchMove(float x, float y); - - void onTouchUp(float x, float y); - - void onTouchZoomDown(float x1, float y1, float x2, float y2); - - void onTouchZoomMove(float x1, float y1, float x2, float y2); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/Vertices.java b/app/src/main/java/org/solovyev/android/calculator/plot/Vertices.java deleted file mode 100644 index c09cb187..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/Vertices.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.IntBuffer; -import java.nio.ShortBuffer; - -import javax.microedition.khronos.opengles.GL10; - -public class Vertices { - - //--Constants--// - final static int POSITION_CNT_2D = 2; // Number of Components in Vertex Position for 2D - final static int POSITION_CNT_3D = 3; // Number of Components in Vertex Position for 3D - final static int COLOR_CNT = 4; // Number of Components in Vertex Color - final static int TEXCOORD_CNT = 2; // Number of Components in Vertex Texture Coords - final static int NORMAL_CNT = 3; // Number of Components in Vertex Normal - - final static int INDEX_SIZE = Short.SIZE / 8; // Index Byte Size (Short.SIZE = bits) - public final int positionCnt; // Number of Position Components (2=2D, 3=3D) - public final int vertexStride; // Vertex Stride (Element Size of a Single Vertex) - public final int vertexSize; // Bytesize of a Single Vertex - //--Members--// - // NOTE: all members are constant, and initialized in constructor! - final GL10 gl; // GL Instance - final boolean hasColor; // Use Color in Vertices - final boolean hasTexCoords; // Use Texture Coords in Vertices - final boolean hasNormals; // Use Normals in Vertices - final IntBuffer vertices; // Vertex Buffer - final ShortBuffer indices; // Index Buffer - final int[] tmpBuffer; // Temp Buffer for Vertex Conversion - public int numVertices; // Number of Vertices in Buffer - public int numIndices; // Number of Indices in Buffer - - //--Constructor--// - // D: create the vertices/indices as specified (for 2d/3d) - // A: gl - the gl instance to use - // maxVertices - maximum vertices allowed in buffer - // maxIndices - maximum indices allowed in buffer - // hasColor - use color values in vertices - // hasTexCoords - use texture coordinates in vertices - // hasNormals - use normals in vertices - // use3D - (false, default) use 2d positions (ie. x/y only) - // (true) use 3d positions (ie. x/y/z) - public Vertices(GL10 gl, int maxVertices, int maxIndices, boolean hasColor, boolean hasTexCoords, boolean hasNormals) { - this(gl, maxVertices, maxIndices, hasColor, hasTexCoords, hasNormals, false); // Call Overloaded Constructor - } - - public Vertices(GL10 gl, int maxVertices, int maxIndices, boolean hasColor, boolean hasTexCoords, boolean hasNormals, boolean use3D) { - this.gl = gl; // Save GL Instance - this.hasColor = hasColor; // Save Color Flag - this.hasTexCoords = hasTexCoords; // Save Texture Coords Flag - this.hasNormals = hasNormals; // Save Normals Flag - this.positionCnt = use3D ? POSITION_CNT_3D : POSITION_CNT_2D; // Set Position Component Count - this.vertexStride = this.positionCnt + (hasColor ? COLOR_CNT : 0) + (hasTexCoords ? TEXCOORD_CNT : 0) + (hasNormals ? NORMAL_CNT : 0); // Calculate Vertex Stride - this.vertexSize = this.vertexStride * 4; // Calculate Vertex Byte Size - - ByteBuffer buffer = ByteBuffer.allocateDirect(maxVertices * vertexSize); // Allocate Buffer for Vertices (Max) - buffer.order(ByteOrder.nativeOrder()); // Set Native Byte Order - this.vertices = buffer.asIntBuffer(); // Save Vertex Buffer - - if (maxIndices > 0) { // IF Indices Required - buffer = ByteBuffer.allocateDirect(maxIndices * INDEX_SIZE); // Allocate Buffer for Indices (MAX) - buffer.order(ByteOrder.nativeOrder()); // Set Native Byte Order - this.indices = buffer.asShortBuffer(); // Save Index Buffer - } else // ELSE Indices Not Required - indices = null; // No Index Buffer - - numVertices = 0; // Zero Vertices in Buffer - numIndices = 0; // Zero Indices in Buffer - - this.tmpBuffer = new int[maxVertices * vertexSize / 4]; // Create Temp Buffer - } - - //--Set Vertices--// - // D: set the specified vertices in the vertex buffer - // NOTE: optimized to use integer buffer! - // A: vertices - array of vertices (floats) to set - // offset - offset to first vertex in array - // length - number of floats in the vertex array (total) - // for easy setting use: vtx_cnt * (this.vertexSize / 4) - // R: [none] - public void setVertices(float[] vertices, int offset, int length) { - this.vertices.clear(); // Remove Existing Vertices - int last = offset + length; // Calculate Last Element - for (int i = offset, j = 0; i < last; i++, j++) // FOR Each Specified Vertex - tmpBuffer[j] = Float.floatToRawIntBits(vertices[i]); // Set Vertex as Raw Integer Bits in Buffer - this.vertices.put(tmpBuffer, 0, length); // Set New Vertices - this.vertices.flip(); // Flip Vertex Buffer - this.numVertices = length / this.vertexStride; // Save Number of Vertices - //this.numVertices = length / ( this.vertexSize / 4 ); // Save Number of Vertices - } - - //--Set Indices--// - // D: set the specified indices in the index buffer - // A: indices - array of indices (shorts) to set - // offset - offset to first index in array - // length - number of indices in array (from offset) - // R: [none] - public void setIndices(short[] indices, int offset, int length) { - this.indices.clear(); // Clear Existing Indices - this.indices.put(indices, offset, length); // Set New Indices - this.indices.flip(); // Flip Index Buffer - this.numIndices = length; // Save Number of Indices - } - - //--Bind--// - // D: perform all required binding/state changes before rendering batches. - // USAGE: call once before calling draw() multiple times for this buffer. - // A: [none] - // R: [none] - public void bind() { - gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // Enable Position in Vertices - vertices.position(0); // Set Vertex Buffer to Position - gl.glVertexPointer(positionCnt, GL10.GL_FLOAT, vertexSize, vertices); // Set Vertex Pointer - - if (hasColor) { // IF Vertices Have Color - gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // Enable Color in Vertices - vertices.position(positionCnt); // Set Vertex Buffer to Color - gl.glColorPointer(COLOR_CNT, GL10.GL_FLOAT, vertexSize, vertices); // Set Color Pointer - } - - if (hasTexCoords) { // IF Vertices Have Texture Coords - gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable Texture Coords in Vertices - vertices.position(positionCnt + (hasColor ? COLOR_CNT : 0)); // Set Vertex Buffer to Texture Coords (NOTE: position based on whether color is also specified) - gl.glTexCoordPointer(TEXCOORD_CNT, GL10.GL_FLOAT, vertexSize, vertices); // Set Texture Coords Pointer - } - - if (hasNormals) { - gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); // Enable Normals in Vertices - vertices.position(positionCnt + (hasColor ? COLOR_CNT : 0) + (hasTexCoords ? TEXCOORD_CNT : 0)); // Set Vertex Buffer to Normals (NOTE: position based on whether color/texcoords is also specified) - gl.glNormalPointer(GL10.GL_FLOAT, vertexSize, vertices); // Set Normals Pointer - } - } - - //--Draw--// - // D: draw the currently bound vertices in the vertex/index buffers - // USAGE: can only be called after calling bind() for this buffer. - // A: primitiveType - the type of primitive to draw - // offset - the offset in the vertex/index buffer to start at - // numVertices - the number of vertices (indices) to draw - // R: [none] - public void draw(int primitiveType, int offset, int numVertices) { - if (indices != null) { // IF Indices Exist - indices.position(offset); // Set Index Buffer to Specified Offset - gl.glDrawElements(primitiveType, numVertices, GL10.GL_UNSIGNED_SHORT, indices); // Draw Indexed - } else { // ELSE No Indices Exist - gl.glDrawArrays(primitiveType, offset, numVertices); // Draw Direct (Array) - } - } - - //--Unbind--// - // D: clear binding states when done rendering batches. - // USAGE: call once before calling draw() multiple times for this buffer. - // A: [none] - // R: [none] - public void unbind() { - if (hasColor) // IF Vertices Have Color - gl.glDisableClientState(GL10.GL_COLOR_ARRAY); // Clear Color State - - if (hasTexCoords) // IF Vertices Have Texture Coords - gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Clear Texture Coords State - - if (hasNormals) // IF Vertices Have Normals - gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); // Clear Normals State - } - - //--Draw Full--// - // D: draw the vertices in the vertex/index buffers - // NOTE: unoptimized version! use bind()/draw()/unbind() for batches - // A: primitiveType - the type of primitive to draw - // offset - the offset in the vertex/index buffer to start at - // numVertices - the number of vertices (indices) to draw - // R: [none] - public void drawFull(int primitiveType, int offset, int numVertices) { - gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // Enable Position in Vertices - vertices.position(0); // Set Vertex Buffer to Position - gl.glVertexPointer(positionCnt, GL10.GL_FLOAT, vertexSize, vertices); // Set Vertex Pointer - - if (hasColor) { // IF Vertices Have Color - gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // Enable Color in Vertices - vertices.position(positionCnt); // Set Vertex Buffer to Color - gl.glColorPointer(COLOR_CNT, GL10.GL_FLOAT, vertexSize, vertices); // Set Color Pointer - } - - if (hasTexCoords) { // IF Vertices Have Texture Coords - gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable Texture Coords in Vertices - vertices.position(positionCnt + (hasColor ? COLOR_CNT : 0)); // Set Vertex Buffer to Texture Coords (NOTE: position based on whether color is also specified) - gl.glTexCoordPointer(TEXCOORD_CNT, GL10.GL_FLOAT, vertexSize, vertices); // Set Texture Coords Pointer - } - - if (indices != null) { // IF Indices Exist - indices.position(offset); // Set Index Buffer to Specified Offset - gl.glDrawElements(primitiveType, numVertices, GL10.GL_UNSIGNED_SHORT, indices); // Draw Indexed - } else { // ELSE No Indices Exist - gl.glDrawArrays(primitiveType, offset, numVertices); // Draw Direct (Array) - } - - if (hasTexCoords) // IF Vertices Have Texture Coords - gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Clear Texture Coords State - - if (hasColor) // IF Vertices Have Color - gl.glDisableClientState(GL10.GL_COLOR_ARRAY); // Clear Color State - } - - //--Set Vertex Elements--// - // D: use these methods to alter the values (position, color, textcoords, normals) for vertices - // WARNING: these do NOT validate any values, ensure that the index AND specified - // elements EXIST before using!! - // A: x, y, z - the x,y,z position to set in buffer - // r, g, b, a - the r,g,b,a color to set in buffer - // u, v - the u,v texture coords to set in buffer - // nx, ny, nz - the x,y,z normal to set in buffer - // R: [none] - void setVtxPosition(int vtxIdx, float x, float y) { - int index = vtxIdx * vertexStride; // Calculate Actual Index - vertices.put(index + 0, Float.floatToRawIntBits(x)); // Set X - vertices.put(index + 1, Float.floatToRawIntBits(y)); // Set Y - } - - void setVtxPosition(int vtxIdx, float x, float y, float z) { - int index = vtxIdx * vertexStride; // Calculate Actual Index - vertices.put(index + 0, Float.floatToRawIntBits(x)); // Set X - vertices.put(index + 1, Float.floatToRawIntBits(y)); // Set Y - vertices.put(index + 2, Float.floatToRawIntBits(z)); // Set Z - } - - void setVtxColor(int vtxIdx, float r, float g, float b, float a) { - int index = (vtxIdx * vertexStride) + positionCnt; // Calculate Actual Index - vertices.put(index + 0, Float.floatToRawIntBits(r)); // Set Red - vertices.put(index + 1, Float.floatToRawIntBits(g)); // Set Green - vertices.put(index + 2, Float.floatToRawIntBits(b)); // Set Blue - vertices.put(index + 3, Float.floatToRawIntBits(a)); // Set Alpha - } - - void setVtxColor(int vtxIdx, float r, float g, float b) { - int index = (vtxIdx * vertexStride) + positionCnt; // Calculate Actual Index - vertices.put(index + 0, Float.floatToRawIntBits(r)); // Set Red - vertices.put(index + 1, Float.floatToRawIntBits(g)); // Set Green - vertices.put(index + 2, Float.floatToRawIntBits(b)); // Set Blue - } - - void setVtxColor(int vtxIdx, float a) { - int index = (vtxIdx * vertexStride) + positionCnt; // Calculate Actual Index - vertices.put(index + 3, Float.floatToRawIntBits(a)); // Set Alpha - } - - void setVtxTexCoords(int vtxIdx, float u, float v) { - int index = (vtxIdx * vertexStride) + positionCnt + (hasColor ? COLOR_CNT : 0); // Calculate Actual Index - vertices.put(index + 0, Float.floatToRawIntBits(u)); // Set U - vertices.put(index + 1, Float.floatToRawIntBits(v)); // Set V - } - - void setVtxNormal(int vtxIdx, float x, float y, float z) { - int index = (vtxIdx * vertexStride) + positionCnt + (hasColor ? COLOR_CNT : 0) + (hasTexCoords ? TEXCOORD_CNT : 0); // Calculate Actual Index - vertices.put(index + 0, Float.floatToRawIntBits(x)); // Set X - vertices.put(index + 1, Float.floatToRawIntBits(y)); // Set Y - vertices.put(index + 2, Float.floatToRawIntBits(z)); // Set Z - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/XyFunction.java b/app/src/main/java/org/solovyev/android/calculator/plot/XyFunction.java deleted file mode 100644 index 227d1e35..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/XyFunction.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -import jscl.math.Generic; -import jscl.math.function.Constant; -import org.solovyev.common.text.Strings; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class XyFunction implements FunctionEvaluator { - - /* - ********************************************************************** - * - * FIELDS - * - ********************************************************************** - */ - - @Nonnull - private final String id; - @Nonnull - private final FunctionEvaluator evaluator; - @Nonnull - private Generic expression; - @Nonnull - private String expressionString; - @Nullable - private Constant xVariable; - @Nullable - private String xVariableName; - @Nullable - private Constant yVariable; - private boolean imag; - @Nullable - private String yVariableName; - private int arity; - - public XyFunction(@Nonnull Generic expression, - @Nullable Constant xVariable, - @Nullable Constant yVariable, - boolean imag) { - this.expression = expression; - this.xVariable = xVariable; - this.yVariable = yVariable; - this.imag = imag; - - if (imag) { - this.expressionString = "Im(" + expression.toString() + ")"; - this.evaluator = new ImaginaryEvaluator(this); - } else { - this.expressionString = expression.toString(); - this.evaluator = new RealEvaluator(this); - } - this.xVariableName = xVariable == null ? null : xVariable.getName(); - this.yVariableName = yVariable == null ? null : yVariable.getName(); - - this.arity = 2; - if (this.yVariableName == null) { - this.arity--; - } - if (this.xVariableName == null) { - this.arity--; - } - - this.id = this.expressionString + "_" + Strings.getNotEmpty(this.xVariableName, "") + "_" + Strings.getNotEmpty(this.yVariableName, ""); - - } - - public boolean isImag() { - return imag; - } - - @Override - public int getArity() { - return arity; - } - - @Override - public double eval() { - return evaluator.eval(); - } - - @Override - public double eval(double x) { - return evaluator.eval(x); - } - - @Override - public double eval(double x, double y) { - return evaluator.eval(x, y); - } - - @Nonnull - public Generic getExpression() { - return expression; - } - - @Nullable - public Constant getXVariable() { - return xVariable; - } - - @Nullable - public Constant getYVariable() { - return yVariable; - } - - @Nonnull - public String getExpressionString() { - return expressionString; - } - - @Nonnull - public String getId() { - return id; - } - - @Nullable - public String getXVariableName() { - return xVariableName; - } - - @Nullable - public String getYVariableName() { - return yVariableName; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof XyFunction)) return false; - - final XyFunction that = (XyFunction) o; - - return id.equals(that.id); - - } - - @Override - public int hashCode() { - return id.hashCode(); - } - - /* - ********************************************************************** - * - * STATIC - * - ********************************************************************** - */ - - private static abstract class AbstractEvaluator implements FunctionEvaluator { - - @Nonnull - protected final XyFunction xyFunction; - - @Nullable - private Double constant = null; - - public AbstractEvaluator(@Nonnull XyFunction xyFunction) { - this.xyFunction = xyFunction; - } - - @Override - public final double eval() { - if (constant == null) { - constant = eval0(); - } - return constant; - } - - protected abstract double eval0(); - - @Override - public final int getArity() { - return xyFunction.getArity(); - } - - } - - private static class RealEvaluator extends AbstractEvaluator { - - private RealEvaluator(@Nonnull XyFunction xyFunction) { - super(xyFunction); - } - - @Override - public double eval0() { - return PlotUtils.calculatorExpression(xyFunction.expression).realPart(); - } - - @Override - public double eval(double x) { - return PlotUtils.calculatorExpression(xyFunction.expression, xyFunction.xVariable, x).realPart(); - } - - @Override - public double eval(double x, double y) { - return PlotUtils.calculatorExpression(xyFunction.expression, xyFunction.xVariable, x, xyFunction.yVariable, y).realPart(); - } - } - - private static class ImaginaryEvaluator extends AbstractEvaluator { - - private ImaginaryEvaluator(@Nonnull XyFunction xyFunction) { - super(xyFunction); - } - - @Override - public double eval0() { - return PlotUtils.calculatorExpression(xyFunction.expression).imaginaryPart(); - } - - @Override - public double eval(double x) { - return PlotUtils.calculatorExpression(xyFunction.expression, xyFunction.xVariable, x).imaginaryPart(); - } - - @Override - public double eval(double x, double y) { - return PlotUtils.calculatorExpression(xyFunction.expression, xyFunction.xVariable, x, xyFunction.yVariable, y).imaginaryPart(); - } - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/plot/ZoomTracker.java b/app/src/main/java/org/solovyev/android/calculator/plot/ZoomTracker.java deleted file mode 100755 index 6bdd4a27..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/plot/ZoomTracker.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * 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. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.plot; - -class ZoomTracker { - - public static final String TAG = "ZoomTracker"; - private static final float EPS = 1.5f; - private static final float MIN_DISTANCE = distance(0f, 50f); - float xValue; - float yValue; - private float initialXDistance; - private float initialYDistance; - private float initialXValue; - private float initialYValue; - - private static float distance(float x1, float x2) { - final float dx = x1 - x2; - return dx * dx; - } - - void start(float xValue, float yValue, - float x1, float y1, - float x2, float y2) { - - initialXDistance = distance(x1, x2); - initialYDistance = distance(y1, y2); - - initialXValue = xValue; - initialYValue = yValue; - - this.xValue = xValue; - this.yValue = yValue; - } - - boolean update(float x1, float y1, float x2, float y2) { - boolean result = false; - - if (initialXDistance > MIN_DISTANCE) { - final float xDistance = distance(x1, x2); - if (xDistance > EPS) { - xValue = initialXDistance / xDistance * initialXValue; - result = true; - } - } - - if (initialYDistance > MIN_DISTANCE) { - final float yDistance = distance(y1, y2); - if (yDistance > EPS) { - yValue = initialYDistance / yDistance * initialYValue; - result = true; - } - } - - return result; - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/release/ReleaseNotes.java b/app/src/main/java/org/solovyev/android/calculator/release/ReleaseNotes.java index b6c26212..b4c9616b 100644 --- a/app/src/main/java/org/solovyev/android/calculator/release/ReleaseNotes.java +++ b/app/src/main/java/org/solovyev/android/calculator/release/ReleaseNotes.java @@ -1,19 +1,16 @@ package org.solovyev.android.calculator.release; import android.content.Context; - +import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.CalculatorApplication; import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.about.TextHelper; import org.solovyev.common.text.Strings; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nonnull; - -import static org.solovyev.android.Android.getAppVersionCode; - public final class ReleaseNotes { @Nonnull @@ -26,7 +23,7 @@ public final class ReleaseNotes { final StringBuilder result = new StringBuilder(); final String releaseNotesForTitle = context.getString(R.string.c_release_notes_for_title); - final int currentVersionCode = getAppVersionCode(context); + final int currentVersionCode = App.getAppVersionCode(context); final TextHelper textHelper = new TextHelper(context.getResources(), CalculatorApplication.class.getPackage().getName()); @@ -53,7 +50,7 @@ public final class ReleaseNotes { public static List getReleaseNotesVersions(@Nonnull Context context, int minVersion) { final List releaseNotes = new ArrayList<>(); - final int currentVersionCode = getAppVersionCode(context); + final int currentVersionCode = App.getAppVersionCode(context); final TextHelper textHelper = new TextHelper(context.getResources(), CalculatorApplication.class.getPackage().getName()); for (int versionCode = currentVersionCode; versionCode >= minVersion; versionCode--) { @@ -70,7 +67,7 @@ public final class ReleaseNotes { } public static boolean hasReleaseNotes(@Nonnull Context context, int minVersion) { - final int currentVersionCode = getAppVersionCode(context); + final int currentVersionCode = App.getAppVersionCode(context); final TextHelper textHelper = new TextHelper(context.getResources(), CalculatorApplication.class.getPackage().getName()); for (int versionCode = currentVersionCode; versionCode >= minVersion; versionCode--) { diff --git a/app/src/main/java/org/solovyev/android/calculator/variables/EditVariableFragment.java b/app/src/main/java/org/solovyev/android/calculator/variables/EditVariableFragment.java index ed19f7a4..d5cd6212 100644 --- a/app/src/main/java/org/solovyev/android/calculator/variables/EditVariableFragment.java +++ b/app/src/main/java/org/solovyev/android/calculator/variables/EditVariableFragment.java @@ -45,7 +45,6 @@ import butterknife.Bind; import butterknife.ButterKnife; import dagger.Lazy; import jscl.math.function.IConstant; -import org.solovyev.android.Activities; import org.solovyev.android.Check; import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.entities.EntityRemovalDialog; @@ -125,7 +124,7 @@ public class EditVariableFragment extends BaseDialogFragment implements View.OnF public static void showDialog(@Nullable CppVariable variable, @Nonnull Context context) { if (!(context instanceof VariablesActivity)) { final Intent intent = new Intent(context, VariablesActivity.getClass(context)); - Activities.addIntentFlags(intent, false, context); + App.addIntentFlags(intent, false, context); intent.putExtra(VariablesActivity.EXTRA_VARIABLE, variable); context.startActivity(intent); } else { diff --git a/app/src/main/java/org/solovyev/android/calculator/variables/GreekFloatingKeyboard.java b/app/src/main/java/org/solovyev/android/calculator/variables/GreekFloatingKeyboard.java index a84eae6e..968d0692 100644 --- a/app/src/main/java/org/solovyev/android/calculator/variables/GreekFloatingKeyboard.java +++ b/app/src/main/java/org/solovyev/android/calculator/variables/GreekFloatingKeyboard.java @@ -8,7 +8,7 @@ import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; -import org.solovyev.android.Views; +import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.keyboard.BaseFloatingKeyboard; import org.solovyev.android.calculator.view.EditTextLongClickEraser; @@ -145,7 +145,7 @@ public class GreekFloatingKeyboard extends BaseFloatingKeyboard implements View. private void changeCase(@NonNull Button button) { final boolean upperCase = button.getText().equals("↑"); - Views.processViewsOfType(user.getKeyboard(), Button.class, new Views.ViewProcessor