/api-impl-jni: remove remains of experimental ninepatch implementation, will use skia

This commit is contained in:
Mis012
2023-09-16 16:30:14 +02:00
parent 7e071fc6cc
commit 4628cfc66d
6 changed files with 0 additions and 415 deletions

View File

@@ -71,7 +71,6 @@ libtranslationlayer_so = shared_library('translation_layer_main', [
'src/api-impl-jni/android_util_Log.c',
'src/api-impl-jni/database/android_database_SQLiteCommon.c',
'src/api-impl-jni/database/android_database_SQLiteConnection.c',
'src/api-impl-jni/drawables/ninepatch.c',
'src/api-impl-jni/graphics/android_graphics_BitmapFactory.c',
'src/api-impl-jni/graphics/android_graphics_Typeface.c',
'src/api-impl-jni/android_content_res_AssetManager.c',

View File

@@ -62,7 +62,6 @@ JNIEXPORT void JNICALL Java_android_graphics_Canvas_native_1drawText(JNIEnv *env
const char *text = _CSTRING(_text);
/* TODO: handle start/end (here or in java) */
sk_canvas_draw_simple_text(canvas, text + start, end - start, UTF8_SK_TEXT_ENCODING, x, y, font, paint);
}

View File

@@ -1,386 +0,0 @@
#include <gtk/gtk.h>
#include "ninepatch.h"
// ----- following yeeted from https://github.com/tongjinlv/my_xboot/blob/3d6a255ef4118486c13953cb07a805b0baab4bc2/src/framework/display/l-ninepatch.c -----
// [ FIXME: 1) this doesn't operate on binary 9patch files, but on source ones 2) this only works for basic cases where you have at most nine patches ]
static inline int detect_black_pixel(unsigned char * p)
{
return (((p[0] == 0) && (p[1] == 0) && (p[2] == 0) && (p[3] != 0)) ? 1 : 0);
}
void ninepatch_stretch(struct ninepatch_t * ninepatch, double width, double height)
{
int lr = ninepatch->left + ninepatch->right;
int tb = ninepatch->top + ninepatch->bottom;
if(width < ninepatch->width)
width = ninepatch->width;
if(height < ninepatch->height)
height = ninepatch->height;
ninepatch->__w = width;
ninepatch->__h = height;
ninepatch->__sx = (ninepatch->__w - lr) / (ninepatch->width - lr);
ninepatch->__sy = (ninepatch->__h - tb) / (ninepatch->height - tb);
}
static bool surface_to_ninepatch(cairo_surface_t * surface, struct ninepatch_t * patch)
{
cairo_surface_t * cs;
cairo_t * cr;
unsigned char * data;
int width, height;
int stride;
int w, h;
int i;
if(!surface || !patch)
return FALSE;
width = cairo_image_surface_get_width(surface);
height = cairo_image_surface_get_height(surface);
if(width < 3 || height < 3)
return FALSE;
/* Nine patch chunk */
cs = cairo_surface_create_similar_image(surface, CAIRO_FORMAT_ARGB32, width, height);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, 0, 0);
cairo_paint(cr);
cairo_destroy(cr);
data = cairo_image_surface_get_data(cs);
stride = cairo_image_surface_get_stride(cs);
/* Nine patch default size */
width = width - 2;
height = height - 2;
patch->width = width;
patch->height = height;
/* Stretch information */
patch->left = 0;
patch->right = 0;
patch->top = 0;
patch->right = 0;
for(i = 0; i < width; i++)
{
if(detect_black_pixel(&data[(i + 1) * 4]))
{
patch->left = i;
break;
}
}
for(i = width - 1; i >= 0; i--)
{
if(detect_black_pixel(&data[(i + 1) * 4]))
{
patch->right = width - 1 - i;
break;
}
}
for(i = 0; i < height; i++)
{
if(detect_black_pixel(&data[stride * (i + 1)]))
{
patch->top = i;
break;
}
}
for(i = height - 1; i >= 0; i--)
{
if(detect_black_pixel(&data[stride * (i + 1)]))
{
patch->bottom = height - 1 - i;
break;
}
}
cairo_surface_destroy(cs);
/* Left top */
w = patch->left;
h = patch->top;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), patch->left, patch->top);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -1, -1);
cairo_paint(cr);
cairo_destroy(cr);
patch->lt = cs;
}
else
{
patch->lt = NULL;
}
/* Middle top */
w = width - patch->left - patch->right;
h = patch->top;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -patch->left - 1, -1);
cairo_paint(cr);
cairo_destroy(cr);
patch->mt = cs;
}
else
{
patch->mt = NULL;
}
/* Right top */
w = patch->right;
h = patch->top;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -(width - patch->right) - 1, -1);
cairo_paint(cr);
cairo_destroy(cr);
patch->rt = cs;
}
else
{
patch->rt = NULL;
}
/* Left Middle */
w = patch->left;
h = height - patch->top - patch->bottom;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -1, -patch->top - 1);
cairo_paint(cr);
cairo_destroy(cr);
patch->lm = cs;
}
else
{
patch->lm = NULL;
}
/* Middle Middle */
w = width - patch->left - patch->right;
h = height - patch->top - patch->bottom;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -patch->left - 1, -patch->top - 1);
cairo_paint(cr);
cairo_destroy(cr);
patch->mm = cs;
}
else
{
patch->mm = NULL;
}
/* Right middle */
w = patch->right;
h = height - patch->top - patch->bottom;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -(width - patch->right) - 1, -patch->top - 1);
cairo_paint(cr);
cairo_destroy(cr);
patch->rm = cs;
}
else
{
patch->rm = NULL;
}
/* Left bottom */
w = patch->left;
h = patch->bottom;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -1, -(height - patch->bottom) - 1);
cairo_paint(cr);
cairo_destroy(cr);
patch->lb = cs;
}
else
{
patch->lb = NULL;
}
/* Middle bottom */
w = width - patch->left - patch->right;
h = patch->bottom;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -patch->left - 1, -(height - patch->bottom) - 1);
cairo_paint(cr);
cairo_destroy(cr);
patch->mb = cs;
}
else
{
patch->mb = NULL;
}
/* Right bottom */
w = patch->right;
h = patch->bottom;
if(w > 0 && h > 0)
{
cs = cairo_surface_create_similar(surface, cairo_surface_get_content(surface), w, h);
cr = cairo_create(cs);
cairo_set_source_surface(cr, surface, -(width - patch->right) - 1, -(height - patch->bottom) - 1);
cairo_paint(cr);
cairo_destroy(cr);
patch->rb = cs;
}
else
{
patch->rb = NULL;
}
ninepatch_stretch(patch, width, height);
return TRUE;
}
struct ninepatch_t * ninepatch_new(char *filename)
{
struct ninepatch_t *ninepatch = malloc(sizeof(struct ninepatch_t));
cairo_surface_t *surface = cairo_image_surface_create_from_png(filename);
if(cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS)
exit(-1);
bool result = surface_to_ninepatch(surface, ninepatch);
cairo_surface_destroy(surface);
if(!result)
exit(-2);
return ninepatch;
}
// ----- end of borrowed code -----
cairo_surface_t * ninepatch_to_surface(struct ninepatch_t *ninepatch)
{
static const cairo_matrix_t identity = {1, 0,
0, 1,
0, 0};
cairo_surface_t *cs = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, (int)ninepatch->__w, (int)ninepatch->__h);
cairo_t *cr = cairo_create(cs);
cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
// relevant measurements
const int left_w = ninepatch->left;
const int top_h = ninepatch->top;
const int middle_h = ninepatch->height - ninepatch->top - ninepatch->bottom;
const int middle_w = ninepatch->width - ninepatch->left - ninepatch->right;
// offset for left/top is zero, and for middle it's width/height of left/top respectively
double offset_right_x = left_w + middle_w * ninepatch->__sx;
double offset_bottom_y = top_h + middle_h * ninepatch->__sy;
// --- left top ---
if(ninepatch->lt) {
cairo_set_source_surface(cr, ninepatch->lt, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
}
// --- left middle ---
if(ninepatch->lm) {
cairo_translate(cr, 0, top_h);
cairo_scale(cr, 1, ninepatch->__sy);
cairo_set_source_surface(cr, ninepatch->lm, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// --- left bottom ---
if(ninepatch->lb) {
cairo_translate(cr, 0, offset_bottom_y);
cairo_set_source_surface(cr, ninepatch->lb, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// -------------------------------------------------------------------------
// --- middle top ---
if(ninepatch->mt) {
cairo_translate(cr, left_w, 0);
cairo_scale(cr, ninepatch->__sx, 1);
cairo_set_source_surface(cr, ninepatch->mt, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// --- middle middle ---
if(ninepatch->mm) {
cairo_translate(cr, left_w, top_h);
cairo_scale(cr, ninepatch->__sx, ninepatch->__sy);
cairo_set_source_surface(cr, ninepatch->mm, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// --- middle bottom ---
if(ninepatch->mb) {
cairo_translate(cr, left_w, offset_bottom_y);
cairo_scale(cr, ninepatch->__sx, 1);
cairo_set_source_surface(cr, ninepatch->mb, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// -------------------------------------------------------------------------
// --- right top ---
if(ninepatch->rt) {
cairo_translate(cr, offset_right_x, 0);
cairo_set_source_surface(cr, ninepatch->rt, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// --- right middle ---
if(ninepatch->rm) {
cairo_translate(cr, offset_right_x, top_h);
cairo_scale(cr, 1, ninepatch->__sy);
cairo_set_source_surface(cr, ninepatch->rm, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
// --- right bottom ---
if(ninepatch->rb) {
cairo_translate(cr, offset_right_x, offset_bottom_y);
cairo_set_source_surface(cr, ninepatch->rb, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);
cairo_set_matrix(cr, &identity);
}
printf(";;;;;; %lf %lf | %d %d\n", ninepatch->__w, ninepatch->__h, cairo_image_surface_get_width(cs), cairo_image_surface_get_height(cs));
return cs;
}

View File

@@ -1,24 +0,0 @@
#ifndef NINEPATCH_H
#define NINEPATCH_H
struct ninepatch_t {
int width, height;
int left, top, right, bottom;
cairo_surface_t * lt;
cairo_surface_t * mt;
cairo_surface_t * rt;
cairo_surface_t * lm;
cairo_surface_t * mm;
cairo_surface_t * rm;
cairo_surface_t * lb;
cairo_surface_t * mb;
cairo_surface_t * rb;
double __w, __h;
double __sx, __sy;
};
void ninepatch_stretch(struct ninepatch_t * ninepatch, double width, double height);
struct ninepatch_t * ninepatch_new(char *filename);
cairo_surface_t * ninepatch_to_surface(struct ninepatch_t *ninepatch);
#endif

View File

@@ -2,7 +2,6 @@
#include "../defines.h"
#include "../util.h"
#include "../drawables/ninepatch.h"
#include "../sk_area/sk_area.h"

View File

@@ -5,8 +5,6 @@
#include "WrapperWidget.h"
#include "../drawables/ninepatch.h"
#include "../generated_headers/android_widget_LinearLayout.h"
#include "../generated_headers/android_view_ViewGroup.h"