亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? imagedecoder.java

?? 這是<java高級實用教程>的電子版書,內容深入淺出啊,有實例有解析,不錯的
?? JAVA
字號:
// ImageDecoder - abstract class for reading in an image
//
// Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
// Visit the ACME Labs Java page for up-to-date versions of this and other
// fine Java utilities: http://www.acme.com/java/

package Acme.JPM.Decoders;

import java.util.*;
import java.io.*;
import java.awt.image.*;

/// Abstract class for reading in an image.
// <P>
// A framework for classes that read in and decode an image in
// a particular file format.
// <P>
// This provides a very simplified rendition of the ImageProducer interface.
// It requires the decoder to read the image a row at a time.  It requires
// use of the RGBdefault color model.
// If you want more flexibility you can always implement ImageProducer
// directly.
// <P>
// <A HREF="/resources/classes/Acme/JPM/Decoders/ImageDecoder.java">Fetch the software.</A><BR>
// <A HREF="/resources/classes/Acme.tar.gz">Fetch the entire Acme package.</A>
// <P>
// @see PpmDecoder
// @see Acme.JPM.Encoders.ImageEncoder

public abstract class ImageDecoder implements ImageProducer
    {

    private InputStream in;
    private int width, height;
    private boolean[] rowsRead;
    private int[][] rgbPixels;
    private boolean startedRead = false;
    private boolean gotSize = false;
    private boolean err = false;
    private boolean producing = false;
    private Vector consumers = new Vector();
    private static final ColorModel model = ColorModel.getRGBdefault();


    /// Constructor.
    // @param in The stream to read the bytes from.
    public ImageDecoder( InputStream in )
	{
	this.in = in;
	}

    
    // Methods that subclasses implement.

    /// Subclasses implement this to read in enough of the image stream
    // to figure out the width and height.
    abstract void readHeader( InputStream in ) throws IOException;

    /// Subclasses implement this to return the width, or -1 if not known.
    abstract int getWidth();

    /// Subclasses implement this to return the height, or -1 if not known.
    abstract int getHeight();

    /// Subclasses implement this to read pixel data into the rgbRow
    // array, an int[width].  One int per pixel, no offsets or padding,
    // RGBdefault (AARRGGBB) color model.
    abstract void readRow( InputStream in, int row, int[] rgbRow ) throws IOException;


    // Our own methods.

    void readImage()
	{
	try
	    {
	    readHeader( in );
	    width = getWidth();
	    height = getHeight();
	    if ( width == -1 || height == -1 )
		err = true;
	    else
		{
		rowsRead = new boolean[height];
		for ( int row = 0; row < height; ++row )
		    rowsRead[row] = false;
		gotSize = true;
		notifyThem();
		rgbPixels = new int[height][width];
		for ( int row = 0; row < height; ++row )
		    {
		    readRow( in, row, rgbPixels[row] );
		    rowsRead[row] = true;
		    notifyThem();
		    }
		}
	    }
	catch ( IOException e )
	    {
	    err = true;
	    width = -1;
	    height = -1;
	    rowsRead = null;
	    rgbPixels = null;
	    }
	}

    private synchronized void notifyThem()
	{
	notifyAll();
	}

    void sendImage()
	{
	// Grab the list of consumers, in case it changes while we're sending.
	ImageConsumer[] c = new ImageConsumer[consumers.size()];
	int i;
	for ( i = 0; i < c.length; ++i )
	    c[i] = (ImageConsumer) consumers.elementAt( i );
	// Try to be as parallel as possible.
	waitForSize();
	for ( i = 0; i < c.length; ++i )
	    sendHead( c[i] );
	for ( int row = 0; row < height; ++row )
	    for ( i = 0; i < c.length; ++i )
		sendPixelRow( c[i], row );
	for ( i = 0; i < c.length; ++i )
	    sendTail( c[i] );
	producing = false;
	}

    private synchronized void waitForSize()
	{
	while ( ( ! err ) && ( ! gotSize  ))
	    {
	    try
		{
		wait();
		}
	    catch ( InterruptedException ignore ) {}
	    }
	}

    private synchronized void waitForRow( int row )
	{
	while ( ( ! err ) && ( ! rowsRead[row] ) )
	    {
	    try
		{
		wait();
		}
	    catch ( InterruptedException ignore ) {}
	    }
	}

    private void sendHead( ImageConsumer ic )
	{
	if ( err )
	    return;
	ic.setDimensions( width, height );
	ic.setColorModel( model );
	ic.setHints(
	    ImageConsumer.TOPDOWNLEFTRIGHT | ImageConsumer.COMPLETESCANLINES |
	    ImageConsumer.SINGLEPASS | ImageConsumer.SINGLEFRAME );
	}

    private void sendPixelRow( ImageConsumer ic, int row )
	{
	if ( err )
	    return;
	waitForRow( row );
	if ( err )
	    return;
	ic.setPixels( 0, row, width, 1, model, rgbPixels[row], 0, width );
	}

    private void sendTail( ImageConsumer ic )
	{
	if ( err )
	    ic.imageComplete( ImageConsumer.IMAGEERROR );
	else
	    ic.imageComplete( ImageConsumer.STATICIMAGEDONE );

	}


    // Methods from ImageProducer.

    /// This method is used to register an ImageConsumer with the
    // ImageProducer for access to the image data during a later
    // reconstruction of the Image.  The ImageProducer may, at its
    // discretion, start delivering the image data to the consumer
    // using the ImageConsumer interface immediately, or when the
    // next available image reconstruction is triggered by a call
    // to the startProduction method.
    // @see #startProduction
    public void addConsumer( ImageConsumer ic )
	{
	if ( ic != null && ! isConsumer( ic ) )
	    consumers.addElement( ic );
	}

    /// This method determines if a given ImageConsumer object
    // is currently registered with this ImageProducer as one
    // of its consumers.
    public boolean isConsumer( ImageConsumer ic )
	{
	return consumers.contains( ic );
	}

    /// This method removes the given ImageConsumer object
    // from the list of consumers currently registered to
    // receive image data.  It is not considered an error
    // to remove a consumer that is not currently registered.
    // The ImageProducer should stop sending data to this
    // consumer as soon as is feasible.
    public void removeConsumer( ImageConsumer ic )
	{
	consumers.removeElement( ic );
	}

    /// This method both registers the given ImageConsumer object
    // as a consumer and starts an immediate reconstruction of
    // the image data which will then be delivered to this
    // consumer and any other consumer which may have already
    // been registered with the producer.  This method differs
    // from the addConsumer method in that a reproduction of
    // the image data should be triggered as soon as possible.
    // @see #addConsumer
    public void startProduction( ImageConsumer ic )
	{
	addConsumer( ic );
	if ( ! startedRead )
	    {
	    startedRead = true;
	    new ImageDecoderRead( this );
	    }
	if ( ! producing )
	    {
	    producing = true;
	    sendImage();
	    }
	}

    /// This method is used by an ImageConsumer to request that
    // the ImageProducer attempt to resend the image data one
    // more time in TOPDOWNLEFTRIGHT order so that higher
    // quality conversion algorithms which depend on receiving
    // pixels in order can be used to produce a better output
    // version of the image.  The ImageProducer is free to
    // ignore this call if it cannot resend the data in that
    // order.  If the data can be resent, then the ImageProducer
    // should respond by executing the following minimum set of
    // ImageConsumer method calls:
    // <PRE>
    //     ic.setHints( TOPDOWNLEFTRIGHT | [otherhints] );
    //     ic.setPixels( [...] );    // as many times as needed
    //     ic.imageComplete( [status] );
    // </PRE>
    // @see ImageConsumer#setHints
    public void requestTopDownLeftRightResend( ImageConsumer ic )
	{
	addConsumer( ic );
	waitForSize();
	sendHead( ic );
	for ( int row = 0; row < height; ++row )
	    sendPixelRow( ic, row );
	sendTail( ic );
	}

    }


class ImageDecoderRead extends Thread
    {

    private ImageDecoder parent;

    public ImageDecoderRead( ImageDecoder parent )
	{
	this.parent = parent;
	start();
	}

    // Methods from Runnable.

    public void run()
	{
	parent.readImage();
	}

    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亚洲人在线观看| 国产日韩在线不卡| 久久人人爽人人爽| 亚洲人精品一区| 日韩电影在线免费| 国产91精品免费| 欧美性猛片aaaaaaa做受| 精品免费国产一区二区三区四区| 亚洲国产精品99久久久久久久久| 亚洲一区二区三区美女| 国产在线视频不卡二| 99精品国产一区二区三区不卡| 在线欧美一区二区| 精品国一区二区三区| 中文字幕字幕中文在线中不卡视频| 日韩av一区二| av福利精品导航| 日韩欧美一区电影| 亚洲日本一区二区三区| 久久成人免费电影| 色又黄又爽网站www久久| 欧美mv日韩mv国产网站| 韩国女主播一区| 色婷婷狠狠综合| 久久综合狠狠综合| 亚洲一区二区不卡免费| 国产高清在线观看免费不卡| 欧美日韩一区二区不卡| 国产精品女人毛片| 国内精品久久久久影院一蜜桃| 在线欧美日韩国产| 国产欧美一区二区三区沐欲| 视频一区在线播放| 99热国产精品| 久久精品夜夜夜夜久久| 日韩精品免费专区| 在线视频国内一区二区| 国产精品色一区二区三区| 全部av―极品视觉盛宴亚洲| 色婷婷久久一区二区三区麻豆| 欧美激情一区二区三区全黄| 麻豆精品一二三| 欧美日韩综合不卡| 最新中文字幕一区二区三区| 国产精品自产自拍| 日韩三级.com| 日韩在线卡一卡二| 欧美在线播放高清精品| 最近日韩中文字幕| 成人手机电影网| 久久久精品人体av艺术| 美女视频一区二区三区| 欧美精品在线观看一区二区| 亚洲精品乱码久久久久久久久 | 欧美日韩综合色| 亚洲精品国产成人久久av盗摄 | 一区二区三区成人| 成人激情av网| 国产精品国产三级国产aⅴ中文 | 中文字幕第一区综合| 狠狠色丁香婷婷综合久久片| 欧美一级二级三级乱码| 日韩高清不卡一区二区| 7777女厕盗摄久久久| 亚洲午夜精品在线| 欧美亚洲综合在线| 亚洲成人自拍网| 欧美亚洲综合久久| 亚洲成va人在线观看| 欧美性猛交xxxx乱大交退制版 | 91精品婷婷国产综合久久| 亚洲成人av中文| 欧美日韩精品欧美日韩精品一| 午夜精品免费在线| 欧美丰满嫩嫩电影| 91蜜桃免费观看视频| 中文字幕一区二区视频| 97久久精品人人澡人人爽| 亚洲欧美激情一区二区| 91高清视频在线| 亚洲成人自拍一区| 欧美一级片在线看| 狠狠色狠狠色综合系列| 久久久精品一品道一区| 成人黄色一级视频| 一区二区三区电影在线播| 欧美日韩一卡二卡三卡 | 精品av久久707| 国产不卡视频在线播放| 国产精品久久久久毛片软件| 99riav一区二区三区| 亚洲国产精品一区二区www| 精品视频免费看| 另类小说综合欧美亚洲| 久久精品免费在线观看| 成人综合在线网站| 亚洲尤物视频在线| 欧美一区二区精品| 国产高清不卡二三区| 日韩美女久久久| 欧美电影一区二区三区| 久久99国产精品免费| 国产精品乱码人人做人人爱 | 亚洲成a人v欧美综合天堂| 91精品国产品国语在线不卡| 国内外成人在线| 亚洲人成在线观看一区二区| 欧美欧美午夜aⅴ在线观看| 激情国产一区二区| 综合电影一区二区三区| 欧美日韩亚洲综合一区| 国产在线一区观看| 一级女性全黄久久生活片免费| 欧美日韩mp4| 国产宾馆实践打屁股91| 亚洲激情在线激情| 欧美成人一区二区| bt欧美亚洲午夜电影天堂| 视频一区国产视频| 亚洲国产精品二十页| 欧美高清一级片在线| 国产mv日韩mv欧美| 亚洲成人在线网站| 国产精品免费视频一区| 911国产精品| 99r国产精品| 国产在线精品视频| 亚洲制服丝袜一区| 五月激情综合网| 中文字幕欧美日韩一区| 欧美电影一区二区| 99久久综合狠狠综合久久| 美女尤物国产一区| 一区二区三区欧美日韩| 国产亚洲精品超碰| 欧美群妇大交群的观看方式| 成人app网站| 久久国产综合精品| 亚洲一二三级电影| 国产欧美1区2区3区| 日韩一区二区免费高清| 色94色欧美sute亚洲线路一ni| 国产一区二区精品在线观看| 天天综合日日夜夜精品| 亚洲免费电影在线| 国产欧美日韩在线视频| 日韩欧美中文字幕公布| 欧美午夜不卡视频| 99久久国产综合精品麻豆| 国模大尺度一区二区三区| 亚洲成人在线免费| 一区二区三区.www| 中文字幕制服丝袜一区二区三区 | 国产乱码精品一区二区三区忘忧草| 亚洲国产成人av网| 亚洲男人天堂av网| 国产清纯白嫩初高生在线观看91 | 国产高清亚洲一区| 久久99久久精品| 奇米精品一区二区三区四区| 亚洲综合久久av| 1000精品久久久久久久久| 国产亚洲美州欧州综合国| 精品裸体舞一区二区三区| 91精品国产综合久久福利软件 | 蜜臀国产一区二区三区在线播放| 亚洲综合色视频| 亚洲欧美日韩在线不卡| 中文字幕在线观看一区二区| 国产欧美精品一区| 久久色.com| 国产亚洲污的网站| 久久久久久久久免费| 久久先锋资源网| 久久久综合视频| 国产亚洲一区字幕| 欧美极品aⅴ影院| 国产精品久99| 日韩理论在线观看| 国产精品久久久久久福利一牛影视| 国产精品色呦呦| 综合在线观看色| 一区二区三区中文免费| 一区二区三区美女视频| 国产91精品露脸国语对白| 国产成人aaa| 成人av网址在线| 99久久99久久免费精品蜜臀| 成人av电影在线网| 99re热这里只有精品免费视频| 91网址在线看| 欧美亚洲国产bt| 5月丁香婷婷综合| 欧美电影免费观看高清完整版在 | 成人av在线电影| 日本韩国欧美一区| 欧美电影在哪看比较好| 精品国产污网站| 国产日韩三级在线| 亚洲欧洲国产日韩|