/* * Class: sun_java2d_x11_X11Renderer * Method: XDrawRect * Signature: (IJIIII)V */ JNIEXPORT void JNICALL Java_sun_java2d_x11_X11Renderer_XDrawRect (JNIEnv *env, jobject xr, jlong pXSData, jlong xgc, jint x, jint y, jint w, jint h) { #ifndef HEADLESS X11SDOps *xsdo = (X11SDOps *) pXSData; if (xsdo == NULL || w < 0 || h < 0) { return; } if (w < 2 || h < 2) { /* REMIND: This optimization assumes thin lines. */ /* * This optimization not only simplifies the processing * of a particular degenerate case, but it protects against * the anomalies of various X11 implementations that draw * nothing for degenerate Polygons and Rectangles. */ XFillRectangle(awt_display, xsdo->drawable, (GC) xgc, CLAMP_TO_SHORT(x), CLAMP_TO_SHORT(y), CLAMP_TO_USHORT(w+1), CLAMP_TO_USHORT(h+1)); } else { XDrawRectangle(awt_display, xsdo->drawable, (GC) xgc, CLAMP_TO_SHORT(x), CLAMP_TO_SHORT(y), CLAMP_TO_USHORT(w), CLAMP_TO_USHORT(h)); } X11SD_DirectRenderNotify(env, xsdo); #endif /* !HEADLESS */ }
/* * Class: sun_java2d_x11_X11Renderer * Method: XFillRect * Signature: (IJIIII)V */ JNIEXPORT void JNICALL Java_sun_java2d_x11_X11Renderer_XFillRect (JNIEnv *env, jobject xr, jlong pXSData, jlong xgc, jint x, jint y, jint w, jint h) { #ifndef HEADLESS X11SDOps *xsdo = (X11SDOps *) pXSData; if (xsdo == NULL) { return; } XFillRectangle(awt_display, xsdo->drawable, (GC) xgc, CLAMP_TO_SHORT(x), CLAMP_TO_SHORT(y), CLAMP_TO_USHORT(w), CLAMP_TO_USHORT(h)); X11SD_DirectRenderNotify(env, xsdo); #endif /* !HEADLESS */ }
/* * Class: sun_java2d_x11_X11Renderer * Method: XDrawLine * Signature: (IJIIII)V */ JNIEXPORT void JNICALL Java_sun_java2d_x11_X11Renderer_XDrawLine (JNIEnv *env, jobject xr, jlong pXSData, jlong xgc, jint x1, jint y1, jint x2, jint y2) { #ifndef HEADLESS X11SDOps *xsdo = (X11SDOps *) pXSData; if (xsdo == NULL) { return; } XDrawLine(awt_display, xsdo->drawable, (GC) xgc, CLAMP_TO_SHORT(x1), CLAMP_TO_SHORT(y1), CLAMP_TO_SHORT(x2), CLAMP_TO_SHORT(y2)); X11SD_DirectRenderNotify(env, xsdo); #endif /* !HEADLESS */ }
/* * Class: sun_java2d_x11_X11Renderer * Method: XFillSpans * Signature: (IJLsun/java2d/pipe/SpanIterator;JII)V */ JNIEXPORT void JNICALL Java_sun_java2d_x11_X11Renderer_XFillSpans (JNIEnv *env, jobject xr, jlong pXSData, jlong xgc, jobject si, jlong pIterator, jint transx, jint transy) { #ifndef HEADLESS SpanIteratorFuncs *pFuncs = (SpanIteratorFuncs *) jlong_to_ptr(pIterator); void *srData; jint x, y, w, h; jint spanbox[4]; X11SDOps *xsdo = (X11SDOps *) pXSData; if (xsdo == NULL) { return; } if (JNU_IsNull(env, si)) { JNU_ThrowNullPointerException(env, "span iterator"); return; } if (pFuncs == NULL) { JNU_ThrowNullPointerException(env, "native iterator not supplied"); return; } srData = (*pFuncs->open)(env, si); while ((*pFuncs->nextSpan)(srData, spanbox)) { x = spanbox[0] + transx; y = spanbox[1] + transy; w = spanbox[2] - spanbox[0]; h = spanbox[3] - spanbox[1]; XFillRectangle(awt_display, xsdo->drawable, (GC) xgc, CLAMP_TO_SHORT(x), CLAMP_TO_SHORT(y), CLAMP_TO_USHORT(w), CLAMP_TO_USHORT(h)); } (*pFuncs->close)(env, srData); X11SD_DirectRenderNotify(env, xsdo); #endif /* !HEADLESS */ }
static inline unsigned char adpcm_ima_compress_sample(ADPCMChannelStatus *c, short sample) { int step_index; unsigned char nibble; int sign = 0; /* sign bit of the nibble (MSB) */ int delta, predicted_delta; delta = sample - c->prev_sample; if (delta < 0) { sign = 1; delta = -delta; } step_index = c->step_index; /* nibble = 4 * delta / step_table[step_index]; */ nibble = (delta << 2) / step_table[step_index]; if (nibble > 7) nibble = 7; step_index += index_table[nibble]; if (step_index < 0) step_index = 0; if (step_index > 88) step_index = 88; /* what the decoder will find */ predicted_delta = ((step_table[step_index] * nibble) / 4) + (step_table[step_index] / 8); if (sign) c->prev_sample -= predicted_delta; else c->prev_sample += predicted_delta; CLAMP_TO_SHORT(c->prev_sample); nibble += sign << 3; /* sign * 8 */ /* save back */ c->step_index = step_index; return nibble; }
static inline unsigned char adpcm_yamaha_compress_sample(ADPCMChannelStatus *c, short sample) { int i1 = 0, j1; if(!c->step) { c->predictor = 0; c->step = 127; } j1 = sample - c->predictor; j1 = (j1 * 8) / c->step; i1 = abs(j1) / 2; if (i1 > 7) i1 = 7; if (j1 < 0) i1 += 8; c->predictor = c->predictor + ((c->step * yamaha_difflookup[i1]) / 8); CLAMP_TO_SHORT(c->predictor); c->step = (c->step * yamaha_indexscale[i1]) >> 8; c->step = clip(c->step, 127, 24567); return i1; }
static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample) { int predictor, nibble, bias; predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 256; nibble= sample - predictor; if(nibble>=0) bias= c->idelta/2; else bias=-c->idelta/2; nibble= (nibble + bias) / c->idelta; nibble= clip(nibble, -8, 7)&0x0F; predictor += (signed)((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta; CLAMP_TO_SHORT(predictor); c->sample2 = c->sample1; c->sample1 = predictor; c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8; if (c->idelta < 16) c->idelta = 16; return nibble; }
/* * Class: sun_java2d_x11_X11Renderer * Method: XFillRoundRect * Signature: (IJIIIIII)V */ JNIEXPORT void JNICALL Java_sun_java2d_x11_X11Renderer_XFillRoundRect (JNIEnv *env, jobject xr, jlong pXSData, jlong xgc, jint x, jint y, jint w, jint h, jint arcW, jint arcH) { #ifndef HEADLESS long ty1, ty2, tx1, tx2, cx, cy, cxw, cyh, halfW, halfH, leftW, rightW, topH, bottomH; X11SDOps *xsdo = (X11SDOps *) pXSData; if (xsdo == NULL || w <= 0 || h <= 0) { return; } arcW = ABS(arcW); arcH = ABS(arcH); if (arcW > w) { arcW = w; } if (arcH > h) { arcH = h; } if (arcW == 0 || arcH == 0) { Java_sun_java2d_x11_X11Renderer_XFillRect(env, xr, pXSData, xgc, x, y, w, h); return; } halfW = (arcW / 2); halfH = (arcH / 2); /* clamp to short bounding box of round rectangle */ cx = CLAMP_TO_SHORT(x); cy = CLAMP_TO_SHORT(y); cxw = CLAMP_TO_SHORT(x + w); cyh = CLAMP_TO_SHORT(y + h); /* clamp to short coordinates of lines */ tx1 = CLAMP_TO_SHORT(x + halfW + 1); tx2 = CLAMP_TO_SHORT(x + w - halfW - 1); ty1 = CLAMP_TO_SHORT(y + halfH + 1); ty2 = CLAMP_TO_SHORT(y + h - halfH - 1); /* * recalculate heightes and widthes of round parts * to minimize distortions in visible area */ leftW = (tx1 - cx) * 2; rightW = (cxw - tx2) * 2; topH = (ty1 - cy) * 2; bottomH = (cyh - ty2) * 2; awt_drawArc(env, xsdo->drawable, (GC) xgc, cx, cy, leftW, topH, 90, 90, JNI_TRUE); awt_drawArc(env, xsdo->drawable, (GC) xgc, cxw - rightW, cy, rightW, topH, 0, 90, JNI_TRUE); awt_drawArc(env, xsdo->drawable, (GC) xgc, cx, cyh - bottomH, leftW, bottomH, 180, 90, JNI_TRUE); awt_drawArc(env, xsdo->drawable, (GC) xgc, cxw - rightW, cyh - bottomH, rightW, bottomH, 270, 90, JNI_TRUE); if (tx1 < tx2) { if (cy < ty1) { XFillRectangle(awt_display, xsdo->drawable, (GC) xgc, tx1, cy, tx2 - tx1, ty1 - cy); } if (ty2 < cyh) { XFillRectangle(awt_display, xsdo->drawable, (GC) xgc, tx1, ty2, tx2 - tx1, cyh - ty2); } } if (ty1 < ty2) { XFillRectangle(awt_display, xsdo->drawable, (GC) xgc, cx, ty1, cxw - cx, ty2 - ty1); } X11SD_DirectRenderNotify(env, xsdo); #endif /* !HEADLESS */ }
/* * Copy vertices from xcoordsArray and ycoordsArray to a buffer * of XPoint structures, translating by transx and transy and * collapsing empty segments out of the list as we go. * The number of points to be converted should be guaranteed * to be more than 2 by the caller and is stored at *pNpoints. * The resulting number of uncollapsed unique translated vertices * will be stored back into the location *pNpoints. * The points pointer is guaranteed to be pointing to an area of * memory large enough for POLYTEMPSIZE points and a larger * area of memory is allocated (and returned) if that is not enough. */ static XPoint * transformPoints(JNIEnv * env, jintArray xcoordsArray, jintArray ycoordsArray, jint transx, jint transy, XPoint * points, int *pNpoints, int close) { int npoints = *pNpoints; jint *xcoords, *ycoords; xcoords = (jint *) (*env)->GetPrimitiveArrayCritical(env, xcoordsArray, NULL); if (xcoords == NULL) { return 0; } ycoords = (jint *) (*env)->GetPrimitiveArrayCritical(env, ycoordsArray, NULL); if (ycoords == NULL) { (*env)->ReleasePrimitiveArrayCritical(env, xcoordsArray, xcoords, JNI_ABORT); return 0; } if (close) { close = (xcoords[npoints - 1] != xcoords[0] || ycoords[npoints - 1] != ycoords[0]); if (close) { npoints++; } } if (npoints > POLYTEMPSIZE) { points = (XPoint *) malloc(sizeof(XPoint) * npoints); } if (points != NULL) { int in, out; int oldx = CLAMP_TO_SHORT(xcoords[0] + transx); int oldy = CLAMP_TO_SHORT(ycoords[0] + transy); points[0].x = oldx; points[0].y = oldy; if (close) { npoints--; } for (in = 1, out = 1; in < npoints; in++) { int newx = CLAMP_TO_SHORT(xcoords[in] + transx); int newy = CLAMP_TO_SHORT(ycoords[in] + transy); if (newx != oldx || newy != oldy) { points[out].x = newx; points[out].y = newy; out++; oldx = newx; oldy = newy; } } if (out == 1) { points[1].x = oldx; points[1].y = oldy; out = 2; } else if (close) { points[out++] = points[0]; } *pNpoints = out; } (*env)->ReleasePrimitiveArrayCritical(env, xcoordsArray, xcoords, JNI_ABORT); (*env)->ReleasePrimitiveArrayCritical(env, ycoordsArray, ycoords, JNI_ABORT); return points; }