source: mainline/uspace/srv/fb/ppm.c@ cc76be3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since cc76be3 was 5d4e90f0, checked in by Jakub Jermar <jakub@…>, 18 years ago

Header cleanup.
Move off_t, size_t and ssize_t into sys/types.h.
Get rid off the non-standard and dummy types.h.

  • Property mode set to 100644
File size: 3.6 KB
RevLine 
[90f5d64]1/*
[df4ed85]2 * Copyright (c) 2006 Ondrej Palkovsky
[90f5d64]3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[5d4e90f0]29#include <sys/types.h>
[90f5d64]30#include <errno.h>
31
32#include "ppm.h"
33
34static void skip_whitespace(unsigned char **data)
35{
36retry:
[5d4e90f0]37 while (**data == ' ' || **data == '\t' || **data == '\n' ||
38 **data == '\r')
[90f5d64]39 (*data)++;
40 if (**data == '#') {
41 while (1) {
42 if (**data == '\n' || **data == '\r')
43 break;
44 (*data)++;
45 }
46 goto retry;
47 }
48}
49
50static void read_num(unsigned char **data, unsigned int *num)
51{
52 *num = 0;
53 while (**data >= '0' && **data <= '9') {
54 *num *= 10;
55 *num += **data - '0';
56 (*data)++;
57 }
58}
59
[5d4e90f0]60int ppm_get_data(unsigned char *data, size_t dtsz, unsigned int *width,
61 unsigned int *height)
[a7d2d78]62{
63 /* Read magic */
64 if (data[0] != 'P' || data[1] != '6')
65 return EINVAL;
66
67 data+=2;
68 skip_whitespace(&data);
69 read_num(&data, width);
70 skip_whitespace(&data);
71 read_num(&data,height);
72
73 return 0;
74}
75
[90f5d64]76/** Draw PPM pixmap
77 *
78 * @param data Pointer to PPM data
79 * @param datasz Maximum data size
[096ba7a]80 * @param sx Coordinate of upper left corner
81 * @param sy Coordinate of upper left corner
[90f5d64]82 * @param maxwidth Maximum allowed width for picture
83 * @param maxheight Maximum allowed height for picture
84 * @param putpixel Putpixel function used to print bitmap
85 */
[5d4e90f0]86int ppm_draw(unsigned char *data, size_t datasz, unsigned int sx,
87 unsigned int sy, unsigned int maxwidth, unsigned int maxheight,
88 putpixel_cb_t putpixel, void *vport)
[90f5d64]89{
90 unsigned int width, height;
91 unsigned int maxcolor;
92 int i;
93 unsigned int color;
94 unsigned int coef;
95
96 /* Read magic */
97 if (data[0] != 'P' || data[1] != '6')
98 return EINVAL;
99
100 data+=2;
101 skip_whitespace(&data);
102 read_num(&data, &width);
103 skip_whitespace(&data);
104 read_num(&data,&height);
105 skip_whitespace(&data);
106 read_num(&data,&maxcolor);
107 data++;
108
[5d4e90f0]109 if (maxcolor == 0 || maxcolor > 255 || width * height > datasz) {
[90f5d64]110 return EINVAL;
111 }
[5d4e90f0]112 coef = 255 / maxcolor;
113 if (coef * maxcolor > 255)
[90f5d64]114 coef -= 1;
115
[5d4e90f0]116 for (i = 0; i < width * height; i++) {
[90f5d64]117 /* Crop picture if we don't fit into region */
[5d4e90f0]118 if (i % width > maxwidth || i / width > maxheight) {
[90f5d64]119 data += 3;
120 continue;
121 }
[5d4e90f0]122 color = ((data[0] * coef) << 16) + ((data[1] * coef) << 8) +
123 data[2] * coef;
[90f5d64]124
[5d4e90f0]125 (*putpixel)(vport, sx + (i % width), sy + (i / width), color);
[90f5d64]126 data += 3;
127 }
[153a209]128
129 return 0;
[90f5d64]130}
Note: See TracBrowser for help on using the repository browser.