Use filters for Text in GPU mode AIR mobile

后端 未结 3 1156
深忆病人
深忆病人 2021-01-13 16:31

Unfortunately the filters do not work (drop shadow, glow) in GPU mode. I\'m looking for an opportunity to use these effects to text in this mode. I will welcome any advice.<

3条回答
  •  不思量自难忘°
    2021-01-13 17:06

    Here is how to convert ANY DisplayObject to a Bitmap - useful for "restoring" filter effects in AIR GPU mobile rendermode. This is Pixelthis's solution, fixed, optimized and tested:

        // => 'bitmap' must belong to the same parent as 'obj'. 'obj' should be invisible.
        static public function Update(obj:DisplayObject, bitmap:Bitmap):void {
            //trace("CacheToBmp",obj.name);
    
            // Remember the transform matrix of the text field
            var offset:Matrix = obj.transform.matrix.clone();
            // Get the bounds of just the textfield (does not include filters)
            var bounds:Rectangle = obj.getBounds(obj);
            // Create a bitmapData that is used just to calculate the size of the filters
            var tempBD:BitmapData = new BitmapData( Math.ceil(bounds.width), Math.ceil(bounds.height), false );
            bounds.width = obj.width;
            bounds.height = obj.height;
            // Make a copy of the textField bounds. We'll adjust this with the filters
            var finalBounds:Rectangle = new Rectangle(0,0,bounds.width,bounds.height);
    
            // Step through each filter in the textField and adjust our bounds to include them all
            var filterBounds:Rectangle;
            for each (var filter:BitmapFilter in obj.filters) {
                filterBounds = tempBD.generateFilterRect( tempBD.rect, filter );
                finalBounds = finalBounds.union(filterBounds);
            }
            finalBounds.offset(bounds.x,bounds.y);
            finalBounds.x = Math.floor(finalBounds.x);
            finalBounds.y = Math.floor(finalBounds.y);
            finalBounds.width = Math.ceil(finalBounds.width);
            finalBounds.height = Math.ceil(finalBounds.height);
    
            // Now draw the textfield to a new bitmpaData
            var data:BitmapData = new BitmapData( finalBounds.width, finalBounds.height, false, 0 );
            offset.tx = -finalBounds.x;
            offset.ty = -finalBounds.y;
            data.drawWithQuality( obj, offset, obj.transform.colorTransform, obj.blendMode, null, true, StageQuality.HIGH );
            bitmap.bitmapData = data;
    
            // Position the bitmap in same place as 'obj'
            bitmap.x = obj.transform.matrix.tx + finalBounds.x;
            bitmap.y = obj.transform.matrix.ty + finalBounds.y;
        }
    

提交回复
热议问题