refactoring

This commit is contained in:
nakst 2021-09-29 13:34:24 +01:00
parent 78f3c2a77f
commit 7bbbbf7e57
9 changed files with 194 additions and 152 deletions

View File

@ -24,6 +24,7 @@
#include <emmintrin.h> #include <emmintrin.h>
#define SHARED_COMMON_WANT_ALL #define SHARED_COMMON_WANT_ALL
#define SHARED_MATH_WANT_ALL
#include <shared/ini.h> #include <shared/ini.h>
#include <shared/avl_tree.cpp> #include <shared/avl_tree.cpp>
#include <shared/heap.cpp> #include <shared/heap.cpp>
@ -1130,8 +1131,7 @@ EsMessage *EsMessageReceive() {
APIInstance *apiInstance = (APIInstance *) instance->_private; APIInstance *apiInstance = (APIInstance *) instance->_private;
if (message.message.tabOperation.error == ES_SUCCESS) { if (message.message.tabOperation.error == ES_SUCCESS) {
EsRectangle bounds = EsElementGetWindowBounds(instance->window->toolbarSwitcher); EsAnnouncementShow(instance->window, ES_FLAGS_DEFAULT, -1, -1, INTERFACE_STRING(FileRenameSuccess));
EsAnnouncementShow(instance->window, ES_FLAGS_DEFAULT, (bounds.l + bounds.r) / 2, bounds.b, INTERFACE_STRING(FileRenameSuccess));
} else { } else {
char buffer[512]; char buffer[512];
const char *errorMessage = interfaceString_FileSaveErrorUnknown; const char *errorMessage = interfaceString_FileSaveErrorUnknown;
@ -1363,11 +1363,10 @@ void EsInstanceSaveComplete(EsMessage *message, bool success) {
if (success) { if (success) {
EsInstanceSetModified(instance, false); EsInstanceSetModified(instance, false);
EsRectangle bounds = EsElementGetWindowBounds(instance->window->toolbarSwitcher);
size_t messageBytes; size_t messageBytes;
char *message = EsStringAllocateAndFormat(&messageBytes, "Saved to %s", // TODO Localization. char *message = EsStringAllocateAndFormat(&messageBytes, "Saved to %s", // TODO Localization.
apiInstance->startupInformation->filePathBytes, apiInstance->startupInformation->filePath); apiInstance->startupInformation->filePathBytes, apiInstance->startupInformation->filePath);
EsAnnouncementShow(instance->window, ES_FLAGS_DEFAULT, (bounds.l + bounds.r) / 2, bounds.b, message, messageBytes); EsAnnouncementShow(instance->window, ES_FLAGS_DEFAULT, -1, -1, message, messageBytes);
EsHeapFree(message); EsHeapFree(message);
EsCommandSetDisabled(&apiInstance->commandShowInFileManager, false); EsCommandSetDisabled(&apiInstance->commandShowInFileManager, false);

View File

@ -3869,6 +3869,12 @@ int AnnouncementMessage(EsElement *element, EsMessage *message) {
void EsAnnouncementShow(EsWindow *parent, uint64_t flags, int32_t x, int32_t y, const char *text, ptrdiff_t textBytes) { void EsAnnouncementShow(EsWindow *parent, uint64_t flags, int32_t x, int32_t y, const char *text, ptrdiff_t textBytes) {
(void) flags; (void) flags;
if (x == -1 && y == -1) {
EsRectangle bounds = EsElementGetWindowBounds((EsElement *) parent->toolbarSwitcher ?: parent);
x = (bounds.l + bounds.r) / 2;
y = bounds.t + 40 * theming.scale;
}
EsWindow *window = EsWindowCreate(nullptr, ES_WINDOW_TIP); EsWindow *window = EsWindowCreate(nullptr, ES_WINDOW_TIP);
if (!window) return; if (!window) return;
window->messageUser = AnnouncementMessage; window->messageUser = AnnouncementMessage;
@ -3878,7 +3884,7 @@ void EsAnnouncementShow(EsWindow *parent, uint64_t flags, int32_t x, int32_t y,
int32_t height = display ? display->GetHeight(width) : 0; int32_t height = display ? display->GetHeight(width) : 0;
EsRectangle parentBounds = {}; EsRectangle parentBounds = {};
if (parent) parentBounds = EsWindowGetBounds(parent); if (parent) parentBounds = EsWindowGetBounds(parent);
EsRectangle bounds = ES_RECT_4PD(x - width / 2 + parentBounds.l, y - height + parentBounds.t, width, height); EsRectangle bounds = ES_RECT_4PD(x - width / 2 + parentBounds.l, y - height + parentBounds.t, width, height);
EsSyscall(ES_SYSCALL_WINDOW_SET_PROPERTY, window->handle, 0x00, 0, ES_WINDOW_PROPERTY_ALPHA); EsSyscall(ES_SYSCALL_WINDOW_SET_PROPERTY, window->handle, 0x00, 0, ES_WINDOW_PROPERTY_ALPHA);
EsSyscall(ES_SYSCALL_WINDOW_MOVE, window->handle, (uintptr_t) &bounds, 0, ES_WINDOW_MOVE_ADJUST_TO_FIT_SCREEN | ES_WINDOW_MOVE_ALWAYS_ON_TOP); EsSyscall(ES_SYSCALL_WINDOW_MOVE, window->handle, (uintptr_t) &bounds, 0, ES_WINDOW_MOVE_ADJUST_TO_FIT_SCREEN | ES_WINDOW_MOVE_ALWAYS_ON_TOP);

View File

@ -1,7 +1,7 @@
// TODO Fix glitches. // TODO Fix glitches.
// TODO RAST_REPEAT_NORMAL is wrong with negative values. // TODO RAST_REPEAT_NORMAL is wrong with negative values.
#ifdef IN_DESIGNER #if defined(IN_DESIGNER) && !defined(DESIGNER2)
#define RAST_ARRAY(x) x * #define RAST_ARRAY(x) x *
#define RAST_ARRAY_ADD arrput #define RAST_ARRAY_ADD arrput
#define RAST_ARRAY_CLEAR arrclear #define RAST_ARRAY_CLEAR arrclear

View File

@ -380,7 +380,7 @@ void ThemeFillRectangle(EsPainter *painter, EsRectangle bounds, ThemePaintData p
if (!THEME_RECT_VALID(bounds)) return; if (!THEME_RECT_VALID(bounds)) return;
if (paint.type == THEME_PAINT_SOLID) { if (paint.type == THEME_PAINT_SOLID) {
#ifndef IN_DESIGNER #if !defined(IN_DESIGNER) || defined(DESIGNER2)
_DrawBlock(painter->target->stride, bits, bounds, paint.solid->color, painter->target->fullAlpha); _DrawBlock(painter->target->stride, bits, bounds, paint.solid->color, painter->target->fullAlpha);
#else #else
uint32_t color = paint.solid->color; uint32_t color = paint.solid->color;

View File

@ -120,6 +120,7 @@ void KRegisterAsyncTask(KAsyncTaskCallback callback, EsGeneric argument, bool ne
#define SHARED_DEFINITIONS_ONLY #define SHARED_DEFINITIONS_ONLY
#endif #endif
#define SHARED_MATH_WANT_BASIC_UTILITIES
#include <shared/unicode.cpp> #include <shared/unicode.cpp>
#include <shared/math.cpp> #include <shared/math.cpp>
#include <shared/linked_list.cpp> #include <shared/linked_list.cpp>

View File

@ -1,26 +1,8 @@
#ifdef SHARED_COMMON_WANT_ALL
#define SHARED_COMMON_WANT_RECTANGLES
#define SHARED_COMMON_WANT_RENDERING
#define SHARED_COMMON_WANT_STRINGS
#define SHARED_COMMON_WANT_MEMORY
#define SHARED_COMMON_WANT_AUDIO
#define SHARED_COMMON_WANT_PRINTING
#define SHARED_COMMON_WANT_TIMING
#define SHARED_COMMON_WANT_RANDOM
#define SHARED_COMMON_WANT_ALGORITHMS
#define SHARED_COMMON_WANT_MISCELLANEOUS
#define SHARED_COMMON_WANT_SYNC
#define SHARED_COMMON_WANT_BYTE_SWAP
#define SHARED_COMMON_WANT_CSTDLIB
#define SHARED_COMMON_WANT_BUFFERS
#define SHARED_COMMON_WANT_AUDIO
#endif
///////////////////////////////// /////////////////////////////////
// EsRectangle utility functions. // EsRectangle utility functions.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_RECTANGLES #if defined(SHARED_COMMON_WANT_RECTANGLES) || defined(SHARED_COMMON_WANT_ALL)
struct Corners8 { int8_t tl, tr, bl, br; }; struct Corners8 { int8_t tl, tr, bl, br; };
struct Corners32 { int32_t tl, tr, bl, br; }; struct Corners32 { int32_t tl, tr, bl, br; };
@ -39,7 +21,9 @@ inline int Height(EsRectangle rectangle) {
} }
EsRectangle Translate(EsRectangle rectangle, int x, int y) { EsRectangle Translate(EsRectangle rectangle, int x, int y) {
return EsRectangleAdd(rectangle, ES_RECT_2(x, y)); rectangle.l += x, rectangle.r += x;
rectangle.t += y, rectangle.b += y;
return rectangle;
} }
bool EsRectangleClip(EsRectangle parent, EsRectangle rectangle, EsRectangle *output) { bool EsRectangleClip(EsRectangle parent, EsRectangle rectangle, EsRectangle *output) {
@ -53,7 +37,7 @@ bool EsRectangleClip(EsRectangle parent, EsRectangle rectangle, EsRectangle *out
intersection.r = current.r < rectangle.r ? current.r : rectangle.r; intersection.r = current.r < rectangle.r ? current.r : rectangle.r;
intersection.b = current.b < rectangle.b ? current.b : rectangle.b; intersection.b = current.b < rectangle.b ? current.b : rectangle.b;
} else { } else {
intersection = ES_RECT_4(0, 0, 0, 0); intersection = {};
} }
if (output) { if (output) {
@ -63,6 +47,10 @@ bool EsRectangleClip(EsRectangle parent, EsRectangle rectangle, EsRectangle *out
return intersection.l < intersection.r && intersection.t < intersection.b; return intersection.l < intersection.r && intersection.t < intersection.b;
} }
#endif
#ifdef SHARED_COMMON_WANT_ALL
EsRectangle EsRectangleAddBorder(EsRectangle rectangle, EsRectangle border) { EsRectangle EsRectangleAddBorder(EsRectangle rectangle, EsRectangle border) {
rectangle.l += border.l; rectangle.l += border.l;
rectangle.r -= border.r; rectangle.r -= border.r;
@ -165,7 +153,7 @@ EsRectangle EsRectangleCut(EsRectangle a, int32_t amount, char side) {
// Rendering. // Rendering.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_RENDERING #if defined(SHARED_COMMON_WANT_RENDERING) || defined(SHARED_COMMON_WANT_ALL)
ES_FUNCTION_OPTIMISE_O3 ES_FUNCTION_OPTIMISE_O3
void BlendPixel(uint32_t *destinationPixel, uint32_t modified, bool fullAlpha) { void BlendPixel(uint32_t *destinationPixel, uint32_t modified, bool fullAlpha) {
@ -209,6 +197,41 @@ void BlendPixel(uint32_t *destinationPixel, uint32_t modified, bool fullAlpha) {
*destinationPixel = result; *destinationPixel = result;
} }
void _DrawBlock(uintptr_t stride, void *bits, EsRectangle bounds, uint32_t color, bool fullAlpha) {
stride /= 4;
uint32_t *lineStart = (uint32_t *) bits + bounds.t * stride + bounds.l;
__m128i color4 = _mm_set_epi32(color, color, color, color);
for (int i = 0; i < bounds.b - bounds.t; i++, lineStart += stride) {
uint32_t *destination = lineStart;
int j = bounds.r - bounds.l;
if ((color & 0xFF000000) != 0xFF000000) {
do {
BlendPixel(destination, color, fullAlpha);
destination++;
} while (--j);
} else {
while (j >= 4) {
_mm_storeu_si128((__m128i *) destination, color4);
destination += 4;
j -= 4;
}
while (j > 0) {
*destination = color;
destination++;
j--;
}
}
}
}
#endif
#ifdef SHARED_COMMON_WANT_ALL
uint32_t EsColorBlend(uint32_t under, uint32_t over, bool fullAlpha) { uint32_t EsColorBlend(uint32_t under, uint32_t over, bool fullAlpha) {
BlendPixel(&under, over, fullAlpha); BlendPixel(&under, over, fullAlpha);
return under; return under;
@ -280,37 +303,6 @@ void EsDrawClear(EsPainter *painter, EsRectangle bounds) {
} }
} }
void _DrawBlock(uintptr_t stride, void *bits, EsRectangle bounds, uint32_t color, bool fullAlpha) {
stride /= 4;
uint32_t *lineStart = (uint32_t *) bits + bounds.t * stride + bounds.l;
__m128i color4 = _mm_set_epi32(color, color, color, color);
for (int i = 0; i < bounds.b - bounds.t; i++, lineStart += stride) {
uint32_t *destination = lineStart;
int j = bounds.r - bounds.l;
if ((color & 0xFF000000) != 0xFF000000) {
do {
BlendPixel(destination, color, fullAlpha);
destination++;
} while (--j);
} else {
while (j >= 4) {
_mm_storeu_si128((__m128i *) destination, color4);
destination += 4;
j -= 4;
}
while (j > 0) {
*destination = color;
destination++;
j--;
}
}
}
}
void EsDrawBlock(EsPainter *painter, EsRectangle bounds, uint32_t color) { void EsDrawBlock(EsPainter *painter, EsRectangle bounds, uint32_t color) {
if (!(color & 0xFF000000)) { if (!(color & 0xFF000000)) {
return; return;
@ -478,7 +470,7 @@ void EsDrawPaintTarget(EsPainter *painter, EsPaintTarget *source, EsRectangle de
// String utility functions. // String utility functions.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_STRINGS #ifdef SHARED_COMMON_WANT_ALL
size_t EsCStringLength(const char *string) { size_t EsCStringLength(const char *string) {
if (!string) { if (!string) {
@ -1256,7 +1248,7 @@ double EsDoubleParse(const char *nptr, ptrdiff_t maxBytes, char **endptr) {
// Memory utility functions. // Memory utility functions.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_MEMORY #ifdef SHARED_COMMON_WANT_ALL
void EsMemoryCopy(void *_destination, const void *_source, size_t bytes) { void EsMemoryCopy(void *_destination, const void *_source, size_t bytes) {
// TODO Prevent this from being optimised out in the kernel. // TODO Prevent this from being optimised out in the kernel.
@ -1393,7 +1385,7 @@ void EsMemoryFill(void *from, void *to, uint8_t byte) {
// Printing. // Printing.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_PRINTING #ifdef SHARED_COMMON_WANT_ALL
#ifdef USE_STB_SPRINTF #ifdef USE_STB_SPRINTF
#define STB_SPRINTF_IMPLEMENTATION #define STB_SPRINTF_IMPLEMENTATION
@ -1447,7 +1439,7 @@ void EsPrintHelloWorld() {
// Timing utility functions. // Timing utility functions.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_TIMING #ifdef SHARED_COMMON_WANT_ALL
#ifdef KERNEL #ifdef KERNEL
@ -1486,7 +1478,7 @@ int __tsi = 1;
// Random number generator. // Random number generator.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_RANDOM #ifdef SHARED_COMMON_WANT_ALL
struct RNGState { struct RNGState {
uint64_t s[4]; uint64_t s[4];
@ -1556,7 +1548,7 @@ uint8_t EsRandomU8() {
// Standard algorithms. // Standard algorithms.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_ALGORITHMS #ifdef SHARED_COMMON_WANT_ALL
void EsSortWithSwapCallback(void *_base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, EsGeneric), void EsSortWithSwapCallback(void *_base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, EsGeneric),
EsGeneric argument, void (*swap)(const void *, const void *, EsGeneric)) { EsGeneric argument, void (*swap)(const void *, const void *, EsGeneric)) {
@ -1604,7 +1596,7 @@ void EsSort(void *_base, size_t nmemb, size_t size, int (*compar)(const void *,
// Miscellaneous. // Miscellaneous.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_MISCELLANEOUS #ifdef SHARED_COMMON_WANT_ALL
void EnterDebugger() { void EnterDebugger() {
// Do nothing. // Do nothing.
@ -1722,7 +1714,7 @@ void LoadImage(const void *path, ptrdiff_t pathBytes, void *destination, int des
// Synchronisation. // Synchronisation.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_SYNC #ifdef SHARED_COMMON_WANT_ALL
void EsSpinlockAcquire(EsSpinlock *spinlock) { void EsSpinlockAcquire(EsSpinlock *spinlock) {
__sync_synchronize(); __sync_synchronize();
@ -1812,7 +1804,7 @@ void EsMutexDestroy(EsMutex *mutex) {
// Byte swapping. // Byte swapping.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_BYTE_SWAP #ifdef SHARED_COMMON_WANT_ALL
uint16_t ByteSwap16(uint16_t x) { uint16_t ByteSwap16(uint16_t x) {
return (x << 8) | (x >> 8); return (x << 8) | (x >> 8);
@ -1839,7 +1831,7 @@ uint32_t SwapBigEndian32(uint32_t x) {
// C standard library. // C standard library.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_CSTDLIB #ifdef SHARED_COMMON_WANT_ALL
void *EsCRTmemset(void *s, int c, size_t n) { void *EsCRTmemset(void *s, int c, size_t n) {
uint8_t *s8 = (uint8_t *) s; uint8_t *s8 = (uint8_t *) s;
@ -2550,7 +2542,7 @@ int EsCRTvsnprintf(char *buffer, size_t bufferSize, const char *format, va_list
// Memory buffers. // Memory buffers.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_COMMON_WANT_BUFFERS #if defined(SHARED_COMMON_WANT_BUFFERS) || defined(SHARED_COMMON_WANT_ALL)
const void *EsBufferRead(EsBuffer *buffer, size_t readBytes) { const void *EsBufferRead(EsBuffer *buffer, size_t readBytes) {
if (!readBytes && buffer->position == buffer->bytes) { if (!readBytes && buffer->position == buffer->bytes) {

View File

@ -2,6 +2,8 @@
// Basic utilities. // Basic utilities.
///////////////////////////////// /////////////////////////////////
#if defined(SHARED_MATH_WANT_BASIC_UTILITIES) || defined(SHARED_MATH_WANT_ALL)
template <class T> template <class T>
T RoundDown(T value, T divisor) { T RoundDown(T value, T divisor) {
value /= divisor; value /= divisor;
@ -80,11 +82,13 @@ inline int64_t AbsoluteInteger64(int64_t a) {
return a > 0 ? a : -a; return a > 0 ? a : -a;
} }
#endif
///////////////////////////////// /////////////////////////////////
// Interpolation. // Interpolation.
///////////////////////////////// /////////////////////////////////
#ifndef KERNEL #if defined(SHARED_MATH_WANT_INTERPOLATION) || defined(SHARED_MATH_WANT_ALL)
float LinearMap(float inFrom, float inTo, float outFrom, float outTo, float value) { float LinearMap(float inFrom, float inTo, float outFrom, float outTo, float value) {
float raw = (value - inFrom) / (inTo - inFrom); float raw = (value - inFrom) / (inTo - inFrom);
@ -95,6 +99,36 @@ float LinearInterpolate(float from, float to, float progress) {
return from + progress * (to - from); return from + progress * (to - from);
} }
float RubberBand(float original, float target) {
float sign = SignFloat(original - target);
float distance = AbsoluteFloat(original - target);
float amount = EsCRTlog2f(distance);
return target + sign * amount * 2.0f;
}
float GammaInterpolate(float from, float to, float progress) {
from = from * from;
to = to * to;
return EsCRTsqrtf(from + progress * (to - from));
}
double SmoothAnimationTime(double progress) {
if (progress > 1) return 1;
progress -= 1;
return 1 + progress * progress * progress;
}
double SmoothAnimationTimeSharp(double progress) {
if (progress > 1) return 1;
progress -= 1;
double progressSquared = progress * progress;
return 1 + progressSquared * progressSquared * progress;
}
#endif
#ifdef SHARED_MATH_WANT_ALL
EsRectangle EsRectangleLinearInterpolate(EsRectangle from, EsRectangle to, float progress) { EsRectangle EsRectangleLinearInterpolate(EsRectangle from, EsRectangle to, float progress) {
return ES_RECT_4(LinearInterpolate(from.l, to.l, progress), LinearInterpolate(from.r, to.r, progress), return ES_RECT_4(LinearInterpolate(from.l, to.l, progress), LinearInterpolate(from.r, to.r, progress),
LinearInterpolate(from.t, to.t, progress), LinearInterpolate(from.b, to.b, progress)); LinearInterpolate(from.t, to.t, progress), LinearInterpolate(from.b, to.b, progress));
@ -119,38 +153,14 @@ uint32_t EsColorInterpolate(uint32_t from, uint32_t to, float progress) {
| (uint32_t) (LinearInterpolate(fa, ta, progress) * 255.0f) << 24; | (uint32_t) (LinearInterpolate(fa, ta, progress) * 255.0f) << 24;
} }
float RubberBand(float original, float target) {
float sign = SignFloat(original - target);
float distance = AbsoluteFloat(original - target);
float amount = EsCRTlog2f(distance);
return target + sign * amount * 2.0f;
}
#ifndef KERNEL
float GammaInterpolate(float from, float to, float progress) {
from = from * from;
to = to * to;
return EsCRTsqrtf(from + progress * (to - from));
}
#endif #endif
double SmoothAnimationTime(double progress) {
if (progress > 1) return 1;
progress -= 1;
return 1 + progress * progress * progress;
}
double SmoothAnimationTimeSharp(double progress) {
if (progress > 1) return 1;
progress -= 1;
double progressSquared = progress * progress;
return 1 + progressSquared * progressSquared * progress;
}
///////////////////////////////// /////////////////////////////////
// HSV colors. // HSV colors.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_MATH_WANT_ALL
uint32_t EsColorConvertToRGB(float h, float s, float v) { uint32_t EsColorConvertToRGB(float h, float s, float v) {
float r = 0, g = 0, b = 0; float r = 0, g = 0, b = 0;
@ -204,10 +214,14 @@ bool EsColorIsLight(uint32_t color) {
return brightness >= 180.0f; return brightness >= 180.0f;
} }
#endif
///////////////////////////////// /////////////////////////////////
// Standard mathematical functions. // Standard mathematical functions.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_MATH_WANT_ALL
union ConvertFloatInteger { union ConvertFloatInteger {
float f; float f;
uint32_t i; uint32_t i;
@ -869,10 +883,14 @@ bool EsCRTisnanf(float x) {
#undef D #undef D
#undef F #undef F
#endif
///////////////////////////////// /////////////////////////////////
// High precision floats. // High precision floats.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_MATH_WANT_ALL
#define MANTISSA_BITS (256) #define MANTISSA_BITS (256)
#include <x86intrin.h> #include <x86intrin.h>
@ -1502,10 +1520,14 @@ void BigFloatInitialise() {
} }
} }
#endif
///////////////////////////////// /////////////////////////////////
// Calculating expressions. // Calculating expressions.
///////////////////////////////// /////////////////////////////////
#ifdef SHARED_MATH_WANT_ALL
namespace Calculator { namespace Calculator {
enum ValueType : uint8_t { enum ValueType : uint8_t {
VALUE_ERROR, VALUE_ERROR,

View File

@ -1406,6 +1406,7 @@ void DoCommand(const char *l) {
while ((entry = readdir(directory))) { while ((entry = readdir(directory))) {
if (0 == strcmp(entry->d_name, "nanosvg.h")) continue; if (0 == strcmp(entry->d_name, "nanosvg.h")) continue;
if (0 == strcmp(entry->d_name, "hsluv.h")) continue;
if (0 == strcmp(entry->d_name, "stb_ds.h")) continue; if (0 == strcmp(entry->d_name, "stb_ds.h")) continue;
if (0 == strcmp(entry->d_name, "stb_image.h")) continue; if (0 == strcmp(entry->d_name, "stb_image.h")) continue;
if (0 == strcmp(entry->d_name, "stb_sprintf.h")) continue; if (0 == strcmp(entry->d_name, "stb_sprintf.h")) continue;

View File

@ -1,9 +1,14 @@
#define UI_IMPLEMENTATION #define UI_IMPLEMENTATION
#define ES_CRT_WITHOUT_PREFIX #define ES_CRT_WITHOUT_PREFIX
#define EsPainter _EsPainter
#define EsPaintTarget _EsPaintTarget
#include "luigi.h" #include "luigi.h"
#undef EsPaintTarget
#undef EsPainter
#ifndef OS_ESSENCE #ifndef OS_ESSENCE
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#include <limits.h>
#endif #endif
#include "hsluv.h" #include "hsluv.h"
@ -34,20 +39,59 @@
#define ES_TEXT_ELLIPSIS (1 << 6) #define ES_TEXT_ELLIPSIS (1 << 6)
#define ES_TEXT_WRAP (1 << 7) #define ES_TEXT_WRAP (1 << 7)
#define ES_FONT_SANS (0xFFFF) #define ES_FONT_SANS (0xFFFF)
#define ES_FONT_SERIF (0xFFFE) #define ES_FONT_SERIF (0xFFFE)
#define ES_FONT_MONOSPACED (0xFFFD) #define ES_FONT_MONOSPACED (0xFFFD)
#define ES_FUNCTION_OPTIMISE_O2 __attribute__((optimize("-O2")))
#define ES_FUNCTION_OPTIMISE_O3 __attribute__((optimize("-O3")))
#define ES_INFINITY INFINITY
#define EsAssert assert
#define EsCRTacosf acosf
#define EsCRTatan2f atan2f
#define EsCRTceilf ceilf
#define EsCRTcosf cosf
#define EsCRTfabsf fabsf
#define EsCRTfloorf floorf
#define EsCRTfmodf fmodf
#define EsCRTisnanf isnan
#define EsCRTlog2f log2f
#define EsCRTsinf sinf
#define EsCRTsqrtf sqrtf
#define EsHeap void #define EsHeap void
#define EsHeapAllocate(a, b, c) calloc(1, (a))
#define EsHeapFree(a, b, c) free((a))
#define EsMemoryZero(a, b) memset((a), 0, (b))
#define EsMemoryCopy memcpy #define EsMemoryCopy memcpy
#define EsMemoryCopyReverse memmove #define EsMemoryCopyReverse memmove
#define EsMemoryZero(a, b) memset((a), 0, (b))
#define EsPanic(...) UI_ASSERT(false) #define EsPanic(...) UI_ASSERT(false)
#define ES_MEMORY_MOVE_BACKWARDS - #define ES_MEMORY_MOVE_BACKWARDS -
#define SHARED_COMMON_WANT_BUFFERS
struct EsRectangle {
int32_t l, r, t, b;
};
struct EsBuffer {
union { const uint8_t *in; uint8_t *out; };
size_t position, bytes;
bool error;
void *context;
};
void *EsHeapAllocate(size_t bytes, bool zero, EsHeap *heap = nullptr) {
(void) heap;
return zero ? calloc(1, bytes) : malloc(bytes);
}
void EsHeapFree(void *pointer, size_t bytes = 0, EsHeap *heap = nullptr) {
(void) heap;
(void) bytes;
free(pointer);
}
void *EsHeapReallocate(void *oldAddress, size_t newAllocationSize, bool zeroNewSpace, EsHeap *) { void *EsHeapReallocate(void *oldAddress, size_t newAllocationSize, bool zeroNewSpace, EsHeap *) {
UI_ASSERT(!zeroNewSpace); UI_ASSERT(!zeroNewSpace);
return realloc(oldAddress, newAllocationSize); return realloc(oldAddress, newAllocationSize);
@ -69,6 +113,17 @@ void EsMemoryMove(void *_start, void *_end, intptr_t amount, bool zeroEmptySpace
#endif #endif
struct EsPaintTarget {
void *bits;
uint32_t width, height, stride;
bool fullAlpha, readOnly;
};
struct EsPainter {
EsRectangle clip;
EsPaintTarget *target;
};
const char *cursorStrings[] = { const char *cursorStrings[] = {
"Normal", "Normal",
"Text", "Text",
@ -101,53 +156,19 @@ const char *cursorStrings[] = {
"Blank", "Blank",
}; };
void BlendPixel(uint32_t *destinationPixel, uint32_t modified, bool fullAlpha) { #define IN_DESIGNER
if ((modified & 0xFF000000) == 0xFF000000) { #define DESIGNER2
*destinationPixel = modified;
} else if ((modified & 0xFF000000) == 0x00000000) {
} else if ((*destinationPixel & 0xFF000000) != 0xFF000000 && fullAlpha) {
uint32_t original = *destinationPixel;
uint32_t alpha1 = (modified & 0xFF000000) >> 24;
uint32_t alpha2 = 255 - alpha1;
uint32_t alphaD = (original & 0xFF000000) >> 24;
uint32_t alphaD2 = alphaD * alpha2;
uint32_t alphaOut = alpha1 + (alphaD2 >> 8);
if (alphaOut) { #define SHARED_COMMON_WANT_RECTANGLES
uint32_t m2 = alphaD2 / alphaOut; #define SHARED_COMMON_WANT_RENDERING
uint32_t m1 = (alpha1 << 8) / alphaOut; #include "../shared/common.cpp"
if (m2 == 0x100) m2--; #define SHARED_MATH_WANT_BASIC_UTILITIES
if (m1 == 0x100) m1--; #define SHARED_MATH_WANT_INTERPOLATION
uint32_t r2 = m2 * ((original & 0x000000FF) >> 0); #include "../shared/math.cpp"
uint32_t g2 = m2 * ((original & 0x0000FF00) >> 8);
uint32_t b2 = m2 * ((original & 0x00FF0000) >> 16);
uint32_t r1 = m1 * ((modified & 0x000000FF) >> 0);
uint32_t g1 = m1 * ((modified & 0x0000FF00) >> 8);
uint32_t b1 = m1 * ((modified & 0x00FF0000) >> 16);
uint32_t result = (alphaOut << 24)
| (0x00FF0000 & ((b1 + b2) << 8))
| (0x0000FF00 & ((g1 + g2) << 0))
| (0x000000FF & ((r1 + r2) >> 8));
*destinationPixel = result;
}
} else {
uint32_t original = *destinationPixel;
uint32_t alpha1 = (modified & 0xFF000000) >> 24;
uint32_t alpha2 = 255 - alpha1;
uint32_t r2 = alpha2 * ((original & 0x000000FF) >> 0);
uint32_t g2 = alpha2 * ((original & 0x0000FF00) >> 8);
uint32_t b2 = alpha2 * ((original & 0x00FF0000) >> 16);
uint32_t r1 = alpha1 * ((modified & 0x000000FF) >> 0);
uint32_t g1 = alpha1 * ((modified & 0x0000FF00) >> 8);
uint32_t b1 = alpha1 * ((modified & 0x00FF0000) >> 16);
uint32_t result = 0xFF000000 | (0x00FF0000 & ((b1 + b2) << 8))
| (0x0000FF00 & ((g1 + g2) << 0))
| (0x000000FF & ((r1 + r2) >> 8));
*destinationPixel = result;
}
}
#include "../shared/array.cpp" #include "../shared/array.cpp"
#include "../desktop/renderer.cpp"
#include "../desktop/theme.cpp"
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
@ -1210,10 +1231,10 @@ void InspectorPopulate() {
sprintf(cPropertyName, "layers_%d_mode", i); sprintf(cPropertyName, "layers_%d_mode", i);
UILabelCreate(0, 0, "Mode:", -1); UILabelCreate(0, 0, "Mode:", -1);
UIPanelCreate(0, UI_ELEMENT_PARENT_PUSH | UI_PANEL_HORIZONTAL); UIPanelCreate(0, UI_ELEMENT_PARENT_PUSH | UI_PANEL_HORIZONTAL);
InspectorAddRadioSwitch(object, "Background", cPropertyName, 0); InspectorAddRadioSwitch(object, "Background", cPropertyName, THEME_LAYER_MODE_BACKGROUND);
InspectorAddRadioSwitch(object, "Shadow", cPropertyName, 1); InspectorAddRadioSwitch(object, "Shadow", cPropertyName, THEME_LAYER_MODE_SHADOW);
InspectorAddRadioSwitch(object, "Content", cPropertyName, 2); InspectorAddRadioSwitch(object, "Content", cPropertyName, THEME_LAYER_MODE_CONTENT);
InspectorAddRadioSwitch(object, "Overlay", cPropertyName, 3); InspectorAddRadioSwitch(object, "Overlay", cPropertyName, THEME_LAYER_MODE_OVERLAY);
InspectorBind(&UIButtonCreate(0, UI_BUTTON_SMALL, "X", 1)->e, object->id, cPropertyName, INSPECTOR_REMOVE_BUTTON); InspectorBind(&UIButtonCreate(0, UI_BUTTON_SMALL, "X", 1)->e, object->id, cPropertyName, INSPECTOR_REMOVE_BUTTON);
UIParentPop(); UIParentPop();
UIParentPop(); UIParentPop();