void SubtitleScreen::DisplayDVDButton(AVSubtitle* dvdButton, QRect &buttonPos) { if (!dvdButton || !m_player) return; VideoOutput *vo = m_player->GetVideoOutput(); if (!vo) return; DeleteAllChildren(); SetRedraw(); float tmp = 0.0; QRect dummy; vo->GetOSDBounds(dummy, m_safeArea, tmp, tmp, tmp); AVSubtitleRect *hl_button = dvdButton->rects[0]; uint h = hl_button->h; uint w = hl_button->w; QRect rect = QRect(hl_button->x, hl_button->y, w, h); QImage bg_image(hl_button->pict.data[0], w, h, w, QImage::Format_Indexed8); uint32_t *bgpalette = (uint32_t *)(hl_button->pict.data[1]); QVector<uint32_t> bg_palette(4); for (int i = 0; i < 4; i++) bg_palette[i] = bgpalette[i]; bg_image.setColorTable(bg_palette); // copy button region of background image const QRect fg_rect(buttonPos.translated(-hl_button->x, -hl_button->y)); QImage fg_image = bg_image.copy(fg_rect); QVector<uint32_t> fg_palette(4); uint32_t *fgpalette = (uint32_t *)(dvdButton->rects[1]->pict.data[1]); if (fgpalette) { for (int i = 0; i < 4; i++) fg_palette[i] = fgpalette[i]; fg_image.setColorTable(fg_palette); } bg_image = bg_image.convertToFormat(QImage::Format_ARGB32); fg_image = fg_image.convertToFormat(QImage::Format_ARGB32); // set pixel of highlight area to highlight color for (int x=fg_rect.x(); x < fg_rect.x()+fg_rect.width(); ++x) { if ((x < 0) || (x > hl_button->w)) continue; for (int y=fg_rect.y(); y < fg_rect.y()+fg_rect.height(); ++y) { if ((y < 0) || (y > hl_button->h)) continue; bg_image.setPixel(x, y, fg_image.pixel(x-fg_rect.x(),y-fg_rect.y())); } } AddScaledImage(bg_image, rect); }
void BadguyManager::drawBadguys(QPainter* painter) { QImage bg_image(":/pics/pic/windows_logo.jpg"); painter->save(); painter->setBrush(QBrush(QColor(50, 50, 50))); for (std::vector<Badguy>::iterator step = badguy_arr.begin(); step != badguy_arr.end(); step++ ) { // 用坏蛋的数据画图 //painter->drawRect((*step).position.x(), (*step).position.y(), // (*step).width, (*step).height); painter->drawImage(QRect(step->position.x()*sm->width()/sm->wh_ratio, step->position.y()*sm->height(), step->width*sm->width()/sm->wh_ratio, step->height*sm->height()), bg_image); } painter->restore(); }
void BackgroundFromLayer::onExecute() { Layer* layer = this->layer(); Sprite* sprite = layer->sprite(); auto doc = static_cast<Doc*>(sprite->document()); color_t bgcolor = doc->bgColor(); // Create a temporary image to draw each cel of the new Background // layer. ImageRef bg_image(Image::create(sprite->pixelFormat(), sprite->width(), sprite->height())); CelList cels; layer->getCels(cels); for (Cel* cel : cels) { Image* cel_image = cel->image(); ASSERT(cel_image); clear_image(bg_image.get(), bgcolor); render::composite_image( bg_image.get(), cel_image, sprite->palette(cel->frame()), cel->x(), cel->y(), MID(0, cel->opacity(), 255), static_cast<LayerImage*>(layer)->blendMode()); // now we have to copy the new image (bg_image) to the cel... executeAndAdd(new cmd::SetCelPosition(cel, 0, 0)); // change opacity to 255 if (cel->opacity() < 255) executeAndAdd(new cmd::SetCelOpacity(cel, 255)); // Same size of cel image and background image, we can just // replace pixels. if (bg_image->width() == cel_image->width() && bg_image->height() == cel_image->height()) { executeAndAdd(new CopyRect(cel_image, bg_image.get(), gfx::Clip(0, 0, cel_image->bounds()))); } // In other case we have to replace the whole image (this is the // most common case, a smaller transparent cel that is converted // to a canvas size cel in the background) else { ImageRef bg_image2(Image::createCopy(bg_image.get())); executeAndAdd(new cmd::ReplaceImage(sprite, cel->imageRef(), bg_image2)); } } // Fill all empty cels with a flat image filled with bgcolor for (frame_t frame(0); frame<sprite->totalFrames(); ++frame) { Cel* cel = layer->cel(frame); if (!cel) { ImageRef cel_image(Image::create(sprite->pixelFormat(), sprite->width(), sprite->height())); clear_image(cel_image.get(), bgcolor); // Create the new cel and add it to the new background layer cel = new Cel(frame, cel_image); executeAndAdd(new cmd::AddCel(layer, cel)); } } executeAndAdd(new cmd::ConfigureBackground(layer)); }
void BackgroundFromLayer::onExecute() { Layer* layer = this->layer(); Sprite* sprite = layer->sprite(); app::Document* doc = static_cast<app::Document*>(sprite->document()); color_t bgcolor = doc->bgColor(); // create a temporary image to draw each frame of the new // `Background' layer ImageRef bg_image(Image::create(sprite->pixelFormat(), sprite->width(), sprite->height())); CelList cels; layer->getCels(cels); for (Cel* cel : cels) { // get the image from the sprite's stock of images Image* cel_image = cel->image(); ASSERT(cel_image); clear_image(bg_image.get(), bgcolor); render::composite_image( bg_image.get(), cel_image, sprite->palette(cel->frame()), cel->x(), cel->y(), MID(0, cel->opacity(), 255), static_cast<LayerImage*>(layer)->blendMode()); // now we have to copy the new image (bg_image) to the cel... executeAndAdd(new cmd::SetCelPosition(cel, 0, 0)); // change opacity to 255 if (cel->opacity() < 255) executeAndAdd(new cmd::SetCelOpacity(cel, 255)); // same size of cel-image and bg-image if (bg_image->width() == cel_image->width() && bg_image->height() == cel_image->height()) { executeAndAdd(new CopyRect(cel_image, bg_image.get(), gfx::Clip(0, 0, cel_image->bounds()))); } else { ImageRef bg_image2(Image::createCopy(bg_image.get())); executeAndAdd(new cmd::ReplaceImage(sprite, cel->imageRef(), bg_image2)); } } // Fill all empty cels with a flat-image filled with bgcolor for (frame_t frame(0); frame<sprite->totalFrames(); ++frame) { Cel* cel = layer->cel(frame); if (!cel) { ImageRef cel_image(Image::create(sprite->pixelFormat(), sprite->width(), sprite->height())); clear_image(cel_image.get(), bgcolor); // Create the new cel and add it to the new background layer cel = new Cel(frame, cel_image); executeAndAdd(new cmd::AddCel(layer, cel)); } } executeAndAdd(new cmd::ConfigureBackground(layer)); }