示例#1
0
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;
    }
}
示例#2
0
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);
}
示例#3
0
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;
    }
}