/* composite - */ static int zcomposite(i_ctx_t *i_ctx_p) { os_ptr op = osp; gs_composite_alpha_params_t params; check_int_leu(*op, composite_last); params.op = (gs_composite_op_t) op->value.intval; return composite_image(i_ctx_p, ¶ms); }
/* dissolve - */ static int zdissolve(i_ctx_t *i_ctx_p) { os_ptr op = osp; gs_composite_alpha_params_t params; double delta; int code = real_param(op, &delta); if (code < 0) return code; if (delta < 0 || delta > 1) return_error(e_rangecheck); params.op = composite_Dissolve; params.delta = delta; return composite_image(i_ctx_p, ¶ms); }
void layer_render(const Layer* layer, Image* image, int x, int y, FrameNumber frame) { if (!layer->isVisible()) return; switch (layer->type()) { case ObjectType::LayerImage: { const Cel* cel = static_cast<const LayerImage*>(layer)->getCel(frame); Image* src_image; if (cel) { ASSERT((cel->imageIndex() >= 0) && (cel->imageIndex() < layer->sprite()->stock()->size())); src_image = cel->image(); ASSERT(src_image != NULL); ASSERT(src_image->maskColor() == layer->sprite()->transparentColor()); composite_image(image, src_image, cel->x() + x, cel->y() + y, MID(0, cel->opacity(), 255), static_cast<const LayerImage*>(layer)->getBlendMode()); } break; } case ObjectType::LayerFolder: { LayerConstIterator it = static_cast<const LayerFolder*>(layer)->getLayerBegin(); LayerConstIterator end = static_cast<const LayerFolder*>(layer)->getLayerEnd(); for (; it != end; ++it) layer_render(*it, image, x, y, frame); break; } } }
void layer_render(const Layer* layer, Image* image, int x, int y, FrameNumber frame) { if (!layer->isReadable()) return; switch (layer->type()) { case OBJECT_LAYER_IMAGE: { const Cel* cel = static_cast<const LayerImage*>(layer)->getCel(frame); Image* src_image; if (cel) { ASSERT((cel->getImage() >= 0) && (cel->getImage() < layer->getSprite()->getStock()->size())); src_image = layer->getSprite()->getStock()->getImage(cel->getImage()); ASSERT(src_image != NULL); src_image->setMaskColor(layer->getSprite()->getTransparentColor()); composite_image(image, src_image, cel->getX() + x, cel->getY() + y, MID (0, cel->getOpacity(), 255), static_cast<const LayerImage*>(layer)->getBlendMode()); } break; } case OBJECT_LAYER_FOLDER: { LayerConstIterator it = static_cast<const LayerFolder*>(layer)->getLayerBegin(); LayerConstIterator end = static_cast<const LayerFolder*>(layer)->getLayerEnd(); for (; it != end; ++it) layer_render(*it, image, x, y, frame); break; } } }
void move_cel(ContextWriter& writer) { Document* document = writer.document(); Sprite* sprite = writer.sprite(); Cel *src_cel, *dst_cel; ASSERT(src_layer != NULL); ASSERT(dst_layer != NULL); ASSERT(src_frame >= 0 && src_frame < sprite->getTotalFrames()); ASSERT(dst_frame >= 0 && dst_frame < sprite->getTotalFrames()); if (src_layer->isBackground()) { copy_cel(writer); return; } src_cel = static_cast<LayerImage*>(src_layer)->getCel(src_frame); dst_cel = static_cast<LayerImage*>(dst_layer)->getCel(dst_frame); UndoTransaction undo(writer.context(), "Move Cel", undo::ModifyDocument); /* remove the 'dst_cel' (if it exists) because it must be replaced with 'src_cel' */ if ((dst_cel != NULL) && (!dst_layer->isBackground() || src_cel != NULL)) remove_cel(sprite, undo, static_cast<LayerImage*>(dst_layer), dst_cel); /* move the cel in the same layer */ if (src_cel != NULL) { if (src_layer == dst_layer) { if (undo.isEnabled()) undo.pushUndoer(new undoers::SetCelFrame(undo.getObjects(), src_cel)); src_cel->setFrame(dst_frame); } /* move the cel in different layers */ else { if (undo.isEnabled()) undo.pushUndoer(new undoers::RemoveCel(undo.getObjects(), src_layer, src_cel)); static_cast<LayerImage*>(src_layer)->removeCel(src_cel); src_cel->setFrame(dst_frame); /* if we are moving a cel from a transparent layer to the background layer, we have to clear the background of the image */ if (!src_layer->isBackground() && dst_layer->isBackground()) { Image* src_image = sprite->getStock()->getImage(src_cel->getImage()); Image* dst_image = crop_image(src_image, -src_cel->getX(), -src_cel->getY(), sprite->getWidth(), sprite->getHeight(), 0); if (undo.isEnabled()) { undo.pushUndoer(new undoers::ReplaceImage(undo.getObjects(), sprite->getStock(), src_cel->getImage())); undo.pushUndoer(new undoers::SetCelPosition(undo.getObjects(), src_cel)); undo.pushUndoer(new undoers::SetCelOpacity(undo.getObjects(), src_cel)); } clear_image(dst_image, app_get_color_to_clear_layer(dst_layer)); composite_image(dst_image, src_image, src_cel->getX(), src_cel->getY(), 255, BLEND_MODE_NORMAL); src_cel->setPosition(0, 0); src_cel->setOpacity(255); sprite->getStock()->replaceImage(src_cel->getImage(), dst_image); delete src_image; } if (undo.isEnabled()) undo.pushUndoer(new undoers::AddCel(undo.getObjects(), dst_layer, src_cel)); static_cast<LayerImage*>(dst_layer)->addCel(src_cel); } } undo.commit(); document->notifyCelMoved(src_layer, src_frame, dst_layer, dst_frame); set_frame_to_handle(NULL, FrameNumber(0), NULL, FrameNumber(0)); }
void copy_cel(ContextWriter& writer) { Document* document = writer.document(); Sprite* sprite = writer.sprite(); UndoTransaction undo(writer.context(), "Move Cel", undo::ModifyDocument); Cel *src_cel, *dst_cel; ASSERT(src_layer != NULL); ASSERT(dst_layer != NULL); ASSERT(src_frame >= 0 && src_frame < sprite->getTotalFrames()); ASSERT(dst_frame >= 0 && dst_frame < sprite->getTotalFrames()); src_cel = static_cast<LayerImage*>(src_layer)->getCel(src_frame); dst_cel = static_cast<LayerImage*>(dst_layer)->getCel(dst_frame); // Remove the 'dst_cel' (if it exists) because it must be replaced // with 'src_cel' if ((dst_cel != NULL) && (!dst_layer->isBackground() || src_cel != NULL)) remove_cel(sprite, undo, static_cast<LayerImage*>(dst_layer), dst_cel); // Move the cel in the same layer. if (src_cel != NULL) { Image *src_image = sprite->getStock()->getImage(src_cel->getImage()); Image *dst_image; int image_index; int dst_cel_x; int dst_cel_y; int dst_cel_opacity; // If we are moving a cel from a transparent layer to the // background layer, we have to clear the background of the image. if (!src_layer->isBackground() && dst_layer->isBackground()) { dst_image = crop_image(src_image, -src_cel->getX(), -src_cel->getY(), sprite->getWidth(), sprite->getHeight(), 0); clear_image(dst_image, app_get_color_to_clear_layer(dst_layer)); composite_image(dst_image, src_image, src_cel->getX(), src_cel->getY(), 255, BLEND_MODE_NORMAL); dst_cel_x = 0; dst_cel_y = 0; dst_cel_opacity = 255; } else { dst_image = Image::createCopy(src_image); dst_cel_x = src_cel->getX(); dst_cel_y = src_cel->getY(); dst_cel_opacity = src_cel->getOpacity(); } // Add the image in the stock image_index = sprite->getStock()->addImage(dst_image); if (undo.isEnabled()) undo.pushUndoer(new undoers::AddImage(undo.getObjects(), sprite->getStock(), image_index)); // Create the new cel dst_cel = new Cel(dst_frame, image_index); dst_cel->setPosition(dst_cel_x, dst_cel_y); dst_cel->setOpacity(dst_cel_opacity); if (undo.isEnabled()) undo.pushUndoer(new undoers::AddCel(undo.getObjects(), dst_layer, dst_cel)); static_cast<LayerImage*>(dst_layer)->addCel(dst_cel); } undo.commit(); document->notifyCelCopied(src_layer, src_frame, dst_layer, dst_frame); set_frame_to_handle(NULL, FrameNumber(0), NULL, FrameNumber(0)); }