PPM translator: read 1-bit and greyscale files
Change-Id: I0d9de6cb6eca99a78aada00c5299c16668c414f8 Reviewed-on: https://review.haiku-os.org/c/905 Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
5d57984ba5
commit
58913f60e8
@@ -672,6 +672,8 @@ read_ppm_header(BDataIO* inSource, int* width, int* rowbytes, int* height,
|
|||||||
{
|
{
|
||||||
/* check for PPM magic number */
|
/* check for PPM magic number */
|
||||||
char ch[2];
|
char ch[2];
|
||||||
|
bool monochrome = false;
|
||||||
|
bool greyscale = false;
|
||||||
if (inSource->Read(ch, 2) != 2) {
|
if (inSource->Read(ch, 2) != 2) {
|
||||||
return B_NO_TRANSLATOR;
|
return B_NO_TRANSLATOR;
|
||||||
}
|
}
|
||||||
@@ -686,13 +688,19 @@ read_ppm_header(BDataIO* inSource, int* width, int* rowbytes, int* height,
|
|||||||
return B_NO_TRANSLATOR;
|
return B_NO_TRANSLATOR;
|
||||||
}
|
}
|
||||||
*is_ppm = true;
|
*is_ppm = true;
|
||||||
if (ch[1] == '6') {
|
if (ch[1] == '6' || ch[1] == '5' || ch[1] == '4') {
|
||||||
*ascii = false;
|
*ascii = false;
|
||||||
} else if (ch[1] == '3') {
|
} else if (ch[1] == '3' || ch[1] == '2' || ch[1] == '1') {
|
||||||
*ascii = true;
|
*ascii = true;
|
||||||
} else {
|
} else {
|
||||||
return B_NO_TRANSLATOR;
|
return B_NO_TRANSLATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ch[1] == '4' || ch[1] == '1')
|
||||||
|
monochrome = true;
|
||||||
|
else if (ch[1] == '5' || ch[1] == '2')
|
||||||
|
greyscale = true;
|
||||||
|
|
||||||
// status_t err = B_NO_TRANSLATOR;
|
// status_t err = B_NO_TRANSLATOR;
|
||||||
enum scan_state {
|
enum scan_state {
|
||||||
scan_width,
|
scan_width,
|
||||||
@@ -703,7 +711,12 @@ read_ppm_header(BDataIO* inSource, int* width, int* rowbytes, int* height,
|
|||||||
= scan_width;
|
= scan_width;
|
||||||
int* scan = NULL;
|
int* scan = NULL;
|
||||||
bool in_comment = false;
|
bool in_comment = false;
|
||||||
*space = B_RGB24_BIG;
|
if (monochrome)
|
||||||
|
*space = B_GRAY1;
|
||||||
|
else if (greyscale)
|
||||||
|
*space = B_GRAY8;
|
||||||
|
else
|
||||||
|
*space = B_RGB24_BIG;
|
||||||
/* The description of PPM is slightly ambiguous as far as comments */
|
/* The description of PPM is slightly ambiguous as far as comments */
|
||||||
/* go. We choose to allow comments anywhere, in the spirit of laxness. */
|
/* go. We choose to allow comments anywhere, in the spirit of laxness. */
|
||||||
/* See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/PPM.txt */
|
/* See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/PPM.txt */
|
||||||
@@ -739,7 +752,12 @@ read_ppm_header(BDataIO* inSource, int* width, int* rowbytes, int* height,
|
|||||||
scan = width;
|
scan = width;
|
||||||
break;
|
break;
|
||||||
case scan_height:
|
case scan_height:
|
||||||
*rowbytes = *width * 3;
|
if (monochrome)
|
||||||
|
*rowbytes = (*width + 7) / 8;
|
||||||
|
else if (greyscale)
|
||||||
|
*rowbytes = *width;
|
||||||
|
else
|
||||||
|
*rowbytes = *width * 3;
|
||||||
scan = height;
|
scan = height;
|
||||||
break;
|
break;
|
||||||
case scan_max:
|
case scan_max:
|
||||||
@@ -755,7 +773,15 @@ read_ppm_header(BDataIO* inSource, int* width, int* rowbytes, int* height,
|
|||||||
if (scan) { /* are we done with one value? */
|
if (scan) { /* are we done with one value? */
|
||||||
scan = NULL;
|
scan = NULL;
|
||||||
state = (enum scan_state)(state + 1);
|
state = (enum scan_state)(state + 1);
|
||||||
|
|
||||||
|
/* in monochrome ppm, there is no max in the file, so we
|
||||||
|
* skip that step. */
|
||||||
|
if ((state == scan_max) && monochrome) {
|
||||||
|
state = (enum scan_state)(state + 1);
|
||||||
|
*max = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == scan_white) { /* we only ever read one whitespace,
|
if (state == scan_white) { /* we only ever read one whitespace,
|
||||||
since we skip space */
|
since we skip space */
|
||||||
return B_OK; /* when reading ASCII, and there is a single
|
return B_OK; /* when reading ASCII, and there is a single
|
||||||
@@ -968,7 +994,7 @@ copy_data(BDataIO* in, BDataIO* out, int rowbytes, int out_rowbytes, int height,
|
|||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
unsigned char* scale = NULL;
|
unsigned char* scale = NULL;
|
||||||
if (max != 255) {
|
if (max != 255 && in_space != B_GRAY1) {
|
||||||
scale = make_scale_data(max);
|
scale = make_scale_data(max);
|
||||||
}
|
}
|
||||||
status_t err = B_OK;
|
status_t err = B_OK;
|
||||||
@@ -983,6 +1009,7 @@ copy_data(BDataIO* in, BDataIO* out, int rowbytes, int out_rowbytes, int height,
|
|||||||
}
|
}
|
||||||
if (scale) { /* for reading PPM that is smaller than 8 bit */
|
if (scale) { /* for reading PPM that is smaller than 8 bit */
|
||||||
scale_data(scale, data, rowbytes);
|
scale_data(scale, data, rowbytes);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (err == B_OK) {
|
if (err == B_OK) {
|
||||||
|
|||||||
@@ -16,25 +16,10 @@
|
|||||||
#include "colorspace.h"
|
#include "colorspace.h"
|
||||||
|
|
||||||
|
|
||||||
#if !defined(_PR3_COMPATIBLE_)
|
/* expands to BGRA in the output buffer from <whatever> in the input buffer */
|
||||||
#define B_CMY24 \
|
|
||||||
((color_space) 0xC001) /* C[7:0] M[7:0] Y[7:0] No gray removal \
|
|
||||||
done */
|
|
||||||
#define B_CMY32 \
|
|
||||||
((color_space) 0xC002) /* C[7:0] M[7:0] Y[7:0] X[7:0] No gray removal \
|
|
||||||
done */
|
|
||||||
#define B_CMYA32 \
|
|
||||||
((color_space) 0xE002) /* C[7:0] M[7:0] Y[7:0] A[7:0] No gray removal \
|
|
||||||
done */
|
|
||||||
#define B_CMYK32 \
|
|
||||||
((color_space) 0xC003) /* C[7:0] M[7:0] Y[7:0] K[7:0] */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
int
|
||||||
expand_data(/* expands to BGRA in the output buffer from <whatever> in the input
|
expand_data(color_space from_space, unsigned char* in_data, int rowbytes,
|
||||||
buffer */
|
unsigned char* out_buf)
|
||||||
color_space from_space,
|
|
||||||
unsigned char* in_data, int rowbytes, unsigned char* out_buf)
|
|
||||||
{
|
{
|
||||||
ASSERT(in_data != out_buf);
|
ASSERT(in_data != out_buf);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user