//-----------------------------memory_inputs-------------------------------- const MachOper* MachNode::memory_inputs(Node* &base, Node* &index) const { const MachOper* oper = memory_operand(); if (oper == (MachOper*)-1) { base = NodeSentinel; index = NodeSentinel; } else { base = NULL; index = NULL; if (oper != NULL) { // It has a unique memory operand. Find its index. int oper_idx = num_opnds(); while (--oper_idx >= 0) { if (_opnds[oper_idx] == oper) break; } int oper_pos = operand_index(oper_idx); int base_pos = oper->base_position(); if (base_pos >= 0) { base = _in[oper_pos+base_pos]; } int index_pos = oper->index_position(); if (index_pos >= 0) { index = _in[oper_pos+index_pos]; } } } return oper; }
static inline int operand_xindex(twin_operand_t *o) { int ind = operand_index(o); return ind != TWIN_RGB16 ? ind : TWIN_ARGB32; }
/* XXX Fixme: source clipping is busted */ static void _twin_composite_simple (twin_pixmap_t *dst, twin_coord_t dst_x, twin_coord_t dst_y, twin_operand_t *src, twin_coord_t src_x, twin_coord_t src_y, twin_operand_t *msk, twin_coord_t msk_x, twin_coord_t msk_y, twin_operator_t operator, twin_coord_t width, twin_coord_t height) { twin_coord_t iy; twin_coord_t left, top, right, bottom; twin_coord_t sdx, sdy; twin_source_u s; dst_x += dst->origin_x; dst_y += dst->origin_y; left = dst_x; top = dst_y; right = dst_x + width; bottom = dst_y + height; /* clip */ if (left < dst->clip.left) left = dst->clip.left; if (top < dst->clip.top) top = dst->clip.top; if (right > dst->clip.right) right = dst->clip.right; if (bottom > dst->clip.bottom) bottom = dst->clip.bottom; if (left >= right || top >= bottom) return; if (src->source_kind == TWIN_PIXMAP) { src_x += src->u.pixmap->origin_x; src_y += src->u.pixmap->origin_y; } else s.c = src->u.argb; sdx = src_x - dst_x; sdy = src_y - dst_y; if (msk) { twin_src_msk_op op; twin_source_u m; twin_coord_t mdx, mdy; if (msk->source_kind == TWIN_PIXMAP) { msk_x += msk->u.pixmap->origin_x; msk_y += msk->u.pixmap->origin_y; } else m.c = msk->u.argb; mdx = msk_x - dst_x; mdy = msk_y - dst_y; op = comp3[operator][operand_index(src)][operand_index(msk)][dst->format]; for (iy = top; iy < bottom; iy++) { if (src->source_kind == TWIN_PIXMAP) s.p = twin_pixmap_pointer (src->u.pixmap, left+sdx, iy+sdy); if (msk->source_kind == TWIN_PIXMAP) m.p = twin_pixmap_pointer (msk->u.pixmap, left+mdx, iy+mdy); (*op) (twin_pixmap_pointer (dst, left, iy), s, m, right - left); } } else { twin_src_op op; op = comp2[operator][operand_index(src)][dst->format]; for (iy = top; iy < bottom; iy++) { if (src->source_kind == TWIN_PIXMAP) s.p = twin_pixmap_pointer (src->u.pixmap, left+sdx, iy+sdy); (*op) (twin_pixmap_pointer (dst, left, iy), s, right - left); } } twin_pixmap_damage (dst, left, top, right, bottom); }