diff --git a/.gitattributes b/.gitattributes
index bdc4e59c4..f6fe0d63d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -41,9 +41,6 @@ misc/update_config_scripts eol=lf
*.rc eol=crlf
*.bat eol=crlf
-# Android Studio special support file (Windows .bat file)
-ide/AndroidStudio3/gradlew.rename_to_bat eol=crlf
-
# binary files
*.ico binary
diff --git a/CMake/Android/AndroidManifest.xml.in b/CMake/Android/AndroidManifest.xml.in
deleted file mode 100644
index 4e5c6154b..000000000
--- a/CMake/Android/AndroidManifest.xml.in
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/CMake/Android/CMakeList.txt.in b/CMake/Android/CMakeList.txt.in
deleted file mode 100644
index 7c7aeb1fa..000000000
--- a/CMake/Android/CMakeList.txt.in
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# Copyright (C) The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Modified to be a template for Android builds in FLTK
-# Copyright 2019 Matthias Melcher and others
-#
-
-cmake_minimum_required(VERSION 3.4.1)
-
-set(FLTK_DIR "@ANDROID_FLTK_DIR@")
-set(FLTK_IDE_DIR "../../../..")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-
-
-# FIXME: this includes the entire CMakeLists again, creating an entire library
-# build in every target
-# TODO: create separate targets for all fltk libraries that can be easily
-# linked by all app targets
-add_subdirectory("${FLTK_DIR}/" "${CMAKE_CURRENT_BINARY_DIR}/lib" EXCLUDE_FROM_ALL)
-
-# run Fluid build steps for every .fl file, if any
-@ANDROID_FLUID_COMMANDS@
-# now build app's shared lib
-add_library(
- test_@ANDROID_APP_NAME@ SHARED
-@ANDROID_APP_SOURCES@)
-
-target_include_directories(
- test_@ANDROID_APP_NAME@ PRIVATE
- ${FLTK_DIR}/
- ${FLTK_IDE_DIR}/ )
-
-# Export ANativeActivity_onCreate()
-# Refer to: https://github.com/android-ndk/ndk/issues/381.
-set(CMAKE_SHARED_LINKER_FLAGS
- "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
-
-# add lib dependencies
-# FIXME: apps may depend on additional fltk libraries; thise dependencies
-# must be created in the CREATE_ANDROID_IDE_FOR_TEST macro
-target_link_libraries(
- test_@ANDROID_APP_NAME@
- fltk
- android
- log
- m
-)
-
diff --git a/CMake/Android/HelloAndroid.cxx.in b/CMake/Android/HelloAndroid.cxx.in
deleted file mode 100644
index edba702e9..000000000
--- a/CMake/Android/HelloAndroid.cxx.in
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-
-#include "../../../test/@ANDROID_APP_NAME@.cxx"
-
-
-/*
-
- Missing:
- - screen scale and size: most desktop apps expect to be in a draggable window
- on a larger desktop surface. For Android, there is usually no desktop, and
- screen resolution is often very high, so that a regular FLTK window would
- hide as a tiny gray spot in the top left corner
- * windows should probably be centered by default
- ? the screen resolution should adapt to the first opened window
- ? we should be able to hint at a prefered screen resolution
- * drawing call must scale at some point (line width!)
- * rotating the screen must call the app handler and(?) window resize
- * proportions: pixels should be square
- Need Work:
- - Fl_Android_Graphics_Driver::pie(int) needs refactoring
- - ...::line(...) has round ing issues (see rounded box type)
- - grab() not working when leaving window (adjuster...)
- - scrolling if implemented as a complete redraw. Must implement real scrolling
- - the 'hotspot' idea to position dialogs under the mouse cursor makes little sense on touch screen devices
- - fix screen when keyboard pops up in front of the text cursor or input field (temporarily shift up?)
- - ending 'message' will not quit the app right away, but wait for some timeout
- - no support for dead-key entry
- - no Shift-Tab
-
- * test/CubeMain.cxx : UNSUPPORTED - needs OpenGL
- * test/CubeView.cxx : UNSUPPORTED - needs OpenGL
- * test/shape.cxx : UNSUPPORTED - needs OpenGL
- * test/cube.cxx : UNSUPPORTED - needs OpenGL
- * test/fractals.cxx : UNSUPPORTED - needs OpenGL
- * test/fracviewer.cxx : UNSUPPORTED - needs OpenGL
- * test/fullscreen.cxx : UNSUPPORTED - needs OpenGL
- * test/gl_overlay.cxx : UNSUPPORTED - needs OpenGL
- * test/glpuzzle.cxx : UNSUPPORTED - needs OpenGL
- * test/mandelbrot.cxx : UNSUPPORTED - needs Fluid
- * test/keyboard.cxx : UNSUPPORTED - needs Fluid
- * test/CubeViewUI.fl
- * test/keyboard_ui.fl
- * test/radio.fl
- * test/tree.fl
- * test/fast_slow.fl
- * test/mandelbrot_ui.fl
- * test/resize.fl
- * test/valuators.fl
- * test/inactive.fl
- * test/preferences.fl
- * test/tabs.fl
- * test/cairo_test.cxx : UNSUPPORTED - needs Cairo
- * test/tiled_image.cxx : UNSUPPORTED - X11 only
- * test/forms.cxx : UNSUPPORTED - needs Forms
-
- * test/doublebuffer.cxx : FIXME - redering is completely wrong
- * test/line_style.cxx : TODO - no line styles yet
- * test/list_visuals.cxx : TODO - needs config.h
- * test/threads.cxx : TODO - needs config.h for pthreads
- * test/animated.cxx : TODO - redering errors (alpha channel?)
- * test/native-filechooser.cxx : TODO - not yet implemented
- * test/blocks.cxx : TODO - needs config.h
- * test/offscreen.cxx : TODO - not yet implemented
- * test/overlay.cxx : TODO - no overlay yet
- * test/pixmap_browser.cxx : TODO - filebrowser not yet implemented, no images, no printer
- * test/clock.cxx : TODO - no system clock call yet
- * test/resizebox.cxx : TODO - no window manager yet
- * test/rotated_text.cxx : TODO - no rotated text
- * test/subwindow.cxx : TODO - no subwindows yet
- * test/sudoku.cxx : TODO - sound support is in our way
- * test/demo.cxx : TODO - fails to open window, but is is useful at all?
- * test/device.cxx : TODO - printing support
- * test/tile.cxx : TODO - subwindow support
- * test/editor.cxx : TODO - file chooser missing
- * test/file_chooser.cxx : TODO - file chooser missing
- * test/fonts.cxx : TODO - works, but does not list system fonts or resource fonts
- * test/help_dialog.cxx : TODO - not implemented
- * test/icon.cxx : TODO - what does this do on Android?
- * test/iconize.cxx : TODO - no window manager
- * test/utf8.cxx : TODO - window manager, clipping
- * test/windowfocus.cxx : TODO - what does this do?
- * test/browser.cxx : TODO - needs text resource to load browser content
- * test/unittests.cxx : TODO - crashing, no alpha in image drawing, clipping issues
-
- * test/image.cxx : + works
- * test/twowin.cxx : + works
- * test/table.cxx : + works, but window is much too large for mobile device
- * test/cursor.cxx : + works, but no cursor on Android
- * test/colbrowser.cxx : + works
- * test/checkers.cxx : + works
- * test/pixmap.cxx : + works
- * test/navigation.cxx : + works
- * test/curve.cxx : + works
- * test/input_choice.cxx : + works
- * test/input.cxx : + works
- * test/scroll.cxx : - works ok
- - some dirt when a popup draws over another menu button!?
- - on touch-screens, menuitem should be selected when released
- - on touch-screens, scroll groups should scroll on multitouch, or when not causing any other action
- * test/bitmap.cxx : + 'bitmap' works
- * test/message.cxx : - 'message' mostly works
- - when ending the app, it will not close right away but instead hang around for a few seconds
- * test/menubar.cxx : - 'menubar' mostly works including unicode
- ! pressing 'button' will hang the app
- - shortcut modifiers don't work
- - right-click does not work (should this be emulated via click-and-hold?)
- * test/output.cxx : + 'output' works
- * test/ask.cxx : + 'ask' works
- * test/button.cxx : + 'button' works, including beep
- * test/pack.cxx : + 'pack' works
- * test/adjuster.cxx : + 'adjuster' works
- * test/arc.cxx : + 'arc' works as expected
- * test/minimum.cxx : + 'minimum' works
- * test/boxtype.cxx : + 'boxtype' works
- * test/buttons.cxx : + 'buttons' works
- * test/color_chooser.cxx: + 'color_chooser' works
- * test/symbols.cxx : + 'symbols' working as expected
- * test/hello.cxx : + 'hello' works fine, italics, shadow, etc.
- * test/label.cxx : + 'label' works
-
- */
diff --git a/CMake/Android/Roboto-Regular.ttf b/CMake/Android/Roboto-Regular.ttf
deleted file mode 100644
index 88dae907b..000000000
Binary files a/CMake/Android/Roboto-Regular.ttf and /dev/null differ
diff --git a/CMake/Android/app.build.gradle.in b/CMake/Android/app.build.gradle.in
deleted file mode 100644
index 9e579a4c7..000000000
--- a/CMake/Android/app.build.gradle.in
+++ /dev/null
@@ -1,26 +0,0 @@
-apply plugin: 'com.android.application'
-
- android {
- compileSdkVersion 25
-
- defaultConfig {
- applicationId 'org.fltk.@ANDROID_APP_NAME@'
- minSdkVersion 14
- targetSdkVersion 25
- externalNativeBuild {
- cmake {
- arguments '-DANDROID_STL=c++_shared'
- }
- }
- }
- buildTypes {
- release {
- minifyEnabled false
- }
- }
- externalNativeBuild {
- cmake {
- path 'src/main/cpp/CMakeLists.txt'
- }
- }
- }
diff --git a/CMake/Android/build.gradle.in b/CMake/Android/build.gradle.in
deleted file mode 100644
index f48a2c6ec..000000000
--- a/CMake/Android/build.gradle.in
+++ /dev/null
@@ -1,17 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-buildscript {
- repositories {
- jcenter()
- google()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
- }
-}
-
-allprojects {
- repositories {
- jcenter()
- google()
- }
-}
diff --git a/CMake/Android/fl_config.cmake.in b/CMake/Android/fl_config.cmake.in
deleted file mode 100644
index 5200197a9..000000000
--- a/CMake/Android/fl_config.cmake.in
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Configuration file for the Fast Light Tool Kit (FLTK).
- *
- * Copyright 1998-2020 by Bill Spitzak and others.
- *
- * This library is free software. Distribution and use rights are outlined in
- * the file "COPYING" which should have been included with this file. If this
- * file is missing or damaged, see the license at:
- *
- * https://www.fltk.org/COPYING.php
- *
- * Please see the following page on how to report bugs and issues:
- *
- * https://www.fltk.org/bugs.php
- */
-
-/*
- ============================================================================
- DO NOT EDIT - This file is generated by CMake !
- ============================================================================
-*/
-
-/* define FL_ABI_VERSION as 10x0y for FLTK ABI version 1.x.y */
-
-/* #undef FL_ABI_VERSION */
diff --git a/CMake/Android/hdpi.ic_launcher.png b/CMake/Android/hdpi.ic_launcher.png
deleted file mode 100755
index 1c28eb22b..000000000
Binary files a/CMake/Android/hdpi.ic_launcher.png and /dev/null differ
diff --git a/CMake/Android/mdpi.ic_launcher.png b/CMake/Android/mdpi.ic_launcher.png
deleted file mode 100755
index 4f12dba6a..000000000
Binary files a/CMake/Android/mdpi.ic_launcher.png and /dev/null differ
diff --git a/CMake/Android/settings.gradle.in b/CMake/Android/settings.gradle.in
deleted file mode 100644
index 8b1378917..000000000
--- a/CMake/Android/settings.gradle.in
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/CMake/Android/strings.xml.in b/CMake/Android/strings.xml.in
deleted file mode 100644
index 351315218..000000000
--- a/CMake/Android/strings.xml.in
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- @ANDROID_APP_NAME@
-
diff --git a/CMake/Android/xhdpi.ic_launcher.png b/CMake/Android/xhdpi.ic_launcher.png
deleted file mode 100755
index aa48b8524..000000000
Binary files a/CMake/Android/xhdpi.ic_launcher.png and /dev/null differ
diff --git a/CMake/Android/xxhdpi.ic_launcher.png b/CMake/Android/xxhdpi.ic_launcher.png
deleted file mode 100755
index 91aad3864..000000000
Binary files a/CMake/Android/xxhdpi.ic_launcher.png and /dev/null differ
diff --git a/CMake/FindSDL2.cmake b/CMake/FindSDL2.cmake
deleted file mode 100644
index 28cb8c603..000000000
--- a/CMake/FindSDL2.cmake
+++ /dev/null
@@ -1,169 +0,0 @@
-
-# This module defines
-# SDL2_LIBRARY, the name of the library to link against
-# SDL2_FOUND, if false, do not try to link to SDL2
-# SDL2_INCLUDE_DIR, where to find SDL.h
-#
-# This module responds to the the flag:
-# SDL2_BUILDING_LIBRARY
-# If this is defined, then no SDL2main will be linked in because
-# only applications need main().
-# Otherwise, it is assumed you are building an application and this
-# module will attempt to locate and set the the proper link flags
-# as part of the returned SDL2_LIBRARY variable.
-#
-# Don't forget to include SDLmain.h and SDLmain.m your project for the
-# OS X framework based version. (Other versions link to -lSDL2main which
-# this module will try to find on your behalf.) Also for OS X, this
-# module will automatically add the -framework Cocoa on your behalf.
-#
-#
-# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
-# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
-# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
-# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
-# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
-# as appropriate. These values are used to generate the final SDL2_LIBRARY
-# variable, but when these values are unset, SDL2_LIBRARY does not get created.
-#
-#
-# $SDL2DIR is an environment variable that would
-# correspond to the ./configure --prefix=$SDL2DIR
-# used in building SDL2.
-# l.e.galup 9-20-02
-#
-# Modified by Eric Wing.
-# Added code to assist with automated building by using environmental variables
-# and providing a more controlled/consistent search behavior.
-# Added new modifications to recognize OS X frameworks and
-# additional Unix paths (FreeBSD, etc).
-# Also corrected the header search path to follow "proper" SDL guidelines.
-# Added a search for SDL2main which is needed by some platforms.
-# Added a search for threads which is needed by some platforms.
-# Added needed compile switches for MinGW.
-#
-# On OSX, this will prefer the Framework version (if found) over others.
-# People will have to manually change the cache values of
-# SDL2_LIBRARY to override this selection or set the CMake environment
-# CMAKE_INCLUDE_PATH to modify the search paths.
-#
-# Note that the header path has changed from SDL2/SDL.h to just SDL.h
-# This needed to change because "proper" SDL convention
-# is #include "SDL.h", not . This is done for portability
-# reasons because not all systems place things in SDL2/ (see FreeBSD).
-
-#=============================================================================
-# Copyright 2003-2009 Kitware, Inc.
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-# License text for the above reference.)
-
-message("")
-
-SET(SDL2_SEARCH_PATHS
- ~/Library/Frameworks
- /Library/Frameworks
- /usr/local
- /usr
- /sw # Fink
- /opt/local # DarwinPorts
- /opt/csw # Blastwave
- /opt
- ${SDL2_PATH}
-)
-
-FIND_PATH(SDL2_INCLUDE_DIR SDL.h
- HINTS
- $ENV{SDL2DIR}
- PATH_SUFFIXES include/SDL2 include
- PATHS ${SDL2_SEARCH_PATHS}
-)
-
-FIND_LIBRARY(SDL2_LIBRARY_TEMP
- NAMES SDL2
- HINTS
- $ENV{SDL2DIR}
- PATH_SUFFIXES lib64 lib
- PATHS ${SDL2_SEARCH_PATHS}
-)
-
-IF(NOT SDL2_BUILDING_LIBRARY)
- IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
- # Non-OS X framework versions expect you to also dynamically link to
- # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
- # seem to provide SDL2main for compatibility even though they don't
- # necessarily need it.
- FIND_LIBRARY(SDL2MAIN_LIBRARY
- NAMES SDL2main
- HINTS
- $ENV{SDL2DIR}
- PATH_SUFFIXES lib64 lib
- PATHS ${SDL2_SEARCH_PATHS}
- )
- ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
-ENDIF(NOT SDL2_BUILDING_LIBRARY)
-
-# SDL2 may require threads on your system.
-# The Apple build may not need an explicit flag because one of the
-# frameworks may already provide it.
-# But for non-OSX systems, I will use the CMake Threads package.
-IF(NOT APPLE)
- FIND_PACKAGE(Threads)
-ENDIF(NOT APPLE)
-
-# MinGW needs an additional library, mwindows
-# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows
-# (Actually on second look, I think it only needs one of the m* libraries.)
-IF(MINGW)
- SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
-ENDIF(MINGW)
-
-IF(SDL2_LIBRARY_TEMP)
- # For SDL2main
- IF(NOT SDL2_BUILDING_LIBRARY)
- IF(SDL2MAIN_LIBRARY)
- SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP})
- ENDIF(SDL2MAIN_LIBRARY)
- ENDIF(NOT SDL2_BUILDING_LIBRARY)
-
- # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
- # CMake doesn't display the -framework Cocoa string in the UI even
- # though it actually is there if I modify a pre-used variable.
- # I think it has something to do with the CACHE STRING.
- # So I use a temporary variable until the end so I can set the
- # "real" variable in one-shot.
- IF(APPLE)
- SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
- ENDIF(APPLE)
-
- # For threads, as mentioned Apple doesn't need this.
- # In fact, there seems to be a problem if I used the Threads package
- # and try using this line, so I'm just skipping it entirely for OS X.
- IF(NOT APPLE)
- SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
- ENDIF(NOT APPLE)
-
- # For MinGW library
- IF(MINGW)
- SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
- ENDIF(MINGW)
-
- # Set the final string here so the GUI reflects the final state.
- SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
- # Set the temp variable to INTERNAL so it is not seen in the CMake GUI
- SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
-ENDIF(SDL2_LIBRARY_TEMP)
-
-message("")
-
-INCLUDE(FindPackageHandleStandardArgs)
-
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
-
diff --git a/CMake/android.cmake b/CMake/android.cmake
deleted file mode 100644
index 9fc78d828..000000000
--- a/CMake/android.cmake
+++ /dev/null
@@ -1,141 +0,0 @@
-#
-# android.cmake to build the FLTK AndroidStudio project using CMake
-# Written by Matthias Melcher
-#
-# Copyright 1998-2019 by Bill Spitzak and others.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# https://www.fltk.org/COPYING.php
-#
-# Please see the following page on how to report bugs and issues:
-#
-# https://www.fltk.org/bugs.php
-#
-
-# all target modules will be added here later
-configure_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/CMake/Android/settings.gradle.in"
- "${CMAKE_CURRENT_BINARY_DIR}/AndroidStudio/settings.gradle"
- @ONLY
-)
-
-# configuration file for all modules
-configure_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/CMake/Android/build.gradle.in"
- "${CMAKE_CURRENT_BINARY_DIR}/AndroidStudio/build.gradle"
- @ONLY
-)
-
-# create a custom abi file for this setup
-configure_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/fl_config.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/AndroidStudio/FL/fl_config.h"
- @ONLY
-)
-
-# TODO: where should we create config.h?
-
-macro(CREATE_ANDROID_IDE_FOR_TEST NAME SOURCES LIBRARIES)
-
- # message(STATUS "Creating Android IDE for ${NAME}")
-
- set (ANDROID_APP_NAME ${NAME})
- set (ANDROID_FLTK_DIR ${CMAKE_SOURCE_DIR})
-
- set (srcs)
- set (ANDROID_APP_SOURCES)
- set (ANDROID_FLUID_COMMANDS)
- set (flsrcs) # fluid source files
- foreach(src ${SOURCES})
- if ("${src}" MATCHES "\\.fl$")
- list(APPEND flsrcs ${src})
- string(REGEX REPLACE "(.*).fl" \\1 basename ${src})
- string(APPEND ANDROID_FLUID_COMMANDS
- "add_custom_command(\n"
- " OUTPUT \"\${FLTK_DIR}/test/${basename}.cxx\" \"\${FLTK_DIR}/test/${basename}.h\"\n"
- " COMMAND fluid -c \"${src}\"\n"
- " WORKING_DIRECTORY \"\${FLTK_DIR}/test\"\n"
- " DEPENDS \"\${FLTK_DIR}/test/${src}\"\n"
- " MAIN_DEPENDENCY \"\${FLTK_DIR}/test/${src}\"\n"
- ")\n\n"
- )
- file(TOUCH "${basename}.cxx")
- file(TOUCH "${basename}.h")
- file(TOUCH "${basename}.fl")
- set(src_cxx ${basename}.cxx)
- else ()
- list(APPEND srcs ${src})
- set(src_cxx ${src})
- endif ("${src}" MATCHES "\\.fl$")
- string(APPEND ANDROID_APP_SOURCES " \"\${FLTK_DIR}/test/${src_cxx}\"\n")
- endforeach(src)
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/app.build.gradle.in"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/build.gradle"
- @ONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/AndroidManifest.xml.in"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/AndroidManifest.xml"
- @ONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/Roboto-Regular.ttf"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/assets/fonts/Roboto-Regular.ttf"
- COPYONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/mdpi.ic_launcher.png"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/res/mipmap-mdpi/ic_launcher.png"
- COPYONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/hdpi.ic_launcher.png"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/res/mipmap-hdpi/ic_launcher.png"
- COPYONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/xhdpi.ic_launcher.png"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/res/mipmap-xhdpi/ic_launcher.png"
- COPYONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/xxhdpi.ic_launcher.png"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/res/mipmap-xxhdpi/ic_launcher.png"
- COPYONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/strings.xml.in"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/res/values/strings.xml"
- @ONLY
- )
-
- configure_file(
- "${CMAKE_SOURCE_DIR}/CMake/Android/CMakeList.txt.in"
- "${CMAKE_BINARY_DIR}/AndroidStudio/${ANDROID_APP_NAME}/src/main/cpp/CMakeLists.txt"
- @ONLY
- )
-
- file(APPEND "${CMAKE_BINARY_DIR}/AndroidStudio/settings.gradle" "include ':${ANDROID_APP_NAME}'\n")
-
-endmacro(CREATE_ANDROID_IDE_FOR_TEST NAME SOURCES LIBRARIES)
-
-
-macro(CREATE_ANDROID_IDE_WRAPUP)
-
- # message(STATUS "Wrapping up Android IDE creation")
-
-endmacro(CREATE_ANDROID_IDE_WRAPUP)
-
-
diff --git a/CMake/fl_create_example.cmake b/CMake/fl_create_example.cmake
index c2db54e30..09c99ec44 100644
--- a/CMake/fl_create_example.cmake
+++ b/CMake/fl_create_example.cmake
@@ -46,8 +46,7 @@
# quotes if more than one library is required, e.g. "fltk_gl;fltk"
#
# CREATE_EXAMPLE can have an optional fourth argument with a list of options
-# - the option ANDROID_OK is set if CREATE_EXAMPLE creates code for Android
-# builds in addition to the native build
+# - these options are currently not used
#
################################################################################
@@ -62,11 +61,11 @@ macro (CREATE_EXAMPLE NAME SOURCES LIBRARIES)
# create macOS bundle? 0 = no, 1 = yes
- if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+ if (APPLE AND (NOT OPTION_APPLE_X11))
set (MAC_BUNDLE 1)
else ()
set (MAC_BUNDLE 0)
- endif (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+ endif (APPLE AND (NOT OPTION_APPLE_X11))
# rename target name "help" (reserved since CMake 2.8.12)
# FIXME: not necessary in FLTK 1.4 but left for compatibility (06/2020)
@@ -164,15 +163,17 @@ macro (CREATE_EXAMPLE NAME SOURCES LIBRARIES)
endif (MAC_BUNDLE)
######################################################################
- # Parse optional fourth argument "ANDROID_OK", see description above.
+ # Parse optional fourth argument, see description above.
######################################################################
- if (${ARGC} GREATER 3)
- foreach (OPTION ${ARGV3})
- if (${OPTION} STREQUAL "ANDROID_OK" AND OPTION_CREATE_ANDROID_STUDIO_IDE)
- CREATE_ANDROID_IDE_FOR_TEST (${NAME} ${SOURCES} ${LIBRARIES})
- endif ()
- endforeach ()
- endif ()
+ # code left commented out as an example
+
+ # *unused* # if (${ARGC} GREATER 3)
+ # *unused* # foreach (OPTION ${ARGV3})
+ # *unused* # if (${OPTION} STREQUAL "xxx")
+ # *unused* # # do something ...
+ # *unused* # endif ()
+ # *unused* # endforeach ()
+ # *unused* # endif ()
endmacro (CREATE_EXAMPLE NAME SOURCES LIBRARIES)
diff --git a/CMake/options.cmake b/CMake/options.cmake
index f1e347fbc..eb8f1fe92 100644
--- a/CMake/options.cmake
+++ b/CMake/options.cmake
@@ -65,7 +65,6 @@ endif (WIN32)
#######################################################################
if (APPLE)
option (OPTION_APPLE_X11 "use X11" OFF)
- option (OPTION_APPLE_SDL "use SDL" OFF)
if (CMAKE_OSX_SYSROOT)
list (APPEND FLTK_CFLAGS "-isysroot ${CMAKE_OSX_SYSROOT}")
endif (CMAKE_OSX_SYSROOT)
@@ -100,14 +99,6 @@ if (OPTION_APPLE_X11)
endif (X11_INCLUDE_DIR)
endif (OPTION_APPLE_X11)
-if (OPTION_APPLE_SDL)
- find_package (SDL2 REQUIRED)
- if (SDL2_FOUND)
- set (USE_SDL 1)
- list (APPEND FLTK_LDLIBS SDL2_LIBRARY)
- endif (SDL2_FOUND)
-endif (OPTION_APPLE_SDL)
-
#######################################################################
option (OPTION_USE_POLL "use poll if available" OFF)
mark_as_advanced (OPTION_USE_POLL)
@@ -238,8 +229,6 @@ if (OPTION_USE_GL)
set (OPENGL_LIBRARIES -L${PATH_TO_XLIBS} -lGLU -lGL)
unset(HAVE_GL_GLU_H CACHE)
find_file (HAVE_GL_GLU_H GL/glu.h PATHS ${X11_INCLUDE_DIR})
- elseif (OPTION_APPLE_SDL)
- set (OPENGL_FOUND FALSE)
else()
include (FindOpenGL)
if (APPLE)
@@ -618,10 +607,6 @@ else ()
endif (OPTION_USE_KDIALOG)
#######################################################################
-#######################################################################
-option (OPTION_CREATE_ANDROID_STUDIO_IDE "create files needed to compile FLTK for Android" OFF)
-#######################################################################
-
#######################################################################
option (CMAKE_SUPPRESS_REGENERATION "suppress rules to re-run CMake on rebuild" OFF)
mark_as_advanced (CMAKE_SUPPRESS_REGENERATION)
diff --git a/CMake/setup.cmake b/CMake/setup.cmake
index 84b3ebda4..e2fd7929f 100644
--- a/CMake/setup.cmake
+++ b/CMake/setup.cmake
@@ -89,9 +89,6 @@ if (APPLE)
if (NOT(${CMAKE_SYSTEM_VERSION} VERSION_LESS 17.0.0)) # a.k.a. macOS version ≥ 10.13
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_HAS_THREAD_API_PTHREAD")
endif (NOT(${CMAKE_SYSTEM_VERSION} VERSION_LESS 17.0.0))
- elseif (OPTION_APPLE_SDL)
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SDL2_INCLUDE_DIRS} -U__APPLE__")
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SDL2_INCLUDE_DIRS} -U__APPLE__")
else ()
set (__APPLE_QUARTZ__ 1)
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Cocoa")
diff --git a/CMake/variables.cmake b/CMake/variables.cmake
index 7ff8a53e1..27672c7d5 100644
--- a/CMake/variables.cmake
+++ b/CMake/variables.cmake
@@ -41,8 +41,6 @@ endif (DEBUG_VARIABLES_CMAKE)
if (WIN32)
list (APPEND FLTK_LDLIBS -lole32 -luuid -lcomctl32 -lws2_32)
-elseif (APPLE AND OPTION_APPLE_SDL)
- # FIXME: do nothing?
elseif (APPLE AND NOT OPTION_APPLE_X11)
list (APPEND FLTK_LDLIBS "-framework Cocoa")
else ()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f472c4e35..eb4e8ecac 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -80,13 +80,6 @@ include (CMake/resources.cmake)
#######################################################################
include (CMake/options.cmake)
-#######################################################################
-# Android Studio setup
-#######################################################################
-if (OPTION_CREATE_ANDROID_STUDIO_IDE)
- include (CMake/android.cmake)
-endif (OPTION_CREATE_ANDROID_STUDIO_IDE)
-
#######################################################################
# print (debug) several build variables and options
#######################################################################
@@ -102,7 +95,6 @@ if (debug_build)
fl_debug_var (MSVC)
fl_debug_var (UNIX)
fl_debug_var (APPLE)
- fl_debug_var (ANDROID)
fl_debug_var (CMAKE_BUILD_TYPE)
fl_debug_var (CMAKE_SIZEOF_VOID_P)
fl_debug_var (OPTION_OPTIM)
@@ -124,9 +116,7 @@ add_subdirectory(src)
# build fluid
#######################################################################
-if (NOT ANDROID)
- add_subdirectory(fluid)
-endif()
+add_subdirectory(fluid)
#######################################################################
# variables shared by export and install
@@ -159,13 +149,6 @@ if (FLTK_BUILD_EXAMPLES)
add_subdirectory (examples)
endif (FLTK_BUILD_EXAMPLES)
-#######################################################################
-# Android Studio wrapup
-#######################################################################
-if (OPTION_CREATE_ANDROID_STUDIO_IDE)
- CREATE_ANDROID_IDE_WRAPUP()
-endif (OPTION_CREATE_ANDROID_STUDIO_IDE)
-
#######################################################################
# installation
#######################################################################
diff --git a/FL/android.H b/FL/android.H
deleted file mode 100644
index f1ad220e1..000000000
--- a/FL/android.H
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// Template header file for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 2016-2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-// Do not directly include this file, instead use .
-
-// These types and variables give access to internal, platform-specific data through the public API.
-// They require to include platform.H (in contrast to types defined in platform_types.h)
-
-#if !defined(FL_PLATFORM_H)
-# error "Never use directly; include instead."
-#endif // !FL_PLATFORM_H
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- This is the function that application code must implement, representing
- the main entry to the app.
- */
-extern int main(int argc, char **argv);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-typedef void *Window; // used by fl_find(), fl_xid() and class Fl_X
-
-/* Reference to the current device context
- For back-compatibility only. The preferred procedure to get this reference is
- Fl_Surface_Device::surface()->driver()->gc().
- */
-extern void *fl_gc;
-
-/**
- These events are specific to the Android OS driver system. They can
- be read by adding a callback via Fl::add_system_handler() and reading Fl::event()
- Don't change the order of these enums! See Fl_Android_Application.H .
- */
-enum Fl_Android_Platform_Event
-{
- FL_ANDROID_EVENTS = 0x00010000,
-
- /**
- * Command from main thread: the AInputQueue has changed. Upon processing
- * this command, android_app->inputQueue will be updated to the new queue
- * (or NULL).
- */
- FL_ANDROID_EVENT_INPUT_CHANGED,
-
- /**
- * Command from main thread: a new ANativeWindow is ready for use. Upon
- * receiving this command, android_app->window will contain the new window
- * surface.
- */
- FL_ANDROID_EVENT_INIT_WINDOW,
-
- /**
- * Command from main thread: the existing ANativeWindow needs to be
- * terminated. Upon receiving this command, android_app->window still
- * contains the existing window; after calling android_app_exec_cmd
- * it will be set to NULL.
- */
- FL_ANDROID_EVENT_TERM_WINDOW,
-
- /**
- * Command from main thread: the current ANativeWindow has been resized.
- * Please redraw with its new size.
- */
- FL_ANDROID_EVENT_WINDOW_RESIZED,
-
- /**
- * Command from main thread: the system needs that the current ANativeWindow
- * be redrawn. You should redraw the window before handing this to
- * android_app_exec_cmd() in order to avoid transient drawing glitches.
- */
- FL_ANDROID_EVENT_WINDOW_REDRAW_NEEDED,
-
- /**
- * Command from main thread: the content area of the window has changed,
- * such as from the soft input window being shown or hidden. You can
- * find the new content rect in android_app::contentRect.
- */
- FL_ANDROID_EVENT_CONTENT_RECT_CHANGED,
-
- /**
- * Command from main thread: the app's activity window has gained
- * input focus.
- */
- FL_ANDROID_EVENT_GAINED_FOCUS,
-
- /**
- * Command from main thread: the app's activity window has lost
- * input focus.
- */
- FL_ANDROID_EVENT_LOST_FOCUS,
-
- /**
- * Command from main thread: the current device configuration has changed.
- */
- FL_ANDROID_EVENT_CONFIG_CHANGED,
-
- /**
- * Command from main thread: the system is running low on memory.
- * Try to reduce your memory use.
- */
- FL_ANDROID_EVENT_LOW_MEMORY,
-
- /**
- * Command from main thread: the app's activity has been started.
- */
- FL_ANDROID_EVENT_START,
-
- /**
- * Command from main thread: the app's activity has been resumed.
- */
- FL_ANDROID_EVENT_RESUME,
-
- /**
- * Command from main thread: the app should generate a new saved state
- * for itself, to restore from later if needed. If you have saved state,
- * allocate it with malloc and place it in android_app.savedState with
- * the size in android_app.savedStateSize. The will be freed for you
- * later.
- */
- FL_ANDROID_EVENT_SAVE_STATE,
-
- /**
- * Command from main thread: the app's activity has been paused.
- */
- FL_ANDROID_EVENT_PAUSE,
-
- /**
- * Command from main thread: the app's activity has been stopped.
- */
- FL_ANDROID_EVENT_STOP,
-
- /**
- * Command from main thread: the app's activity is being destroyed,
- * and waiting for the app thread to clean up and exit before proceeding.
- */
- FL_ANDROID_EVENT_DESTROY
-};
diff --git a/FL/platform.H b/FL/platform.H
index 80c13954f..4e068c2e0 100644
--- a/FL/platform.H
+++ b/FL/platform.H
@@ -37,8 +37,6 @@ class Fl_Window;
# include "win32.H"
# elif defined(__APPLE__)
# include "mac.H"
-# elif defined(__ANDROID__)
-# include "android.H"
# elif defined(FLTK_USE_X11)
# include "x11.H"
# endif // _WIN32
diff --git a/FL/platform_types.h b/FL/platform_types.h
index cafeae0c4..51963d6e4 100644
--- a/FL/platform_types.h
+++ b/FL/platform_types.h
@@ -72,12 +72,6 @@ typedef opaque GLContext; /**< an OpenGL graphics context, into which all OpenGL
typedef intptr_t fl_intptr_t;
typedef uintptr_t fl_uintptr_t;
-#elif defined(__ANDROID__)
-
-#include
-typedef intptr_t fl_intptr_t;
-typedef uintptr_t fl_uintptr_t;
-
#else /* ! _WIN64 */
typedef long fl_intptr_t;
@@ -122,22 +116,6 @@ typedef struct HGLRC__ *GLContext;
struct dirent {char d_name[1];};
#endif
-#elif defined(__ANDROID__)
-
-#ifdef __cplusplus
-typedef class Fl_Rect_Region *Fl_Region;
-#else
-typedef struct Fl_Rect_Region *Fl_Region;
-#endif
-
-// TODO: the types below have not yet been ported
-typedef unsigned long Fl_Offscreen;
-typedef unsigned long Fl_Bitmask;
-typedef int FL_SOCKET;
-typedef struct __GLXcontextRec *GLContext;
-#include
-#include
-
#elif defined(FLTK_USE_X11)
typedef unsigned long Fl_Offscreen;
diff --git a/README.Android.md b/README.Android.md
deleted file mode 100644
index 4dfba17df..000000000
--- a/README.Android.md
+++ /dev/null
@@ -1,80 +0,0 @@
-README.Android.md
-
-# Building and Running FLTK with Android Studio 3
-
-
-WARNING: FLTK FOR ANDROID IS WORK IN PROGRESS IN A PRETTY EARLY STAGE.
-
-
-## Contents
-
-1. Building FLTK with Android Studio 3
-2. Extensions and limitation of FLTK on Android
-3. Document History
-
-
-## Building FLTK with Android Studio 3
-
-There is no need to ever write a single line of Java.
-
-Download and install AndroidStudio on your developer machine. If you use
-AndroidStudio for the first time, use the IDE to download and build the
-"Native Plasm" sample app. In the process, all resources required to build
-FLTK will be installed. Once Native Plasm runs on your emulator or physical
-device, you are ready to install FLTK.
-
-Build FLTK for your native platform first using CMake. AndroidStudio will need a native
-version of the user interface design tool _Fluid_.
-
-The following example is for the _Xcode_ IDE on _macOS_. The same should work for
-other IDEs and Makefiles on other platforms that run _AndroidStudio_.
-
-```bash
-git clone https://github.com/fltk/fltk.git fltk-1.4.git
-cd fltk-1.4.git
-mkdir build
-cd build
-mkdir Xcode
-cd Xcode
-cmake -G "Unix Makefiles" \
- -D OPTION_USE_SYSTEM_LIBJPEG=Off \
- -D OPTION_USE_SYSTEM_ZLIB=Off \
- -D OPTION_USE_SYSTEM_LIBPNG=Off \
- -D OPTION_CREATE_ANDROID_STUDIO_IDE=On \
- ../..
-```
-Note the last option, `-D OPTION_CREATE_ANDROID_STUDIO_IDE=On`. This option will
-create the file needed to create an FLTK demo project in
-`fltk-1.4.git/build/Xcode/AndroidStudio`.
-
-- open the `build/Xcode/AndroidStudio/` directory as a project in AndroidStudio3
-
-- click "run"; the project should compile and run out of the box
-
-
-## Extensions and limitation of FLTK on Android
-
-Android support for FLTK is in an early stage. As of January 2019, most
-rendering works, fonts work, bitmaps and pixmaps work, clipping works, window
-layering works, and mouse clicks and keyboard events are handled
-
-When loading fonts:
- - font names starting with a $ will have the system font path inserted
- - font names starting with an @ will be loaded via the Asset Manager
- - all other names will be used verbatim
-
-Limitations:
- - the screen size is currently fixed to 600x800 and is scaled up
- - many many big and little functions are not yet implemented
-
-
-## Document History
-
-Jan 15 2019 - matt: rewrote document to explain the new CMake process
-Mar 29 2018 - matt: many graphics functions have been implemented, keyboard
-Mar 17 2018 - matt: added Android extensions for fonts
-Mar 12 2018 - matt: started list of limitation that serevs as information to the
- user as much as a todo list for core developers
-Mar 6 2018 - matt: moved project to ide/AndroidStudio3/
-Mar 2 2018 - matt: rewriting Android port and documentation from scratch
-Feb 9 2016 - matt: recreated document with more warnings and active support
diff --git a/README.IDE.txt b/README.IDE.txt
index 866260536..223da0c00 100644
--- a/README.IDE.txt
+++ b/README.IDE.txt
@@ -3,10 +3,10 @@
-----------------------------------------
Since FLTK 1.4 we do no longer include IDE [1] solution files in our
-source distribution. [2]
+source distribution.
If you want to build the FLTK library with an IDE you need to use
-CMake [3] to generate the IDE files from the source distribution.
+CMake [2] to generate the IDE files from the source distribution.
The FLTK team will officially support generation of selected IDE projects,
particularly Visual C++ and Xcode. Older version support of these IDE
@@ -45,8 +45,4 @@ Note: "Not supported" doesn't mean that a particular generator does not work,
for instance Visual Studio, Xcode, Eclipse, ...
https://en.wikipedia.org/wiki/Integrated_development_environment
-[2] The only exception is the Android Studio IDE in ide/AndroidStudio3
- currently provided for testing. This IDE solution is likely to be
- moved elsewhere or removed entirely before FLTK 1.4 will be released.
-
-[3] https://cmake.org/
+[2] https://cmake.org/
diff --git a/README.Pico.txt b/README.Pico.txt
deleted file mode 100644
index a4c836e88..000000000
--- a/README.Pico.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-This documentation will explain how to quickly port FLTK to a new
-platform using the Pico driver system. For now, only the sample
-SDL Pico driver on macOS compiles and barely runs.
-
-> mkdir build
-> cd build
-> mkdir XcodeSDL
-> cd XcodeSDL
-> cmake -G Xcode -D OPTION_APPLE_SDL=ON ../..
-
-tl;dr - the recent commit should be transparent to all developers on
-other platforms. On macOS, the CMake setup adds 'OPTION_APPLE_SDL=ON'
-that will run FLTK on top of SDL, which in turn runs on top of the
-new "Pico" driver set.
-
-The greatest help I can get from the core developers is to continue
-to refactor the platform specific functionalities into the drivers.
-
----
-
-OK, long version. I know that I am repeating myself and I don't expect
-those of you who "got it" weeks ago to read this again. Writing this
-down is also for me to avoid losing track ;-)
-
-Goal 1: find all the stuff that must still go into drivers
-Goal 2: have a base driver for all future porting efforts
-Goal 3: make porting fun with early gratification to the coder
-Goal 4: extensively document a sample port (SDL), and how to improve it
-Goal 5: use SDL as a base library, thereby porting FLTK to iOS and Android
-
-
-This is the start of a new driver, named "Pico". "Pico" is here to
-implement what I called the minimal driver.
-
-"Pico" implements (eventually) a complete set of drivers. The drivers
-will be limited in functionality, but they will be good enough to
-allow basic UI's with most FLTK widget types.
-
-If "Pico" compiles without any "USE_PICO" or similar defines, we
-have reached goal 1.
-
-"Pico" will implement all driver functionalities "in good faith",
-meaning, in a way that FLTK runs without crashing. Only very very
-basic functions are not implemented. A driver that derives from "Pico"
-needs only to implement those missing functions, thereby reaching goals
-2 and 3. As far as I can tell, those will be:
-
-- open a single fixed size window
-- setting a pixel in a color inside that window
-- polling and waiting for PUSH and RELEASE events and their positions
-
-By implementing these three simple functions in the SDL driver,
-"test/hello" and quite a bunch of other tests will run (yes, they
-will be slow, but the will work).
-
-This will give the person who is porting FLTK to their platform a
-very early confirmation that their build setup is working and a
-very early gratification, reaching goal 3.
-
-Obviously, SDL is much more powerful, and by the nature of the
-virtual functions in the driver system, we can incrementally add
-functionality to the SDL driver, and document this incremental
-nature, reaching goal 4.
-
-If we do all this right, we have goal 5.
-
-If SDL is too big or complex for, say, Android, we can simply start
-a new native Android driver set by implementing the three functions
-mentioned above, and then go from there.
-
-
-- Matthias
diff --git a/README.experimental.txt b/README.experimental.txt
new file mode 100644
index 000000000..01d8e18e3
--- /dev/null
+++ b/README.experimental.txt
@@ -0,0 +1,29 @@
+Removed Experimental Platforms
+------------------------------
+
+Removed platforms and drivers include:
+
+- Android
+- Pico
+- PicoAndroid
+- PicoSDL
+
+These platforms and their drivers were experimental and undocumented.
+
+They have been removed in January 2022 for maintenance reasons as
+discussed in fltk.coredev: "FLTK 1.4.0 release schedule", see:
+https://groups.google.com/g/fltkcoredev/c/PDbHTRpXVh0/m/JqboexZ_AwAJ
+
+More information, for instance where to find further development
+(if any) will be added in this file.
+
+If you want to take a look at the removed drivers you can checkout
+the git tag "experimental-2022-01":
+
+$ git clone https://github.com/fltk/fltk.git fltk-experimental
+$ cd fltk-experimental
+$ git checkout experimental-2022-01
+
+You can also browse the files on GitHub:
+
+https://github.com/fltk/fltk/tree/b275ff07158e80d1744ddb2f6c51094a87cf079a
diff --git a/configh.cmake.in b/configh.cmake.in
index f489cdb81..cf537af82 100644
--- a/configh.cmake.in
+++ b/configh.cmake.in
@@ -157,15 +157,6 @@
#cmakedefine __APPLE_QUARTZ__ 1
-/*
- * USE_SDL
- *
- * Should we use SDL for the current platform
- *
- */
-
-#cmakedefine USE_SDL 1
-
/*
* HAVE_GL_OVERLAY:
*
diff --git a/configh.in b/configh.in
index 0317e979d..86e6897c6 100644
--- a/configh.in
+++ b/configh.in
@@ -156,16 +156,6 @@
#undef __APPLE_QUARTZ__
-/*
- * USE_SDL
- *
- * Should we use SDL for the current platform
- * *FIXME* USE_SDL not yet implemented in configure !
- *
- */
-
-#undef USE_SDL
-
/*
* HAVE_GL_OVERLAY:
*
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 2ccafc6ce..eb055ce85 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -146,7 +146,7 @@ endforeach (src)
# Note: macOS does not need libGLEW
-if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+if (APPLE AND (NOT OPTION_APPLE_X11))
if (NOT LIB_GLEW)
set (LIB_GLEW TRUE)
endif ()
diff --git a/fluid/CMakeLists.txt b/fluid/CMakeLists.txt
index f25e0ab2e..a5676aebc 100644
--- a/fluid/CMakeLists.txt
+++ b/fluid/CMakeLists.txt
@@ -84,7 +84,7 @@ endif (WIN32)
source_group("Header Files" FILES ${HEADERFILES})
-if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+if (APPLE AND (NOT OPTION_APPLE_X11))
set (ICON_NAME fluid.icns)
set (ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_NAME}")
add_executable (fluid MACOSX_BUNDLE ${CPPFILES} ${HEADERFILES} ${ICON_PATH})
@@ -104,7 +104,7 @@ if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
else ()
add_executable (fluid WIN32 ${CPPFILES} ${HEADERFILES})
-endif (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+endif (APPLE AND (NOT OPTION_APPLE_X11))
target_link_libraries (fluid fltk fltk_images)
@@ -123,7 +123,7 @@ endif (USE_GDIPLUS)
# install fluid
-if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+if (APPLE AND (NOT OPTION_APPLE_X11))
# On macOS, Fluid must be installed twice. The bundled version of Fluid needs
# to go into the /Applications folder to make it visible as a user App with
@@ -149,7 +149,7 @@ else()
LIBRARY DESTINATION ${FLTK_LIBDIR}
ARCHIVE DESTINATION ${FLTK_LIBDIR}
)
-endif (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+endif (APPLE AND (NOT OPTION_APPLE_X11))
# install desktop files
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 17c647987..bca6d98e2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -178,7 +178,7 @@ list (APPEND HEADER_FILES
set (GL_HEADER_FILES) # FIXME: not (yet?) defined
-if ((FLTK_USE_X11 OR USE_SDL) AND NOT OPTION_PRINT_SUPPORT)
+if (FLTK_USE_X11 AND NOT OPTION_PRINT_SUPPORT)
set (PSFILES
)
else ()
@@ -186,7 +186,7 @@ else ()
drivers/PostScript/Fl_PostScript.cxx
drivers/PostScript/Fl_PostScript_image.cxx
)
-endif ((FLTK_USE_X11 OR USE_SDL) AND NOT OPTION_PRINT_SUPPORT)
+endif (FLTK_USE_X11 AND NOT OPTION_PRINT_SUPPORT)
set (DRIVER_FILES)
@@ -241,35 +241,6 @@ if (FLTK_USE_X11)
drivers/Xlib/Fl_Font.H
)
-elseif (USE_SDL)
-
- # SDL2
-
- set (DRIVER_FILES
- drivers/Pico/Fl_Pico_System_Driver.cxx
- drivers/Pico/Fl_Pico_Screen_Driver.cxx
- drivers/Pico/Fl_Pico_Window_Driver.cxx
- drivers/Pico/Fl_Pico_Graphics_Driver.cxx
- drivers/Pico/Fl_Pico_Copy_Surface.cxx
- drivers/Pico/Fl_Pico_Image_Surface.cxx
- drivers/PicoSDL/Fl_PicoSDL_System_Driver.cxx
- drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx
- drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx
- drivers/PicoSDL/Fl_PicoSDL_Graphics_Driver.cxx
- drivers/PicoSDL/Fl_PicoSDL_Copy_Surface.cxx
- drivers/PicoSDL/Fl_PicoSDL_Image_Surface.cxx
- )
- set (DRIVER_HEADER_FILES
- drivers/Pico/Fl_Pico_System_Driver.H
- drivers/Pico/Fl_Pico_Screen_Driver.H
- drivers/Pico/Fl_Pico_Window_Driver.H
- drivers/Pico/Fl_Pico_Graphics_Driver.H
- drivers/PicoSDL/Fl_PicoSDL_System_Driver.H
- drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.H
- drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H
- drivers/PicoSDL/Fl_PicoSDL_Graphics_Driver.H
- )
-
elseif (APPLE)
# Apple Quartz
@@ -302,34 +273,6 @@ elseif (APPLE)
drivers/Quartz/Fl_Font.H
)
-elseif (ANDROID)
-
- # Android
-
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-
- set (DRIVER_FILES
- drivers/Android/Fl_Android_Application.cxx
- drivers/Android/Fl_Android_System_Driver.cxx
- drivers/Android/Fl_Android_Screen_Driver.cxx
- drivers/Android/Fl_Android_Screen_Keyboard.cxx
- drivers/Android/Fl_Android_Window_Driver.cxx
- drivers/Android/Fl_Android_Image_Surface_Driver.cxx
- drivers/Android/Fl_Android_Graphics_Driver.cxx
- drivers/Android/Fl_Android_Graphics_Clipping.cxx
- drivers/Android/Fl_Android_Graphics_Font.cxx
- )
- set (DRIVER_HEADER_FILES
- drivers/Android/Fl_Android_Application.H
- drivers/Android/Fl_Android_System_Driver.H
- drivers/Android/Fl_Android_Screen_Driver.H
- drivers/Android/Fl_Android_Window_Driver.H
- drivers/Android/Fl_Android_Graphics_Driver.H
- drivers/Android/Fl_Android_Graphics_Clipping.H
- drivers/Android/Fl_Android_Graphics_Font.H
- )
-
-
else ()
# Windows (GDI)
@@ -473,7 +416,7 @@ if (WIN32)
)
endif (WIN32)
-if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+if (APPLE AND (NOT OPTION_APPLE_X11))
set (MMFILES
Fl_cocoa.mm
drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm
@@ -483,7 +426,7 @@ if (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
else()
set (MMFILES
)
-endif (APPLE AND (NOT OPTION_APPLE_X11) AND (NOT OPTION_APPLE_SDL))
+endif (APPLE AND (NOT OPTION_APPLE_X11))
#######################################################################
@@ -519,10 +462,6 @@ if (FLTK_USE_X11)
list (APPEND OPTIONAL_LIBS ${X11_LIBRARIES})
endif (FLTK_USE_X11)
-if (USE_SDL)
- list (APPEND OPTIONAL_LIBS ${SDL2_LIBRARY})
-endif (USE_SDL)
-
if (WIN32)
list (APPEND OPTIONAL_LIBS comctl32 ws2_32)
endif (WIN32)
diff --git a/src/Fl_Device.cxx b/src/Fl_Device.cxx
index f977210f8..7344ff151 100644
--- a/src/Fl_Device.cxx
+++ b/src/Fl_Device.cxx
@@ -50,7 +50,7 @@
|
+- Fl_PostScript_Graphics_Driver: platform-independent graphics driver for PostScript drawing
+- Fl_SVG_Graphics_Driver: platform-independent graphics driver for Scalable Vector Graphics drawing
- +- Fl_..._Graphics_Driver: platform-specific graphics driver (MacOS, Android, Pico)
+ +- Fl_..._Graphics_Driver: platform-specific graphics driver (MacOS)
+- Fl_Quartz_Printer_Graphics_Driver: MacOS-specific, for drawing to printers
+- Fl_Scalable_Graphics_Driver: helper class to support GUI scaling
+- Fl_Xlib_Graphics_Driver: X11-specific graphics driver
diff --git a/src/Fl_System_Driver.cxx b/src/Fl_System_Driver.cxx
index 75bbf3ef9..45927ae2b 100644
--- a/src/Fl_System_Driver.cxx
+++ b/src/Fl_System_Driver.cxx
@@ -43,7 +43,7 @@ const int Fl_System_Driver::fl_YNegative = 0x0020;
// and/or use their own table. It is defined here "static" and assigned
// in the constructor to avoid static initialization race conditions.
//
-// As of June 2018 these platforms are Windows and Android. X11 does not
+// As of January 2022 the only platform is Windows. X11 does not
// use a key table at all.
// Platforms that use their own key tables must assign them in their
// constructors (which overwrites the pointer and size).
diff --git a/src/drivers/Android/Fl_Android_Application.H b/src/drivers/Android/Fl_Android_Application.H
deleted file mode 100644
index e511b6748..000000000
--- a/src/drivers/Android/Fl_Android_Application.H
+++ /dev/null
@@ -1,270 +0,0 @@
-//
-// Android Native Application interface
-// for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-/**
- \file Fl_Android_Application.H
- \brief Definition of Android Native Application interface
- */
-
-#ifndef FL_ANDROID_APPLICATION_H
-#define FL_ANDROID_APPLICATION_H
-
-#include
-
-extern void (*fl_unlock_function)();
-extern void (*fl_lock_function)();
-
-
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-
-/**
- A class to make Java calls from C++ easier.
- */
-class Fl_Android_Java
-{
- JavaVM *pJavaVM = nullptr;
- JNIEnv *pJNIEnv = nullptr;
- jobject pNativeActivity;
- jclass pNativeActivityClass;
- bool pAttached = false;
-
-public:
- Fl_Android_Java();
- ~Fl_Android_Java();
- bool is_attached() { return pAttached; }
- JavaVM *VM() { return pJavaVM; }
- JNIEnv *env() { return pJNIEnv; }
- jobject native_ativity() { return pNativeActivity; }
- jclass native_activity_class() { return pNativeActivityClass; }
-};
-
-
-/**
- Static class that manages all interaction between the Android Native Activity
- and the FLTK library. It also keeps often used data for global access.
-
- On launch, it creates a main thread and communication pipe to
- the Activity. All FLTK code will run in that thread. Activity
- events will be polled by the Screen driver using the provided
- Android Looper, and will also be routed back to this class as needed.
-
- This code is based on the native activity interface
- provided by . It is based on a set
- of application-provided callbacks that will be called
- by the Activity's main thread when certain events occur.
-
- 1/ The application must provide a function named "int main(argc, argv)" that
- will be called when the activity is created, in a new thread that is
- distinct from the activity's main thread.
-
- 2/ The application has access to a static "Fl_Android_Application" class
- that contains references to other important objects, e.g. the
- ANativeActivity object instance the application is running in.
-
- 3/ the "Fl_Android_Application" class holds an ALooper instance that already
- listens to two important things:
-
- - activity lifecycle events (e.g. "pause", "resume"). See APP_CMD_XXX
- declarations below.
-
- - input events coming from the AInputQueue attached to the activity.
-
- Each of these correspond to an ALooper identifier returned by
- ALooper_pollOnce with values of LOOPER_ID_MAIN and LOOPER_ID_INPUT,
- respectively.
-
- FLTK will add more items to the looper for timers and file and socket
- communication. (fl_add_timeout, Fl::add_fd(), ...
- */
-class Fl_Android_Application
-{
-public:
-
- enum {
- /**
- * Looper data ID of commands coming from the app's main thread, which
- * is returned as an identifier from ALooper_pollOnce(). The data for this
- * identifier is a pointer to an android_poll_source structure.
- * These can be retrieved and processed with android_app_read_cmd()
- * and android_app_exec_cmd().
- */
- LOOPER_ID_MAIN = 1,
-
- /**
- * Looper data ID of events coming from the AInputQueue of the
- * application's window, which is returned as an identifier from
- * ALooper_pollOnce(). The data for this identifier is a pointer to an
- * android_poll_source structure. These can be read via the inputQueue
- * object of android_app.
- */
- LOOPER_ID_INPUT,
-
- /**
- * Timer data ID of all timer events coming from the Unix timer_create()
- * and friends, used in fl_add_timeout() and colleagues.
- */
- LOOPER_ID_TIMER,
-
- /**
- * Start of user-defined ALooper identifiers.
- */
- LOOPER_ID_USER,
- };
-
- /**
- * @see android.H Fl_Android_Platform_Event
- */
- enum {
- APP_CMD_INPUT_CHANGED,
- APP_CMD_INIT_WINDOW,
- APP_CMD_TERM_WINDOW,
- APP_CMD_WINDOW_RESIZED,
- APP_CMD_WINDOW_REDRAW_NEEDED,
- APP_CMD_CONTENT_RECT_CHANGED,
- APP_CMD_GAINED_FOCUS,
- APP_CMD_LOST_FOCUS,
- APP_CMD_CONFIG_CHANGED,
- APP_CMD_LOW_MEMORY,
- APP_CMD_START,
- APP_CMD_RESUME,
- APP_CMD_SAVE_STATE,
- APP_CMD_PAUSE,
- APP_CMD_STOP,
- APP_CMD_DESTROY,
- };
-
-public:
- // --- logging
- static void log_e(const char *text, ...);
- static void log_w(const char *text, ...);
- static void log_i(const char *text, ...);
- static void log_v(const char *text, ...);
-
- // --- application state stuff
- static int8_t read_cmd();
- static void pre_exec_cmd(int8_t cmd);
- static void post_exec_cmd(int8_t cmd);
- static int destroy_requested() { return pDestroyRequested; }
- static const char *get_internal_data_path() { return pActivity->internalDataPath; }
- static const char *get_external_data_path() { return pActivity->externalDataPath; }
- static AAssetManager *get_asset_manager() { return pActivity->assetManager; }
- static ANativeActivity *get_activity() { return pActivity; }
-
- // --- event handling
- static AInputQueue *input_event_queue() { return pInputQueue; }
-
- // --- screen stuff
- static bool copy_screen();
- static inline ANativeWindow *native_window() { return pNativeWindow; }
- static inline ANativeWindow_Buffer &graphics_buffer() { return pApplicationWindowBuffer; }
-
- // --- timer stuff
- static void send_timer_index(uint8_t ix);
- static uint8_t receive_timer_index();
-
-
-protected:
- static void free_saved_state();
- static void print_cur_config();
- static void destroy();
- static void* thread_entry(void* param);
-
- // --- screen handling stuff
- static void allocate_screen();
- static bool lock_screen();
- static void unlock_and_post_screen();
- static bool screen_is_locked();
-
- // --- timer stuff
- static void create_timer_handler();
- static void destroy_timer_handler();
-
- static ANativeActivity *pActivity;
- static AConfiguration *pConfig;
- static void *pSavedState;
- static size_t pSavedStateSize;
- static ALooper *pAppLooper;
- static AInputQueue *pInputQueue;
- static ANativeWindow *pNativeWindow;
- static ANativeWindow_Buffer pNativeWindowBuffer;
- static ANativeWindow_Buffer pApplicationWindowBuffer;
- static int pActivityState;
- static int pDestroyRequested;
-
- // ---- no need to make these visible to the outside ----
- static pthread_mutex_t pMutex;
- static pthread_cond_t pCond;
- static int pMsgReadPipe;
- static int pMsgWritePipe;
- static pthread_t pThread;
- static int pRunning;
- static int pStateSaved;
- static int pDestroyed;
- static AInputQueue* pPendingInputQueue;
- static ANativeWindow* pPendingWindow;
-
- // --- timer variables
- static int pTimerReadPipe;
- static int pTimerWritePipe;
-
-};
-
-
-class Fl_Android_Activity : public Fl_Android_Application
-{
-public:
- static void create(ANativeActivity* activity, void* savedState, size_t savedStateSize);
-
-private:
- static void set_activity(ANativeActivity *a) { pActivity = a; }
- static void set_callbacks();
-
- // ---- Android Native Activity interface
- static void write_cmd(int8_t cmd);
- static void set_input(AInputQueue* inputQueue);
- static void set_window(ANativeWindow* window);
- static void set_activity_state(int8_t cmd);
- static void close_activity();
-
- // ---- Android Native Activity callbacks ----
- static void onContentRectChanged(ANativeActivity *activity, const ARect *rect);
- static void onNativeWindowRedrawNeeded(ANativeActivity *activity, ANativeWindow *window);
- static void onNativeWindowResized(ANativeActivity *activity, ANativeWindow *window);
- static void onDestroy(ANativeActivity* activity);
- static void onStart(ANativeActivity* activity);
- static void onResume(ANativeActivity* activity);
- static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen);
- static void onPause(ANativeActivity* activity);
- static void onStop(ANativeActivity* activity);
- static void onConfigurationChanged(ANativeActivity* activity);
- static void onLowMemory(ANativeActivity* activity);
- static void onWindowFocusChanged(ANativeActivity* activity, int focused);
- static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window);
- static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window);
- static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue);
- static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue);
-};
-
-
-#endif // FL_ANDROID_APPLICATION_H
diff --git a/src/drivers/Android/Fl_Android_Application.cxx b/src/drivers/Android/Fl_Android_Application.cxx
deleted file mode 100644
index 32feee193..000000000
--- a/src/drivers/Android/Fl_Android_Application.cxx
+++ /dev/null
@@ -1,843 +0,0 @@
-//
-// Android Native Application interface
-// for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-/**
- \file Fl_Android_Application.H
- \brief Definition of Android Native Application interface
- */
-
-#include "Fl_Android_Application.H"
-#include "Fl_Android_Window_Driver.H"
-
-#include
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-
-void fl_set_status(int x, int y, int w, int h) {}
-
-static const char *LOG_TAG = "FLTK";
-
-
-// The ANativeActivity object instance that this app is running in.
-ANativeActivity *Fl_Android_Application::pActivity = 0L;
-
-// The current configuration the app is running in.
-AConfiguration* Fl_Android_Application::pConfig = 0L;
-
-// This is the last instance's saved state, as provided at creation time.
-// It is NULL if there was no state. You can use this as you need; the
-// memory will remain around until you call android_app_exec_cmd() for
-// APP_CMD_RESUME, at which point it will be freed and savedState set to NULL.
-// These variables should only be changed when processing a APP_CMD_SAVE_STATE,
-// at which point they will be initialized to NULL and you can malloc your
-// state and place the information here. In that case the memory will be
-// freed for you later.
-void* Fl_Android_Application::pSavedState = 0;
-size_t Fl_Android_Application::pSavedStateSize = 0;
-
-// The ALooper associated with the app's thread.
-ALooper* Fl_Android_Application::pAppLooper = 0;
-
-// When non-NULL, this is the input queue from which the app will
-// receive user input events.
-AInputQueue* Fl_Android_Application::pInputQueue = 0;
-
-// When non-NULL, this is the window surface that the app can draw in.
-ANativeWindow* Fl_Android_Application::pNativeWindow = 0;
-
-// Use this buffer for direct drawing access
-ANativeWindow_Buffer Fl_Android_Application::pNativeWindowBuffer = { 0 };
-ANativeWindow_Buffer Fl_Android_Application::pApplicationWindowBuffer = { 0 };
-
-// Current state of the app's activity. May be either APP_CMD_START,
-// APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP; see below.
-int Fl_Android_Application::pActivityState = 0;
-
-// This is non-zero when the application's NativeActivity is being
-// destroyed and waiting for the app thread to complete.
-int Fl_Android_Application::pDestroyRequested = 0;
-
-pthread_mutex_t Fl_Android_Application::pMutex = { 0 };
-pthread_cond_t Fl_Android_Application::pCond = { 0 };
-int Fl_Android_Application::pMsgReadPipe = 0;
-int Fl_Android_Application::pMsgWritePipe = 0;
-pthread_t Fl_Android_Application::pThread = 0;
-int Fl_Android_Application::pRunning = 0;
-int Fl_Android_Application::pStateSaved = 0;
-int Fl_Android_Application::pDestroyed = 0;
-//int Fl_Android_Application::pRedrawNeeded = 0;
-AInputQueue *Fl_Android_Application::pPendingInputQueue = 0;
-ANativeWindow *Fl_Android_Application::pPendingWindow = 0;
-//ARect Fl_Android_Application::pPendingContentRect = { 0 };
-
-int Fl_Android_Application::pTimerReadPipe = -1;
-int Fl_Android_Application::pTimerWritePipe = -1;
-
-
-
-void Fl_Android_Application::log_e(const char *text, ...)
-{
- va_list args;
- va_start (args, text);
- __android_log_vprint(ANDROID_LOG_ERROR, LOG_TAG, text, args);
- va_end (args);
-}
-
-
-void Fl_Android_Application::log_w(const char *text, ...)
-{
- va_list args;
- va_start (args, text);
- __android_log_vprint(ANDROID_LOG_WARN, LOG_TAG, text, args);
- va_end (args);
-}
-
-
-void Fl_Android_Application::log_i(const char *text, ...)
-{
- va_list args;
- va_start (args, text);
- __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, text, args);
- va_end (args);
-}
-
-
-void Fl_Android_Application::log_v(const char *text, ...)
-{
-#ifdef _DEBUG
- va_list args;
- va_start (args, text);
- __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, text, args);
- va_end (args);
-#else
- text = 0;
-#endif
-}
-
-
-void Fl_Android_Application::free_saved_state()
-{
- pthread_mutex_lock(&pMutex);
- if (pSavedState != NULL) {
- free(pSavedState);
- pSavedState = NULL;
- pSavedStateSize = 0;
- }
- pthread_mutex_unlock(&pMutex);
-}
-
-/**
- Call when ALooper_pollAll() returns LOOPER_ID_MAIN, reading the next
- app command message.
- */
-int8_t Fl_Android_Application::read_cmd()
-{
- int8_t cmd;
- if (read(pMsgReadPipe, &cmd, sizeof(cmd)) == sizeof(cmd)) {
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- free_saved_state();
- break;
- default:
- break;
- }
- return cmd;
- } else {
- log_e("No data on command pipe!");
- }
- return -1;
-}
-
-
-void Fl_Android_Application::print_cur_config()
-{
- char lang[2], country[2];
- AConfiguration_getLanguage(pConfig, lang);
- AConfiguration_getCountry(pConfig, country);
-
- log_v("Config: mcc=%d mnc=%d lang=%c%c cnt=%c%c orien=%d touch=%d dens=%d "
- "keys=%d nav=%d keysHid=%d navHid=%d sdk=%d size=%d long=%d "
- "modetype=%d modenight=%d",
- AConfiguration_getMcc(pConfig),
- AConfiguration_getMnc(pConfig),
- lang[0], lang[1], country[0], country[1],
- AConfiguration_getOrientation(pConfig),
- AConfiguration_getTouchscreen(pConfig),
- AConfiguration_getDensity(pConfig),
- AConfiguration_getKeyboard(pConfig),
- AConfiguration_getNavigation(pConfig),
- AConfiguration_getKeysHidden(pConfig),
- AConfiguration_getNavHidden(pConfig),
- AConfiguration_getSdkVersion(pConfig),
- AConfiguration_getScreenSize(pConfig),
- AConfiguration_getScreenLong(pConfig),
- AConfiguration_getUiModeType(pConfig),
- AConfiguration_getUiModeNight(pConfig));
-}
-
-/**
- Call with the command returned by android_app_read_cmd() to do the
- initial pre-processing of the given command. You can perform your own
- actions for the command after calling this function.
- */
-void Fl_Android_Application::pre_exec_cmd(int8_t cmd)
-{
- switch (cmd) {
- case APP_CMD_INPUT_CHANGED:
- log_v("APP_CMD_INPUT_CHANGED\n");
- pthread_mutex_lock(&pMutex);
- if (pInputQueue != NULL) {
- AInputQueue_detachLooper(pInputQueue);
- }
- pInputQueue = pPendingInputQueue;
- if (pInputQueue != NULL) {
- log_v("Attaching input queue to looper");
- AInputQueue_attachLooper(pInputQueue, pAppLooper, LOOPER_ID_INPUT, NULL, NULL);
- }
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
- break;
-
- case APP_CMD_INIT_WINDOW:
- log_v("APP_CMD_INIT_WINDOW\n");
- // tell the main thread that we received the window handle
- pthread_mutex_lock(&pMutex);
- pNativeWindow = pPendingWindow;
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
- // change the format of the buffers to match our needs
- // FIXME: current default screen size and format is 600x800xRGB565
- ANativeWindow_setBuffersGeometry(pNativeWindow,
- 600,
- 800,
- WINDOW_FORMAT_RGB_565);
- // tell FLTK that the buffer is available now
- Fl_Android_Window_Driver::expose_all();
- break;
-
- case APP_CMD_TERM_WINDOW:
- log_v("APP_CMD_TERM_WINDOW\n");
- pthread_cond_broadcast(&pCond);
- break;
-
- case APP_CMD_RESUME:
- case APP_CMD_START:
- case APP_CMD_PAUSE:
- case APP_CMD_STOP:
- log_v("activityState=%d\n", cmd);
- pthread_mutex_lock(&pMutex);
- pActivityState = cmd;
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
- break;
-
- case APP_CMD_CONFIG_CHANGED:
- log_v("APP_CMD_CONFIG_CHANGED\n");
- AConfiguration_fromAssetManager(pConfig,
- pActivity->assetManager);
- print_cur_config();
- break;
-
- case APP_CMD_DESTROY:
- log_v("APP_CMD_DESTROY\n");
- pDestroyRequested = 1;
- Fl::program_should_quit(1);
- break;
-
- default:
- break;
- }
-}
-
-/**
- Call with the command returned by read_cmd() to do the
- final post-processing of the given command. You must have done your own
- actions for the command before calling this function.
- */
-void Fl_Android_Application::post_exec_cmd(int8_t cmd)
-{
- switch (cmd) {
- case APP_CMD_TERM_WINDOW:
- log_v("APP_CMD_TERM_WINDOW\n");
- pthread_mutex_lock(&pMutex);
- pNativeWindow = NULL;
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
- break;
-
- case APP_CMD_SAVE_STATE:
- log_v("APP_CMD_SAVE_STATE\n");
- pthread_mutex_lock(&pMutex);
- pStateSaved = 1;
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
- break;
-
- case APP_CMD_RESUME:
- free_saved_state();
- break;
- }
-}
-
-
-void Fl_Android_Application::create_timer_handler()
-{
- int msgpipe[2];
- if (::pipe(msgpipe)) {
- log_e("could not create timer pipe: %s", strerror(errno));
- return;
- }
- pTimerReadPipe = msgpipe[0];
- pTimerWritePipe = msgpipe[1];
- ALooper_addFd(pAppLooper, pTimerReadPipe, LOOPER_ID_TIMER, ALOOPER_EVENT_INPUT, NULL, NULL);
-}
-
-
-void Fl_Android_Application::destroy_timer_handler()
-{
- ALooper_removeFd(pAppLooper, pTimerReadPipe);
- ::close(pTimerWritePipe);
- ::close(pTimerReadPipe);
-}
-
-
-void Fl_Android_Application::send_timer_index(uint8_t ix)
-{
- if (pTimerWritePipe!=-1)
- ::write(pTimerWritePipe, &ix, 1);
-}
-
-
-uint8_t Fl_Android_Application::receive_timer_index()
-{
- uint8_t ix = 0;
- if (pTimerReadPipe!=-1)
- ::read(pTimerReadPipe, &ix, 1);
- return ix;
-}
-
-
-void Fl_Android_Application::destroy()
-{
- log_v("android_app_destroy!");
- free_saved_state();
- pthread_mutex_lock(&pMutex);
- if (pInputQueue != NULL) {
- AInputQueue_detachLooper(pInputQueue);
- }
- destroy_timer_handler();
- AConfiguration_delete(pConfig);
- pDestroyed = 1;
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
- // Can't touch android_app object after this.
-}
-
-
-void *Fl_Android_Application::thread_entry(void* param)
-{
- pConfig = AConfiguration_new();
- AConfiguration_fromAssetManager(pConfig, pActivity->assetManager);
-
- print_cur_config();
-
- pAppLooper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
- ALooper_addFd(pAppLooper, pMsgReadPipe, LOOPER_ID_MAIN, ALOOPER_EVENT_INPUT, NULL, NULL);
-
- create_timer_handler();
-
- pthread_mutex_lock(&pMutex);
- pRunning = 1;
- pthread_cond_broadcast(&pCond);
- pthread_mutex_unlock(&pMutex);
-
- char *argv[] = { fl_strdup(pActivity->obbPath), 0 };
- main(1, argv);
-
- destroy();
- return NULL;
-}
-
-/**
- Allocate memory for our internal screen buffer.
-
- FIXME: everything is currently hardcoded to an 600x800 resolution
- TODO: react to screen changes
- */
-void Fl_Android_Application::allocate_screen()
-{
- pApplicationWindowBuffer.bits = calloc(600*800, 2); // one uint16_t per pixel
- pApplicationWindowBuffer.width = 600;
- pApplicationWindowBuffer.height = 800;
- pApplicationWindowBuffer.stride = 600;
- pApplicationWindowBuffer.format = WINDOW_FORMAT_RGB_565;
-}
-
-
-bool Fl_Android_Application::copy_screen()
-{
- bool ret = false;
- if (lock_screen()) {
-
-#if 0
- // screen activity viewer
- static int i = 0;
- fl_color( (i&1) ? FL_RED : FL_GREEN);
- fl_rectf(i*10, 600+i*10, 50, 50);
- i++;
- if (i>10) i = 0;
-#endif
-
- // TODO: there are endless possibilities to optimize the following code
- // We are wasting time by copying the entire screen contents at every dirty frame
- // We can identify previously written buffers and copy only those pixels
- // that actually changed.
- const uint16_t *src = (uint16_t*)pApplicationWindowBuffer.bits;
- int srcStride = pApplicationWindowBuffer.stride;
- int ww = pApplicationWindowBuffer.width;
- int hh = pApplicationWindowBuffer.height;
-
- uint16_t *dst = (uint16_t*)pNativeWindowBuffer.bits;
- int dstStride = pNativeWindowBuffer.stride;
- if (pNativeWindowBuffer.width0; --row) {
- memcpy(dst, src, size_t(ww * 2));
- src += srcStride;
- dst += dstStride;
- }
-
- unlock_and_post_screen();
- ret = true;
- } else {
- // wait for screen buffer to be created
- }
- return ret;
-}
-
-/**
- Take ownership of screen memory for gaining write access.
-
- If the screen is already locked, it will not be locked again
- and a value of true will be returned.
-
- \return true if we gaines access, false if no access was granted and screen memory must not be writte to
- */
-bool Fl_Android_Application::lock_screen()
-{
- if (screen_is_locked())
- return true;
-
- if (!pNativeWindow) {
- log_w("Unable to lock window buffer: no native window found.");
- return false;
- }
-
- if (ANativeWindow_lock(pNativeWindow, &pNativeWindowBuffer, 0L) < 0) {
- log_w("Unable to lock window buffer: Android won't lock.");
- return false;
- }
- return true;
-}
-
-/**
- Release screen memory ownership and give it back to the system.
-
- The memory content will be copied to the physical screen next.
- If the screen is not locked, this call will have no effect.
- */
-void Fl_Android_Application::unlock_and_post_screen()
-{
- if (!screen_is_locked())
- return;
-
- ANativeWindow_unlockAndPost(pNativeWindow);
- pNativeWindowBuffer.bits = 0L; // avoid any misunderstandings...
-}
-
-/**
- Is the screen currently locked?
- \return true if it is locked and the app has write access.
- */
-bool Fl_Android_Application::screen_is_locked()
-{
- return (pNativeWindowBuffer.bits!=0L);
-}
-
-
-// --------------------------------------------------------------------
-// Native activity interaction (called from main thread)
-// --------------------------------------------------------------------
-
-
-void Fl_Android_Activity::write_cmd(int8_t cmd)
-{
- if (write(pMsgWritePipe, &cmd, sizeof(cmd)) != sizeof(cmd)) {
- log_e("Failure writing android_app cmd: %s\n", strerror(errno));
- }
-}
-
-
-void Fl_Android_Activity::set_input(AInputQueue* inputQueue)
-{
- pthread_mutex_lock(&pMutex);
- pPendingInputQueue = inputQueue;
- write_cmd(APP_CMD_INPUT_CHANGED);
- while (pInputQueue != pPendingInputQueue) {
- pthread_cond_wait(&pCond, &pMutex);
- }
- pthread_mutex_unlock(&pMutex);
-}
-
-
-void Fl_Android_Activity::set_window(ANativeWindow* window)
-{
- pthread_mutex_lock(&pMutex);
- if (pPendingWindow != NULL) {
- write_cmd(APP_CMD_TERM_WINDOW);
- }
- pPendingWindow = window;
- if (window != NULL) {
- write_cmd(APP_CMD_INIT_WINDOW);
- }
- while (pNativeWindow != pPendingWindow) {
- pthread_cond_wait(&pCond, &pMutex);
- }
- pthread_mutex_unlock(&pMutex);
-}
-
-
-void Fl_Android_Activity::set_activity_state(int8_t cmd)
-{
- pthread_mutex_lock(&pMutex);
- write_cmd(cmd);
- while (pActivityState != cmd) {
- pthread_cond_wait(&pCond, &pMutex);
- }
- pthread_mutex_unlock(&pMutex);
-}
-
-
-void Fl_Android_Activity::close_activity()
-{
- pthread_mutex_lock(&pMutex);
- write_cmd(APP_CMD_DESTROY);
- while (!pDestroyed) {
- pthread_cond_wait(&pCond, &pMutex);
- }
- pthread_mutex_unlock(&pMutex);
-
- close(pMsgReadPipe);
- close(pMsgWritePipe);
- pthread_cond_destroy(&pCond);
- pthread_mutex_destroy(&pMutex);
-}
-
-
-// ---- Android Native Activity callbacks ----
-
-/**
- The rectangle in the window in which content should be placed has changed.
- */
-void Fl_Android_Activity::onContentRectChanged(ANativeActivity *activity, const ARect *rect)
-{
- // TODO: implement me
-}
-
-/**
- The drawing window for this native activity needs to be redrawn. To avoid transient artifacts during screen changes (such resizing after rotation), applications should not return from this function until they have finished drawing their window in its current state.
- */
-void Fl_Android_Activity::onNativeWindowRedrawNeeded(ANativeActivity *activity, ANativeWindow *window)
-{
- // TODO: implement me
-}
-
-/**
- The drawing window for this native activity has been resized. You should retrieve the new size from the window and ensure that your rendering in it now matches.
- */
-void Fl_Android_Activity::onNativeWindowResized(ANativeActivity *activity, ANativeWindow *window)
-{
- // TODO: implement me
-}
-
-/**
- NativeActivity is being destroyed. See Java documentation for Activity.onDestroy() for more information.
- */
-void Fl_Android_Activity::onDestroy(ANativeActivity* activity)
-{
- log_v("Destroy: %p\n", activity);
- // FIXME: use the correct free()
- close_activity();
-}
-
-/**
- NativeActivity has started. See Java documentation for Activity.onStart() for more information.
- */
-void Fl_Android_Activity::onStart(ANativeActivity* activity)
-{
- log_v("Start: %p\n", activity);
- set_activity_state(APP_CMD_START);
-}
-
-/**
- NativeActivity has resumed. See Java documentation for Activity.onResume() for more information.
- */
-void Fl_Android_Activity::onResume(ANativeActivity* activity)
-{
- log_v("Resume: %p\n", activity);
- set_activity_state(APP_CMD_RESUME);
-}
-
-/**
- Framework is asking NativeActivity to save its current instance state. See Java documentation for Activity.onSaveInstanceState() for more information. The returned pointer needs to be created with malloc(); the framework will call free() on it for you. You also must fill in outSize with the number of bytes in the allocation. Note that the saved state will be persisted, so it can not contain any active entities (pointers to memory, file descriptors, etc).
- */
-void *Fl_Android_Activity::onSaveInstanceState(ANativeActivity* activity, size_t* outLen)
-{
- struct android_app* android_app = (struct android_app*)activity->instance;
- void* savedState = NULL;
-
- log_v("SaveInstanceState: %p\n", activity);
- pthread_mutex_lock(&pMutex);
- pStateSaved = 0;
- write_cmd(APP_CMD_SAVE_STATE);
- while (!pStateSaved) {
- pthread_cond_wait(&pCond, &pMutex);
- }
-
- if (pSavedState != NULL) {
- savedState = pSavedState;
- *outLen = pSavedStateSize;
- pSavedState = NULL;
- pSavedStateSize = 0;
- }
-
- pthread_mutex_unlock(&pMutex);
-
- return savedState;
-}
-
-/**
- NativeActivity has paused. See Java documentation for Activity.onPause() for more information.
- */
-void Fl_Android_Activity::onPause(ANativeActivity* activity)
-{
- log_v("Pause: %p\n", activity);
- set_activity_state(APP_CMD_PAUSE);
-}
-
-/**
- NativeActivity has stopped. See Java documentation for Activity.onStop() for more information.
- */
-void Fl_Android_Activity::onStop(ANativeActivity* activity)
-{
- log_v("Stop: %p\n", activity);
- set_activity_state(APP_CMD_STOP);
-}
-
-/**
- The current device AConfiguration has changed. The new configuration can be retrieved from assetManager.
- */
-void Fl_Android_Activity::onConfigurationChanged(ANativeActivity* activity)
-{
- struct android_app* android_app = (struct android_app*)activity->instance;
- log_v("ConfigurationChanged: %p\n", activity);
- write_cmd(APP_CMD_CONFIG_CHANGED);
-}
-
-/**
- The system is running low on memory. Use this callback to release resources you do not need, to help the system avoid killing more important processes.
- */
-void Fl_Android_Activity::onLowMemory(ANativeActivity* activity)
-{
- struct android_app* android_app = (struct android_app*)activity->instance;
- log_v("LowMemory: %p\n", activity);
- write_cmd(APP_CMD_LOW_MEMORY);
-}
-
-/**
- Focus has changed in this NativeActivity's window. This is often used, for example, to pause a game when it loses input focus.
- */
-void Fl_Android_Activity::onWindowFocusChanged(ANativeActivity* activity, int focused)
-{
- log_v("WindowFocusChanged: %p -- %d\n", activity, focused);
- write_cmd(focused ? APP_CMD_GAINED_FOCUS : APP_CMD_LOST_FOCUS);
-}
-
-/**
- The drawing window for this native activity has been created. You can use the given native window object to start drawing.
- */
-void Fl_Android_Activity::onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window)
-{
- log_v("NativeWindowCreated: %p -- %p\n", activity, window);
- set_window(window);
-}
-
-/**
- The drawing window for this native activity is going to be destroyed. You MUST ensure that you do not touch the window object after returning from this function: in the common case of drawing to the window from another thread, that means the implementation of this callback must properly synchronize with the other thread to stop its drawing before returning from here.
- */
-void Fl_Android_Activity::onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window)
-{
- log_v("NativeWindowDestroyed: %p -- %p\n", activity, window);
- set_window(NULL);
-}
-
-/**
- The input queue for this native activity's window has been created. You can use the given input queue to start retrieving input events.
- */
-void Fl_Android_Activity::onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue)
-{
- log_v("InputQueueCreated: %p -- %p\n", activity, queue);
- set_input(queue);
-}
-
-/**
- The input queue for this native activity's window is being destroyed. You should no longer try to reference this object upon returning from this function.
- */
-void Fl_Android_Activity::onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue)
-{
- log_v("InputQueueDestroyed: %p -- %p\n", activity, queue);
- set_input(NULL);
-}
-
-/**
- Create a thread that will run our FLTK code and the required communications and locks.
- \param activity the interface to the Java end of Android
- \param savedState if this app is relaunched, this is a memory block with the state of the app when it was interrupted
- \param savedStateSize size of that block
- */
-void Fl_Android_Activity::create(ANativeActivity* activity, void* savedState,
- size_t savedStateSize)
-{
- static const char *FLTK = "FLTK";
- activity->instance = (void*)FLTK;
-
- set_activity(activity);
- set_callbacks();
-
- allocate_screen(); // TODO: we may need to change this to when the actual screen is allocated
-
- pthread_mutex_init(&pMutex, NULL);
- pthread_cond_init(&pCond, NULL);
-
- if (savedState != NULL) {
- pSavedState = malloc(savedStateSize);
- pSavedStateSize = savedStateSize;
- memcpy(pSavedState, savedState, savedStateSize);
- }
-
- int msgpipe[2];
- if (pipe(msgpipe)) {
- log_e("could not create pipe: %s", strerror(errno));
- return;
- }
- pMsgReadPipe = msgpipe[0];
- pMsgWritePipe = msgpipe[1];
-
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&pThread, &attr, thread_entry, 0L);
-
- // Wait for thread to start.
- pthread_mutex_lock(&pMutex);
- while (!pRunning) {
- pthread_cond_wait(&pCond, &pMutex);
- }
- pthread_mutex_unlock(&pMutex);
-}
-
-/**
- Set all callbacks from the Native Activity.
- */
-void Fl_Android_Activity::set_callbacks()
-{
- ANativeActivityCallbacks *cb = pActivity->callbacks;
- cb->onContentRectChanged = onContentRectChanged;
- cb->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeeded;
- cb->onNativeWindowResized = onNativeWindowResized;
- cb->onDestroy = onDestroy;
- cb->onStart = onStart;
- cb->onResume = onResume;
- cb->onSaveInstanceState = onSaveInstanceState;
- cb->onPause = onPause;
- cb->onStop = onStop;
- cb->onConfigurationChanged = onConfigurationChanged;
- cb->onLowMemory = onLowMemory;
- cb->onWindowFocusChanged = onWindowFocusChanged;
- cb->onNativeWindowCreated = onNativeWindowCreated;
- cb->onNativeWindowDestroyed = onNativeWindowDestroyed;
- cb->onInputQueueCreated = onInputQueueCreated;
- cb->onInputQueueDestroyed = onInputQueueDestroyed;
-}
-
-/**
- This is the main entry point from the Android JavaVM into the native world.
- */
-JNIEXPORT void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_t savedStateSize)
-{
- // TODO: can we return an error message her is creation of the app failed?
- Fl_Android_Activity::create(activity, savedState, savedStateSize);
-}
-
-
-// ---- Java Stuff -------------------------------------------------------------
-
-
-Fl_Android_Java::Fl_Android_Java()
-{
- jint lResult;
- jint lFlags = 0;
-
- pJavaVM = Fl_Android_Application::get_activity()->vm;
- pJNIEnv = Fl_Android_Application::get_activity()->env;
-
- JavaVMAttachArgs lJavaVMAttachArgs = {
- .version = JNI_VERSION_1_6,
- .name = "NativeThread",
- .group = nullptr
- };
-
- lResult = pJavaVM->AttachCurrentThread(&pJNIEnv, &lJavaVMAttachArgs);
- if (lResult == JNI_ERR) return;
-
- pNativeActivity = Fl_Android_Application::get_activity()->clazz;
-
- pNativeActivityClass = env()->GetObjectClass(pNativeActivity);
-
- pAttached = true;
-}
-
-
-Fl_Android_Java::~Fl_Android_Java()
-{
- if (is_attached()) {
- pJavaVM->DetachCurrentThread();
- }
-}
diff --git a/src/drivers/Android/Fl_Android_Graphics_Clipping.H b/src/drivers/Android/Fl_Android_Graphics_Clipping.H
deleted file mode 100644
index dbec82f18..000000000
--- a/src/drivers/Android/Fl_Android_Graphics_Clipping.H
+++ /dev/null
@@ -1,183 +0,0 @@
-//
-// Graphics regions and clipping for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-/**
- \file Fl_Android_Graphics_Clipping.H
- \brief Graphics regions and clipping for the Fast Light Tool Kit (FLTK).
- */
-
-#ifndef FL_ANDROID_GRAPHICS_CLIPPING_H
-#define FL_ANDROID_GRAPHICS_CLIPPING_H
-
-#include
-#include
-
-
-class Fl_Android_Window_Driver;
-
-
-/**
- The Fl_Rect_Region describes a rectangular clipping region.
-
- Contrary to common FLTK convention, rectangles are stored with coordinates
- instead of their width and height to accelerate calculations. The discreet
- constructor however uses the old convention for convenience.
- */
-class Fl_Rect_Region
-{
-public:
- enum Type {
- EMPTY = 0, SAME, LESS, MORE, INFINITE
- };
-
- Fl_Rect_Region();
- Fl_Rect_Region(int x, int y, int w, int h);
- Fl_Rect_Region(const Fl_Rect_Region&);
- Fl_Rect_Region(enum Type what);
- virtual ~Fl_Rect_Region() { }
-
- int x() const { return pLeft; }
- int y() const { return pTop; }
- int w() const { return pRight - pLeft; }
- int h() const { return pBottom - pTop; }
-
- int left() const { return pLeft; }
- int top() const { return pTop; }
- int right() const { return pRight; }
- int bottom() const { return pBottom; }
-
- bool is_empty() const;
- bool is_infinite() const;
-
- virtual void set_empty();
- void set(int x, int y, int w, int h);
- void set_ltrb(int l, int t, int r, int b);
- virtual void set(const Fl_Rect_Region &r);
- virtual int intersect_with(const Fl_Rect_Region &r);
- void add_to_bbox(const Fl_Rect_Region &r);
-
- virtual void print(const char*) const;
-
-protected:
- int pLeft, pTop, pRight, pBottom;
-
-private:
- Fl_Rect_Region& operator = (const Fl_Rect_Region& other);
-};
-
-
-/**
- The Fl_Complex_Region represents a clipping region of any shape.
-
- This class is organized in a tree-like structure. If the region is
- rectangular, is_simple() returns 1 and the rectangle can be used just
- as in Fl_Rect_Region.
-
- If a more complex representation is needed, subregions are created which are
- guaranteed to lie within the bounding box of the current region. Subregions
- themselves can again contain sub-subregions to describe the entire clipping
- region, effectively creating a tree where the leafs contain the rectangles
- that together describe the clipping area.
-
- To make life easier, Fl_Complex_Region provides two types of iterator to
- travers the entire tree.
-
- 1. Fl_Complex_Region itself is compatible to C++11 range-based loops and
- can bewalked simply by writing ``for (auto &&it: rgn) { ... }``.
-
- 2. Fl_Complex_Region provides an alternative iterator that loop only through
- leafs that intersects with a given rectangle. The returned object
- provides access to the readily clipped rectangle.
-
- \code
- Fl_Complex_Region rgn(something);
- for (auto &&it: rgn.iterate(Fl_Rect_Region(0, 0, 100, 100)) {
- draw_something(it->rect());
- }
- \endcode
-
- */
-class Fl_Complex_Region : public Fl_Rect_Region
-{
- class Iterator {
- public:
- Iterator(Fl_Complex_Region *r);
- bool operator!= (const Iterator& other) const;
- const Iterator& operator++ ();
- Fl_Complex_Region *operator* () const;
- Fl_Complex_Region *pRegion;
- };
-
- class Overlapping {
- class OverlappingIterator {
- public:
- OverlappingIterator(Overlapping *ov);
- bool operator!= (const OverlappingIterator& other) const;
- const OverlappingIterator& operator++ ();
- Overlapping *operator* () const;
- Overlapping *pOv;
- };
- public:
- Overlapping(Fl_Complex_Region *rgn, const Fl_Rect_Region &rect);
- OverlappingIterator begin();
- OverlappingIterator end();
- Fl_Rect_Region &clipped_rect();
- bool intersects();
- bool find_intersecting();
- bool find_next();
- Fl_Complex_Region *pRegion;
- Fl_Rect_Region pOriginalRect;
- Fl_Rect_Region pClippedRect;
- };
-
-public:
- Fl_Complex_Region();
- Fl_Complex_Region(const Fl_Rect_Region&);
- virtual ~Fl_Complex_Region() override;
- void delete_all_subregions();
-
- virtual void set(const Fl_Rect_Region &r) override;
- void set(const Fl_Complex_Region &r);
- virtual void set_empty() override { delete pSubregion; pSubregion=0L; Fl_Rect_Region::set_empty(); }
- Fl_Complex_Region *subregion() const { return pSubregion; }
- Fl_Complex_Region *next() const { return pNext; }
- Fl_Complex_Region *parent() const { return pParent; }
- char is_simple() const { return pSubregion==0; }
- char is_complex() const { return pSubregion!=0; }
-
- virtual int intersect_with(const Fl_Rect_Region &r) override;
- int subtract(const Fl_Rect_Region &r);
-
- virtual void print(const char*) const override;
-
- Iterator begin();
- Iterator end();
-
- Overlapping overlapping(const Fl_Rect_Region &r);
-
-protected:
- void print_data(int indent) const;
- int subtract_smaller_region(const Fl_Rect_Region &r);
- Fl_Complex_Region *add_subregion();
- void compress();
-
- Fl_Complex_Region *pSubregion = 0L;
- Fl_Complex_Region *pParent = 0L;
- Fl_Complex_Region *pNext = 0L;
-};
-
-
-#endif // FL_ANDROID_GRAPHICS_CLIPPING_H
diff --git a/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx b/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx
deleted file mode 100644
index 3f14319df..000000000
--- a/src/drivers/Android/Fl_Android_Graphics_Clipping.cxx
+++ /dev/null
@@ -1,808 +0,0 @@
-//
-// Clipping region routines for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-
-#include
-#include "Fl_Android_Graphics_Driver.H"
-#include "Fl_Android_Application.H"
-#include
-
-
-/**
- Create an empty clipping region.
- */
-Fl_Rect_Region::Fl_Rect_Region() :
- pLeft(0), pTop(0), pRight(0), pBottom(0)
-{
-}
-
-/**
- Create a clipping region based on position and size.
- \param x, y position
- \param w, h size
- */
-Fl_Rect_Region::Fl_Rect_Region(int x, int y, int w, int h) :
- pLeft(x), pTop(y), pRight(x+w), pBottom(y+h)
-{
-}
-
-/**
- Clone a clipping rectangle.
- */
-Fl_Rect_Region::Fl_Rect_Region(const Fl_Rect_Region &r) :
- pLeft(r.pLeft), pTop(r.pTop),
- pRight(r.pRight), pBottom(r.pBottom)
-{
-}
-
-/**
- Clone a clipping rectangle.
- The pointer can be NULL if an empty rectangle is needed.
- */
-Fl_Rect_Region::Fl_Rect_Region(enum Type what)
-{
- if (what==INFINITE) {
- pLeft = pTop = INT_MIN;
- pRight = pBottom = INT_MAX;
- } else {
- pLeft = pTop = pRight = pBottom = 0;
- }
-}
-
-/**
- If the rectangle has no width or height, it's considered empty.
- \return true, if everything will be clipped and there is nothing to draw
- */
-bool Fl_Rect_Region::is_empty() const
-{
- return (pRight<=pLeft || pBottom<=pTop);
-}
-
-/**
- Return true, if the rectangle is of unlimited size and nothing should be clipped.
- \return treu, if there is no clipping
- */
-bool Fl_Rect_Region::is_infinite() const
-{
- return (pLeft==INT_MIN);
-}
-
-/**
- Set an empty clipping rect.
- */
-void Fl_Rect_Region::set_empty()
-{
- pLeft = pTop = pRight = pBottom = 0;
-}
-
-/**
- Set a clipping rect using position and size
- \param x, y position
- \param w, h size
- */
-void Fl_Rect_Region::set(int x, int y, int w, int h)
-{
- pLeft = x;
- pTop = y;
- pRight = x+w;
- pBottom = y+h;
-}
-
-/**
- Set a rectangle using the coordinates of two points, top left and bottom right.
- \param l, t left and top coordinate
- \param r, b right and bottom coordinate
- */
-void Fl_Rect_Region::set_ltrb(int l, int t, int r, int b)
-{
- pLeft = l;
- pTop = t;
- pRight = r;
- pBottom = b;
-}
-
-/**
- Copy the corrdinates from another rect.
- \param r source rectangle
- */
-void Fl_Rect_Region::set(const Fl_Rect_Region &r)
-{
- pLeft = r.pLeft;
- pTop = r.pTop;
- pRight = r.pRight;
- pBottom = r.pBottom;
-}
-
-/**
- Set this rect to be the intersecting area between the original rect and another rect.
- \param r another rectangular region
- \return EMPTY, if rectangles are not intersecting, SAME if this and rect are
- equal, LESS if the new rect is smaller than the original rect
- */
-int Fl_Rect_Region::intersect_with(const Fl_Rect_Region &r)
-{
- if (is_empty()) {
- return EMPTY;
- }
- if (r.is_empty()) {
- set_empty();
- return EMPTY;
- }
- bool same = true;
- if ( pLeft != r.pLeft ) {
- same = false;
- if ( r.pLeft > pLeft ) pLeft = r.pLeft;
- }
- if ( pTop != r.pTop ) {
- same = false;
- if ( r.pTop > pTop ) pTop = r.pTop;
- }
- if ( pRight != r.pRight ) {
- same = false;
- if ( r.pRight < pRight ) pRight = r.pRight;
- }
- if ( pBottom != r.pBottom ) {
- same = false;
- if ( r.pBottom < pBottom ) pBottom = r.pBottom;
- }
- if (same)
- return SAME;
- if (is_empty())
- return EMPTY;
- return LESS;
-}
-
-/**
- Use rectangle as a bounding box and add the outline of another rect.
- */
-void Fl_Rect_Region::add_to_bbox(const Fl_Rect_Region &r)
-{
- if (is_empty()) return;
- if (r.pLeftpRight) pRight = r.pRight;
- if (r.pBottom>pBottom) pBottom = r.pBottom;
-}
-
-/**
- Print the coordinates of the rect to the log.
- \param label some text that is logged with this message.
- */
-void Fl_Rect_Region::print(const char *label) const
-{
- Fl_Android_Application::log_i("---> Fl_Rect_Region: %s", label);
- Fl_Android_Application::log_i("Rect l:%d t:%d r:%d b:%d", left(), top(), right(), bottom());
-}
-
-// =============================================================================
-
-/**
- Create an empty complex region.
- */
-Fl_Complex_Region::Fl_Complex_Region() :
- Fl_Rect_Region()
-{
-}
-
-/**
- Create a complex region with the same bounds as the give rect.
- \param r region size
- */
-Fl_Complex_Region::Fl_Complex_Region(const Fl_Rect_Region &r) :
- Fl_Rect_Region(r)
-{
-}
-
-/**
- Delete this region, all subregions recursively, and all following regions.
- */
-Fl_Complex_Region::~Fl_Complex_Region()
-{
- delete_all_subregions();
-}
-
-/**
- Delete all subregions of this region.
- The pSubregion pointer should always be seen as a list of subregions, rather
- than a single region and some pNext pointer. So everything we do, we should
- probably do for every object in that list.
-
- Also note, that the top level region never has pNext pointing to anything.
- */
-void Fl_Complex_Region::delete_all_subregions()
-{
- // Do NOT delete the chain in pNext! The caller has to that job.
- // A top-level coplex region has pNext always set to NULL, and it does
- // delete all subregions chained via the subregion pNext.
- while (pSubregion) {
- Fl_Complex_Region *rgn = pSubregion;
- pSubregion = rgn->pNext;
- delete rgn; rgn = 0;
- }
-}
-
-/**
- Print the entire content of this region recursively.
- */
-void Fl_Complex_Region::print(const char *label) const
-{
- Fl_Android_Application::log_i("---> Fl_Complex_Region: %s", label);
- print_data(0);
-}
-
-/*
- Print the rectangular data only.
- */
-void Fl_Complex_Region::print_data(int indent) const
-{
- static const char *space = " ";
- if (pSubregion) {
- Fl_Android_Application::log_i("%sBBox l:%d t:%d r:%d b:%d", space+16-indent, left(), top(), right(), bottom());
- pSubregion->print_data(indent+1);
- } else {
- Fl_Android_Application::log_i("%sRect l:%d t:%d r:%d b:%d", space+16-indent, left(), top(), right(), bottom());
- }
- if (pNext) {
- pNext->print_data(indent);
- }
-}
-
-/**
- Replace this region with a rectangle.
- \param r the source rectangle
- */
-void Fl_Complex_Region::set(const Fl_Rect_Region &r)
-{
- Fl_Rect_Region::set(r);
- delete_all_subregions();
-}
-
-/**
- Replace this region with a copy of another region.
- This operation can be expensive for very complex regions.
- \param r the source region
- */
-void Fl_Complex_Region::set(const Fl_Complex_Region &r)
-{
- Fl_Rect_Region::set((const Fl_Rect_Region&)r);
- delete_all_subregions();
-
- Fl_Complex_Region *srcRgn = r.pSubregion;
- if (srcRgn) {
- // copy first subregion
- Fl_Complex_Region *dstRgn = pSubregion = new Fl_Complex_Region();
- pSubregion->set(*srcRgn);
- // copy rest of list
- while (srcRgn) {
- dstRgn->pNext = new Fl_Complex_Region();
- dstRgn = dstRgn->next();
- dstRgn->set(*srcRgn);
- srcRgn = srcRgn->next();
- }
- }
-}
-
-/**
- Set this region to the intersection of the original region and some rect.
- \param r intersect with this rectangle
- \return EMPTY, SAME, LESS
- */
-int Fl_Complex_Region::intersect_with(const Fl_Rect_Region &r)
-{
- if (pSubregion) {
- Fl_Complex_Region *rgn = pSubregion;
- while (rgn) {
- rgn->intersect_with(r);
- rgn = rgn->next();
- }
- compress();
- } else {
- Fl_Rect_Region::intersect_with(r);
- }
- return 0;
-}
-
-/**
- Subtract a rectangular region from this region.
- \param r the rect that we want removed
- \return currently 0, but could return something meaningful
- */
-int Fl_Complex_Region::subtract(const Fl_Rect_Region &r)
-{
- if (pSubregion) {
- Fl_Complex_Region *rgn = pSubregion;
- while (rgn) {
- rgn->subtract(r);
- rgn = rgn->next();
- }
- compress();
- } else {
- // Check if we overlap at all
- Fl_Rect_Region s(r);
- int intersects = s.intersect_with(*this);
- switch (intersects) {
- case EMPTY:
- // nothing to do
- break;
- case SAME:
- set_empty(); // Will be deleted by compress()
- break;
- case LESS:
- // split this rect into 1, 2, 3, or 4 new ones
- subtract_smaller_region(s);
- break;
- default:
- Fl_Android_Application::log_e("Invalid case in %s:%d", __FUNCTION__, __LINE__);
- break;
- }
- if (pSubregion) compress(); // because intersecting this may have created subregions
- }
- return 0;
-}
-
-/**
- Compress the subregion of this region if possible and update the bounding
- box of this region.
-
- Does not recurse down the tree!
- */
-void Fl_Complex_Region::compress()
-{
- // Can't compress anything that does not have a subregion
- if (!pSubregion) return;
-
- // remove all empty regions, because the really don't add anything (literally)
- // print("Compress");
- Fl_Complex_Region *rgn = pSubregion;
- while (rgn && rgn->is_empty()) {
- pSubregion = rgn->next();
- delete rgn; rgn = pSubregion;
- }
- if (!pSubregion) return;
-
- rgn = pSubregion;
- while (rgn) {
- while (rgn->pNext && rgn->pNext->is_empty()) {
- Fl_Complex_Region *nextNext = rgn->pNext->pNext;
- delete rgn->pNext; rgn->pNext = nextNext;
- }
- rgn = rgn->next();
- }
-
- // find rectangles that can be merged into a single new rectangle
- // (Too much work for much too little benefit)
-
- // if there is only a single subregion left, merge it into this region
- if (pSubregion->pNext==nullptr) {
- set((Fl_Rect_Region&)*pSubregion); // deletes subregion for us
- }
- if (!pSubregion) return;
-
- // finally, update the boudning box
- Fl_Rect_Region::set((Fl_Rect_Region&)*pSubregion);
- for (rgn=pSubregion->pNext; rgn; rgn=rgn->pNext) {
- add_to_bbox(*rgn);
- }
-}
-
-/**
- Subtract a smaller rect from a larger rect, potentially creating four new rectangles.
- This assumes that the calling region is NOT complex.
- \param r subtract the area of this rectangle; r must fit within ``this``.
- \return currently 0, but this may change
- */
-int Fl_Complex_Region::subtract_smaller_region(const Fl_Rect_Region &r)
-{
- // subtract a smaller rect from a larger rect and create subrects as needed
- // if there is only one single coordinate different, we can reuse this container
- if (left()==r.left() && top()==r.top() && right()==r.right() && bottom()==r.bottom()) {
- // this should not happen
- set_empty();
- } else if (left()!=r.left() && top()==r.top() && right()==r.right() && bottom()==r.bottom()) {
- pRight = r.left();
- } else if (left()==r.left() && top()!=r.top() && right()==r.right() && bottom()==r.bottom()) {
- pBottom = r.top();
- } else if (left()==r.left() && top()==r.top() && right()!=r.right() && bottom()==r.bottom()) {
- pLeft = r.right();
- } else if (left()==r.left() && top()==r.top() && right()==r.right() && bottom()!=r.bottom()) {
- pTop = r.bottom();
- } else {
- // create multiple regions
- if (pTop!=r.top()) {
- Fl_Complex_Region *s = add_subregion();
- s->set_ltrb(pLeft, pTop, pRight, r.top());
- }
- if (pBottom!=r.bottom()) {
- Fl_Complex_Region *s = add_subregion();
- s->set_ltrb(pLeft, r.bottom(), pRight, pBottom);
- }
- if (pLeft!=r.left()) {
- Fl_Complex_Region *s = add_subregion();
- s->set_ltrb(pLeft, r.top(), r.left(), r.bottom());
- }
- if (pRight!=r.right()) {
- Fl_Complex_Region *s = add_subregion();
- s->set_ltrb(r.right(), r.top(), pRight, r.bottom());
- }
- }
- return 0;
-}
-
-/**
- Add an empty subregion to the current region.
- \return a pointer to the newly created region.
- */
-Fl_Complex_Region *Fl_Complex_Region::add_subregion()
-{
- Fl_Complex_Region *r = new Fl_Complex_Region();
- r->pParent = this;
- r->pNext = pSubregion;
- pSubregion = r;
- return r;
-}
-
-
-// -----------------------------------------------------------------------------
-
-/**
- Returns an iterator object for loops that traverse the entire region tree.
- C++11 interface to range-based loops.
- \return Iterator pointing to the first element.
- */
-Fl_Complex_Region::Iterator Fl_Complex_Region::begin()
-{
- return Iterator(this);
-}
-
-/**
- Returns an interator object to mark the end of travesing the tree.
- C++11 interface to range-based loops.
- \return
- */
-Fl_Complex_Region::Iterator Fl_Complex_Region::end()
-{
- return Iterator(nullptr);
-}
-
-/**
- Create an iterator to walk the entire tree.
- \param r Iterate through this region, r must not have a parent().
- */
-Fl_Complex_Region::Iterator::Iterator(Fl_Complex_Region *r) :
- pRegion(r)
-{
-}
-
-/**
- Compare two iterators.
- C++11 needs this to find the end of a for loop.
- \param other
- \return
- */
-bool Fl_Complex_Region::Iterator::operator!=(const Iterator &other) const
-{
- return pRegion != other.pRegion;
-}
-
-/**
- Set the iterator to the next object in the tree, down first.
- C++11 needs this to iterate in a for loop.
- \return
- */
-const Fl_Complex_Region::Iterator &Fl_Complex_Region::Iterator::operator++()
-{
- if (pRegion->subregion()) {
- pRegion = pRegion->subregion();
- } else if (pRegion->next()) {
- pRegion = pRegion->next();
- } else {
- pRegion = pRegion->parent();
- }
- return *this;
-}
-
-/**
- Return the current object while iterating through the tree.
- \return
- */
-Fl_Complex_Region *Fl_Complex_Region::Iterator::operator*() const
-{
- return pRegion;
-}
-
-// -----------------------------------------------------------------------------
-
-/**
- Use this to iterate through a region, hitting only nodes that intersect with this rect.
- \param r find all parts of the region that intersect with this rect.
- \return an object that can be used in range-based for loops in C++11.
- */
-Fl_Complex_Region::Overlapping Fl_Complex_Region::overlapping(const Fl_Rect_Region &r)
-{
- return Overlapping(this, r);
-}
-
-/**
- A helper object for iterating through a region, finding only overlapping rects.
- \param rgn
- \param rect
- */
-Fl_Complex_Region::Overlapping::Overlapping(Fl_Complex_Region *rgn,
- const Fl_Rect_Region &rect) :
- pRegion(rgn),
- pOriginalRect(rect),
- pClippedRect(rect)
-{
-}
-
-/**
- Return an itertor for the first clipping rectangle inside the region.
- \return
- */
-Fl_Complex_Region::Overlapping::OverlappingIterator Fl_Complex_Region::Overlapping::begin()
-{
- find_intersecting();
- return OverlappingIterator(this);
-}
-
-/**
- Return an iterator for the end of forward iteration.
- \return
- */
-Fl_Complex_Region::Overlapping::OverlappingIterator Fl_Complex_Region::Overlapping::end()
-{
- return OverlappingIterator(nullptr);
-}
-
-/**
- Return the result of intersecting the original rect with this iterator.
- \return
- */
-Fl_Rect_Region &Fl_Complex_Region::Overlapping::clipped_rect()
-{
- return pClippedRect;
-}
-
-/**
- Store the intersection in pClippedRect and return true if there was an intersection.
- \return
- */
-bool Fl_Complex_Region::Overlapping::intersects()
-{
- return (pClippedRect.intersect_with(*pRegion) != EMPTY);
-}
-
-/**
- Find the next element in the tree that actually intersects with the initial rect.
- Starting the search at the current object, NOT the next object.
- \return
- */
-bool Fl_Complex_Region::Overlapping::find_intersecting()
-{
- for (;;) {
- if (!pRegion) return false;
- pClippedRect.set(pOriginalRect);
- if (intersects()) {
- if (!pRegion->subregion()) {
- return true;
- } else {
- pRegion = pRegion->subregion();
- }
- } else {
- find_next();
- }
- }
-}
-
-/**
- Find the next object in the tree, complex, simple, intersecting or not.
- \return
- */
-bool Fl_Complex_Region::Overlapping::find_next()
-{
- if (pRegion->subregion()) {
- pRegion = pRegion->subregion();
- } else if (pRegion->next()) {
- pRegion = pRegion->next();
- } else {
- pRegion = pRegion->parent(); // can be NULL
- }
- return (pRegion != nullptr);
-}
-
-// -----------------------------------------------------------------------------
-
-/**
- Create the actual iterator for finding true clipping rects.
- \see Fl_Complex_Region::Overlapping
- \param ov
- */
-Fl_Complex_Region::Overlapping::OverlappingIterator::OverlappingIterator(
- Overlapping *ov) :
- pOv(ov)
-{
-}
-
-/**
- Compare two iterator.
- This is used by C++11 range-based for loops to find the end of the range.
- \param other
- \return
- */
-bool Fl_Complex_Region::Overlapping::OverlappingIterator::operator!=(
- const OverlappingIterator &other) const
-{
- auto thisRegion = pOv ? pOv->pRegion : nullptr;
- auto otherRegion = other.pOv ? other.pOv->pRegion : nullptr;
- return thisRegion != otherRegion;
-}
-
-/**
- Wrapper to find and set the next intersecting rectangle.
- \see Fl_Complex_Region::Overlapping::find_intersecting
- \see Fl_Complex_Region::Overlapping::find_next
- \return
- */
-const Fl_Complex_Region::Overlapping::OverlappingIterator &
-Fl_Complex_Region::Overlapping::OverlappingIterator::operator++()
-{
- pOv->find_next();
- if (pOv->pRegion)
- pOv->find_intersecting();
- return *this;
-}
-
-/**
- Return the Fl_Complex_Region::Overlapping state for this iterator.
- This gives the user access to the current rectangular fragment of
- the clipping region.
- \return
- */
-Fl_Complex_Region::Overlapping *
-Fl_Complex_Region::Overlapping::OverlappingIterator::operator*() const
-{
- return pOv;
-}
-
-// =============================================================================
-
-
-void Fl_Android_Graphics_Driver::restore_clip()
-{
- fl_clip_state_number++;
-
- // find the current user clipping rectangle
- Fl_Region b = rstack[rstackptr]; // Fl_Region is a pointer to Fl_Rect_Region
- if (b) {
- if (b->is_empty()) {
- // if this is an empty region, the intersection is always empty as well
- pClippingRegion.set_empty();
- } else {
- // if there is a region, copy the full window region
- pClippingRegion.set(pDesktopWindowRegion);
- if (!b->is_infinite()) {
- // if the rect has dimensions, calculate the intersection
- pClippingRegion.intersect_with(*b);
- }
- }
- } else {
- // no rect? Just copy the window region
- pClippingRegion.set(pDesktopWindowRegion);
- }
-}
-
-
-void Fl_Android_Graphics_Driver::clip_region(Fl_Region r)
-{
- Fl_Region oldr = rstack[rstackptr];
- if (oldr)
- ::free(oldr);
- rstack[rstackptr] = r;
- restore_clip();
-}
-
-
-Fl_Region Fl_Android_Graphics_Driver::clip_region()
-{
- return rstack[rstackptr];
-}
-
-
-void Fl_Android_Graphics_Driver::push_clip(int x, int y, int w, int h)
-{
- Fl_Region r;
- if (w > 0 && h > 0) {
- r = new Fl_Rect_Region(x, y, w, h);
- Fl_Region current = rstack[rstackptr];
- if (current) {
- r->intersect_with(*current);
- }
- } else { // make empty clip region:
- r = new Fl_Rect_Region();
- }
- if (rstackptr < region_stack_max) rstack[++rstackptr] = r;
- else Fl::warning("Fl_Android_Graphics_Driver::push_clip: clip stack overflow!\n");
- restore_clip();
-}
-
-
-void Fl_Android_Graphics_Driver::push_no_clip()
-{
- if (rstackptr < region_stack_max) rstack[++rstackptr] = 0;
- else Fl::warning("Fl_Android_Graphics_Driver::push_no_clip: clip stack overflow!\n");
- restore_clip();
-}
-
-
-void Fl_Android_Graphics_Driver::pop_clip()
-{
- if (rstackptr > 0) {
- Fl_Region oldr = rstack[rstackptr--];
- if (oldr)
- ::free(oldr);
- } else Fl::warning("Fl_Android_Graphics_Driver::pop_clip: clip stack underflow!\n");
- restore_clip();
-}
-
-/*
- Intersects the rectangle with the current clip region and returns the
- bounding box of the result.
-
- Returns non-zero if the resulting rectangle is different to the original.
- This can be used to limit the necessary drawing to a rectangle.
- \p W and \p H are set to zero if the rectangle is completely outside the region.
- \param[in] x,y,w,h position and size of rectangle
- \param[out] X,Y,W,H position and size of resulting bounding box.
- \returns Non-zero if the resulting rectangle is different to the original.
- */
-int Fl_Android_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y, int& W, int& H)
-{
- Fl_Region r = rstack[rstackptr];
- if (r) {
- Fl_Rect_Region a(x, y, w, h);
- int ret = a.intersect_with(*r);
- X = a.x();
- Y = a.y();
- W = a.w();
- H = a.h();
- return (ret!=Fl_Rect_Region::SAME);
- } else {
- X = x; Y = y; W = w; H = h;
- return 0;
- }
-}
-
-/*
- Does the rectangle intersect the current clip region?
- \param[in] x,y,w,h position and size of rectangle
- \returns non-zero if any of the rectangle intersects the current clip
- region. If this returns 0 you don't have to draw the object.
-
- \note
- Under X this returns 2 if the rectangle is partially clipped,
- and 1 if it is entirely inside the clip region.
- */
-int Fl_Android_Graphics_Driver::not_clipped(int x, int y, int w, int h)
-{
- if (w <= 0 || h <= 0) return 0;
- Fl_Region r = rstack[rstackptr];
- if (r) {
- Fl_Rect_Region a(x, y, w, h); // return 0 for empty, 1 for same, 2 if intersecting
- return a.intersect_with(*r);
- } else {
- return 1;
- }
-}
diff --git a/src/drivers/Android/Fl_Android_Graphics_Driver.H b/src/drivers/Android/Fl_Android_Graphics_Driver.H
deleted file mode 100644
index 1c54a0ff2..000000000
--- a/src/drivers/Android/Fl_Android_Graphics_Driver.H
+++ /dev/null
@@ -1,352 +0,0 @@
-//
-// Definition of classes Fl_Graphics_Driver, Fl_Surface_Device, Fl_Display_Device
-// for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-/**
- \file Fl_Android_Graphics_Driver.H
- \brief Definition of Android graphics driver.
- */
-
-#ifndef FL_ANDROID_GRAPHICS_DRIVER_H
-#define FL_ANDROID_GRAPHICS_DRIVER_H
-
-#include
-#include "Fl_Android_Graphics_Clipping.H"
-#include "Fl_Android_Graphics_Font.H"
-#include
-
-
-class Fl_Android_Window_Driver;
-class Fl_Android_Bytemap;
-class Fl_Android_565A_Map;
-
-/**
- \brief The Windows-specific graphics driver class.
-
- This class is implemented only on the Windows platform.
-*/
-class FL_EXPORT Fl_Android_Graphics_Driver : public Fl_Graphics_Driver
-{
- // easy access to the super class
- typedef Fl_Graphics_Driver super;
-
-protected:
- class Vertex; // see below
-
- // --- this is a copy of Fl_Graphics_Driver ----------------------------------
- // - use this to find unimplementet calls in the derived driver
- // - excluded by #if/#endif means that we have not implemneted this yet
- // - methods marked with // super: use the implemnetation of the super class
- // - virtual ... override functions are implemented for Android
-private:
- virtual void draw_fixed(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) override;
- virtual void draw_fixed(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) override;
- virtual void draw_fixed(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy) override;
- // some platforms may need to reimplement this
- // This is called from the surface device, see: end_current()
- // super: virtual void set_current_();
-protected:
- /** Sets the current value of the scaling factor */
- // super: virtual void scale(float f) { scale_ = f; } // we do not support any scaling at this point
-protected:
- // set fl_gc, which we do not use in the Android port at this point
- // super: virtual void global_gc();
- /** Support function for Fl_Pixmap drawing */
- virtual void cache(Fl_Pixmap *img) override;
- /** Support function for Fl_Bitmap drawing */
- virtual void cache(Fl_Bitmap *img) override;
- virtual void cache(Fl_RGB_Image *img) override;
- /** Support function for Fl_RGB_Image drawing */
- virtual void uncache(Fl_RGB_Image *img, fl_uintptr_t &id_, fl_uintptr_t &mask_) override;
- // --- implementation is in src/drivers/xxx/Fl_xxx_Graphics_Driver_image.cxx
- /** see fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L) */
- virtual void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0) override;
- /** see fl_draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D, int L) */
- virtual void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0) override;
- /** see fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D) */
- virtual void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3) override;
- /** see fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D) */
- virtual void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1) override;
-#if 0
- // TODO: where are begine_, end_, create_, and delete_offscreen? Answer: Fl_Image_Surface - you know what to do!
- virtual void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
- /** Support function for image drawing */
- // TODO: these seem to be only needed if FL_Image and Fl_Pixmap store alpha values seperatley.
- virtual Fl_Bitmask create_bitmask(int w, int h, const uchar *array) {return 0; }
-#endif
- // Support function for image drawing
- virtual void uncache_pixmap(fl_uintptr_t p) override;
- // Support function for image drawing
- virtual void delete_bitmask(Fl_Bitmask bm) override;
-public:
- /** Constructor, C++11 initialises member variables in-line */
- Fl_Android_Graphics_Driver();
- /** destructor */
- virtual ~Fl_Android_Graphics_Driver() override;
- /** Return whether the graphics driver can do alpha blending */
- virtual char can_do_alpha_blending() override { return 0; }
- // --- implementation is in src/fl_rect.cxx which includes src/drivers/xxx/Fl_xxx_Graphics_Driver_rect.cxx
- /** see fl_point() */
- virtual void point(int x, int y) override;
- /** see fl_rect() */
- virtual void rect(int x, int y, int w, int h) override;
- // super: virtual void focus_rect(int x, int y, int w, int h);
- /** see fl_rectf() */
- virtual void rectf(int x, int y, int w, int h) override;
- /** see fl_line(int, int, int, int) */
- virtual void line(int x, int y, int x1, int y1) override;
- /** see fl_line(int, int, int, int, int, int) */
- virtual void line(int x, int y, int x1, int y1, int x2, int y2) override;
- /** see fl_xyline(int, int, int) */
- virtual void xyline(int x, int y, int x1) override;
- /** see fl_xyline(int, int, int, int) */
- virtual void xyline(int x, int y, int x1, int y2) override;
- /** see fl_xyline(int, int, int, int, int) */
- virtual void xyline(int x, int y, int x1, int y2, int x3) override;
- /** see fl_yxline(int, int, int) */
- virtual void yxline(int x, int y, int y1) override;
- /** see fl_yxline(int, int, int, int) */
- virtual void yxline(int x, int y, int y1, int x2) override;
- /** see fl_yxline(int, int, int, int, int) */
- virtual void yxline(int x, int y, int y1, int x2, int y3) override;
- /** see fl_loop(int, int, int, int, int, int) */
- virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2) override;
- /** see fl_loop(int, int, int, int, int, int, int, int) */
- virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) override;
- /** see fl_polygon(int, int, int, int, int, int) */
- virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2) override;
- /** see fl_polygon(int, int, int, int, int, int, int, int) */
- virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) override;
- // --- clipping
- /** see fl_push_clip() */
- virtual void push_clip(int x, int y, int w, int h) override;
- /** see fl_clip_box() */
- virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H) override;
- /** see fl_not_clipped() */
- virtual int not_clipped(int x, int y, int w, int h) override;
- /** see fl_push_no_clip() */
- virtual void push_no_clip() override;
- /** see fl_pop_clip() */
- virtual void pop_clip() override;
- virtual Fl_Region clip_region() override;
- virtual void clip_region(Fl_Region r) override;
- virtual void restore_clip() override;
- // --- implementation is in src/fl_vertex.cxx which includes src/drivers/xxx/Fl_xxx_Graphics_Driver_vertex.cxx
- // super: virtual void push_matrix();
- // super: virtual void pop_matrix();
- // super: virtual void mult_matrix(double a, double b, double c, double d, double x, double y);
- // super: virtual void rotate(double d);
- // super: virtual void translate(double x,double y);
- virtual void begin_points() override;
- virtual void begin_line() override;
- virtual void begin_loop() override;
- virtual void begin_polygon() override;
- virtual void begin_complex_polygon() override;
- // super: virtual double transform_x(double x, double y);
- // super: virtual double transform_y(double x, double y);
- // super: virtual double transform_dx(double x, double y);
- // super: virtual double transform_dy(double x, double y);
- /** see fl_transformed_vertex() */
- virtual void transformed_vertex(double xf, double yf) override;
- /** see fl_vertex() */
- virtual void vertex(double x, double y) override;
- /** see fl_end_points() */
- virtual void end_points() override;
- /** see fl_end_line() */
- virtual void end_line() override;
- /** see fl_end_loop() */
- virtual void end_loop() override;
- /** see fl_end_polygon() */
- virtual void end_polygon() override;
- /** see fl_end_complex_polygon() */
- virtual void end_complex_polygon() override;
- /** see fl_gap() */
- virtual void gap() override;
- /** see fl_circle() */
- virtual void circle(double x, double y, double r) override;
- // --- implementation is in src/fl_arc.cxx which includes src/drivers/xxx/Fl_xxx_Graphics_Driver_arc.cxx if needed
- virtual void arc(double x, double y, double r, double start, double end) override { super::arc(x, y, r, start, end); }
- // --- implementation is in src/fl_arci.cxx which includes src/drivers/xxx/Fl_xxx_Graphics_Driver_arci.cxx
- /** see fl_arc(int x, int y, int w, int h, double a1, double a2) */
- virtual void arc(int x, int y, int w, int h, double a1, double a2) override;
- /** see fl_pie() */
- virtual void pie(int x, int y, int w, int h, double a1, double a2) override;
- // --- implementation is in src/fl_curve.cxx which includes src/drivers/xxx/Fl_xxx_Graphics_Driver_curve.cxx if needed
- // super: virtual void curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);
- // --- implementation is in src/fl_line_style.cxx which includes src/cfg_gfx/xxx_line_style.cxx
- // TODO: line_style()
- /** see fl_line_style() */
- virtual void line_style(int style, int width=0, char* dashes=0) override;
- // --- implementation is in src/fl_color.cxx which includes src/cfg_gfx/xxx_color.cxx
- /** see fl_color(Fl_Color) */
- virtual void color(Fl_Color c) override { super::color(c); }
- virtual void set_color(Fl_Color i, unsigned int c) override;
- // super: virtual void free_color(Fl_Color i, int overlay);
- /** see fl_color(void) */
- virtual Fl_Color color() override { return super::color(); }
- /** see fl_color(uchar, uchar, uchar) */
- virtual void color(uchar r, uchar g, uchar b) override;
- /** see fl_draw(const char *str, int n, int x, int y) */
- virtual void draw(const char *str, int n, int x, int y) override;
- /** Draw the first \p n bytes of the string \p str starting at position \p x , \p y */
- // super: virtual void draw(const char *str, int n, float x, float y);
- /** see fl_draw(int angle, const char *str, int n, int x, int y) */
- // TODO: drawing text at an angle is not supported
- virtual void draw(int angle, const char *str, int n, int x, int y) override { draw(str, n, x, y); }
- /** see fl_rtl_draw(const char *str, int n, int x, int y) */
- // TODO: drawing text right-to-left is not supported
- virtual void rtl_draw(const char *str, int n, int x, int y) override { draw(str, n, x, y); }
- /** Returns non-zero if the graphics driver possesses the \p feature */
- // super: virtual int has_feature(driver_feature feature)
- /** see fl_font(Fl_Font, Fl_Fontsize) */
- virtual void font(Fl_Font face, Fl_Fontsize fsize) override;
- /** see fl_font(void) */
- virtual Fl_Font font() override { return super::font(); }
- /** Return the current font size */
- virtual Fl_Fontsize size() override;
- /** Compute the width of the first \p n bytes of the string \p str if drawn with current font */
- virtual double width(const char *str, int n) override;
- /** Compute the width of Unicode character \p c if drawn with current font */
- virtual double width(unsigned int c) override;
- virtual void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h) override;
- /** Return the current line height */
- virtual int height() override;
- /** Return the current line descent */
- virtual int descent() override;
- /** Return the current Fl_Font_Descriptor */
- // super: inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}
- /** Set the current Fl_Font_Descriptor */
- // super: virtual void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}
-#if 0
- // FIXME: do we need to implement any of the functions below?
- /** Sets the value of the driver-specific graphics context. */
- virtual void gc(void*) {}
- /** Returns the driver-specific graphics context, of NULL if there's none. */
- virtual void *gc(void) {return NULL;}
- /** Support for pixmap drawing */
- virtual uchar **mask_bitmap() { return 0; }
- /** Support for pixmap drawing */
- virtual void mask_bitmap(uchar **) {}
-#endif
- // default implementation may be enough
- /** Support for PostScript drawing */
- virtual float scale_font_for_PostScript(Fl_Font_Descriptor *desc, int s) override { return float(s); }
- // default implementation may be enough
- /** Support for PostScript drawing - no documentation found on this call*/
- // super: virtual float scale_bitmap_for_PostScript() { return 2; }
- // super: virtual void set_spot(int font, int size, int X, int Y, int W, int H, Fl_Window *win);
- // super: virtual void reset_spot();
- // each platform implements these 3 functions its own way
- /* TODO: Android: we can implement this to have a redraw region based on Fl::damage
- * calls. Currently, we do not implement damage regions, but we can probably
- * implement this using our clipping regions. This may become neccesary when
- * we allow desktop-style window movement.
- */
- // super: virtual void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h);
- // super: virtual Fl_Region XRectangleRegion(int x, int y, int w, int h);
- // super: virtual void XDestroyRegion(Fl_Region r);
- /** Support for Fl::get_font_name() */
- virtual const char* get_font_name(Fl_Font fnum, int* ap) override;
- /** Support for Fl::get_font_sizes() */
- virtual int get_font_sizes(Fl_Font fnum, int*& sizep) override;
- /** Support for Fl::set_fonts() */
- virtual Fl_Font set_fonts(const char *name) override;
- /** Some platforms may need to implement this to support fonts */
- // super: virtual Fl_Fontdesc* calc_fl_fonts(void) {return NULL;}
- /** Support for Fl::set_font() */
- // super: virtual unsigned font_desc_size();
- /** Support for Fl::get_font() */
- virtual const char *font_name(int num) override;
- /** Support for Fl::set_font() */
- virtual void font_name(int num, const char *name) override;
- /** Support function for fl_overlay_rect() and scaled GUI.
- Defaut implementation may be enough */
- // super: virtual void overlay_rect(int x, int y, int w , int h) { loop(x, y, x+w-1, y, x+w-1, y+h-1, x, y+h-1); }
- // --- end of original Fl_Graphics_Driver header -----------------------------
-
- // --- start of Android additions --------------------------------------------
- // start drawing with this driver into the given window
- // The virtual call `set_current_()` changes surface, not windows
- void make_current(Fl_Window*);
-
-protected:
- static uint16_t make565(uchar r, uchar g, uchar b);
- static uint16_t make565(Fl_Color crgba);
- void rectf_unclipped(int x, int y, int w, int h);
- void xyline_unclipped(int x, int y, int x1);
- void yxline_unclipped(int x, int y, int y1);
- void end_polygon(int begin, int end);
- void ellipse(double xt, double yt, double rx, double ry);
- void draw(int xx, int yy, Fl_Android_565A_Map *bm, Fl_Rect_Region &r);
- void draw(int x, int y, Fl_Android_Bytemap *bm, Fl_Rect_Region &r);
- int render_letter(int xx, int yy, uint32_t c, Fl_Rect_Region &r);
-
- // pointer into the screen buffer at the top left corner of the current window
- uint16_t *pBits = nullptr;
-
- // advance to next line in screen buffer
- int32_t pStride = 0;
-
- // TODO: current line style, temp kludge to make focus rect work.
- int pLineStyle = 0;
-
- // Clipping region of the current window in window coordinates (see: pStride and pBits)
- Fl_Rect_Region pWindowRegion;
-
- // clipping region of the window minus overlapping other windows
- Fl_Complex_Region pDesktopWindowRegion;
-
- // Final clipping region for all graphics calls to this class.
- Fl_Complex_Region pClippingRegion;
-
- // store vertices for begin_.../end_... drawing
- class Vertex {
- public:
- void set(float x, float y, bool gap = false) { pX = x; pY = y; pIsGap = gap; }
- float pX, pY;
- bool pIsGap;
- };
-
- void begin_vertices();
- void add_vertex(float x, float y, bool gap=false);
- int pnVertex = 0, pNVertex = 0, pVertexGapStart = 0;
- Vertex *pVertex = nullptr;
-};
-
-
-#if 0
-/**
- The graphics driver used when printing on Android.
-*/
-class FL_EXPORT Fl_Android_Printer_Graphics_Driver : public Fl_Android_Graphics_Driver {
-
-#if 0
-
-private:
- typedef BOOL (WINAPI* transparent_f_type) (HDC,int,int,int,int,HDC,int,int,int,int,UINT);
- transparent_f_type TransparentBlt();
-public:
- virtual int has_feature(driver_feature mask) { return mask & (NATIVE | PRINTER); }
- void draw_unscaled(Fl_Pixmap *pxm, float s, int XP, int YP, int WP, int HP, int cx, int cy);
- void draw_unscaled(Fl_Bitmap *bm, float s, int XP, int YP, int WP, int HP, int cx, int cy);
-
-#endif
-
-};
-#endif
-
-
-#endif // FL_ANDROID_GRAPHICS_DRIVER_H
diff --git a/src/drivers/Android/Fl_Android_Graphics_Driver.cxx b/src/drivers/Android/Fl_Android_Graphics_Driver.cxx
deleted file mode 100644
index 75c4e082a..000000000
--- a/src/drivers/Android/Fl_Android_Graphics_Driver.cxx
+++ /dev/null
@@ -1,1257 +0,0 @@
-//
-// Graphics routines for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-
-#include
-#include "Fl_Android_Application.H"
-#include "Fl_Android_Graphics_Driver.H"
-#include "Fl_Android_Screen_Driver.H"
-#include
-#include
-#include
-#include
-
-
-extern int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg);
-
-static int sign(int v) { return (v<0) ? -1 : 1; }
-
-/*
- By linking this module, the following static method will instantiate the
- Windows GDI Graphics driver as the main display driver.
- */
-Fl_Graphics_Driver *Fl_Graphics_Driver::newMainGraphicsDriver()
-{
- return new Fl_Android_Graphics_Driver();
-}
-
-
-/**
- Private default constructor.
- */
-Fl_Android_Graphics_Driver::Fl_Android_Graphics_Driver() :
- super()
-{
-}
-
-
-Fl_Android_Graphics_Driver::~Fl_Android_Graphics_Driver()
-{
-}
-
-
-void Fl_Android_Graphics_Driver::make_current(Fl_Window *win)
-{
- // In the special case of win==0, we activate the desktop (the screen
- // background) for drawing and clip out all visible windows
-
- // The Stride is the offset between lines in the graphics buffer
- pStride = Fl_Android_Application::graphics_buffer().stride;
- // Bits is the memory address of the top left corner of the window
- pBits = ((uint16_t*)(Fl_Android_Application::graphics_buffer().bits));
- if (win) pBits += win->x_root() + pStride * win->y_root();
-
- // TODO: set the clipping area
- // set the clipping area to the physical screen size in window coordinates
- if (win) {
- pWindowRegion.set(-win->x(), -win->y(), 600, 800);
- pWindowRegion.intersect_with(Fl_Rect_Region(0, 0, win->w(), win->h()));
- } else {
- pWindowRegion.set(0, 0, 600, 800);
- }
-
- pDesktopWindowRegion.set(pWindowRegion);
-
- // remove all window rectangles that are positioned on top of this window
- // TODO: this region is expensive to calculate. Cache it for each window and recalculate when windows move, show, hide, or change order
- // TODO: this is where we also need to subtract any possible window decoration, like the window title and drag bar, resizing edges, etc.
- Fl_Window *wTop = Fl::first_window();
- int wx = win ? win->x() : 0;
- int wy = win ? win->y() : 0;
- while (wTop) {
- if (wTop==win) break;
- Fl_Rect_Region r(wTop->x()-wx, wTop->y()-wy, wTop->w(), wTop->h());
- pDesktopWindowRegion.subtract(r);
- wTop = Fl::next_window(wTop);
- }
- pClippingRegion.set(pDesktopWindowRegion);
-}
-
-
-uint16_t Fl_Android_Graphics_Driver::make565(uchar red, uchar green, uchar blue)
-{
- return (uint16_t)( ((((uint16_t)(red)) << 8) & 0xf800) |
- ((((uint16_t)(green)) << 3) & 0x07e0) |
- ((((uint16_t)(blue)) >> 3) & 0x001f) );
-}
-
-extern unsigned fl_cmap[256];
-
-
-uint16_t Fl_Android_Graphics_Driver::make565(Fl_Color crgba)
-{
- if (crgba<0x00000100) crgba = fl_cmap[crgba];
- return (uint16_t)( ((crgba >> 16) & 0xf800) |
- ((crgba >> 13) & 0x07e0) |
- ((crgba >> 11) & 0x001f) );
-}
-
-
-void Fl_Android_Graphics_Driver::rectf(int x, int y, int w, int h)
-{
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x, y, w, h))) {
- Fl_Rect_Region &s = it->clipped_rect();
- rectf_unclipped(s.x(), s.y(), s.w(), s.h());
- }
-}
-
-
-void Fl_Android_Graphics_Driver::rectf_unclipped(int x, int y, int w, int h)
-{
- if (w<=0 || h<=0) return;
-
- uint16_t cc = make565(color());
- int32_t ss = pStride;
- uint16_t *bits = pBits;
- uint32_t xx = (uint32_t)x;
- uint32_t yy = (uint32_t)y;
- uint32_t ww = (uint32_t)w;
- uint32_t hh = (uint32_t)h;
- for (uint32_t iy = 0; iy0; --ix) {
- *d++ = cc;
- }
- }
-}
-
-
-void Fl_Android_Graphics_Driver::xyline(int x, int y, int x1)
-{
- float w;
- if (x1>x) {
- w = x1-x;
- } else {
- w = x-x1;
- x = x1;
- }
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x, y, w, 1))) {
- Fl_Rect_Region &s = it->clipped_rect();
- xyline_unclipped(s.x(), s.y(), s.right());
- }
-}
-
-
-void Fl_Android_Graphics_Driver::xyline(int x, int y, int x1, int y2)
-{
- xyline(x, y, x1);
- yxline(x1, y, y2);
-}
-
-
-void Fl_Android_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3)
-{
- xyline(x, y, x1);
- yxline(x1, y, y2);
- xyline(x1, y2, x3);
-}
-
-
-void Fl_Android_Graphics_Driver::xyline_unclipped(int x, int y, int x1)
-{
- uint16_t cc = make565(color());
- float w;
- if (x1>x) {
- w = x1-x+1;
- } else {
- w = x-x1+1;
- x = x1;
- }
- int32_t sx = 1;
- int32_t ss = pStride;
- uint16_t *bits = pBits;
- uint32_t xx = (uint32_t)x;
- uint32_t yy = (uint32_t)y;
- uint32_t ww = (uint32_t)w;
- uint16_t *d = bits + yy*ss + xx;
- if ((pLineStyle&0xff)==FL_DOT) { ww = ww/2; sx = sx*2; }
- for (uint32_t ix = ww; ix>0; --ix) {
- *d = cc;
- d+=sx;
- }
-}
-
-
-void Fl_Android_Graphics_Driver::yxline(int x, int y, int y1)
-{
- float h;
- if (y1>y) {
- h = y1-y+1;
- } else {
- h = y-y1+1;
- y = y1;
- }
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x, y, 1, h))) {
- Fl_Rect_Region &s = it->clipped_rect();
- yxline_unclipped(s.x(), s.y(), s.bottom());
- }
-}
-
-
-void Fl_Android_Graphics_Driver::yxline(int x, int y, int y1, int x2)
-{
- yxline(x, y, y1);
- xyline(x, y1, x2);
-}
-
-
-void Fl_Android_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3)
-{
- yxline(x, y, y1);
- xyline(x, y1, x2);
- yxline(x2, y1, y3);
-}
-
-
-void Fl_Android_Graphics_Driver::yxline_unclipped(int x, int y, int y1)
-{
- uint16_t cc = make565(color());
- float h = y1-y;
- int32_t ss = pStride;
- uint16_t *bits = pBits;
- uint32_t xx = (uint32_t)x;
- uint32_t yy = (uint32_t)y;
- uint32_t hh = (uint32_t)h;
- uint16_t *d = bits + yy*ss + xx;
- if ((pLineStyle&0xff)==FL_DOT) { hh = hh/2; ss = ss*2; }
- for (uint32_t iy = hh; iy>0; --iy) {
- *d = cc;
- d += ss;
- }
-}
-
-
-void Fl_Android_Graphics_Driver::rect(int x, int y, int w, int h)
-{
- xyline(x, y, x+w-1);
- yxline(x, y, y+h-1);
- yxline(x+w-1, y, y+h-1);
- xyline(x, y+h-1, x+w-1);
-}
-
-
-void Fl_Android_Graphics_Driver::line_style(int style, int width, char* dashes)
-{
- pLineStyle = style;
- // TODO: finish this!
-}
-
-/**
- Draw a single dot in the current color.
- \param x, y position relative to window.
- */
-void Fl_Android_Graphics_Driver::point(int x, int y)
-{
- // drawing a single point is insanely inefficient because we need to walk the
- // entire clipping region every time to see if the point needs to be drawn.
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x, y, 1, 1))) {
- Fl_Rect_Region &s = it->clipped_rect();
- uint16_t cc = make565(color());
- int32_t ss = pStride;
- uint16_t *bits = pBits;
- uint32_t xx = (uint32_t)x;
- uint32_t yy = (uint32_t)y;
- uint16_t *d = bits + yy*ss + xx;
- *d = cc;
- }
-
-}
-
-/**
- Draw a line.
- FIXME: it is incredibly inefficient to call 'point', especially for long lines
- FIXME: clipping maust be moved into this call and drawing to the screen should happen right here
- FIXME: line width is not considered
- */
-void Fl_Android_Graphics_Driver::line(int x, int y, int x1, int y1)
-{
- if (x==x1) {
- return yxline(x, y, y1);
- }
- if (y==y1) {
- return xyline(x, y, x1);
- }
- // Bresenham
- int w = x1 - x, dx = abs(w);
- int h = y1 - y, dy = abs(h);
- int dx1 = sign(w), dy1 = sign(h), dx2, dy2;
- int min, max;
- if (dx < dy) {
- min = dx; max = dy;
- dx2 = 0;
- dy2 = dy1;
- } else {
- min = dy; max = dx;
- dx2 = dx1;
- dy2 = 0;
- }
- int num = max/2;
- for (int i=max+1; i>0; i--) {
- point(x, y);
- num += min;
- if (num>=max) {
- num -= max;
- x += dx1;
- y += dy1;
- } else {
- x += dx2;
- y += dy2;
- }
- }
-}
-
-
-void Fl_Android_Graphics_Driver::line(int x, int y, int x1, int y1, int x2, int y2)
-{
- begin_line();
- transformed_vertex(x, y);
- transformed_vertex(x1, y1);
- transformed_vertex(x2, y2);
- end_line();
-}
-
-
-void Fl_Android_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int y2)
-{
- begin_loop();
- transformed_vertex(x0, y0);
- transformed_vertex(x1, y1);
- transformed_vertex(x2, y2);
- end_loop();
-}
-
-
-void Fl_Android_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3)
-{
- begin_loop();
- transformed_vertex(x0, y0);
- transformed_vertex(x1, y1);
- transformed_vertex(x2, y2);
- transformed_vertex(x3, y3);
- end_loop();
-}
-
-
-void Fl_Android_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, int y2)
-{
- begin_polygon();
- transformed_vertex(x0, y0);
- transformed_vertex(x1, y1);
- transformed_vertex(x2, y2);
- end_polygon();
-}
-
-
-void Fl_Android_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3)
-{
- begin_polygon();
- transformed_vertex(x0, y0);
- transformed_vertex(x1, y1);
- transformed_vertex(x2, y2);
- transformed_vertex(x3, y3);
- end_polygon();
-}
-
-
-/**
- Reset the vertex counter to zero.
- */
-void Fl_Android_Graphics_Driver::begin_vertices()
-{
- pnVertex = n = 0;
- pVertexGapStart = 0;
-}
-
-/**
- Add a vertex to the vertex list. Dynamically allocates memory.
- \param x, y position of the vertex after matrix transformation
- \param gap line and loop call offer to leave a gap in the drawing
- */
-void Fl_Android_Graphics_Driver::add_vertex(float x, float y, bool gap)
-{
- if (pnVertex == pNVertex) {
- pNVertex += 16;
- pVertex = (Vertex*)::realloc(pVertex, pNVertex*sizeof(Vertex));
- }
- pVertex[pnVertex].set(x, y);
- pVertex[pnVertex].pIsGap = gap;
- pnVertex++; n = pnVertex;
-}
-
-/**
- Start a list of vertices to draw multiple points.
- */
-void Fl_Android_Graphics_Driver::begin_points()
-{
- begin_vertices();
- super::begin_points();
-}
-
-/**
- Start a list of vertices to draw a polyline.
- */
-void Fl_Android_Graphics_Driver::begin_line()
-{
- begin_vertices();
- super::begin_line();
-}
-
-/**
- Start a list of vertices to draw a line loop.
- */
-void Fl_Android_Graphics_Driver::begin_loop()
-{
- begin_vertices();
- super::begin_loop();
-}
-
-/**
- Start a list of vertices to draw a polygon.
- */
-void Fl_Android_Graphics_Driver::begin_polygon()
-{
- begin_vertices();
- super::begin_polygon();
-}
-
-/**
- Start a list of vertices to draw a complex polygon.
- */
-void Fl_Android_Graphics_Driver::begin_complex_polygon()
-{
- begin_vertices();
- super::begin_complex_polygon();
-}
-
-/**
- Draw all stored vertices as points.
- */
-void Fl_Android_Graphics_Driver::end_points()
-{
- for (int i=0; ipX, xMax = xMin, yMin = v->pY, yMax = yMin;
- for (int i = begin+1; i < end; i++) {
- v = pVertex+i;
- if (v->pX < xMin) xMin = v->pX;
- if (v->pX > xMax) xMax = v->pX;
- if (v->pY < yMin) yMin = v->pY;
- if (v->pY > yMax) yMax = v->pY;
- }
- xMax++; yMax++;
-
- int nodes, nodeX[end - begin], pixelX, pixelY, i, j, swap;
-
- // Loop through the rows of the image.
- for (pixelY = yMin; pixelY < yMax; pixelY++) {
- // Build a list of nodes.
- nodes = 0;
- j = begin;
- for (i = begin+1; i < end; i++) {
- if ( (pVertex[i].pY < pixelY && pVertex[j].pY >= pixelY)
- || (pVertex[j].pY < pixelY && pVertex[i].pY >= pixelY))
- {
- float dy = pVertex[j].pY - pVertex[i].pY;
- if (fabsf(dy)>.0001) {
- nodeX[nodes++] = (int)(pVertex[i].pX +
- (pixelY - pVertex[i].pY) / dy
- * (pVertex[j].pX - pVertex[i].pX));
- } else {
- nodeX[nodes++] = pVertex[i].pX;
- }
- }
- j = i;
- }
-
- // Sort the nodes, via a simple “Bubble” sort.
- i = 0;
- while (i < nodes - 1) {
- if (nodeX[i] > nodeX[i + 1]) {
- swap = nodeX[i];
- nodeX[i] = nodeX[i + 1];
- nodeX[i + 1] = swap;
- if (i) i--;
- } else {
- i++;
- }
- }
-
- // Fill the pixels between node pairs.
- for (i = 0; i < nodes; i += 2) {
- if (nodeX[i] >= xMax) break;
- if (nodeX[i + 1] > xMin) {
- if (nodeX[i] < xMin) nodeX[i] = xMin;
- if (nodeX[i + 1] > xMax) nodeX[i + 1] = xMax;
- xyline(nodeX[i], pixelY, nodeX[i + 1]);
- }
- }
- }
-
-}
-
-/**
- Draw all stored vertices as a polygon.
- Mind the gap!
- */
-void Fl_Android_Graphics_Driver::end_polygon()
-{
- if (pnVertex==0) return;
- gap();
- int start = 0, end = 0;
- for (int i=0; ipX, xMax = xMin, yMin = v->pY, yMax = yMin;
- for (int i = begin+1; i < end; i++) {
- v = pVertex+i;
- if (v->pX < xMin) xMin = v->pX;
- if (v->pX > xMax) xMax = v->pX;
- if (v->pY < yMin) yMin = v->pY;
- if (v->pY > yMax) yMax = v->pY;
- }
- xMax++; yMax++;
-
- int nodes, nodeX[end - begin], pixelX, pixelY, i, j, swap;
-
- // Loop through the rows of the image.
- for (pixelY = yMin; pixelY < yMax; pixelY++) {
- // Build a list of nodes.
- nodes = 0;
- for (i = begin+1; i < end; i++) {
- j = i-1;
- if (pVertex[j].pIsGap)
- continue;
- if ( (pVertex[i].pY < pixelY && pVertex[j].pY >= pixelY)
- || (pVertex[j].pY < pixelY && pVertex[i].pY >= pixelY) )
- {
- float dy = pVertex[j].pY - pVertex[i].pY;
- if (fabsf(dy)>.0001) {
- nodeX[nodes++] = (int)(pVertex[i].pX +
- (pixelY - pVertex[i].pY) / dy
- * (pVertex[j].pX - pVertex[i].pX));
- } else {
- nodeX[nodes++] = pVertex[i].pX;
- }
- }
- }
- //Fl_Android_Application::log_e("%d nodes (must be even!)", nodes);
-
- // Sort the nodes, via a simple “Bubble” sort.
- i = 0;
- while (i < nodes - 1) {
- if (nodeX[i] > nodeX[i + 1]) {
- swap = nodeX[i];
- nodeX[i] = nodeX[i + 1];
- nodeX[i + 1] = swap;
- if (i) i--;
- } else {
- i++;
- }
- }
-
- // Fill the pixels between node pairs.
- for (i = 0; i < nodes; i += 2) {
- if (nodeX[i] >= xMax) break;
- if (nodeX[i + 1] > xMin) {
- if (nodeX[i] < xMin) nodeX[i] = xMin;
- if (nodeX[i + 1] > xMax) nodeX[i + 1] = xMax;
- xyline(nodeX[i], pixelY, nodeX[i + 1]);
- }
- }
- }
-}
-
-/**
- Add a gap to a polyline drawing
- */
-void Fl_Android_Graphics_Driver::gap()
-{
- // drop gaps at the start or gap after gap
- if (pnVertex==0 || pnVertex==pVertexGapStart)
- return;
-
- // create a loop
- Vertex &v = pVertex[pVertexGapStart];
- add_vertex(v.pX, v.pY, true);
- pVertexGapStart = pnVertex;
-}
-
-/**
- Add a vertex to the list.
- TODO: we should maintain a bounding box for faster clipping.
- */
-void Fl_Android_Graphics_Driver::transformed_vertex(double x, double y)
-{
- add_vertex(x, y);
-}
-
-
-void Fl_Android_Graphics_Driver::vertex(double x,double y)
-{
- transformed_vertex(x*m.a + y*m.c + m.x, x*m.b + y*m.d + m.y);
-}
-
-
-/**
- Draw an arc.
- \param xi
- \param yi
- \param w
- \param h
- \param a1
- \param a2
- FIXME: float-to-int interpolation is horrible!
- */
-void Fl_Android_Graphics_Driver::arc(int xi, int yi, int w, int h, double a1, double a2)
-{
- if (a2<=a1) return;
-
- double rx = w/2.0;
- double ry = h/2.0;
- double x = xi + rx;
- double y = yi + ry;
- double circ = M_PI*0.5*(rx+ry);
- int i, segs = circ * (a2-a1) / 1000; // every line is about three pixels long
- if (segs<3) segs = 3;
-
- int px, py;
- a1 = a1/180*M_PI;
- a2 = a2/180*M_PI;
- double step = (a2-a1)/segs;
-
- int nx = x + cos(a1)*rx;
- int ny = y - sin(a1)*ry;
- for (i=segs; i>0; i--) {
- a1+=step;
- px = nx; py = ny;
- nx = x + cos(a1)*rx;
- ny = y - sin(a1)*ry;
- line(px, py, nx, ny);
- }
-}
-
-/**
- Draw a piece of a pie.
- FIXME: this is not working very well at all.
- \param xi
- \param yi
- \param w
- \param h
- \param b1
- \param b2
- */
-void Fl_Android_Graphics_Driver::pie(int xi, int yi, int w, int h, double b1, double b2)
-{
- // quick access to bounding box size
- double rx = w / 2.0;
- double ry = h / 2.0;
- double x = xi + rx;
- double y = yi + ry;
-
-
- double a1 = b1 / 180 * M_PI;
- double a2 = b2 / 180 * M_PI;
-
- // invert to make b1 always the smaller value
- if (b1 > b2) {
- b1 -= 360.0;
- }
- if (b1 == b2) return;
-
- // make the top the zero degree origin, turning CCW
- b1 -= 90.0;
- b2 -= 90.0;
-
- // find the delta between angles
- double delta = b2 - b1;
- if (delta >= 360.0) {
- b1 = 0.0;
- b2 = 360.0;
- delta = 360.0;
- }
-
- // make sure that b2 is always in the range [0.0..360.0]
- if (b2 > 360.0) b2 -= 360.0; // FIXME: fmod(...)
- if (b2 < 0.0) b2 += 360.0;
- b1 = b2 - delta;
- // now b1 is [-360...360] and b2 is [0..360] and b1= 0 && b1 < 90) {
- loInside = true;
- loLeft = -sinALrx;
- loRight = a1Slope * (iy - y);
- }
- if (b2 >= 0 && b2 < 90) {
- hiInside = true;
- if (aL < a2)
- hiLeft = -sinALrx;
- else
- hiLeft = a2Slope * (iy - y);
- }
- if (loInside && hiInside && !flipped) {
-// fl_color(FL_GREEN);
- if (a1 < aL)
- xyline(x + hiLeft, iy, x + loRight);
- } else {
- if ((!loInside) && (!hiInside)) {
-// fl_color(FL_MAGENTA);
- if ( (b1o<=0.0 && b2>=90.0) || (b1o<=(0.0-360.0) && b2>=(90.0-360.0)) )
- xyline(x - sinALrx, iy, x);
- } else {
- if (loInside) {
-// fl_color(FL_BLUE);
- if (a1 < aL)
- xyline(x + loLeft, iy, x + loRight);
- }
- if (hiInside) {
-// fl_color(FL_YELLOW);
- xyline(x + hiLeft, iy, x);
- }
- }
- }
- } else {
- // rasterize bottom left quadrant
- bool loInside = false, hiInside = false;
- double loLeft = 0.0, loRight = 0.0;
- double hiLeft = 0.0, hiRight = 0.0;
- if (b1 >= 90 && b1 < 180) {
- loInside = true;
- if (aL>=a1)
- loLeft = -sinALrx;
- else
- loLeft = a1Slope * (iy - y);
- }
- if (b2 >= 90 && b2 < 180) {
- hiInside = true;
- hiLeft = -sinALrx;
- hiRight = a2Slope * (iy - y);
- }
- if (loInside && hiInside && !flipped) {
-// fl_color(FL_GREEN);
- if (a2 > aL)
- xyline(x + loLeft, iy, x + hiRight);
- } else {
- if ((!loInside) && (!hiInside)) {
-// fl_color(FL_MAGENTA);
- if ( (b1o<=90.0 && b2>=180.0) || (b1o<=(90.0-360.0) && b2>=(180.0-360.0)) )
- xyline(x - sinALrx, iy, x);
- } else {
- if (loInside) {
-// fl_color(FL_BLUE);
- xyline(x + loLeft, iy, x);
- }
- if (hiInside) {
-// fl_color(FL_YELLOW);
- if (a2 > aL)
- xyline(x + hiLeft, iy, x + hiRight);
- }
- }
- }
- }
- if (aR<1.5*M_PI) {
- // rasterize bottom right quadrant
- bool loInside = false, hiInside = false;
- double loLeft = 0.0, loRight = 0.0;
- double hiLeft = 0.0, hiRight = 0.0;
- if (b1 >= 180 && b1 < 270) {
- loInside = true;
- loLeft = sinALrx;
- loRight = a1Slope * (iy - y);
- }
- if (b2 >= 180 && b2 < 270) {
- hiInside = true;
- if (aR < a2)
- hiLeft = sinALrx;
- else
- hiLeft = a2Slope * (iy - y);
- }
- if (loInside && hiInside && !flipped) {
-// fl_color(FL_GREEN);
- if (a1 < aR)
- xyline(x + hiLeft, iy, x + loRight);
- } else {
- if ((!loInside) && (!hiInside)) {
-// fl_color(FL_MAGENTA);
- if ( (b1o<=180.0 && b2>=270.0) || (b1o<=(180.0-360.0) && b2>=(270.0-360.0)) )
- xyline(x + sinALrx, iy, x);
- } else {
- if (loInside) {
-// fl_color(FL_BLUE);
- if (a1 < aR)
- xyline(x + loLeft, iy, x + loRight);
- }
- if (hiInside) {
-// fl_color(FL_YELLOW);
- xyline(x + hiLeft, iy, x);
- }
- }
- }
- } else {
- // rasterize top right quadrant
- bool loInside = false, hiInside = false;
- double loLeft = 0.0, loRight = 0.0;
- double hiLeft = 0.0, hiRight = 0.0;
- if (b1 >= 270 && b1 < 360) {
- loInside = true;
- if (aR>=a1)
- loLeft = sinALrx;
- else
- loLeft = a1Slope * (iy - y);
- }
- if (b2 >= 270 && b2 < 360) {
- hiInside = true;
- hiLeft = sinALrx;
- hiRight = a2Slope * (iy - y);
- }
- if (loInside && hiInside && !flipped) {
-// fl_color(FL_GREEN);
- if (a2 > aR)
- xyline(x + loLeft, iy, x + hiRight);
- } else {
- if ((!loInside) && (!hiInside)) {
-// fl_color(FL_MAGENTA);
- if ( (b1o<=270.0 && b2>=360.0) || (b1o<=(270.0-360.0) && b2>=(360.0-360.0)) )
- xyline(x + sinALrx, iy, x);
- } else {
- if (loInside) {
-// fl_color(FL_BLUE);
- xyline(x + loLeft, iy, x);
- }
- if (hiInside) {
-// fl_color(FL_YELLOW);
- if (a2 > aR)
- xyline(x + hiLeft, iy, x + hiRight);
- }
- }
- }
- }
- }
-}
-
-/**
- FIXME: these do not draw rotated ellipses correctly!
- FIXME: use floating point version of arc and pie?!
- */
-void Fl_Android_Graphics_Driver::ellipse(double xt, double yt, double rx, double ry)
-{
- int llx = xt-rx;
- int w = xt+rx-llx;
- int lly = yt-ry;
- int h = yt+ry-lly;
-
- if (what==POLYGON)
- pie(llx, lly, w, h, 0.0, 360.0);
- else
- arc(llx, lly, w, h, 0.0, 360.0);
-}
-
-
-void Fl_Android_Graphics_Driver::circle(double x, double y, double r)
-{
- double xt = transform_x(x,y);
- double yt = transform_y(x,y);
- double rx = r * (m.c ? sqrt(m.a*m.a+m.c*m.c) : fabs(m.a));
- double ry = r * (m.b ? sqrt(m.b*m.b+m.d*m.d) : fabs(m.d));
- ellipse(xt, yt, rx, ry);
-}
-
-
-void Fl_Android_Graphics_Driver::draw_fixed(Fl_Pixmap * pxm, int X, int Y, int W, int H, int cx, int cy)
-{
- if (*Fl_Graphics_Driver::id(pxm)) {
- Fl_Android_565A_Map *cache = (Fl_Android_565A_Map*)*Fl_Graphics_Driver::id(pxm);
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(X, Y, W, H))) {
- draw(X-cx, Y-cy, cache, it->clipped_rect());
- }
- }
-}
-
-
-void Fl_Android_Graphics_Driver::draw_fixed(Fl_Bitmap *bm, int X, int Y, int W, int H, int cx, int cy)
-{
- if (*Fl_Graphics_Driver::id(bm)) {
- Fl_Android_Bytemap *cache = (Fl_Android_Bytemap*)*Fl_Graphics_Driver::id(bm);
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(X, Y, W, H))) {
- draw(X-cx, Y-cy, cache, it->clipped_rect());
- }
- }
-}
-
-
-void Fl_Android_Graphics_Driver::cache(Fl_Bitmap *bm)
-{
- int w = bm->w(), h = bm->h();
- int rowBytes = (w+7)>>3;
-
- Fl_Android_Bytemap *cache = new Fl_Android_Bytemap(w, h);
- for (int yy=0; yyarray + yy*rowBytes;
- uchar *dst = cache->pBytes + yy*cache->pStride;
- uchar d = 0;
- for (int xx=0; xx>= 1;
- }
- }
-
- *Fl_Graphics_Driver::id(bm) = (fl_uintptr_t)cache;
- int *pw, *ph;
- cache_w_h(bm, pw, ph);
- *pw = bm->data_w();
- *ph = bm->data_h();
-}
-
-void Fl_Android_Graphics_Driver::delete_bitmask(Fl_Bitmask bm)
-{
- delete (Fl_Android_Bytemap*)bm;
-}
-
-void Fl_Android_Graphics_Driver::cache(Fl_Pixmap *img)
-{
- int w = img->w(), h = img->h();
- int rowBytes = 4*w;
- uchar *rgba = (uchar*)calloc(w*h, 4);
- int ret = fl_convert_pixmap(img->data(), rgba, 0);
- if (ret==0) {
- ::free(rgba);
- *Fl_Graphics_Driver::id(img) = 0;
- return;
- }
-
- Fl_Android_565A_Map *cache = new Fl_Android_565A_Map(w, h);
- for (int yy=0; yypWords + yy*cache->pStride;
- for (int xx=0; xx> 3) & 0x001f) ) << 16) | src[3]; // FIXME: alpha
- *dst++ = Fl_Android_565A_Map::toRGBA(src[0],src[1], src[2], src[3]);
- src+=4;
- }
- }
-
- ::free(rgba);
- *Fl_Graphics_Driver::id(img) = (fl_uintptr_t)cache;
- int *pw, *ph;
- cache_w_h(img, pw, ph);
- *pw = img->data_w();
- *ph = img->data_h();
-}
-
-
-void Fl_Android_Graphics_Driver::uncache_pixmap(fl_uintptr_t p)
-{
- Fl_Android_565A_Map *img = (Fl_Android_565A_Map*)p;
- delete img;
-}
-
-void Fl_Android_Graphics_Driver::cache(Fl_RGB_Image *img)
-{
- int w = img->data_w(), h = img->data_h(), d = img->d(), stride = w*d + img->ld();
- Fl_Android_565A_Map *cgimg = new Fl_Android_565A_Map(w, h);
- *Fl_Graphics_Driver::id(img) = (fl_uintptr_t)cgimg;
- int *pw, *ph;
- cache_w_h(img, pw, ph);
- *pw = img->data_w();
- *ph = img->data_h();
- if (d==1) { // grayscale
- for (int iy=0; iyarray + iy*stride;
- uint32_t *dst = cgimg->pWords + iy*cgimg->pStride;
- for (int ix=0; ixarray + iy*stride;
- uint32_t *dst = cgimg->pWords + iy*cgimg->pStride;
- for (int ix=0; ixarray + iy*stride;
- uint32_t *dst = cgimg->pWords + iy*cgimg->pStride;
- for (int ix=0; ixarray + iy*stride;
- uint32_t *dst = cgimg->pWords + iy*cgimg->pStride;
- for (int ix=0; ixclipped_rect());
- }
- }
-}
-
-
-/**
- Copy RGB (or RGBA?) image data directly onto the surface.
- TODO: I did not find documentation on the possible values of D. If D is four, does that
- mean that the fourth value must be an alpha value, and should that be applied here?
- What does a negative D indicate?
- */
-void Fl_Android_Graphics_Driver::draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L)
-{
- int srcDelta = abs(D);
- int srcStride = L ? L : W*srcDelta;
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(X, Y, W, H))) {
- Fl_Rect_Region *r = &it->clipped_rect();
- int rBottom = r->bottom();
- int rRight = r->right();
- for (int iy=r->top(); iyleft()-X)*srcDelta;
- uint16_t *dst = pBits + iy*pStride + r->left();
- for (int ix=r->left();ixclipped_rect();
- int rBottom = r->bottom();
- int rRight = r->right();
- for (int iy=r->top(); iyleft();
- for (int ix=r->left();ixclipped_rect();
- uchar *buf = (uchar*)malloc(size_t(srcDelta*r->w()));
- int rBottom = r->bottom();
- int rRight = r->right();
- for (int iy=r->top(); iyleft()-X, iy-Y, r->w(), buf);
- uchar *src = buf;
- uint16_t *dst = pBits + iy*pStride + r->left();
- for (int ix=r->left();ixclipped_rect();
- uchar *buf = (uchar*)malloc(size_t(srcDelta*r->w()));
- int rBottom = r->bottom();
- int rRight = r->right();
- for (int iy=r->top(); iyleft()-X, iy-Y, r->w(), buf);
- uchar *src = buf;
- uint16_t *dst = pBits + iy*pStride + r->left();
- for (int ix=r->left();ix255) return;
- fl_cmap[i] = c;
-}
-
-
-void Fl_Android_Graphics_Driver::color(uchar r, uchar g, uchar b)
-{
- color( (((Fl_Color)r)<<24)|(((Fl_Color)g)<<16)|(((Fl_Color)b)<<8) );
-}
diff --git a/src/drivers/Android/Fl_Android_Graphics_Font.H b/src/drivers/Android/Fl_Android_Graphics_Font.H
deleted file mode 100644
index b07ba7d3c..000000000
--- a/src/drivers/Android/Fl_Android_Graphics_Font.H
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-// Font definitions for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-#ifndef FL_ANDROID_GRAPHICS_FONT_H
-#define FL_ANDROID_GRAPHICS_FONT_H
-
-
-#include "Fl_Android_Graphics_Driver.H"
-
-// We violate FLTKs avoidance of STL because we live in a defined driver space
-#define FL_ALLOW_STL 1
-#ifdef FL_ALLOW_STL
-#include