SkImageFilter::CropRect FilterEffect::getCropRect(const FloatSize& cropOffset) const { FloatRect rect; uint32_t flags = 0; if (!hasConnectedInput() && !filter()->filterRegion().isEmpty()) { rect = filter()->filterRegion(); flags = SkImageFilter::CropRect::kHasAll_CropEdge; } FloatRect boundaries = effectBoundaries(); boundaries.move(cropOffset); if (hasX()) { rect.setX(boundaries.x()); flags |= SkImageFilter::CropRect::kHasLeft_CropEdge; } if (hasY()) { rect.setY(boundaries.y()); flags |= SkImageFilter::CropRect::kHasTop_CropEdge; } if (hasWidth()) { rect.setWidth(boundaries.width()); flags |= SkImageFilter::CropRect::kHasWidth_CropEdge; } if (hasHeight()) { rect.setHeight(boundaries.height()); flags |= SkImageFilter::CropRect::kHasHeight_CropEdge; } rect.scale(filter()->scale()); return SkImageFilter::CropRect(rect, flags); }
SkImageFilter::CropRect FilterEffect::getCropRect(const FloatSize& cropOffset) const { FloatRect rect = filter()->filterRegion(); uint32_t flags = 0; FloatRect boundaries = effectBoundaries(); boundaries.move(cropOffset); if (hasX()) { rect.setX(boundaries.x()); flags |= SkImageFilter::CropRect::kHasLeft_CropEdge; flags |= SkImageFilter::CropRect::kHasRight_CropEdge; } if (hasY()) { rect.setY(boundaries.y()); flags |= SkImageFilter::CropRect::kHasTop_CropEdge; flags |= SkImageFilter::CropRect::kHasBottom_CropEdge; } if (hasWidth()) { rect.setWidth(boundaries.width()); flags |= SkImageFilter::CropRect::kHasRight_CropEdge; } if (hasHeight()) { rect.setHeight(boundaries.height()); flags |= SkImageFilter::CropRect::kHasBottom_CropEdge; } rect.scale(filter()->absoluteTransform().a(), filter()->absoluteTransform().d()); return SkImageFilter::CropRect(rect, flags); }
FloatRect FilterEffect::getSourceRect(const FloatRect& destRect, const FloatRect& destClipRect) { FloatRect sourceRect = mapRect(destRect, false); FloatRect sourceClipRect = mapRect(destClipRect, false); FloatRect boundaries = filter()->mapLocalRectToAbsoluteRect(effectBoundaries()); if (hasX()) sourceClipRect.setX(boundaries.x()); if (hasY()) sourceClipRect.setY(boundaries.y()); if (hasWidth()) sourceClipRect.setWidth(boundaries.width()); if (hasHeight()) sourceClipRect.setHeight(boundaries.height()); FloatRect result; if (m_inputEffects.size() > 0) { result = m_inputEffects.at(0)->getSourceRect(sourceRect, sourceClipRect); for (unsigned i = 1; i < m_inputEffects.size(); ++i) result.unite(m_inputEffects.at(i)->getSourceRect(sourceRect, sourceClipRect)); } else { result = sourceRect; result.intersect(sourceClipRect); } return result; }
FloatRect FilterEffect::determineFilterPrimitiveSubregion(DetermineSubregionFlags flags) { Filter* filter = this->filter(); ASSERT(filter); // FETile, FETurbulence, FEFlood don't have input effects, take the filter region as unite rect. FloatRect subregion; if (unsigned numberOfInputEffects = inputEffects().size()) { subregion = inputEffect(0)->determineFilterPrimitiveSubregion(flags); for (unsigned i = 1; i < numberOfInputEffects; ++i) subregion.unite(inputEffect(i)->determineFilterPrimitiveSubregion(flags)); } else { subregion = filter->filterRegion(); } // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>. if (filterEffectType() == FilterEffectTypeTile) subregion = filter->filterRegion(); if (flags & MapRectForward) { // mapRect works on absolute rectangles. subregion = filter->mapAbsoluteRectToLocalRect(mapRect( filter->mapLocalRectToAbsoluteRect(subregion))); } FloatRect boundaries = effectBoundaries(); if (hasX()) subregion.setX(boundaries.x()); if (hasY()) subregion.setY(boundaries.y()); if (hasWidth()) subregion.setWidth(boundaries.width()); if (hasHeight()) subregion.setHeight(boundaries.height()); setFilterPrimitiveSubregion(subregion); FloatRect absoluteSubregion = filter->mapLocalRectToAbsoluteRect(subregion); // Clip every filter effect to the filter region. if (flags & ClipToFilterRegion) { absoluteSubregion.intersect(filter->absoluteFilterRegion()); } setMaxEffectRect(absoluteSubregion); return subregion; }
FloatRect FilterEffect::determineFilterPrimitiveSubregion() { ASSERT(filter()); // FETile, FETurbulence, FEFlood don't have input effects, take the filter region as unite rect. FloatRect subregion; if (unsigned numberOfInputEffects = inputEffects().size()) { subregion = inputEffect(0)->determineFilterPrimitiveSubregion(); for (unsigned i = 1; i < numberOfInputEffects; ++i) subregion.unite(inputEffect(i)->determineFilterPrimitiveSubregion()); } else subregion = filter()->filterRegion(); // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>. if (filterEffectType() == FilterEffectTypeTile) subregion = filter()->filterRegion(); subregion = mapRect(subregion); FloatRect boundaries = effectBoundaries(); if (hasX()) subregion.setX(boundaries.x()); if (hasY()) subregion.setY(boundaries.y()); if (hasWidth()) subregion.setWidth(boundaries.width()); if (hasHeight()) subregion.setHeight(boundaries.height()); setFilterPrimitiveSubregion(subregion); FloatRect absoluteSubregion = filter()->absoluteTransform().mapRect(subregion); FloatSize filterResolution = filter()->filterResolution(); absoluteSubregion.scale(filterResolution.width(), filterResolution.height()); setMaxEffectRect(absoluteSubregion); return subregion; }
/** \brief Print command on serial console */ void GCode::printCommand() { if(hasM()) { Com::print('M'); Com::print((int)M); Com::print(' '); } if(hasG()) { Com::print('G'); Com::print((int)G); Com::print(' '); } if(hasT()) { Com::print('T'); Com::print((int)T); Com::print(' '); } if(hasX()) { Com::printF(Com::tX,X); } if(hasY()) { Com::printF(Com::tY,Y); } if(hasZ()) { Com::printF(Com::tZ,Z); } if(hasE()) { Com::printF(Com::tE,E,4); } if(hasF()) { Com::printF(Com::tF,F); } if(hasS()) { Com::printF(Com::tS,S); } if(hasP()) { Com::printF(Com::tP,P); } if(hasI()) { Com::printF(Com::tI,I); } if(hasJ()) { Com::printF(Com::tJ,J); } if(hasR()) { Com::printF(Com::tR,R); } if(hasString()) { Com::print(text); } Com::println(); }
bool DPSketch::hasPosition() const { return hasX() && hasY(); }
/** Converts a binary uint8_tfield containing one GCode line into a GCode structure. Returns true if checksum was correct. */ bool GCode::parseBinary(uint8_t *buffer,bool fromSerial) { internalCommand = !fromSerial; unsigned int sum1 = 0, sum2 = 0; // for fletcher-16 checksum // first do fletcher-16 checksum tests see // http://en.wikipedia.org/wiki/Fletcher's_checksum uint8_t *p = buffer; uint8_t len = binaryCommandSize - 2; while (len) { uint8_t tlen = len > 21 ? 21 : len; len -= tlen; do { sum1 += *p++; if(sum1 >= 255) sum1 -= 255; sum2 += sum1; if(sum2 >= 255) sum2 -= 255; } while (--tlen); } sum1 -= *p++; sum2 -= *p; if(sum1 | sum2) { if(Printer::debugErrors()) { Com::printErrorFLN(Com::tWrongChecksum); } return false; } p = buffer; params = *(uint16_t *)p; p += 2; uint8_t textlen = 16; if(isV2()) { params2 = *(uint16_t *)p; p += 2; if(hasString()) textlen = *p++; } else params2 = 0; if(params & 1) { actLineNumber = N = *(uint16_t *)p; p += 2; } if(isV2()) // Read G,M as 16 bit value { if(hasM()) { M = *(uint16_t *)p; p += 2; } if(hasG()) { G = *(uint16_t *)p; p += 2; } } else { if(hasM()) { M = *p++; } if(hasG()) { G = *p++; } } //if(code->params & 8) {memcpy(&code->X,p,4);p+=4;} if(hasX()) { X = *(float *)p; p += 4; } if(hasY()) { Y = *(float *)p; p += 4; } if(hasZ()) { Z = *(float *)p; p += 4; } if(hasE()) { E = *(float *)p; p += 4; } if(hasF()) { F = *(float *)p; p += 4; } if(hasT()) { T = *p++; } if(hasS()) { S = *(int32_t*)p; p += 4; } if(hasP()) { P = *(int32_t*)p; p += 4; } if(hasI()) { I = *(float *)p; p += 4; } if(hasJ()) { J = *(float *)p; p += 4; } if(hasR()) { R = *(float *)p; p += 4; } if(hasD()) { D = *(float *)p; p += 4; } if(hasC()) { C = *(float *)p; p += 4; } if(hasH()) { H = *(float *)p; p += 4; } if(hasA()) { A = *(float *)p; p += 4; } if(hasB()) { B = *(float *)p; p += 4; } if(hasK()) { K = *(float *)p; p += 4; } if(hasL()) { L = *(float *)p; p += 4; } if(hasO()) { O = *(float *)p; p += 4; } if(hasString()) // set text pointer to string { text = (char*)p; text[textlen] = 0; // Terminate string overwriting checksum waitUntilAllCommandsAreParsed = true; // Don't destroy string until executed } formatErrors = 0; return true; }