--- /dev/null
+
+#include "canvas.h"
+
+/**
+ * @brief ピクセル値を書き込む。
+ * @details
+ * インターフェースでは、何にどのように書き込むかについて一切感知していない。
+ * この関数では、何にどのように書き込むかについて解決する。
+ *
+ * @param x X座標。
+ * @param y Y座標。
+ * @param r 赤。
+ * @param g 緑。
+ * @param b 青。
+ * @param extobj ユーザが指定した拡張オブジェクト。
+ */
+void canvas_pixel_writer(const int x, const int y, const uint8_t r, const uint8_t g, const uint8_t b, void *extobj)
+{
+ canvas_t *canvas = (canvas_t *)extobj;
+ bmpcol_t *buffer = canvas->buffer + (canvas->w * y) + x;
+ buffer->r = r;
+ buffer->g = g;
+ buffer->b = b;
+}
+
+/**
+ * @brief ピクセル値を読み込む。
+ * @details
+ * インターフェースでは、何からどのように読み込むかについて一切感知していない。
+ * この関数では、何からどのように読み込むかについて解決する。
+ *
+ * @param x X座標。
+ * @param y Y座標。
+ * @param r 赤。
+ * @param g 緑。
+ * @param b 青。
+ * @param extobj ユーザが指定した拡張オブジェクト。
+ */
+void canvas_pixel_reader(const int x, const int y, uint8_t *r, uint8_t *g, uint8_t *b, void *extobj)
+{
+ canvas_t *canvas = (canvas_t *)extobj;
+ bmpcol_t *buffer = canvas->buffer + (canvas->w * y) + x;
+ *r = buffer->r;
+ *g = buffer->g;
+ *b = buffer->b;
+}
+
+void canvas_drawer(const int px, const int py, bool on, void *extobj)
+{
+ canvas_t *canvas = (canvas_t *)extobj;
+ bmpcol_t *buffer = canvas->buffer + (canvas->w * py) + px;
+ buffer->r = on ? 255 : 16;
+ buffer->g = on ? 255 : 16;
+ buffer->b = on ? 255 : 16;
+}
+