[aseprite] 140/196: Initial commit for a new Skia/X11 port
Tobias Hansen
thansen at moszumanska.debian.org
Wed Apr 20 18:50:13 UTC 2016
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository aseprite.
commit e4bb2ec45b5eece368dd07f1b666530961555605
Author: David Capello <davidcapello at gmail.com>
Date: Mon Apr 4 10:17:14 2016 -0300
Initial commit for a new Skia/X11 port
---
src/she/CMakeLists.txt | 49 +++++++++++++-------
src/she/event.h | 5 +++
src/she/skia/she.cpp | 7 +++
src/she/skia/skia_system.h | 9 +++-
src/she/skia/skia_window.h | 4 +-
src/she/skia/skia_window_x11.cpp | 96 ++++++++++++++++++++++++++++++++++++++++
src/she/skia/skia_window_x11.h | 58 ++++++++++++++++++++++++
src/she/x11/event_queue.h | 51 +++++++++++++++++++++
src/she/x11/keys.cpp | 20 +++++++++
src/she/x11/window.h | 74 +++++++++++++++++++++++++++++++
src/she/x11/x11.cpp | 24 ++++++++++
src/she/x11/x11.h | 40 +++++++++++++++++
12 files changed, 419 insertions(+), 18 deletions(-)
diff --git a/src/she/CMakeLists.txt b/src/she/CMakeLists.txt
index 81c02fb..d771d51 100644
--- a/src/she/CMakeLists.txt
+++ b/src/she/CMakeLists.txt
@@ -61,6 +61,8 @@ if(USE_SKIA_BACKEND)
# Use Automatic Reference Counting
add_definitions(-fobjc-arc)
+ else()
+ add_definitions(-DSK_SAMPLES_FOR_X)
endif()
if(CMAKE_BUILD_TYPE STREQUAL Debug)
@@ -75,7 +77,9 @@ if(USE_SKIA_BACKEND)
find_library(SKIA_IMAGES_LIBRARY skia_images PATH "${SKIA_BUILD_OUT_DIR}")
find_library(SKIA_OPTS_LIBRARY skia_opts PATH "${SKIA_BUILD_OUT_DIR}")
find_library(SKIA_OPTS_AVX_LIBRARY skia_opts_avx PATH "${SKIA_BUILD_OUT_DIR}")
+ find_library(SKIA_OPTS_AVX2_LIBRARY skia_opts_avx2 PATH "${SKIA_BUILD_OUT_DIR}")
find_library(SKIA_OPTS_SSE41_LIBRARY skia_opts_sse41 PATH "${SKIA_BUILD_OUT_DIR}")
+ find_library(SKIA_OPTS_SSE42_LIBRARY skia_opts_sse42 PATH "${SKIA_BUILD_OUT_DIR}")
find_library(SKIA_OPTS_SSSE3_LIBRARY skia_opts_ssse3 PATH "${SKIA_BUILD_OUT_DIR}")
find_library(SKIA_OPTS_AVX_LIBRARY skia_opts_avx PATH "${SKIA_BUILD_OUT_DIR}")
find_library(SKIA_PORTS_LIBRARY skia_ports PATH "${SKIA_BUILD_OUT_DIR}")
@@ -89,9 +93,14 @@ if(USE_SKIA_BACKEND)
set(SKIA_GPU_LIBRARY "")
endif()
+ find_library(SKIA_ETC1_LIBRARY etc1 PATH "${SKIA_BUILD_OUT_DIR}/obj/gyp")
+ find_library(SKIA_FLAGS_LIBRARY flags PATH "${SKIA_BUILD_OUT_DIR}/obj/gyp")
+ if(NOT SKIA_FLAGS_LIBRARY_FOUND)
+ set(SKIA_FLAGS_LIBRARY "")
+ endif()
+
+ find_library(SKIA_LIBSKKTX_LIBRARY SkKTX PATH "${SKIA_BUILD_OUT_DIR}/obj/gyp")
if(WIN32)
- find_library(SKIA_ETC1_LIBRARY libetc1 PATH "${SKIA_BUILD_OUT_DIR}/obj/gyp")
- find_library(SKIA_LIBSKKTX_LIBRARY libSkKTX PATH "${SKIA_BUILD_OUT_DIR}/obj/gyp")
if(SKIA_GPU_LIBRARY_FOUND)
find_library(SKIA_OPENGL_LIBRARY opengl32)
find_library(SKIA_LIBEGL_LIBRARY libEGL.dll PATH "${SKIA_BUILD_OUT_DIR}")
@@ -100,8 +109,6 @@ if(USE_SKIA_BACKEND)
endif()
endif()
else()
- find_library(SKIA_ETC1_LIBRARY etc1 PATH "${SKIA_BUILD_OUT_DIR}")
- find_library(SKIA_LIBSKKTX_LIBRARY SkKTX PATH "${SKIA_BUILD_OUT_DIR}")
if(SKIA_GPU_LIBRARY_FOUND)
find_library(SKIA_OPENGL_LIBRARY opengl)
endif()
@@ -141,22 +148,27 @@ if(USE_SKIA_BACKEND)
set(SKIA_LIBRARIES
${SKIA_ETC1_LIBRARY}
+ ${SKIA_FLAGS_LIBRARY}
${SKIA_LIBSKKTX_LIBRARY}
- ${SKIA_OPENGL_LIBRARY}
- ${SKIA_LIBEGL_LIBRARY}
${SKIA_CORE_LIBRARY}
- ${SKIA_EFFECTS_LIBRARY}
- ${SKIA_GPU_LIBRARY}
${SKIA_IMAGES_LIBRARY}
${SKIA_OPTS_LIBRARY}
- ${SKIA_OPTS_AVX_LIBRARY}
- ${SKIA_OPTS_SSE41_LIBRARY}
${SKIA_OPTS_SSSE3_LIBRARY}
+ ${SKIA_OPTS_SSE41_LIBRARY}
+ ${SKIA_OPTS_SSE42_LIBRARY}
${SKIA_OPTS_AVX_LIBRARY}
+ ${SKIA_OPTS_AVX2_LIBRARY}
${SKIA_PORTS_LIBRARY}
- ${SKIA_SFNT_LIBRARY}
- ${SKIA_UTILS_LIBRARY}
+ ${SKIA_EFFECTS_LIBRARY}
+ # We've to include two times skia_core as a dependency as it looks
+ # like Skia libraries depends one each other (core+ports+effects)
+ ${SKIA_CORE_LIBRARY}
${SKIA_MISSING_FILES}
+ ${SKIA_UTILS_LIBRARY}
+ ${SKIA_SFNT_LIBRARY}
+ ${SKIA_OPENGL_LIBRARY}
+ ${SKIA_LIBEGL_LIBRARY}
+ ${SKIA_GPU_LIBRARY}
CACHE INTERNAL "Skia libraries")
list(APPEND SHE_SOURCES
@@ -168,9 +180,7 @@ if(USE_SKIA_BACKEND)
skia/skia_window_win.cpp
win/vk.cpp
win/window_dde.cpp)
- endif()
-
- if(APPLE)
+ elseif(APPLE)
list(APPEND SHE_SOURCES
osx/app.mm
osx/app_delegate.mm
@@ -179,6 +189,11 @@ if(USE_SKIA_BACKEND)
osx/vk.mm
osx/window.mm
skia/skia_window_osx.mm)
+ else()
+ list(APPEND SHE_SOURCES
+ skia/skia_window_x11.cpp
+ x11/keys.cpp
+ x11/x11.cpp)
endif()
endif()
@@ -222,6 +237,10 @@ endif()
if(USE_SKIA_BACKEND)
target_link_libraries(she
${SKIA_LIBRARIES})
+
+ if(UNIX AND NOT APPLE)
+ target_link_libraries(she fontconfig)
+ endif()
endif()
if(WITH_GTK_FILE_DIALOG_SUPPORT)
diff --git a/src/she/event.h b/src/she/event.h
index 1b50bb3..b894a2a 100644
--- a/src/she/event.h
+++ b/src/she/event.h
@@ -15,6 +15,9 @@
#include <string>
#include <vector>
+#pragma push_macro("None")
+#undef None // Undefine the X11 None macro
+
namespace she {
class Display;
@@ -101,4 +104,6 @@ namespace she {
} // namespace she
+#pragma pop_macro("None")
+
#endif
diff --git a/src/she/skia/she.cpp b/src/she/skia/she.cpp
index 94c03b0..de5674b 100644
--- a/src/she/skia/she.cpp
+++ b/src/she/skia/she.cpp
@@ -20,6 +20,8 @@
#if __APPLE__
#include "she/osx/app.h"
#include <CoreServices/CoreServices.h>
+#elif !defined(_WIN32)
+ #include "she/x11/x11.h"
#endif
namespace she {
@@ -76,6 +78,11 @@ int main(int argc, char* argv[])
she::OSXApp app;
return app.run(argc, argv);
#else
+
+#ifndef _WIN32
+ she::X11 x11;
+#endif
+
return app_main(argc, argv);
#endif
}
diff --git a/src/she/skia/skia_system.h b/src/she/skia/skia_system.h
index 1ff2c27..fcee2c9 100644
--- a/src/she/skia/skia_system.h
+++ b/src/she/skia/skia_system.h
@@ -23,7 +23,7 @@
#elif __APPLE__
#include "she/osx/event_queue.h"
#else
- #error There is no EventQueue implementation for your platform
+ #include "she/x11/event_queue.h"
#endif
namespace she {
@@ -35,6 +35,13 @@ public:
SkiaSystem()
: m_defaultDisplay(nullptr)
, m_gpuAcceleration(false) {
+#if !defined(__APPLE__) && !defined(_WIN32)
+ // Create one decoder on Linux to load .png files with
+ // libpng. Without this, SkImageDecoder::Factory() returns null
+ // for .png files.
+ SkAutoTDelete<SkImageDecoder> decoder(
+ CreatePNGImageDecoder());
+#endif
}
~SkiaSystem() {
diff --git a/src/she/skia/skia_window.h b/src/she/skia/skia_window.h
index fc06882..7d0074c 100644
--- a/src/she/skia/skia_window.h
+++ b/src/she/skia/skia_window.h
@@ -1,5 +1,5 @@
// SHE library
-// Copyright (C) 2012-2015 David Capello
+// Copyright (C) 2012-2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
@@ -13,7 +13,7 @@
#elif __APPLE__
#include "she/skia/skia_window_osx.h"
#else
- #error There is no SkiaWindow implementation for your platform
+ #include "she/skia/skia_window_x11.h"
#endif
#endif
diff --git a/src/she/skia/skia_window_x11.cpp b/src/she/skia/skia_window_x11.cpp
new file mode 100644
index 0000000..908e5b1
--- /dev/null
+++ b/src/she/skia/skia_window_x11.cpp
@@ -0,0 +1,96 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "she/skia/skia_window_x11.h"
+
+#include "gfx/size.h"
+#include "she/x11/x11.h"
+
+#include "SkBitmap.h"
+
+
+namespace she {
+
+SkiaWindow::SkiaWindow(EventQueue* queue, SkiaDisplay* display,
+ int width, int height, int scale)
+ : X11Window(X11::instance()->display(), width, height)
+ , m_clientSize(width, height)
+ , m_scale(scale)
+{
+}
+
+SkiaWindow::~SkiaWindow()
+{
+}
+
+int SkiaWindow::scale() const
+{
+ return m_scale;
+}
+
+void SkiaWindow::setScale(int scale)
+{
+ m_scale = scale;
+}
+
+void SkiaWindow::setVisible(bool visible)
+{
+}
+
+void SkiaWindow::maximize()
+{
+}
+
+bool SkiaWindow::isMaximized() const
+{
+ return false;
+}
+
+bool SkiaWindow::isMinimized() const
+{
+ return false;
+}
+
+gfx::Size SkiaWindow::clientSize() const
+{
+ return m_clientSize;
+}
+
+gfx::Size SkiaWindow::restoredSize() const
+{
+ return m_clientSize;
+}
+
+void SkiaWindow::captureMouse()
+{
+}
+
+void SkiaWindow::releaseMouse()
+{
+}
+
+void SkiaWindow::setMousePosition(const gfx::Point& position)
+{
+}
+
+bool SkiaWindow::setNativeMouseCursor(NativeCursor cursor)
+{
+ return false;
+}
+
+void SkiaWindow::updateWindow(const gfx::Rect& bounds)
+{
+}
+
+void SkiaWindow::onExpose()
+{
+}
+
+} // namespace she
diff --git a/src/she/skia/skia_window_x11.h b/src/she/skia/skia_window_x11.h
new file mode 100644
index 0000000..18e34cd
--- /dev/null
+++ b/src/she/skia/skia_window_x11.h
@@ -0,0 +1,58 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifndef SHE_SKIA_SKIA_WINDOW_X11_INCLUDED
+#define SHE_SKIA_SKIA_WINDOW_X11_INCLUDED
+#pragma once
+
+#include "base/disable_copying.h"
+#include "gfx/size.h"
+#include "she/native_cursor.h"
+#include "she/x11/window.h"
+
+#include <string>
+
+namespace she {
+
+class EventQueue;
+class SkiaDisplay;
+
+class SkiaWindow : public X11Window {
+public:
+ enum class Backend { NONE, GL };
+
+ SkiaWindow(EventQueue* queue, SkiaDisplay* display,
+ int width, int height, int scale);
+ ~SkiaWindow();
+
+ int scale() const;
+ void setScale(int scale);
+ void setVisible(bool visible);
+ void maximize();
+ bool isMaximized() const;
+ bool isMinimized() const;
+ gfx::Size clientSize() const;
+ gfx::Size restoredSize() const;
+ void captureMouse();
+ void releaseMouse();
+ void setMousePosition(const gfx::Point& position);
+ bool setNativeMouseCursor(NativeCursor cursor);
+ void updateWindow(const gfx::Rect& bounds);
+ std::string getLayout() { return ""; }
+ void setLayout(const std::string& layout) { }
+
+private:
+ void onExpose() override;
+
+ gfx::Size m_clientSize;
+ int m_scale;
+
+ DISABLE_COPYING(SkiaWindow);
+};
+
+} // namespace she
+
+#endif
diff --git a/src/she/x11/event_queue.h b/src/she/x11/event_queue.h
new file mode 100644
index 0000000..850228c
--- /dev/null
+++ b/src/she/x11/event_queue.h
@@ -0,0 +1,51 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifndef SHE_X11_EVENT_QUEUE_INCLUDED
+#define SHE_X11_EVENT_QUEUE_INCLUDED
+#pragma once
+
+#include "she/event.h"
+#include "she/event_queue.h"
+#include "she/x11/x11.h"
+
+#include <queue>
+
+#pragma push_macro("None")
+#undef None // Undefine the X11 None macro
+
+namespace she {
+
+class X11EventQueue : public EventQueue {
+public:
+ void getEvent(Event& ev, bool canWait) override {
+ XEvent event;
+ XNextEvent(X11::instance()->display(), &event);
+
+ if (m_events.empty()) {
+ ev.setType(Event::None);
+ }
+ else {
+ ev = m_events.front();
+ m_events.pop();
+ }
+ }
+
+ void queueEvent(const Event& ev) override {
+ m_events.push(ev);
+ }
+
+private:
+ std::queue<Event> m_events;
+};
+
+typedef X11EventQueue EventQueueImpl;
+
+} // namespace she
+
+#pragma pop_macro("None")
+
+#endif
diff --git a/src/she/x11/keys.cpp b/src/she/x11/keys.cpp
new file mode 100644
index 0000000..303072f
--- /dev/null
+++ b/src/she/x11/keys.cpp
@@ -0,0 +1,20 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "she/keys.h"
+
+namespace she {
+
+bool is_key_pressed(KeyScancode scancode)
+{
+ return false; // TODO
+}
+
+} // namespace she
diff --git a/src/she/x11/window.h b/src/she/x11/window.h
new file mode 100644
index 0000000..e608fe1
--- /dev/null
+++ b/src/she/x11/window.h
@@ -0,0 +1,74 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifndef SHE_X11_WINDOW_INCLUDED
+#define SHE_X11_WINDOW_INCLUDED
+#pragma once
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+#include <cstring>
+
+namespace she {
+
+class X11Window {
+public:
+ X11Window(::Display* display, int width, int height)
+ : m_display(display) {
+ ::Window root = XDefaultRootWindow(m_display);
+
+ XSetWindowAttributes swa;
+ swa.event_mask = (StructureNotifyMask | ExposureMask | PropertyChangeMask |
+ EnterWindowMask | LeaveWindowMask | FocusChangeMask |
+ ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
+ KeyPressMask | KeyReleaseMask);
+
+ m_window = XCreateWindow(
+ m_display, root,
+ 0, 0, width, height, 0,
+ CopyFromParent,
+ InputOutput,
+ CopyFromParent,
+ CWEventMask,
+ &swa);
+
+ XMapWindow(m_display, m_window);
+ XSelectInput(m_display, m_window, StructureNotifyMask);
+
+ m_gc = XCreateGC(m_display, m_window, 0, nullptr);
+ }
+
+ ~X11Window() {
+ XFreeGC(m_display, m_gc);
+ XDestroyWindow(m_display, m_window);
+ }
+
+ void setTitle(const std::string& title) {
+ XTextProperty prop;
+ prop.value = (unsigned char*)title.c_str();
+ prop.encoding = XA_STRING;
+ prop.format = 8;
+ prop.nitems = std::strlen((char*)title.c_str());
+ XSetWMName(m_display, m_window, &prop);
+ }
+
+ virtual void onExpose() = 0;
+
+ ::Display* display() const { return m_display; }
+ ::Window handle() const { return m_window; }
+ ::GC gc() const { return m_gc; }
+
+private:
+ ::Display* m_display;
+ ::Window m_window;
+ ::GC m_gc;
+};
+
+} // namespace she
+
+#endif
diff --git a/src/she/x11/x11.cpp b/src/she/x11/x11.cpp
new file mode 100644
index 0000000..3c1b6db
--- /dev/null
+++ b/src/she/x11/x11.cpp
@@ -0,0 +1,24 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "she/x11/x11.h"
+
+namespace she {
+
+X11* X11::m_instance = nullptr;
+
+// static
+X11* X11::instance()
+{
+ ASSERT(m_instance);
+ return m_instance;
+}
+
+} // namespace she
diff --git a/src/she/x11/x11.h b/src/she/x11/x11.h
new file mode 100644
index 0000000..9675946
--- /dev/null
+++ b/src/she/x11/x11.h
@@ -0,0 +1,40 @@
+// SHE library
+// Copyright (C) 2016 David Capello
+//
+// This file is released under the terms of the MIT license.
+// Read LICENSE.txt for more information.
+
+#ifndef SHE_X11_X11_INCLUDED
+#define SHE_X11_X11_INCLUDED
+#pragma once
+
+#include <X11/Xlib.h>
+
+namespace she {
+
+class X11 {
+ static X11* m_instance;
+public:
+ static X11* instance();
+
+ X11() {
+ ASSERT(m_instance == nullptr);
+ m_instance = this;
+ m_display = XOpenDisplay(nullptr);
+ }
+
+ ~X11() {
+ ASSERT(m_instance == this);
+ XCloseDisplay(m_display);
+ m_instance = nullptr;
+ }
+
+ ::Display* display() const { return m_display; }
+
+private:
+ ::Display* m_display;
+};
+
+} // namespace she
+
+#endif
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git
More information about the Pkg-games-commits
mailing list