Chapter 10: Mastering Shapes, Paths, Colors, Text, and Images with Cairo in

Chapter 10: Mastering Shapes, Paths, Colors, Text, and Images with Cairo in Vala and GTK 3.0+

10.1 Introduction

This chapter delves into the artistic aspects of programming by exploring how to implement shapes, paths, colors, gradients, text rendering, and image manipulation using Cairo in a Vala and GTK 3.0+ environment. We'll cover each of these elements with practical examples, giving you the tools to enhance your applications with rich graphics.


10.2 Setting Up the Environment

First, ensure you have Cairo and GTK+ 3.0 installed:

sudo apt-get install libcairo2-dev libgtk-3-dev

Create a basic Vala application with a GTK window and a drawing area. This setup will serve as the canvas for all our graphics work.

10.3 Drawing Shapes and Paths

Shapes and paths are fundamental in graphics. Cairo provides various functions to draw common shapes and create custom paths.

10.4 Utilizing Colors and Gradients

Colors and gradients add depth and aesthetics to graphics. Cairo allows for linear and radial gradients in addition to solid colors.

10.5 Rendering Text

Text rendering is crucial for displaying data, labels, or decorative elements. Cairo provides functionality to render text in various fonts and styles.

10.6 Loading and Rendering Images

Cairo can also work with images, allowing you to load and render them within your application.

ValaCourse.vala: The main application file.

class ValaCourseWindow : Gtk.Window {

    construct {

        this.title = "Vala Course";

        this.set_default_size(400, 400);

        this.set_position(Gtk.WindowPosition.CENTER);


        this.add_events(Gdk.EventMask.BUTTON_PRESS_MASK);


        this.draw.connect((widget, cr) => {

            drawrectangle(widget, cr);

            drawcolors(widget, cr);

            drawtext(widget, cr);

            drawimage(widget, cr);

            return true;

        });


        this.destroy.connect(Gtk.main_quit);

    }


    private bool drawrectangle(Gtk.Widget widget, Cairo.Context cr) {

        // Rectangle

        cr.rectangle(10, 10, 100, 100);

        cr.set_source_rgb(0, 1, 0); // Green color

        cr.fill();


        // Custom Path

        cr.move_to(150, 10);

        cr.line_to(200, 50);

        cr.line_to(150, 100);

        cr.close_path();

        cr.set_source_rgb(0, 0, 1); // Blue color

        cr.stroke();


        return true;

    }


    private bool drawcolors(Gtk.Widget widget, Cairo.Context cr) {

        var pat = new Cairo.Pattern.linear(0, 0, 200, 200);

        pat.add_color_stop_rgb(0, 1, 1, 0); // Yellow

        pat.add_color_stop_rgb(1, 0, 0, 1); // Blue

        cr.rectangle(10, 120, 100, 100);

        cr.set_source(pat);

        cr.fill();

        return true;

    }


    private bool drawtext(Gtk.Widget widget, Cairo.Context cr) {

        cr.set_source_rgb(0, 0, 0);

        cr.select_font_face("Sans", Cairo.FontSlant.NORMAL, Cairo.FontWeight.BOLD);

        cr.set_font_size(20);

        cr.move_to(10, 200);

        cr.show_text("Hello, Cairo!");

        return true;

    }


    private bool drawimage(Gtk.Widget widget, Cairo.Context cr) {

        var surface = new Cairo.ImageSurface.from_png("/home/ken/Pictures/Allie.png");

        cr.set_source_surface(surface, 10, 220);

        cr.paint();

        return true;

    }

}


int main(string[] args) {

    Gtk.init(ref args);

    var win = new ValaCourseWindow();

    win.show_all();

    Gtk.main();

    return 0;

}

Compile String:

In Terminal type to compile:

valac -X -w -g ValaCourse.vala --pkg gtk+-3.0

Run the App

In Terminal type:

./ValaCourse


10.7 Combining Elements

In a practical scenario, you'll often combine various elements like shapes, text, and images. Experiment with layering these elements to create complex graphics.


10.8 Best Practices

Resource Management: Always manage your resources carefully, particularly with images and patterns.

Performance Considerations: Be mindful of the performance impact when rendering complex scenes or large images.

10.9 Conclusion

This chapter has provided you with the foundational skills to create visually rich and interactive graphics using Cairo in Vala and GTK 3.0+. By mastering these techniques, you can significantly enhance the user interface and experience of your applications.


Through practical examples and step-by-step instructions, this chapter empowers readers to confidently create and manipulate a variety of graphic elements, paving the way for the development of visually engaging and professional-looking applications in Vala and GTK 3.0+.