/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* $Id$ */

package org.apache.fop.apps;

import org.apache.fop.apps.FopConfBuilder.RendererConfBuilder;

import static org.apache.fop.render.bitmap.BitmapRendererOption.ANTI_ALIASING;
import static org.apache.fop.render.bitmap.BitmapRendererOption.BACKGROUND_COLOR;
import static org.apache.fop.render.bitmap.BitmapRendererOption.COLOR_MODE;
import static org.apache.fop.render.bitmap.BitmapRendererOption.JAVA2D_TRANSPARENT_PAGE_BACKGROUND;
import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_QUALITY_ELEMENT;

public class BitmapRendererConfBuilder extends RendererConfBuilder {

    protected BitmapRendererConfBuilder(String mimeType) {
        super(mimeType);
    }

    protected BitmapRendererConfBuilder() {
        super(getMimeType());
    }

    public BitmapRendererConfBuilder setPageBackgroundTransparency(boolean isTransparent) {
        createTextElement(JAVA2D_TRANSPARENT_PAGE_BACKGROUND, String.valueOf(isTransparent));
        return this;
    }

    public BitmapRendererConfBuilder setBackgroundColor(String color) {
        createTextElement(BACKGROUND_COLOR, color);
        return this;
    }

    public BitmapRendererConfBuilder setAntiAliasing(boolean antiAlias) {
        createTextElement(ANTI_ALIASING, String.valueOf(antiAlias));
        return this;
    }

    public BitmapRendererConfBuilder setRenderingQuality(String quality) {
        createTextElement(RENDERING_QUALITY_ELEMENT, quality);
        return this;
    }

    public BitmapRendererConfBuilder setColorMode(String colorMode) {
        createTextElement(COLOR_MODE, colorMode);
        return this;
    }

    public static String getMimeType() {
        return "Bitmap";
    }
}
