public class BasicRenderUtil {
    public static void push() {
        GL11.glPushMatrix();
    }

    public static void pop() {
        GL11.glPopMatrix();
    }

    public static void enable(int enable) {
        GL11.glEnable(enable);
    }

    public static void disable(int disable) {
        GL11.glDisable(disable);
    }

    public static void begin(int mode) {
        GL11.glBegin(mode);
    }

    public static void end() {
        GL11.glEnd();
    }

    public static void vertex(double x, double y) {
        GL11.glVertex2d(x, y);
    }

    public static void vertex(float x, float y) {
        GL11.glVertex2f(x, y);
    }

    public static void vertex(int x, int y) {
        GL11.glVertex2i(x, y);
    }

    public static void blend(int one, int two) {
        GL11.glBlendFunc(one, two);
    }

    public static void color(Color color) {
        GlStateManager.color(
                color.getRed() / 255.0F,
                color.getGreen() / 255.0F,
                color.getBlue() / 255.0F,
                color.getAlpha() / 255.0F
        );
    }

    public static void start() {
        push();

        enable(GL_BLEND);

        blend(
                GL_SRC_ALPHA,
                GL_ONE_MINUS_SRC_ALPHA
        );

        GlStateManager.disableTexture2D();
        GlStateManager.disableCull();

        GlStateManager.disableAlpha();
        GlStateManager.disableDepth();
    }

    public static void stop() {
        GlStateManager.enableAlpha();
        GlStateManager.enableDepth();

        GlStateManager.enableCull();
        GlStateManager.enableTexture2D();

        disable(GL_BLEND);

        color(Color.WHITE);

        pop();
    }

    public static void rectangle(double x, double y, double width, double height, boolean filled, Color color) {
        start();

        if (color != null)
            color(color);

        begin(filled ? GL_TRIANGLE_FAN : GL_LINE_LOOP);

        {
            vertex(x, y);
            vertex(x + width, y);
            vertex(x + width, y + height);
            vertex(x, y + height);
        }

        end();
        stop();
    }

    public static void scale(float x, float y, float scale, Runnable runnable) {
        GlStateManager.pushMatrix();

        glTranslatef(x, y, 1);
        glScalef(scale, scale, 1);
        glTranslatef(-x, -y, 1);

        runnable.run();

        GlStateManager.popMatrix();
    }
}