void KPR_canvasPattern_setStyle(xsMachine *the) { FskCanvas2dContext ctx = xsGetHostData(xsArg(0)); UInt32 repetition = kFskCanvas2dPatternRepeat; FskConstBitmap bitmap = NULL; Boolean owned = false; xsVars(1); xsVar(0) = xsGet(xsThis, xsID("repetition")); if (xsTest(xsVar(0))) { xsStringValue it = xsToString(xsVar(0)); if (!FskStrCompare(it, "no-repeat")) repetition = kFskCanvas2dPatternRepeatNone; else if (!FskStrCompare(it, "repeat-x")) repetition = kFskCanvas2dPatternRepeatX; else if (!FskStrCompare(it, "repeat-y")) repetition = kFskCanvas2dPatternRepeatY; else if (!FskStrCompare(it, "repeat")) repetition = kFskCanvas2dPatternRepeat; else xsError(kFskErrInvalidParameter); } xsVar(0) = xsGet(xsThis, xsID("image")); if (xsIsInstanceOf(xsVar(0), xsGet(xsGet(xsGlobal, xsID_KPR), xsID_texture))) { KprTexture texture = xsGetHostData(xsVar(0)); bitmap = KprTextureGetBitmap(texture, NULL, &owned); } else { KprContent content = xsGetHostData(xsVar(0)); bitmap = (*content->dispatch->getBitmap)(content, NULL, &owned); } if (!bitmap) xsError(kFskErrInvalidParameter); if (xsTest(xsArg(1))) FskCanvas2dSetStrokeStylePattern(ctx, repetition, bitmap); else FskCanvas2dSetFillStylePattern(ctx, repetition, bitmap); if (!owned) FskBitmapDispose((FskBitmap)bitmap); }
// drawing images void KPR_canvasRenderingContext2D_drawImage(xsMachine *the) { FskCanvas2dContext ctx = xsGetHostData(xsThis); xsIntegerValue c = xsToInteger(xsArgc); FskConstCanvas cnv = NULL; FskBitmap bitmap = NULL; Boolean owned = false; xsVars(1); if (xsIsInstanceOf(xsArg(0), xsGet(xsGet(xsGlobal, xsID_KPR), xsID_texture))) { KprTexture texture = xsGetHostData(xsArg(0)); bitmap = KprTextureGetBitmap(texture, NULL, &owned); } else { KprContent content = xsGetHostData(xsArg(0)); if (content->dispatch == &KprCanvasDispatchRecord) cnv = ((KprCanvas)content)->cnv; else bitmap = (*content->dispatch->getBitmap)(content, NULL, &owned); } if (!cnv && !bitmap) xsError(kFskErrInvalidParameter); if (c > 8) { xsNumberValue sx = xsToNumber(xsArg(1)); xsNumberValue sy = xsToNumber(xsArg(2)); xsNumberValue sw = xsToNumber(xsArg(3)); xsNumberValue sh = xsToNumber(xsArg(4)); xsNumberValue dx = xsToNumber(xsArg(5)); xsNumberValue dy = xsToNumber(xsArg(6)); xsNumberValue dw = xsToNumber(xsArg(7)); xsNumberValue dh = xsToNumber(xsArg(8)); if (cnv) FskCanvas2dDrawSubScaledCanvas2d(ctx, cnv, sx, sy, sw, sh, dx, dy, dw, dh); else FskCanvas2dDrawSubScaledBitmap(ctx, bitmap, sx, sy, sw, sh, dx, dy, dw, dh); } else if (c > 4) { xsNumberValue dx = xsToNumber(xsArg(1)); xsNumberValue dy = xsToNumber(xsArg(2)); xsNumberValue dw = xsToNumber(xsArg(3)); xsNumberValue dh = xsToNumber(xsArg(4)); if (cnv) FskCanvas2dDrawScaledCanvas2d(ctx, cnv, dx, dy, dw, dh); else FskCanvas2dDrawScaledBitmap(ctx, bitmap, dx, dy, dw, dh); } else { xsNumberValue dx = xsToNumber(xsArg(1)); xsNumberValue dy = xsToNumber(xsArg(2)); if (cnv) FskCanvas2dDrawCanvas2d(ctx, cnv, dx, dy); else FskCanvas2dDrawBitmap(ctx, bitmap, dx, dy); } if (!owned) FskBitmapDispose(bitmap); }
void xs_i2c_readBlock(xsMachine *the) { FskErr err; xsI2C i2c = xsGetHostData(xsThis); int argc = xsToInteger(xsArgc), i; int format = 2; SInt32 dataSize = xsToInteger(xsArg(0)), readCount; UInt8 data[32]; xsThrowIfNULL(i2c); DBG_I2C("xs_i2c_readBlock\n"); if ((dataSize > 32) || (dataSize <= 0)) xsThrowDiagnosticIfFskErr(kFskErrInvalidParameter, "I2C readBlock invalid size %d. %s", (int)dataSize, i2c->diagnosticID); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CReadBytes(i2c->pin, dataSize, &readCount, data); if (err) { xsTraceDiagnostic("I2C readBlock failed with error %s %s.", FskInstrumentationGetErrorString(err), i2c->diagnosticID); goto bail; } if (argc > 1) { int t = xsTypeOf(xsArg(1)); if ((xsNumberType == t) || (t == xsIntegerType)) format = xsToInteger(xsArg(1)); else { char *formatString = xsToString(xsArg(1)); if (0 == FskStrCompare(formatString, "Buffer")) format = 2; else if (0 == FskStrCompare(formatString, "Chunk")) format = 0; else if (0 == FskStrCompare(formatString, "Array")) format = 1; } } if (2 == format) { xsResult = xsArrayBuffer(data, readCount); } else if (0 == format) { xsResult = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(readCount)); FskMemMove(xsGetHostData(xsResult), data, readCount); } else if (1 == format) { xsResult = xsNew1(xsGlobal, xsID("Array"), xsInteger(readCount)); for (i = 0; i < readCount; i++) xsSet(xsResult, i, xsInteger(data[i])); } bail: if (err) xsError(err); }
void xs_i2c_init(xsMachine *the) { xsI2C i2c = NULL; FskErr err; int address; int sdaPin = 0, clkPin = 0, sdaDev = 0, clkDev = 0; FskPinI2C pin = NULL; if (xsGetHostData(xsThis)) xsThrowDiagnosticIfFskErr(kFskErrBadState, "I2C pin already initialized (SDA pin %d).", i2c->sdaPin); address = xsToInteger(xsGet(xsThis, xsID("address"))); xsResult = xsGet(xsThis, xsID("bus")); if (xsUndefinedType == xsTypeOf(xsResult)) { sdaPin = xsToInteger(xsGet(xsThis, xsID("sda"))); clkPin = xsToInteger(xsGet(xsThis, xsID("clock"))); err = FskPinI2CNew(&pin, sdaPin, clkPin, kFskPinI2CNoBus); } else { sdaDev = xsToInteger(xsResult); err = FskPinI2CNew(&pin, 0, 0, sdaDev); } xsThrowDiagnosticIfFskErr(err, "I2C open failed %s (SDA pin %d, CLK pin %d).", FskInstrumentationGetErrorString(err), sdaPin, clkPin); err = FskMemPtrNewClear(sizeof(xsI2CRecord), &i2c); if (err) { FskPinI2CDispose(pin); xsError(err); } xsSetHostData(xsThis, i2c); i2c->pin = pin; i2c->sdaPin = sdaPin; i2c->clkPin = clkPin; i2c->sdaDev = sdaDev; i2c->clkDev = clkDev; i2c->address = (UInt8)address; i2c->bus = sdaDev; #if SUPPORT_XS_DEBUG if (0 != sdaPin) snprintf(i2c->diagnosticID, sizeof(i2c->diagnosticID), "(Address 0x%x, SDA pin %d, CLK pin %d)", address, sdaPin, clkPin); else snprintf(i2c->diagnosticID, sizeof(i2c->diagnosticID), "(Address 0x%x, Bus %d)", address, sdaDev); #endif }