}
else if (*src) {
for (ch = 0; ch < im->channels; ++ch) {
- IM_WORK_T work = (destc->channel[ch] * (IM_SAMPLE_MAX - *src)
- + srcc->channel[ch] * *src) / IM_SAMPLE_MAX;
+ IM_WORK_T work = (destc->channel[ch] * (255 - *src)
+ + srcc->channel[ch] * *src) / 255.0;
destc->channel[ch] = IM_LIMIT(work);
}
}
#/code
}
+#if 0
+
+/* for debuggin */
+
static void
dump_src(const char *note, unsigned char const *src, i_img_dim width) {
i_img_dim i;
- printf("%s - %p/%d\n", note, src, width);
+ printf("%s - %p/%" i_DF "\n", note, src, i_DFc(width));
for (i = 0; i < width; ++i) {
printf("%02x ", src[i]);
}
putchar('\n');
}
+#endif
+
#code
/*
IM_COLOR *linep = r->IM_SUFFIX(line);
int ch, channels = im->channels;
i_img_dim fetch_offset;
+ int color_alpha = color->channel[im->channels];
#undef STORE_COLOR
#ifdef IM_EIGHT_BIT
#define STORE_COLOR (*color)
#endif
fetch_offset = 0;
- while (fetch_offset < width && *src == 0xFF) {
- *linep++ = STORE_COLOR;
- ++src;
- ++fetch_offset;
+ if (color_alpha == 0xFF) {
+ while (fetch_offset < width && *src == 0xFF) {
+ *linep++ = STORE_COLOR;
+ ++src;
+ ++fetch_offset;
+ }
}
IM_GLIN(im, x+fetch_offset, x+width, y, linep);
while (fetch_offset < width) {
#ifdef IM_EIGHT_BIT
- IM_WORK_T alpha = *src++;
+ IM_WORK_T alpha = *src++ * color_alpha / 255;
#else
- IM_WORK_T alpha = *src++ / 255.0;
+ IM_WORK_T alpha = *src++ * color_alpha / (255.0 * 255.0);
#endif
if (alpha == IM_SAMPLE_MAX)
*linep = STORE_COLOR;
int ch;
int alpha_channel = r->im->channels - 1;
i_img_dim fetch_offset;
+ int color_alpha = color->channel[alpha_channel];
#undef STORE_COLOR
#ifdef IM_EIGHT_BIT
#define STORE_COLOR (*color)
#endif
fetch_offset = 0;
- while (fetch_offset < width && *src == 0xFF) {
- *linep++ = STORE_COLOR;
- ++src;
- ++fetch_offset;
+ if (color->channel[alpha_channel] == 0xFF) {
+ while (fetch_offset < width && *src == 0xFF) {
+ *linep++ = STORE_COLOR;
+ ++src;
+ ++fetch_offset;
+ }
}
IM_GLIN(r->im, x+fetch_offset, x+width, y, linep);
while (fetch_offset < width) {
#ifdef IM_EIGHT_BIT
- IM_WORK_T src_alpha = *src++;
+ IM_WORK_T src_alpha = *src++ * color_alpha / 255;
#else
- IM_WORK_T src_alpha = *src++ / 255.0;
+ IM_WORK_T src_alpha = *src++ * color_alpha / (255.0 * 255.0);
#endif
if (src_alpha == IM_SAMPLE_MAX)
*linep = STORE_COLOR;