Exemple #1
0
/*
 * Class:     com_google_gwt_dev_shell_moz_LowLevelMoz
 * Method:    _executeScriptWithInfo
 * Signature: (ILjava/lang/String;Ljava/lang/String;I)Z
 */
extern "C" JNIEXPORT jboolean JNICALL
Java_com_google_gwt_dev_shell_moz_LowLevelMoz__1executeScriptWithInfo
(JNIEnv* env, jclass llClass, jint scriptObjectInt, jstring code,
 jstring file, jint line)
{
    Tracer tracer("LowLevelMoz._executeScriptWithInfo");
    JStringWrap jcode(env, code);
    if (!jcode.jstr()) {
        tracer.setFail("null code string");
        return JNI_FALSE;
    }
    JStringWrap jfile(env, file);
    if (!jfile.str()) {
        tracer.setFail("null file name");
        return JNI_FALSE;
    }
    tracer.log("code=%s, file=%s, line=%d", jcode.str(), jfile.str(), line);
    JSContext* cx = JsRootedValue::currentContext();
    nsCOMPtr<nsIScriptContext> scriptContext(GetScriptContextFromJSContext(cx));

    nsIScriptGlobalObject* scriptObject =
        NS_REINTERPRET_CAST(nsIScriptGlobalObject*, scriptObjectInt);
    JSObject* scriptWindow =
        reinterpret_cast<JSObject*>(scriptObject->GetGlobalJSObject());
    nsXPIDLString scriptString;
    scriptString = jcode.jstr();

    nsXPIDLString aRetValue;
    PRBool aIsUndefined;
    if (NS_FAILED(scriptContext->EvaluateString(scriptString, scriptWindow, 0,
                  jfile.str(), line, 0, aRetValue, &aIsUndefined))) {
        tracer.setFail("EvaluateString failed");
        return JNI_FALSE;
    }
    return JNI_TRUE;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
bool Texture::save(std::string filename)
{
	if (!filename.length())
	{
		Log::printf("Texture::save failed to save the texture file %s (reason:  filename empty)\n");
		return false;
	}
  
  juce::File   jfile(juce::File::getCurrentWorkingDirectory().getChildFile(filename.c_str()));
  juce::String jext=jfile.getFileExtension().toLowerCase();

  if (jext==".tga")
  {
    if (!writeTga(filename,this))
      return false;
  }
  else
  {
    juce::ScopedPointer<juce::ImageFileFormat> jiff;

    if      (jext==".jpg" || jext==".jpeg") jiff=new juce::JPEGImageFormat();
    else if (jext==".png"                 ) jiff=new juce::PNGImageFormat();
    else if (jext==".git"                 ) jiff=new juce::GIFImageFormat();


    juce::Image jimg(bpp==8? (juce::Image::SingleChannel) : (bpp==24? juce::Image::RGB : juce::Image::ARGB),width,height,false);
    if (!jimg.isValid())
	  {
		  Log::printf("Texture::save failed to save the texture file %s \n",filename.c_str());
		  return false;
	  }

     if (!jiff)
     {
       Log::printf("Texture::save failed to save the texture file %s (reason: unsupported extension)\n",filename.c_str());
       return false;
     }

	  unsigned char* src=this->buffer;

    //Alpha
	  if (bpp==8)
	  {
		  for (unsigned int Y=0;Y<height;Y++) {
		  for (unsigned int X=0;X<width ;X++) {
        juce::Colour colour(src[0],src[0],src[0],src[0]);
        jimg.setPixelAt(X,height-Y-1,colour); //mirror y
			  src+=1;
		  }}
	  }
	  //RGB
	  else if (bpp==24)
	  {	
		  for (unsigned int Y=0;Y<height;Y++) {
		  for (unsigned int X=0;X<width ;X++) {
        juce::Colour colour(src[0],src[1],src[2]);
        jimg.setPixelAt(X,height-Y-1,colour); //mirror y
        src+=3;
		  }}
	  }
	  //RGBA
	  else if (bpp==32)
	  {
		  for (unsigned int Y=0;Y<height;Y++) {
		  for (unsigned int X=0;X<width ;X++) {
        juce::Colour colour(src[0],src[1],src[2],src[3]);
        jimg.setPixelAt(X,height-Y-1,colour); //mirror y
        src+=4;
		  }}
	  }

    if (jfile.existsAsFile()) 
      jfile.deleteFile();

    juce::FileOutputStream jstream(jfile);
    if (jstream.failedToOpen() || !jiff->writeImageToStream(jimg,jstream))
    {
		  Log::printf("Texture::save failed to save the texture file %s (reason: failedToOpen or writeImageToStream failed)\n",filename.c_str());
		  return false;
    }
  }

	this->filename=filename;	
	return true;
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
SmartPointer<Texture> Texture::open(std::string filename,bool bUseCacheIfPossible,bool bCacheInMemory)
{
	if (!filename.length()) 
	{
		Log::printf("Texture::open cannot open texture because filename is empty\n");
		return SmartPointer<Texture>();
	}

	//use cache?
	if (bUseCacheIfPossible)
	{
		if (textures_in_cache.find(Utils::ToLower(filename))!=textures_in_cache.end())
		{
			//Log::printf("Opened texture file %s from cache (already in memory)\n",Filename.c_str());
			return textures_in_cache[Utils::ToLower(filename)];
		}
	}


	//opening from disk
  juce::File   jfile(juce::File::getCurrentWorkingDirectory().getChildFile(filename.c_str()));
  juce::String jext=jfile.getFileExtension().toLowerCase();

  SmartPointer<Texture> ret;
  if (jext==".tga")
  {
    ret=readTga(filename);

    if (!ret)
      return ret; //failed
  }
  else
  {
    juce::Image jimg=juce::ImageFileFormat::loadFrom(jfile);

    if (!jimg.isValid())
	  {
		  Log::printf("Texture::open cannot open texture file %s \n",filename.c_str());
		  return SmartPointer<Texture>();
	  }

	  int width  = jimg.getWidth();
	  int height = jimg.getHeight();
	  int bpp    = jimg.getFormat()==juce::Image::ARGB? 32 : (jimg.getFormat()==juce::Image::RGB? 24 : (jimg.getFormat()==juce::Image::SingleChannel? 8:0));

	  if((width == 0) || (height == 0) || !(bpp==24 || bpp==32 || bpp==8))
	  {
		  Log::printf("Texture::open failed to load the texture file %s (reason  unsupported type bpp=%d width=%d height=%d\n",filename.c_str(),bpp,width,height);
		  return SmartPointer<Texture>();
	  }

	  ret=SmartPointer<Texture>(new Texture(width,height,bpp,0));
    unsigned char* dst=ret->buffer;

	  //Alpha
	  if (bpp==8)
	  {
		  for (int Y=0;Y<height;Y++) {
		  for (int X=0;X<width ;X++) {
        juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y
			  *dst++=colour.getAlpha();
		  }}
	  }
	  //RGB
	  else if (bpp==24)
	  {	
		  for (int Y=0;Y<height;Y++) {
		  for (int X=0;X<width ;X++) {
        juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y
			  *dst++=colour.getRed  ();
			  *dst++=colour.getGreen();
			  *dst++=colour.getBlue ();
		  }}
	  }
	  //RGBA
	  else if (bpp==32)
	  {
		  for (int Y=0;Y<height;Y++) {
		  for (int X=0;X<width ;X++) {
        juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y
			  *dst++=colour.getRed  ();
			  *dst++=colour.getGreen();
			  *dst++=colour.getBlue ();
        *dst++=colour.getAlpha();
		  }}
	  }
  }

	Log::printf("image file %s loaded from disk width(%d) height(%d) bpp(%d)\n",filename.c_str(),ret->width,ret->height,ret->bpp);

	if (bCacheInMemory)
		textures_in_cache[Utils::ToLower(filename)]=ret;

	ret->filename=filename;
	return ret;

}