4.2inch e-Paper HAT (C) made by WAVESHARE

Dependents:   ePD_4R2inch_test_program_on_nRF52

Committer:
kenjiArai
Date:
Wed Aug 28 23:35:01 2019 +0000
Revision:
1:b1aa1d6a96bc
Parent:
0:825022100d0f
for 4.2inch e-Paper

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:825022100d0f 1 /**
kenjiArai 0:825022100d0f 2 * @filename : epdpaint.cpp
kenjiArai 0:825022100d0f 3 * @brief : Paint tools
kenjiArai 0:825022100d0f 4 * @author : Yehui from Waveshare
kenjiArai 0:825022100d0f 5 *
kenjiArai 0:825022100d0f 6 * Copyright (C) Waveshare September 9 2017
kenjiArai 0:825022100d0f 7 *
kenjiArai 0:825022100d0f 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
kenjiArai 0:825022100d0f 9 * of this software and associated documnetation files (the "Software"), to deal
kenjiArai 0:825022100d0f 10 * in the Software without restriction, including without limitation the rights
kenjiArai 0:825022100d0f 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kenjiArai 0:825022100d0f 12 * copies of the Software, and to permit persons to whom the Software is
kenjiArai 0:825022100d0f 13 * furished to do so, subject to the following conditions:
kenjiArai 0:825022100d0f 14 *
kenjiArai 0:825022100d0f 15 * The above copyright notice and this permission notice shall be included in
kenjiArai 0:825022100d0f 16 * all copies or substantial portions of the Software.
kenjiArai 0:825022100d0f 17 *
kenjiArai 0:825022100d0f 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kenjiArai 0:825022100d0f 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kenjiArai 0:825022100d0f 20 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kenjiArai 0:825022100d0f 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kenjiArai 0:825022100d0f 22 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:825022100d0f 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
kenjiArai 0:825022100d0f 24 * THE SOFTWARE.
kenjiArai 0:825022100d0f 25 */
kenjiArai 0:825022100d0f 26
kenjiArai 0:825022100d0f 27 //#include <avr/pgmspace.h> by JH1PJL for mbed-os5 Apr.28,2019
kenjiArai 0:825022100d0f 28 #include "epdpaint.h"
kenjiArai 0:825022100d0f 29
kenjiArai 0:825022100d0f 30 Paint::Paint(unsigned char* image, int width, int height)
kenjiArai 0:825022100d0f 31 {
kenjiArai 0:825022100d0f 32 this->rotate = ROTATE_0;
kenjiArai 0:825022100d0f 33 this->image = image;
kenjiArai 0:825022100d0f 34 /* 1 byte = 8 pixels, so the width should be the multiple of 8 */
kenjiArai 0:825022100d0f 35 this->width = width % 8 ? width + 8 - (width % 8) : width;
kenjiArai 0:825022100d0f 36 this->height = height;
kenjiArai 0:825022100d0f 37 }
kenjiArai 0:825022100d0f 38
kenjiArai 0:825022100d0f 39 Paint::~Paint()
kenjiArai 0:825022100d0f 40 {
kenjiArai 0:825022100d0f 41 }
kenjiArai 0:825022100d0f 42
kenjiArai 0:825022100d0f 43 /**
kenjiArai 0:825022100d0f 44 * @brief: clear the image
kenjiArai 0:825022100d0f 45 */
kenjiArai 0:825022100d0f 46 void Paint::Clear(int colored)
kenjiArai 0:825022100d0f 47 {
kenjiArai 0:825022100d0f 48 for (int x = 0; x < this->width; x++) {
kenjiArai 0:825022100d0f 49 for (int y = 0; y < this->height; y++) {
kenjiArai 0:825022100d0f 50 DrawAbsolutePixel(x, y, colored);
kenjiArai 0:825022100d0f 51 }
kenjiArai 0:825022100d0f 52 }
kenjiArai 0:825022100d0f 53 }
kenjiArai 0:825022100d0f 54
kenjiArai 0:825022100d0f 55 /**
kenjiArai 0:825022100d0f 56 * @brief: this draws a pixel by absolute coordinates.
kenjiArai 0:825022100d0f 57 * this function won't be affected by the rotate parameter.
kenjiArai 0:825022100d0f 58 */
kenjiArai 0:825022100d0f 59 void Paint::DrawAbsolutePixel(int x, int y, int colored)
kenjiArai 0:825022100d0f 60 {
kenjiArai 0:825022100d0f 61 if (x < 0 || x >= this->width || y < 0 || y >= this->height) {
kenjiArai 0:825022100d0f 62 return;
kenjiArai 0:825022100d0f 63 }
kenjiArai 0:825022100d0f 64 if (IF_INVERT_COLOR) {
kenjiArai 0:825022100d0f 65 if (colored) {
kenjiArai 0:825022100d0f 66 image[(x + y * this->width) / 8] |= 0x80 >> (x % 8);
kenjiArai 0:825022100d0f 67 } else {
kenjiArai 0:825022100d0f 68 image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8));
kenjiArai 0:825022100d0f 69 }
kenjiArai 0:825022100d0f 70 } else {
kenjiArai 0:825022100d0f 71 if (colored) {
kenjiArai 0:825022100d0f 72 image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8));
kenjiArai 0:825022100d0f 73 } else {
kenjiArai 0:825022100d0f 74 image[(x + y * this->width) / 8] |= 0x80 >> (x % 8);
kenjiArai 0:825022100d0f 75 }
kenjiArai 0:825022100d0f 76 }
kenjiArai 0:825022100d0f 77 }
kenjiArai 0:825022100d0f 78
kenjiArai 0:825022100d0f 79 /**
kenjiArai 0:825022100d0f 80 * @brief: Getters and Setters
kenjiArai 0:825022100d0f 81 */
kenjiArai 0:825022100d0f 82 unsigned char* Paint::GetImage(void)
kenjiArai 0:825022100d0f 83 {
kenjiArai 0:825022100d0f 84 return this->image;
kenjiArai 0:825022100d0f 85 }
kenjiArai 0:825022100d0f 86
kenjiArai 0:825022100d0f 87 int Paint::GetWidth(void)
kenjiArai 0:825022100d0f 88 {
kenjiArai 0:825022100d0f 89 return this->width;
kenjiArai 0:825022100d0f 90 }
kenjiArai 0:825022100d0f 91
kenjiArai 0:825022100d0f 92 void Paint::SetWidth(int width)
kenjiArai 0:825022100d0f 93 {
kenjiArai 0:825022100d0f 94 this->width = width % 8 ? width + 8 - (width % 8) : width;
kenjiArai 0:825022100d0f 95 }
kenjiArai 0:825022100d0f 96
kenjiArai 0:825022100d0f 97 int Paint::GetHeight(void)
kenjiArai 0:825022100d0f 98 {
kenjiArai 0:825022100d0f 99 return this->height;
kenjiArai 0:825022100d0f 100 }
kenjiArai 0:825022100d0f 101
kenjiArai 0:825022100d0f 102 void Paint::SetHeight(int height)
kenjiArai 0:825022100d0f 103 {
kenjiArai 0:825022100d0f 104 this->height = height;
kenjiArai 0:825022100d0f 105 }
kenjiArai 0:825022100d0f 106
kenjiArai 0:825022100d0f 107 int Paint::GetRotate(void)
kenjiArai 0:825022100d0f 108 {
kenjiArai 0:825022100d0f 109 return this->rotate;
kenjiArai 0:825022100d0f 110 }
kenjiArai 0:825022100d0f 111
kenjiArai 0:825022100d0f 112 void Paint::SetRotate(int rotate)
kenjiArai 0:825022100d0f 113 {
kenjiArai 0:825022100d0f 114 this->rotate = rotate;
kenjiArai 0:825022100d0f 115 }
kenjiArai 0:825022100d0f 116
kenjiArai 0:825022100d0f 117 /**
kenjiArai 0:825022100d0f 118 * @brief: this draws a pixel by the coordinates
kenjiArai 0:825022100d0f 119 */
kenjiArai 0:825022100d0f 120 void Paint::DrawPixel(int x, int y, int colored)
kenjiArai 0:825022100d0f 121 {
kenjiArai 0:825022100d0f 122 int point_temp;
kenjiArai 0:825022100d0f 123 if (this->rotate == ROTATE_0) {
kenjiArai 0:825022100d0f 124 if(x < 0 || x >= this->width || y < 0 || y >= this->height) {
kenjiArai 0:825022100d0f 125 return;
kenjiArai 0:825022100d0f 126 }
kenjiArai 0:825022100d0f 127 DrawAbsolutePixel(x, y, colored);
kenjiArai 0:825022100d0f 128 } else if (this->rotate == ROTATE_90) {
kenjiArai 0:825022100d0f 129 if(x < 0 || x >= this->height || y < 0 || y >= this->width) {
kenjiArai 0:825022100d0f 130 return;
kenjiArai 0:825022100d0f 131 }
kenjiArai 0:825022100d0f 132 point_temp = x;
kenjiArai 0:825022100d0f 133 x = this->width - y;
kenjiArai 0:825022100d0f 134 y = point_temp;
kenjiArai 0:825022100d0f 135 DrawAbsolutePixel(x, y, colored);
kenjiArai 0:825022100d0f 136 } else if (this->rotate == ROTATE_180) {
kenjiArai 0:825022100d0f 137 if(x < 0 || x >= this->width || y < 0 || y >= this->height) {
kenjiArai 0:825022100d0f 138 return;
kenjiArai 0:825022100d0f 139 }
kenjiArai 0:825022100d0f 140 x = this->width - x;
kenjiArai 0:825022100d0f 141 y = this->height - y;
kenjiArai 0:825022100d0f 142 DrawAbsolutePixel(x, y, colored);
kenjiArai 0:825022100d0f 143 } else if (this->rotate == ROTATE_270) {
kenjiArai 0:825022100d0f 144 if(x < 0 || x >= this->height || y < 0 || y >= this->width) {
kenjiArai 0:825022100d0f 145 return;
kenjiArai 0:825022100d0f 146 }
kenjiArai 0:825022100d0f 147 point_temp = x;
kenjiArai 0:825022100d0f 148 x = y;
kenjiArai 0:825022100d0f 149 y = this->height - point_temp;
kenjiArai 0:825022100d0f 150 DrawAbsolutePixel(x, y, colored);
kenjiArai 0:825022100d0f 151 }
kenjiArai 0:825022100d0f 152 }
kenjiArai 0:825022100d0f 153
kenjiArai 0:825022100d0f 154 /**
kenjiArai 0:825022100d0f 155 * @brief: this draws a charactor on the frame buffer but not refresh
kenjiArai 0:825022100d0f 156 */
kenjiArai 0:825022100d0f 157 void Paint::DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored)
kenjiArai 0:825022100d0f 158 {
kenjiArai 0:825022100d0f 159 int i, j;
kenjiArai 0:825022100d0f 160 unsigned int char_offset = (ascii_char - ' ') * font->Height * (font->Width / 8 + (font->Width % 8 ? 1 : 0));
kenjiArai 0:825022100d0f 161 const unsigned char* ptr = &font->table[char_offset];
kenjiArai 0:825022100d0f 162
kenjiArai 0:825022100d0f 163 for (j = 0; j < font->Height; j++) {
kenjiArai 0:825022100d0f 164 for (i = 0; i < font->Width; i++) {
kenjiArai 0:825022100d0f 165 if (*ptr & (0x80 >> (i % 8))) {
kenjiArai 0:825022100d0f 166 DrawPixel(x + i, y + j, colored);
kenjiArai 0:825022100d0f 167 }
kenjiArai 0:825022100d0f 168 if (i % 8 == 7) {
kenjiArai 0:825022100d0f 169 ptr++;
kenjiArai 0:825022100d0f 170 }
kenjiArai 0:825022100d0f 171 }
kenjiArai 0:825022100d0f 172 if (font->Width % 8 != 0) {
kenjiArai 0:825022100d0f 173 ptr++;
kenjiArai 0:825022100d0f 174 }
kenjiArai 0:825022100d0f 175 }
kenjiArai 0:825022100d0f 176 }
kenjiArai 0:825022100d0f 177
kenjiArai 0:825022100d0f 178 /**
kenjiArai 0:825022100d0f 179 * @brief: this displays a string on the frame buffer but not refresh
kenjiArai 0:825022100d0f 180 */
kenjiArai 0:825022100d0f 181 void Paint::DrawStringAt(int x, int y, const char* text, sFONT* font, int colored)
kenjiArai 0:825022100d0f 182 {
kenjiArai 0:825022100d0f 183 const char* p_text = text;
kenjiArai 0:825022100d0f 184 unsigned int counter = 0;
kenjiArai 0:825022100d0f 185 int refcolumn = x;
kenjiArai 0:825022100d0f 186
kenjiArai 0:825022100d0f 187 /* Send the string character by character on EPD */
kenjiArai 0:825022100d0f 188 while (*p_text != 0) {
kenjiArai 0:825022100d0f 189 /* Display one character on EPD */
kenjiArai 0:825022100d0f 190 DrawCharAt(refcolumn, y, *p_text, font, colored);
kenjiArai 0:825022100d0f 191 /* Decrement the column position by 16 */
kenjiArai 0:825022100d0f 192 refcolumn += font->Width;
kenjiArai 0:825022100d0f 193 /* Point on the next character */
kenjiArai 0:825022100d0f 194 p_text++;
kenjiArai 0:825022100d0f 195 counter++;
kenjiArai 0:825022100d0f 196 }
kenjiArai 0:825022100d0f 197 }
kenjiArai 0:825022100d0f 198
kenjiArai 0:825022100d0f 199 /**
kenjiArai 0:825022100d0f 200 * @brief: this draws a line on the frame buffer
kenjiArai 0:825022100d0f 201 */
kenjiArai 0:825022100d0f 202 void Paint::DrawLine(int x0, int y0, int x1, int y1, int colored)
kenjiArai 0:825022100d0f 203 {
kenjiArai 0:825022100d0f 204 /* Bresenham algorithm */
kenjiArai 0:825022100d0f 205 int dx = x1 - x0 >= 0 ? x1 - x0 : x0 - x1;
kenjiArai 0:825022100d0f 206 int sx = x0 < x1 ? 1 : -1;
kenjiArai 0:825022100d0f 207 int dy = y1 - y0 <= 0 ? y1 - y0 : y0 - y1;
kenjiArai 0:825022100d0f 208 int sy = y0 < y1 ? 1 : -1;
kenjiArai 0:825022100d0f 209 int err = dx + dy;
kenjiArai 0:825022100d0f 210
kenjiArai 0:825022100d0f 211 while((x0 != x1) && (y0 != y1)) {
kenjiArai 0:825022100d0f 212 DrawPixel(x0, y0, colored);
kenjiArai 0:825022100d0f 213 if (2 * err >= dy) {
kenjiArai 0:825022100d0f 214 err += dy;
kenjiArai 0:825022100d0f 215 x0 += sx;
kenjiArai 0:825022100d0f 216 }
kenjiArai 0:825022100d0f 217 if (2 * err <= dx) {
kenjiArai 0:825022100d0f 218 err += dx;
kenjiArai 0:825022100d0f 219 y0 += sy;
kenjiArai 0:825022100d0f 220 }
kenjiArai 0:825022100d0f 221 }
kenjiArai 0:825022100d0f 222 }
kenjiArai 0:825022100d0f 223
kenjiArai 0:825022100d0f 224 /**
kenjiArai 0:825022100d0f 225 * @brief: this draws a horizontal line on the frame buffer
kenjiArai 0:825022100d0f 226 */
kenjiArai 0:825022100d0f 227 void Paint::DrawHorizontalLine(int x, int y, int line_width, int colored)
kenjiArai 0:825022100d0f 228 {
kenjiArai 0:825022100d0f 229 int i;
kenjiArai 0:825022100d0f 230 for (i = x; i < x + line_width; i++) {
kenjiArai 0:825022100d0f 231 DrawPixel(i, y, colored);
kenjiArai 0:825022100d0f 232 }
kenjiArai 0:825022100d0f 233 }
kenjiArai 0:825022100d0f 234
kenjiArai 0:825022100d0f 235 /**
kenjiArai 0:825022100d0f 236 * @brief: this draws a vertical line on the frame buffer
kenjiArai 0:825022100d0f 237 */
kenjiArai 0:825022100d0f 238 void Paint::DrawVerticalLine(int x, int y, int line_height, int colored)
kenjiArai 0:825022100d0f 239 {
kenjiArai 0:825022100d0f 240 int i;
kenjiArai 0:825022100d0f 241 for (i = y; i < y + line_height; i++) {
kenjiArai 0:825022100d0f 242 DrawPixel(x, i, colored);
kenjiArai 0:825022100d0f 243 }
kenjiArai 0:825022100d0f 244 }
kenjiArai 0:825022100d0f 245
kenjiArai 0:825022100d0f 246 /**
kenjiArai 0:825022100d0f 247 * @brief: this draws a rectangle
kenjiArai 0:825022100d0f 248 */
kenjiArai 0:825022100d0f 249 void Paint::DrawRectangle(int x0, int y0, int x1, int y1, int colored)
kenjiArai 0:825022100d0f 250 {
kenjiArai 0:825022100d0f 251 int min_x, min_y, max_x, max_y;
kenjiArai 0:825022100d0f 252 min_x = x1 > x0 ? x0 : x1;
kenjiArai 0:825022100d0f 253 max_x = x1 > x0 ? x1 : x0;
kenjiArai 0:825022100d0f 254 min_y = y1 > y0 ? y0 : y1;
kenjiArai 0:825022100d0f 255 max_y = y1 > y0 ? y1 : y0;
kenjiArai 0:825022100d0f 256
kenjiArai 0:825022100d0f 257 DrawHorizontalLine(min_x, min_y, max_x - min_x + 1, colored);
kenjiArai 0:825022100d0f 258 DrawHorizontalLine(min_x, max_y, max_x - min_x + 1, colored);
kenjiArai 0:825022100d0f 259 DrawVerticalLine(min_x, min_y, max_y - min_y + 1, colored);
kenjiArai 0:825022100d0f 260 DrawVerticalLine(max_x, min_y, max_y - min_y + 1, colored);
kenjiArai 0:825022100d0f 261 }
kenjiArai 0:825022100d0f 262
kenjiArai 0:825022100d0f 263 /**
kenjiArai 0:825022100d0f 264 * @brief: this draws a filled rectangle
kenjiArai 0:825022100d0f 265 */
kenjiArai 0:825022100d0f 266 void Paint::DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored)
kenjiArai 0:825022100d0f 267 {
kenjiArai 0:825022100d0f 268 int min_x, min_y, max_x, max_y;
kenjiArai 0:825022100d0f 269 int i;
kenjiArai 0:825022100d0f 270 min_x = x1 > x0 ? x0 : x1;
kenjiArai 0:825022100d0f 271 max_x = x1 > x0 ? x1 : x0;
kenjiArai 0:825022100d0f 272 min_y = y1 > y0 ? y0 : y1;
kenjiArai 0:825022100d0f 273 max_y = y1 > y0 ? y1 : y0;
kenjiArai 0:825022100d0f 274
kenjiArai 0:825022100d0f 275 for (i = min_x; i <= max_x; i++) {
kenjiArai 0:825022100d0f 276 DrawVerticalLine(i, min_y, max_y - min_y + 1, colored);
kenjiArai 0:825022100d0f 277 }
kenjiArai 0:825022100d0f 278 }
kenjiArai 0:825022100d0f 279
kenjiArai 0:825022100d0f 280 /**
kenjiArai 0:825022100d0f 281 * @brief: this draws a circle
kenjiArai 0:825022100d0f 282 */
kenjiArai 0:825022100d0f 283 void Paint::DrawCircle(int x, int y, int radius, int colored)
kenjiArai 0:825022100d0f 284 {
kenjiArai 0:825022100d0f 285 /* Bresenham algorithm */
kenjiArai 0:825022100d0f 286 int x_pos = -radius;
kenjiArai 0:825022100d0f 287 int y_pos = 0;
kenjiArai 0:825022100d0f 288 int err = 2 - 2 * radius;
kenjiArai 0:825022100d0f 289 int e2;
kenjiArai 0:825022100d0f 290
kenjiArai 0:825022100d0f 291 do {
kenjiArai 0:825022100d0f 292 DrawPixel(x - x_pos, y + y_pos, colored);
kenjiArai 0:825022100d0f 293 DrawPixel(x + x_pos, y + y_pos, colored);
kenjiArai 0:825022100d0f 294 DrawPixel(x + x_pos, y - y_pos, colored);
kenjiArai 0:825022100d0f 295 DrawPixel(x - x_pos, y - y_pos, colored);
kenjiArai 0:825022100d0f 296 e2 = err;
kenjiArai 0:825022100d0f 297 if (e2 <= y_pos) {
kenjiArai 0:825022100d0f 298 err += ++y_pos * 2 + 1;
kenjiArai 0:825022100d0f 299 if(-x_pos == y_pos && e2 <= x_pos) {
kenjiArai 0:825022100d0f 300 e2 = 0;
kenjiArai 0:825022100d0f 301 }
kenjiArai 0:825022100d0f 302 }
kenjiArai 0:825022100d0f 303 if (e2 > x_pos) {
kenjiArai 0:825022100d0f 304 err += ++x_pos * 2 + 1;
kenjiArai 0:825022100d0f 305 }
kenjiArai 0:825022100d0f 306 } while (x_pos <= 0);
kenjiArai 0:825022100d0f 307 }
kenjiArai 0:825022100d0f 308
kenjiArai 0:825022100d0f 309 /**
kenjiArai 0:825022100d0f 310 * @brief: this draws a filled circle
kenjiArai 0:825022100d0f 311 */
kenjiArai 0:825022100d0f 312 void Paint::DrawFilledCircle(int x, int y, int radius, int colored)
kenjiArai 0:825022100d0f 313 {
kenjiArai 0:825022100d0f 314 /* Bresenham algorithm */
kenjiArai 0:825022100d0f 315 int x_pos = -radius;
kenjiArai 0:825022100d0f 316 int y_pos = 0;
kenjiArai 0:825022100d0f 317 int err = 2 - 2 * radius;
kenjiArai 0:825022100d0f 318 int e2;
kenjiArai 0:825022100d0f 319
kenjiArai 0:825022100d0f 320 do {
kenjiArai 0:825022100d0f 321 DrawPixel(x - x_pos, y + y_pos, colored);
kenjiArai 0:825022100d0f 322 DrawPixel(x + x_pos, y + y_pos, colored);
kenjiArai 0:825022100d0f 323 DrawPixel(x + x_pos, y - y_pos, colored);
kenjiArai 0:825022100d0f 324 DrawPixel(x - x_pos, y - y_pos, colored);
kenjiArai 0:825022100d0f 325 DrawHorizontalLine(x + x_pos, y + y_pos, 2 * (-x_pos) + 1, colored);
kenjiArai 0:825022100d0f 326 DrawHorizontalLine(x + x_pos, y - y_pos, 2 * (-x_pos) + 1, colored);
kenjiArai 0:825022100d0f 327 e2 = err;
kenjiArai 0:825022100d0f 328 if (e2 <= y_pos) {
kenjiArai 0:825022100d0f 329 err += ++y_pos * 2 + 1;
kenjiArai 0:825022100d0f 330 if(-x_pos == y_pos && e2 <= x_pos) {
kenjiArai 0:825022100d0f 331 e2 = 0;
kenjiArai 0:825022100d0f 332 }
kenjiArai 0:825022100d0f 333 }
kenjiArai 0:825022100d0f 334 if(e2 > x_pos) {
kenjiArai 0:825022100d0f 335 err += ++x_pos * 2 + 1;
kenjiArai 0:825022100d0f 336 }
kenjiArai 0:825022100d0f 337 } while(x_pos <= 0);
kenjiArai 0:825022100d0f 338 }
kenjiArai 0:825022100d0f 339
kenjiArai 0:825022100d0f 340 /* END OF FILE */
kenjiArai 0:825022100d0f 341
kenjiArai 0:825022100d0f 342
kenjiArai 0:825022100d0f 343
kenjiArai 0:825022100d0f 344
kenjiArai 0:825022100d0f 345
kenjiArai 0:825022100d0f 346
kenjiArai 0:825022100d0f 347
kenjiArai 0:825022100d0f 348
kenjiArai 0:825022100d0f 349
kenjiArai 0:825022100d0f 350
kenjiArai 0:825022100d0f 351
kenjiArai 0:825022100d0f 352
kenjiArai 0:825022100d0f 353
kenjiArai 0:825022100d0f 354
kenjiArai 0:825022100d0f 355
kenjiArai 0:825022100d0f 356
kenjiArai 0:825022100d0f 357
kenjiArai 0:825022100d0f 358
kenjiArai 0:825022100d0f 359
kenjiArai 0:825022100d0f 360
kenjiArai 0:825022100d0f 361
kenjiArai 0:825022100d0f 362
kenjiArai 0:825022100d0f 363