#include "genclip.h"
#include "harness/trace.h"
// IDA: br_clip_result __cdecl PixelmapPointClip(br_point *out, br_point *in, br_pixelmap *pm)
br_clip_result PixelmapPointClip(br_point* out, br_point* in, br_pixelmap* pm) {
LOG_TRACE("(%p, %p, %p)", out, in, pm);
out->x = in->x + pm->origin_x;
out->y = in->y + pm->origin_y;
if (out->x < 0) {
return BR_CLIP_REJECT;
}
if (out->y < 0) {
return BR_CLIP_REJECT;
}
if (out->x >= pm->width) {
return BR_CLIP_REJECT;
}
if (out->y >= pm->height) {
return BR_CLIP_REJECT;
}
return BR_CLIP_ACCEPT;
}
// IDA: br_clip_result __cdecl PixelmapLineClip(br_point *s_out, br_point *e_out, br_point *s_in, br_point *e_in, br_pixelmap *pm)
br_clip_result PixelmapLineClip(br_point* s_out, br_point* e_out, br_point* s_in, br_point* e_in, br_pixelmap* pm) {
int temp;
br_int_32 w;
br_int_32 h;
br_int_32 x1;
br_int_32 x2;
br_int_32 y1;
br_int_32 y2;
LOG_TRACE("(%p, %p, %p, %p, %p)", s_out, e_out, s_in, e_in, pm);
x1 = s_in->x + pm->origin_x;
x2 = e_in->x + pm->origin_x;
y1 = s_in->y + pm->origin_y;
y2 = e_in->y + pm->origin_y;
w = pm->width - 1;
h = pm->height - 1;
if (x2 < x1) {
temp = x2;
x2 = x1;
x1 = temp;
temp = y2;
y2 = y1;
y1 = temp;
}
if (x2 >= 0 && x1 <= w) {
if (y1 < y2) {
if (y2 >= 0 && y1 <= h) {
if (y1 < 0) {
x1 -= (x2 - x1) * y1 / (y2 - y1);
if (w < x1) {
return BR_CLIP_REJECT;
}
y1 = 0;
}
if (y2 <= h) {
incr_p2:
if (x1 < 0) {
y1 -= (y2 - y1) * x1 / (x2 - x1);
x1 = 0;
}
if (w < x2) {
y2 -= (x2 - w) * (y2 - y1) / (x2 - x1);
x2 = w;
}
s_out->x = x1;
s_out->y = y1;
e_out->x = x2;
e_out->y = y2;
return BR_CLIP_PARTIAL;
} else {
x2 -= (y2 - h) * (x2 - x1) / (y2 - y1);
y2 = h;
if (0 <= x2) {
goto incr_p2;
}
}
}
} else {
if (0 <= y1 && y2 <= h) {
if (y1 <= h) {
decr_p1:
if (y2 < 0) {
x2 -= (x2 - x1) * y2 / (y2 - y1);
if (x2 < 0) {
return BR_CLIP_REJECT;
}
y2 = 0;
}
if (x1 < 0) {
y1 -= (y2 - y1) * x1 / (x2 - x1);
x1 = 0;
}
if (w < x2) {
y2 -= (x2 - w) * (y2 - y1) / (x2 - x1);
x2 = w;
}
s_out->x = x1;
s_out->y = y1;
e_out->x = x2;
e_out->y = y2;
return BR_CLIP_PARTIAL;
} else {
x1 += (h - y1) * (x2 - x1) / (y2 - y1);
y1 = h;
if (x1 <= w) {
goto decr_p1;
}
}
}
}
}
return BR_CLIP_REJECT;
}
// IDA: br_clip_result __cdecl PixelmapRectangleClip(br_rectangle *out, br_rectangle *in, br_pixelmap *pm)
br_clip_result PixelmapRectangleClip(br_rectangle* out, br_rectangle* in, br_pixelmap* pm) {
LOG_TRACE("(%p, %p, %p)", out, in, pm);
out->x = pm->origin_x + in->x;
out->y = pm->origin_y + in->y;
out->w = in->w;
out->h = in->h;
if (pm->width > out->x && pm->height > out->y) {
if ((out->x + out->w) > 0 && (out->y + out->h) > 0) {
if (out->x < 0) {
out->x = 0;
out->w += out->x;
}
if (out->y < 0) {
out->y = 0;
out->h += out->y;
}
if ((out->x + out->w) > pm->width)
out->w = pm->width - out->x;
if ((out->y + out->h) > pm->height) {
out->h = pm->height - out->y;
}
if (out->w != 0 && out->h != 0) {
return BR_CLIP_PARTIAL;
}
}
}
return BR_CLIP_REJECT;
}
// IDA: br_clip_result __cdecl PixelmapRectangleClipTwo(br_rectangle *r_out, br_point *p_out, br_rectangle *r_in, br_point *p_in, br_pixelmap *pm_dst, br_pixelmap *pm_src)
br_clip_result PixelmapRectangleClipTwo(br_rectangle* r_out, br_point* p_out, br_rectangle* r_in, br_point* p_in, br_pixelmap* pm_dst, br_pixelmap* pm_src) {
LOG_TRACE("(%p, %p, %p, %p, %p, %p)", r_out, p_out, r_in, p_in, pm_dst, pm_src);
r_out->x = pm_src->origin_x + r_in->x;
r_out->y = pm_src->origin_y + r_in->y;
r_out->w = r_in->w;
r_out->h = r_in->h;
p_out->x = pm_dst->origin_x + p_in->x;
p_out->y = pm_dst->origin_y + p_in->y;
if (p_out->x >= pm_dst->width) {
return BR_CLIP_REJECT;
}
if (p_out->y >= pm_dst->height) {
return BR_CLIP_REJECT;
}
if (r_out->x >= pm_src->width) {
return BR_CLIP_REJECT;
}
if (r_out->y >= pm_src->height) {
return BR_CLIP_REJECT;
}
if (p_out->x + r_out->w <= 0) {
return BR_CLIP_REJECT;
}
if (p_out->y + r_out->h <= 0) {
return BR_CLIP_REJECT;
}
if (r_out->x + r_out->w <= 0) {
return BR_CLIP_REJECT;
}
if (r_out->y + r_out->h <= 0) {
return BR_CLIP_REJECT;
}
if (p_out->x < 0) {
r_out->w += p_out->x;
r_out->x -= p_out->x;
p_out->x = 0;
}
if (p_out->y < 0) {
r_out->h += p_out->y;
r_out->y -= p_out->y;
p_out->y = 0;
}
if (p_out->x + r_out->w > pm_dst->width) {
r_out->w = pm_dst->width - p_out->x;
}
if (p_out->y + r_out->h > pm_dst->height) {
r_out->h = pm_dst->height - p_out->y;
}
if (r_out->x < 0) {
r_out->w += r_out->x;
p_out->x -= r_out->x;
r_out->x = 0;
}
if (r_out->y < 0) {
r_out->h += r_out->y;
p_out->y -= r_out->y;
r_out->y = 0;
}
if (r_out->x + r_out->w > pm_src->width) {
r_out->w = pm_src->width - r_out->x;
}
if (r_out->y + r_out->h > pm_src->height) {
r_out->h = pm_src->height - r_out->y;
}
if (r_out->w == 0 || r_out->h == 0) {
return BR_CLIP_REJECT;
}
return BR_CLIP_PARTIAL;
}
// IDA: br_clip_result __cdecl PixelmapCopyBitsClip(br_rectangle *r_out, br_point *p_out, br_rectangle *r_in, br_point *p_in, br_pixelmap *pm)
br_clip_result PixelmapCopyBitsClip(br_rectangle* r_out, br_point* p_out, br_rectangle* r_in, br_point* p_in, br_pixelmap* pm) {
LOG_TRACE("(%p, %p, %p, %p, %p)", r_out, p_out, r_in, p_in, pm);
r_out->x = r_in->x;
r_out->y = r_in->y;
r_out->w = r_in->w;
r_out->h = r_in->h;
p_out->x = pm->origin_x + p_in->x;
p_out->y = pm->origin_y + p_in->y;
if (p_out->x >= pm->width) {
return BR_CLIP_REJECT;
}
if (p_out->y >= pm->height) {
return BR_CLIP_REJECT;
}
if (p_out->x + r_out->w <= 0) {
return BR_CLIP_REJECT;
}
if (p_out->y + r_out->h <= 0) {
return BR_CLIP_REJECT;
}
if (p_out->x < 0) {
r_out->w += p_out->x;
r_out->x -= p_out->x;
p_out->x = 0;
}
if (p_out->y < 0) {
r_out->h += p_out->y;
r_out->y -= p_out->y;
p_out->y = 0;
}
if (p_out->x + r_out->w > pm->width) {
r_out->w = pm->width - p_out->x;
}
if (p_out->y + r_out->h > pm->height) {
r_out->h = pm->height - p_out->y;
}
if (r_out->w == 0 || r_out->h == 0) {
return BR_CLIP_REJECT;
}
return BR_CLIP_PARTIAL;
}