Пример #1
0
  private void enqueueGlyphList(final SunGraphics2D sg2d, final GlyphList gl) {
    // assert rq.lock.isHeldByCurrentThread();
    RenderBuffer buf = rq.getBuffer();
    final int totalGlyphs = gl.getNumGlyphs();
    int glyphBytesRequired = totalGlyphs * BYTES_PER_GLYPH_IMAGE;
    int posBytesRequired = gl.usePositions() ? totalGlyphs * BYTES_PER_GLYPH_POSITION : 0;
    int totalBytesRequired = 24 + glyphBytesRequired + posBytesRequired;

    final long[] images = gl.getImages();
    final float glyphListOrigX = gl.getX() + 0.5f;
    final float glyphListOrigY = gl.getY() + 0.5f;

    // make sure the RenderQueue keeps a hard reference to the FontStrike
    // so that the associated glyph images are not disposed while enqueued
    rq.addReference(gl.getStrike());

    if (totalBytesRequired <= buf.capacity()) {
      if (totalBytesRequired > buf.remaining()) {
        // process the queue first and then enqueue the glyphs
        rq.flushNow();
      }
      rq.ensureAlignment(20);
      buf.putInt(DRAW_GLYPH_LIST);
      // enqueue parameters
      buf.putInt(totalGlyphs);
      buf.putInt(createPackedParams(sg2d, gl));
      buf.putFloat(glyphListOrigX);
      buf.putFloat(glyphListOrigY);
      // now enqueue glyph information
      buf.put(images, 0, totalGlyphs);
      if (gl.usePositions()) {
        float[] positions = gl.getPositions();
        buf.put(positions, 0, 2 * totalGlyphs);
      }
    } else {
      // queue is too small to accomodate glyphs; perform
      // the operation directly on the queue flushing thread
      rq.flushAndInvokeNow(
          new Runnable() {
            public void run() {
              drawGlyphList(
                  totalGlyphs,
                  gl.usePositions(),
                  gl.isSubPixPos(),
                  gl.isRGBOrder(),
                  sg2d.lcdTextContrast,
                  glyphListOrigX,
                  glyphListOrigY,
                  images,
                  gl.getPositions());
            }
          });
    }
  }
Пример #2
0
 private void setClip(Region clip) {
   // assert rq.lock.isHeldByCurrentThread();
   if (clip.isRectangular()) {
     rq.ensureCapacity(20);
     buf.putInt(SET_RECT_CLIP);
     buf.putInt(clip.getLoX()).putInt(clip.getLoY());
     buf.putInt(clip.getHiX()).putInt(clip.getHiY());
   } else {
     rq.ensureCapacity(28); // so that we have room for at least a span
     buf.putInt(BEGIN_SHAPE_CLIP);
     buf.putInt(SET_SHAPE_CLIP_SPANS);
     // include a placeholder for the span count
     int countIndex = buf.position();
     buf.putInt(0);
     int spanCount = 0;
     int remainingSpans = buf.remaining() / BYTES_PER_SPAN;
     int span[] = new int[4];
     SpanIterator si = clip.getSpanIterator();
     while (si.nextSpan(span)) {
       if (remainingSpans == 0) {
         buf.putInt(countIndex, spanCount);
         rq.flushNow();
         buf.putInt(SET_SHAPE_CLIP_SPANS);
         countIndex = buf.position();
         buf.putInt(0);
         spanCount = 0;
         remainingSpans = buf.remaining() / BYTES_PER_SPAN;
       }
       buf.putInt(span[0]); // x1
       buf.putInt(span[1]); // y1
       buf.putInt(span[2]); // x2
       buf.putInt(span[3]); // y2
       spanCount++;
       remainingSpans--;
     }
     buf.putInt(countIndex, spanCount);
     rq.ensureCapacity(4);
     buf.putInt(END_SHAPE_CLIP);
   }
 }