void Init(SkCanvas *aCanvas, const DrawOptions& aOptions, const Rect* aMaskBounds) { mPaint.setXfermodeMode(GfxOpToSkiaOp(aOptions.mCompositionOp)); mCanvas = aCanvas; //TODO: Can we set greyscale somehow? if (aOptions.mAntialiasMode != AntialiasMode::NONE) { mPaint.setAntiAlias(true); } else { mPaint.setAntiAlias(false); } Rect clipBounds = GetClipBounds(aCanvas); bool needsGroup = !IsOperatorBoundByMask(aOptions.mCompositionOp) && (!aMaskBounds || !aMaskBounds->Contains(clipBounds)); // TODO: We could skip the temporary for operator_source and just // clear the clip rect. The other operators would be harder // but could be worth it to skip pushing a group. if (needsGroup) { mPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode); SkPaint temp; temp.setXfermodeMode(GfxOpToSkiaOp(aOptions.mCompositionOp)); temp.setAlpha(ColorFloatToByte(aOptions.mAlpha)); //TODO: Get a rect here mCanvas->saveLayer(nullptr, &temp); mNeedsRestore = true; } else { mPaint.setAlpha(ColorFloatToByte(aOptions.mAlpha)); mAlpha = aOptions.mAlpha; } mPaint.setFilterLevel(SkPaint::kLow_FilterLevel); }
/* ================ PackColor ================ */ dword PackColor( const idVec4 &color ) { dword dw, dx, dy, dz; dx = ColorFloatToByte( color.x ); dy = ColorFloatToByte( color.y ); dz = ColorFloatToByte( color.z ); dw = ColorFloatToByte( color.w ); #if SDL_BYTEORDER == SDL_LIL_ENDIAN return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 ) | ( dw << 24 ); #else return ( dx << 24 ) | ( dy << 16 ) | ( dz << 8 ) | ( dw << 0 ); #endif }
/* ================ PackColor ================ */ dword PackColor( const idVec4 &color ) { dword dw, dx, dy, dz; dx = ColorFloatToByte( color.x ); dy = ColorFloatToByte( color.y ); dz = ColorFloatToByte( color.z ); dw = ColorFloatToByte( color.w ); #if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__)) return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 ) | ( dw << 24 ); #elif (defined(MACOS_X) && defined(__ppc__)) return ( dx << 24 ) | ( dy << 16 ) | ( dz << 8 ) | ( dw << 0 ); #else #error OS define is required! #endif }
/* ================ PackColor ================ */ dword PackColor( const idVec4 &color ) { dword dw, dx, dy, dz; dx = ColorFloatToByte( color.x ); dy = ColorFloatToByte( color.y ); dz = ColorFloatToByte( color.z ); dw = ColorFloatToByte( color.w ); #if defined(ID_LITTLE_ENDIAN) return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 ) | ( dw << 24 ); #elif defined(ID_BIG_ENDIAN) return ( dx << 24 ) | ( dy << 16 ) | ( dz << 8 ) | ( dw << 0 ); #else #error unknown endianness! #endif }