def METHOD_NAME(frame, fctx, w, h):
    cr = fctx.get_frame_cr()
    colors = fctx.get_editor_value("Colors")
    # Draw bg
    if colors == 0:
        bg_color = cairo.SolidPattern(*fctx.get_data_obj("hue_tuple"))
    else:
        palette = COLORS_LIST[colors - 1]
        bg_color = cairo.SolidPattern(*palette[0])
    cr.set_source(bg_color)
    cr.rectangle(0, 0, w, h)
    cr.fill()
    item_colors = fctx.get_data_obj("item_colors")
    item_data = fctx.get_data_obj("item_data")
    shadow_offset = fctx.get_editor_value("Shadow Offset")
    shadow_opacity = float(fctx.get_editor_value("Shadow Opacity")) / 100.0
    screen_height = fctx.get_profile_property(fluxity.PROFILE_HEIGHT)
    # Draw items
    number_of_items = fctx.get_editor_value("Number of Items")
    size_max = fctx.get_data_obj("size_max")
    path_start_x = - size_max
    path_end_x =  w + size_max
    path_len = path_end_x - path_start_x
    SPEED_NORM_PER_FRAME = 15.0 / float(w) # Speed value 1.0 gets 15 pixels of movement per frame.
    for i in range(0, number_of_items):
        path_pos, y, item_speed, item_size, color_index = item_data[i]
        xc = item_size / 2.0
        yc = item_size / 2.0
        xpos_norm = path_pos + (float(frame) * item_speed * SPEED_NORM_PER_FRAME)
        while xpos_norm > 1.0:
            xpos_norm = xpos_norm - 1.0
        x = path_start_x + path_len * xpos_norm
        cr.save()
        cr.translate(x + shadow_offset, y)
        cr.rectangle(0, 0, xc, screen_height)
        cr.set_source(cairo.SolidPattern(0,0,0, shadow_opacity))
        cr.fill()
        cr.restore()
        cr.save()
        cr.translate(x, y)
        cr.rectangle(0, 0, xc, screen_height)
        if colors == 0:
            draw_color = item_colors[color_index]
        else:
            palette_color_index = color_index // NUMBER_OF_HUES
            hue_index = color_index % NUMBER_OF_HUES
            palette_color_hues = item_colors[palette_color_index]
            draw_color = palette_color_hues[hue_index]
        cr.set_source(draw_color)
        cr.fill()
        cr.restore()