/* Description: Initialises the teensy, SPI module, transceiver and ADC module. */ void Init() { // Set inputs. DDRD |= SHIFT(DDD1) | SHIFT(NIRQ); PORTD |= SHIFT(PORTD1) | SHIFT(NIRQ); InitADC(); InitSPI(); InitAlpha(); }
// convert data from RGB to wxImage format static void CopyDataFromPNG(wxImage *image, unsigned char **lines, png_uint_32 width, png_uint_32 height, int color_type) { Transparency transparency = Transparency_None; // only non NULL if transparency == Transparency_Alpha unsigned char *alpha = NULL; // RGB of the mask colour if transparency == Transparency_Mask // (but init them anyhow to avoid compiler warnings) unsigned char rMask = 0, gMask = 0, bMask = 0; unsigned char *ptrDst = image->GetData(); if ( !(color_type & PNG_COLOR_MASK_COLOR) ) { // grey image: GAGAGA... where G == grey component and A == alpha for ( png_uint_32 y = 0; y < height; y++ ) { const unsigned char *ptrSrc = lines[y]; for ( png_uint_32 x = 0; x < width; x++ ) { unsigned char g = *ptrSrc++; unsigned char a = *ptrSrc++; // the first time we encounter a transparent pixel we must // decide about what to do about them if ( !IsOpaque(a) && transparency == Transparency_None ) { // we'll need at least the mask for this image and // maybe even full alpha channel info: the former is // only enough if we have alpha values of 0 and 0xff // only, otherwisewe need the latter transparency = CheckTransparency ( lines, x, y, width, height, 1 ); if ( transparency == Transparency_Mask ) { // let's choose this colour for the mask: this is // not a problem here as all the other pixels are // grey, i.e. R == G == B which is not the case for // this one so no confusion is possible rMask = 0xff; gMask = 0; bMask = 0xff; } else // transparency == Transparency_Alpha { alpha = InitAlpha(image, x, y); } } switch ( transparency ) { case Transparency_Mask: if ( IsTransparent(a) ) { *ptrDst++ = rMask; *ptrDst++ = gMask; *ptrDst++ = bMask; break; } // else: !transparent // must be opaque then as otherwise we shouldn't be // using the mask at all wxASSERT_MSG( IsOpaque(a), wxT("logic error") ); // fall through case Transparency_Alpha: if ( alpha ) *alpha++ = a; // fall through case Transparency_None: *ptrDst++ = g; *ptrDst++ = g; *ptrDst++ = g; break; } } } } else // colour image: RGBRGB... { for ( png_uint_32 y = 0; y < height; y++ ) { const unsigned char *ptrSrc = lines[y]; for ( png_uint_32 x = 0; x < width; x++ ) { unsigned char r = *ptrSrc++; unsigned char g = *ptrSrc++; unsigned char b = *ptrSrc++; unsigned char a = *ptrSrc++; // the logic here is the same as for the grey case except // where noted if ( !IsOpaque(a) && transparency == Transparency_None ) { transparency = CheckTransparency ( lines, x, y, width, height, 3 ); if ( transparency == Transparency_Mask ) { FindMaskColour(lines, width, height, rMask, gMask, bMask); } else // transparency == Transparency_Alpha { alpha = InitAlpha(image, x, y); } } switch ( transparency ) { case Transparency_Mask: if ( IsTransparent(a) ) { *ptrDst++ = rMask; *ptrDst++ = gMask; *ptrDst++ = bMask; break; } else // !transparent { // must be opaque then as otherwise we shouldn't be // using the mask at all wxASSERT_MSG( IsOpaque(a), wxT("logic error") ); // if we couldn't find a unique colour for the // mask, we can have real pixels with the same // value as the mask and it's better to slightly // change their colour than to make them // transparent if ( r == rMask && g == gMask && b == bMask ) { r++; } } // fall through case Transparency_Alpha: if ( alpha ) *alpha++ = a; // fall through case Transparency_None: *ptrDst++ = r; *ptrDst++ = g; *ptrDst++ = b; break; } } } } if ( transparency == Transparency_Mask ) { image->SetMaskColour(rMask, gMask, bMask); } }
// convert data from RGB to wxImage format static void CopyDataFromPNG(wxImage *image, unsigned char **lines, png_uint_32 width, png_uint_32 height, int color_type) { // allocated on demand if we have any non-opaque pixels unsigned char *alpha = NULL; unsigned char *ptrDst = image->GetData(); if ( !(color_type & PNG_COLOR_MASK_COLOR) ) { // grey image: GAGAGA... where G == grey component and A == alpha for ( png_uint_32 y = 0; y < height; y++ ) { const unsigned char *ptrSrc = lines[y]; for ( png_uint_32 x = 0; x < width; x++ ) { unsigned char g = *ptrSrc++; unsigned char a = *ptrSrc++; // the first time we encounter a transparent pixel we must // allocate alpha channel for the image if ( !IsOpaque(a) && !alpha ) alpha = InitAlpha(image, x, y); if ( alpha ) *alpha++ = a; *ptrDst++ = g; *ptrDst++ = g; *ptrDst++ = g; } } } else // colour image: RGBRGB... { for ( png_uint_32 y = 0; y < height; y++ ) { const unsigned char *ptrSrc = lines[y]; for ( png_uint_32 x = 0; x < width; x++ ) { unsigned char r = *ptrSrc++; unsigned char g = *ptrSrc++; unsigned char b = *ptrSrc++; unsigned char a = *ptrSrc++; // the logic here is the same as for the grey case if ( !IsOpaque(a) && !alpha ) alpha = InitAlpha(image, x, y); if ( alpha ) *alpha++ = a; *ptrDst++ = r; *ptrDst++ = g; *ptrDst++ = b; } } } }
Polyalphabetic::Polyalphabetic() { InitAlpha(); InitTable(); }