本文整理汇总了C++中rect::sdl_rect方法的典型用法代码示例。如果您正苦于以下问题:C++ rect::sdl_rect方法的具体用法?C++ rect::sdl_rect怎么用?C++ rect::sdl_rect使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类rect
的用法示例。
在下文中一共展示了rect::sdl_rect方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handle_draw
void animation_preview_widget::handle_draw() const
{
graphics::draw_rect(rect(x(),y(),width(),height()), graphics::color(0,0,0,196));
rect image_area(x(), y(), (width()*3)/4, height() - 30);
const graphics::texture image_texture(graphics::texture::get(obj_["image"].as_string()));
if(image_texture.valid()) {
const graphics::clip_scope clipping_scope(image_area.sdl_rect());
const rect focus_area(frame_->area().x(), frame_->area().y(),
(frame_->area().w() + frame_->pad())*frame_->num_frames_per_row(),
(frame_->area().h() + frame_->pad())*(frame_->num_frames()/frame_->num_frames_per_row() + (frame_->num_frames()%frame_->num_frames_per_row() ? 1 : 0)));
GLfloat scale = 2.0;
for(int n = 0; n != abs(scale_); ++n) {
scale *= (scale_ < 0 ? 0.5 : 2.0);
}
while(image_area.w()*scale*2.0 < image_area.w() &&
image_area.h()*scale*2.0 < image_area.h()) {
scale *= 2.0;
scale_++;
update_zoom_label();
}
while(focus_area.w()*scale > image_area.w() ||
focus_area.h()*scale > image_area.h()) {
scale *= 0.5;
scale_--;
update_zoom_label();
}
const int show_width = image_area.w()/scale;
const int show_height = image_area.h()/scale;
int x1 = focus_area.x() + (focus_area.w() - show_width)/2;
int y1 = focus_area.y() + (focus_area.h() - show_height)/2;
int x2 = x1 + show_width;
int y2 = y1 + show_height;
int xpos = image_area.x();
int ypos = image_area.y();
src_rect_ = rect(x1, y1, x2 - x1, y2 - y1);
dst_rect_ = rect(xpos, ypos, (x2-x1)*scale, (y2-y1)*scale);
graphics::blit_texture(image_texture, xpos, ypos,
(x2-x1)*scale, (y2-y1)*scale, 0.0,
GLfloat(x1)/image_texture.width(),
GLfloat(y1)/image_texture.height(),
GLfloat(x2)/image_texture.width(),
GLfloat(y2)/image_texture.height());
for(int n = 0; n != frame_->num_frames(); ++n) {
const int row = n/frame_->num_frames_per_row();
const int col = n%frame_->num_frames_per_row();
const int x = xpos - x1*scale + (frame_->area().x() + col*(frame_->area().w()+frame_->pad()))*scale;
const int y = ypos - y1*scale + (frame_->area().y() + row*(frame_->area().h()+frame_->pad()))*scale;
const rect box(x, y, frame_->area().w()*scale, frame_->area().h()*scale);
graphics::draw_hollow_rect(box.sdl_rect(), n == 0 ? graphics::color_yellow() : graphics::color_white(), frame_->frame_number(cycle_) == n ? 0xFF : 0x88);
}
int mousex, mousey;
if(anchor_x_ != -1 && SDL_GetMouseState(&mousex, &mousey) &&
point_in_rect(point(mousex, mousey), dst_rect_)) {
const point p1 = mouse_point_to_image_loc(point(mousex, mousey));
const point p2 = mouse_point_to_image_loc(point(anchor_x_, anchor_y_));
int xpos1 = xpos - x1*scale + p1.x*scale;
int xpos2 = xpos - x1*scale + p2.x*scale;
int ypos1 = ypos - y1*scale + p1.y*scale;
int ypos2 = ypos - y1*scale + p2.y*scale;
if(xpos2 < xpos1) {
std::swap(xpos1, xpos2);
}
if(ypos2 < ypos1) {
std::swap(ypos1, ypos2);
}
rect area(xpos1, ypos1, xpos2 - xpos1, ypos2 - ypos1);
graphics::draw_hollow_rect(area.sdl_rect(), graphics::color_white());
}
}
rect preview_area(x() + (width()*3)/4, y(), width()/4, height());
GLfloat scale = 1.0;
while(false && (frame_->width()*scale > preview_area.w() || frame_->height()*scale > preview_area.h())) {
scale *= 0.5;
}
frame_->draw(
preview_area.x() + (preview_area.w() - frame_->width()*scale)/2,
preview_area.y() + (preview_area.h() - frame_->height()*scale)/2,
true, false, cycle_, 0, scale);
if(++cycle_ >= frame_->duration()) {
cycle_ = 0;
}
foreach(const_widget_ptr w, widgets_) {
//.........这里部分代码省略.........