예제 #1
0
  @Override
  protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
    /*
     * The native drawGlyphList() only works with two composite types:
     *    - CompositeType.SrcOver (with any extra alpha), or
     *    - CompositeType.Xor
     */
    Composite comp = sg2d.composite;
    if (comp == AlphaComposite.Src) {
      /*
       * In addition to the composite types listed above, the logic
       * in OGL/D3DSurfaceData.validatePipe() allows for
       * CompositeType.SrcNoEa, but only in the presence of an opaque
       * color.  If we reach this case, we know the color is opaque,
       * and therefore SrcNoEa is the same as SrcOverNoEa, so we
       * override the composite here.
       */
      comp = AlphaComposite.SrcOver;
    }

    rq.lock();
    try {
      validateContext(sg2d, comp);
      enqueueGlyphList(sg2d, gl);
    } finally {
      rq.unlock();
    }
  }
예제 #2
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());
            }
          });
    }
  }