-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add install target for mingw, more favicon implementations
- Loading branch information
Showing
9 changed files
with
282 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,20 @@ | ||
# libui-cross | ||
Prebuilt binaries for cross-compiling software using libui. | ||
Builds will contain a few experimental extensions. | ||
|
||
- [x] X86_64 Linux | ||
- [x] X86_64 Windows | ||
- [ ] X86_64 MacOS | ||
``` | ||
# Compile for MinGW from Linux | ||
make TARGET=w libui_win64.a install | ||
# Compile for linux from linux | ||
make TARGET=l libui.so install | ||
# Compile for Mac from Darling/Mac | ||
make TARGET=m libui.dylib | ||
``` | ||
|
||
- [x] X86_64 Linux (.so, .AppImage) | ||
- [x] X86_64 Windows (.a, .exe) | ||
- [ ] X86_64 MacOS (.dylib, .app) | ||
- [ ] ARM64 Linux | ||
- [ ] ARM64 MacOS |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#include <stdint.h> | ||
#include <ui.h> | ||
|
||
_UI_EXTERN void uiWindowSetIcon(uiWindow *w, const void *data, size_t length) { | ||
// ... | ||
} |
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
// 27 june 2016 | ||
#include "unix/uipriv_unix.h" | ||
|
||
struct uiImage { | ||
uiUnixControl c; | ||
GtkWidget *widget; | ||
|
||
double width; | ||
double height; | ||
GPtrArray *images; | ||
}; | ||
|
||
#define uiImageSignature 123 | ||
|
||
#define uiImage(this) ((uiImage *) (this)) | ||
|
||
uiUnixControlAllDefaults(uiImage) | ||
|
||
static void freeImageRep(gpointer item) | ||
{ | ||
cairo_surface_t *cs = (cairo_surface_t *) item; | ||
|
||
cairo_surface_destroy(cs); | ||
} | ||
|
||
uiImage *uiNewImage(double width, double height) | ||
{ | ||
uiImage *i; | ||
|
||
uiUnixNewControl(uiImage, i); | ||
|
||
i->widget = gtk_image_new(); | ||
|
||
i->width = width; | ||
i->height = height; | ||
i->images = g_ptr_array_new_with_free_func(freeImageRep); | ||
return i; | ||
} | ||
|
||
void uiFreeImage(uiImage *i) | ||
{ | ||
g_ptr_array_free(i->images, TRUE); | ||
uiprivFree(i); | ||
} | ||
|
||
void uiImageFromFile(uiImage *i, char *file) { | ||
i->widget = gtk_image_new_from_file(file); | ||
} | ||
|
||
void uiImageAppend(uiImage *i, void *pixels, int pixelWidth, int pixelHeight, int byteStride) | ||
{ | ||
cairo_surface_t *cs; | ||
uint8_t *data, *pix; | ||
int realStride; | ||
int x, y; | ||
|
||
// note that this is native-endian | ||
cs = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, | ||
pixelWidth, pixelHeight); | ||
if (cairo_surface_status(cs) != CAIRO_STATUS_SUCCESS) { | ||
/* TODO */ | ||
} | ||
cairo_surface_flush(cs); | ||
|
||
pix = (uint8_t *) pixels; | ||
data = (uint8_t *) cairo_image_surface_get_data(cs); | ||
realStride = cairo_image_surface_get_stride(cs); | ||
for (y = 0; y < pixelHeight; y++) { | ||
for (x = 0; x < pixelWidth * 4; x += 4) { | ||
union { | ||
uint32_t v32; | ||
uint8_t v8[4]; | ||
} v; | ||
|
||
v.v32 = ((uint32_t) (pix[x + 3])) << 24; | ||
v.v32 |= ((uint32_t) (pix[x])) << 16; | ||
v.v32 |= ((uint32_t) (pix[x + 1])) << 8; | ||
v.v32 |= ((uint32_t) (pix[x + 2])); | ||
data[x] = v.v8[0]; | ||
data[x + 1] = v.v8[1]; | ||
data[x + 2] = v.v8[2]; | ||
data[x + 3] = v.v8[3]; | ||
} | ||
pix += byteStride; | ||
data += realStride; | ||
} | ||
|
||
gtk_image_set_from_surface(i->widget, cs); | ||
|
||
cairo_surface_mark_dirty(cs); | ||
g_ptr_array_add(i->images, cs); | ||
} | ||
|
||
struct matcher { | ||
cairo_surface_t *best; | ||
int distX; | ||
int distY; | ||
int targetX; | ||
int targetY; | ||
gboolean foundLarger; | ||
}; | ||
|
||
// TODO is this the right algorithm? | ||
static void match(gpointer surface, gpointer data) | ||
{ | ||
cairo_surface_t *cs = (cairo_surface_t *) surface; | ||
struct matcher *m = (struct matcher *) data; | ||
int x, y; | ||
int x2, y2; | ||
|
||
x = cairo_image_surface_get_width(cs); | ||
y = cairo_image_surface_get_height(cs); | ||
if (m->best == NULL) | ||
goto writeMatch; | ||
|
||
if (x < m->targetX && y < m->targetY) | ||
if (m->foundLarger) | ||
// always prefer larger ones | ||
return; | ||
if (x >= m->targetX && y >= m->targetY && !m->foundLarger) | ||
// we set foundLarger below | ||
goto writeMatch; | ||
|
||
x2 = abs(m->targetX - x); | ||
y2 = abs(m->targetY - y); | ||
if (x2 < m->distX && y2 < m->distY) | ||
goto writeMatch; | ||
|
||
// TODO weight one dimension? threshhold? | ||
return; | ||
|
||
writeMatch: | ||
// must set this here too; otherwise the first image will never have ths set | ||
if (x >= m->targetX && y >= m->targetY && !m->foundLarger) | ||
m->foundLarger = TRUE; | ||
m->best = cs; | ||
m->distX = abs(m->targetX - x); | ||
m->distY = abs(m->targetY - y); | ||
} | ||
|
||
cairo_surface_t *uiprivImageAppropriateSurface(uiImage *i, GtkWidget *w) | ||
{ | ||
struct matcher m; | ||
|
||
m.best = NULL; | ||
m.distX = G_MAXINT; | ||
m.distY = G_MAXINT; | ||
m.targetX = i->width * gtk_widget_get_scale_factor(w); | ||
m.targetY = i->height * gtk_widget_get_scale_factor(w); | ||
m.foundLarger = FALSE; | ||
g_ptr_array_foreach(i->images, match, &m); | ||
return m.best; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include <stdint.h> | ||
#include <ui.h> | ||
|
||
#ifdef __unix__ | ||
|
||
#include <unix/uipriv_unix.h> | ||
#include <unix/attrstr.h> | ||
#include <gtk/gtk.h> | ||
|
||
struct uiLabel { | ||
uiUnixControl c; | ||
GtkWidget *widget; | ||
GtkMisc *misc; | ||
GtkLabel *label; | ||
}; | ||
|
||
PangoAttrList *uiprivAttributedStringToPangoAttrList(uiDrawTextLayoutParams *p); | ||
|
||
struct attr { | ||
uiAttribute *val; | ||
size_t start; | ||
size_t end; | ||
struct attr *prev; | ||
struct attr *next; | ||
}; | ||
|
||
struct uiprivAttrList { | ||
struct attr *first; | ||
struct attr *last; | ||
}; | ||
|
||
struct uiAttributedString { | ||
char *s; | ||
size_t len; | ||
|
||
uiprivAttrList *attrs; | ||
|
||
// indiscriminately keep a UTF-16 copy of the string on all platforms so we can hand this off to the grapheme calculator | ||
// this ensures no one platform has a speed advantage (sorry GTK+) | ||
uint16_t *u16; | ||
size_t u16len; | ||
|
||
size_t *u8tou16; | ||
size_t *u16tou8; | ||
|
||
// this is lazily created to keep things from getting *too* slow | ||
uiprivGraphemes *graphemes; | ||
}; | ||
|
||
|
||
_UI_EXTERN void uiLabelSetAttribute(uiLabel *label, uiAttribute *attr) | ||
{ | ||
struct uiDrawTextLayoutParams params; | ||
params.String = uiNewAttributedString(""); | ||
|
||
uiAttributedStringSetAttribute(params.String, attr, 0, -1); | ||
|
||
PangoAttrList *pango_list = uiprivAttributedStringToPangoAttrList(¶ms); | ||
|
||
PangoAttrList *old_list = gtk_label_get_attributes(GTK_LABEL(label->widget)); | ||
|
||
GSList *attr_list = pango_attr_list_get_attributes(old_list); | ||
|
||
for (; attr_list != NULL; attr_list = attr_list->next) { | ||
pango_attr_list_insert(pango_list, attr_list->data); | ||
} | ||
|
||
gtk_label_set_attributes(GTK_LABEL(label->widget), pango_list); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters