ps_image* PICAPI ps_image_create_from_image(ps_image* i, const ps_rect* r) { if (!picasso::is_valid_system_device()) { global_status = STATUS_DEVICE_ERROR; return NULL; } if (!i) { global_status = STATUS_INVALID_ARGUMENT; return NULL; } ps_rect rc = {0, 0, (float)i->buffer.width(), (float)i->buffer.height()}; if (!r) { //Note: if rect is NULL, It equal reference. global_status = STATUS_SUCCEED; return ps_image_ref(i); } else { if (r->x > 0) { rc.x = r->x; } if (r->y > 0) { rc.y = r->y; } if (r->w > 0) { rc.w = r->w; } if (r->h > 0) { rc.h = r->h; } } ps_image* img = (ps_image*)mem_malloc(sizeof(ps_image)); if (img) { img->refcount = 1; img->fmt = i->fmt; img->flage = buffer_alloc_image; img->host = (void*)ps_image_ref(i); int bpp = picasso::_bytes_per_color(i->fmt); new ((void*)&(img->buffer)) picasso::rendering_buffer; img->buffer.attach(i->buffer.buffer()+_iround(rc.y*i->buffer.stride()+rc.x*bpp), _iround(rc.w), _iround(rc.h), i->buffer.stride()); img->buffer.set_transparent(i->buffer.is_transparent()); img->buffer.set_color_channel(i->buffer.get_color_channel()); global_status = STATUS_SUCCEED; return img; } else { global_status = STATUS_OUT_OF_MEMORY; return NULL; } }
void dini_context (ps_context* gc) { ps_image_ref(pi); ps_matrix_unref(pm); ps_matrix_unref(pn); ps_pattern_unref(pt); ps_path_unref(pa); ps_gradient_unref(gr); }
ps_canvas* PICAPI ps_canvas_create_from_image(ps_image* i, const ps_rect* r) { if (!picasso::is_valid_system_device()) { global_status = STATUS_DEVICE_ERROR; return NULL; } if (!i) { global_status = STATUS_INVALID_ARGUMENT; return NULL; } ps_rect rc = {0, 0, (float)i->buffer.width(), (float)i->buffer.height()}; if (r) { if (r->x > 0) { rc.x = r->x; } if (r->y > 0) { rc.y = r->y; } if (r->w > 0) { rc.w = r->w; } if (r->h > 0) { rc.h = r->h; } } picasso::painter* pa = picasso::get_painter_from_format(i->fmt); if (!pa){ return NULL; } ps_canvas* p = (ps_canvas*)mem_malloc(sizeof(ps_canvas)); if (p) { p->refcount = 1; p->fmt = i->fmt; p->p = pa; p->flage = buffer_alloc_image; p->host = (void*)ps_image_ref(i); p->mask = NULL; int bpp = picasso::_bytes_per_color(i->fmt); new ((void*)&(p->buffer)) picasso::rendering_buffer; p->buffer.attach(i->buffer.buffer()+_iround(rc.y*i->buffer.stride()+rc.x*bpp), _iround(rc.w), _iround(rc.h), i->buffer.stride()); p->p->attach(p->buffer); global_status = STATUS_SUCCEED; return p; } else { delete pa; //mem_free painter on error global_status = STATUS_OUT_OF_MEMORY; return NULL; } }